OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [bluetooth/] [hci_bcsp.c] - Blame information for rev 67

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.