Lines Matching refs:data
78 static struct urb *bfusb_get_completed(struct bfusb_data *data) in bfusb_get_completed() argument
83 BT_DBG("bfusb %p", data); in bfusb_get_completed()
85 skb = skb_dequeue(&data->completed_q); in bfusb_get_completed()
94 static void bfusb_unlink_urbs(struct bfusb_data *data) in bfusb_unlink_urbs() argument
99 BT_DBG("bfusb %p", data); in bfusb_unlink_urbs()
101 while ((skb = skb_dequeue(&data->pending_q))) { in bfusb_unlink_urbs()
104 skb_queue_tail(&data->completed_q, skb); in bfusb_unlink_urbs()
107 while ((urb = bfusb_get_completed(data))) in bfusb_unlink_urbs()
111 static int bfusb_send_bulk(struct bfusb_data *data, struct sk_buff *skb) in bfusb_send_bulk() argument
114 struct urb *urb = bfusb_get_completed(data); in bfusb_send_bulk()
117 BT_DBG("bfusb %p skb %p len %d", data, skb, skb->len); in bfusb_send_bulk()
125 pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep); in bfusb_send_bulk()
127 usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, skb->len, in bfusb_send_bulk()
132 skb_queue_tail(&data->pending_q, skb); in bfusb_send_bulk()
136 bt_dev_err(data->hdev, "bulk tx submit failed urb %p err %d", in bfusb_send_bulk()
138 skb_unlink(skb, &data->pending_q); in bfusb_send_bulk()
141 atomic_inc(&data->pending_tx); in bfusb_send_bulk()
146 static void bfusb_tx_wakeup(struct bfusb_data *data) in bfusb_tx_wakeup() argument
150 BT_DBG("bfusb %p", data); in bfusb_tx_wakeup()
152 if (test_and_set_bit(BFUSB_TX_PROCESS, &data->state)) { in bfusb_tx_wakeup()
153 set_bit(BFUSB_TX_WAKEUP, &data->state); in bfusb_tx_wakeup()
158 clear_bit(BFUSB_TX_WAKEUP, &data->state); in bfusb_tx_wakeup()
160 while ((atomic_read(&data->pending_tx) < BFUSB_MAX_BULK_TX) && in bfusb_tx_wakeup()
161 (skb = skb_dequeue(&data->transmit_q))) { in bfusb_tx_wakeup()
162 if (bfusb_send_bulk(data, skb) < 0) { in bfusb_tx_wakeup()
163 skb_queue_head(&data->transmit_q, skb); in bfusb_tx_wakeup()
168 } while (test_bit(BFUSB_TX_WAKEUP, &data->state)); in bfusb_tx_wakeup()
170 clear_bit(BFUSB_TX_PROCESS, &data->state); in bfusb_tx_wakeup()
176 struct bfusb_data *data = (struct bfusb_data *) skb->dev; in bfusb_tx_complete() local
178 BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len); in bfusb_tx_complete()
180 atomic_dec(&data->pending_tx); in bfusb_tx_complete()
182 if (!test_bit(HCI_RUNNING, &data->hdev->flags)) in bfusb_tx_complete()
186 data->hdev->stat.byte_tx += skb->len; in bfusb_tx_complete()
188 data->hdev->stat.err_tx++; in bfusb_tx_complete()
190 read_lock(&data->lock); in bfusb_tx_complete()
192 skb_unlink(skb, &data->pending_q); in bfusb_tx_complete()
193 skb_queue_tail(&data->completed_q, skb); in bfusb_tx_complete()
195 bfusb_tx_wakeup(data); in bfusb_tx_complete()
197 read_unlock(&data->lock); in bfusb_tx_complete()
201 static int bfusb_rx_submit(struct bfusb_data *data, struct urb *urb) in bfusb_rx_submit() argument
207 BT_DBG("bfusb %p urb %p", data, urb); in bfusb_rx_submit()
221 skb->dev = (void *) data; in bfusb_rx_submit()
226 pipe = usb_rcvbulkpipe(data->udev, data->bulk_in_ep); in bfusb_rx_submit()
228 usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, size, in bfusb_rx_submit()
231 skb_queue_tail(&data->pending_q, skb); in bfusb_rx_submit()
235 bt_dev_err(data->hdev, "bulk rx submit failed urb %p err %d", in bfusb_rx_submit()
237 skb_unlink(skb, &data->pending_q); in bfusb_rx_submit()
245 static inline int bfusb_recv_block(struct bfusb_data *data, int hdr, unsigned char *buf, int len) in bfusb_recv_block() argument
247 BT_DBG("bfusb %p hdr 0x%02x data %p len %d", data, hdr, buf, len); in bfusb_recv_block()
250 bt_dev_err(data->hdev, "error in block"); in bfusb_recv_block()
251 kfree_skb(data->reassembly); in bfusb_recv_block()
252 data->reassembly = NULL; in bfusb_recv_block()
261 if (data->reassembly) { in bfusb_recv_block()
262 bt_dev_err(data->hdev, "unexpected start block"); in bfusb_recv_block()
263 kfree_skb(data->reassembly); in bfusb_recv_block()
264 data->reassembly = NULL; in bfusb_recv_block()
268 bt_dev_err(data->hdev, "no packet type found"); in bfusb_recv_block()
280 bt_dev_err(data->hdev, "event block is too short"); in bfusb_recv_block()
290 bt_dev_err(data->hdev, "data block is too short"); in bfusb_recv_block()
300 bt_dev_err(data->hdev, "audio block is too short"); in bfusb_recv_block()
306 bt_dev_err(data->hdev, "unknown packet type 0x%02x", in bfusb_recv_block()
313 bt_dev_err(data->hdev, "no memory for the packet"); in bfusb_recv_block()
319 data->reassembly = skb; in bfusb_recv_block()
321 if (!data->reassembly) { in bfusb_recv_block()
322 bt_dev_err(data->hdev, "unexpected continuation block"); in bfusb_recv_block()
327 if (len > skb_tailroom(data->reassembly)) { in bfusb_recv_block()
328 bt_dev_err(data->hdev, "block exceeds packet length"); in bfusb_recv_block()
329 kfree_skb(data->reassembly); in bfusb_recv_block()
330 data->reassembly = NULL; in bfusb_recv_block()
335 skb_put_data(data->reassembly, buf, len); in bfusb_recv_block()
338 hci_recv_frame(data->hdev, data->reassembly); in bfusb_recv_block()
339 data->reassembly = NULL; in bfusb_recv_block()
348 struct bfusb_data *data = (struct bfusb_data *) skb->dev; in bfusb_rx_complete() local
353 BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len); in bfusb_rx_complete()
355 read_lock(&data->lock); in bfusb_rx_complete()
357 if (!test_bit(HCI_RUNNING, &data->hdev->flags)) in bfusb_rx_complete()
363 data->hdev->stat.byte_rx += count; in bfusb_rx_complete()
369 bt_dev_err(data->hdev, "short block header"); in bfusb_rx_complete()
370 kfree_skb(data->reassembly); in bfusb_rx_complete()
371 data->reassembly = NULL; in bfusb_rx_complete()
383 bt_dev_err(data->hdev, "short block header"); in bfusb_rx_complete()
384 kfree_skb(data->reassembly); in bfusb_rx_complete()
385 data->reassembly = NULL; in bfusb_rx_complete()
395 bt_dev_err(data->hdev, "block extends over URB buffer ranges"); in bfusb_rx_complete()
396 kfree_skb(data->reassembly); in bfusb_rx_complete()
397 data->reassembly = NULL; in bfusb_rx_complete()
402 bfusb_recv_block(data, hdr, buf, len) < 0) in bfusb_rx_complete()
403 data->hdev->stat.err_rx++; in bfusb_rx_complete()
409 skb_unlink(skb, &data->pending_q); in bfusb_rx_complete()
412 bfusb_rx_submit(data, urb); in bfusb_rx_complete()
414 read_unlock(&data->lock); in bfusb_rx_complete()
419 urb->dev = data->udev; in bfusb_rx_complete()
423 bt_dev_err(data->hdev, "bulk resubmit failed urb %p err %d", in bfusb_rx_complete()
428 read_unlock(&data->lock); in bfusb_rx_complete()
433 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_open() local
437 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_open()
439 write_lock_irqsave(&data->lock, flags); in bfusb_open()
441 err = bfusb_rx_submit(data, NULL); in bfusb_open()
444 bfusb_rx_submit(data, NULL); in bfusb_open()
447 write_unlock_irqrestore(&data->lock, flags); in bfusb_open()
454 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_flush() local
456 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_flush()
458 skb_queue_purge(&data->transmit_q); in bfusb_flush()
465 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_close() local
468 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_close()
470 write_lock_irqsave(&data->lock, flags); in bfusb_close()
471 write_unlock_irqrestore(&data->lock, flags); in bfusb_close()
473 bfusb_unlink_urbs(data); in bfusb_close()
481 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_send_frame() local
513 nskb->dev = (void *) data; in bfusb_send_frame()
530 if ((nskb->len % data->bulk_pkt_size) == 0) { in bfusb_send_frame()
536 read_lock(&data->lock); in bfusb_send_frame()
538 skb_queue_tail(&data->transmit_q, nskb); in bfusb_send_frame()
539 bfusb_tx_wakeup(data); in bfusb_send_frame()
541 read_unlock(&data->lock); in bfusb_send_frame()
548 static int bfusb_load_firmware(struct bfusb_data *data, in bfusb_load_firmware() argument
554 BT_DBG("bfusb %p udev %p", data, data->udev); in bfusb_load_firmware()
564 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
566 if (usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
573 data->udev->toggle[0] = data->udev->toggle[1] = 0; in bfusb_load_firmware()
575 pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep); in bfusb_load_firmware()
582 err = usb_bulk_msg(data->udev, pipe, buf, size, in bfusb_load_firmware()
594 err = usb_bulk_msg(data->udev, pipe, NULL, 0, in bfusb_load_firmware()
601 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
603 err = usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
610 data->udev->toggle[0] = data->udev->toggle[1] = 0; in bfusb_load_firmware()
620 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
622 usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
635 struct bfusb_data *data; in bfusb_probe() local
652 data = devm_kzalloc(&intf->dev, sizeof(struct bfusb_data), GFP_KERNEL); in bfusb_probe()
653 if (!data) in bfusb_probe()
656 data->udev = udev; in bfusb_probe()
657 data->bulk_in_ep = bulk_in_ep->desc.bEndpointAddress; in bfusb_probe()
658 data->bulk_out_ep = bulk_out_ep->desc.bEndpointAddress; in bfusb_probe()
659 data->bulk_pkt_size = le16_to_cpu(bulk_out_ep->desc.wMaxPacketSize); in bfusb_probe()
661 if (!data->bulk_pkt_size) in bfusb_probe()
664 rwlock_init(&data->lock); in bfusb_probe()
666 data->reassembly = NULL; in bfusb_probe()
668 skb_queue_head_init(&data->transmit_q); in bfusb_probe()
669 skb_queue_head_init(&data->pending_q); in bfusb_probe()
670 skb_queue_head_init(&data->completed_q); in bfusb_probe()
677 BT_DBG("firmware data %p size %zu", firmware->data, firmware->size); in bfusb_probe()
679 if (bfusb_load_firmware(data, firmware->data, firmware->size) < 0) { in bfusb_probe()
693 data->hdev = hdev; in bfusb_probe()
696 hci_set_drvdata(hdev, data); in bfusb_probe()
712 usb_set_intfdata(intf, data); in bfusb_probe()
725 struct bfusb_data *data = usb_get_intfdata(intf); in bfusb_disconnect() local
726 struct hci_dev *hdev = data->hdev; in bfusb_disconnect()