mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
mt76x2: introduce mt76x2_mac_load_tx_status routine
Add mt76x2_mac_load_tx_status routine since tx stats register map is shared between usb and pci based devices but usb devices do not have a tx stat irq line as pcie ones and it is necessary to load tx statistics using a workqueue Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
4681e0c79e
commit
d3c94b4046
@ -532,11 +532,37 @@ mt76x2_send_tx_status(struct mt76x2_dev *dev, struct mt76x2_tx_status *stat,
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static bool
|
||||
mt76x2_mac_load_tx_status(struct mt76x2_dev *dev,
|
||||
struct mt76x2_tx_status *stat)
|
||||
{
|
||||
u32 stat1, stat2;
|
||||
|
||||
stat2 = mt76_rr(dev, MT_TX_STAT_FIFO_EXT);
|
||||
stat1 = mt76_rr(dev, MT_TX_STAT_FIFO);
|
||||
|
||||
stat->valid = !!(stat1 & MT_TX_STAT_FIFO_VALID);
|
||||
if (!stat->valid)
|
||||
return false;
|
||||
|
||||
stat->success = !!(stat1 & MT_TX_STAT_FIFO_SUCCESS);
|
||||
stat->aggr = !!(stat1 & MT_TX_STAT_FIFO_AGGR);
|
||||
stat->ack_req = !!(stat1 & MT_TX_STAT_FIFO_ACKREQ);
|
||||
stat->wcid = FIELD_GET(MT_TX_STAT_FIFO_WCID, stat1);
|
||||
stat->rate = FIELD_GET(MT_TX_STAT_FIFO_RATE, stat1);
|
||||
|
||||
stat->retry = FIELD_GET(MT_TX_STAT_FIFO_EXT_RETRY, stat2);
|
||||
stat->pktid = FIELD_GET(MT_TX_STAT_FIFO_EXT_PKTID, stat2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void mt76x2_mac_poll_tx_status(struct mt76x2_dev *dev, bool irq)
|
||||
{
|
||||
struct mt76x2_tx_status stat = {};
|
||||
unsigned long flags;
|
||||
u8 update = 1;
|
||||
bool ret;
|
||||
|
||||
if (!test_bit(MT76_STATE_RUNNING, &dev->mt76.state))
|
||||
return;
|
||||
@ -544,26 +570,13 @@ void mt76x2_mac_poll_tx_status(struct mt76x2_dev *dev, bool irq)
|
||||
trace_mac_txstat_poll(dev);
|
||||
|
||||
while (!irq || !kfifo_is_full(&dev->txstatus_fifo)) {
|
||||
u32 stat1, stat2;
|
||||
|
||||
spin_lock_irqsave(&dev->irq_lock, flags);
|
||||
stat2 = mt76_rr(dev, MT_TX_STAT_FIFO_EXT);
|
||||
stat1 = mt76_rr(dev, MT_TX_STAT_FIFO);
|
||||
if (!(stat1 & MT_TX_STAT_FIFO_VALID)) {
|
||||
spin_unlock_irqrestore(&dev->irq_lock, flags);
|
||||
break;
|
||||
}
|
||||
|
||||
ret = mt76x2_mac_load_tx_status(dev, &stat);
|
||||
spin_unlock_irqrestore(&dev->irq_lock, flags);
|
||||
|
||||
stat.valid = 1;
|
||||
stat.success = !!(stat1 & MT_TX_STAT_FIFO_SUCCESS);
|
||||
stat.aggr = !!(stat1 & MT_TX_STAT_FIFO_AGGR);
|
||||
stat.ack_req = !!(stat1 & MT_TX_STAT_FIFO_ACKREQ);
|
||||
stat.wcid = FIELD_GET(MT_TX_STAT_FIFO_WCID, stat1);
|
||||
stat.rate = FIELD_GET(MT_TX_STAT_FIFO_RATE, stat1);
|
||||
stat.retry = FIELD_GET(MT_TX_STAT_FIFO_EXT_RETRY, stat2);
|
||||
stat.pktid = FIELD_GET(MT_TX_STAT_FIFO_EXT_PKTID, stat2);
|
||||
if (!ret)
|
||||
break;
|
||||
|
||||
trace_mac_txstat_fetch(dev, &stat);
|
||||
|
||||
if (!irq) {
|
||||
|
Loading…
Reference in New Issue
Block a user