Skip to content

Commit 8916e4e

Browse files
committed
mt76: mt76x02: improve reliability of the beacon hang check
Increment the counter only when writing beacons to the hardware in order to avoid triggering restarts if beacons are disabled. Additionally, avoid resetting the MAC if stopping it failed Signed-off-by: Felix Fietkau <[email protected]>
1 parent df6b739 commit 8916e4e

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

drivers/net/wireless/mediatek/mt76/mt76x02_beacon.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,11 @@ void mt76x02_mac_set_beacon(struct mt76x02_dev *dev,
5757
int bcn_len = dev->beacon_ops->slot_size;
5858
int bcn_addr = MT_BEACON_BASE + (bcn_len * dev->beacon_data_count);
5959

60-
if (!mt76x02_write_beacon(dev, bcn_addr, skb))
60+
if (!mt76x02_write_beacon(dev, bcn_addr, skb)) {
61+
if (!dev->beacon_data_count)
62+
dev->beacon_hang_check++;
6163
dev->beacon_data_count++;
64+
}
6265
dev_kfree_skb(skb);
6366
}
6467
EXPORT_SYMBOL_GPL(mt76x02_mac_set_beacon);
@@ -74,6 +77,7 @@ void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
7477
if (!dev->mt76.beacon_mask)
7578
dev->tbtt_count = 0;
7679

80+
dev->beacon_hang_check = 0;
7781
if (enable) {
7882
dev->mt76.beacon_mask |= BIT(mvif->idx);
7983
} else {

drivers/net/wireless/mediatek/mt76/mt76x02_mac.c

+8-3
Original file line numberDiff line numberDiff line change
@@ -1044,10 +1044,9 @@ static void mt76x02_check_mac_err(struct mt76x02_dev *dev)
10441044
return;
10451045
}
10461046

1047-
if (++dev->beacon_hang_check < 10)
1047+
if (dev->beacon_hang_check < 10)
10481048
return;
10491049

1050-
dev->beacon_hang_check = 0;
10511050
} else {
10521051
u32 val = mt76_rr(dev, 0x10f4);
10531052
if (!(val & BIT(29)) || !(val & (BIT(7) | BIT(5))))
@@ -1057,10 +1056,16 @@ static void mt76x02_check_mac_err(struct mt76x02_dev *dev)
10571056
dev_err(dev->mt76.dev, "MAC error detected\n");
10581057

10591058
mt76_wr(dev, MT_MAC_SYS_CTRL, 0);
1060-
mt76x02_wait_for_txrx_idle(&dev->mt76);
1059+
if (!mt76x02_wait_for_txrx_idle(&dev->mt76)) {
1060+
dev_err(dev->mt76.dev, "MAC stop failed\n");
1061+
goto out;
1062+
}
10611063

1064+
dev->beacon_hang_check = 0;
10621065
mt76_set(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR);
10631066
udelay(10);
1067+
1068+
out:
10641069
mt76_wr(dev, MT_MAC_SYS_CTRL,
10651070
MT_MAC_SYS_CTRL_ENABLE_TX | MT_MAC_SYS_CTRL_ENABLE_RX);
10661071
}

0 commit comments

Comments
 (0)