Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mt76x02: improve mac error check/reset reliability

On AP mode devices, check beacon tx counters to detect MAC errors.
When an error is detected, stop the MAC before resetting it

Signed-off-by: Felix Fietkau <nbd@nbd.name>

+22 -6
+1
drivers/net/wireless/mediatek/mt76/mt76x02.h
··· 104 104 105 105 u32 tx_hang_reset; 106 106 u8 tx_hang_check; 107 + u8 beacon_hang_check; 107 108 u8 mcu_timeout; 108 109 109 110 struct mt76x02_calibration cal;
+19 -6
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
··· 1040 1040 1041 1041 static void mt76x02_check_mac_err(struct mt76x02_dev *dev) 1042 1042 { 1043 - u32 val = mt76_rr(dev, 0x10f4); 1043 + if (dev->mt76.beacon_mask) { 1044 + if (mt76_rr(dev, MT_TX_STA_0) & MT_TX_STA_0_BEACONS) { 1045 + dev->beacon_hang_check = 0; 1046 + return; 1047 + } 1044 1048 1045 - if (!(val & BIT(29)) || !(val & (BIT(7) | BIT(5)))) 1046 - return; 1049 + if (++dev->beacon_hang_check < 10) 1050 + return; 1047 1051 1048 - dev_err(dev->mt76.dev, "mac specific condition occurred\n"); 1052 + dev->beacon_hang_check = 0; 1053 + } else { 1054 + u32 val = mt76_rr(dev, 0x10f4); 1055 + if (!(val & BIT(29)) || !(val & (BIT(7) | BIT(5)))) 1056 + return; 1057 + } 1058 + 1059 + dev_err(dev->mt76.dev, "MAC error detected\n"); 1060 + 1061 + mt76_wr(dev, MT_MAC_SYS_CTRL, 0); 1062 + mt76x02_wait_for_txrx_idle(&dev->mt76); 1049 1063 1050 1064 mt76_set(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR); 1051 1065 udelay(10); ··· 1192 1178 dev->mt76.aggr_stats[idx++] += val >> 16; 1193 1179 } 1194 1180 1195 - if (!dev->mt76.beacon_mask) 1196 - mt76x02_check_mac_err(dev); 1181 + mt76x02_check_mac_err(dev); 1197 1182 1198 1183 if (dev->ed_monitor) 1199 1184 mt76x02_edcca_check(dev);
+2
drivers/net/wireless/mediatek/mt76/mt76x02_regs.h
··· 571 571 #define MT_RX_STAT_2_OVERFLOW_ERRORS GENMASK(31, 16) 572 572 573 573 #define MT_TX_STA_0 0x170c 574 + #define MT_TX_STA_0_BEACONS GENMASK(31, 16) 575 + 574 576 #define MT_TX_STA_1 0x1710 575 577 #define MT_TX_STA_2 0x1714 576 578