bes2600: Patch F — backport cw1200 mainline bug fixes (3 commits) #4

Merged
marfrit merged 3 commits from bes2600/cw1200-fix-backports into cleanups 2026-05-07 19:30:13 +00:00
4 changed files with 35 additions and 26 deletions
+6 -6
View File
@@ -101,7 +101,7 @@ void bes2600_unregister_bh(struct bes2600_common *hw_priv)
coex_deinit_mode(hw_priv); coex_deinit_mode(hw_priv);
#endif #endif
atomic_add(1, &hw_priv->bh_term); atomic_inc(&hw_priv->bh_term);
wake_up(&hw_priv->bh_wq); wake_up(&hw_priv->bh_wq);
flush_workqueue(hw_priv->bh_workqueue); flush_workqueue(hw_priv->bh_workqueue);
@@ -590,7 +590,7 @@ static int bes2600_bh(void *arg)
bes_devel("[BH] Device resume.\n"); bes_devel("[BH] Device resume.\n");
atomic_set(&hw_priv->bh_suspend, BES2600_BH_RESUMED); atomic_set(&hw_priv->bh_suspend, BES2600_BH_RESUMED);
wake_up(&hw_priv->bh_evt_wq); wake_up(&hw_priv->bh_evt_wq);
atomic_add(1, &hw_priv->bh_rx); atomic_inc(&hw_priv->bh_rx);
continue; continue;
} }
@@ -758,9 +758,9 @@ tx:
#if 0 /* count is not implemented */ #if 0 /* count is not implemented */
if (ret > 1) if (ret > 1)
atomic_add(1, &hw_priv->bh_tx); atomic_inc(&hw_priv->bh_tx);
#else #else
atomic_add(1, &hw_priv->bh_tx); atomic_inc(&hw_priv->bh_tx);
#endif #endif
#if defined(CONFIG_BES2600_NON_POWER_OF_TWO_BLOCKSIZES) #if defined(CONFIG_BES2600_NON_POWER_OF_TWO_BLOCKSIZES)
@@ -1134,7 +1134,7 @@ static int bes2600_bh_tx_helper(struct bes2600_common *hw_priv,
tx_len += 4; tx_len += 4;
#endif #endif
atomic_add(1, &hw_priv->bh_tx); atomic_inc(&hw_priv->bh_tx);
tx_len = hw_priv->sbus_ops->align_size( tx_len = hw_priv->sbus_ops->align_size(
hw_priv->sbus_priv, tx_len); hw_priv->sbus_priv, tx_len);
@@ -1435,7 +1435,7 @@ static int bes2600_bh(void *arg)
bes_devel("[BH] Device resume.\n"); bes_devel("[BH] Device resume.\n");
atomic_set(&hw_priv->bh_suspend, BES2600_BH_RESUMED); atomic_set(&hw_priv->bh_suspend, BES2600_BH_RESUMED);
wake_up(&hw_priv->bh_evt_wq); wake_up(&hw_priv->bh_evt_wq);
atomic_add(1, &hw_priv->bh_rx); atomic_inc(&hw_priv->bh_rx);
goto done; goto done;
} }
+1 -1
View File
@@ -570,7 +570,7 @@ int bes2600_itp_get_tx(struct bes2600_common *priv, u8 **data,
*burst = 2; *burst = 2;
atomic_set(&priv->bh_tx, 1); atomic_set(&priv->bh_tx, 1);
ktime_get_ts(&itp->last_sent); ktime_get_ts(&itp->last_sent);
atomic_add(1, &itp->awaiting_confirm); atomic_inc(&itp->awaiting_confirm);
spin_unlock_bh(&itp->tx_lock); spin_unlock_bh(&itp->tx_lock);
return 1; return 1;
+2
View File
@@ -497,6 +497,7 @@ static struct ieee80211_hw *bes2600_init_common(size_t hw_priv_data_len)
WLAN_LINK_ID_MAX, WLAN_LINK_ID_MAX,
bes2600_skb_dtor, bes2600_skb_dtor,
hw_priv))) { hw_priv))) {
destroy_workqueue(hw_priv->workqueue);
ieee80211_free_hw(hw); ieee80211_free_hw(hw);
return NULL; return NULL;
} }
@@ -508,6 +509,7 @@ static struct ieee80211_hw *bes2600_init_common(size_t hw_priv_data_len)
for (; i > 0; i--) for (; i > 0; i--)
bes2600_queue_deinit(&hw_priv->tx_queue[i - 1]); bes2600_queue_deinit(&hw_priv->tx_queue[i - 1]);
bes2600_queue_stats_deinit(&hw_priv->tx_queue_stats); bes2600_queue_stats_deinit(&hw_priv->tx_queue_stats);
destroy_workqueue(hw_priv->workqueue);
ieee80211_free_hw(hw); ieee80211_free_hw(hw);
return NULL; return NULL;
} }
+26 -19
View File
@@ -257,18 +257,21 @@ int bes2600_hw_scan(struct ieee80211_hw *hw,
bes2600_pwr_set_busy_event(hw_priv, BES_PWR_LOCK_ON_SCAN); bes2600_pwr_set_busy_event(hw_priv, BES_PWR_LOCK_ON_SCAN);
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
req->ie_len);
if (!frame.skb)
return -ENOMEM;
if (req->ie_len)
skb_put_data(frame.skb, req->ie, req->ie_len);
/* will be unlocked in bes2600_scan_work() */ /* will be unlocked in bes2600_scan_work() */
down(&hw_priv->scan.lock); down(&hw_priv->scan.lock);
down(&hw_priv->conf_lock); down(&hw_priv->conf_lock);
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
req->ie_len);
if (!frame.skb) {
up(&hw_priv->conf_lock);
up(&hw_priv->scan.lock);
return -ENOMEM;
}
if (req->ie_len)
skb_put_data(frame.skb, req->ie, req->ie_len);
if (frame.skb) { if (frame.skb) {
int ret; int ret;
//if (priv->if_id == 0) //if (priv->if_id == 0)
@@ -286,9 +289,9 @@ int bes2600_hw_scan(struct ieee80211_hw *hw,
} }
#endif #endif
if (ret) { if (ret) {
dev_kfree_skb(frame.skb);
up(&hw_priv->conf_lock); up(&hw_priv->conf_lock);
up(&hw_priv->scan.lock); up(&hw_priv->scan.lock);
dev_kfree_skb(frame.skb);
return ret; return ret;
} }
} }
@@ -318,10 +321,10 @@ int bes2600_hw_scan(struct ieee80211_hw *hw,
++hw_priv->scan.n_ssids; ++hw_priv->scan.n_ssids;
} }
up(&hw_priv->conf_lock);
if (frame.skb) if (frame.skb)
dev_kfree_skb(frame.skb); dev_kfree_skb(frame.skb);
up(&hw_priv->conf_lock);
#ifdef WIFI_BT_COEXIST_EPTA_ENABLE #ifdef WIFI_BT_COEXIST_EPTA_ENABLE
bwifi_change_current_status(hw_priv, BWIFI_STATUS_SCANNING); bwifi_change_current_status(hw_priv, BWIFI_STATUS_SCANNING);
#endif #endif
@@ -362,14 +365,18 @@ int bes2600_hw_sched_scan_start(struct ieee80211_hw *hw,
if (req->n_ssids > hw->wiphy->max_scan_ssids) if (req->n_ssids > hw->wiphy->max_scan_ssids)
return -EINVAL; return -EINVAL;
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
req->ie_len);
if (!frame.skb)
return -ENOMEM;
/* will be unlocked in bes2600_scan_work() */ /* will be unlocked in bes2600_scan_work() */
down(&hw_priv->scan.lock); down(&hw_priv->scan.lock);
down(&hw_priv->conf_lock); down(&hw_priv->conf_lock);
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
req->ie_len);
if (!frame.skb) {
up(&hw_priv->conf_lock);
up(&hw_priv->scan.lock);
return -ENOMEM;
}
if (frame.skb) { if (frame.skb) {
int ret; int ret;
if (priv->if_id == 0) if (priv->if_id == 0)
@@ -380,9 +387,9 @@ int bes2600_hw_sched_scan_start(struct ieee80211_hw *hw,
ret = wsm_set_probe_responder(priv, true); ret = wsm_set_probe_responder(priv, true);
} }
if (ret) { if (ret) {
dev_kfree_skb(frame.skb);
up(&hw_priv->conf_lock); up(&hw_priv->conf_lock);
up(&hw_priv->scan.lock); up(&hw_priv->scan.lock);
dev_kfree_skb(frame.skb);
return ret; return ret;
} }
} }
@@ -414,10 +421,10 @@ int bes2600_hw_sched_scan_start(struct ieee80211_hw *hw,
} }
} }
up(&hw_priv->conf_lock);
if (frame.skb) if (frame.skb)
dev_kfree_skb(frame.skb); dev_kfree_skb(frame.skb);
up(&hw_priv->conf_lock);
queue_work(hw_priv->workqueue, &hw_priv->scan.swork); queue_work(hw_priv->workqueue, &hw_priv->scan.swork);
wiphy_warn(hw->wiphy, "<--[SCAN] Scheduled scan request.\n"); wiphy_warn(hw->wiphy, "<--[SCAN] Scheduled scan request.\n");
return 0; return 0;