mt76x0: use mt76x02_mac_work as stats handler
Use mt76x02_mac_work utility routine as stats workqueue handler and remove duplicated code. Moreover run mac stuck check in mt76x02_mac_work for client interfaces. Remove no longer used avg_ampdu_len and mt76x02_mac_stats data structure in mt76x02_dev Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
63f15d9459
commit
73556561ab
@ -339,7 +339,6 @@ mt76x0_alloc_device(struct device *pdev,
|
||||
|
||||
dev = container_of(mdev, struct mt76x02_dev, mt76);
|
||||
mutex_init(&dev->phy_mutex);
|
||||
atomic_set(&dev->avg_ampdu_len, 1);
|
||||
|
||||
return dev;
|
||||
}
|
||||
@ -378,7 +377,7 @@ int mt76x0_register_device(struct mt76x02_dev *dev)
|
||||
|
||||
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
||||
|
||||
INIT_DELAYED_WORK(&dev->mac_work, mt76x0_mac_work);
|
||||
INIT_DELAYED_WORK(&dev->mac_work, mt76x02_mac_work);
|
||||
|
||||
ret = mt76_register_device(mdev, true, mt76x02_rates,
|
||||
ARRAY_SIZE(mt76x02_rates));
|
||||
|
@ -105,74 +105,6 @@ void mt76x0_mac_config_tsf(struct mt76x02_dev *dev, bool enable, int interval)
|
||||
MT_BEACON_TIME_CFG_TBTT_EN;
|
||||
}
|
||||
|
||||
static void mt76x0_check_mac_err(struct mt76x02_dev *dev)
|
||||
{
|
||||
u32 val = mt76_rr(dev, 0x10f4);
|
||||
|
||||
if (!(val & BIT(29)) || !(val & (BIT(7) | BIT(5))))
|
||||
return;
|
||||
|
||||
dev_err(dev->mt76.dev, "Error: MAC specific condition occurred\n");
|
||||
|
||||
mt76_set(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR);
|
||||
udelay(10);
|
||||
mt76_clear(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR);
|
||||
}
|
||||
void mt76x0_mac_work(struct work_struct *work)
|
||||
{
|
||||
struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev,
|
||||
mac_work.work);
|
||||
struct {
|
||||
u32 addr_base;
|
||||
u32 span;
|
||||
u64 *stat_base;
|
||||
} spans[] = {
|
||||
{ MT_RX_STAT_0, 3, dev->stats.rx_stat },
|
||||
{ MT_TX_STA_0, 3, dev->stats.tx_stat },
|
||||
{ MT_TX_AGG_STAT, 1, dev->stats.aggr_stat },
|
||||
{ MT_MPDU_DENSITY_CNT, 1, dev->stats.zero_len_del },
|
||||
{ MT_TX_AGG_CNT_BASE0, 8, &dev->stats.aggr_n[0] },
|
||||
{ MT_TX_AGG_CNT_BASE1, 8, &dev->stats.aggr_n[16] },
|
||||
};
|
||||
u32 sum, n;
|
||||
int i, j, k;
|
||||
|
||||
mt76x02_update_channel(&dev->mt76);
|
||||
|
||||
/* Note: using MCU_RANDOM_READ is actually slower then reading all the
|
||||
* registers by hand. MCU takes ca. 20ms to complete read of 24
|
||||
* registers while reading them one by one will takes roughly
|
||||
* 24*200us =~ 5ms.
|
||||
*/
|
||||
|
||||
k = 0;
|
||||
n = 0;
|
||||
sum = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(spans); i++)
|
||||
for (j = 0; j < spans[i].span; j++) {
|
||||
u32 val = mt76_rr(dev, spans[i].addr_base + j * 4);
|
||||
|
||||
spans[i].stat_base[j * 2] += val & 0xffff;
|
||||
spans[i].stat_base[j * 2 + 1] += val >> 16;
|
||||
|
||||
/* Calculate average AMPDU length */
|
||||
if (spans[i].addr_base != MT_TX_AGG_CNT_BASE0 &&
|
||||
spans[i].addr_base != MT_TX_AGG_CNT_BASE1)
|
||||
continue;
|
||||
|
||||
n += (val >> 16) + (val & 0xffff);
|
||||
sum += (val & 0xffff) * (1 + k * 2) +
|
||||
(val >> 16) * (2 + k * 2);
|
||||
k++;
|
||||
}
|
||||
|
||||
atomic_set(&dev->avg_ampdu_len, n ? DIV_ROUND_CLOSEST(sum, n) : 1);
|
||||
|
||||
mt76x0_check_mac_err(dev);
|
||||
|
||||
ieee80211_queue_delayed_work(dev->mt76.hw, &dev->mac_work, 10 * HZ);
|
||||
}
|
||||
|
||||
void mt76x0_mac_set_ampdu_factor(struct mt76x02_dev *dev)
|
||||
{
|
||||
struct ieee80211_sta *sta;
|
||||
|
@ -69,7 +69,6 @@ void mt76x0_phy_set_txpower(struct mt76x02_dev *dev);
|
||||
void mt76x0_phy_calibrate(struct mt76x02_dev *dev, bool power_on);
|
||||
|
||||
/* MAC */
|
||||
void mt76x0_mac_work(struct work_struct *work);
|
||||
void mt76x0_mac_set_protection(struct mt76x02_dev *dev, bool legacy_prot,
|
||||
int ht_mode);
|
||||
void mt76x0_mac_set_short_preamble(struct mt76x02_dev *dev, bool short_preamb);
|
||||
|
@ -28,14 +28,6 @@
|
||||
|
||||
#define MT_CALIBRATE_INTERVAL HZ
|
||||
|
||||
struct mt76x02_mac_stats {
|
||||
u64 rx_stat[6];
|
||||
u64 tx_stat[6];
|
||||
u64 aggr_stat[2];
|
||||
u64 aggr_n[32];
|
||||
u64 zero_len_del[2];
|
||||
};
|
||||
|
||||
#define MT_MAX_CHAINS 2
|
||||
struct mt76x02_rx_freq_cal {
|
||||
s8 high_gain[MT_MAX_CHAINS];
|
||||
@ -85,8 +77,6 @@ struct mt76x02_dev {
|
||||
struct delayed_work cal_work;
|
||||
struct delayed_work mac_work;
|
||||
|
||||
struct mt76x02_mac_stats stats;
|
||||
atomic_t avg_ampdu_len;
|
||||
u32 aggr_stats[32];
|
||||
|
||||
struct sk_buff *beacons[8];
|
||||
|
@ -754,6 +754,21 @@ void mt76x02_update_channel(struct mt76_dev *mdev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76x02_update_channel);
|
||||
|
||||
static void mt76x02_check_mac_err(struct mt76x02_dev *dev)
|
||||
{
|
||||
u32 val = mt76_rr(dev, 0x10f4);
|
||||
|
||||
if (!(val & BIT(29)) || !(val & (BIT(7) | BIT(5))))
|
||||
return;
|
||||
|
||||
dev_err(dev->mt76.dev, "mac specific condition occurred\n");
|
||||
|
||||
mt76_set(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR);
|
||||
udelay(10);
|
||||
mt76_clear(dev, MT_MAC_SYS_CTRL,
|
||||
MT_MAC_SYS_CTRL_ENABLE_TX | MT_MAC_SYS_CTRL_ENABLE_RX);
|
||||
}
|
||||
|
||||
void mt76x02_mac_work(struct work_struct *work)
|
||||
{
|
||||
struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev,
|
||||
@ -768,6 +783,10 @@ void mt76x02_mac_work(struct work_struct *work)
|
||||
dev->aggr_stats[idx++] += val >> 16;
|
||||
}
|
||||
|
||||
/* XXX: check beacon stuck for ap mode */
|
||||
if (!dev->beacon_mask)
|
||||
mt76x02_check_mac_err(dev);
|
||||
|
||||
ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mac_work,
|
||||
MT_CALIBRATE_INTERVAL);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user