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

Bluetooth: Provide hdev parameter to hci_recv_frame() driver callback

To avoid casting skb->dev into hdev, just let the drivers provide
the hdev directly when calling hci_recv_frame() function.

This patch also fixes up all drivers to provide the hdev.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>

authored by

Marcel Holtmann and committed by
Johan Hedberg
e1a26170 8909f6d2

+24 -41
+1 -2
drivers/bluetooth/bfusb.c
··· 318 318 return -ENOMEM; 319 319 } 320 320 321 - skb->dev = (void *) data->hdev; 322 321 bt_cb(skb)->pkt_type = pkt_type; 323 322 324 323 data->reassembly = skb; ··· 332 333 memcpy(skb_put(data->reassembly, len), buf, len); 333 334 334 335 if (hdr & 0x08) { 335 - hci_recv_frame(data->reassembly); 336 + hci_recv_frame(data->hdev, data->reassembly); 336 337 data->reassembly = NULL; 337 338 } 338 339
+1 -2
drivers/bluetooth/bluecard_cs.c
··· 399 399 400 400 if (info->rx_state == RECV_WAIT_PACKET_TYPE) { 401 401 402 - info->rx_skb->dev = (void *) info->hdev; 403 402 bt_cb(info->rx_skb)->pkt_type = buf[i]; 404 403 405 404 switch (bt_cb(info->rx_skb)->pkt_type) { ··· 476 477 break; 477 478 478 479 case RECV_WAIT_DATA: 479 - hci_recv_frame(info->rx_skb); 480 + hci_recv_frame(info->hdev, info->rx_skb); 480 481 info->rx_skb = NULL; 481 482 break; 482 483
+1 -3
drivers/bluetooth/bpa10x.c
··· 129 129 return -ENOMEM; 130 130 } 131 131 132 - skb->dev = (void *) hdev; 133 - 134 132 data->rx_skb[queue] = skb; 135 133 136 134 scb = (void *) skb->cb; ··· 153 155 data->rx_skb[queue] = NULL; 154 156 155 157 bt_cb(skb)->pkt_type = scb->type; 156 - hci_recv_frame(skb); 158 + hci_recv_frame(hdev, skb); 157 159 } 158 160 159 161 count -= len; buf += len;
+1 -2
drivers/bluetooth/bt3c_cs.c
··· 247 247 248 248 if (info->rx_state == RECV_WAIT_PACKET_TYPE) { 249 249 250 - info->rx_skb->dev = (void *) info->hdev; 251 250 bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L); 252 251 inb(iobase + DATA_H); 253 252 //printk("bt3c: PACKET_TYPE=%02x\n", bt_cb(info->rx_skb)->pkt_type); ··· 317 318 break; 318 319 319 320 case RECV_WAIT_DATA: 320 - hci_recv_frame(info->rx_skb); 321 + hci_recv_frame(info->hdev, info->rx_skb); 321 322 info->rx_skb = NULL; 322 323 break; 323 324
+3 -5
drivers/bluetooth/btmrvl_sdio.c
··· 600 600 case HCI_SCODATA_PKT: 601 601 case HCI_EVENT_PKT: 602 602 bt_cb(skb)->pkt_type = type; 603 - skb->dev = (void *)hdev; 604 603 skb_put(skb, buf_len); 605 604 skb_pull(skb, SDIO_HEADER_LEN); 606 605 607 606 if (type == HCI_EVENT_PKT) { 608 607 if (btmrvl_check_evtpkt(priv, skb)) 609 - hci_recv_frame(skb); 608 + hci_recv_frame(hdev, skb); 610 609 } else { 611 - hci_recv_frame(skb); 610 + hci_recv_frame(hdev, skb); 612 611 } 613 612 614 613 hdev->stat.byte_rx += buf_len; ··· 615 616 616 617 case MRVL_VENDOR_PKT: 617 618 bt_cb(skb)->pkt_type = HCI_VENDOR_PKT; 618 - skb->dev = (void *)hdev; 619 619 skb_put(skb, buf_len); 620 620 skb_pull(skb, SDIO_HEADER_LEN); 621 621 622 622 if (btmrvl_process_event(priv, skb)) 623 - hci_recv_frame(skb); 623 + hci_recv_frame(hdev, skb); 624 624 625 625 hdev->stat.byte_rx += buf_len; 626 626 break;
+1 -2
drivers/bluetooth/btsdio.c
··· 157 157 158 158 data->hdev->stat.byte_rx += len; 159 159 160 - skb->dev = (void *) data->hdev; 161 160 bt_cb(skb)->pkt_type = hdr[3]; 162 161 163 - err = hci_recv_frame(skb); 162 + err = hci_recv_frame(data->hdev, skb); 164 163 if (err < 0) 165 164 return err; 166 165
+1 -2
drivers/bluetooth/btuart_cs.c
··· 198 198 199 199 if (info->rx_state == RECV_WAIT_PACKET_TYPE) { 200 200 201 - info->rx_skb->dev = (void *) info->hdev; 202 201 bt_cb(info->rx_skb)->pkt_type = inb(iobase + UART_RX); 203 202 204 203 switch (bt_cb(info->rx_skb)->pkt_type) { ··· 264 265 break; 265 266 266 267 case RECV_WAIT_DATA: 267 - hci_recv_frame(info->rx_skb); 268 + hci_recv_frame(info->hdev, info->rx_skb); 268 269 info->rx_skb = NULL; 269 270 break; 270 271
+1 -3
drivers/bluetooth/btwilink.c
··· 108 108 return -EFAULT; 109 109 } 110 110 111 - skb->dev = (void *) lhst->hdev; 112 - 113 111 /* Forward skb to HCI core layer */ 114 - err = hci_recv_frame(skb); 112 + err = hci_recv_frame(lhst->hdev, skb); 115 113 if (err < 0) { 116 114 BT_ERR("Unable to push skb to HCI core(%d)", err); 117 115 return err;
+1 -2
drivers/bluetooth/dtl1_cs.c
··· 256 256 case 0x83: 257 257 case 0x84: 258 258 /* send frame to the HCI layer */ 259 - info->rx_skb->dev = (void *) info->hdev; 260 259 bt_cb(info->rx_skb)->pkt_type &= 0x0f; 261 - hci_recv_frame(info->rx_skb); 260 + hci_recv_frame(info->hdev, info->rx_skb); 262 261 break; 263 262 default: 264 263 /* unknown packet */
+2 -3
drivers/bluetooth/hci_bcsp.c
··· 522 522 memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE); 523 523 bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT; 524 524 525 - hci_recv_frame(bcsp->rx_skb); 525 + hci_recv_frame(hu->hdev, bcsp->rx_skb); 526 526 } else { 527 527 BT_ERR ("Packet for unknown channel (%u %s)", 528 528 bcsp->rx_skb->data[1] & 0x0f, ··· 536 536 /* Pull out BCSP hdr */ 537 537 skb_pull(bcsp->rx_skb, 4); 538 538 539 - hci_recv_frame(bcsp->rx_skb); 539 + hci_recv_frame(hu->hdev, bcsp->rx_skb); 540 540 } 541 541 542 542 bcsp->rx_state = BCSP_W4_PKT_DELIMITER; ··· 655 655 bcsp->rx_count = 0; 656 656 return 0; 657 657 } 658 - bcsp->rx_skb->dev = (void *) hu->hdev; 659 658 break; 660 659 } 661 660 break;
+1 -1
drivers/bluetooth/hci_h5.c
··· 340 340 /* Remove Three-wire header */ 341 341 skb_pull(h5->rx_skb, 4); 342 342 343 - hci_recv_frame(h5->rx_skb); 343 + hci_recv_frame(hu->hdev, h5->rx_skb); 344 344 h5->rx_skb = NULL; 345 345 346 346 break;
+6 -7
drivers/bluetooth/hci_ll.c
··· 346 346 return 0; 347 347 } 348 348 349 - static inline int ll_check_data_len(struct ll_struct *ll, int len) 349 + static inline int ll_check_data_len(struct hci_dev *hdev, struct ll_struct *ll, int len) 350 350 { 351 351 int room = skb_tailroom(ll->rx_skb); 352 352 353 353 BT_DBG("len %d room %d", len, room); 354 354 355 355 if (!len) { 356 - hci_recv_frame(ll->rx_skb); 356 + hci_recv_frame(hdev, ll->rx_skb); 357 357 } else if (len > room) { 358 358 BT_ERR("Data length is too large"); 359 359 kfree_skb(ll->rx_skb); ··· 395 395 switch (ll->rx_state) { 396 396 case HCILL_W4_DATA: 397 397 BT_DBG("Complete data"); 398 - hci_recv_frame(ll->rx_skb); 398 + hci_recv_frame(hu->hdev, ll->rx_skb); 399 399 400 400 ll->rx_state = HCILL_W4_PACKET_TYPE; 401 401 ll->rx_skb = NULL; ··· 406 406 407 407 BT_DBG("Event header: evt 0x%2.2x plen %d", eh->evt, eh->plen); 408 408 409 - ll_check_data_len(ll, eh->plen); 409 + ll_check_data_len(hu->hdev, ll, eh->plen); 410 410 continue; 411 411 412 412 case HCILL_W4_ACL_HDR: ··· 415 415 416 416 BT_DBG("ACL header: dlen %d", dlen); 417 417 418 - ll_check_data_len(ll, dlen); 418 + ll_check_data_len(hu->hdev, ll, dlen); 419 419 continue; 420 420 421 421 case HCILL_W4_SCO_HDR: ··· 423 423 424 424 BT_DBG("SCO header: dlen %d", sh->dlen); 425 425 426 - ll_check_data_len(ll, sh->dlen); 426 + ll_check_data_len(hu->hdev, ll, sh->dlen); 427 427 continue; 428 428 } 429 429 } ··· 494 494 return -ENOMEM; 495 495 } 496 496 497 - ll->rx_skb->dev = (void *) hu->hdev; 498 497 bt_cb(ll->rx_skb)->pkt_type = type; 499 498 } 500 499
+1 -2
drivers/bluetooth/hci_vhci.c
··· 179 179 return -ENODEV; 180 180 } 181 181 182 - skb->dev = (void *) data->hdev; 183 182 bt_cb(skb)->pkt_type = pkt_type; 184 183 185 - ret = hci_recv_frame(skb); 184 + ret = hci_recv_frame(data->hdev, skb); 186 185 break; 187 186 188 187 case HCI_VENDOR_PKT:
+1 -1
include/net/bluetooth/hci_core.h
··· 755 755 756 756 void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); 757 757 758 - int hci_recv_frame(struct sk_buff *skb); 758 + int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb); 759 759 int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count); 760 760 int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count); 761 761
+2 -4
net/bluetooth/hci_core.c
··· 2485 2485 EXPORT_SYMBOL(hci_resume_dev); 2486 2486 2487 2487 /* Receive frame from HCI drivers */ 2488 - int hci_recv_frame(struct sk_buff *skb) 2488 + int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb) 2489 2489 { 2490 - struct hci_dev *hdev = (struct hci_dev *) skb->dev; 2491 2490 if (!hdev || (!test_bit(HCI_UP, &hdev->flags) 2492 2491 && !test_bit(HCI_INIT, &hdev->flags))) { 2493 2492 kfree_skb(skb); ··· 2545 2546 scb->expect = hlen; 2546 2547 scb->pkt_type = type; 2547 2548 2548 - skb->dev = (void *) hdev; 2549 2549 hdev->reassembly[index] = skb; 2550 2550 } 2551 2551 ··· 2604 2606 /* Complete frame */ 2605 2607 2606 2608 bt_cb(skb)->pkt_type = type; 2607 - hci_recv_frame(skb); 2609 + hci_recv_frame(hdev, skb); 2608 2610 2609 2611 hdev->reassembly[index] = NULL; 2610 2612 return remain;