RDMA/nes: Fix bonding on iw_nes

Enable configuring bonds on nes devices by adding missing support for
master net_device to the driver.

Signed-off-by: Maciej Sosnowski <maciej.sosnowski@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by Maciej Sosnowski and committed by Roland Dreier 2a4c97ea 4162cf64

+26 -6
+19 -5
drivers/infiniband/hw/nes/nes.c
··· 144 144 struct nes_device *nesdev; 145 145 struct net_device *netdev; 146 146 struct nes_vnic *nesvnic; 147 + unsigned int is_bonded; 147 148 148 149 nes_debug(NES_DBG_NETDEV, "nes_inetaddr_event: ip address %pI4, netmask %pI4.\n", 149 150 &ifa->ifa_address, &ifa->ifa_mask); ··· 153 152 nesdev, nesdev->netdev[0]->name); 154 153 netdev = nesdev->netdev[0]; 155 154 nesvnic = netdev_priv(netdev); 156 - if (netdev == event_netdev) { 155 + is_bonded = (netdev->master == event_netdev); 156 + if ((netdev == event_netdev) || is_bonded) { 157 157 if (nesvnic->rdma_enabled == 0) { 158 158 nes_debug(NES_DBG_NETDEV, "Returning without processing event for %s since" 159 159 " RDMA is not enabled.\n", ··· 171 169 nes_manage_arp_cache(netdev, netdev->dev_addr, 172 170 ntohl(nesvnic->local_ipaddr), NES_ARP_DELETE); 173 171 nesvnic->local_ipaddr = 0; 174 - return NOTIFY_OK; 172 + if (is_bonded) 173 + continue; 174 + else 175 + return NOTIFY_OK; 175 176 break; 176 177 case NETDEV_UP: 177 178 nes_debug(NES_DBG_NETDEV, "event:UP\n"); ··· 183 178 nes_debug(NES_DBG_NETDEV, "Interface already has local_ipaddr\n"); 184 179 return NOTIFY_OK; 185 180 } 181 + /* fall through */ 182 + case NETDEV_CHANGEADDR: 186 183 /* Add the address to the IP table */ 187 - nesvnic->local_ipaddr = ifa->ifa_address; 184 + if (netdev->master) 185 + nesvnic->local_ipaddr = 186 + ((struct in_device *)netdev->master->ip_ptr)->ifa_list->ifa_address; 187 + else 188 + nesvnic->local_ipaddr = ifa->ifa_address; 188 189 189 190 nes_write_indexed(nesdev, 190 191 NES_IDX_DST_IP_ADDR+(0x10*PCI_FUNC(nesdev->pcidev->devfn)), 191 - ntohl(ifa->ifa_address)); 192 + ntohl(nesvnic->local_ipaddr)); 192 193 nes_manage_arp_cache(netdev, netdev->dev_addr, 193 194 ntohl(nesvnic->local_ipaddr), NES_ARP_ADD); 194 - return NOTIFY_OK; 195 + if (is_bonded) 196 + continue; 197 + else 198 + return NOTIFY_OK; 195 199 break; 196 200 default: 197 201 break;
+7 -1
drivers/infiniband/hw/nes/nes_cm.c
··· 1107 1107 struct flowi fl; 1108 1108 struct neighbour *neigh; 1109 1109 int rc = arpindex; 1110 + struct net_device *netdev; 1110 1111 struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; 1111 1112 1112 1113 memset(&fl, 0, sizeof fl); ··· 1118 1117 return rc; 1119 1118 } 1120 1119 1121 - neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, nesvnic->netdev); 1120 + if (nesvnic->netdev->master) 1121 + netdev = nesvnic->netdev->master; 1122 + else 1123 + netdev = nesvnic->netdev; 1124 + 1125 + neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, netdev); 1122 1126 if (neigh) { 1123 1127 if (neigh->nud_state & NUD_VALID) { 1124 1128 nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X"