diff options
| -rw-r--r-- | drivers/bluetooth/Kconfig | 8 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_bcsp.c | 42 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_bcsp.h | 1 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_ldisc.c | 2 |
4 files changed, 25 insertions, 28 deletions
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig index 543f93e0f23f..b9fbe6e7f9ae 100644 --- a/drivers/bluetooth/Kconfig +++ b/drivers/bluetooth/Kconfig | |||
| @@ -55,14 +55,6 @@ config BT_HCIUART_BCSP | |||
| 55 | 55 | ||
| 56 | Say Y here to compile support for HCI BCSP protocol. | 56 | Say Y here to compile support for HCI BCSP protocol. |
| 57 | 57 | ||
| 58 | config BT_HCIUART_BCSP_TXCRC | ||
| 59 | bool "Transmit CRC with every BCSP packet" | ||
| 60 | depends on BT_HCIUART_BCSP | ||
| 61 | help | ||
| 62 | If you say Y here, a 16-bit CRC checksum will be transmitted along with | ||
| 63 | every BCSP (BlueCore Serial Protocol) packet sent to the Bluetooth chip. | ||
| 64 | This increases reliability, but slightly reduces efficiency. | ||
| 65 | |||
| 66 | config BT_HCIBCM203X | 58 | config BT_HCIBCM203X |
| 67 | tristate "HCI BCM203x USB driver" | 59 | tristate "HCI BCM203x USB driver" |
| 68 | depends on USB | 60 | depends on USB |
diff --git a/drivers/bluetooth/hci_bcsp.c b/drivers/bluetooth/hci_bcsp.c index 0ee324e1265d..91bd293d7a0a 100644 --- a/drivers/bluetooth/hci_bcsp.c +++ b/drivers/bluetooth/hci_bcsp.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | * $Id: hci_bcsp.c,v 1.2 2002/09/26 05:05:14 maxk Exp $ | 28 | * $Id: hci_bcsp.c,v 1.2 2002/09/26 05:05:14 maxk Exp $ |
| 29 | */ | 29 | */ |
| 30 | 30 | ||
| 31 | #define VERSION "0.2" | 31 | #define VERSION "0.3" |
| 32 | 32 | ||
| 33 | #include <linux/config.h> | 33 | #include <linux/config.h> |
| 34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
| @@ -60,6 +60,7 @@ | |||
| 60 | #define BT_DBG( A... ) | 60 | #define BT_DBG( A... ) |
| 61 | #endif | 61 | #endif |
| 62 | 62 | ||
| 63 | static int txcrc = 1; | ||
| 63 | static int hciextn = 1; | 64 | static int hciextn = 1; |
| 64 | 65 | ||
| 65 | /* ---- BCSP CRC calculation ---- */ | 66 | /* ---- BCSP CRC calculation ---- */ |
| @@ -173,11 +174,8 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data, | |||
| 173 | { | 174 | { |
| 174 | struct sk_buff *nskb; | 175 | struct sk_buff *nskb; |
| 175 | u8 hdr[4], chan; | 176 | u8 hdr[4], chan; |
| 176 | int rel, i; | ||
| 177 | |||
| 178 | #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC | ||
| 179 | u16 BCSP_CRC_INIT(bcsp_txmsg_crc); | 177 | u16 BCSP_CRC_INIT(bcsp_txmsg_crc); |
| 180 | #endif | 178 | int rel, i; |
| 181 | 179 | ||
| 182 | switch (pkt_type) { | 180 | switch (pkt_type) { |
| 183 | case HCI_ACLDATA_PKT: | 181 | case HCI_ACLDATA_PKT: |
| @@ -240,9 +238,9 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data, | |||
| 240 | BT_DBG("Sending packet with seqno %u", bcsp->msgq_txseq); | 238 | BT_DBG("Sending packet with seqno %u", bcsp->msgq_txseq); |
| 241 | bcsp->msgq_txseq = ++(bcsp->msgq_txseq) & 0x07; | 239 | bcsp->msgq_txseq = ++(bcsp->msgq_txseq) & 0x07; |
| 242 | } | 240 | } |
| 243 | #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC | 241 | |
| 244 | hdr[0] |= 0x40; | 242 | if (bcsp->use_crc) |
| 245 | #endif | 243 | hdr[0] |= 0x40; |
| 246 | 244 | ||
| 247 | hdr[1] = ((len << 4) & 0xff) | chan; | 245 | hdr[1] = ((len << 4) & 0xff) | chan; |
| 248 | hdr[2] = len >> 4; | 246 | hdr[2] = len >> 4; |
| @@ -251,25 +249,25 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data, | |||
| 251 | /* Put BCSP header */ | 249 | /* Put BCSP header */ |
| 252 | for (i = 0; i < 4; i++) { | 250 | for (i = 0; i < 4; i++) { |
| 253 | bcsp_slip_one_byte(nskb, hdr[i]); | 251 | bcsp_slip_one_byte(nskb, hdr[i]); |
| 254 | #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC | 252 | |
| 255 | bcsp_crc_update(&bcsp_txmsg_crc, hdr[i]); | 253 | if (bcsp->use_crc) |
| 256 | #endif | 254 | bcsp_crc_update(&bcsp_txmsg_crc, hdr[i]); |
| 257 | } | 255 | } |
| 258 | 256 | ||
| 259 | /* Put payload */ | 257 | /* Put payload */ |
| 260 | for (i = 0; i < len; i++) { | 258 | for (i = 0; i < len; i++) { |
| 261 | bcsp_slip_one_byte(nskb, data[i]); | 259 | bcsp_slip_one_byte(nskb, data[i]); |
| 262 | #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC | 260 | |
| 263 | bcsp_crc_update(&bcsp_txmsg_crc, data[i]); | 261 | if (bcsp->use_crc) |
| 264 | #endif | 262 | bcsp_crc_update(&bcsp_txmsg_crc, data[i]); |
| 265 | } | 263 | } |
| 266 | 264 | ||
| 267 | #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC | ||
| 268 | /* Put CRC */ | 265 | /* Put CRC */ |
| 269 | bcsp_txmsg_crc = bcsp_crc_reverse(bcsp_txmsg_crc); | 266 | if (bcsp->use_crc) { |
| 270 | bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff)); | 267 | bcsp_txmsg_crc = bcsp_crc_reverse(bcsp_txmsg_crc); |
| 271 | bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff)); | 268 | bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff)); |
| 272 | #endif | 269 | bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff)); |
| 270 | } | ||
| 273 | 271 | ||
| 274 | bcsp_slip_msgdelim(nskb); | 272 | bcsp_slip_msgdelim(nskb); |
| 275 | return nskb; | 273 | return nskb; |
| @@ -698,6 +696,9 @@ static int bcsp_open(struct hci_uart *hu) | |||
| 698 | 696 | ||
| 699 | bcsp->rx_state = BCSP_W4_PKT_DELIMITER; | 697 | bcsp->rx_state = BCSP_W4_PKT_DELIMITER; |
| 700 | 698 | ||
| 699 | if (txcrc) | ||
| 700 | bcsp->use_crc = 1; | ||
| 701 | |||
| 701 | return 0; | 702 | return 0; |
| 702 | } | 703 | } |
| 703 | 704 | ||
| @@ -743,5 +744,8 @@ int bcsp_deinit(void) | |||
| 743 | return hci_uart_unregister_proto(&bcsp); | 744 | return hci_uart_unregister_proto(&bcsp); |
| 744 | } | 745 | } |
| 745 | 746 | ||
| 747 | module_param(txcrc, bool, 0644); | ||
| 748 | MODULE_PARM_DESC(txcrc, "Transmit CRC with every BCSP packet"); | ||
| 749 | |||
| 746 | module_param(hciextn, bool, 0644); | 750 | module_param(hciextn, bool, 0644); |
| 747 | MODULE_PARM_DESC(hciextn, "Convert HCI Extensions into BCSP packets"); | 751 | MODULE_PARM_DESC(hciextn, "Convert HCI Extensions into BCSP packets"); |
diff --git a/drivers/bluetooth/hci_bcsp.h b/drivers/bluetooth/hci_bcsp.h index a2b3bb92274b..01bbc664db74 100644 --- a/drivers/bluetooth/hci_bcsp.h +++ b/drivers/bluetooth/hci_bcsp.h | |||
| @@ -60,6 +60,7 @@ struct bcsp_struct { | |||
| 60 | BCSP_ESCSTATE_ESC | 60 | BCSP_ESCSTATE_ESC |
| 61 | } rx_esc_state; | 61 | } rx_esc_state; |
| 62 | 62 | ||
| 63 | u8 use_crc; | ||
| 63 | u16 message_crc; | 64 | u16 message_crc; |
| 64 | u8 txack_req; /* Do we need to send ack's to the peer? */ | 65 | u8 txack_req; /* Do we need to send ack's to the peer? */ |
| 65 | 66 | ||
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index aed80cc22890..8c9317bcd53c 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | * | 27 | * |
| 28 | * $Id: hci_ldisc.c,v 1.5 2002/10/02 18:37:20 maxk Exp $ | 28 | * $Id: hci_ldisc.c,v 1.5 2002/10/02 18:37:20 maxk Exp $ |
| 29 | */ | 29 | */ |
| 30 | #define VERSION "2.1" | 30 | #define VERSION "2.2" |
| 31 | 31 | ||
| 32 | #include <linux/config.h> | 32 | #include <linux/config.h> |
| 33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
