Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp4013526pxf; Tue, 6 Apr 2021 06:06:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzlxPyp4juLkQ4Kj/EfX1KW34C3pnsO9fafB24SgiJOnJUyrmOZ3MIPrF884hh+092q4RL7 X-Received: by 2002:aa7:d1cd:: with SMTP id g13mr37647182edp.369.1617714399891; Tue, 06 Apr 2021 06:06:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617714399; cv=none; d=google.com; s=arc-20160816; b=lTj4259PqH0NGu10mwK69L7j2w3HN1/I9Ypid2nYQknZ9Kz6DYaLw99VHLcT20i+/V Kq0jReTc5ttZvK93tcRUpHB7UGmT95NcNhYRYq/j4DiykjATjBoPPZ7uJI00/c6YlzuJ 0vi0KfhNU3wdQUhU83AU+RuspCRaRbKMar1dV7toJzM6U7QLJWiouUzA5g+pOV9cXLCA QD9PMLgoPeRnM7qjT3P3jaMIPmMEIJsmNl7nNA9AQgX5wiLPRU8OfOWqXUCD06pZC9pw uYaGNyWsv/uNkbbRDes7j6QADgeuuHjSHLwr/FwHNEs3qYNmmC/4wtGU0xdlU/G6/MlP E9rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from; bh=F/7QSwamTmAPtjZPm5u6r871kQWTqFzlC8U4yqPXm9g=; b=qlEuKd4W3V9U/Qi01m6YWQCLDHDvX8kjGjNghQvBzoqfW/tuMTOxJyzSVRWpJVrdcG wfSVYyiicxc7VZtf5uI7FJzsvGNuI5oR3PPbA3sXNJYjNmzE9hpV4yyZgPyEmTaekOif sr5qqxetSlO71laQzFFFL/0NyM/vRbl7Lb4EYfv/oOvEBIoKPflsAvl8ygAjmjjDfO3K OExFqgUlKN11uPp4LVoIYqHTD7Pg2CeI9UsVgdNGjIBEoDIUpwJQ0pJlHWpVeuB7Q4FS Quu41rdLDGIFhN2qBk2fqeAunna9+nwXYcbYawnjQ5Id6+RDaF9BVPANzlTp83aFER1L tW2g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f18si5413603ejh.678.2021.04.06.06.06.04; Tue, 06 Apr 2021 06:06:39 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242365AbhDFDex (ORCPT + 99 others); Mon, 5 Apr 2021 23:34:53 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:44117 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S233879AbhDFDew (ORCPT ); Mon, 5 Apr 2021 23:34:52 -0400 X-UUID: 2957dde142494712b11c8dc2e9d0ccb5-20210406 X-UUID: 2957dde142494712b11c8dc2e9d0ccb5-20210406 Received: from mtkcas10.mediatek.inc [(172.21.101.39)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.14 Build 0819 with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1027795319; Tue, 06 Apr 2021 11:34:42 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 6 Apr 2021 11:34:40 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 6 Apr 2021 11:34:40 +0800 From: To: , CC: , , , , , , , , , Subject: [PATCH 1/6] mt76: mt7921: fix inappropriate WoW setup with the missing ARP informaiton Date: Tue, 6 Apr 2021 11:34:34 +0800 Message-ID: <4c5666ad0683e467f11ca4a4abb5be335be25696.1617679693.git.objelf@gmail.com> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Sean Wang Fix the Wake-on-WoWLAN failure should rely on ARP Information is being updated in time to the firmware. Fixes: ffa1bf97425b ("mt76: mt7921: introduce PM support") Signed-off-by: Sean Wang --- .../net/wireless/mediatek/mt76/mt7921/main.c | 3 ++ .../net/wireless/mediatek/mt76/mt7921/mcu.c | 44 +++++++++++++++++++ .../wireless/mediatek/mt76/mt7921/mt7921.h | 3 ++ 3 files changed, 50 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c index 06a47cab494e..32b1cd0bca1f 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c @@ -626,6 +626,9 @@ static void mt7921_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_ASSOC) mt7921_bss_bcnft_apply(dev, vif, info->assoc); + if (changed & BSS_CHANGED_ARP_FILTER) + mt7921_mcu_update_arp_filter(hw, vif, info); + mt7921_mutex_release(dev); } diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c index 9283f9865ad5..353877f1c762 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c @@ -1325,3 +1325,47 @@ mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) mt76_clear(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON); } } + +int mt7921_mcu_update_arp_filter(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_bss_conf *info) +{ + struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; + struct mt7921_dev *dev = mt7921_hw_dev(hw); + struct sk_buff *skb; + int i, len = min_t(int, info->arp_addr_cnt, + IEEE80211_BSS_ARP_ADDR_LIST_LEN); + struct { + struct { + u8 bss_idx; + u8 pad[3]; + } __packed hdr; + struct mt76_connac_arpns_tlv arp; + } req_hdr = { + .hdr = { + .bss_idx = mvif->mt76.idx, + }, + .arp = { + .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP), + .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)), + .ips_num = len, + .mode = 2, /* update */ + .option = 1, + }, + }; + + skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, + sizeof(req_hdr) + len * sizeof(__be32)); + if (!skb) + return -ENOMEM; + + skb_put_data(skb, &req_hdr, sizeof(req_hdr)); + for (i = 0; i < len; i++) { + u8 *addr = (u8 *)skb_put(skb, sizeof(__be32)); + + memcpy(addr, &info->arp_addr_list[i], sizeof(__be32)); + } + + return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD, + true); +} diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h index 5cedefc41416..ebe51017dd55 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h @@ -348,4 +348,7 @@ int mt7921_mac_set_beacon_filter(struct mt7921_phy *phy, bool enable); void mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif); void mt7921_coredump_work(struct work_struct *work); +int mt7921_mcu_update_arp_filter(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_bss_conf *info); #endif -- 2.25.1