]> Pileus Git - ~andy/linux/blobdiff - drivers/infiniband/hw/nes/nes.c
RDMA/nes: Fix bonding on iw_nes
[~andy/linux] / drivers / infiniband / hw / nes / nes.c
index de7b9d7166f3a8226ef920f9c308cf1295332f00..e17f52c21947d67d37356126f69de7348695ec46 100644 (file)
@@ -110,8 +110,8 @@ static unsigned int sysfs_nonidx_addr;
 static unsigned int sysfs_idx_addr;
 
 static struct pci_device_id nes_pci_table[] = {
-       {PCI_VENDOR_ID_NETEFFECT, PCI_DEVICE_ID_NETEFFECT_NE020, PCI_ANY_ID, PCI_ANY_ID},
-       {PCI_VENDOR_ID_NETEFFECT, PCI_DEVICE_ID_NETEFFECT_NE020_KR, PCI_ANY_ID, PCI_ANY_ID},
+       { PCI_VDEVICE(NETEFFECT, PCI_DEVICE_ID_NETEFFECT_NE020), },
+       { PCI_VDEVICE(NETEFFECT, PCI_DEVICE_ID_NETEFFECT_NE020_KR), },
        {0}
 };
 
@@ -144,6 +144,7 @@ static int nes_inetaddr_event(struct notifier_block *notifier,
        struct nes_device *nesdev;
        struct net_device *netdev;
        struct nes_vnic *nesvnic;
+       unsigned int is_bonded;
 
        nes_debug(NES_DBG_NETDEV, "nes_inetaddr_event: ip address %pI4, netmask %pI4.\n",
                  &ifa->ifa_address, &ifa->ifa_mask);
@@ -152,7 +153,8 @@ static int nes_inetaddr_event(struct notifier_block *notifier,
                                nesdev, nesdev->netdev[0]->name);
                netdev = nesdev->netdev[0];
                nesvnic = netdev_priv(netdev);
-               if (netdev == event_netdev) {
+               is_bonded = (netdev->master == event_netdev);
+               if ((netdev == event_netdev) || is_bonded) {
                        if (nesvnic->rdma_enabled == 0) {
                                nes_debug(NES_DBG_NETDEV, "Returning without processing event for %s since"
                                                " RDMA is not enabled.\n",
@@ -169,7 +171,10 @@ static int nes_inetaddr_event(struct notifier_block *notifier,
                                        nes_manage_arp_cache(netdev, netdev->dev_addr,
                                                        ntohl(nesvnic->local_ipaddr), NES_ARP_DELETE);
                                        nesvnic->local_ipaddr = 0;
-                                       return NOTIFY_OK;
+                                       if (is_bonded)
+                                               continue;
+                                       else
+                                               return NOTIFY_OK;
                                        break;
                                case NETDEV_UP:
                                        nes_debug(NES_DBG_NETDEV, "event:UP\n");
@@ -178,15 +183,24 @@ static int nes_inetaddr_event(struct notifier_block *notifier,
                                                nes_debug(NES_DBG_NETDEV, "Interface already has local_ipaddr\n");
                                                return NOTIFY_OK;
                                        }
+                                       /* fall through */
+                               case NETDEV_CHANGEADDR:
                                        /* Add the address to the IP table */
-                                       nesvnic->local_ipaddr = ifa->ifa_address;
+                                       if (netdev->master)
+                                               nesvnic->local_ipaddr =
+                                                       ((struct in_device *)netdev->master->ip_ptr)->ifa_list->ifa_address;
+                                       else
+                                               nesvnic->local_ipaddr = ifa->ifa_address;
 
                                        nes_write_indexed(nesdev,
                                                        NES_IDX_DST_IP_ADDR+(0x10*PCI_FUNC(nesdev->pcidev->devfn)),
-                                                       ntohl(ifa->ifa_address));
+                                                       ntohl(nesvnic->local_ipaddr));
                                        nes_manage_arp_cache(netdev, netdev->dev_addr,
                                                        ntohl(nesvnic->local_ipaddr), NES_ARP_ADD);
-                                       return NOTIFY_OK;
+                                       if (is_bonded)
+                                               continue;
+                                       else
+                                               return NOTIFY_OK;
                                        break;
                                default:
                                        break;
@@ -259,13 +273,11 @@ static void nes_cqp_rem_ref_callback(struct nes_device *nesdev, struct nes_cqp_r
        unsigned long flags;
        struct nes_qp *nesqp = cqp_request->cqp_callback_pointer;
        struct nes_adapter *nesadapter = nesdev->nesadapter;
-       u32 qp_id;
 
        atomic_inc(&qps_destroyed);
 
        /* Free the control structures */
 
-       qp_id = nesqp->hwqp.qp_id;
        if (nesqp->pbl_vbase) {
                pci_free_consistent(nesdev->pcidev, nesqp->qp_mem_size,
                                nesqp->hwqp.q2_vbase, nesqp->hwqp.q2_pbase);
@@ -441,7 +453,6 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
        struct net_device *netdev = NULL;
        struct nes_device *nesdev = NULL;
        int ret = 0;
-       struct nes_vnic *nesvnic = NULL;
        void __iomem *mmio_regs = NULL;
        u8 hw_rev;
 
@@ -664,25 +675,21 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
        nes_notifiers_registered++;
 
        /* Initialize network devices */
-               if ((netdev = nes_netdev_init(nesdev, mmio_regs)) == NULL) {
-                       goto bail7;
-               }
+       if ((netdev = nes_netdev_init(nesdev, mmio_regs)) == NULL)
+               goto bail7;
 
-               /* Register network device */
-               ret = register_netdev(netdev);
-               if (ret) {
-                       printk(KERN_ERR PFX "Unable to register netdev, ret = %d\n", ret);
-                       nes_netdev_destroy(netdev);
-                       goto bail7;
-               }
-
-               nes_print_macaddr(netdev);
-               /* create a CM core for this netdev */
-               nesvnic = netdev_priv(netdev);
+       /* Register network device */
+       ret = register_netdev(netdev);
+       if (ret) {
+               printk(KERN_ERR PFX "Unable to register netdev, ret = %d\n", ret);
+               nes_netdev_destroy(netdev);
+               goto bail7;
+       }
 
-               nesdev->netdev_count++;
-               nesdev->nesadapter->netdev_count++;
+       nes_print_macaddr(netdev);
 
+       nesdev->netdev_count++;
+       nesdev->nesadapter->netdev_count++;
 
        printk(KERN_ERR PFX "%s: NetEffect RNIC driver successfully loaded.\n",
                        pci_name(pcidev));
@@ -1104,7 +1111,7 @@ static ssize_t nes_show_wqm_quanta(struct device_driver *ddp, char *buf)
                i++;
        }
 
-       return  snprintf(buf, PAGE_SIZE, "0x%X\n", wqm_quanta);
+       return  snprintf(buf, PAGE_SIZE, "0x%X\n", wqm_quanta_value);
 }