|
From: Olov H. <ol...@us...> - 2001-07-05 19:02:13
|
The following file was modified in linux/drivers/char/bluetooth:
Name Old version New version Comment
---- ----------- ----------- -------
hci.c 1.162 1.163=20=20=20=20=20=20=20=20=20=20=20
The accompanying log:
Added timeout value to cmdtimer. Added release of command timer when repons=
es are received
The diff of the modified file(s):
--- hci.c 2001/06/29 10:09:58 1.162
+++ hci.c 2001/07/05 10:52:45 1.163
@@ -140,6 +140,7 @@
#define USE_NCPTIMER=20
#define NCP_TIMEOUT (2*HZ)
=20
+
/****************** TYPE DEFINITION SECTION ******************************=
***/
=20
/* cmd_t and cmd_buf are structures used to handle the queue of commands
@@ -892,6 +893,8 @@
=20
case AUTHENTICATION_COMPLETE:
DSYS(__FUNCTION__ ": AUTHENTICATION_COMPLETE\n");
+ release_cmd_timer();
+=09=09
#ifdef CONFIG_BLUETOOTH_USE_SECURITY_MANAGER
if (buf[0]) {
D_ERR(__FUNCTION__ ": AUTHENTICATION_COMPLETE: %s\n", get_err_msg(buf[0=
]));
@@ -900,6 +903,7 @@
=20=09=09
sec_man_event(HCI, get_bd(CHAR2INT12(buf[2], buf[1])), AUTHENTICATION_CO=
MPLETE, buf, 1);
#endif
+ wake_up_interruptible(&hci_wq);
break;
=20
case REMOTE_NAME_REQUEST_COMPLETE:
@@ -918,6 +922,7 @@
=20
case ENCRYPTION_CHANGE:
DSYS(__FUNCTION__ ": ENCRYPTION_CHANGE\n");
+ release_cmd_timer();
#ifdef CONFIG_BLUETOOTH_USE_SECURITY_MANAGER
if (buf[0]) {
D_ERR(__FUNCTION__ ": ENCRYPTION_CHANGE: %s\n", get_err_msg(buf[0]));
@@ -931,6 +936,7 @@
sec_man_event(HCI, get_bd(CHAR2INT12(buf[2], buf[1=
])), ENCRYPTION_CHANGE, tmp, 2);
}
#endif
+ wake_up_interruptible(&hci_wq);
break;
=20=09
case CHANGE_CONNECTION_LINK_KEY_COMPLETE:
@@ -968,6 +974,7 @@
performing the task for this command */
=20=09=09
case COMMAND_STATUS:
+ release_cmd_timer();
D_CMD(__FUNCTION__ ": COMMAND_STATUS\n");
=20=09=09
if (buf[0]) {=09=09=09
@@ -985,6 +992,7 @@
}
=20=09=09
update_nhcp(buf[1]);
+ wake_up_interruptible(&hci_wq);
break;
case FLUSH_OCCURRED:
D_CMD(__FUNCTION__ ": FLUSH_OCCURRED on hci_hdl %d\n",
@@ -1982,7 +1990,7 @@
c_pkt.data[3] =3D 0x00;
c_pkt.len =3D 4;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
/* The Hci_Disconnect function is used to terminate an existing connection.
@@ -2063,7 +2071,7 @@
c +=3D 16;
c_pkt.len =3D c;
=20
- tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN);
+ tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2086,7 +2094,7 @@
=20=09
c_pkt.len =3D 6;
=20
- tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN);
+ tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN, DEFAULT_TIMEOUT);
printk(__FUNCTION__ ": Returned from send_secblock\n");
if (tmp < 0) {
return tmp;
@@ -2117,7 +2125,7 @@
=20
c_pkt.len =3D c;
=20=09
- tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN);
+ tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2140,7 +2148,7 @@
=20
c_pkt.len =3D 6;
=20=09
- tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN);
+ tmp =3D send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2218,7 +2226,7 @@
c_pkt.data[1] =3D (con_hdl >> 8) & 0xff;
c_pkt.len =3D 2;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
/*
@@ -2259,7 +2267,7 @@
c_pkt.data[2] =3D enable;
c_pkt.len =3D 3;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
=20
@@ -2365,7 +2373,7 @@
c_pkt.data[1] =3D ((hdl >> 8) & 0xff);
c_pkt.len =3D 2;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
s32
@@ -2379,7 +2387,7 @@
=20
c_pkt.len =3D 0;
=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2399,7 +2407,7 @@
c_pkt.data[6] =3D flag;
c_pkt.len =3D 7;
=20=20=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
=20
if (tmp < 0) {
return tmp;
@@ -2422,7 +2430,7 @@
memcpy(c_pkt.data + 7, link_key, 16);
c_pkt.len =3D 23;
=20=20=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2442,7 +2450,7 @@
c_pkt.data[6] =3D flag;
c_pkt.len =3D 7;
=20=20=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
=20
if (tmp < 0) {
return tmp;
@@ -2464,7 +2472,7 @@
strcpy(c_pkt.data, new_name);
c_pkt.len =3D NAME_LEN;
=20
- return send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);=09
+ return send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);=09
#undef NAME_LEN
}
=20
@@ -2480,7 +2488,7 @@
=20=20=20
c_pkt.len =3D 0;
=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2505,7 +2513,7 @@
c_pkt.data[0] =3D enable;
c_pkt.len =3D 1;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);=20
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);=20
}
=20
/*
@@ -2527,7 +2535,7 @@
c_pkt.data[3] =3D ((wind >> 8) & 0xff);
c_pkt.len =3D 4;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
/*
@@ -2563,7 +2571,7 @@
=20=20=20
print_data(__FUNCTION__, (u8*)&c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN);
=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2592,7 +2600,7 @@
=20=20=20
print_data(__FUNCTION__, (u8*)&c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_L=
EN);
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
if (tmp < 0) {
return tmp;
} else {
@@ -2658,7 +2666,7 @@
=20
c_pkt.len =3D 3;
=20=20=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
s32
@@ -2674,7 +2682,7 @@
=20
c_pkt.len =3D 3;
=20=20=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
=20=09
}
=20
@@ -2711,7 +2719,7 @@
c_pkt.data[0] =3D enable;
c_pkt.len =3D 1;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
#else
return 0;
#endif
@@ -2758,7 +2766,7 @@
c_pkt.data[c++] =3D sco_num & 0xff;
c_pkt.data[c++] =3D (sco_num >> 8) & 0xff;
=20
- return send_cmd_block((u8*) &c_pkt, c + CMD_HDR_LEN + HCI_HDR_LEN);
+ return send_cmd_block((u8*) &c_pkt, c + CMD_HDR_LEN + HCI_HDR_LEN, DEFAUL=
T_TIMEOUT);
#else
return 0;
#endif
@@ -2801,7 +2809,7 @@
c_pkt.data[1] =3D (hdl >> 8) & 0xff;
c_pkt.len =3D 2;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_=
HDR_LEN);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_=
HDR_LEN, DEFAULT_TIMEOUT);
}
=20
s32=20
@@ -2819,7 +2827,7 @@
print_data("write_link_to:",(u8*)&c_pkt,
c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN);
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
/* Defines of Informational Parameters function */
@@ -2840,7 +2848,7 @@
c_pkt.len =3D 0;
=20
if (block) {
- int ret =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_H=
DR_LEN);
+ int ret =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_H=
DR_LEN, DEFAULT_TIMEOUT);
#if 0
if (ret >=3D 0 &&
hci_ctrl.hc_buf.acl_len =3D=3D 256 &&
@@ -2850,7 +2858,7 @@
c_pkt.type =3D CMD_PKT;
c_pkt.opcode =3D hci_put_opcode(READ_BUFFER_SIZE, =
HCI_IP);
c_pkt.len =3D 0;
- ret =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + C=
MD_HDR_LEN + HCI_HDR_LEN);
+ ret =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + C=
MD_HDR_LEN + HCI_HDR_LEN, DEFAULT_TIMEOUT);
}
#endif
return ret;
@@ -2871,7 +2879,7 @@
c_pkt.len =3D 0;
=20
if (block)
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
else
return send_cmd((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN);
}
@@ -2897,7 +2905,7 @@
=20
memset(bd, 0, 6);=20
=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
memcpy(bd, hci_ctrl.local_bd, 6);
return tmp;
}=20
@@ -2911,7 +2919,7 @@
c_pkt.opcode =3D hci_put_opcode(RESET, HCI_HC) ;
c_pkt.len =3D 0;
=20=20=20
- return send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
+ return send_cmd_block((u8*) &c_pkt , c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N, DEFAULT_TIMEOUT);
}
=20
=20
@@ -3075,7 +3083,7 @@
c_pkt.opcode =3D hci_put_opcode(ENABLE_DEVICE_UNDER_TEST_MODE, HCI_TC) ;
c_pkt.len =3D 0;
=20
- return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
);
+ return send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN=
, DEFAULT_TIMEOUT);
}
=20
=20
@@ -3301,7 +3309,7 @@
}
=20
=20=09=09=09
- D_QUEUE("<--%d (%d)\n", buf_byte_count(-1),=20
+ D_QUEUE("<--%d (%d)\n", buf_byte_count(),=20
hci_ctrl.hc_buf.acl_num);
=20=09=09
if (bytes2send =3D=3D 0) {
@@ -3857,14 +3865,14 @@
#endif /* USE_NCPTIMER */
=20
void
-start_cmd_timer(void)
+start_cmd_timer(u8 max_time)
{
#ifdef __KERNEL__
D_CTRL(__FUNCTION__ "\n");
init_timer(&hci_cmd_timer);
hci_cmd_timer.function =3D cmd_timeout;
hci_cmd_timer.data =3D 0;
- hci_cmd_timer.expires =3D jiffies + 2*HZ;
+ hci_cmd_timer.expires =3D jiffies + max_time*HZ;
add_timer(&hci_cmd_timer);
#endif
}
@@ -3938,7 +3946,7 @@
#endif
=20
s32=20
-send_cmd_block(u8 *cmd, u8 len)
+send_cmd_block(u8 *cmd, u8 len, u8 max_time)
{
u32 tmp;
#ifdef __KERNEL__
@@ -3956,7 +3964,7 @@
#endif
hci_cmd_pending =3D 1;
=20=20=20
- start_cmd_timer();
+ start_cmd_timer(max_time);
=20=09
tmp =3D send_cmd(cmd, len);
=20
|