Commit 2fe8ef10 authored by Johannes Berg's avatar Johannes Berg
Browse files

cfg80211: change netdev registration/unregistration semantics

We used to not require anything in terms of registering netdevs
with cfg80211, using a netdev notifier instead. However, in the
next patch reducing RTNL locking, this causes big problems, and
the simplest way is to just require drivers to do things better.

Change the registration/unregistration semantics to require the
drivers to call cfg80211_(un)register_netdevice() when this is
happening due to a cfg80211 request, i.e. add_virtual_intf() or
del_virtual_intf() (or if it somehow has to happen in any other
cfg80211 callback).

Otherwise, in other contexts, drivers may continue to use the
normal netdev (un)registration functions as usual.

Internally, we still use the netdev notifier and track (by the
new wdev->registered bool) if the wdev had already been added
to cfg80211 or not.

Link: https://lore.kernel.org/r/20210122161942.cf2f4b65e4e9.Ida8234e50da13eb675b557bac52a713ad4eddf71@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 347c2989
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -3648,7 +3648,7 @@ void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif)
		kfree(mc_filter);
	}

	unregister_netdevice(vif->ndev);
	cfg80211_unregister_netdevice(vif->ndev);

	ar->num_vif--;
}
@@ -3821,7 +3821,7 @@ struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name,

	netdev_set_default_ethtool_ops(ndev, &ath6kl_ethtool_ops);

	if (register_netdevice(ndev))
	if (cfg80211_register_netdevice(ndev))
		goto err;

	ar->avail_idx_map &= ~BIT(fw_vif_idx);
+2 −2
Original line number Diff line number Diff line
@@ -424,7 +424,7 @@ int wil_vif_add(struct wil6210_priv *wil, struct wil6210_vif *vif)
		if (rc)
			return rc;
	}
	rc = register_netdevice(ndev);
	rc = cfg80211_register_netdevice(ndev);
	if (rc < 0) {
		dev_err(&ndev->dev, "Failed to register netdev: %d\n", rc);
		if (any_active && vif->mid != 0)
@@ -511,7 +511,7 @@ void wil_vif_remove(struct wil6210_priv *wil, u8 mid)
	/* during unregister_netdevice cfg80211_leave may perform operations
	 * such as stop AP, disconnect, so we only clear the VIF afterwards
	 */
	unregister_netdevice(ndev);
	cfg80211_unregister_netdevice(ndev);

	if (any_active && vif->mid != 0)
		wmi_port_delete(wil, vif->mid);
+3 −3
Original line number Diff line number Diff line
@@ -657,7 +657,7 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
	INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);

	if (rtnl_locked)
		err = register_netdevice(ndev);
		err = cfg80211_register_netdevice(ndev);
	else
		err = register_netdev(ndev);
	if (err != 0) {
@@ -681,7 +681,7 @@ void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
{
	if (ndev->reg_state == NETREG_REGISTERED) {
		if (rtnl_locked)
			unregister_netdevice(ndev);
			cfg80211_unregister_netdevice(ndev);
		else
			unregister_netdev(ndev);
	} else {
@@ -758,7 +758,7 @@ int brcmf_net_mon_attach(struct brcmf_if *ifp)
	ndev = ifp->ndev;
	ndev->netdev_ops = &brcmf_netdev_ops_mon;

	err = register_netdevice(ndev);
	err = cfg80211_register_netdevice(ndev);
	if (err)
		bphy_err(drvr, "Failed to register %s device\n", ndev->name);

+2 −2
Original line number Diff line number Diff line
@@ -3081,7 +3081,7 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
	mutex_init(&priv->async_mutex);

	/* Register network device */
	if (register_netdevice(dev)) {
	if (cfg80211_register_netdevice(dev)) {
		mwifiex_dbg(adapter, ERROR, "cannot register network device\n");
		ret = -EFAULT;
		goto err_reg_netdev;
@@ -3160,7 +3160,7 @@ int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
		netif_carrier_off(priv->netdev);

	if (wdev->netdev->reg_state == NETREG_REGISTERED)
		unregister_netdevice(wdev->netdev);
		cfg80211_unregister_netdevice(wdev->netdev);

	if (priv->dfs_cac_workqueue) {
		flush_workqueue(priv->dfs_cac_workqueue);
+1 −1
Original line number Diff line number Diff line
@@ -1538,7 +1538,7 @@ static int del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
		wilc_wfi_deinit_mon_interface(wl, true);
	vif = netdev_priv(wdev->netdev);
	cfg80211_stop_iface(wiphy, wdev, GFP_KERNEL);
	unregister_netdevice(vif->ndev);
	cfg80211_unregister_netdevice(vif->ndev);
	vif->monitor_flag = 0;

	wilc_set_operation_mode(vif, 0, 0, 0);
Loading