[PATCH] add check to /proc/devices read routines
[linux-2.6] / drivers / bluetooth / hci_bcsp.c
1 /* 
2    BlueCore Serial Protocol (BCSP) for Linux Bluetooth stack (BlueZ).
3    Copyright 2002 by Fabrizio Gennari <fabrizio.gennari@philips.com>
4
5    Based on
6        hci_h4.c  by Maxim Krasnyansky <maxk@qualcomm.com>
7        ABCSP     by Carl Orsborn <cjo@csr.com>
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License version 2 as
11    published by the Free Software Foundation;
12
13    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
16    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
17    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
18    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
19    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
20    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21
22    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
23    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
24    SOFTWARE IS DISCLAIMED.
25 */
26
27 /*
28  * $Id: hci_bcsp.c,v 1.2 2002/09/26 05:05:14 maxk Exp $
29  */
30
31 #define VERSION "0.2"
32
33 #include <linux/config.h>
34 #include <linux/module.h>
35
36 #include <linux/kernel.h>
37 #include <linux/init.h>
38 #include <linux/sched.h>
39 #include <linux/types.h>
40 #include <linux/fcntl.h>
41 #include <linux/interrupt.h>
42 #include <linux/ptrace.h>
43 #include <linux/poll.h>
44
45 #include <linux/slab.h>
46 #include <linux/tty.h>
47 #include <linux/errno.h>
48 #include <linux/string.h>
49 #include <linux/signal.h>
50 #include <linux/ioctl.h>
51 #include <linux/skbuff.h>
52
53 #include <net/bluetooth/bluetooth.h>
54 #include <net/bluetooth/hci_core.h>
55 #include "hci_uart.h"
56 #include "hci_bcsp.h"
57
58 #ifndef CONFIG_BT_HCIUART_DEBUG
59 #undef  BT_DBG
60 #define BT_DBG( A... )
61 #undef  BT_DMP
62 #define BT_DMP( A... )
63 #endif
64
65 static int hciextn = 1;
66
67 /* ---- BCSP CRC calculation ---- */
68
69 /* Table for calculating CRC for polynomial 0x1021, LSB processed first,
70 initial value 0xffff, bits shifted in reverse order. */
71
72 static const u16 crc_table[] = {
73         0x0000, 0x1081, 0x2102, 0x3183,
74         0x4204, 0x5285, 0x6306, 0x7387,
75         0x8408, 0x9489, 0xa50a, 0xb58b,
76         0xc60c, 0xd68d, 0xe70e, 0xf78f
77 };
78
79 /* Initialise the crc calculator */
80 #define BCSP_CRC_INIT(x) x = 0xffff
81
82 /*
83    Update crc with next data byte
84
85    Implementation note
86         The data byte is treated as two nibbles.  The crc is generated
87         in reverse, i.e., bits are fed into the register from the top.
88 */
89 static void bcsp_crc_update(u16 *crc, u8 d)
90 {
91         u16 reg = *crc;
92
93         reg = (reg >> 4) ^ crc_table[(reg ^ d) & 0x000f];
94         reg = (reg >> 4) ^ crc_table[(reg ^ (d >> 4)) & 0x000f];
95
96         *crc = reg;
97 }
98
99 /*
100    Get reverse of generated crc
101
102    Implementation note
103         The crc generator (bcsp_crc_init() and bcsp_crc_update())
104         creates a reversed crc, so it needs to be swapped back before
105         being passed on.
106 */
107 static u16 bcsp_crc_reverse(u16 crc)
108 {
109         u16 b, rev;
110
111         for (b = 0, rev = 0; b < 16; b++) {
112                 rev = rev << 1;
113                 rev |= (crc & 1);
114                 crc = crc >> 1;
115         }
116         return (rev);
117 }
118
119 /* ---- BCSP core ---- */
120
121 static void bcsp_slip_msgdelim(struct sk_buff *skb)
122 {
123         const char pkt_delim = 0xc0;
124         memcpy(skb_put(skb, 1), &pkt_delim, 1);
125 }
126
127 static void bcsp_slip_one_byte(struct sk_buff *skb, u8 c)
128 {
129         const char esc_c0[2] = { 0xdb, 0xdc };
130         const char esc_db[2] = { 0xdb, 0xdd };
131
132         switch (c) {
133         case 0xc0:
134                 memcpy(skb_put(skb, 2), &esc_c0, 2);
135                 break;
136         case 0xdb:
137                 memcpy(skb_put(skb, 2), &esc_db, 2);
138                 break;
139         default:
140                 memcpy(skb_put(skb, 1), &c, 1);
141         }
142 }
143
144 static int bcsp_enqueue(struct hci_uart *hu, struct sk_buff *skb)
145 {
146         struct bcsp_struct *bcsp = hu->priv;
147
148         if (skb->len > 0xFFF) {
149                 BT_ERR("Packet too long");
150                 kfree_skb(skb);
151                 return 0;
152         }
153
154         switch (skb->pkt_type) {
155         case HCI_ACLDATA_PKT:
156         case HCI_COMMAND_PKT:
157                 skb_queue_tail(&bcsp->rel, skb);
158                 break;
159
160         case HCI_SCODATA_PKT:
161                 skb_queue_tail(&bcsp->unrel, skb);
162                 break;
163
164         default:
165                 BT_ERR("Unknown packet type");
166                 kfree_skb(skb);
167                 break;
168         }
169
170         return 0;
171 }
172
173 static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
174                 int len, int pkt_type)
175 {
176         struct sk_buff *nskb;
177         u8 hdr[4], chan;
178         int rel, i;
179
180 #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC
181         u16 BCSP_CRC_INIT(bcsp_txmsg_crc);
182 #endif
183
184         switch (pkt_type) {
185         case HCI_ACLDATA_PKT:
186                 chan = 6;       /* BCSP ACL channel */
187                 rel = 1;        /* reliable channel */
188                 break;
189         case HCI_COMMAND_PKT:
190                 chan = 5;       /* BCSP cmd/evt channel */
191                 rel = 1;        /* reliable channel */
192                 break;
193         case HCI_SCODATA_PKT:
194                 chan = 7;       /* BCSP SCO channel */
195                 rel = 0;        /* unreliable channel */
196                 break;
197         case BCSP_LE_PKT:
198                 chan = 1;       /* BCSP LE channel */
199                 rel = 0;        /* unreliable channel */
200                 break;
201         case BCSP_ACK_PKT:
202                 chan = 0;       /* BCSP internal channel */
203                 rel = 0;        /* unreliable channel */
204                 break;
205         default:
206                 BT_ERR("Unknown packet type");
207                 return NULL;
208         }
209
210         if (hciextn && chan == 5) {
211                 struct hci_command_hdr *hdr = (struct hci_command_hdr *) data;
212
213                 if (hci_opcode_ogf(__le16_to_cpu(hdr->opcode)) == OGF_VENDOR_CMD) {
214                         u8 desc = *(data + HCI_COMMAND_HDR_SIZE);
215                         if ((desc & 0xf0) == 0xc0) {
216                                 data += HCI_COMMAND_HDR_SIZE + 1;
217                                 len  -= HCI_COMMAND_HDR_SIZE + 1;
218                                 chan = desc & 0x0f;
219                         }
220                 }
221         }
222
223         /* Max len of packet: (original len +4(bcsp hdr) +2(crc))*2
224            (because bytes 0xc0 and 0xdb are escaped, worst case is
225            when the packet is all made of 0xc0 and 0xdb :) )
226            + 2 (0xc0 delimiters at start and end). */
227
228         nskb = alloc_skb((len + 6) * 2 + 2, GFP_ATOMIC);
229         if (!nskb)
230                 return NULL;
231
232         nskb->pkt_type = pkt_type;
233
234         bcsp_slip_msgdelim(nskb);
235
236         hdr[0] = bcsp->rxseq_txack << 3;
237         bcsp->txack_req = 0;
238         BT_DBG("We request packet no %u to card", bcsp->rxseq_txack);
239
240         if (rel) {
241                 hdr[0] |= 0x80 + bcsp->msgq_txseq;
242                 BT_DBG("Sending packet with seqno %u", bcsp->msgq_txseq);
243                 bcsp->msgq_txseq = ++(bcsp->msgq_txseq) & 0x07;
244         }
245 #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC
246         hdr[0] |= 0x40;
247 #endif
248
249         hdr[1] = ((len << 4) & 0xff) | chan;
250         hdr[2] = len >> 4;
251         hdr[3] = ~(hdr[0] + hdr[1] + hdr[2]);
252
253         /* Put BCSP header */
254         for (i = 0; i < 4; i++) {
255                 bcsp_slip_one_byte(nskb, hdr[i]);
256 #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC
257                 bcsp_crc_update(&bcsp_txmsg_crc, hdr[i]);
258 #endif
259         }
260
261         /* Put payload */
262         for (i = 0; i < len; i++) {
263                 bcsp_slip_one_byte(nskb, data[i]);
264 #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC
265                 bcsp_crc_update(&bcsp_txmsg_crc, data[i]);
266 #endif
267         }
268
269 #ifdef CONFIG_BT_HCIUART_BCSP_TXCRC
270         /* Put CRC */
271         bcsp_txmsg_crc = bcsp_crc_reverse(bcsp_txmsg_crc);
272         bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff));
273         bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff));
274 #endif
275
276         bcsp_slip_msgdelim(nskb);
277         return nskb;
278 }
279
280 /* This is a rewrite of pkt_avail in ABCSP */
281 static struct sk_buff *bcsp_dequeue(struct hci_uart *hu)
282 {
283         struct bcsp_struct *bcsp = hu->priv;
284         unsigned long flags;
285         struct sk_buff *skb;
286         
287         /* First of all, check for unreliable messages in the queue,
288            since they have priority */
289
290         if ((skb = skb_dequeue(&bcsp->unrel)) != NULL) {
291                 struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type);
292                 if (nskb) {
293                         kfree_skb(skb);
294                         return nskb;
295                 } else {
296                         skb_queue_head(&bcsp->unrel, skb);
297                         BT_ERR("Could not dequeue pkt because alloc_skb failed");
298                 }
299         }
300
301         /* Now, try to send a reliable pkt. We can only send a
302            reliable packet if the number of packets sent but not yet ack'ed
303            is < than the winsize */
304
305         spin_lock_irqsave(&bcsp->unack.lock, flags);
306
307         if (bcsp->unack.qlen < BCSP_TXWINSIZE && (skb = skb_dequeue(&bcsp->rel)) != NULL) {
308                 struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type);
309                 if (nskb) {
310                         __skb_queue_tail(&bcsp->unack, skb);
311                         mod_timer(&bcsp->tbcsp, jiffies + HZ / 4);
312                         spin_unlock_irqrestore(&bcsp->unack.lock, flags);
313                         return nskb;
314                 } else {
315                         skb_queue_head(&bcsp->rel, skb);
316                         BT_ERR("Could not dequeue pkt because alloc_skb failed");
317                 }
318         }
319
320         spin_unlock_irqrestore(&bcsp->unack.lock, flags);
321
322
323         /* We could not send a reliable packet, either because there are
324            none or because there are too many unack'ed pkts. Did we receive
325            any packets we have not acknowledged yet ? */
326
327         if (bcsp->txack_req) {
328                 /* if so, craft an empty ACK pkt and send it on BCSP unreliable
329                    channel 0 */
330                 struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, NULL, 0, BCSP_ACK_PKT);
331                 return nskb;
332         }
333
334         /* We have nothing to send */
335         return NULL;
336 }
337
338 static int bcsp_flush(struct hci_uart *hu)
339 {
340         BT_DBG("hu %p", hu);
341         return 0;
342 }
343
344 /* Remove ack'ed packets */
345 static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
346 {
347         unsigned long flags;
348         struct sk_buff *skb;
349         int i, pkts_to_be_removed;
350         u8 seqno;
351
352         spin_lock_irqsave(&bcsp->unack.lock, flags);
353
354         pkts_to_be_removed = bcsp->unack.qlen;
355         seqno = bcsp->msgq_txseq;
356
357         while (pkts_to_be_removed) {
358                 if (bcsp->rxack == seqno)
359                         break;
360                 pkts_to_be_removed--;
361                 seqno = (seqno - 1) & 0x07;
362         }
363
364         if (bcsp->rxack != seqno)
365                 BT_ERR("Peer acked invalid packet");
366
367         BT_DBG("Removing %u pkts out of %u, up to seqno %u",
368                pkts_to_be_removed, bcsp->unack.qlen, (seqno - 1) & 0x07);
369
370         for (i = 0, skb = ((struct sk_buff *) &bcsp->unack)->next; i < pkts_to_be_removed
371                         && skb != (struct sk_buff *) &bcsp->unack; i++) {
372                 struct sk_buff *nskb;
373
374                 nskb = skb->next;
375                 __skb_unlink(skb, &bcsp->unack);
376                 kfree_skb(skb);
377                 skb = nskb;
378         }
379         if (bcsp->unack.qlen == 0)
380                 del_timer(&bcsp->tbcsp);
381         spin_unlock_irqrestore(&bcsp->unack.lock, flags);
382
383         if (i != pkts_to_be_removed)
384                 BT_ERR("Removed only %u out of %u pkts", i, pkts_to_be_removed);
385 }
386
387 /* Handle BCSP link-establishment packets. When we
388    detect a "sync" packet, symptom that the BT module has reset,
389    we do nothing :) (yet) */
390 static void bcsp_handle_le_pkt(struct hci_uart *hu)
391 {
392         struct bcsp_struct *bcsp = hu->priv;
393         u8 conf_pkt[4]     = { 0xad, 0xef, 0xac, 0xed };
394         u8 conf_rsp_pkt[4] = { 0xde, 0xad, 0xd0, 0xd0 };
395         u8 sync_pkt[4]     = { 0xda, 0xdc, 0xed, 0xed };
396
397         /* spot "conf" pkts and reply with a "conf rsp" pkt */
398         if (bcsp->rx_skb->data[1] >> 4 == 4 && bcsp->rx_skb->data[2] == 0 &&
399                         !memcmp(&bcsp->rx_skb->data[4], conf_pkt, 4)) {
400                 struct sk_buff *nskb = alloc_skb(4, GFP_ATOMIC);
401
402                 BT_DBG("Found a LE conf pkt");
403                 if (!nskb)
404                         return;
405                 memcpy(skb_put(nskb, 4), conf_rsp_pkt, 4);
406                 nskb->pkt_type = BCSP_LE_PKT;
407
408                 skb_queue_head(&bcsp->unrel, nskb);
409                 hci_uart_tx_wakeup(hu);
410         }
411         /* Spot "sync" pkts. If we find one...disaster! */
412         else if (bcsp->rx_skb->data[1] >> 4 == 4 && bcsp->rx_skb->data[2] == 0 &&
413                         !memcmp(&bcsp->rx_skb->data[4], sync_pkt, 4)) {
414                 BT_ERR("Found a LE sync pkt, card has reset");
415         }
416 }
417
418 static inline void bcsp_unslip_one_byte(struct bcsp_struct *bcsp, unsigned char byte)
419 {
420         const u8 c0 = 0xc0, db = 0xdb;
421
422         switch (bcsp->rx_esc_state) {
423         case BCSP_ESCSTATE_NOESC:
424                 switch (byte) {
425                 case 0xdb:
426                         bcsp->rx_esc_state = BCSP_ESCSTATE_ESC;
427                         break;
428                 default:
429                         memcpy(skb_put(bcsp->rx_skb, 1), &byte, 1);
430                         if ((bcsp->rx_skb-> data[0] & 0x40) != 0 && 
431                                         bcsp->rx_state != BCSP_W4_CRC)
432                                 bcsp_crc_update(&bcsp->message_crc, byte);
433                         bcsp->rx_count--;
434                 }
435                 break;
436
437         case BCSP_ESCSTATE_ESC:
438                 switch (byte) {
439                 case 0xdc:
440                         memcpy(skb_put(bcsp->rx_skb, 1), &c0, 1);
441                         if ((bcsp->rx_skb-> data[0] & 0x40) != 0 && 
442                                         bcsp->rx_state != BCSP_W4_CRC)
443                                 bcsp_crc_update(&bcsp-> message_crc, 0xc0);
444                         bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
445                         bcsp->rx_count--;
446                         break;
447
448                 case 0xdd:
449                         memcpy(skb_put(bcsp->rx_skb, 1), &db, 1);
450                         if ((bcsp->rx_skb-> data[0] & 0x40) != 0 && 
451                                         bcsp->rx_state != BCSP_W4_CRC) 
452                                 bcsp_crc_update(&bcsp-> message_crc, 0xdb);
453                         bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
454                         bcsp->rx_count--;
455                         break;
456
457                 default:
458                         BT_ERR ("Invalid byte %02x after esc byte", byte);
459                         kfree_skb(bcsp->rx_skb);
460                         bcsp->rx_skb = NULL;
461                         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
462                         bcsp->rx_count = 0;
463                 }
464         }
465 }
466
467 static inline void bcsp_complete_rx_pkt(struct hci_uart *hu)
468 {
469         struct bcsp_struct *bcsp = hu->priv;
470         int pass_up;
471
472         if (bcsp->rx_skb->data[0] & 0x80) {     /* reliable pkt */
473                 BT_DBG("Received seqno %u from card", bcsp->rxseq_txack);
474                 bcsp->rxseq_txack++;
475                 bcsp->rxseq_txack %= 0x8;
476                 bcsp->txack_req    = 1;
477
478                 /* If needed, transmit an ack pkt */
479                 hci_uart_tx_wakeup(hu);
480         }
481
482         bcsp->rxack = (bcsp->rx_skb->data[0] >> 3) & 0x07;
483         BT_DBG("Request for pkt %u from card", bcsp->rxack);
484
485         bcsp_pkt_cull(bcsp);
486         if ((bcsp->rx_skb->data[1] & 0x0f) == 6 &&
487                         bcsp->rx_skb->data[0] & 0x80) {
488                 bcsp->rx_skb->pkt_type = HCI_ACLDATA_PKT;
489                 pass_up = 1;
490         } else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 &&
491                         bcsp->rx_skb->data[0] & 0x80) {
492                 bcsp->rx_skb->pkt_type = HCI_EVENT_PKT;
493                 pass_up = 1;
494         } else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) {
495                 bcsp->rx_skb->pkt_type = HCI_SCODATA_PKT;
496                 pass_up = 1;
497         } else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 &&
498                         !(bcsp->rx_skb->data[0] & 0x80)) {
499                 bcsp_handle_le_pkt(hu);
500                 pass_up = 0;
501         } else
502                 pass_up = 0;
503
504         if (!pass_up) {
505                 struct hci_event_hdr hdr;
506                 u8 desc = (bcsp->rx_skb->data[1] & 0x0f);
507
508                 if (desc != 0 && desc != 1) {
509                         if (hciextn) {
510                                 desc |= 0xc0;
511                                 skb_pull(bcsp->rx_skb, 4);
512                                 memcpy(skb_push(bcsp->rx_skb, 1), &desc, 1);
513
514                                 hdr.evt = 0xff;
515                                 hdr.plen = bcsp->rx_skb->len;
516                                 memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE);
517                                 bcsp->rx_skb->pkt_type = HCI_EVENT_PKT;
518
519                                 hci_recv_frame(bcsp->rx_skb);
520                         } else {
521                                 BT_ERR ("Packet for unknown channel (%u %s)",
522                                         bcsp->rx_skb->data[1] & 0x0f,
523                                         bcsp->rx_skb->data[0] & 0x80 ? 
524                                         "reliable" : "unreliable");
525                                 kfree_skb(bcsp->rx_skb);
526                         }
527                 } else
528                         kfree_skb(bcsp->rx_skb);
529         } else {
530                 /* Pull out BCSP hdr */
531                 skb_pull(bcsp->rx_skb, 4);
532
533                 hci_recv_frame(bcsp->rx_skb);
534         }
535         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
536         bcsp->rx_skb = NULL;
537 }
538
539 /* Recv data */
540 static int bcsp_recv(struct hci_uart *hu, void *data, int count)
541 {
542         struct bcsp_struct *bcsp = hu->priv;
543         register unsigned char *ptr;
544
545         BT_DBG("hu %p count %d rx_state %d rx_count %ld", 
546                 hu, count, bcsp->rx_state, bcsp->rx_count);
547
548         ptr = data;
549         while (count) {
550                 if (bcsp->rx_count) {
551                         if (*ptr == 0xc0) {
552                                 BT_ERR("Short BCSP packet");
553                                 kfree_skb(bcsp->rx_skb);
554                                 bcsp->rx_state = BCSP_W4_PKT_START;
555                                 bcsp->rx_count = 0;
556                         } else
557                                 bcsp_unslip_one_byte(bcsp, *ptr);
558
559                         ptr++; count--;
560                         continue;
561                 }
562
563                 switch (bcsp->rx_state) {
564                 case BCSP_W4_BCSP_HDR:
565                         if ((0xff & (u8) ~ (bcsp->rx_skb->data[0] + bcsp->rx_skb->data[1] +
566                                         bcsp->rx_skb->data[2])) != bcsp->rx_skb->data[3]) {
567                                 BT_ERR("Error in BCSP hdr checksum");
568                                 kfree_skb(bcsp->rx_skb);
569                                 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
570                                 bcsp->rx_count = 0;
571                                 continue;
572                         }
573                         if (bcsp->rx_skb->data[0] & 0x80        /* reliable pkt */
574                                         && (bcsp->rx_skb->data[0] & 0x07) != bcsp->rxseq_txack) {
575                                 BT_ERR ("Out-of-order packet arrived, got %u expected %u",
576                                         bcsp->rx_skb->data[0] & 0x07, bcsp->rxseq_txack);
577
578                                 kfree_skb(bcsp->rx_skb);
579                                 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
580                                 bcsp->rx_count = 0;
581                                 continue;
582                         }
583                         bcsp->rx_state = BCSP_W4_DATA;
584                         bcsp->rx_count = (bcsp->rx_skb->data[1] >> 4) + 
585                                         (bcsp->rx_skb->data[2] << 4);   /* May be 0 */
586                         continue;
587
588                 case BCSP_W4_DATA:
589                         if (bcsp->rx_skb->data[0] & 0x40) {     /* pkt with crc */
590                                 bcsp->rx_state = BCSP_W4_CRC;
591                                 bcsp->rx_count = 2;
592                         } else
593                                 bcsp_complete_rx_pkt(hu);
594                         continue;
595
596                 case BCSP_W4_CRC:
597                         if (bcsp_crc_reverse(bcsp->message_crc) !=
598                                         (bcsp->rx_skb->data[bcsp->rx_skb->len - 2] << 8) +
599                                         bcsp->rx_skb->data[bcsp->rx_skb->len - 1]) {
600
601                                 BT_ERR ("Checksum failed: computed %04x received %04x",
602                                         bcsp_crc_reverse(bcsp->message_crc),
603                                         (bcsp->rx_skb-> data[bcsp->rx_skb->len - 2] << 8) +
604                                         bcsp->rx_skb->data[bcsp->rx_skb->len - 1]);
605
606                                 kfree_skb(bcsp->rx_skb);
607                                 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
608                                 bcsp->rx_count = 0;
609                                 continue;
610                         }
611                         skb_trim(bcsp->rx_skb, bcsp->rx_skb->len - 2);
612                         bcsp_complete_rx_pkt(hu);
613                         continue;
614
615                 case BCSP_W4_PKT_DELIMITER:
616                         switch (*ptr) {
617                         case 0xc0:
618                                 bcsp->rx_state = BCSP_W4_PKT_START;
619                                 break;
620                         default:
621                                 /*BT_ERR("Ignoring byte %02x", *ptr);*/
622                                 break;
623                         }
624                         ptr++; count--;
625                         break;
626
627                 case BCSP_W4_PKT_START:
628                         switch (*ptr) {
629                         case 0xc0:
630                                 ptr++; count--;
631                                 break;
632
633                         default:
634                                 bcsp->rx_state = BCSP_W4_BCSP_HDR;
635                                 bcsp->rx_count = 4;
636                                 bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
637                                 BCSP_CRC_INIT(bcsp->message_crc);
638                                 
639                                 /* Do not increment ptr or decrement count
640                                  * Allocate packet. Max len of a BCSP pkt= 
641                                  * 0xFFF (payload) +4 (header) +2 (crc) */
642
643                                 bcsp->rx_skb = bt_skb_alloc(0x1005, GFP_ATOMIC);
644                                 if (!bcsp->rx_skb) {
645                                         BT_ERR("Can't allocate mem for new packet");
646                                         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
647                                         bcsp->rx_count = 0;
648                                         return 0;
649                                 }
650                                 bcsp->rx_skb->dev = (void *) hu->hdev;
651                                 break;
652                         }
653                         break;
654                 }
655         }
656         return count;
657 }
658
659         /* Arrange to retransmit all messages in the relq. */
660 static void bcsp_timed_event(unsigned long arg)
661 {
662         struct hci_uart *hu = (struct hci_uart *) arg;
663         struct bcsp_struct *bcsp = hu->priv;
664         struct sk_buff *skb;
665         unsigned long flags;
666
667         BT_DBG("hu %p retransmitting %u pkts", hu, bcsp->unack.qlen);
668
669         spin_lock_irqsave(&bcsp->unack.lock, flags);
670
671         while ((skb = __skb_dequeue_tail(&bcsp->unack)) != NULL) {
672                 bcsp->msgq_txseq = (bcsp->msgq_txseq - 1) & 0x07;
673                 skb_queue_head(&bcsp->rel, skb);
674         }
675
676         spin_unlock_irqrestore(&bcsp->unack.lock, flags);
677
678         hci_uart_tx_wakeup(hu);
679 }
680
681 static int bcsp_open(struct hci_uart *hu)
682 {
683         struct bcsp_struct *bcsp;
684
685         BT_DBG("hu %p", hu);
686
687         bcsp = kmalloc(sizeof(*bcsp), GFP_ATOMIC);
688         if (!bcsp)
689                 return -ENOMEM;
690         memset(bcsp, 0, sizeof(*bcsp));
691
692         hu->priv = bcsp;
693         skb_queue_head_init(&bcsp->unack);
694         skb_queue_head_init(&bcsp->rel);
695         skb_queue_head_init(&bcsp->unrel);
696
697         init_timer(&bcsp->tbcsp);
698         bcsp->tbcsp.function = bcsp_timed_event;
699         bcsp->tbcsp.data     = (u_long) hu;
700
701         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
702
703         return 0;
704 }
705
706 static int bcsp_close(struct hci_uart *hu)
707 {
708         struct bcsp_struct *bcsp = hu->priv;
709         hu->priv = NULL;
710
711         BT_DBG("hu %p", hu);
712
713         skb_queue_purge(&bcsp->unack);
714         skb_queue_purge(&bcsp->rel);
715         skb_queue_purge(&bcsp->unrel);
716         del_timer(&bcsp->tbcsp);
717
718         kfree(bcsp);
719         return 0;
720 }
721
722 static struct hci_uart_proto bcsp = {
723         .id      = HCI_UART_BCSP,
724         .open    = bcsp_open,
725         .close   = bcsp_close,
726         .enqueue = bcsp_enqueue,
727         .dequeue = bcsp_dequeue,
728         .recv    = bcsp_recv,
729         .flush   = bcsp_flush
730 };
731
732 int bcsp_init(void)
733 {
734         int err = hci_uart_register_proto(&bcsp);
735         if (!err)
736                 BT_INFO("HCI BCSP protocol initialized");
737         else
738                 BT_ERR("HCI BCSP protocol registration failed");
739
740         return err;
741 }
742
743 int bcsp_deinit(void)
744 {
745         return hci_uart_unregister_proto(&bcsp);
746 }
747
748 module_param(hciextn, bool, 0644);
749 MODULE_PARM_DESC(hciextn, "Convert HCI Extensions into BCSP packets");