On Sat, Oct 28, 2023 at 08:15:32PM +0800, Shiji Yang wrote: > When a hardware reset is triggered, all registers are reset, so all > queues are forced to stop in hardware interface. However, mac80211 > will not automatically stop the queue. If we don't manually stop the > beacon queue, the queue will be deadlocked and unable to start again. > This patch fixes the issue where Apple devices cannot connect to the > AP after calling ieee80211_restart_hw(). Should not this be solved in mac80211 then? ieee80211_restart_work does a lot o diffrent things, why beconing is not also stoped/started there ? Regards Stanislaw > Signed-off-by: Shiji Yang <yangshiji66@xxxxxxxxxxx> > --- > drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 3 +++ > drivers/net/wireless/ralink/rt2x00/rt2x00mac.c | 4 +++- > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c > index 9a9cfd0ce..ac58a56c3 100644 > --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c > +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c > @@ -101,6 +101,8 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) > rt2x00link_stop_tuner(rt2x00dev); > rt2x00queue_stop_queues(rt2x00dev); > rt2x00queue_flush_queues(rt2x00dev, true); > + if (test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags)) > + rt2x00queue_stop_queue(rt2x00dev->bcn); > > /* > * Disable radio. > @@ -1286,6 +1288,7 @@ int rt2x00lib_start(struct rt2x00_dev *rt2x00dev) > rt2x00dev->intf_ap_count = 0; > rt2x00dev->intf_sta_count = 0; > rt2x00dev->intf_associated = 0; > + rt2x00dev->intf_beaconing = 0; > > /* Enable the radio */ > retval = rt2x00lib_enable_radio(rt2x00dev); > diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c > index 4202c6517..6fcbf534a 100644 > --- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c > +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c > @@ -615,7 +615,9 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, > * and keep it running on other interfaces. > */ > rt2x00queue_clear_beacon(rt2x00dev, vif); > - } else if (bss_conf->enable_beacon && !intf->enable_beacon) { > + } else if (bss_conf->enable_beacon && > + (!intf->enable_beacon || > + test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags))) { > rt2x00dev->intf_beaconing++; > intf->enable_beacon = true; > /* > -- > 2.39.2 >