Thread (8 messages) 8 messages, 2 authors, 2021-01-26

Re: [PATCH v2] cfg80211: avoid holding the RTNL when calling the driver

From: Johannes Berg <johannes@sipsolutions.net>
Date: 2021-01-20 18:06:24
Also in: netdev

Hi Oliver,


Could you take a look at these bits to see if that's fine with you? I'd
like to merge it through mac80211-next (pending some logistics with a
conflict)
quoted hunk ↗ jump to hunk
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 1447da1d5729..47c4c1182ef1 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1560,6 +1560,8 @@ void usbnet_disconnect (struct usb_interface *intf)
 	struct usbnet		*dev;
 	struct usb_device	*xdev;
 	struct net_device	*net;
+	const struct driver_info *info;
+	void (*unregdev)(struct net_device *);
 
 	dev = usb_get_intfdata(intf);
 	usb_set_intfdata(intf, NULL);
@@ -1574,7 +1576,10 @@ void usbnet_disconnect (struct usb_interface *intf)
 		   dev->driver_info->description);
 
 	net = dev->net;
-	unregister_netdev (net);
+
+	info = dev->driver_info;
+	unregdev = info->unregister_netdev ?: unregister_netdev;
+	unregdev(net);
 
 	cancel_work_sync(&dev->kevent);
 
@@ -1627,6 +1632,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 	int				status;
 	const char			*name;
 	struct usb_driver 	*driver = to_usb_driver(udev->dev.driver);
+	int (*regdev)(struct net_device *);
 
 	/* usbnet already took usb runtime pm, so have to enable the feature
 	 * for usb interface, otherwise usb_autopm_get_interface may return
@@ -1646,6 +1652,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 	xdev = interface_to_usbdev (udev);
 	interface = udev->cur_altsetting;
 
+	regdev = info->register_netdev ?: register_netdev;
+
 	status = -ENOMEM;
 
 	// set up our own records
@@ -1768,7 +1776,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 		}
 	}
 
-	status = register_netdev (net);
+	status = regdev(net);
 	if (status)
 		goto out5;
 	netif_info(dev, probe, dev->net,
[...]
quoted hunk ↗ jump to hunk
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index 9fe77556858e..b646d4295cfd 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -3598,6 +3598,8 @@ static const struct driver_info	bcm4320b_info = {
 	.stop =		rndis_wlan_stop,
 	.early_init =	bcm4320b_early_init,
 	.indication =	rndis_wlan_indication,
+	.register_netdev = cfg80211_register_netdev,
+	.unregister_netdev = cfg80211_unregister_netdev,
 };
 
 static const struct driver_info	bcm4320a_info = {
@@ -3613,6 +3615,8 @@ static const struct driver_info	bcm4320a_info = {
 	.stop =		rndis_wlan_stop,
 	.early_init =	bcm4320a_early_init,
 	.indication =	rndis_wlan_indication,
+	.register_netdev = cfg80211_register_netdev,
+	.unregister_netdev = cfg80211_unregister_netdev,
 };
 
 static const struct driver_info rndis_wlan_info = {
@@ -3628,6 +3632,8 @@ static const struct driver_info rndis_wlan_info = {
 	.stop =		rndis_wlan_stop,
 	.early_init =	unknown_early_init,
 	.indication =	rndis_wlan_indication,
+	.register_netdev = cfg80211_register_netdev,
+	.unregister_netdev = cfg80211_unregister_netdev,
 };
 
 /*-------------------------------------------------------------------------*/
[...]
quoted hunk ↗ jump to hunk
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index 88a7673894d5..11e57803acf9 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -165,6 +165,12 @@ struct driver_info {
 	/* rx mode change (device changes address list filtering) */
 	void	(*set_rx_mode)(struct usbnet *dev);
 
+	/* register netdev - defaults to register_netdev() */
+	int	(*register_netdev)(struct net_device *dev);
+
+	/* unregister netdev - defaults to unregister_netdev() */
+	void	(*unregister_netdev)(struct net_device *dev);
+
 	/* for new devices, use the descriptor-reading code instead */
 	int		in;		/* rx endpoint */
 	int		out;		/* tx endpoint *
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help