Loading drivers/net/wireless/ath/wil6210/cfg80211.c +1 −1 Original line number Diff line number Diff line Loading @@ -797,7 +797,7 @@ static int wil_cfg80211_del_station(struct wiphy *wiphy, struct wil6210_priv *wil = wiphy_to_wil(wiphy); mutex_lock(&wil->mutex); wil6210_disconnect(wil, mac); wil6210_disconnect(wil, mac, false); mutex_unlock(&wil->mutex); return 0; Loading drivers/net/wireless/ath/wil6210/main.c +25 −10 Original line number Diff line number Diff line Loading @@ -74,7 +74,8 @@ void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src, __raw_writel(*s++, d++); } static void wil_disconnect_cid(struct wil6210_priv *wil, int cid) static void wil_disconnect_cid(struct wil6210_priv *wil, int cid, bool from_event) { uint i; struct net_device *ndev = wil_to_ndev(wil); Loading @@ -86,7 +87,10 @@ static void wil_disconnect_cid(struct wil6210_priv *wil, int cid) sta->data_port_open = false; if (sta->status != wil_sta_unused) { wmi_disconnect_sta(wil, sta->addr, WLAN_REASON_DEAUTH_LEAVING); if (!from_event) wmi_disconnect_sta(wil, sta->addr, WLAN_REASON_DEAUTH_LEAVING); switch (wdev->iftype) { case NL80211_IFTYPE_AP: case NL80211_IFTYPE_P2P_GO: Loading Loading @@ -118,7 +122,8 @@ static void wil_disconnect_cid(struct wil6210_priv *wil, int cid) memset(&sta->stats, 0, sizeof(sta->stats)); } static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid) static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid, bool from_event) { int cid = -ENOENT; struct net_device *ndev = wil_to_ndev(wil); Loading @@ -133,10 +138,10 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid) } if (cid >= 0) /* disconnect 1 peer */ wil_disconnect_cid(wil, cid); wil_disconnect_cid(wil, cid, from_event); else /* disconnect all */ for (cid = 0; cid < WIL6210_MAX_CID; cid++) wil_disconnect_cid(wil, cid); wil_disconnect_cid(wil, cid, from_event); /* link state */ switch (wdev->iftype) { Loading Loading @@ -166,7 +171,7 @@ static void wil_disconnect_worker(struct work_struct *work) struct wil6210_priv, disconnect_worker); mutex_lock(&wil->mutex); _wil6210_disconnect(wil, NULL); _wil6210_disconnect(wil, NULL, false); mutex_unlock(&wil->mutex); } Loading Loading @@ -351,12 +356,22 @@ int wil_priv_init(struct wil6210_priv *wil) return 0; } void wil6210_disconnect(struct wil6210_priv *wil, void *bssid) /** * wil6210_disconnect - disconnect one connection * @wil: driver context * @bssid: peer to disconnect, NULL to disconnect all * @from_event: whether is invoked from FW event handler * * Disconnect and release associated resources. If invoked not from the * FW event handler, issue WMI command(s) to trigger MAC disconnect. */ void wil6210_disconnect(struct wil6210_priv *wil, void *bssid, bool from_event) { wil_dbg_misc(wil, "%s()\n", __func__); del_timer_sync(&wil->connect_timer); _wil6210_disconnect(wil, bssid); _wil6210_disconnect(wil, bssid, from_event); } void wil_priv_deinit(struct wil6210_priv *wil) Loading @@ -368,7 +383,7 @@ void wil_priv_deinit(struct wil6210_priv *wil) cancel_work_sync(&wil->disconnect_worker); cancel_work_sync(&wil->fw_error_worker); mutex_lock(&wil->mutex); wil6210_disconnect(wil, NULL); wil6210_disconnect(wil, NULL, false); mutex_unlock(&wil->mutex); wmi_event_flush(wil); destroy_workqueue(wil->wmi_wq_conn); Loading Loading @@ -553,7 +568,7 @@ int wil_reset(struct wil6210_priv *wil) WARN_ON(test_bit(wil_status_napi_en, &wil->status)); cancel_work_sync(&wil->disconnect_worker); wil6210_disconnect(wil, NULL); wil6210_disconnect(wil, NULL, false); wil->status = 0; /* prevent NAPI from being scheduled */ Loading drivers/net/wireless/ath/wil6210/wil6210.h +2 −1 Original line number Diff line number Diff line Loading @@ -583,7 +583,8 @@ void wil_wdev_free(struct wil6210_priv *wil); int wmi_set_mac_address(struct wil6210_priv *wil, void *addr); int wmi_pcp_start(struct wil6210_priv *wil, int bi, u8 wmi_nettype, u8 chan); int wmi_pcp_stop(struct wil6210_priv *wil); void wil6210_disconnect(struct wil6210_priv *wil, void *bssid); void wil6210_disconnect(struct wil6210_priv *wil, void *bssid, bool from_event); int wil_rx_init(struct wil6210_priv *wil); void wil_rx_fini(struct wil6210_priv *wil); Loading drivers/net/wireless/ath/wil6210/wmi.c +1 −1 Original line number Diff line number Diff line Loading @@ -486,7 +486,7 @@ static void wmi_evt_disconnect(struct wil6210_priv *wil, int id, wil->sinfo_gen++; mutex_lock(&wil->mutex); wil6210_disconnect(wil, evt->bssid); wil6210_disconnect(wil, evt->bssid, true); mutex_unlock(&wil->mutex); } Loading Loading
drivers/net/wireless/ath/wil6210/cfg80211.c +1 −1 Original line number Diff line number Diff line Loading @@ -797,7 +797,7 @@ static int wil_cfg80211_del_station(struct wiphy *wiphy, struct wil6210_priv *wil = wiphy_to_wil(wiphy); mutex_lock(&wil->mutex); wil6210_disconnect(wil, mac); wil6210_disconnect(wil, mac, false); mutex_unlock(&wil->mutex); return 0; Loading
drivers/net/wireless/ath/wil6210/main.c +25 −10 Original line number Diff line number Diff line Loading @@ -74,7 +74,8 @@ void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src, __raw_writel(*s++, d++); } static void wil_disconnect_cid(struct wil6210_priv *wil, int cid) static void wil_disconnect_cid(struct wil6210_priv *wil, int cid, bool from_event) { uint i; struct net_device *ndev = wil_to_ndev(wil); Loading @@ -86,7 +87,10 @@ static void wil_disconnect_cid(struct wil6210_priv *wil, int cid) sta->data_port_open = false; if (sta->status != wil_sta_unused) { wmi_disconnect_sta(wil, sta->addr, WLAN_REASON_DEAUTH_LEAVING); if (!from_event) wmi_disconnect_sta(wil, sta->addr, WLAN_REASON_DEAUTH_LEAVING); switch (wdev->iftype) { case NL80211_IFTYPE_AP: case NL80211_IFTYPE_P2P_GO: Loading Loading @@ -118,7 +122,8 @@ static void wil_disconnect_cid(struct wil6210_priv *wil, int cid) memset(&sta->stats, 0, sizeof(sta->stats)); } static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid) static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid, bool from_event) { int cid = -ENOENT; struct net_device *ndev = wil_to_ndev(wil); Loading @@ -133,10 +138,10 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, void *bssid) } if (cid >= 0) /* disconnect 1 peer */ wil_disconnect_cid(wil, cid); wil_disconnect_cid(wil, cid, from_event); else /* disconnect all */ for (cid = 0; cid < WIL6210_MAX_CID; cid++) wil_disconnect_cid(wil, cid); wil_disconnect_cid(wil, cid, from_event); /* link state */ switch (wdev->iftype) { Loading Loading @@ -166,7 +171,7 @@ static void wil_disconnect_worker(struct work_struct *work) struct wil6210_priv, disconnect_worker); mutex_lock(&wil->mutex); _wil6210_disconnect(wil, NULL); _wil6210_disconnect(wil, NULL, false); mutex_unlock(&wil->mutex); } Loading Loading @@ -351,12 +356,22 @@ int wil_priv_init(struct wil6210_priv *wil) return 0; } void wil6210_disconnect(struct wil6210_priv *wil, void *bssid) /** * wil6210_disconnect - disconnect one connection * @wil: driver context * @bssid: peer to disconnect, NULL to disconnect all * @from_event: whether is invoked from FW event handler * * Disconnect and release associated resources. If invoked not from the * FW event handler, issue WMI command(s) to trigger MAC disconnect. */ void wil6210_disconnect(struct wil6210_priv *wil, void *bssid, bool from_event) { wil_dbg_misc(wil, "%s()\n", __func__); del_timer_sync(&wil->connect_timer); _wil6210_disconnect(wil, bssid); _wil6210_disconnect(wil, bssid, from_event); } void wil_priv_deinit(struct wil6210_priv *wil) Loading @@ -368,7 +383,7 @@ void wil_priv_deinit(struct wil6210_priv *wil) cancel_work_sync(&wil->disconnect_worker); cancel_work_sync(&wil->fw_error_worker); mutex_lock(&wil->mutex); wil6210_disconnect(wil, NULL); wil6210_disconnect(wil, NULL, false); mutex_unlock(&wil->mutex); wmi_event_flush(wil); destroy_workqueue(wil->wmi_wq_conn); Loading Loading @@ -553,7 +568,7 @@ int wil_reset(struct wil6210_priv *wil) WARN_ON(test_bit(wil_status_napi_en, &wil->status)); cancel_work_sync(&wil->disconnect_worker); wil6210_disconnect(wil, NULL); wil6210_disconnect(wil, NULL, false); wil->status = 0; /* prevent NAPI from being scheduled */ Loading
drivers/net/wireless/ath/wil6210/wil6210.h +2 −1 Original line number Diff line number Diff line Loading @@ -583,7 +583,8 @@ void wil_wdev_free(struct wil6210_priv *wil); int wmi_set_mac_address(struct wil6210_priv *wil, void *addr); int wmi_pcp_start(struct wil6210_priv *wil, int bi, u8 wmi_nettype, u8 chan); int wmi_pcp_stop(struct wil6210_priv *wil); void wil6210_disconnect(struct wil6210_priv *wil, void *bssid); void wil6210_disconnect(struct wil6210_priv *wil, void *bssid, bool from_event); int wil_rx_init(struct wil6210_priv *wil); void wil_rx_fini(struct wil6210_priv *wil); Loading
drivers/net/wireless/ath/wil6210/wmi.c +1 −1 Original line number Diff line number Diff line Loading @@ -486,7 +486,7 @@ static void wmi_evt_disconnect(struct wil6210_priv *wil, int id, wil->sinfo_gen++; mutex_lock(&wil->mutex); wil6210_disconnect(wil, evt->bssid); wil6210_disconnect(wil, evt->bssid, true); mutex_unlock(&wil->mutex); } Loading