Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c5d5155 authored by Shiraz Saleem's avatar Shiraz Saleem Committed by Jason Gunthorpe
Browse files

i40iw: Add notifier for network device events



Register a netdevice notifier for netdev UP/DOWN
notification events and report the appropriate ib event.

Signed-off-by: default avatarShiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent fe99afd1
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -587,5 +587,8 @@ int i40iw_inet6addr_event(struct notifier_block *notifier,
int i40iw_net_event(struct notifier_block *notifier,
		    unsigned long event,
		    void *ptr);
int i40iw_netdevice_event(struct notifier_block *notifier,
			  unsigned long event,
			  void *ptr);

#endif
+6 −0
Original line number Diff line number Diff line
@@ -99,6 +99,10 @@ static struct notifier_block i40iw_net_notifier = {
	.notifier_call = i40iw_net_event
};

static struct notifier_block i40iw_netdevice_notifier = {
	.notifier_call = i40iw_netdevice_event
};

/**
 * i40iw_find_i40e_handler - find a handler given a client info
 * @ldev: pointer to a client info
@@ -1394,6 +1398,7 @@ static void i40iw_register_notifiers(void)
	register_inetaddr_notifier(&i40iw_inetaddr_notifier);
	register_inet6addr_notifier(&i40iw_inetaddr6_notifier);
	register_netevent_notifier(&i40iw_net_notifier);
	register_netdevice_notifier(&i40iw_netdevice_notifier);
}

/**
@@ -1405,6 +1410,7 @@ static void i40iw_unregister_notifiers(void)
	unregister_netevent_notifier(&i40iw_net_notifier);
	unregister_inetaddr_notifier(&i40iw_inetaddr_notifier);
	unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier);
	unregister_netdevice_notifier(&i40iw_netdevice_notifier);
}

/**
+47 −3
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ inline u32 i40iw_rd32(struct i40iw_hw *hw, u32 reg)
}

/**
 * i40iw_inetaddr_event - system notifier for netdev events
 * i40iw_inetaddr_event - system notifier for ipv4 addr events
 * @notfier: not used
 * @event: event for notifier
 * @ptr: if address
@@ -200,7 +200,7 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
}

/**
 * i40iw_inet6addr_event - system notifier for ipv6 netdev events
 * i40iw_inet6addr_event - system notifier for ipv6 addr events
 * @notfier: not used
 * @event: event for notifier
 * @ptr: if address
@@ -296,6 +296,50 @@ int i40iw_net_event(struct notifier_block *notifier, unsigned long event, void *
	return NOTIFY_DONE;
}

/**
 * i40iw_netdevice_event - system notifier for netdev events
 * @notfier: not used
 * @event: event for notifier
 * @ptr: netdev
 */
int i40iw_netdevice_event(struct notifier_block *notifier,
			  unsigned long event,
			  void *ptr)
{
	struct net_device *event_netdev;
	struct net_device *netdev;
	struct i40iw_device *iwdev;
	struct i40iw_handler *hdl;

	event_netdev = netdev_notifier_info_to_dev(ptr);

	hdl = i40iw_find_netdev(event_netdev);
	if (!hdl)
		return NOTIFY_DONE;

	iwdev = &hdl->device;
	if (iwdev->init_state < RDMA_DEV_REGISTERED || iwdev->closing)
		return NOTIFY_DONE;

	netdev = iwdev->ldev->netdev;
	if (netdev != event_netdev)
		return NOTIFY_DONE;

	iwdev->iw_status = 1;

	switch (event) {
	case NETDEV_DOWN:
		iwdev->iw_status = 0;
		/* Fall through */
	case NETDEV_UP:
		i40iw_port_ibevent(iwdev);
		break;
	default:
		break;
	}
	return NOTIFY_DONE;
}

/**
 * i40iw_get_cqp_request - get cqp struct
 * @cqp: device cqp ptr