Message ID | 20220722115632.620681-2-alvin@pqrs.dk |
---|---|
State | New |
Headers | show |
Series | brcmfmac: fixes from Cypress/Infineon | expand |
Alvin Šipraga <alvin@pqrs.dk> wrote: > From: Wright Feng <wright.feng@cypress.com> > > The race condition in brcmf_msgbuf_txflow and brcmf_msgbuf_delete_flowring > makes tx_msghdr writing after brcmf_msgbuf_remove_flowring. Host > driver should delete flowring after txflow complete and all txstatus back, > or pend_8021x_cnt will never be zero and cause every connection 950 > milliseconds(MAX_WAIT_FOR_8021X_TX) delay. > > Signed-off-by: Wright Feng <wright.feng@cypress.com> > Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com> > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk> 5 patches applied to wireless-next.git, thanks. 0fa24196e425 wifi: brcmfmac: fix continuous 802.1x tx pending timeout error 09be7546a602 wifi: brcmfmac: fix scheduling while atomic issue when deleting flowring aa666b68e73f wifi: brcmfmac: fix invalid address access when enabling SCAN log level 5606aeaad01e wifi: brcmfmac: Fix to add brcmf_clear_assoc_ies when rmmod 2eee3db784a0 wifi: brcmfmac: Fix to add skb free for TIM update info when tx is completed
Hi Kalle, On Wed, Aug 10, 2022 at 05:48:01AM +0000, Kalle Valo wrote: > Alvin Šipraga <alvin@pqrs.dk> wrote: > > > From: Wright Feng <wright.feng@cypress.com> > > > > The race condition in brcmf_msgbuf_txflow and brcmf_msgbuf_delete_flowring > > makes tx_msghdr writing after brcmf_msgbuf_remove_flowring. Host > > driver should delete flowring after txflow complete and all txstatus back, > > or pend_8021x_cnt will never be zero and cause every connection 950 > > milliseconds(MAX_WAIT_FOR_8021X_TX) delay. > > > > Signed-off-by: Wright Feng <wright.feng@cypress.com> > > Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com> > > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > > Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk> > > 5 patches applied to wireless-next.git, thanks. > > 0fa24196e425 wifi: brcmfmac: fix continuous 802.1x tx pending timeout error > 09be7546a602 wifi: brcmfmac: fix scheduling while atomic issue when deleting flowring > aa666b68e73f wifi: brcmfmac: fix invalid address access when enabling SCAN log level > 5606aeaad01e wifi: brcmfmac: Fix to add brcmf_clear_assoc_ies when rmmod > 2eee3db784a0 wifi: brcmfmac: Fix to add skb free for TIM update info when tx is completed Thanks. Do you mind elaborating on why the 6th patch: brcmfmac: Update SSID of hidden AP while informing its bss to cfg80211 layer was not applied? Kind regards, Alvin
Alvin Šipraga <ALSI@bang-olufsen.dk> writes: > Hi Kalle, > > On Wed, Aug 10, 2022 at 05:48:01AM +0000, Kalle Valo wrote: >> Alvin Šipraga <alvin@pqrs.dk> wrote: >> >> > From: Wright Feng <wright.feng@cypress.com> >> > >> > The race condition in brcmf_msgbuf_txflow and brcmf_msgbuf_delete_flowring >> > makes tx_msghdr writing after brcmf_msgbuf_remove_flowring. Host >> > driver should delete flowring after txflow complete and all txstatus back, >> > or pend_8021x_cnt will never be zero and cause every connection 950 >> > milliseconds(MAX_WAIT_FOR_8021X_TX) delay. >> > >> > Signed-off-by: Wright Feng <wright.feng@cypress.com> >> > Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com> >> > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> >> > Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk> >> >> 5 patches applied to wireless-next.git, thanks. >> >> 0fa24196e425 wifi: brcmfmac: fix continuous 802.1x tx pending timeout error >> 09be7546a602 wifi: brcmfmac: fix scheduling while atomic issue when >> deleting flowring >> aa666b68e73f wifi: brcmfmac: fix invalid address access when enabling SCAN log level >> 5606aeaad01e wifi: brcmfmac: Fix to add brcmf_clear_assoc_ies when rmmod >> 2eee3db784a0 wifi: brcmfmac: Fix to add skb free for TIM update info >> when tx is completed > > Thanks. Do you mind elaborating on why the 6th patch: > > brcmfmac: Update SSID of hidden AP while informing its bss to cfg80211 layer > > was not applied? Because of mismatch between From and s-o-b. I will look at that in detail after my vacation.
On Wed, Aug 17, 2022 at 01:41:47PM +0300, Kalle Valo wrote: > Alvin Šipraga <ALSI@bang-olufsen.dk> writes: > > > Hi Kalle, > > > > On Wed, Aug 10, 2022 at 05:48:01AM +0000, Kalle Valo wrote: > >> Alvin Šipraga <alvin@pqrs.dk> wrote: > >> > >> > From: Wright Feng <wright.feng@cypress.com> > >> > > >> > The race condition in brcmf_msgbuf_txflow and brcmf_msgbuf_delete_flowring > >> > makes tx_msghdr writing after brcmf_msgbuf_remove_flowring. Host > >> > driver should delete flowring after txflow complete and all txstatus back, > >> > or pend_8021x_cnt will never be zero and cause every connection 950 > >> > milliseconds(MAX_WAIT_FOR_8021X_TX) delay. > >> > > >> > Signed-off-by: Wright Feng <wright.feng@cypress.com> > >> > Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com> > >> > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > >> > Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk> > >> > >> 5 patches applied to wireless-next.git, thanks. > >> > >> 0fa24196e425 wifi: brcmfmac: fix continuous 802.1x tx pending timeout error > >> 09be7546a602 wifi: brcmfmac: fix scheduling while atomic issue when > >> deleting flowring > >> aa666b68e73f wifi: brcmfmac: fix invalid address access when enabling SCAN log level > >> 5606aeaad01e wifi: brcmfmac: Fix to add brcmf_clear_assoc_ies when rmmod > >> 2eee3db784a0 wifi: brcmfmac: Fix to add skb free for TIM update info > >> when tx is completed > > > > Thanks. Do you mind elaborating on why the 6th patch: > > > > brcmfmac: Update SSID of hidden AP while informing its bss to cfg80211 layer > > > > was not applied? > > Because of mismatch between From and s-o-b. I will look at that in > detail after my vacation. OK, thanks. FYI Syed has left Infineon - not sure what his new email is...
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index 87aef211b35f..8ca259ace001 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c @@ -1484,8 +1484,10 @@ int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp) !brcmf_get_pend_8021x_cnt(ifp), MAX_WAIT_FOR_8021X_TX); - if (!err) + if (!err) { bphy_err(drvr, "Timed out waiting for no pending 802.1x packets\n"); + atomic_set(&ifp->pend_8021x_cnt, 0); + } return !err; } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c index b2d0f7570aa9..174584b42972 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c @@ -71,6 +71,7 @@ #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS 32 #define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS 48 +#define BRCMF_MAX_TXSTATUS_WAIT_RETRIES 10 struct msgbuf_common_hdr { u8 msgtype; @@ -806,8 +807,12 @@ static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx, flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx); if (flowid == BRCMF_FLOWRING_INVALID_ID) { flowid = brcmf_msgbuf_flowring_create(msgbuf, ifidx, skb); - if (flowid == BRCMF_FLOWRING_INVALID_ID) + if (flowid == BRCMF_FLOWRING_INVALID_ID) { return -ENOMEM; + } else { + brcmf_flowring_enqueue(flow, flowid, skb); + return 0; + } } queue_count = brcmf_flowring_enqueue(flow, flowid, skb); force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0); @@ -1395,9 +1400,25 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid) struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; struct msgbuf_tx_flowring_delete_req *delete; struct brcmf_commonring *commonring; + struct brcmf_commonring *commonring_del; + void *ret_ptr; u8 ifidx; int err; + int retry = BRCMF_MAX_TXSTATUS_WAIT_RETRIES; + + /* wait for commonring txflow finished */ + commonring_del = msgbuf->flowrings[flowid]; + brcmf_commonring_lock(commonring_del); + while (retry && atomic_read(&commonring_del->outstanding_tx)) { + usleep_range(5000, 10000); + retry--; + } + brcmf_commonring_unlock(commonring_del); + if (!retry && atomic_read(&commonring_del->outstanding_tx)) { + brcmf_err("timed out waiting for txstatus\n"); + atomic_set(&commonring_del->outstanding_tx, 0); + } /* no need to submit if firmware can not be reached */ if (drvr->bus_if->state != BRCMF_BUS_UP) {