diff options
Diffstat (limited to 'drivers/net/ntb_netdev.c')
| -rw-r--r-- | drivers/net/ntb_netdev.c | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 4e52fd2b822..5a7e6397440 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -51,7 +51,7 @@ #include <linux/pci.h> #include <linux/ntb.h> -#define NTB_NETDEV_VER "0.6" +#define NTB_NETDEV_VER "0.7" MODULE_DESCRIPTION(KBUILD_MODNAME); MODULE_VERSION(NTB_NETDEV_VER); @@ -78,11 +78,19 @@ static void ntb_netdev_event_handler(void *data, int status) netdev_dbg(ndev, "Event %x, Link %x\n", status, ntb_transport_link_query(dev->qp)); - /* Currently, only link status event is supported */ - if (status) - netif_carrier_on(ndev); - else + switch (status) { + case NTB_LINK_DOWN: netif_carrier_off(ndev); + break; + case NTB_LINK_UP: + if (!ntb_transport_link_query(dev->qp)) + return; + + netif_carrier_on(ndev); + break; + default: + netdev_warn(ndev, "Unsupported event type %d\n", status); + } } static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data, @@ -119,6 +127,7 @@ static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data, rc = ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); if (rc) { + dev_kfree_skb(skb); ndev->stats.rx_errors++; ndev->stats.rx_fifo_errors++; } @@ -143,9 +152,6 @@ static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_data, } dev_kfree_skb(skb); - - if (netif_queue_stopped(ndev)) - netif_wake_queue(ndev); } static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb, @@ -154,7 +160,7 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb, struct ntb_netdev *dev = netdev_priv(ndev); int rc; - netdev_dbg(ndev, "ntb_transport_tx_enqueue\n"); + netdev_dbg(ndev, "%s: skb len %d\n", __func__, skb->len); rc = ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len); if (rc) @@ -165,7 +171,6 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb, err: ndev->stats.tx_dropped++; ndev->stats.tx_errors++; - netif_stop_queue(ndev); return NETDEV_TX_BUSY; } @@ -185,8 +190,10 @@ static int ntb_netdev_open(struct net_device *ndev) rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data, ndev->mtu + ETH_HLEN); - if (rc == -EINVAL) + if (rc == -EINVAL) { + dev_kfree_skb(skb); goto err; + } } netif_carrier_off(ndev); @@ -269,18 +276,11 @@ err: return rc; } -static void ntb_netdev_tx_timeout(struct net_device *ndev) -{ - if (netif_running(ndev)) - netif_wake_queue(ndev); -} - static const struct net_device_ops ntb_netdev_ops = { .ndo_open = ntb_netdev_open, .ndo_stop = ntb_netdev_close, .ndo_start_xmit = ntb_netdev_start_xmit, .ndo_change_mtu = ntb_netdev_change_mtu, - .ndo_tx_timeout = ntb_netdev_tx_timeout, .ndo_set_mac_address = eth_mac_addr, }; @@ -298,7 +298,6 @@ static int ntb_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { cmd->supported = SUPPORTED_Backplane; cmd->advertising = ADVERTISED_Backplane; - cmd->speed = SPEED_UNKNOWN; ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN); cmd->duplex = DUPLEX_FULL; cmd->port = PORT_OTHER; @@ -348,7 +347,7 @@ static int ntb_netdev_probe(struct pci_dev *pdev) memcpy(ndev->dev_addr, ndev->perm_addr, ndev->addr_len); ndev->netdev_ops = &ntb_netdev_ops; - SET_ETHTOOL_OPS(ndev, &ntb_ethtool_ops); + ndev->ethtool_ops = &ntb_ethtool_ops; dev->qp = ntb_transport_create_queue(ndev, pdev, &ntb_netdev_handlers); if (!dev->qp) { @@ -363,7 +362,7 @@ static int ntb_netdev_probe(struct pci_dev *pdev) goto err1; list_add(&dev->list, &dev_list); - pr_info("%s: %s created\n", KBUILD_MODNAME, ndev->name); + dev_info(&pdev->dev, "%s created\n", ndev->name); return 0; err1: @@ -373,18 +372,23 @@ err: return rc; } -static void __exit ntb_netdev_remove(struct pci_dev *pdev) +static void ntb_netdev_remove(struct pci_dev *pdev) { struct net_device *ndev; struct ntb_netdev *dev; + bool found = false; list_for_each_entry(dev, &dev_list, list) { - if (dev->pdev == pdev) + if (dev->pdev == pdev) { + found = true; break; + } } - if (dev == NULL) + if (!found) return; + list_del(&dev->list); + ndev = dev->ndev; unregister_netdev(ndev); @@ -414,6 +418,5 @@ static void __exit ntb_netdev_exit_module(void) { ntb_unregister_client(&ntb_netdev_client); ntb_unregister_client_dev(KBUILD_MODNAME); - pr_info("%s: Driver removed\n", KBUILD_MODNAME); } module_exit(ntb_netdev_exit_module); |
