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