Re: [Pv-drivers] [PATCH v2] vmxnet3: set carrier state properly on probe
From: Dmitry Torokhov <hidden>
Date: 2013-01-29 19:54:43
On Tuesday, January 29, 2013 01:36:51 PM Neil Horman wrote:
vmxnet3 fails to set netif_carrier_off on probe, meaning that when an interface is opened the __LINK_STATE_NOCARRIER bit is already cleared, and so /sys/class/net/<ifname>/operstate remains in the unknown state. Correct this by setting netif_carrier_off on probe, like other drivers do. Also, while we're at it, lets remove the netif_carrier_ok checks from the link_state_update function, as that check is atomically contained within the netif_carrier_[on|off] functions anyway Tested successfully by myself Signed-off-by: Neil Horman <nhorman@tuxdriver.com> CC: "David S. Miller" <davem@davemloft.net> CC: "VMware, Inc." <redacted>
Acked-by: Dmitry Torokhov <redacted>
quoted hunk ↗ jump to hunk
CC: Ben Hutchings <redacted> --- Change notes: v2) Moved netif_carrier_off above register_netdev to prevent race with dev_open as per Ben H. --- drivers/net/vmxnet3/vmxnet3_drv.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)diff --git a/drivers/net/vmxnet3/vmxnet3_drv.cb/drivers/net/vmxnet3/vmxnet3_drv.c index b1c90f8..ffb97b2 100644--- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c@@ -150,8 +150,7 @@ vmxnet3_check_link(struct vmxnet3_adapter *adapter, boolaffectTxQueue) if (ret & 1) { /* Link is up. */ netdev_info(adapter->netdev, "NIC Link is Up %d Mbps\n", adapter->link_speed); - if (!netif_carrier_ok(adapter->netdev)) - netif_carrier_on(adapter->netdev); + netif_carrier_on(adapter->netdev); if (affectTxQueue) { for (i = 0; i < adapter->num_tx_queues; i++)@@ -160,8 +159,7 @@ vmxnet3_check_link(struct vmxnet3_adapter *adapter, boolaffectTxQueue) } } else { netdev_info(adapter->netdev, "NIC Link is Down\n"); - if (netif_carrier_ok(adapter->netdev)) - netif_carrier_off(adapter->netdev); + netif_carrier_off(adapter->netdev); if (affectTxQueue) { for (i = 0; i < adapter->num_tx_queues; i++)@@ -3060,6 +3058,7 @@ vmxnet3_probe_device(struct pci_dev *pdev, netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues); netif_set_real_num_rx_queues(adapter->netdev, adapter->num_rx_queues); + netif_carrier_off(netdev); err = register_netdev(netdev); if (err) {