aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSelvin Xavier <selvin.xavier@emulex.com>2014-06-10 10:02:25 -0400
committerRoland Dreier <roland@purestorage.com>2014-08-01 18:07:49 -0400
commitb8806324ea0b242bcf0cf5740f2ceb1e56381c36 (patch)
treec8d0af3070bdae5a365a3791a702750dbcde4bc1
parent4f1df8440d26bafe0be6ef4dbf17162a1263d3fc (diff)
RDMA/ocrdma: Initialize the GID table while registering the device
Current GID table gets updated only at the time of inet notification. Fix this by initializing the table at the time of device registration. Signed-off-by: Selvin Xavier <selvin.xavier@emulex.com> Signed-off-by: Devesh Sharma <devesh.sharma@emulex.com> Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_main.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniband/hw/ocrdma/ocrdma_main.c
index 0d90c7f75a6f..256a06bc0b68 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c
@@ -388,6 +388,58 @@ static void ocrdma_remove_sysfiles(struct ocrdma_dev *dev)
388 device_remove_file(&dev->ibdev.dev, ocrdma_attributes[i]); 388 device_remove_file(&dev->ibdev.dev, ocrdma_attributes[i]);
389} 389}
390 390
391static void ocrdma_init_ipv4_gids(struct ocrdma_dev *dev,
392 struct net_device *net)
393{
394 struct in_device *in_dev;
395 union ib_gid gid;
396 in_dev = in_dev_get(net);
397 if (in_dev) {
398 for_ifa(in_dev) {
399 ipv6_addr_set_v4mapped(ifa->ifa_address,
400 (struct in6_addr *)&gid);
401 ocrdma_add_sgid(dev, &gid);
402 }
403 endfor_ifa(in_dev);
404 in_dev_put(in_dev);
405 }
406}
407
408static void ocrdma_init_ipv6_gids(struct ocrdma_dev *dev,
409 struct net_device *net)
410{
411#if IS_ENABLED(CONFIG_IPV6)
412 struct inet6_dev *in6_dev;
413 union ib_gid *pgid;
414 struct inet6_ifaddr *ifp;
415 in6_dev = in6_dev_get(net);
416 if (in6_dev) {
417 read_lock_bh(&in6_dev->lock);
418 list_for_each_entry(ifp, &in6_dev->addr_list, if_list) {
419 pgid = (union ib_gid *)&ifp->addr;
420 ocrdma_add_sgid(dev, pgid);
421 }
422 read_unlock_bh(&in6_dev->lock);
423 in6_dev_put(in6_dev);
424 }
425#endif
426}
427
428static void ocrdma_init_gid_table(struct ocrdma_dev *dev)
429{
430 struct net_device *net_dev;
431
432 for_each_netdev(&init_net, net_dev) {
433 struct net_device *real_dev = rdma_vlan_dev_real_dev(net_dev) ?
434 rdma_vlan_dev_real_dev(net_dev) : net_dev;
435
436 if (real_dev == dev->nic_info.netdev) {
437 ocrdma_init_ipv4_gids(dev, net_dev);
438 ocrdma_init_ipv6_gids(dev, net_dev);
439 }
440 }
441}
442
391static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info) 443static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
392{ 444{
393 int status = 0, i; 445 int status = 0, i;
@@ -416,6 +468,7 @@ static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
416 goto alloc_err; 468 goto alloc_err;
417 469
418 ocrdma_init_service_level(dev); 470 ocrdma_init_service_level(dev);
471 ocrdma_init_gid_table(dev);
419 status = ocrdma_register_device(dev); 472 status = ocrdma_register_device(dev);
420 if (status) 473 if (status)
421 goto alloc_err; 474 goto alloc_err;