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