Commit 2690c4c0 authored by Lior David's avatar Lior David Committed by Kalle Valo

wil6210: fix wiphy registration sequence

Currently wiphy structure is initialized and registered
in wil_if_alloc, before some information is available such
as MAC address and capabilities. As a result there is a
small chance user space will get incorrect information
from calls such as NL80211_CMD_GET_WIPHY.
Fix this by seperating the registration and moving it
to wil_if_add which is executed later, after all
relevant information is known.
Signed-off-by: default avatarLior David <qca_liord@qca.qualcomm.com>
Signed-off-by: default avatarMaya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent dc90506f
...@@ -1503,14 +1503,8 @@ struct wireless_dev *wil_cfg80211_init(struct device *dev) ...@@ -1503,14 +1503,8 @@ struct wireless_dev *wil_cfg80211_init(struct device *dev)
set_wiphy_dev(wdev->wiphy, dev); set_wiphy_dev(wdev->wiphy, dev);
wil_wiphy_init(wdev->wiphy); wil_wiphy_init(wdev->wiphy);
rc = wiphy_register(wdev->wiphy);
if (rc < 0)
goto out_failed_reg;
return wdev; return wdev;
out_failed_reg:
wiphy_free(wdev->wiphy);
out: out:
kfree(wdev); kfree(wdev);
...@@ -1526,7 +1520,6 @@ void wil_wdev_free(struct wil6210_priv *wil) ...@@ -1526,7 +1520,6 @@ void wil_wdev_free(struct wil6210_priv *wil)
if (!wdev) if (!wdev)
return; return;
wiphy_unregister(wdev->wiphy);
wiphy_free(wdev->wiphy); wiphy_free(wdev->wiphy);
kfree(wdev); kfree(wdev);
} }
......
...@@ -232,6 +232,9 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid, ...@@ -232,6 +232,9 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid,
struct net_device *ndev = wil_to_ndev(wil); struct net_device *ndev = wil_to_ndev(wil);
struct wireless_dev *wdev = wil->wdev; struct wireless_dev *wdev = wil->wdev;
if (unlikely(!ndev))
return;
might_sleep(); might_sleep();
wil_info(wil, "%s(bssid=%pM, reason=%d, ev%s)\n", __func__, bssid, wil_info(wil, "%s(bssid=%pM, reason=%d, ev%s)\n", __func__, bssid,
reason_code, from_event ? "+" : "-"); reason_code, from_event ? "+" : "-");
......
...@@ -179,13 +179,6 @@ void *wil_if_alloc(struct device *dev) ...@@ -179,13 +179,6 @@ void *wil_if_alloc(struct device *dev)
SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy)); SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy));
wdev->netdev = ndev; wdev->netdev = ndev;
netif_napi_add(ndev, &wil->napi_rx, wil6210_netdev_poll_rx,
WIL6210_NAPI_BUDGET);
netif_tx_napi_add(ndev, &wil->napi_tx, wil6210_netdev_poll_tx,
WIL6210_NAPI_BUDGET);
netif_tx_stop_all_queues(ndev);
return wil; return wil;
out_priv: out_priv:
...@@ -216,25 +209,46 @@ void wil_if_free(struct wil6210_priv *wil) ...@@ -216,25 +209,46 @@ void wil_if_free(struct wil6210_priv *wil)
int wil_if_add(struct wil6210_priv *wil) int wil_if_add(struct wil6210_priv *wil)
{ {
struct wireless_dev *wdev = wil_to_wdev(wil);
struct wiphy *wiphy = wdev->wiphy;
struct net_device *ndev = wil_to_ndev(wil); struct net_device *ndev = wil_to_ndev(wil);
int rc; int rc;
wil_dbg_misc(wil, "%s()\n", __func__); wil_dbg_misc(wil, "entered");
rc = wiphy_register(wiphy);
if (rc < 0) {
wil_err(wil, "failed to register wiphy, err %d\n", rc);
return rc;
}
netif_napi_add(ndev, &wil->napi_rx, wil6210_netdev_poll_rx,
WIL6210_NAPI_BUDGET);
netif_tx_napi_add(ndev, &wil->napi_tx, wil6210_netdev_poll_tx,
WIL6210_NAPI_BUDGET);
netif_tx_stop_all_queues(ndev);
rc = register_netdev(ndev); rc = register_netdev(ndev);
if (rc < 0) { if (rc < 0) {
dev_err(&ndev->dev, "Failed to register netdev: %d\n", rc); dev_err(&ndev->dev, "Failed to register netdev: %d\n", rc);
return rc; goto out_wiphy;
} }
return 0; return 0;
out_wiphy:
wiphy_unregister(wdev->wiphy);
return rc;
} }
void wil_if_remove(struct wil6210_priv *wil) void wil_if_remove(struct wil6210_priv *wil)
{ {
struct net_device *ndev = wil_to_ndev(wil); struct net_device *ndev = wil_to_ndev(wil);
struct wireless_dev *wdev = wil_to_wdev(wil);
wil_dbg_misc(wil, "%s()\n", __func__); wil_dbg_misc(wil, "%s()\n", __func__);
unregister_netdev(ndev); unregister_netdev(ndev);
wiphy_unregister(wdev->wiphy);
} }
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