diff options
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/ntb_netdev.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index f3cdf64997d6..63aa9d9e34c5 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c | |||
| @@ -78,11 +78,19 @@ static void ntb_netdev_event_handler(void *data, int status) | |||
| 78 | netdev_dbg(ndev, "Event %x, Link %x\n", status, | 78 | netdev_dbg(ndev, "Event %x, Link %x\n", status, |
| 79 | ntb_transport_link_query(dev->qp)); | 79 | ntb_transport_link_query(dev->qp)); |
| 80 | 80 | ||
| 81 | /* Currently, only link status event is supported */ | 81 | switch (status) { |
| 82 | if (status) | 82 | case NTB_LINK_DOWN: |
| 83 | netif_carrier_on(ndev); | ||
| 84 | else | ||
| 85 | netif_carrier_off(ndev); | 83 | netif_carrier_off(ndev); |
| 84 | break; | ||
| 85 | case NTB_LINK_UP: | ||
| 86 | if (!ntb_transport_link_query(dev->qp)) | ||
| 87 | return; | ||
| 88 | |||
| 89 | netif_carrier_on(ndev); | ||
| 90 | break; | ||
| 91 | default: | ||
| 92 | netdev_warn(ndev, "Unsupported event type %d\n", status); | ||
| 93 | } | ||
| 86 | } | 94 | } |
| 87 | 95 | ||
| 88 | static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data, | 96 | static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data, |
| @@ -182,8 +190,10 @@ static int ntb_netdev_open(struct net_device *ndev) | |||
| 182 | 190 | ||
| 183 | rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data, | 191 | rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data, |
| 184 | ndev->mtu + ETH_HLEN); | 192 | ndev->mtu + ETH_HLEN); |
| 185 | if (rc == -EINVAL) | 193 | if (rc == -EINVAL) { |
| 194 | dev_kfree_skb(skb); | ||
| 186 | goto err; | 195 | goto err; |
| 196 | } | ||
| 187 | } | 197 | } |
| 188 | 198 | ||
| 189 | netif_carrier_off(ndev); | 199 | netif_carrier_off(ndev); |
| @@ -367,12 +377,15 @@ static void ntb_netdev_remove(struct pci_dev *pdev) | |||
| 367 | { | 377 | { |
| 368 | struct net_device *ndev; | 378 | struct net_device *ndev; |
| 369 | struct ntb_netdev *dev; | 379 | struct ntb_netdev *dev; |
| 380 | bool found = false; | ||
| 370 | 381 | ||
| 371 | list_for_each_entry(dev, &dev_list, list) { | 382 | list_for_each_entry(dev, &dev_list, list) { |
| 372 | if (dev->pdev == pdev) | 383 | if (dev->pdev == pdev) { |
| 384 | found = true; | ||
| 373 | break; | 385 | break; |
| 386 | } | ||
| 374 | } | 387 | } |
| 375 | if (dev == NULL) | 388 | if (!found) |
| 376 | return; | 389 | return; |
| 377 | 390 | ||
| 378 | list_del(&dev->list); | 391 | list_del(&dev->list); |
