|
From: Mattias A. <mat...@us...> - 2001-06-06 14:53:42
|
The following file was modified in linux/drivers/char/bluetooth:
Name Old version New version Comment
---- ----------- ----------- -------
hci_vendor.c 1.41 1.42=20=20=20=20=20=20=20=20=20=20=20=20
The accompanying log:
* Added ps key define (0x191)
* Added return buf for copying read ps vals to usermode
* Added csr_pskey used to read/write any ps value
* Always use temp baudrate setting (after fixing rtx problems due to=20
uart deep sleep timout)
* hw_vendor now uses bt_use_bcsp() instead of defines
The diff of the modified file(s):
--- hci_vendor.c 2001/05/30 10:34:15 1.41
+++ hci_vendor.c 2001/06/06 14:53:41 1.42
@@ -442,6 +442,7 @@
#define CSR_PS_BDADDR 0x0001
#define CSR_PS_MAX_ACL_PKT_LEN 0x0011
#define CSR_PS_MAX_ACL_PKTS 0x0013
+#define CSR_PS_UART_CONFIG 0x0191
#define CSR_PS_BAUD_RATE 0x0204
=20
#define CSR_UART_RATE_9K6 0x0027
@@ -520,7 +521,12 @@
=20
static s32 csr_send_general_hq(csr_bccmd *cmd);
=20
-#ifdef CONFIG_BLUETOOTH_USE_BCSP
+#define PSRETBUF_SIZE 10 /* should be enough for what we want to do */
+static u16 ps_retbuf[PSRETBUF_SIZE];
+
+
+#ifdef CONFIG_BLUETOOTH_SUPPORT_BCSP
+
void
hci_receive_bcsp(u8 *data, u32 count)
{
@@ -529,7 +535,6 @@
=20=09
D_REC(__FUNCTION__ "\n");
=20
- /* FIXME -- is there only one cmd buffer available ? */
hci_ctrl.hc_buf.cmd_num =3D 1;=20=20
=20
release_cmd_timer();
@@ -558,6 +563,12 @@
break;
=20=09=09=09=09
case CSR_CMD_PS:
+ printk("ps key[0x%x] ", ps->ps_key);
+ print_data("", (u8*)ps->ps_val, ps->ps_len*sizeof(u16));
+=09=09=09=09
+ /* Now copy this data to return buf */
+ memcpy(ps_retbuf, ps->ps_val,=20
+ ps->ps_len*sizeof(u16));
break;
=20=09=09=09=09
default:
@@ -670,8 +681,62 @@
}
#endif
=20
+s32=20
+csr_pskey(u16 ps_key, u16 rw_mode, u16 *retb, u16 n_pars)
+{
+ s32 tmp;
+ csr_msg *msg;
+ csr_bccmd *cmd;
+ csr_bccmd_ps *ps;
+
+ printk(__FUNCTION__" : ps 0x%x\n", ps_key);=09
+
+ /* HCI Manufacturer specific header */
+ c_pkt.type =3D CMD_PKT;
+ c_pkt.opcode =3D hci_put_opcode(0x00, 0x3f);
+ c_pkt.len =3D 1 + 5*sizeof(u16) + 3*sizeof(u16) + n_pars*sizeof(u16);
+
+ msg =3D (csr_msg *)c_pkt.data;
+ cmd =3D (csr_bccmd *)msg->msg;
+ ps =3D (csr_bccmd_ps *)cmd->payload;
+
+ /* General msg header */
+ msg->p_descr.last =3D 1; /* first and last segment */
+ msg->p_descr.first =3D 1;
+ msg->p_descr.ch_id =3D CSR_CH_ID_BCCMD;
+
+ /* BCCMD type */
+
+ cmd->type =3D rw_mode;
+ cmd->len =3D 5 + 3 + n_pars;
+ cmd->seq =3D csr_count++;
+ cmd->var_id =3D CSR_CMD_PS;
+ cmd->status =3D CSR_STATUS_OK; /* always OK in SETREQ */
+
+ /* Actual PS key request */
+ ps->ps_key =3D ps_key;
+ ps->ps_len =3D n_pars; /* x 16 bits */
+ ps->unused =3D 0x0000;
+
+ if (rw_mode =3D=3D CSR_MSGTYPE_GETREQ)
+ memset(ps->ps_val, 0, n_pars*sizeof(u16)); /* zero params in GETREQ */
+ else=20=20
+ memcpy(ps->ps_val, retb, n_pars*sizeof(16)); /* copy params in SETREQ */
+
+ /* Clear return buf */
+ memset(ps_retbuf, 0, PSRETBUF_SIZE*2);
+
+ tmp =3D send_cmd_block((u8*) &c_pkt,=20
+ c_pkt.len + CMD_HDR_LEN + HCI_HDR_LEN);
+=09=20
+ if (rw_mode =3D=3D CSR_MSGTYPE_GETREQ)
+ memcpy(retb, ps_retbuf, n_pars*sizeof(u16));
=20
+ /* Signal status back in SETREQ ? */
=20
+ return tmp;
+}
+
s32=20
hci_set_bd_addr(u8 bd[6])
{
@@ -813,8 +878,6 @@
return tmp;
}
=20
-
-#define SET_BAUD_RATE_TEMPORARILY
s32
hci_set_baudrate(u32 baudrate)
{
@@ -859,12 +922,9 @@
/* HCI Manufacturer specific header */
c_pkt.type =3D CMD_PKT;
c_pkt.opcode =3D hci_put_opcode(0x00, 0x3f);
-#ifdef SET_BAUD_RATE_TEMPORARILY
c_pkt.len =3D 1 + 5*sizeof(u16) + 4*sizeof(u16);
-#else
- c_pkt.len =3D 1 + 5*sizeof(u16) + 3*sizeof(u16) + 1*sizeof(u16);
-#endif
=20
+
msg =3D (csr_msg *)c_pkt.data;
cmd =3D (csr_bccmd *)msg->msg;
ps =3D (csr_bccmd_ps *)cmd->payload;
@@ -874,7 +934,6 @@
msg->p_descr.first =3D 1;
msg->p_descr.ch_id =3D CSR_CH_ID_BCCMD;
=20
-#ifdef SET_BAUD_RATE_TEMPORARILY
cmd->type =3D CSR_MSGTYPE_SETREQ;
cmd->len =3D 5 + 4;
cmd->seq =3D csr_count++;
@@ -882,11 +941,16 @@
cmd->status =3D CSR_STATUS_OK; /* always OK in SETREQ */
=20
memset(cmd->payload, 0, 4*sizeof(u16));
-#ifdef CONFIG_BLUETOOTH_USE_BCSP
- cmd->payload[0] =3D baud_divider | CSR_UART_EVEN_PARITY | CSR_UART_ONE_ST=
OP_BIT;
-#else
- cmd->payload[0] =3D baud_divider | CSR_UART_NO_PARITY | CSR_UART_ONE_STOP=
_BIT;
-#endif
+
+ if (bt_use_bcsp(-1))
+ {
+ cmd->payload[0] =3D baud_divider | CSR_UART_EVEN_PARITY |=20
+ CSR_UART_ONE_STOP_BIT;
+ } else {
+ cmd->payload[0] =3D baud_divider | CSR_UART_NO_PARITY |=20
+ CSR_UART_ONE_STOP_BIT;
+ }
+
if (hci_ctrl.hc_buf.cmd_num < 1) {
DSYS(__FUNCTION__ VENDOR ": sleeping\n");
interruptible_sleep_on(&set_baudrate_wq);
@@ -895,23 +959,7 @@
tmp =3D bt_write_lower_driver((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI=
_HDR_LEN);
=20
hci_ctrl.hc_buf.cmd_num--;
-#else
- cmd->type =3D CSR_MSGTYPE_SETREQ;
- cmd->len =3D 5 + 3 + 1;
- cmd->seq =3D csr_count++;
- cmd->var_id =3D CSR_CMD_PS;
- cmd->status =3D CSR_STATUS_OK; /* always OK in SETREQ */
-
- /* Actual PS key request */
- ps->ps_key =3D CSR_PS_BAUD_RATE;
- ps->ps_len =3D 1; /* x 16 bits */
- ps->unused =3D 0x0000;
-
- ps->ps_val[0] =3D baud_divider;
=20
- tmp =3D send_cmd_block((u8*) &c_pkt, c_pkt.len + CMD_HDR_LEN + HCI_HDR_LE=
N);
-#endif
-
return tmp;
}
=20
@@ -957,6 +1005,13 @@
break;
=20
case CSR_CMD_PS:
+ printk("ps key[0x%x] ", ps->ps_key);
+ print_data("", (u8*)ps->ps_val, ps->ps_len*sizeof(u16));
+=09=09=09=09
+ /* Now copy this data to return buf */
+=09=09=09=09
+ memcpy(ps_retbuf, ps->ps_val,=20
+ ps->ps_len*sizeof(u16));
break;
=20
default:
@@ -1083,11 +1138,10 @@
char*
bt_hw_vendor(void)
{
-#ifdef CONFIG_BLUETOOTH_USE_BCSP
+ if (bt_use_bcsp(-1))
return "CSR (BCSP)";
-#else
+ else
return "CSR (H4)";
-#endif
}
=20
#elif defined(CONFIG_BLUETOOTH_INFINEON_BMI)
|