| .. | .. |
|---|
| 71 | 71 | static unsigned int tx_stop = 5; |
|---|
| 72 | 72 | |
|---|
| 73 | 73 | struct ntb_netdev { |
|---|
| 74 | | - struct list_head list; |
|---|
| 75 | 74 | struct pci_dev *pdev; |
|---|
| 76 | 75 | struct net_device *ndev; |
|---|
| 77 | 76 | struct ntb_transport_qp *qp; |
|---|
| .. | .. |
|---|
| 80 | 79 | |
|---|
| 81 | 80 | #define NTB_TX_TIMEOUT_MS 1000 |
|---|
| 82 | 81 | #define NTB_RXQ_SIZE 100 |
|---|
| 83 | | - |
|---|
| 84 | | -static LIST_HEAD(dev_list); |
|---|
| 85 | 82 | |
|---|
| 86 | 83 | static void ntb_netdev_event_handler(void *data, int link_is_up) |
|---|
| 87 | 84 | { |
|---|
| .. | .. |
|---|
| 140 | 137 | enqueue_again: |
|---|
| 141 | 138 | rc = ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); |
|---|
| 142 | 139 | if (rc) { |
|---|
| 143 | | - dev_kfree_skb(skb); |
|---|
| 140 | + dev_kfree_skb_any(skb); |
|---|
| 144 | 141 | ndev->stats.rx_errors++; |
|---|
| 145 | 142 | ndev->stats.rx_fifo_errors++; |
|---|
| 146 | 143 | } |
|---|
| .. | .. |
|---|
| 195 | 192 | ndev->stats.tx_aborted_errors++; |
|---|
| 196 | 193 | } |
|---|
| 197 | 194 | |
|---|
| 198 | | - dev_kfree_skb(skb); |
|---|
| 195 | + dev_kfree_skb_any(skb); |
|---|
| 199 | 196 | |
|---|
| 200 | 197 | if (ntb_transport_tx_free_entry(dev->qp) >= tx_start) { |
|---|
| 201 | 198 | /* Make sure anybody stopping the queue after this sees the new |
|---|
| .. | .. |
|---|
| 452 | 449 | if (rc) |
|---|
| 453 | 450 | goto err1; |
|---|
| 454 | 451 | |
|---|
| 455 | | - list_add(&dev->list, &dev_list); |
|---|
| 452 | + dev_set_drvdata(client_dev, ndev); |
|---|
| 456 | 453 | dev_info(&pdev->dev, "%s created\n", ndev->name); |
|---|
| 457 | 454 | return 0; |
|---|
| 458 | 455 | |
|---|
| .. | .. |
|---|
| 465 | 462 | |
|---|
| 466 | 463 | static void ntb_netdev_remove(struct device *client_dev) |
|---|
| 467 | 464 | { |
|---|
| 468 | | - struct ntb_dev *ntb; |
|---|
| 469 | | - struct net_device *ndev; |
|---|
| 470 | | - struct pci_dev *pdev; |
|---|
| 471 | | - struct ntb_netdev *dev; |
|---|
| 472 | | - bool found = false; |
|---|
| 473 | | - |
|---|
| 474 | | - ntb = dev_ntb(client_dev->parent); |
|---|
| 475 | | - pdev = ntb->pdev; |
|---|
| 476 | | - |
|---|
| 477 | | - list_for_each_entry(dev, &dev_list, list) { |
|---|
| 478 | | - if (dev->pdev == pdev) { |
|---|
| 479 | | - found = true; |
|---|
| 480 | | - break; |
|---|
| 481 | | - } |
|---|
| 482 | | - } |
|---|
| 483 | | - if (!found) |
|---|
| 484 | | - return; |
|---|
| 485 | | - |
|---|
| 486 | | - list_del(&dev->list); |
|---|
| 487 | | - |
|---|
| 488 | | - ndev = dev->ndev; |
|---|
| 465 | + struct net_device *ndev = dev_get_drvdata(client_dev); |
|---|
| 466 | + struct ntb_netdev *dev = netdev_priv(ndev); |
|---|
| 489 | 467 | |
|---|
| 490 | 468 | unregister_netdev(ndev); |
|---|
| 491 | 469 | ntb_transport_free_queue(dev->qp); |
|---|
| .. | .. |
|---|
| 506 | 484 | rc = ntb_transport_register_client_dev(KBUILD_MODNAME); |
|---|
| 507 | 485 | if (rc) |
|---|
| 508 | 486 | return rc; |
|---|
| 509 | | - return ntb_transport_register_client(&ntb_netdev_client); |
|---|
| 487 | + |
|---|
| 488 | + rc = ntb_transport_register_client(&ntb_netdev_client); |
|---|
| 489 | + if (rc) { |
|---|
| 490 | + ntb_transport_unregister_client_dev(KBUILD_MODNAME); |
|---|
| 491 | + return rc; |
|---|
| 492 | + } |
|---|
| 493 | + |
|---|
| 494 | + return 0; |
|---|
| 510 | 495 | } |
|---|
| 511 | 496 | module_init(ntb_netdev_init_module); |
|---|
| 512 | 497 | |
|---|