mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
mt7603: use common tx status handling code
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
@@ -42,9 +42,7 @@ struct mt7603_dev *mt7603_alloc_device(struct device *pdev)
|
||||
mdev->drv = &drv_ops;
|
||||
|
||||
mutex_init(&dev->mutex);
|
||||
spin_lock_init(&dev->status_lock);
|
||||
spin_lock_init(&dev->irq_lock);
|
||||
__skb_queue_head_init(&dev->status_list);
|
||||
|
||||
return dev;
|
||||
}
|
||||
@@ -440,7 +438,6 @@ int mt7603_register_device(struct mt7603_dev *dev)
|
||||
wiphy->iface_combinations = if_comb;
|
||||
wiphy->n_iface_combinations = ARRAY_SIZE(if_comb);
|
||||
|
||||
ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
|
||||
ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
|
||||
|
||||
/* init led callbacks */
|
||||
@@ -472,7 +469,6 @@ void mt7603_unregister_device(struct mt7603_dev *dev)
|
||||
{
|
||||
tasklet_disable(&dev->pre_tbtt_tasklet);
|
||||
mt76_unregister_device(&dev->mt76);
|
||||
mt7603_mac_status_skb(dev, NULL, -1);
|
||||
mt7603_mcu_exit(dev);
|
||||
mt7603_dma_cleanup(dev);
|
||||
ieee80211_free_hw(mt76_hw(dev));
|
||||
|
||||
+10
-116
@@ -785,10 +785,8 @@ mt7603_mac_write_txwi(struct mt7603_dev *dev, __le32 *txwi,
|
||||
FIELD_PREP(MT_TXD1_PROTECTED, !!key)
|
||||
);
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_NO_ACK) {
|
||||
if (info->flags & IEEE80211_TX_CTL_NO_ACK)
|
||||
txwi[1] |= cpu_to_le32(MT_TXD1_NO_ACK);
|
||||
pid = MT_PID_NOACK;
|
||||
}
|
||||
|
||||
txwi[2] = cpu_to_le32(
|
||||
FIELD_PREP(MT_TXD2_FRAME_TYPE, frame_type) |
|
||||
@@ -848,43 +846,6 @@ mt7603_mac_write_txwi(struct mt7603_dev *dev, __le32 *txwi,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
mt7603_add_tx_status_skb(struct mt7603_dev *dev, struct mt7603_sta *msta,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct mt7603_cb *cb = mt7603_skb_cb(skb);
|
||||
int pid;
|
||||
|
||||
if (!msta)
|
||||
return 0;
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_NO_ACK)
|
||||
return 0;
|
||||
|
||||
if (!(info->flags & (IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_CTL_RATE_CTRL_PROBE)) &&
|
||||
info->control.rates[0].idx < 0)
|
||||
return 0;
|
||||
|
||||
spin_lock_bh(&dev->status_lock);
|
||||
|
||||
memset(cb, 0, sizeof(*cb));
|
||||
msta->pid = (msta->pid + 1) & MT_PID_INDEX;
|
||||
if (!msta->pid || msta->pid == MT_PID_NOACK)
|
||||
msta->pid = 1;
|
||||
|
||||
pid = msta->pid;
|
||||
cb->wcid = msta->wcid.idx;
|
||||
cb->pktid = pid;
|
||||
cb->jiffies = jiffies;
|
||||
|
||||
__skb_queue_tail(&dev->status_list, skb);
|
||||
|
||||
spin_unlock_bh(&dev->status_lock);
|
||||
return pid;
|
||||
}
|
||||
|
||||
int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
||||
struct sk_buff *skb, struct mt76_queue *q,
|
||||
struct mt76_wcid *wcid, struct ieee80211_sta *sta,
|
||||
@@ -904,9 +865,7 @@ int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
||||
mt7603_wtbl_set_ps(dev, wcid->idx, false);
|
||||
}
|
||||
|
||||
pid = mt7603_add_tx_status_skb(dev, msta, skb);
|
||||
if (!pid)
|
||||
skb->next = skb->prev = NULL;
|
||||
pid = mt76_tx_status_skb_add(mdev, wcid, skb);
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) {
|
||||
spin_lock_bh(&dev->mt76.lock);
|
||||
@@ -1019,58 +978,18 @@ mt7603_fill_txs(struct mt7603_dev *dev, struct mt7603_sta *sta,
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
mt7603_skb_done(struct mt7603_dev *dev, struct sk_buff *skb, u8 flags)
|
||||
{
|
||||
struct mt7603_cb *cb = mt7603_skb_cb(skb);
|
||||
u8 done = MT7603_CB_DMA_DONE | MT7603_CB_TXS_DONE;
|
||||
|
||||
flags |= cb->flags;
|
||||
cb->flags = flags;
|
||||
|
||||
if ((flags & done) != done)
|
||||
return;
|
||||
|
||||
if (flags & MT7603_CB_TXS_FAILED)
|
||||
ieee80211_free_txskb(mt76_hw(dev), skb);
|
||||
else
|
||||
ieee80211_tx_status(mt76_hw(dev), skb);
|
||||
}
|
||||
|
||||
struct sk_buff *
|
||||
mt7603_mac_status_skb(struct mt7603_dev *dev, struct mt7603_sta *sta, int pktid)
|
||||
{
|
||||
struct sk_buff *skb, *tmp;
|
||||
|
||||
skb_queue_walk_safe(&dev->status_list, skb, tmp) {
|
||||
struct mt7603_cb *cb = mt7603_skb_cb(skb);
|
||||
if (sta && cb->wcid != sta->wcid.idx)
|
||||
continue;
|
||||
|
||||
__skb_unlink(skb, &dev->status_list);
|
||||
if (cb->pktid == pktid)
|
||||
return skb;
|
||||
|
||||
mt7603_skb_done(dev, skb,
|
||||
MT7603_CB_TXS_FAILED | MT7603_CB_TXS_DONE);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool
|
||||
mt7603_mac_add_txs_skb(struct mt7603_dev *dev, struct mt7603_sta *sta, int pid,
|
||||
__le32 *txs_data)
|
||||
{
|
||||
struct mt76_dev *mdev = &dev->mt76;
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (!pid)
|
||||
return false;
|
||||
|
||||
spin_lock_bh(&dev->status_lock);
|
||||
skb = mt7603_mac_status_skb(dev, sta, pid);
|
||||
spin_unlock_bh(&dev->status_lock);
|
||||
|
||||
spin_lock_bh(&mdev->status_list.lock);
|
||||
skb = mt76_tx_status_skb_get(mdev, &sta->wcid, pid);
|
||||
if (skb) {
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
|
||||
@@ -1083,8 +1002,9 @@ mt7603_mac_add_txs_skb(struct mt7603_dev *dev, struct mt7603_sta *sta, int pid,
|
||||
spin_unlock_bh(&dev->mt76.lock);
|
||||
}
|
||||
mt7603_fill_txs(dev, sta, info, txs_data);
|
||||
mt7603_skb_done(dev, skb, MT7603_CB_TXS_DONE);
|
||||
mt76_tx_status_skb_done(mdev, skb);
|
||||
}
|
||||
spin_unlock_bh(&mdev->status_list.lock);
|
||||
|
||||
return !!skb;
|
||||
}
|
||||
@@ -1105,7 +1025,7 @@ void mt7603_mac_add_txs(struct mt7603_dev *dev, void *data)
|
||||
txs = le32_to_cpu(txs_data[3]);
|
||||
wcidx = FIELD_GET(MT_TXS3_WCID, txs);
|
||||
|
||||
if (pid == MT_PID_NOACK)
|
||||
if (pid == MT_PACKET_ID_NO_ACK)
|
||||
return;
|
||||
|
||||
if (wcidx >= ARRAY_SIZE(dev->wcid))
|
||||
@@ -1120,7 +1040,6 @@ void mt7603_mac_add_txs(struct mt7603_dev *dev, void *data)
|
||||
msta = container_of(wcid, struct mt7603_sta, wcid);
|
||||
sta = wcid_to_sta(wcid);
|
||||
|
||||
pid &= MT_PID_INDEX;
|
||||
if (mt7603_mac_add_txs_skb(dev, msta, pid, txs_data))
|
||||
goto out;
|
||||
|
||||
@@ -1139,7 +1058,6 @@ void mt7603_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue *q,
|
||||
{
|
||||
struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
|
||||
struct sk_buff *skb = e->skb;
|
||||
bool free = true;
|
||||
|
||||
if (!e->txwi) {
|
||||
dev_kfree_skb_any(skb);
|
||||
@@ -1149,20 +1067,7 @@ void mt7603_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue *q,
|
||||
if (q - dev->mt76.q_tx < 4)
|
||||
dev->tx_hang_check = 0;
|
||||
|
||||
/* will be freed by tx status handling codepath */
|
||||
if (skb->prev) {
|
||||
spin_lock_bh(&dev->status_lock);
|
||||
if (!flush) {
|
||||
mt7603_skb_done(dev, skb, MT7603_CB_DMA_DONE);
|
||||
free = false;
|
||||
} else {
|
||||
__skb_unlink(skb, &dev->status_list);
|
||||
}
|
||||
spin_unlock_bh(&dev->status_lock);
|
||||
}
|
||||
|
||||
if (free)
|
||||
ieee80211_free_txskb(mdev->hw, skb);
|
||||
mt76_tx_complete_skb(mdev, skb);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -1396,20 +1301,9 @@ void mt7603_update_channel(struct mt76_dev *mdev)
|
||||
void mt7603_mac_work(struct work_struct *work)
|
||||
{
|
||||
struct mt7603_dev *dev = container_of(work, struct mt7603_dev, mac_work.work);
|
||||
struct sk_buff *skb;
|
||||
bool reset = false;
|
||||
|
||||
spin_lock_bh(&dev->status_lock);
|
||||
while ((skb = skb_peek(&dev->status_list)) != NULL) {
|
||||
struct mt7603_cb *cb = mt7603_skb_cb(skb);
|
||||
if (time_is_after_jiffies(cb->jiffies + MT7603_STATUS_TIMEOUT))
|
||||
break;
|
||||
|
||||
__skb_unlink(skb, &dev->status_list);
|
||||
mt7603_skb_done(dev, skb,
|
||||
MT7603_CB_TXS_FAILED | MT7603_CB_TXS_DONE);
|
||||
}
|
||||
spin_unlock_bh(&dev->status_lock);
|
||||
mt76_tx_status_check(&dev->mt76);
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
|
||||
|
||||
@@ -253,7 +253,4 @@ enum mt7603_tx_header_format {
|
||||
#define MT_TXS4_F0_SEQNO GENMASK(11, 0)
|
||||
#define MT_TXS4_F1_TSSI GENMASK(11, 0)
|
||||
|
||||
#define MT_PID_NOACK GENMASK(7, 0)
|
||||
#define MT_PID_INDEX GENMASK(7, 0)
|
||||
|
||||
#endif
|
||||
|
||||
+3
-1
@@ -568,6 +568,7 @@ static void mt7603_set_coverage_class(struct ieee80211_hw *hw,
|
||||
static void mt7603_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_vif *vif = info->control.vif;
|
||||
struct mt7603_dev *dev = hw->priv;
|
||||
@@ -579,7 +580,8 @@ static void mt7603_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *cont
|
||||
msta = (struct mt7603_sta *)control->sta->drv_priv;
|
||||
wcid = &msta->wcid;
|
||||
/* sw encrypted frames */
|
||||
if (!info->control.hw_key && wcid->hw_key_idx != 0xff)
|
||||
if (!info->control.hw_key && wcid->hw_key_idx != 0xff &&
|
||||
ieee80211_has_protected(hdr->frame_control))
|
||||
control->sta = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
|
||||
#define MT7603_PRE_TBTT_TIME 5000 /* ms */
|
||||
|
||||
#define MT7603_STATUS_TIMEOUT (10 * HZ)
|
||||
#define MT7603_WATCHDOG_TIME 100 /* ms */
|
||||
#define MT7603_WATCHDOG_TIMEOUT 10 /* number of checks */
|
||||
|
||||
@@ -70,8 +69,6 @@ struct mt7603_sta {
|
||||
int n_rates;
|
||||
bool rate_probe;
|
||||
|
||||
int pid;
|
||||
|
||||
int ampdu_count;
|
||||
int ampdu_tx_count;
|
||||
int ampdu_acked;
|
||||
@@ -83,10 +80,6 @@ struct mt7603_vif {
|
||||
struct mt7603_sta sta;
|
||||
};
|
||||
|
||||
#define MT7603_CB_DMA_DONE BIT(0)
|
||||
#define MT7603_CB_TXS_DONE BIT(1)
|
||||
#define MT7603_CB_TXS_FAILED BIT(2)
|
||||
|
||||
enum mt7603_reset_cause {
|
||||
RESET_CAUSE_TX_HANG,
|
||||
RESET_CAUSE_TX_BUSY,
|
||||
@@ -96,13 +89,6 @@ enum mt7603_reset_cause {
|
||||
__RESET_CAUSE_MAX
|
||||
};
|
||||
|
||||
struct mt7603_cb {
|
||||
unsigned long jiffies;
|
||||
u8 wcid;
|
||||
u8 pktid;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
struct mt7603_dev {
|
||||
struct mt76_dev mt76; /* must be first */
|
||||
|
||||
@@ -117,9 +103,6 @@ struct mt7603_dev {
|
||||
unsigned long wcid_mask[MT7603_WTBL_SIZE / BITS_PER_LONG];
|
||||
struct mt76_wcid __rcu *wcid[MT7603_WTBL_SIZE];
|
||||
|
||||
spinlock_t status_lock;
|
||||
struct sk_buff_head status_list;
|
||||
|
||||
struct mt7603_sta global_sta;
|
||||
|
||||
u8 rx_chains;
|
||||
@@ -173,17 +156,6 @@ static inline bool is_mt7628(struct mt7603_dev *dev)
|
||||
/* need offset to prevent conflict with ampdu_ack_len */
|
||||
#define MT_RATE_DRIVER_DATA_OFFSET 4
|
||||
|
||||
static inline struct mt7603_cb *mt7603_skb_cb(struct sk_buff *skb)
|
||||
{
|
||||
BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, status.ampdu_len) >=
|
||||
(offsetof(struct ieee80211_tx_info, rate_driver_data) +
|
||||
MT_RATE_DRIVER_DATA_OFFSET));
|
||||
BUILD_BUG_ON(sizeof(struct mt7603_cb) + MT_RATE_DRIVER_DATA_OFFSET >
|
||||
IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE);
|
||||
return ((void *) IEEE80211_SKB_CB(skb)->rate_driver_data) +
|
||||
MT_RATE_DRIVER_DATA_OFFSET;
|
||||
}
|
||||
|
||||
u32 mt7603_reg_map(struct mt7603_dev *dev, u32 addr);
|
||||
|
||||
struct mt7603_dev *mt7603_alloc_device(struct device *pdev);
|
||||
@@ -220,8 +192,6 @@ void mt7603_mac_set_timing(struct mt7603_dev *dev);
|
||||
void mt7603_beacon_set_timer(struct mt7603_dev *dev, int idx, int intval);
|
||||
int mt7603_mac_fill_rx(struct mt7603_dev *dev, struct sk_buff *skb);
|
||||
void mt7603_mac_add_txs(struct mt7603_dev *dev, void *data);
|
||||
struct sk_buff *mt7603_mac_status_skb(struct mt7603_dev *dev,
|
||||
struct mt7603_sta *sta, int pktid);
|
||||
void mt7603_mac_rx_ba_reset(struct mt7603_dev *dev, void *addr, u8 tid);
|
||||
void mt7603_mac_tx_ba_reset(struct mt7603_dev *dev, int wcid, int tid, int ssn,
|
||||
int ba_size);
|
||||
|
||||
Reference in New Issue
Block a user