Message ID | 1422998473-3709-1-git-send-email-ryazanov.s.a@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Kalle Valo |
Headers | show |
> Sometimes while CPU have some load and ath5k doing the wireless > interface reset the whole WiSoC completely freezes. Set of tests shows > that using atomic delay function while we wait interface reset helps to > avoid such freezes. > > The easiest way to reproduce this issue: create a station interface, > start continous scan with wpa_supplicant and load CPU by something. Or > just create multiple station interfaces and put them all in continous > scan. > > This patch partially reverts the commit 1846ac3dbec0 ("ath5k: Use > usleep_range where possible"), which replaces initial udelay() > by usleep_range(). > > I do not know actual source of this issue, but all looks like that HW > freeze is caused by transaction on internal SoC bus, while wireless > block is in reset state. > > Also I should note that I do not know how many chips are affected, but I > did not see this issue with chips, other than AR5312. > > CC: Jiri Slaby <jirislaby@gmail.com> > CC: Nick Kossifidis <mickflemm@gmail.com> > CC: Luis R. Rodriguez <mcgrof@do-not-panic.com> > Fixes: 1846ac3dbec0 ("ath5k: Use usleep_range where possible") > Reported-by: Christophe Prevotaux <c.prevotaux@rural-networks.com> > Tested-by: Christophe Prevotaux <c.prevotaux@rural-networks.com> > Tested-by: Eric Bree <ebree@nltinc.com> > Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com> Thanks, applied to wireless-drivers-next.git. Kalle Valo -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c index a3399c4..b9b651e 100644 --- a/drivers/net/wireless/ath/ath5k/reset.c +++ b/drivers/net/wireless/ath/ath5k/reset.c @@ -478,7 +478,7 @@ ath5k_hw_wisoc_reset(struct ath5k_hw *ah, u32 flags) regval = ioread32(reg); iowrite32(regval | val, reg); regval = ioread32(reg); - usleep_range(100, 150); + udelay(100); /* NB: should be atomic */ /* Bring BB/MAC out of reset */ iowrite32(regval & ~val, reg);