]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
netxen: fix ip addr hashing after firmware reset
authorAmit Kumar Salecha <amit@netxen.com>
Sat, 5 Sep 2009 17:43:09 +0000 (17:43 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Sep 2009 08:53:09 +0000 (01:53 -0700)
Reprogram local IP addresses after firmware is reset
or after resuming from suspend.

Signed-off-by: Amit Kumar Salecha <amit@netxen.com>
Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/netxen/netxen_nic_main.c

index 498943601379370ac6df788149a03dc1ad040114..7038e1baaf4f22676f3bfa534e9d7335fd0f0aa4 100644 (file)
@@ -86,6 +86,8 @@ static irqreturn_t netxen_intr(int irq, void *data);
 static irqreturn_t netxen_msi_intr(int irq, void *data);
 static irqreturn_t netxen_msix_intr(int irq, void *data);
 
+static void netxen_config_indev_addr(struct net_device *dev, unsigned long);
+
 /*  PCI Device ID Table  */
 #define ENTRY(device) \
        {PCI_DEVICE(PCI_VENDOR_ID_NETXEN, (device)), \
@@ -1411,6 +1413,8 @@ netxen_nic_resume(struct pci_dev *pdev)
                        goto err_out_detach;
 
                netif_device_attach(netdev);
+
+               netxen_config_indev_addr(netdev, NETDEV_UP);
        }
 
        netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
@@ -2057,6 +2061,7 @@ netxen_attach_work(struct work_struct *work)
                        goto done;
                }
 
+               netxen_config_indev_addr(netdev, NETDEV_UP);
        }
 
        netif_device_attach(netdev);
@@ -2282,12 +2287,43 @@ netxen_destip_supported(struct netxen_adapter *adapter)
        return 1;
 }
 
+static void
+netxen_config_indev_addr(struct net_device *dev, unsigned long event)
+{
+       struct in_device *indev;
+       struct netxen_adapter *adapter = netdev_priv(dev);
+
+       if (netxen_destip_supported(adapter))
+               return;
+
+       indev = in_dev_get(dev);
+       if (!indev)
+               return;
+
+       for_ifa(indev) {
+               switch (event) {
+               case NETDEV_UP:
+                       netxen_config_ipaddr(adapter,
+                                       ifa->ifa_address, NX_IP_UP);
+                       break;
+               case NETDEV_DOWN:
+                       netxen_config_ipaddr(adapter,
+                                       ifa->ifa_address, NX_IP_DOWN);
+                       break;
+               default:
+                       break;
+               }
+       } endfor_ifa(indev);
+
+       in_dev_put(indev);
+       return;
+}
+
 static int netxen_netdev_event(struct notifier_block *this,
                                 unsigned long event, void *ptr)
 {
        struct netxen_adapter *adapter;
        struct net_device *dev = (struct net_device *)ptr;
-       struct in_device *indev;
 
 recheck:
        if (dev == NULL)
@@ -2303,32 +2339,13 @@ recheck:
 
        adapter = netdev_priv(dev);
 
-       if (!adapter || !netxen_destip_supported(adapter))
+       if (!adapter)
                goto done;
 
        if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
                goto done;
 
-       indev = in_dev_get(dev);
-       if (!indev)
-               goto done;
-
-       for_ifa(indev) {
-               switch (event) {
-               case NETDEV_UP:
-                       netxen_config_ipaddr(adapter,
-                                       ifa->ifa_address, NX_IP_UP);
-                       break;
-               case NETDEV_DOWN:
-                       netxen_config_ipaddr(adapter,
-                                       ifa->ifa_address, NX_IP_DOWN);
-                       break;
-               default:
-                       break;
-               }
-       } endfor_ifa(indev);
-
-       in_dev_put(indev);
+       netxen_config_indev_addr(dev, event);
 done:
        return NOTIFY_DONE;
 }