Commit df2b5388 authored by Maya Erez's avatar Maya Erez Committed by Kalle Valo

wil6210: prevent usage of tx ring 0 for eDMA

In enhanced DMA ring 0 is used for RX ring, hence TX ring 0
is an unused element in ring_tx and ring2cid_tid arrays.
Initialize ring2cid_tid CID to WIL6210_MAX_CID to prevent a false
match of CID 0.
Go over the ring_tx and ring2cid_tid from wil_get_min_tx_ring_id
and on to prevent access to index 0 in eDMA.
Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 686ab4f5
...@@ -223,6 +223,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) ...@@ -223,6 +223,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
struct net_device *ndev = vif_to_ndev(vif); struct net_device *ndev = vif_to_ndev(vif);
struct wireless_dev *wdev = vif_to_wdev(vif); struct wireless_dev *wdev = vif_to_wdev(vif);
struct wil_sta_info *sta = &wil->sta[cid]; struct wil_sta_info *sta = &wil->sta[cid];
int min_ring_id = wil_get_min_tx_ring_id(wil);
might_sleep(); might_sleep();
wil_dbg_misc(wil, "disconnect_cid: CID %d, MID %d, status %d\n", wil_dbg_misc(wil, "disconnect_cid: CID %d, MID %d, status %d\n",
...@@ -273,7 +274,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) ...@@ -273,7 +274,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
memset(sta->tid_crypto_rx, 0, sizeof(sta->tid_crypto_rx)); memset(sta->tid_crypto_rx, 0, sizeof(sta->tid_crypto_rx));
memset(&sta->group_crypto_rx, 0, sizeof(sta->group_crypto_rx)); memset(&sta->group_crypto_rx, 0, sizeof(sta->group_crypto_rx));
/* release vrings */ /* release vrings */
for (i = 0; i < ARRAY_SIZE(wil->ring_tx); i++) { for (i = min_ring_id; i < ARRAY_SIZE(wil->ring_tx); i++) {
if (wil->ring2cid_tid[i][0] == cid) if (wil->ring2cid_tid[i][0] == cid)
wil_ring_fini_tx(wil, i); wil_ring_fini_tx(wil, i);
} }
...@@ -604,8 +605,10 @@ int wil_priv_init(struct wil6210_priv *wil) ...@@ -604,8 +605,10 @@ int wil_priv_init(struct wil6210_priv *wil)
wil->sta[i].mid = U8_MAX; wil->sta[i].mid = U8_MAX;
} }
for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
spin_lock_init(&wil->ring_tx_data[i].lock); spin_lock_init(&wil->ring_tx_data[i].lock);
wil->ring2cid_tid[i][0] = WIL6210_MAX_CID;
}
mutex_init(&wil->mutex); mutex_init(&wil->mutex);
mutex_init(&wil->vif_mutex); mutex_init(&wil->vif_mutex);
......
...@@ -77,8 +77,9 @@ bool wil_is_tx_idle(struct wil6210_priv *wil) ...@@ -77,8 +77,9 @@ bool wil_is_tx_idle(struct wil6210_priv *wil)
{ {
int i; int i;
unsigned long data_comp_to; unsigned long data_comp_to;
int min_ring_id = wil_get_min_tx_ring_id(wil);
for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { for (i = min_ring_id; i < WIL6210_MAX_TX_RINGS; i++) {
struct wil_ring *vring = &wil->ring_tx[i]; struct wil_ring *vring = &wil->ring_tx[i];
int vring_index = vring - wil->ring_tx; int vring_index = vring - wil->ring_tx;
struct wil_ring_tx_data *txdata = struct wil_ring_tx_data *txdata =
...@@ -1942,6 +1943,7 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil, ...@@ -1942,6 +1943,7 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil,
bool check_stop) bool check_stop)
{ {
int i; int i;
int min_ring_id = wil_get_min_tx_ring_id(wil);
if (unlikely(!vif)) if (unlikely(!vif))
return; return;
...@@ -1974,7 +1976,7 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil, ...@@ -1974,7 +1976,7 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil,
return; return;
/* check wake */ /* check wake */
for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { for (i = min_ring_id; i < WIL6210_MAX_TX_RINGS; i++) {
struct wil_ring *cur_ring = &wil->ring_tx[i]; struct wil_ring *cur_ring = &wil->ring_tx[i];
struct wil_ring_tx_data *txdata = &wil->ring_tx_data[i]; struct wil_ring_tx_data *txdata = &wil->ring_tx_data[i];
......
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