From: Lorenzo Bianconi <lorenzo@kernel.org> To: sean.wang@mediatek.com Cc: nbd@nbd.name, lorenzo.bianconi@redhat.com, Soul.Huang@mediatek.com, YN.Chen@mediatek.com, Leon.Yen@mediatek.com, Eric-SY.Chang@mediatek.com, Deren.Wu@mediatek.com, km.lin@mediatek.com, robin.chiu@mediatek.com, ch.yeh@mediatek.com, posh.sun@mediatek.com, Eric.Liang@mediatek.com, Stella.Chang@mediatek.com, jemele@google.com, yenlinlai@google.com, linux-wireless@vger.kernel.org, linux-mediatek@lists.infradead.org Subject: Re: [PATCH v3 2/2] mt76: mt7921: fix sta_state incorrect implementation Date: Thu, 3 Jun 2021 10:36:56 +0200 [thread overview] Message-ID: <YLiUqHHsVF2ZqL+1@lore-desk> (raw) In-Reply-To: <e0a33a31da8a69dcf13d30e2d2591329c8d33689.1622688431.git.objelf@gmail.com> [-- Attachment #1: Type: text/plain, Size: 7727 bytes --] > From: Sean Wang <sean.wang@mediatek.com> > > When .sta_state is implemented, mac80211 assumes that the station entry is > usable after the NOTEXIST->NONE transition. > > So we should create the sta entry as early as possible in order that > mac80211 pass assoc/auth frames to mt76 with the newly created sta entry, > and add .sta_assoc to mt76 core to refresh the sta entry again when sta is > being associated. > > Fixes: 8aa5a9b7361c ("mt76: mt7921: enable deep sleep at runtime") > Signed-off-by: Sean Wang <sean.wang@mediatek.com> > --- > v1->v2: Put back the careless change not belonged to the patch to keep > mt7921_mcu_sta_add for BC entry and mt76_connac_mcu_uni_add_bss > on the association. > v2->v3: 1. rebase the latest mt76 > 2. squashing 2/3 to the one > 3. add the proper lock in mt7921_mac_sta_assoc > --- > .../net/wireless/mediatek/mt76/mt7921/main.c | 55 ++++++++----------- > .../net/wireless/mediatek/mt76/mt7921/mcu.c | 20 +++++++ > .../wireless/mediatek/mt76/mt7921/mt7921.h | 4 ++ > .../net/wireless/mediatek/mt76/mt7921/pci.c | 1 + > 4 files changed, 49 insertions(+), 31 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c > index c641a92b140c..af98835b5134 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c > @@ -618,18 +618,14 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, > if (ret) > return ret; > > - if (vif->type == NL80211_IFTYPE_STATION) { > + if (vif->type == NL80211_IFTYPE_STATION) > mvif->wep_sta = msta; > - if (!sta->tdls) > - mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, > - &mvif->sta.wcid, true); > - } > > mt7921_mac_wtbl_update(dev, idx, > MT_WTBL_UPDATE_ADM_COUNT_CLEAR); > > ret = mt7921_mcu_sta_add(dev, sta, vif, true, > - MT76_STA_INFO_STATE_ASSOC); > + MT76_STA_INFO_STATE_NONE); > if (ret) > return ret; > > @@ -638,6 +634,27 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, > return 0; > } > > +void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif, > + struct ieee80211_sta *sta) > +{ > + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); > + struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; > + struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; > + > + mt7921_mutex_acquire(dev); > + > + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) > + mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid, > + true); > + > + mt7921_mac_wtbl_update(dev, msta->wcid.idx, > + MT_WTBL_UPDATE_ADM_COUNT_CLEAR); > + > + mt7921_mcu_sta_update(dev, sta, vif, MT76_STA_INFO_STATE_ASSOC); > + > + mt7921_mutex_release(dev); > +} > + > void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, > struct ieee80211_sta *sta) > { > @@ -793,22 +810,6 @@ mt7921_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, > return ret; > } > > -static int > -mt7921_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, > - struct ieee80211_sta *sta) > -{ > - return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NOTEXIST, > - IEEE80211_STA_NONE); > -} > - > -static int > -mt7921_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, > - struct ieee80211_sta *sta) > -{ > - return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NONE, > - IEEE80211_STA_NOTEXIST); > -} > - > static int mt7921_sta_state(struct ieee80211_hw *hw, > struct ieee80211_vif *vif, > struct ieee80211_sta *sta, > @@ -823,15 +824,7 @@ static int mt7921_sta_state(struct ieee80211_hw *hw, > mt7921_mutex_release(dev); > } > > - if (old_state == IEEE80211_STA_AUTH && > - new_state == IEEE80211_STA_ASSOC) { > - return mt7921_sta_add(hw, vif, sta); > - } else if (old_state == IEEE80211_STA_ASSOC && > - new_state == IEEE80211_STA_AUTH) { > - return mt7921_sta_remove(hw, vif, sta); > - } > - > - return 0; > + return mt76_sta_state(hw, vif, sta, old_state, new_state); > } > > static int > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > index 4f0fd9674950..ab338bdf4f4a 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > @@ -1289,6 +1289,26 @@ int mt7921_mcu_sta_add(struct mt7921_dev *dev, struct ieee80211_sta *sta, > return mt76_connac_mcu_add_sta_cmd(&dev->mphy, &info); > } > > +int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta, > + struct ieee80211_vif *vif, u8 state) > +{ > + struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; > + int rssi = -ewma_rssi_read(&mvif->rssi); > + struct mt76_sta_cmd_info info = { > + .sta = sta, > + .vif = vif, > + .enable = true, > + .state = state, > + .cmd = MCU_UNI_CMD_STA_REC_UPDATE, > + .rcpi = to_rcpi(rssi), > + }; > + struct mt7921_sta *msta; > + > + msta = sta ? (struct mt7921_sta *)sta->drv_priv : NULL; > + info.wcid = msta ? &msta->wcid : &mvif->sta.wcid; > + return mt76_connac_mcu_update_sta_cmd(&dev->mphy, &info); It seems to me it is quite the same of mt7921_mcu_sta_add, right? Why not always use mt7921_mcu_sta_update? Regards, Lorenzo > +} > + > int __mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev) > { > struct mt76_phy *mphy = &dev->mt76.phy; > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > index d4d84b898011..196e47f89fc1 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > @@ -265,6 +265,8 @@ int mt7921_set_channel(struct mt7921_phy *phy); > int mt7921_mcu_sta_add(struct mt7921_dev *dev, struct ieee80211_sta *sta, > struct ieee80211_vif *vif, bool enable, > enum mt76_sta_info_state state); > +int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta, > + struct ieee80211_vif *vif, u8 state); > int mt7921_mcu_set_chan_info(struct mt7921_phy *phy, int cmd); > int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif); > int mt7921_mcu_set_eeprom(struct mt7921_dev *dev); > @@ -336,6 +338,8 @@ void mt7921_mac_fill_rx_vector(struct mt7921_dev *dev, struct sk_buff *skb); > void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb); > int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, > struct ieee80211_sta *sta); > +void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif, > + struct ieee80211_sta *sta); > void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, > struct ieee80211_sta *sta); > void mt7921_mac_work(struct work_struct *work); > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > index 13263f50dc00..27906b2cd912 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > @@ -106,6 +106,7 @@ static int mt7921_pci_probe(struct pci_dev *pdev, > .rx_poll_complete = mt7921_rx_poll_complete, > .sta_ps = mt7921_sta_ps, > .sta_add = mt7921_mac_sta_add, > + .sta_assoc = mt7921_mac_sta_assoc, > .sta_remove = mt7921_mac_sta_remove, > .update_survey = mt7921_update_channel, > }; > -- > 2.25.1 > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Lorenzo Bianconi <lorenzo@kernel.org> To: sean.wang@mediatek.com Cc: nbd@nbd.name, lorenzo.bianconi@redhat.com, Soul.Huang@mediatek.com, YN.Chen@mediatek.com, Leon.Yen@mediatek.com, Eric-SY.Chang@mediatek.com, Deren.Wu@mediatek.com, km.lin@mediatek.com, robin.chiu@mediatek.com, ch.yeh@mediatek.com, posh.sun@mediatek.com, Eric.Liang@mediatek.com, Stella.Chang@mediatek.com, jemele@google.com, yenlinlai@google.com, linux-wireless@vger.kernel.org, linux-mediatek@lists.infradead.org Subject: Re: [PATCH v3 2/2] mt76: mt7921: fix sta_state incorrect implementation Date: Thu, 3 Jun 2021 10:36:56 +0200 [thread overview] Message-ID: <YLiUqHHsVF2ZqL+1@lore-desk> (raw) In-Reply-To: <e0a33a31da8a69dcf13d30e2d2591329c8d33689.1622688431.git.objelf@gmail.com> [-- Attachment #1.1: Type: text/plain, Size: 7727 bytes --] > From: Sean Wang <sean.wang@mediatek.com> > > When .sta_state is implemented, mac80211 assumes that the station entry is > usable after the NOTEXIST->NONE transition. > > So we should create the sta entry as early as possible in order that > mac80211 pass assoc/auth frames to mt76 with the newly created sta entry, > and add .sta_assoc to mt76 core to refresh the sta entry again when sta is > being associated. > > Fixes: 8aa5a9b7361c ("mt76: mt7921: enable deep sleep at runtime") > Signed-off-by: Sean Wang <sean.wang@mediatek.com> > --- > v1->v2: Put back the careless change not belonged to the patch to keep > mt7921_mcu_sta_add for BC entry and mt76_connac_mcu_uni_add_bss > on the association. > v2->v3: 1. rebase the latest mt76 > 2. squashing 2/3 to the one > 3. add the proper lock in mt7921_mac_sta_assoc > --- > .../net/wireless/mediatek/mt76/mt7921/main.c | 55 ++++++++----------- > .../net/wireless/mediatek/mt76/mt7921/mcu.c | 20 +++++++ > .../wireless/mediatek/mt76/mt7921/mt7921.h | 4 ++ > .../net/wireless/mediatek/mt76/mt7921/pci.c | 1 + > 4 files changed, 49 insertions(+), 31 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c > index c641a92b140c..af98835b5134 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c > @@ -618,18 +618,14 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, > if (ret) > return ret; > > - if (vif->type == NL80211_IFTYPE_STATION) { > + if (vif->type == NL80211_IFTYPE_STATION) > mvif->wep_sta = msta; > - if (!sta->tdls) > - mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, > - &mvif->sta.wcid, true); > - } > > mt7921_mac_wtbl_update(dev, idx, > MT_WTBL_UPDATE_ADM_COUNT_CLEAR); > > ret = mt7921_mcu_sta_add(dev, sta, vif, true, > - MT76_STA_INFO_STATE_ASSOC); > + MT76_STA_INFO_STATE_NONE); > if (ret) > return ret; > > @@ -638,6 +634,27 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, > return 0; > } > > +void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif, > + struct ieee80211_sta *sta) > +{ > + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); > + struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; > + struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; > + > + mt7921_mutex_acquire(dev); > + > + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) > + mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid, > + true); > + > + mt7921_mac_wtbl_update(dev, msta->wcid.idx, > + MT_WTBL_UPDATE_ADM_COUNT_CLEAR); > + > + mt7921_mcu_sta_update(dev, sta, vif, MT76_STA_INFO_STATE_ASSOC); > + > + mt7921_mutex_release(dev); > +} > + > void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, > struct ieee80211_sta *sta) > { > @@ -793,22 +810,6 @@ mt7921_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, > return ret; > } > > -static int > -mt7921_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, > - struct ieee80211_sta *sta) > -{ > - return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NOTEXIST, > - IEEE80211_STA_NONE); > -} > - > -static int > -mt7921_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, > - struct ieee80211_sta *sta) > -{ > - return mt76_sta_state(hw, vif, sta, IEEE80211_STA_NONE, > - IEEE80211_STA_NOTEXIST); > -} > - > static int mt7921_sta_state(struct ieee80211_hw *hw, > struct ieee80211_vif *vif, > struct ieee80211_sta *sta, > @@ -823,15 +824,7 @@ static int mt7921_sta_state(struct ieee80211_hw *hw, > mt7921_mutex_release(dev); > } > > - if (old_state == IEEE80211_STA_AUTH && > - new_state == IEEE80211_STA_ASSOC) { > - return mt7921_sta_add(hw, vif, sta); > - } else if (old_state == IEEE80211_STA_ASSOC && > - new_state == IEEE80211_STA_AUTH) { > - return mt7921_sta_remove(hw, vif, sta); > - } > - > - return 0; > + return mt76_sta_state(hw, vif, sta, old_state, new_state); > } > > static int > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > index 4f0fd9674950..ab338bdf4f4a 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > @@ -1289,6 +1289,26 @@ int mt7921_mcu_sta_add(struct mt7921_dev *dev, struct ieee80211_sta *sta, > return mt76_connac_mcu_add_sta_cmd(&dev->mphy, &info); > } > > +int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta, > + struct ieee80211_vif *vif, u8 state) > +{ > + struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; > + int rssi = -ewma_rssi_read(&mvif->rssi); > + struct mt76_sta_cmd_info info = { > + .sta = sta, > + .vif = vif, > + .enable = true, > + .state = state, > + .cmd = MCU_UNI_CMD_STA_REC_UPDATE, > + .rcpi = to_rcpi(rssi), > + }; > + struct mt7921_sta *msta; > + > + msta = sta ? (struct mt7921_sta *)sta->drv_priv : NULL; > + info.wcid = msta ? &msta->wcid : &mvif->sta.wcid; > + return mt76_connac_mcu_update_sta_cmd(&dev->mphy, &info); It seems to me it is quite the same of mt7921_mcu_sta_add, right? Why not always use mt7921_mcu_sta_update? Regards, Lorenzo > +} > + > int __mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev) > { > struct mt76_phy *mphy = &dev->mt76.phy; > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > index d4d84b898011..196e47f89fc1 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > @@ -265,6 +265,8 @@ int mt7921_set_channel(struct mt7921_phy *phy); > int mt7921_mcu_sta_add(struct mt7921_dev *dev, struct ieee80211_sta *sta, > struct ieee80211_vif *vif, bool enable, > enum mt76_sta_info_state state); > +int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta, > + struct ieee80211_vif *vif, u8 state); > int mt7921_mcu_set_chan_info(struct mt7921_phy *phy, int cmd); > int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif); > int mt7921_mcu_set_eeprom(struct mt7921_dev *dev); > @@ -336,6 +338,8 @@ void mt7921_mac_fill_rx_vector(struct mt7921_dev *dev, struct sk_buff *skb); > void mt7921_mac_tx_free(struct mt7921_dev *dev, struct sk_buff *skb); > int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, > struct ieee80211_sta *sta); > +void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif, > + struct ieee80211_sta *sta); > void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, > struct ieee80211_sta *sta); > void mt7921_mac_work(struct work_struct *work); > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > index 13263f50dc00..27906b2cd912 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c > @@ -106,6 +106,7 @@ static int mt7921_pci_probe(struct pci_dev *pdev, > .rx_poll_complete = mt7921_rx_poll_complete, > .sta_ps = mt7921_sta_ps, > .sta_add = mt7921_mac_sta_add, > + .sta_assoc = mt7921_mac_sta_assoc, > .sta_remove = mt7921_mac_sta_remove, > .update_survey = mt7921_update_channel, > }; > -- > 2.25.1 > [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] [-- Attachment #2: Type: text/plain, Size: 170 bytes --] _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek
next prev parent reply other threads:[~2021-06-03 8:37 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-03 3:02 [PATCH v3 1/2] mt76: connac: add mt76_connac_mcu_update_sta_cmd support sean.wang 2021-06-03 3:02 ` sean.wang 2021-06-03 3:02 ` [PATCH v3 2/2] mt76: mt7921: fix sta_state incorrect implementation sean.wang 2021-06-03 3:02 ` sean.wang 2021-06-03 8:36 ` Lorenzo Bianconi [this message] 2021-06-03 8:36 ` Lorenzo Bianconi 2021-06-03 8:35 ` [PATCH v3 1/2] mt76: connac: add mt76_connac_mcu_update_sta_cmd support Lorenzo Bianconi 2021-06-03 8:35 ` Lorenzo Bianconi
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=YLiUqHHsVF2ZqL+1@lore-desk \ --to=lorenzo@kernel.org \ --cc=Deren.Wu@mediatek.com \ --cc=Eric-SY.Chang@mediatek.com \ --cc=Eric.Liang@mediatek.com \ --cc=Leon.Yen@mediatek.com \ --cc=Soul.Huang@mediatek.com \ --cc=Stella.Chang@mediatek.com \ --cc=YN.Chen@mediatek.com \ --cc=ch.yeh@mediatek.com \ --cc=jemele@google.com \ --cc=km.lin@mediatek.com \ --cc=linux-mediatek@lists.infradead.org \ --cc=linux-wireless@vger.kernel.org \ --cc=lorenzo.bianconi@redhat.com \ --cc=nbd@nbd.name \ --cc=posh.sun@mediatek.com \ --cc=robin.chiu@mediatek.com \ --cc=sean.wang@mediatek.com \ --cc=yenlinlai@google.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.