Merge branches 'pm-cpufreq' and 'pm-cpuidle'
[cascardo/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 bool txcrc = 1;
53 static bool 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 + 1) & 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         skb = skb_dequeue(&bcsp->unrel);
295         if (skb != NULL) {
296                 struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, bt_cb(skb)->pkt_type);
297                 if (nskb) {
298                         kfree_skb(skb);
299                         return nskb;
300                 } else {
301                         skb_queue_head(&bcsp->unrel, skb);
302                         BT_ERR("Could not dequeue pkt because alloc_skb failed");
303                 }
304         }
305
306         /* Now, try to send a reliable pkt. We can only send a
307            reliable packet if the number of packets sent but not yet ack'ed
308            is < than the winsize */
309
310         spin_lock_irqsave_nested(&bcsp->unack.lock, flags, SINGLE_DEPTH_NESTING);
311
312         if (bcsp->unack.qlen < BCSP_TXWINSIZE) {
313                 skb = skb_dequeue(&bcsp->rel);
314                 if (skb != NULL) {
315                         struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len,
316                                                                 bt_cb(skb)->pkt_type);
317                         if (nskb) {
318                                 __skb_queue_tail(&bcsp->unack, skb);
319                                 mod_timer(&bcsp->tbcsp, jiffies + HZ / 4);
320                                 spin_unlock_irqrestore(&bcsp->unack.lock, flags);
321                                 return nskb;
322                         } else {
323                                 skb_queue_head(&bcsp->rel, skb);
324                                 BT_ERR("Could not dequeue pkt because alloc_skb failed");
325                         }
326                 }
327         }
328
329         spin_unlock_irqrestore(&bcsp->unack.lock, flags);
330
331         /* We could not send a reliable packet, either because there are
332            none or because there are too many unack'ed pkts. Did we receive
333            any packets we have not acknowledged yet ? */
334
335         if (bcsp->txack_req) {
336                 /* if so, craft an empty ACK pkt and send it on BCSP unreliable
337                    channel 0 */
338                 struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, NULL, 0, BCSP_ACK_PKT);
339                 return nskb;
340         }
341
342         /* We have nothing to send */
343         return NULL;
344 }
345
346 static int bcsp_flush(struct hci_uart *hu)
347 {
348         BT_DBG("hu %p", hu);
349         return 0;
350 }
351
352 /* Remove ack'ed packets */
353 static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
354 {
355         struct sk_buff *skb, *tmp;
356         unsigned long flags;
357         int i, pkts_to_be_removed;
358         u8 seqno;
359
360         spin_lock_irqsave(&bcsp->unack.lock, flags);
361
362         pkts_to_be_removed = skb_queue_len(&bcsp->unack);
363         seqno = bcsp->msgq_txseq;
364
365         while (pkts_to_be_removed) {
366                 if (bcsp->rxack == seqno)
367                         break;
368                 pkts_to_be_removed--;
369                 seqno = (seqno - 1) & 0x07;
370         }
371
372         if (bcsp->rxack != seqno)
373                 BT_ERR("Peer acked invalid packet");
374
375         BT_DBG("Removing %u pkts out of %u, up to seqno %u",
376                pkts_to_be_removed, skb_queue_len(&bcsp->unack),
377                (seqno - 1) & 0x07);
378
379         i = 0;
380         skb_queue_walk_safe(&bcsp->unack, skb, tmp) {
381                 if (i >= pkts_to_be_removed)
382                         break;
383                 i++;
384
385                 __skb_unlink(skb, &bcsp->unack);
386                 kfree_skb(skb);
387         }
388
389         if (skb_queue_empty(&bcsp->unack))
390                 del_timer(&bcsp->tbcsp);
391
392         spin_unlock_irqrestore(&bcsp->unack.lock, flags);
393
394         if (i != pkts_to_be_removed)
395                 BT_ERR("Removed only %u out of %u pkts", i, pkts_to_be_removed);
396 }
397
398 /* Handle BCSP link-establishment packets. When we
399    detect a "sync" packet, symptom that the BT module has reset,
400    we do nothing :) (yet) */
401 static void bcsp_handle_le_pkt(struct hci_uart *hu)
402 {
403         struct bcsp_struct *bcsp = hu->priv;
404         u8 conf_pkt[4]     = { 0xad, 0xef, 0xac, 0xed };
405         u8 conf_rsp_pkt[4] = { 0xde, 0xad, 0xd0, 0xd0 };
406         u8 sync_pkt[4]     = { 0xda, 0xdc, 0xed, 0xed };
407
408         /* spot "conf" pkts and reply with a "conf rsp" pkt */
409         if (bcsp->rx_skb->data[1] >> 4 == 4 && bcsp->rx_skb->data[2] == 0 &&
410                         !memcmp(&bcsp->rx_skb->data[4], conf_pkt, 4)) {
411                 struct sk_buff *nskb = alloc_skb(4, GFP_ATOMIC);
412
413                 BT_DBG("Found a LE conf pkt");
414                 if (!nskb)
415                         return;
416                 memcpy(skb_put(nskb, 4), conf_rsp_pkt, 4);
417                 bt_cb(nskb)->pkt_type = BCSP_LE_PKT;
418
419                 skb_queue_head(&bcsp->unrel, nskb);
420                 hci_uart_tx_wakeup(hu);
421         }
422         /* Spot "sync" pkts. If we find one...disaster! */
423         else if (bcsp->rx_skb->data[1] >> 4 == 4 && bcsp->rx_skb->data[2] == 0 &&
424                         !memcmp(&bcsp->rx_skb->data[4], sync_pkt, 4)) {
425                 BT_ERR("Found a LE sync pkt, card has reset");
426         }
427 }
428
429 static inline void bcsp_unslip_one_byte(struct bcsp_struct *bcsp, unsigned char byte)
430 {
431         const u8 c0 = 0xc0, db = 0xdb;
432
433         switch (bcsp->rx_esc_state) {
434         case BCSP_ESCSTATE_NOESC:
435                 switch (byte) {
436                 case 0xdb:
437                         bcsp->rx_esc_state = BCSP_ESCSTATE_ESC;
438                         break;
439                 default:
440                         memcpy(skb_put(bcsp->rx_skb, 1), &byte, 1);
441                         if ((bcsp->rx_skb-> data[0] & 0x40) != 0 && 
442                                         bcsp->rx_state != BCSP_W4_CRC)
443                                 bcsp_crc_update(&bcsp->message_crc, byte);
444                         bcsp->rx_count--;
445                 }
446                 break;
447
448         case BCSP_ESCSTATE_ESC:
449                 switch (byte) {
450                 case 0xdc:
451                         memcpy(skb_put(bcsp->rx_skb, 1), &c0, 1);
452                         if ((bcsp->rx_skb-> data[0] & 0x40) != 0 && 
453                                         bcsp->rx_state != BCSP_W4_CRC)
454                                 bcsp_crc_update(&bcsp-> message_crc, 0xc0);
455                         bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
456                         bcsp->rx_count--;
457                         break;
458
459                 case 0xdd:
460                         memcpy(skb_put(bcsp->rx_skb, 1), &db, 1);
461                         if ((bcsp->rx_skb-> data[0] & 0x40) != 0 && 
462                                         bcsp->rx_state != BCSP_W4_CRC) 
463                                 bcsp_crc_update(&bcsp-> message_crc, 0xdb);
464                         bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
465                         bcsp->rx_count--;
466                         break;
467
468                 default:
469                         BT_ERR ("Invalid byte %02x after esc byte", byte);
470                         kfree_skb(bcsp->rx_skb);
471                         bcsp->rx_skb = NULL;
472                         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
473                         bcsp->rx_count = 0;
474                 }
475         }
476 }
477
478 static void bcsp_complete_rx_pkt(struct hci_uart *hu)
479 {
480         struct bcsp_struct *bcsp = hu->priv;
481         int pass_up;
482
483         if (bcsp->rx_skb->data[0] & 0x80) {     /* reliable pkt */
484                 BT_DBG("Received seqno %u from card", bcsp->rxseq_txack);
485                 bcsp->rxseq_txack++;
486                 bcsp->rxseq_txack %= 0x8;
487                 bcsp->txack_req    = 1;
488
489                 /* If needed, transmit an ack pkt */
490                 hci_uart_tx_wakeup(hu);
491         }
492
493         bcsp->rxack = (bcsp->rx_skb->data[0] >> 3) & 0x07;
494         BT_DBG("Request for pkt %u from card", bcsp->rxack);
495
496         bcsp_pkt_cull(bcsp);
497         if ((bcsp->rx_skb->data[1] & 0x0f) == 6 &&
498                         bcsp->rx_skb->data[0] & 0x80) {
499                 bt_cb(bcsp->rx_skb)->pkt_type = HCI_ACLDATA_PKT;
500                 pass_up = 1;
501         } else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 &&
502                         bcsp->rx_skb->data[0] & 0x80) {
503                 bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT;
504                 pass_up = 1;
505         } else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) {
506                 bt_cb(bcsp->rx_skb)->pkt_type = HCI_SCODATA_PKT;
507                 pass_up = 1;
508         } else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 &&
509                         !(bcsp->rx_skb->data[0] & 0x80)) {
510                 bcsp_handle_le_pkt(hu);
511                 pass_up = 0;
512         } else
513                 pass_up = 0;
514
515         if (!pass_up) {
516                 struct hci_event_hdr hdr;
517                 u8 desc = (bcsp->rx_skb->data[1] & 0x0f);
518
519                 if (desc != 0 && desc != 1) {
520                         if (hciextn) {
521                                 desc |= 0xc0;
522                                 skb_pull(bcsp->rx_skb, 4);
523                                 memcpy(skb_push(bcsp->rx_skb, 1), &desc, 1);
524
525                                 hdr.evt = 0xff;
526                                 hdr.plen = bcsp->rx_skb->len;
527                                 memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE);
528                                 bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT;
529
530                                 hci_recv_frame(hu->hdev, bcsp->rx_skb);
531                         } else {
532                                 BT_ERR ("Packet for unknown channel (%u %s)",
533                                         bcsp->rx_skb->data[1] & 0x0f,
534                                         bcsp->rx_skb->data[0] & 0x80 ? 
535                                         "reliable" : "unreliable");
536                                 kfree_skb(bcsp->rx_skb);
537                         }
538                 } else
539                         kfree_skb(bcsp->rx_skb);
540         } else {
541                 /* Pull out BCSP hdr */
542                 skb_pull(bcsp->rx_skb, 4);
543
544                 hci_recv_frame(hu->hdev, bcsp->rx_skb);
545         }
546
547         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
548         bcsp->rx_skb = NULL;
549 }
550
551 static u16 bscp_get_crc(struct bcsp_struct *bcsp)
552 {
553         return get_unaligned_be16(&bcsp->rx_skb->data[bcsp->rx_skb->len - 2]);
554 }
555
556 /* Recv data */
557 static int bcsp_recv(struct hci_uart *hu, void *data, int count)
558 {
559         struct bcsp_struct *bcsp = hu->priv;
560         unsigned char *ptr;
561
562         BT_DBG("hu %p count %d rx_state %d rx_count %ld", 
563                 hu, count, bcsp->rx_state, bcsp->rx_count);
564
565         ptr = data;
566         while (count) {
567                 if (bcsp->rx_count) {
568                         if (*ptr == 0xc0) {
569                                 BT_ERR("Short BCSP packet");
570                                 kfree_skb(bcsp->rx_skb);
571                                 bcsp->rx_state = BCSP_W4_PKT_START;
572                                 bcsp->rx_count = 0;
573                         } else
574                                 bcsp_unslip_one_byte(bcsp, *ptr);
575
576                         ptr++; count--;
577                         continue;
578                 }
579
580                 switch (bcsp->rx_state) {
581                 case BCSP_W4_BCSP_HDR:
582                         if ((0xff & (u8) ~ (bcsp->rx_skb->data[0] + bcsp->rx_skb->data[1] +
583                                         bcsp->rx_skb->data[2])) != bcsp->rx_skb->data[3]) {
584                                 BT_ERR("Error in BCSP hdr checksum");
585                                 kfree_skb(bcsp->rx_skb);
586                                 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
587                                 bcsp->rx_count = 0;
588                                 continue;
589                         }
590                         if (bcsp->rx_skb->data[0] & 0x80        /* reliable pkt */
591                                         && (bcsp->rx_skb->data[0] & 0x07) != bcsp->rxseq_txack) {
592                                 BT_ERR ("Out-of-order packet arrived, got %u expected %u",
593                                         bcsp->rx_skb->data[0] & 0x07, bcsp->rxseq_txack);
594
595                                 kfree_skb(bcsp->rx_skb);
596                                 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
597                                 bcsp->rx_count = 0;
598                                 continue;
599                         }
600                         bcsp->rx_state = BCSP_W4_DATA;
601                         bcsp->rx_count = (bcsp->rx_skb->data[1] >> 4) + 
602                                         (bcsp->rx_skb->data[2] << 4);   /* May be 0 */
603                         continue;
604
605                 case BCSP_W4_DATA:
606                         if (bcsp->rx_skb->data[0] & 0x40) {     /* pkt with crc */
607                                 bcsp->rx_state = BCSP_W4_CRC;
608                                 bcsp->rx_count = 2;
609                         } else
610                                 bcsp_complete_rx_pkt(hu);
611                         continue;
612
613                 case BCSP_W4_CRC:
614                         if (bitrev16(bcsp->message_crc) != bscp_get_crc(bcsp)) {
615                                 BT_ERR ("Checksum failed: computed %04x received %04x",
616                                         bitrev16(bcsp->message_crc),
617                                         bscp_get_crc(bcsp));
618
619                                 kfree_skb(bcsp->rx_skb);
620                                 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
621                                 bcsp->rx_count = 0;
622                                 continue;
623                         }
624                         skb_trim(bcsp->rx_skb, bcsp->rx_skb->len - 2);
625                         bcsp_complete_rx_pkt(hu);
626                         continue;
627
628                 case BCSP_W4_PKT_DELIMITER:
629                         switch (*ptr) {
630                         case 0xc0:
631                                 bcsp->rx_state = BCSP_W4_PKT_START;
632                                 break;
633                         default:
634                                 /*BT_ERR("Ignoring byte %02x", *ptr);*/
635                                 break;
636                         }
637                         ptr++; count--;
638                         break;
639
640                 case BCSP_W4_PKT_START:
641                         switch (*ptr) {
642                         case 0xc0:
643                                 ptr++; count--;
644                                 break;
645
646                         default:
647                                 bcsp->rx_state = BCSP_W4_BCSP_HDR;
648                                 bcsp->rx_count = 4;
649                                 bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
650                                 BCSP_CRC_INIT(bcsp->message_crc);
651
652                                 /* Do not increment ptr or decrement count
653                                  * Allocate packet. Max len of a BCSP pkt= 
654                                  * 0xFFF (payload) +4 (header) +2 (crc) */
655
656                                 bcsp->rx_skb = bt_skb_alloc(0x1005, GFP_ATOMIC);
657                                 if (!bcsp->rx_skb) {
658                                         BT_ERR("Can't allocate mem for new packet");
659                                         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
660                                         bcsp->rx_count = 0;
661                                         return 0;
662                                 }
663                                 break;
664                         }
665                         break;
666                 }
667         }
668         return count;
669 }
670
671         /* Arrange to retransmit all messages in the relq. */
672 static void bcsp_timed_event(unsigned long arg)
673 {
674         struct hci_uart *hu = (struct hci_uart *) arg;
675         struct bcsp_struct *bcsp = hu->priv;
676         struct sk_buff *skb;
677         unsigned long flags;
678
679         BT_DBG("hu %p retransmitting %u pkts", hu, bcsp->unack.qlen);
680
681         spin_lock_irqsave_nested(&bcsp->unack.lock, flags, SINGLE_DEPTH_NESTING);
682
683         while ((skb = __skb_dequeue_tail(&bcsp->unack)) != NULL) {
684                 bcsp->msgq_txseq = (bcsp->msgq_txseq - 1) & 0x07;
685                 skb_queue_head(&bcsp->rel, skb);
686         }
687
688         spin_unlock_irqrestore(&bcsp->unack.lock, flags);
689
690         hci_uart_tx_wakeup(hu);
691 }
692
693 static int bcsp_open(struct hci_uart *hu)
694 {
695         struct bcsp_struct *bcsp;
696
697         BT_DBG("hu %p", hu);
698
699         bcsp = kzalloc(sizeof(*bcsp), GFP_KERNEL);
700         if (!bcsp)
701                 return -ENOMEM;
702
703         hu->priv = bcsp;
704         skb_queue_head_init(&bcsp->unack);
705         skb_queue_head_init(&bcsp->rel);
706         skb_queue_head_init(&bcsp->unrel);
707
708         init_timer(&bcsp->tbcsp);
709         bcsp->tbcsp.function = bcsp_timed_event;
710         bcsp->tbcsp.data     = (u_long) hu;
711
712         bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
713
714         if (txcrc)
715                 bcsp->use_crc = 1;
716
717         return 0;
718 }
719
720 static int bcsp_close(struct hci_uart *hu)
721 {
722         struct bcsp_struct *bcsp = hu->priv;
723
724         del_timer_sync(&bcsp->tbcsp);
725
726         hu->priv = NULL;
727
728         BT_DBG("hu %p", hu);
729
730         skb_queue_purge(&bcsp->unack);
731         skb_queue_purge(&bcsp->rel);
732         skb_queue_purge(&bcsp->unrel);
733
734         kfree(bcsp);
735         return 0;
736 }
737
738 static struct hci_uart_proto bcsp = {
739         .id             = HCI_UART_BCSP,
740         .open           = bcsp_open,
741         .close          = bcsp_close,
742         .enqueue        = bcsp_enqueue,
743         .dequeue        = bcsp_dequeue,
744         .recv           = bcsp_recv,
745         .flush          = bcsp_flush
746 };
747
748 int __init bcsp_init(void)
749 {
750         int err = hci_uart_register_proto(&bcsp);
751
752         if (!err)
753                 BT_INFO("HCI BCSP protocol initialized");
754         else
755                 BT_ERR("HCI BCSP protocol registration failed");
756
757         return err;
758 }
759
760 int __exit bcsp_deinit(void)
761 {
762         return hci_uart_unregister_proto(&bcsp);
763 }
764
765 module_param(txcrc, bool, 0644);
766 MODULE_PARM_DESC(txcrc, "Transmit CRC with every BCSP packet");
767
768 module_param(hciextn, bool, 0644);
769 MODULE_PARM_DESC(hciextn, "Convert HCI Extensions into BCSP packets");