Commit b17aff33 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

mt76: move token_lock, token and token_count in mt76_dev

Move token_lock, token and token_count data structures in mt76_dev.
This is a preliminary patch to move token management in mt76 common
module since it is shared by mt7615, mt7915 and mt7921 drivers.
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent fe3fccde
...@@ -659,6 +659,10 @@ struct mt76_dev { ...@@ -659,6 +659,10 @@ struct mt76_dev {
struct mt76_worker tx_worker; struct mt76_worker tx_worker;
struct napi_struct tx_napi; struct napi_struct tx_napi;
spinlock_t token_lock;
struct idr token;
int token_count;
wait_queue_head_t tx_wait; wait_queue_head_t tx_wait;
struct sk_buff_head status_list; struct sk_buff_head status_list;
......
...@@ -1466,9 +1466,9 @@ mt7615_mac_tx_free_token(struct mt7615_dev *dev, u16 token) ...@@ -1466,9 +1466,9 @@ mt7615_mac_tx_free_token(struct mt7615_dev *dev, u16 token)
trace_mac_tx_free(dev, token); trace_mac_tx_free(dev, token);
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
txwi = idr_remove(&dev->token, token); txwi = idr_remove(&mdev->token, token);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
if (!txwi) if (!txwi)
return; return;
...@@ -1977,8 +1977,8 @@ void mt7615_tx_token_put(struct mt7615_dev *dev) ...@@ -1977,8 +1977,8 @@ void mt7615_tx_token_put(struct mt7615_dev *dev)
struct mt76_txwi_cache *txwi; struct mt76_txwi_cache *txwi;
int id; int id;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&dev->mt76.token_lock);
idr_for_each_entry(&dev->token, txwi, id) { idr_for_each_entry(&dev->mt76.token, txwi, id) {
mt7615_txp_skb_unmap(&dev->mt76, txwi); mt7615_txp_skb_unmap(&dev->mt76, txwi);
if (txwi->skb) { if (txwi->skb) {
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
...@@ -1988,8 +1988,8 @@ void mt7615_tx_token_put(struct mt7615_dev *dev) ...@@ -1988,8 +1988,8 @@ void mt7615_tx_token_put(struct mt7615_dev *dev)
} }
mt76_put_txwi(&dev->mt76, txwi); mt76_put_txwi(&dev->mt76, txwi);
} }
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&dev->mt76.token_lock);
idr_destroy(&dev->token); idr_destroy(&dev->mt76.token);
} }
EXPORT_SYMBOL_GPL(mt7615_tx_token_put); EXPORT_SYMBOL_GPL(mt7615_tx_token_put);
......
...@@ -263,9 +263,6 @@ struct mt7615_dev { ...@@ -263,9 +263,6 @@ struct mt7615_dev {
bool flash_eeprom; bool flash_eeprom;
bool dbdc_support; bool dbdc_support;
spinlock_t token_lock;
struct idr token;
u8 fw_ver; u8 fw_ver;
struct work_struct rate_work; struct work_struct rate_work;
......
...@@ -40,8 +40,8 @@ static int mt7615_init_hardware(struct mt7615_dev *dev) ...@@ -40,8 +40,8 @@ static int mt7615_init_hardware(struct mt7615_dev *dev)
mt76_wr(dev, MT_INT_SOURCE_CSR, ~0); mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
INIT_WORK(&dev->mcu_work, mt7615_pci_init_work); INIT_WORK(&dev->mcu_work, mt7615_pci_init_work);
spin_lock_init(&dev->token_lock); spin_lock_init(&dev->mt76.token_lock);
idr_init(&dev->token); idr_init(&dev->mt76.token);
ret = mt7615_eeprom_init(dev, addr); ret = mt7615_eeprom_init(dev, addr);
if (ret < 0) if (ret < 0)
......
...@@ -37,9 +37,9 @@ void mt7615_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) ...@@ -37,9 +37,9 @@ void mt7615_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e)
token = le16_to_cpu(txp->hw.msdu_id[0]) & token = le16_to_cpu(txp->hw.msdu_id[0]) &
~MT_MSDU_ID_VALID; ~MT_MSDU_ID_VALID;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
t = idr_remove(&dev->token, token); t = idr_remove(&mdev->token, token);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
e->skb = t ? t->skb : NULL; e->skb = t ? t->skb : NULL;
} }
...@@ -161,9 +161,9 @@ int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -161,9 +161,9 @@ int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size); t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
t->skb = tx_info->skb; t->skb = tx_info->skb;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
id = idr_alloc(&dev->token, t, 0, MT7615_TOKEN_SIZE, GFP_ATOMIC); id = idr_alloc(&mdev->token, t, 0, MT7615_TOKEN_SIZE, GFP_ATOMIC);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
if (id < 0) if (id < 0)
return id; return id;
...@@ -314,7 +314,7 @@ void mt7615_mac_reset_work(struct work_struct *work) ...@@ -314,7 +314,7 @@ void mt7615_mac_reset_work(struct work_struct *work)
mt7615_dma_reset(dev); mt7615_dma_reset(dev);
mt7615_tx_token_put(dev); mt7615_tx_token_put(dev);
idr_init(&dev->token); idr_init(&dev->mt76.token);
mt76_wr(dev, MT_WPDMA_MEM_RNG_ERR, 0); mt76_wr(dev, MT_WPDMA_MEM_RNG_ERR, 0);
......
...@@ -351,8 +351,8 @@ static int mt7915_init_hardware(struct mt7915_dev *dev) ...@@ -351,8 +351,8 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)
mt76_wr(dev, MT_INT_SOURCE_CSR, ~0); mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
INIT_WORK(&dev->init_work, mt7915_init_work); INIT_WORK(&dev->init_work, mt7915_init_work);
spin_lock_init(&dev->token_lock); spin_lock_init(&dev->mt76.token_lock);
idr_init(&dev->token); idr_init(&dev->mt76.token);
dev->dbdc_support = !!(mt76_rr(dev, MT_HW_BOUND) & BIT(5)); dev->dbdc_support = !!(mt76_rr(dev, MT_HW_BOUND) & BIT(5));
......
...@@ -1046,14 +1046,14 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -1046,14 +1046,14 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size); t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
t->skb = tx_info->skb; t->skb = tx_info->skb;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
id = idr_alloc(&dev->token, t, 0, MT7915_TOKEN_SIZE, GFP_ATOMIC); id = idr_alloc(&mdev->token, t, 0, MT7915_TOKEN_SIZE, GFP_ATOMIC);
if (id >= 0) if (id >= 0)
dev->token_count++; mdev->token_count++;
if (dev->token_count >= MT7915_TOKEN_SIZE - MT7915_TOKEN_FREE_THR) if (mdev->token_count >= MT7915_TOKEN_SIZE - MT7915_TOKEN_FREE_THR)
mt7915_set_tx_blocked(dev, true); mt7915_set_tx_blocked(dev, true);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
if (id < 0) if (id < 0)
return id; return id;
...@@ -1218,14 +1218,14 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -1218,14 +1218,14 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)
msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info); msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info);
stat = FIELD_GET(MT_TX_FREE_STATUS, info); stat = FIELD_GET(MT_TX_FREE_STATUS, info);
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
txwi = idr_remove(&dev->token, msdu); txwi = idr_remove(&mdev->token, msdu);
if (txwi) if (txwi)
dev->token_count--; mdev->token_count--;
if (dev->token_count < MT7915_TOKEN_SIZE - MT7915_TOKEN_FREE_THR && if (mdev->token_count < MT7915_TOKEN_SIZE - MT7915_TOKEN_FREE_THR &&
dev->mphy.q_tx[0]->blocked) dev->mphy.q_tx[0]->blocked)
wake = true; wake = true;
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
if (!txwi) if (!txwi)
continue; continue;
...@@ -1257,9 +1257,9 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -1257,9 +1257,9 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)
mt7915_mac_sta_poll(dev); mt7915_mac_sta_poll(dev);
if (wake) { if (wake) {
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
mt7915_set_tx_blocked(dev, false); mt7915_set_tx_blocked(dev, false);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
} }
mt76_worker_schedule(&dev->mt76.tx_worker); mt76_worker_schedule(&dev->mt76.tx_worker);
...@@ -1290,9 +1290,9 @@ void mt7915_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) ...@@ -1290,9 +1290,9 @@ void mt7915_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e)
txp = mt7915_txwi_to_txp(mdev, e->txwi); txp = mt7915_txwi_to_txp(mdev, e->txwi);
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
t = idr_remove(&dev->token, le16_to_cpu(txp->token)); t = idr_remove(&mdev->token, le16_to_cpu(txp->token));
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
e->skb = t ? t->skb : NULL; e->skb = t ? t->skb : NULL;
} }
...@@ -1588,8 +1588,8 @@ void mt7915_tx_token_put(struct mt7915_dev *dev) ...@@ -1588,8 +1588,8 @@ void mt7915_tx_token_put(struct mt7915_dev *dev)
struct mt76_txwi_cache *txwi; struct mt76_txwi_cache *txwi;
int id; int id;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&dev->mt76.token_lock);
idr_for_each_entry(&dev->token, txwi, id) { idr_for_each_entry(&dev->mt76.token, txwi, id) {
mt7915_txp_skb_unmap(&dev->mt76, txwi); mt7915_txp_skb_unmap(&dev->mt76, txwi);
if (txwi->skb) { if (txwi->skb) {
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
...@@ -1598,10 +1598,10 @@ void mt7915_tx_token_put(struct mt7915_dev *dev) ...@@ -1598,10 +1598,10 @@ void mt7915_tx_token_put(struct mt7915_dev *dev)
ieee80211_free_txskb(hw, txwi->skb); ieee80211_free_txskb(hw, txwi->skb);
} }
mt76_put_txwi(&dev->mt76, txwi); mt76_put_txwi(&dev->mt76, txwi);
dev->token_count--; dev->mt76.token_count--;
} }
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&dev->mt76.token_lock);
idr_destroy(&dev->token); idr_destroy(&dev->mt76.token);
} }
/* system error recovery */ /* system error recovery */
...@@ -1649,7 +1649,7 @@ void mt7915_mac_reset_work(struct work_struct *work) ...@@ -1649,7 +1649,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
mt7915_dma_reset(dev); mt7915_dma_reset(dev);
mt7915_tx_token_put(dev); mt7915_tx_token_put(dev);
idr_init(&dev->token); idr_init(&dev->mt76.token);
mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_INIT); mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_INIT);
mt7915_wait_reset_state(dev, MT_MCU_CMD_RECOVERY_DONE); mt7915_wait_reset_state(dev, MT_MCU_CMD_RECOVERY_DONE);
......
...@@ -187,10 +187,6 @@ struct mt7915_dev { ...@@ -187,10 +187,6 @@ struct mt7915_dev {
u32 hw_pattern; u32 hw_pattern;
spinlock_t token_lock;
int token_count;
struct idr token;
bool dbdc_support; bool dbdc_support;
bool flash_mode; bool flash_mode;
bool fw_debug; bool fw_debug;
......
...@@ -170,8 +170,8 @@ static int mt7921_init_hardware(struct mt7921_dev *dev) ...@@ -170,8 +170,8 @@ static int mt7921_init_hardware(struct mt7921_dev *dev)
{ {
int ret, idx; int ret, idx;
spin_lock_init(&dev->token_lock); spin_lock_init(&dev->mt76.token_lock);
idr_init(&dev->token); idr_init(&dev->mt76.token);
ret = mt7921_dma_init(dev); ret = mt7921_dma_init(dev);
if (ret) if (ret)
......
...@@ -824,14 +824,14 @@ int mt7921_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -824,14 +824,14 @@ int mt7921_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size); t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
t->skb = tx_info->skb; t->skb = tx_info->skb;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
id = idr_alloc(&dev->token, t, 0, MT7921_TOKEN_SIZE, GFP_ATOMIC); id = idr_alloc(&mdev->token, t, 0, MT7921_TOKEN_SIZE, GFP_ATOMIC);
if (id >= 0) if (id >= 0)
dev->token_count++; mdev->token_count++;
if (dev->token_count >= MT7921_TOKEN_SIZE - MT7921_TOKEN_FREE_THR) if (mdev->token_count >= MT7921_TOKEN_SIZE - MT7921_TOKEN_FREE_THR)
mt7921_set_tx_blocked(dev, true); mt7921_set_tx_blocked(dev, true);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
if (id < 0) if (id < 0)
return id; return id;
...@@ -994,14 +994,14 @@ void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb) ...@@ -994,14 +994,14 @@ void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb)
msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info); msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info);
stat = FIELD_GET(MT_TX_FREE_STATUS, info); stat = FIELD_GET(MT_TX_FREE_STATUS, info);
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
txwi = idr_remove(&dev->token, msdu); txwi = idr_remove(&mdev->token, msdu);
if (txwi) if (txwi)
dev->token_count--; mdev->token_count--;
if (dev->token_count < MT7921_TOKEN_SIZE - MT7921_TOKEN_FREE_THR && if (mdev->token_count < MT7921_TOKEN_SIZE - MT7921_TOKEN_FREE_THR &&
dev->mphy.q_tx[0]->blocked) dev->mphy.q_tx[0]->blocked)
wake = true; wake = true;
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
if (!txwi) if (!txwi)
continue; continue;
...@@ -1031,9 +1031,9 @@ void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb) ...@@ -1031,9 +1031,9 @@ void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb)
} }
if (wake) { if (wake) {
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
mt7921_set_tx_blocked(dev, false); mt7921_set_tx_blocked(dev, false);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
} }
napi_consume_skb(skb, 1); napi_consume_skb(skb, 1);
...@@ -1067,9 +1067,9 @@ void mt7921_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e) ...@@ -1067,9 +1067,9 @@ void mt7921_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e)
txp = mt7921_txwi_to_txp(mdev, e->txwi); txp = mt7921_txwi_to_txp(mdev, e->txwi);
token = le16_to_cpu(txp->hw.msdu_id[0]) & ~MT_MSDU_ID_VALID; token = le16_to_cpu(txp->hw.msdu_id[0]) & ~MT_MSDU_ID_VALID;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&mdev->token_lock);
t = idr_remove(&dev->token, token); t = idr_remove(&mdev->token, token);
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&mdev->token_lock);
e->skb = t ? t->skb : NULL; e->skb = t ? t->skb : NULL;
} }
...@@ -1209,8 +1209,8 @@ void mt7921_tx_token_put(struct mt7921_dev *dev) ...@@ -1209,8 +1209,8 @@ void mt7921_tx_token_put(struct mt7921_dev *dev)
struct mt76_txwi_cache *txwi; struct mt76_txwi_cache *txwi;
int id; int id;
spin_lock_bh(&dev->token_lock); spin_lock_bh(&dev->mt76.token_lock);
idr_for_each_entry(&dev->token, txwi, id) { idr_for_each_entry(&dev->mt76.token, txwi, id) {
mt7921_txp_skb_unmap(&dev->mt76, txwi); mt7921_txp_skb_unmap(&dev->mt76, txwi);
if (txwi->skb) { if (txwi->skb) {
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
...@@ -1219,10 +1219,10 @@ void mt7921_tx_token_put(struct mt7921_dev *dev) ...@@ -1219,10 +1219,10 @@ void mt7921_tx_token_put(struct mt7921_dev *dev)
ieee80211_free_txskb(hw, txwi->skb); ieee80211_free_txskb(hw, txwi->skb);
} }
mt76_put_txwi(&dev->mt76, txwi); mt76_put_txwi(&dev->mt76, txwi);
dev->token_count--; dev->mt76.token_count--;
} }
spin_unlock_bh(&dev->token_lock); spin_unlock_bh(&dev->mt76.token_lock);
idr_destroy(&dev->token); idr_destroy(&dev->mt76.token);
} }
static void static void
...@@ -1261,7 +1261,7 @@ mt7921_mac_reset(struct mt7921_dev *dev) ...@@ -1261,7 +1261,7 @@ mt7921_mac_reset(struct mt7921_dev *dev)
napi_disable(&dev->mt76.tx_napi); napi_disable(&dev->mt76.tx_napi);
mt7921_tx_token_put(dev); mt7921_tx_token_put(dev);
idr_init(&dev->token); idr_init(&dev->mt76.token);
err = mt7921_wpdma_reset(dev, true); err = mt7921_wpdma_reset(dev, true);
if (err) if (err)
......
...@@ -161,10 +161,6 @@ struct mt7921_dev { ...@@ -161,10 +161,6 @@ struct mt7921_dev {
struct list_head sta_poll_list; struct list_head sta_poll_list;
spinlock_t sta_poll_lock; spinlock_t sta_poll_lock;
spinlock_t token_lock;
int token_count;
struct idr token;
u8 fw_debug; u8 fw_debug;
struct mt76_connac_pm pm; struct mt76_connac_pm pm;
......
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