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

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
...@@ -587,5 +587,8 @@ int i40iw_inet6addr_event(struct notifier_block *notifier, ...@@ -587,5 +587,8 @@ int i40iw_inet6addr_event(struct notifier_block *notifier,
int i40iw_net_event(struct notifier_block *notifier, int i40iw_net_event(struct notifier_block *notifier,
unsigned long event, unsigned long event,
void *ptr); void *ptr);
int i40iw_netdevice_event(struct notifier_block *notifier,
unsigned long event,
void *ptr);
#endif #endif
...@@ -99,6 +99,10 @@ static struct notifier_block i40iw_net_notifier = { ...@@ -99,6 +99,10 @@ static struct notifier_block i40iw_net_notifier = {
.notifier_call = i40iw_net_event .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 * i40iw_find_i40e_handler - find a handler given a client info
* @ldev: pointer to a client info * @ldev: pointer to a client info
...@@ -1394,6 +1398,7 @@ static void i40iw_register_notifiers(void) ...@@ -1394,6 +1398,7 @@ static void i40iw_register_notifiers(void)
register_inetaddr_notifier(&i40iw_inetaddr_notifier); register_inetaddr_notifier(&i40iw_inetaddr_notifier);
register_inet6addr_notifier(&i40iw_inetaddr6_notifier); register_inet6addr_notifier(&i40iw_inetaddr6_notifier);
register_netevent_notifier(&i40iw_net_notifier); register_netevent_notifier(&i40iw_net_notifier);
register_netdevice_notifier(&i40iw_netdevice_notifier);
} }
/** /**
...@@ -1405,6 +1410,7 @@ static void i40iw_unregister_notifiers(void) ...@@ -1405,6 +1410,7 @@ static void i40iw_unregister_notifiers(void)
unregister_netevent_notifier(&i40iw_net_notifier); unregister_netevent_notifier(&i40iw_net_notifier);
unregister_inetaddr_notifier(&i40iw_inetaddr_notifier); unregister_inetaddr_notifier(&i40iw_inetaddr_notifier);
unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier); unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier);
unregister_netdevice_notifier(&i40iw_netdevice_notifier);
} }
/** /**
......
...@@ -137,7 +137,7 @@ inline u32 i40iw_rd32(struct i40iw_hw *hw, u32 reg) ...@@ -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 * @notfier: not used
* @event: event for notifier * @event: event for notifier
* @ptr: if address * @ptr: if address
...@@ -200,7 +200,7 @@ int i40iw_inetaddr_event(struct notifier_block *notifier, ...@@ -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 * @notfier: not used
* @event: event for notifier * @event: event for notifier
* @ptr: if address * @ptr: if address
...@@ -252,7 +252,7 @@ int i40iw_inet6addr_event(struct notifier_block *notifier, ...@@ -252,7 +252,7 @@ int i40iw_inet6addr_event(struct notifier_block *notifier,
} }
/** /**
* i40iw_net_event - system notifier for net events * i40iw_net_event - system notifier for netevents
* @notfier: not used * @notfier: not used
* @event: event for notifier * @event: event for notifier
* @ptr: neighbor * @ptr: neighbor
...@@ -296,6 +296,50 @@ int i40iw_net_event(struct notifier_block *notifier, unsigned long event, void * ...@@ -296,6 +296,50 @@ int i40iw_net_event(struct notifier_block *notifier, unsigned long event, void *
return NOTIFY_DONE; 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 * i40iw_get_cqp_request - get cqp struct
* @cqp: device cqp ptr * @cqp: device cqp ptr
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment