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);
|
dev = container_of(mdev, struct mt76x02_dev, mt76);
|
||||||
mutex_init(&dev->phy_mutex);
|
mutex_init(&dev->phy_mutex);
|
||||||
atomic_set(&dev->avg_ampdu_len, 1);
|
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
@ -378,7 +377,7 @@ int mt76x0_register_device(struct mt76x02_dev *dev)
|
|||||||
|
|
||||||
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
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,
|
ret = mt76_register_device(mdev, true, mt76x02_rates,
|
||||||
ARRAY_SIZE(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;
|
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)
|
void mt76x0_mac_set_ampdu_factor(struct mt76x02_dev *dev)
|
||||||
{
|
{
|
||||||
struct ieee80211_sta *sta;
|
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);
|
void mt76x0_phy_calibrate(struct mt76x02_dev *dev, bool power_on);
|
||||||
|
|
||||||
/* MAC */
|
/* MAC */
|
||||||
void mt76x0_mac_work(struct work_struct *work);
|
|
||||||
void mt76x0_mac_set_protection(struct mt76x02_dev *dev, bool legacy_prot,
|
void mt76x0_mac_set_protection(struct mt76x02_dev *dev, bool legacy_prot,
|
||||||
int ht_mode);
|
int ht_mode);
|
||||||
void mt76x0_mac_set_short_preamble(struct mt76x02_dev *dev, bool short_preamb);
|
void mt76x0_mac_set_short_preamble(struct mt76x02_dev *dev, bool short_preamb);
|
||||||
|
@ -28,14 +28,6 @@
|
|||||||
|
|
||||||
#define MT_CALIBRATE_INTERVAL HZ
|
#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
|
#define MT_MAX_CHAINS 2
|
||||||
struct mt76x02_rx_freq_cal {
|
struct mt76x02_rx_freq_cal {
|
||||||
s8 high_gain[MT_MAX_CHAINS];
|
s8 high_gain[MT_MAX_CHAINS];
|
||||||
@ -85,8 +77,6 @@ struct mt76x02_dev {
|
|||||||
struct delayed_work cal_work;
|
struct delayed_work cal_work;
|
||||||
struct delayed_work mac_work;
|
struct delayed_work mac_work;
|
||||||
|
|
||||||
struct mt76x02_mac_stats stats;
|
|
||||||
atomic_t avg_ampdu_len;
|
|
||||||
u32 aggr_stats[32];
|
u32 aggr_stats[32];
|
||||||
|
|
||||||
struct sk_buff *beacons[8];
|
struct sk_buff *beacons[8];
|
||||||
|
@ -754,6 +754,21 @@ void mt76x02_update_channel(struct mt76_dev *mdev)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mt76x02_update_channel);
|
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)
|
void mt76x02_mac_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev,
|
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;
|
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,
|
ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mac_work,
|
||||||
MT_CALIBRATE_INTERVAL);
|
MT_CALIBRATE_INTERVAL);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user