wifi: mt76: connac: tolerate inactive BSS deactivation

Firmware may return wlan_failure when deactivating a BSS that is already
inactive. This is a valid teardown case and should not fail the remove
path.

Keep activation failures unchanged since they still indicate that firmware
failed to create or activate the BSS state.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/20260425195011.790265-13-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Sean Wang 2026-04-25 14:50:02 -05:00 committed by Felix Fietkau
parent b2f5def2f1
commit 04222f9803
3 changed files with 35 additions and 3 deletions

View File

@ -1232,6 +1232,9 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
len = enable ? sizeof(dev_req) : sizeof(basic_req);
err = mt76_mcu_send_msg(dev, cmd, data, len, true);
if (err && cmd == MCU_UNI_CMD(BSS_INFO_UPDATE))
err = mt76_connac_mcu_bss_deact_err(dev, err, enable);
if (err < 0)
return err;
@ -1239,7 +1242,11 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
data = enable ? (void *)&basic_req : (void *)&dev_req;
len = enable ? sizeof(basic_req) : sizeof(dev_req);
return mt76_mcu_send_msg(dev, cmd, data, len, true);
err = mt76_mcu_send_msg(dev, cmd, data, len, true);
if (err && cmd == MCU_UNI_CMD(BSS_INFO_UPDATE))
err = mt76_connac_mcu_bss_deact_err(dev, err, enable);
return err;
}
EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_dev);

View File

@ -1906,6 +1906,29 @@ mt76_connac_mcu_get_wlan_idx(struct mt76_dev *dev, struct mt76_wcid *wcid,
}
}
#define MT76_CONNAC_MCU_STATUS_WLAN_FAILURE 0xc0000001
static inline int
mt76_connac_mcu_bss_deact_err(struct mt76_dev *mdev, int err, bool enable)
{
if (err != (int)MT76_CONNAC_MCU_STATUS_WLAN_FAILURE)
return err;
/* Ignore wlan_failure state false alarm when deactivating an
* inactive network. It does not harm the firmware state.
*/
if (!enable) {
dev_dbg(mdev->dev,
"ignore wlan_failure when bss is deactivated\n");
return 0;
}
dev_warn(mdev->dev,
"wlan_failure when bss is activated\n");
return err;
}
struct sk_buff *
__mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif_link *mvif,
struct mt76_wcid *wcid, int len);

View File

@ -2837,6 +2837,7 @@ int mt7925_mcu_add_bss_info_sta(struct mt792x_phy *phy,
struct mt792x_bss_conf *mconf = mt792x_link_conf_to_mconf(link_conf);
struct mt792x_dev *dev = phy->dev;
struct sk_buff *skb;
int err;
skb = __mt7925_mcu_alloc_bss_req(&dev->mt76, &mconf->mt76,
MT7925_BSS_UPDATE_MAX_SIZE);
@ -2862,8 +2863,9 @@ int mt7925_mcu_add_bss_info_sta(struct mt792x_phy *phy,
mt7925_mcu_bss_mbssid_tlv(skb, link_conf, enable);
}
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
MCU_UNI_CMD(BSS_INFO_UPDATE), true);
err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
MCU_UNI_CMD(BSS_INFO_UPDATE), true);
return mt76_connac_mcu_bss_deact_err(&dev->mt76, err, enable);
}
int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,