Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp525937ybz; Fri, 1 May 2020 03:39:54 -0700 (PDT) X-Google-Smtp-Source: APiQypK8KDXv8RRNqHZrlVDfngD0tDYSnwUoppMop+laRx8HYxh4IEI4Dcbtf8ToQ2XIsppSwsIP X-Received: by 2002:a50:8e01:: with SMTP id 1mr2875684edw.26.1588329594268; Fri, 01 May 2020 03:39:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588329594; cv=none; d=google.com; s=arc-20160816; b=urqIcH8LlFnI7lhPQXCm/Q9XuspqH2l0tCRA37VClm8Lo/WEwKImP0QpzDd4+ZzYes IvPm6PKTH9YUnj6QMlrSNPHC5UfDm3WLxrgSFbBm5bcLpx/exEhnj99BN19zRcnrvHYE Bj55Mp3GoQ4olwT0SzOfyZ/8mwPuiapXM36oaqQGj2Yo28kN0PnAr5ZEZfHj5hu4oNHZ EukPU4i8baLABJDA+9gF8VFv4nXvCWkaAildT14R8N0yHiJ/K9C4SToQxNDUNPXkc/nz rOvPPqanjjvx7W+pxEsml5IjwTIn7mKaBGIDevqSep8u7FUiQCP1iOxm2ZCamA6aQC+C h5vQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=XcxaoQQID0WWErVXl3PMv70TUxCTXYbRjUM0ud1l0gE=; b=KiP+nTqq21z1v/kvIXnfPDh8I4ikJTBku8aulfAgR2bRbiZvH5MfAY4+pjp9lL5h+q hdJRZ4PQ6JD0LCn/to05K9iiY0BNl+ljFLnOv1f3uvDrAM/qXEkjHjRFgVaf6jts2U+j 4sv8lpRKYG00pIVnyX2b5Z9QsrxiTujHroDuqaMXYmbuRTORR6hFWQy2ZVkh1yfI6e/c b+EMoJxJfTSKwOfBZa8UsvD0YYVKL4Zfm4ZqQl+q2gy0lg39cQmJXOjeQvg7W+v9+FE4 9trMk2i4nCt/mIPpbIBmeH1raepbTbzlzOXEAENX1ttPchvAkSWxzpBDxLT9rfu77tC3 aKgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=R0pLZoci; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l11si1462578eja.20.2020.05.01.03.39.30; Fri, 01 May 2020 03:39:54 -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; dkim=pass header.i=@kernel.org header.s=default header.b=R0pLZoci; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728607AbgEAKgt (ORCPT + 99 others); Fri, 1 May 2020 06:36:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:43796 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728601AbgEAKgt (ORCPT ); Fri, 1 May 2020 06:36:49 -0400 Received: from lore-desk.lan (unknown [151.48.155.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 96C3520787; Fri, 1 May 2020 10:36:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1588329408; bh=yaTZdHdetXbjivlqnpNad3+2VachzitT+BEiJ73hIx8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R0pLZociAqDr252R76Z3Adz3Tlb/APFsL85kjJun6Xq5WPxUqIF7LCobZfnqb2CW7 c2lazoviKxbPFeI7LRmF7aP97tMkROQVCZiOaYkKAxgDUUbRhlpMAcToa821Rbefah nBV+OqOeYPxhB2M5bktKlRqs4wpf3/NTHYt6O5E4= From: Lorenzo Bianconi To: nbd@nbd.name Cc: linux-wireless@vger.kernel.org, lorenzo.bianconi@redhat.com, sean.wang@mediatek.com, linux-mediatek@lists.infradead.org, soul.huang@mediatek.com Subject: [PATCH 7/7] mt76: mt7615: introduce beacon_loss mcu event Date: Fri, 1 May 2020 12:36:17 +0200 Message-Id: <5f1da837b2470ff01ae4e59b75f3d8acdf3d16ab.1588329170.git.lorenzo@kernel.org> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org If device has enabled beacon hw filter rx beacons are not reported to the host. Introduce beacon_loss mcu event to trigger mac80211 mlme connection state machine in this configuration. IEEE80211_VIF_BEACON_FILTER has not set in vif flags since hw beacon filter is not enabled yet Co-developed-by: Sean Wang Signed-off-by: Sean Wang Signed-off-by: Lorenzo Bianconi --- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 38 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 7 ++++ 2 files changed, 45 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c index 84d4b96028f2..214328133c65 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c @@ -359,6 +359,40 @@ mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb) MT7615_HW_SCAN_TIMEOUT); } +static void +mt7615_mcu_beacon_loss_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) +{ + struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; + struct mt7615_beacon_loss_event *event = priv; + + if (mvif->idx != event->bss_idx) + return; + + if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER)) + return; + + ieee80211_beacon_loss(vif); +} + +static void +mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb) +{ + struct mt7615_beacon_loss_event *event; + struct mt76_phy *mphy; + u8 band_idx = 0; /* DBDC support */ + + skb_pull(skb, sizeof(struct mt7615_mcu_rxd)); + event = (struct mt7615_beacon_loss_event *)skb->data; + if (band_idx && dev->mt76.phy2) + mphy = dev->mt76.phy2; + else + mphy = &dev->mt76.phy; + + ieee80211_iterate_active_interfaces_atomic(mphy->hw, + IEEE80211_IFACE_ITER_RESUME_ALL, + mt7615_mcu_beacon_loss_iter, event); +} + static void mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb) { @@ -389,6 +423,9 @@ mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb) case MCU_EVENT_EXT: mt7615_mcu_rx_ext_event(dev, skb); break; + case MCU_EVENT_BSS_BEACON_LOSS: + mt7615_mcu_beacon_loss_event(dev, skb); + break; case MCU_EVENT_SCHED_SCAN_DONE: case MCU_EVENT_SCAN_DONE: mt7615_mcu_scan_event(dev, skb); @@ -410,6 +447,7 @@ void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb) rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST || rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP || rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC || + rxd->eid == MCU_EVENT_BSS_BEACON_LOSS || rxd->eid == MCU_EVENT_SCHED_SCAN_DONE || rxd->eid == MCU_EVENT_BSS_ABSENCE || rxd->eid == MCU_EVENT_SCAN_DONE || diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h index 890a202acfc9..737ccec6dd96 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h @@ -83,6 +83,7 @@ enum { MCU_EVENT_MT_PATCH_SEM = 0x04, MCU_EVENT_SCAN_DONE = 0x0d, MCU_EVENT_BSS_ABSENCE = 0x11, + MCU_EVENT_BSS_BEACON_LOSS = 0x13, MCU_EVENT_CH_PRIVILEGE = 0x18, MCU_EVENT_SCHED_SCAN_DONE = 0x23, MCU_EVENT_EXT = 0xed, @@ -291,6 +292,12 @@ struct mt7615_mcu_uni_event { __le32 status; /* 0: success, others: fail */ } __packed; +struct mt7615_beacon_loss_event { + u8 bss_idx; + u8 reason; + u8 pad[2]; +} __packed; + struct mt7615_mcu_scan_ssid { __le32 ssid_len; u8 ssid[IEEE80211_MAX_SSID_LEN]; -- 2.25.4