Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[Bluetooth] Change BPA 100/105 driver to use USB anchors

With the new support for USB anchors the driver can become more
simpler and also cleaner. This patch switches to the usage of USB
anchors for all URBs.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Marcel Holtmann and committed by
David S. Miller
e24b21ec 6464f35f

+315 -415
+315 -415
drivers/bluetooth/bpa10x.c
··· 2 2 * 3 3 * Digianswer Bluetooth USB driver 4 4 * 5 - * Copyright (C) 2004-2005 Marcel Holtmann <marcel@holtmann.org> 5 + * Copyright (C) 2004-2007 Marcel Holtmann <marcel@holtmann.org> 6 6 * 7 7 * 8 8 * This program is free software; you can redistribute it and/or modify ··· 21 21 * 22 22 */ 23 23 24 - #include <linux/module.h> 25 - 26 24 #include <linux/kernel.h> 25 + #include <linux/module.h> 27 26 #include <linux/init.h> 28 27 #include <linux/slab.h> 29 28 #include <linux/types.h> 29 + #include <linux/sched.h> 30 30 #include <linux/errno.h> 31 + #include <linux/skbuff.h> 31 32 32 33 #include <linux/usb.h> 33 34 ··· 40 39 #define BT_DBG(D...) 41 40 #endif 42 41 43 - #define VERSION "0.8" 42 + #define VERSION "0.9" 44 43 45 44 static int ignore = 0; 46 45 ··· 53 52 54 53 MODULE_DEVICE_TABLE(usb, bpa10x_table); 55 54 56 - #define BPA10X_CMD_EP 0x00 57 - #define BPA10X_EVT_EP 0x81 58 - #define BPA10X_TX_EP 0x02 59 - #define BPA10X_RX_EP 0x82 60 - 61 - #define BPA10X_CMD_BUF_SIZE 252 62 - #define BPA10X_EVT_BUF_SIZE 16 63 - #define BPA10X_TX_BUF_SIZE 384 64 - #define BPA10X_RX_BUF_SIZE 384 65 - 66 55 struct bpa10x_data { 67 - struct hci_dev *hdev; 68 - struct usb_device *udev; 56 + struct hci_dev *hdev; 57 + struct usb_device *udev; 69 58 70 - rwlock_t lock; 59 + struct usb_anchor tx_anchor; 60 + struct usb_anchor rx_anchor; 71 61 72 - struct sk_buff_head cmd_queue; 73 - struct urb *cmd_urb; 74 - struct urb *evt_urb; 75 - struct sk_buff *evt_skb; 76 - unsigned int evt_len; 77 - 78 - struct sk_buff_head tx_queue; 79 - struct urb *tx_urb; 80 - struct urb *rx_urb; 62 + struct sk_buff *rx_skb[2]; 81 63 }; 82 64 83 - #define HCI_VENDOR_HDR_SIZE 5 65 + #define HCI_VENDOR_HDR_SIZE 5 84 66 85 67 struct hci_vendor_hdr { 86 - __u8 type; 87 - __le16 snum; 88 - __le16 dlen; 68 + __u8 type; 69 + __le16 snum; 70 + __le16 dlen; 89 71 } __attribute__ ((packed)); 90 72 91 - static void bpa10x_recv_bulk(struct bpa10x_data *data, unsigned char *buf, int count) 73 + static int bpa10x_recv(struct hci_dev *hdev, int queue, void *buf, int count) 92 74 { 93 - struct hci_acl_hdr *ah; 94 - struct hci_sco_hdr *sh; 95 - struct hci_vendor_hdr *vh; 96 - struct sk_buff *skb; 97 - int len; 75 + struct bpa10x_data *data = hdev->driver_data; 76 + 77 + BT_DBG("%s queue %d buffer %p count %d", hdev->name, 78 + queue, buf, count); 79 + 80 + if (queue < 0 || queue > 1) 81 + return -EILSEQ; 82 + 83 + hdev->stat.byte_rx += count; 98 84 99 85 while (count) { 100 - switch (*buf++) { 101 - case HCI_ACLDATA_PKT: 102 - ah = (struct hci_acl_hdr *) buf; 103 - len = HCI_ACL_HDR_SIZE + __le16_to_cpu(ah->dlen); 104 - skb = bt_skb_alloc(len, GFP_ATOMIC); 105 - if (skb) { 106 - memcpy(skb_put(skb, len), buf, len); 107 - skb->dev = (void *) data->hdev; 108 - bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; 109 - hci_recv_frame(skb); 110 - } 111 - break; 86 + struct sk_buff *skb = data->rx_skb[queue]; 87 + struct { __u8 type; int expect; } *scb; 88 + int type, len = 0; 112 89 113 - case HCI_SCODATA_PKT: 114 - sh = (struct hci_sco_hdr *) buf; 115 - len = HCI_SCO_HDR_SIZE + sh->dlen; 116 - skb = bt_skb_alloc(len, GFP_ATOMIC); 117 - if (skb) { 118 - memcpy(skb_put(skb, len), buf, len); 119 - skb->dev = (void *) data->hdev; 120 - bt_cb(skb)->pkt_type = HCI_SCODATA_PKT; 121 - hci_recv_frame(skb); 122 - } 123 - break; 124 - 125 - case HCI_VENDOR_PKT: 126 - vh = (struct hci_vendor_hdr *) buf; 127 - len = HCI_VENDOR_HDR_SIZE + __le16_to_cpu(vh->dlen); 128 - skb = bt_skb_alloc(len, GFP_ATOMIC); 129 - if (skb) { 130 - memcpy(skb_put(skb, len), buf, len); 131 - skb->dev = (void *) data->hdev; 132 - bt_cb(skb)->pkt_type = HCI_VENDOR_PKT; 133 - hci_recv_frame(skb); 134 - } 135 - break; 136 - 137 - default: 138 - len = count - 1; 139 - break; 140 - } 141 - 142 - buf += len; 143 - count -= (len + 1); 144 - } 145 - } 146 - 147 - static int bpa10x_recv_event(struct bpa10x_data *data, unsigned char *buf, int size) 148 - { 149 - BT_DBG("data %p buf %p size %d", data, buf, size); 150 - 151 - if (data->evt_skb) { 152 - struct sk_buff *skb = data->evt_skb; 153 - 154 - memcpy(skb_put(skb, size), buf, size); 155 - 156 - if (skb->len == data->evt_len) { 157 - data->evt_skb = NULL; 158 - data->evt_len = 0; 159 - hci_recv_frame(skb); 160 - } 161 - } else { 162 - struct sk_buff *skb; 163 - struct hci_event_hdr *hdr; 164 - unsigned char pkt_type; 165 - int pkt_len = 0; 166 - 167 - if (size < HCI_EVENT_HDR_SIZE + 1) { 168 - BT_ERR("%s event packet block with size %d is too short", 169 - data->hdev->name, size); 170 - return -EILSEQ; 171 - } 172 - 173 - pkt_type = *buf++; 174 - size--; 175 - 176 - if (pkt_type != HCI_EVENT_PKT) { 177 - BT_ERR("%s unexpected event packet start byte 0x%02x", 178 - data->hdev->name, pkt_type); 179 - return -EPROTO; 180 - } 181 - 182 - hdr = (struct hci_event_hdr *) buf; 183 - pkt_len = HCI_EVENT_HDR_SIZE + hdr->plen; 184 - 185 - skb = bt_skb_alloc(pkt_len, GFP_ATOMIC); 186 90 if (!skb) { 187 - BT_ERR("%s no memory for new event packet", 188 - data->hdev->name); 189 - return -ENOMEM; 190 - } 91 + /* Start of the frame */ 191 92 192 - skb->dev = (void *) data->hdev; 193 - bt_cb(skb)->pkt_type = pkt_type; 93 + type = *((__u8 *) buf); 94 + count--; buf++; 194 95 195 - memcpy(skb_put(skb, size), buf, size); 96 + switch (type) { 97 + case HCI_EVENT_PKT: 98 + if (count >= HCI_EVENT_HDR_SIZE) { 99 + struct hci_event_hdr *h = buf; 100 + len = HCI_EVENT_HDR_SIZE + h->plen; 101 + } else 102 + return -EILSEQ; 103 + break; 196 104 197 - if (pkt_len == size) { 198 - hci_recv_frame(skb); 105 + case HCI_ACLDATA_PKT: 106 + if (count >= HCI_ACL_HDR_SIZE) { 107 + struct hci_acl_hdr *h = buf; 108 + len = HCI_ACL_HDR_SIZE + 109 + __le16_to_cpu(h->dlen); 110 + } else 111 + return -EILSEQ; 112 + break; 113 + 114 + case HCI_SCODATA_PKT: 115 + if (count >= HCI_SCO_HDR_SIZE) { 116 + struct hci_sco_hdr *h = buf; 117 + len = HCI_SCO_HDR_SIZE + h->dlen; 118 + } else 119 + return -EILSEQ; 120 + break; 121 + 122 + case HCI_VENDOR_PKT: 123 + if (count >= HCI_VENDOR_HDR_SIZE) { 124 + struct hci_vendor_hdr *h = buf; 125 + len = HCI_VENDOR_HDR_SIZE + 126 + __le16_to_cpu(h->dlen); 127 + } else 128 + return -EILSEQ; 129 + break; 130 + } 131 + 132 + skb = bt_skb_alloc(len, GFP_ATOMIC); 133 + if (!skb) { 134 + BT_ERR("%s no memory for packet", hdev->name); 135 + return -ENOMEM; 136 + } 137 + 138 + skb->dev = (void *) hdev; 139 + 140 + data->rx_skb[queue] = skb; 141 + 142 + scb = (void *) skb->cb; 143 + scb->type = type; 144 + scb->expect = len; 199 145 } else { 200 - data->evt_skb = skb; 201 - data->evt_len = pkt_len; 146 + /* Continuation */ 147 + 148 + scb = (void *) skb->cb; 149 + len = scb->expect; 202 150 } 151 + 152 + len = min(len, count); 153 + 154 + memcpy(skb_put(skb, len), buf, len); 155 + 156 + scb->expect -= len; 157 + 158 + if (scb->expect == 0) { 159 + /* Complete frame */ 160 + 161 + data->rx_skb[queue] = NULL; 162 + 163 + bt_cb(skb)->pkt_type = scb->type; 164 + hci_recv_frame(skb); 165 + } 166 + 167 + count -= len; buf += len; 203 168 } 204 169 205 170 return 0; 206 171 } 207 172 208 - static void bpa10x_wakeup(struct bpa10x_data *data) 173 + static void bpa10x_tx_complete(struct urb *urb) 209 174 { 210 - struct urb *urb; 211 - struct sk_buff *skb; 175 + struct sk_buff *skb = urb->context; 176 + struct hci_dev *hdev = (struct hci_dev *) skb->dev; 177 + 178 + BT_DBG("%s urb %p status %d count %d", hdev->name, 179 + urb, urb->status, urb->actual_length); 180 + 181 + if (!test_bit(HCI_RUNNING, &hdev->flags)) 182 + goto done; 183 + 184 + if (!urb->status) 185 + hdev->stat.byte_tx += urb->transfer_buffer_length; 186 + else 187 + hdev->stat.err_tx++; 188 + 189 + done: 190 + kfree(urb->setup_packet); 191 + 192 + kfree_skb(skb); 193 + } 194 + 195 + static void bpa10x_rx_complete(struct urb *urb) 196 + { 197 + struct hci_dev *hdev = urb->context; 198 + struct bpa10x_data *data = hdev->driver_data; 212 199 int err; 213 200 214 - BT_DBG("data %p", data); 201 + BT_DBG("%s urb %p status %d count %d", hdev->name, 202 + urb, urb->status, urb->actual_length); 215 203 216 - urb = data->cmd_urb; 217 - if (urb->status == -EINPROGRESS) 218 - skb = NULL; 219 - else 220 - skb = skb_dequeue(&data->cmd_queue); 221 - 222 - if (skb) { 223 - struct usb_ctrlrequest *cr; 224 - 225 - if (skb->len > BPA10X_CMD_BUF_SIZE) { 226 - BT_ERR("%s command packet with size %d is too big", 227 - data->hdev->name, skb->len); 228 - kfree_skb(skb); 229 - return; 230 - } 231 - 232 - cr = (struct usb_ctrlrequest *) urb->setup_packet; 233 - cr->wLength = __cpu_to_le16(skb->len); 234 - 235 - skb_copy_from_linear_data(skb, urb->transfer_buffer, skb->len); 236 - urb->transfer_buffer_length = skb->len; 237 - 238 - err = usb_submit_urb(urb, GFP_ATOMIC); 239 - if (err < 0 && err != -ENODEV) { 240 - BT_ERR("%s submit failed for command urb %p with error %d", 241 - data->hdev->name, urb, err); 242 - skb_queue_head(&data->cmd_queue, skb); 243 - } else 244 - kfree_skb(skb); 245 - } 246 - 247 - urb = data->tx_urb; 248 - if (urb->status == -EINPROGRESS) 249 - skb = NULL; 250 - else 251 - skb = skb_dequeue(&data->tx_queue); 252 - 253 - if (skb) { 254 - skb_copy_from_linear_data(skb, urb->transfer_buffer, skb->len); 255 - urb->transfer_buffer_length = skb->len; 256 - 257 - err = usb_submit_urb(urb, GFP_ATOMIC); 258 - if (err < 0 && err != -ENODEV) { 259 - BT_ERR("%s submit failed for command urb %p with error %d", 260 - data->hdev->name, urb, err); 261 - skb_queue_head(&data->tx_queue, skb); 262 - } else 263 - kfree_skb(skb); 264 - } 265 - } 266 - 267 - static void bpa10x_complete(struct urb *urb) 268 - { 269 - struct bpa10x_data *data = urb->context; 270 - unsigned char *buf = urb->transfer_buffer; 271 - int err, count = urb->actual_length; 272 - 273 - BT_DBG("data %p urb %p buf %p count %d", data, urb, buf, count); 274 - 275 - read_lock(&data->lock); 276 - 277 - if (!test_bit(HCI_RUNNING, &data->hdev->flags)) 278 - goto unlock; 279 - 280 - if (urb->status < 0 || !count) 281 - goto resubmit; 282 - 283 - if (usb_pipein(urb->pipe)) { 284 - data->hdev->stat.byte_rx += count; 285 - 286 - if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) 287 - bpa10x_recv_event(data, buf, count); 288 - 289 - if (usb_pipetype(urb->pipe) == PIPE_BULK) 290 - bpa10x_recv_bulk(data, buf, count); 291 - } else { 292 - data->hdev->stat.byte_tx += count; 293 - 294 - bpa10x_wakeup(data); 295 - } 296 - 297 - resubmit: 298 - if (usb_pipein(urb->pipe)) { 299 - err = usb_submit_urb(urb, GFP_ATOMIC); 300 - if (err < 0 && err != -ENODEV) { 301 - BT_ERR("%s urb %p type %d resubmit status %d", 302 - data->hdev->name, urb, usb_pipetype(urb->pipe), err); 303 - } 304 - } 305 - 306 - unlock: 307 - read_unlock(&data->lock); 308 - } 309 - 310 - static inline struct urb *bpa10x_alloc_urb(struct usb_device *udev, unsigned int pipe, 311 - size_t size, gfp_t flags, void *data) 312 - { 313 - struct urb *urb; 314 - struct usb_ctrlrequest *cr; 315 - unsigned char *buf; 316 - 317 - BT_DBG("udev %p data %p", udev, data); 318 - 319 - urb = usb_alloc_urb(0, flags); 320 - if (!urb) 321 - return NULL; 322 - 323 - buf = kmalloc(size, flags); 324 - if (!buf) { 325 - usb_free_urb(urb); 326 - return NULL; 327 - } 328 - 329 - switch (usb_pipetype(pipe)) { 330 - case PIPE_CONTROL: 331 - cr = kmalloc(sizeof(*cr), flags); 332 - if (!cr) { 333 - kfree(buf); 334 - usb_free_urb(urb); 335 - return NULL; 336 - } 337 - 338 - cr->bRequestType = USB_TYPE_VENDOR; 339 - cr->bRequest = 0; 340 - cr->wIndex = 0; 341 - cr->wValue = 0; 342 - cr->wLength = __cpu_to_le16(0); 343 - 344 - usb_fill_control_urb(urb, udev, pipe, (void *) cr, buf, 0, bpa10x_complete, data); 345 - break; 346 - 347 - case PIPE_INTERRUPT: 348 - usb_fill_int_urb(urb, udev, pipe, buf, size, bpa10x_complete, data, 1); 349 - break; 350 - 351 - case PIPE_BULK: 352 - usb_fill_bulk_urb(urb, udev, pipe, buf, size, bpa10x_complete, data); 353 - break; 354 - 355 - default: 356 - kfree(buf); 357 - usb_free_urb(urb); 358 - return NULL; 359 - } 360 - 361 - return urb; 362 - } 363 - 364 - static inline void bpa10x_free_urb(struct urb *urb) 365 - { 366 - BT_DBG("urb %p", urb); 367 - 368 - if (!urb) 204 + if (!test_bit(HCI_RUNNING, &hdev->flags)) 369 205 return; 370 206 371 - kfree(urb->setup_packet); 372 - kfree(urb->transfer_buffer); 207 + if (urb->status == 0) { 208 + if (bpa10x_recv(hdev, usb_pipebulk(urb->pipe), 209 + urb->transfer_buffer, 210 + urb->actual_length) < 0) { 211 + BT_ERR("%s corrupted event packet", hdev->name); 212 + hdev->stat.err_rx++; 213 + } 214 + } 215 + 216 + usb_anchor_urb(urb, &data->rx_anchor); 217 + 218 + err = usb_submit_urb(urb, GFP_ATOMIC); 219 + if (err < 0) { 220 + BT_ERR("%s urb %p failed to resubmit (%d)", 221 + hdev->name, urb, -err); 222 + usb_unanchor_urb(urb); 223 + } 224 + } 225 + 226 + static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev) 227 + { 228 + struct bpa10x_data *data = hdev->driver_data; 229 + struct urb *urb; 230 + unsigned char *buf; 231 + unsigned int pipe; 232 + int err, size = 16; 233 + 234 + BT_DBG("%s", hdev->name); 235 + 236 + urb = usb_alloc_urb(0, GFP_KERNEL); 237 + if (!urb) 238 + return -ENOMEM; 239 + 240 + buf = kmalloc(size, GFP_KERNEL); 241 + if (!buf) { 242 + usb_free_urb(urb); 243 + return -ENOMEM; 244 + } 245 + 246 + pipe = usb_rcvintpipe(data->udev, 0x81); 247 + 248 + usb_fill_int_urb(urb, data->udev, pipe, buf, size, 249 + bpa10x_rx_complete, hdev, 1); 250 + 251 + urb->transfer_flags |= URB_FREE_BUFFER; 252 + 253 + usb_anchor_urb(urb, &data->rx_anchor); 254 + 255 + err = usb_submit_urb(urb, GFP_KERNEL); 256 + if (err < 0) { 257 + BT_ERR("%s urb %p submission failed (%d)", 258 + hdev->name, urb, -err); 259 + usb_unanchor_urb(urb); 260 + kfree(buf); 261 + } 373 262 374 263 usb_free_urb(urb); 264 + 265 + return err; 266 + } 267 + 268 + static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev) 269 + { 270 + struct bpa10x_data *data = hdev->driver_data; 271 + struct urb *urb; 272 + unsigned char *buf; 273 + unsigned int pipe; 274 + int err, size = 64; 275 + 276 + BT_DBG("%s", hdev->name); 277 + 278 + urb = usb_alloc_urb(0, GFP_KERNEL); 279 + if (!urb) 280 + return -ENOMEM; 281 + 282 + buf = kmalloc(size, GFP_KERNEL); 283 + if (!buf) { 284 + usb_free_urb(urb); 285 + return -ENOMEM; 286 + } 287 + 288 + pipe = usb_rcvbulkpipe(data->udev, 0x82); 289 + 290 + usb_fill_bulk_urb(urb, data->udev, pipe, 291 + buf, size, bpa10x_rx_complete, hdev); 292 + 293 + urb->transfer_flags |= URB_FREE_BUFFER; 294 + 295 + usb_anchor_urb(urb, &data->rx_anchor); 296 + 297 + err = usb_submit_urb(urb, GFP_KERNEL); 298 + if (err < 0) { 299 + BT_ERR("%s urb %p submission failed (%d)", 300 + hdev->name, urb, -err); 301 + usb_unanchor_urb(urb); 302 + kfree(buf); 303 + } 304 + 305 + usb_free_urb(urb); 306 + 307 + return err; 375 308 } 376 309 377 310 static int bpa10x_open(struct hci_dev *hdev) 378 311 { 379 312 struct bpa10x_data *data = hdev->driver_data; 380 - struct usb_device *udev = data->udev; 381 - unsigned long flags; 382 313 int err; 383 314 384 - BT_DBG("hdev %p data %p", hdev, data); 315 + BT_DBG("%s", hdev->name); 385 316 386 317 if (test_and_set_bit(HCI_RUNNING, &hdev->flags)) 387 318 return 0; 388 319 389 - data->cmd_urb = bpa10x_alloc_urb(udev, usb_sndctrlpipe(udev, BPA10X_CMD_EP), 390 - BPA10X_CMD_BUF_SIZE, GFP_KERNEL, data); 391 - if (!data->cmd_urb) { 392 - err = -ENOMEM; 393 - goto done; 394 - } 395 - 396 - data->evt_urb = bpa10x_alloc_urb(udev, usb_rcvintpipe(udev, BPA10X_EVT_EP), 397 - BPA10X_EVT_BUF_SIZE, GFP_KERNEL, data); 398 - if (!data->evt_urb) { 399 - bpa10x_free_urb(data->cmd_urb); 400 - err = -ENOMEM; 401 - goto done; 402 - } 403 - 404 - data->rx_urb = bpa10x_alloc_urb(udev, usb_rcvbulkpipe(udev, BPA10X_RX_EP), 405 - BPA10X_RX_BUF_SIZE, GFP_KERNEL, data); 406 - if (!data->rx_urb) { 407 - bpa10x_free_urb(data->evt_urb); 408 - bpa10x_free_urb(data->cmd_urb); 409 - err = -ENOMEM; 410 - goto done; 411 - } 412 - 413 - data->tx_urb = bpa10x_alloc_urb(udev, usb_sndbulkpipe(udev, BPA10X_TX_EP), 414 - BPA10X_TX_BUF_SIZE, GFP_KERNEL, data); 415 - if (!data->rx_urb) { 416 - bpa10x_free_urb(data->rx_urb); 417 - bpa10x_free_urb(data->evt_urb); 418 - bpa10x_free_urb(data->cmd_urb); 419 - err = -ENOMEM; 420 - goto done; 421 - } 422 - 423 - write_lock_irqsave(&data->lock, flags); 424 - 425 - err = usb_submit_urb(data->evt_urb, GFP_ATOMIC); 426 - if (err < 0) { 427 - BT_ERR("%s submit failed for event urb %p with error %d", 428 - data->hdev->name, data->evt_urb, err); 429 - } else { 430 - err = usb_submit_urb(data->rx_urb, GFP_ATOMIC); 431 - if (err < 0) { 432 - BT_ERR("%s submit failed for rx urb %p with error %d", 433 - data->hdev->name, data->evt_urb, err); 434 - usb_kill_urb(data->evt_urb); 435 - } 436 - } 437 - 438 - write_unlock_irqrestore(&data->lock, flags); 439 - 440 - done: 320 + err = bpa10x_submit_intr_urb(hdev); 441 321 if (err < 0) 442 - clear_bit(HCI_RUNNING, &hdev->flags); 322 + goto error; 323 + 324 + err = bpa10x_submit_bulk_urb(hdev); 325 + if (err < 0) 326 + goto error; 327 + 328 + return 0; 329 + 330 + error: 331 + usb_kill_anchored_urbs(&data->rx_anchor); 332 + 333 + clear_bit(HCI_RUNNING, &hdev->flags); 443 334 444 335 return err; 445 336 } ··· 339 446 static int bpa10x_close(struct hci_dev *hdev) 340 447 { 341 448 struct bpa10x_data *data = hdev->driver_data; 342 - unsigned long flags; 343 449 344 - BT_DBG("hdev %p data %p", hdev, data); 450 + BT_DBG("%s", hdev->name); 345 451 346 452 if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) 347 453 return 0; 348 454 349 - write_lock_irqsave(&data->lock, flags); 350 - 351 - skb_queue_purge(&data->cmd_queue); 352 - usb_kill_urb(data->cmd_urb); 353 - usb_kill_urb(data->evt_urb); 354 - usb_kill_urb(data->rx_urb); 355 - usb_kill_urb(data->tx_urb); 356 - 357 - write_unlock_irqrestore(&data->lock, flags); 358 - 359 - bpa10x_free_urb(data->cmd_urb); 360 - bpa10x_free_urb(data->evt_urb); 361 - bpa10x_free_urb(data->rx_urb); 362 - bpa10x_free_urb(data->tx_urb); 455 + usb_kill_anchored_urbs(&data->rx_anchor); 363 456 364 457 return 0; 365 458 } ··· 354 475 { 355 476 struct bpa10x_data *data = hdev->driver_data; 356 477 357 - BT_DBG("hdev %p data %p", hdev, data); 478 + BT_DBG("%s", hdev->name); 358 479 359 - skb_queue_purge(&data->cmd_queue); 480 + usb_kill_anchored_urbs(&data->tx_anchor); 360 481 361 482 return 0; 362 483 } ··· 364 485 static int bpa10x_send_frame(struct sk_buff *skb) 365 486 { 366 487 struct hci_dev *hdev = (struct hci_dev *) skb->dev; 367 - struct bpa10x_data *data; 488 + struct bpa10x_data *data = hdev->driver_data; 489 + struct usb_ctrlrequest *dr; 490 + struct urb *urb; 491 + unsigned int pipe; 492 + int err; 368 493 369 - BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, bt_cb(skb)->pkt_type, skb->len); 370 - 371 - if (!hdev) { 372 - BT_ERR("Frame for unknown HCI device"); 373 - return -ENODEV; 374 - } 494 + BT_DBG("%s", hdev->name); 375 495 376 496 if (!test_bit(HCI_RUNNING, &hdev->flags)) 377 497 return -EBUSY; 378 498 379 - data = hdev->driver_data; 499 + urb = usb_alloc_urb(0, GFP_ATOMIC); 500 + if (!urb) 501 + return -ENOMEM; 380 502 381 503 /* Prepend skb with frame type */ 382 - memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); 504 + *skb_push(skb, 1) = bt_cb(skb)->pkt_type; 383 505 384 506 switch (bt_cb(skb)->pkt_type) { 385 507 case HCI_COMMAND_PKT: 508 + dr = kmalloc(sizeof(*dr), GFP_ATOMIC); 509 + if (!dr) { 510 + usb_free_urb(urb); 511 + return -ENOMEM; 512 + } 513 + 514 + dr->bRequestType = USB_TYPE_VENDOR; 515 + dr->bRequest = 0; 516 + dr->wIndex = 0; 517 + dr->wValue = 0; 518 + dr->wLength = __cpu_to_le16(skb->len); 519 + 520 + pipe = usb_sndctrlpipe(data->udev, 0x00); 521 + 522 + usb_fill_control_urb(urb, data->udev, pipe, (void *) dr, 523 + skb->data, skb->len, bpa10x_tx_complete, skb); 524 + 386 525 hdev->stat.cmd_tx++; 387 - skb_queue_tail(&data->cmd_queue, skb); 388 526 break; 389 527 390 528 case HCI_ACLDATA_PKT: 529 + pipe = usb_sndbulkpipe(data->udev, 0x02); 530 + 531 + usb_fill_bulk_urb(urb, data->udev, pipe, 532 + skb->data, skb->len, bpa10x_tx_complete, skb); 533 + 391 534 hdev->stat.acl_tx++; 392 - skb_queue_tail(&data->tx_queue, skb); 393 535 break; 394 536 395 537 case HCI_SCODATA_PKT: 538 + pipe = usb_sndbulkpipe(data->udev, 0x02); 539 + 540 + usb_fill_bulk_urb(urb, data->udev, pipe, 541 + skb->data, skb->len, bpa10x_tx_complete, skb); 542 + 396 543 hdev->stat.sco_tx++; 397 - skb_queue_tail(&data->tx_queue, skb); 398 544 break; 399 - }; 400 545 401 - read_lock(&data->lock); 546 + default: 547 + return -EILSEQ; 548 + } 402 549 403 - bpa10x_wakeup(data); 550 + usb_anchor_urb(urb, &data->tx_anchor); 404 551 405 - read_unlock(&data->lock); 552 + err = usb_submit_urb(urb, GFP_ATOMIC); 553 + if (err < 0) { 554 + BT_ERR("%s urb %p submission failed", hdev->name, urb); 555 + kfree(urb->setup_packet); 556 + usb_unanchor_urb(urb); 557 + } 558 + 559 + usb_free_urb(urb); 406 560 407 561 return 0; 408 562 } ··· 444 532 { 445 533 struct bpa10x_data *data = hdev->driver_data; 446 534 447 - BT_DBG("hdev %p data %p", hdev, data); 535 + BT_DBG("%s", hdev->name); 448 536 537 + kfree(data->rx_skb[0]); 538 + kfree(data->rx_skb[1]); 449 539 kfree(data); 450 540 } 451 541 452 542 static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *id) 453 543 { 454 - struct usb_device *udev = interface_to_usbdev(intf); 455 - struct hci_dev *hdev; 456 544 struct bpa10x_data *data; 545 + struct hci_dev *hdev; 457 546 int err; 458 547 459 548 BT_DBG("intf %p id %p", intf, id); ··· 462 549 if (ignore) 463 550 return -ENODEV; 464 551 465 - if (intf->cur_altsetting->desc.bInterfaceNumber > 0) 552 + if (intf->cur_altsetting->desc.bInterfaceNumber != 0) 466 553 return -ENODEV; 467 554 468 555 data = kzalloc(sizeof(*data), GFP_KERNEL); 469 - if (!data) { 470 - BT_ERR("Can't allocate data structure"); 556 + if (!data) 471 557 return -ENOMEM; 472 - } 473 558 474 - data->udev = udev; 559 + data->udev = interface_to_usbdev(intf); 475 560 476 - rwlock_init(&data->lock); 477 - 478 - skb_queue_head_init(&data->cmd_queue); 479 - skb_queue_head_init(&data->tx_queue); 561 + init_usb_anchor(&data->tx_anchor); 562 + init_usb_anchor(&data->rx_anchor); 480 563 481 564 hdev = hci_alloc_dev(); 482 565 if (!hdev) { 483 - BT_ERR("Can't allocate HCI device"); 484 566 kfree(data); 485 567 return -ENOMEM; 486 568 } 487 569 488 - data->hdev = hdev; 489 - 490 570 hdev->type = HCI_USB; 491 571 hdev->driver_data = data; 572 + 573 + data->hdev = hdev; 574 + 492 575 SET_HCIDEV_DEV(hdev, &intf->dev); 493 576 494 - hdev->open = bpa10x_open; 495 - hdev->close = bpa10x_close; 496 - hdev->flush = bpa10x_flush; 497 - hdev->send = bpa10x_send_frame; 498 - hdev->destruct = bpa10x_destruct; 577 + hdev->open = bpa10x_open; 578 + hdev->close = bpa10x_close; 579 + hdev->flush = bpa10x_flush; 580 + hdev->send = bpa10x_send_frame; 581 + hdev->destruct = bpa10x_destruct; 499 582 500 583 hdev->owner = THIS_MODULE; 501 584 502 585 err = hci_register_dev(hdev); 503 586 if (err < 0) { 504 - BT_ERR("Can't register HCI device"); 505 - kfree(data); 506 587 hci_free_dev(hdev); 588 + kfree(data); 507 589 return err; 508 590 } 509 591 ··· 510 602 static void bpa10x_disconnect(struct usb_interface *intf) 511 603 { 512 604 struct bpa10x_data *data = usb_get_intfdata(intf); 513 - struct hci_dev *hdev = data->hdev; 514 605 515 606 BT_DBG("intf %p", intf); 516 607 517 - if (!hdev) 608 + if (!data) 518 609 return; 519 610 520 611 usb_set_intfdata(intf, NULL); 521 612 522 - if (hci_unregister_dev(hdev) < 0) 523 - BT_ERR("Can't unregister HCI device %s", hdev->name); 613 + hci_unregister_dev(data->hdev); 524 614 525 - hci_free_dev(hdev); 615 + hci_free_dev(data->hdev); 526 616 } 527 617 528 618 static struct usb_driver bpa10x_driver = { ··· 532 626 533 627 static int __init bpa10x_init(void) 534 628 { 535 - int err; 536 - 537 629 BT_INFO("Digianswer Bluetooth USB driver ver %s", VERSION); 538 630 539 - err = usb_register(&bpa10x_driver); 540 - if (err < 0) 541 - BT_ERR("Failed to register USB driver"); 542 - 543 - return err; 631 + return usb_register(&bpa10x_driver); 544 632 } 545 633 546 634 static void __exit bpa10x_exit(void)