diff options
Diffstat (limited to 'drivers/bluetooth/hci_bcsp.c')
-rw-r--r-- | drivers/bluetooth/hci_bcsp.c | 42 |
1 files changed, 23 insertions, 19 deletions
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"); |