Lines Matching refs:bcsp
136 struct bcsp_struct *bcsp = hu->priv;
147 skb_queue_tail(&bcsp->rel, skb);
151 skb_queue_tail(&bcsp->unrel, skb);
163 static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
212 /* Max len of packet: (original len +4(bcsp hdr) +2(crc))*2
226 hdr[0] = bcsp->rxseq_txack << 3;
227 bcsp->txack_req = 0;
228 BT_DBG("We request packet no %u to card", bcsp->rxseq_txack);
231 hdr[0] |= 0x80 + bcsp->msgq_txseq;
232 BT_DBG("Sending packet with seqno %u", bcsp->msgq_txseq);
233 bcsp->msgq_txseq = (bcsp->msgq_txseq + 1) & 0x07;
236 if (bcsp->use_crc)
247 if (bcsp->use_crc)
255 if (bcsp->use_crc)
260 if (bcsp->use_crc) {
273 struct bcsp_struct *bcsp = hu->priv;
281 skb = skb_dequeue(&bcsp->unrel);
285 nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len,
291 skb_queue_head(&bcsp->unrel, skb);
301 spin_lock_irqsave_nested(&bcsp->unack.lock, flags, SINGLE_DEPTH_NESTING);
303 if (bcsp->unack.qlen < BCSP_TXWINSIZE) {
304 skb = skb_dequeue(&bcsp->rel);
308 nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len,
311 __skb_queue_tail(&bcsp->unack, skb);
312 mod_timer(&bcsp->tbcsp, jiffies + HZ / 4);
313 spin_unlock_irqrestore(&bcsp->unack.lock, flags);
316 skb_queue_head(&bcsp->rel, skb);
322 spin_unlock_irqrestore(&bcsp->unack.lock, flags);
329 if (bcsp->txack_req) {
333 struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, NULL, 0, BCSP_ACK_PKT);
348 static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
355 spin_lock_irqsave(&bcsp->unack.lock, flags);
357 pkts_to_be_removed = skb_queue_len(&bcsp->unack);
358 seqno = bcsp->msgq_txseq;
361 if (bcsp->rxack == seqno)
367 if (bcsp->rxack != seqno)
371 pkts_to_be_removed, skb_queue_len(&bcsp->unack),
375 skb_queue_walk_safe(&bcsp->unack, skb, tmp) {
380 __skb_unlink(skb, &bcsp->unack);
384 if (skb_queue_empty(&bcsp->unack))
385 del_timer(&bcsp->tbcsp);
387 spin_unlock_irqrestore(&bcsp->unack.lock, flags);
399 struct bcsp_struct *bcsp = hu->priv;
405 if (bcsp->rx_skb->data[1] >> 4 == 4 && bcsp->rx_skb->data[2] == 0 &&
406 !memcmp(&bcsp->rx_skb->data[4], conf_pkt, 4)) {
415 skb_queue_head(&bcsp->unrel, nskb);
419 else if (bcsp->rx_skb->data[1] >> 4 == 4 && bcsp->rx_skb->data[2] == 0 &&
420 !memcmp(&bcsp->rx_skb->data[4], sync_pkt, 4)) {
425 static inline void bcsp_unslip_one_byte(struct bcsp_struct *bcsp, unsigned char byte)
429 switch (bcsp->rx_esc_state) {
433 bcsp->rx_esc_state = BCSP_ESCSTATE_ESC;
436 skb_put_data(bcsp->rx_skb, &byte, 1);
437 if ((bcsp->rx_skb->data[0] & 0x40) != 0 &&
438 bcsp->rx_state != BCSP_W4_CRC)
439 bcsp_crc_update(&bcsp->message_crc, byte);
440 bcsp->rx_count--;
447 skb_put_data(bcsp->rx_skb, &c0, 1);
448 if ((bcsp->rx_skb->data[0] & 0x40) != 0 &&
449 bcsp->rx_state != BCSP_W4_CRC)
450 bcsp_crc_update(&bcsp->message_crc, 0xc0);
451 bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
452 bcsp->rx_count--;
456 skb_put_data(bcsp->rx_skb, &db, 1);
457 if ((bcsp->rx_skb->data[0] & 0x40) != 0 &&
458 bcsp->rx_state != BCSP_W4_CRC)
459 bcsp_crc_update(&bcsp->message_crc, 0xdb);
460 bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
461 bcsp->rx_count--;
466 kfree_skb(bcsp->rx_skb);
467 bcsp->rx_skb = NULL;
468 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
469 bcsp->rx_count = 0;
476 struct bcsp_struct *bcsp = hu->priv;
479 if (bcsp->rx_skb->data[0] & 0x80) { /* reliable pkt */
480 BT_DBG("Received seqno %u from card", bcsp->rxseq_txack);
483 if ((bcsp->rx_skb->data[0] & 0x07) == bcsp->rxseq_txack) {
484 bcsp->rxseq_txack++;
485 bcsp->rxseq_txack %= 0x8;
491 bcsp->rx_skb->data[0] & 0x07, bcsp->rxseq_txack);
498 bcsp->txack_req = 1;
504 bcsp->rxack = (bcsp->rx_skb->data[0] >> 3) & 0x07;
505 BT_DBG("Request for pkt %u from card", bcsp->rxack);
510 bcsp_pkt_cull(bcsp);
513 if ((bcsp->rx_skb->data[1] & 0x0f) == 6 &&
514 (bcsp->rx_skb->data[0] & 0x80)) {
515 hci_skb_pkt_type(bcsp->rx_skb) = HCI_ACLDATA_PKT;
517 } else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 &&
518 (bcsp->rx_skb->data[0] & 0x80)) {
519 hci_skb_pkt_type(bcsp->rx_skb) = HCI_EVENT_PKT;
521 } else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) {
522 hci_skb_pkt_type(bcsp->rx_skb) = HCI_SCODATA_PKT;
524 } else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 &&
525 !(bcsp->rx_skb->data[0] & 0x80)) {
535 u8 desc = (bcsp->rx_skb->data[1] & 0x0f);
540 skb_pull(bcsp->rx_skb, 4);
541 memcpy(skb_push(bcsp->rx_skb, 1), &desc, 1);
544 hdr.plen = bcsp->rx_skb->len;
545 memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE);
546 hci_skb_pkt_type(bcsp->rx_skb) = HCI_EVENT_PKT;
548 hci_recv_frame(hu->hdev, bcsp->rx_skb);
551 bcsp->rx_skb->data[1] & 0x0f,
552 bcsp->rx_skb->data[0] & 0x80 ?
554 kfree_skb(bcsp->rx_skb);
557 kfree_skb(bcsp->rx_skb);
560 skb_pull(bcsp->rx_skb, 4);
562 hci_recv_frame(hu->hdev, bcsp->rx_skb);
567 kfree_skb(bcsp->rx_skb);
570 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
571 bcsp->rx_skb = NULL;
574 static u16 bscp_get_crc(struct bcsp_struct *bcsp)
576 return get_unaligned_be16(&bcsp->rx_skb->data[bcsp->rx_skb->len - 2]);
582 struct bcsp_struct *bcsp = hu->priv;
586 hu, count, bcsp->rx_state, bcsp->rx_count);
590 if (bcsp->rx_count) {
593 kfree_skb(bcsp->rx_skb);
594 bcsp->rx_skb = NULL;
595 bcsp->rx_state = BCSP_W4_PKT_START;
596 bcsp->rx_count = 0;
598 bcsp_unslip_one_byte(bcsp, *ptr);
604 switch (bcsp->rx_state) {
606 if ((0xff & (u8)~(bcsp->rx_skb->data[0] + bcsp->rx_skb->data[1] +
607 bcsp->rx_skb->data[2])) != bcsp->rx_skb->data[3]) {
609 kfree_skb(bcsp->rx_skb);
610 bcsp->rx_skb = NULL;
611 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
612 bcsp->rx_count = 0;
615 bcsp->rx_state = BCSP_W4_DATA;
616 bcsp->rx_count = (bcsp->rx_skb->data[1] >> 4) +
617 (bcsp->rx_skb->data[2] << 4); /* May be 0 */
621 if (bcsp->rx_skb->data[0] & 0x40) { /* pkt with crc */
622 bcsp->rx_state = BCSP_W4_CRC;
623 bcsp->rx_count = 2;
629 if (bitrev16(bcsp->message_crc) != bscp_get_crc(bcsp)) {
631 bitrev16(bcsp->message_crc),
632 bscp_get_crc(bcsp));
634 kfree_skb(bcsp->rx_skb);
635 bcsp->rx_skb = NULL;
636 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
637 bcsp->rx_count = 0;
640 skb_trim(bcsp->rx_skb, bcsp->rx_skb->len - 2);
647 bcsp->rx_state = BCSP_W4_PKT_START;
663 bcsp->rx_state = BCSP_W4_BCSP_HDR;
664 bcsp->rx_count = 4;
665 bcsp->rx_esc_state = BCSP_ESCSTATE_NOESC;
666 BCSP_CRC_INIT(bcsp->message_crc);
673 bcsp->rx_skb = bt_skb_alloc(0x1005, GFP_ATOMIC);
674 if (!bcsp->rx_skb) {
676 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
677 bcsp->rx_count = 0;
691 struct bcsp_struct *bcsp = from_timer(bcsp, t, tbcsp);
692 struct hci_uart *hu = bcsp->hu;
696 BT_DBG("hu %p retransmitting %u pkts", hu, bcsp->unack.qlen);
698 spin_lock_irqsave_nested(&bcsp->unack.lock, flags, SINGLE_DEPTH_NESTING);
700 while ((skb = __skb_dequeue_tail(&bcsp->unack)) != NULL) {
701 bcsp->msgq_txseq = (bcsp->msgq_txseq - 1) & 0x07;
702 skb_queue_head(&bcsp->rel, skb);
705 spin_unlock_irqrestore(&bcsp->unack.lock, flags);
712 struct bcsp_struct *bcsp;
716 bcsp = kzalloc(sizeof(*bcsp), GFP_KERNEL);
717 if (!bcsp)
720 hu->priv = bcsp;
721 bcsp->hu = hu;
722 skb_queue_head_init(&bcsp->unack);
723 skb_queue_head_init(&bcsp->rel);
724 skb_queue_head_init(&bcsp->unrel);
726 timer_setup(&bcsp->tbcsp, bcsp_timed_event, 0);
728 bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
731 bcsp->use_crc = 1;
738 struct bcsp_struct *bcsp = hu->priv;
740 del_timer_sync(&bcsp->tbcsp);
746 skb_queue_purge(&bcsp->unack);
747 skb_queue_purge(&bcsp->rel);
748 skb_queue_purge(&bcsp->unrel);
750 if (bcsp->rx_skb) {
751 kfree_skb(bcsp->rx_skb);
752 bcsp->rx_skb = NULL;
755 kfree(bcsp);
759 static const struct hci_uart_proto bcsp = {
772 return hci_uart_register_proto(&bcsp);
777 return hci_uart_unregister_proto(&bcsp);