.. | .. |
---|
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 | |
---|