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 52static bool txcrc = 1; 53static bool hciextn = 1; 54 55#define BCSP_TXWINSIZE 4 56 57#define BCSP_ACK_PKT 0x05 58#define BCSP_LE_PKT 0x06 59 60struct 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, 95initial value 0xffff, bits shifted in reverse order. */ 96 97static 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*/ 114static 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 126static 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 133static 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 150static 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 179static 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 */ 285static 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 346static int bcsp_flush(struct hci_uart *hu) 347{ 348 BT_DBG("hu %p", hu); 349 return 0; 350} 351 352/* Remove ack'ed packets */ 353static 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) */ 401static 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 429static 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 478static 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 551static 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 */ 557static 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. */ 672static 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 693static 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 720static 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 738static 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 748int __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 760int __exit bcsp_deinit(void) 761{ 762 return hci_uart_unregister_proto(&bcsp); 763} 764 765module_param(txcrc, bool, 0644); 766MODULE_PARM_DESC(txcrc, "Transmit CRC with every BCSP packet"); 767 768module_param(hciextn, bool, 0644); 769MODULE_PARM_DESC(hciextn, "Convert HCI Extensions into BCSP packets"); 770