From nobody Wed Sep 21 14:01:27 2022 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4MXg7W5VW7z4cYCg; Wed, 21 Sep 2022 14:01:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4MXg7W4rhNz49qW; Wed, 21 Sep 2022 14:01:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1663768887; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=OfFQlSBOQ5ow6CSqZOopvhxBACfYSGm5xFW1oelERbk=; b=uSAM7rV1xYlyUzLy/3J2KXWegWZFgw8KXvbeD3vjjJEVtZFk06hnTWw8UcHZEhksTLkOth +7FUAUht/nJ8GDGifZKYazRsZdDltYVl9m+NlCZm2WIiFZvrU2ci8QUQFbXdvCrAey4NnJ zsUX4k8giFy3DNhQ05ApjjHabmMT+Rq1z6gIGGfDraPzze31n+Ss6uJtji//6qhL76bxYk JM+eC3mEC/isXKD221e/+/KpCo7hX7wmpLNgLSTLI6NKySF02YNjUG9FDQVXRVhC4a+yV6 ZoM94XNtQD4u9+pyKNrjmIH+bAYvVfWn/aILwv2Fh63KMcr9iK1ZFfKWAJBwkg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4MXg7W3xstz14gv; Wed, 21 Sep 2022 14:01:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 28LE1RJX000175; Wed, 21 Sep 2022 14:01:27 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 28LE1Rqg000174; Wed, 21 Sep 2022 14:01:27 GMT (envelope-from git) Date: Wed, 21 Sep 2022 14:01:27 GMT Message-Id: <202209211401.28LE1Rqg000174@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 1b6b652128d5 - stable/13 - LinuxKPI: 80211: scanning code updates List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 1b6b652128d5b3836a87f7f569f0f7084b0c2809 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1663768887; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=OfFQlSBOQ5ow6CSqZOopvhxBACfYSGm5xFW1oelERbk=; b=jAYRzh+7SR0KzVoS4gC0zxvleGu6SvS45xRHWnXRRH+fFeO8iJjMkigJkdpx2pRf3Kcv3r Ti4opxX95qDM8JTij53AtIXhOfSF4XoY8Wb7UQ+VZgh1U1YkZGiJdAHicuTmlJHqBEsd12 jp2V/vRgqA1lJEa+b7BRz0Fjw1y/W2DfF+xAgW9Q2lGvNWHq6mu0CkcDwba3YYnnSISthY zi2csozUeDU7TRMTfj35oxHWHAjoFlqmG56qCbbSv2DJbr4Q+2yFka0hONoEqOuzAXOFSI hazzu7yjeG68OqUfdPdkKWwsm3Ia4Lg0A3gyUWxV3lUsvR2KAeQzPMVQE0X6MA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1663768887; a=rsa-sha256; cv=none; b=aldkigCz66elkHS35nZ2Bo1BR5ZenkKHeLMvsEjqYTVRzW8TvI6QEiUObKBcUT+RpIUA/Z Zgw5hZdbn8kfr2iKtG3UEaix6VRvSoJGAn7AeDlkMir425QHaz5M2D1+0af6J/rPrm6XW8 JPqHZInWavP2tCkwMYfqxmEf/JUB0fZyyLR/xekpqA6fT6XrkGMOrjJT76waelY6GWTu3F B/DCwUKK20kUQddR79c1dq//WJTfCtFpjtBVOrV9mR8MS0DQ/YoBbiAMQEfw5VMyDVplFU p4kKJu1naDzFADmGUsS7rCSEKuuttaFgnDrYG1kC8epapikasbjwe2xXkLn5EA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=1b6b652128d5b3836a87f7f569f0f7084b0c2809 commit 1b6b652128d5b3836a87f7f569f0f7084b0c2809 Author: Bjoern A. Zeeb AuthorDate: 2022-09-03 23:40:51 +0000 Commit: Bjoern A. Zeeb CommitDate: 2022-09-21 11:46:46 +0000 LinuxKPI: 80211: scanning code updates For consistency rename LKPI_SCAN_RUNNING adding a LHW_ prefix. Add a local flag LKPI_LHW_SCAN_HW mirroring the net80211 IEEE80211_FEXT_SCAN_OFFLOAD flag. Slightly simplify the code. Overload (*ic_scan_curchan) and (*ic_scan_mindwell) so that we can call the net80211 implementation in case of software scan but skip it in case of full-offload scans. Also add a bandaid to our (*ic_set_channel) implementation to not siwtch channels if we have an active hw_scan running. Obtained from: bz/wireless-dev Sponsored by: The FreeBSD Foundation (partially) (cherry picked from commit a486fbbd7876bed81d738a32274953c89906edb5) --- sys/compat/linuxkpi/common/src/linux_80211.c | 61 +++++++++++++++++----- sys/compat/linuxkpi/common/src/linux_80211.h | 8 ++- .../linuxkpi/common/src/linux_80211_macops.c | 6 +-- 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c index b23b2b3f774b..3381218b2623 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.c +++ b/sys/compat/linuxkpi/common/src/linux_80211.c @@ -797,7 +797,7 @@ lkpi_stop_hw_scan(struct lkpi_hw *lhw, struct ieee80211_vif *vif) struct ieee80211_hw *hw; int error; - if ((lhw->scan_flags & LKPI_SCAN_RUNNING) == 0) + if ((lhw->scan_flags & LKPI_LHW_SCAN_RUNNING) == 0) return; hw = LHW_TO_HW(lhw); @@ -812,7 +812,7 @@ lkpi_stop_hw_scan(struct lkpi_hw *lhw, struct ieee80211_vif *vif) LKPI_80211_LHW_UNLOCK(lhw); IEEE80211_LOCK(lhw->ic); - if ((lhw->scan_flags & LKPI_SCAN_RUNNING) != 0) + if ((lhw->scan_flags & LKPI_LHW_SCAN_RUNNING) != 0) ic_printf(lhw->ic, "%s: failed to cancel scan: %d (%p, %p)\n", __func__, error, lhw, vif); } @@ -2514,7 +2514,7 @@ lkpi_ic_scan_start(struct ieee80211com *ic) int error; lhw = ic->ic_softc; - if ((lhw->scan_flags & LKPI_SCAN_RUNNING) != 0) { + if ((lhw->scan_flags & LKPI_LHW_SCAN_RUNNING) != 0) { /* A scan is still running. */ return; } @@ -2527,7 +2527,9 @@ lkpi_ic_scan_start(struct ieee80211com *ic) } hw = LHW_TO_HW(lhw); - if ((vap->iv_flags_ext & IEEE80211_FEXT_SCAN_OFFLOAD) == 0) { + if ((lhw->scan_flags & LKPI_LHW_SCAN_HW) == 0) { + /* If hw_scan is cleared clear FEXT_SCAN_OFFLOAD too. */ + vap->iv_flags_ext &= ~IEEE80211_FEXT_SCAN_OFFLOAD; sw_scan: lvif = VAP_TO_LVIF(vap); vif = LVIF_TO_VIF(lvif); @@ -2670,7 +2672,7 @@ sw_scan: * not possible. Fall back to sw scan in that case. */ if (error == 1) { - vap->iv_flags_ext &= ~IEEE80211_FEXT_SCAN_OFFLOAD; + lhw->scan_flags &= ~LKPI_LHW_SCAN_HW; ieee80211_start_scan(vap, IEEE80211_SCAN_ACTIVE | IEEE80211_SCAN_NOPICK | @@ -2692,26 +2694,25 @@ static void lkpi_ic_scan_end(struct ieee80211com *ic) { struct lkpi_hw *lhw; - struct ieee80211_scan_state *ss; - struct ieee80211vap *vap; lhw = ic->ic_softc; - if ((lhw->scan_flags & LKPI_SCAN_RUNNING) == 0) { + if ((lhw->scan_flags & LKPI_LHW_SCAN_RUNNING) == 0) { return; } - ss = ic->ic_scan; - vap = ss->ss_vap; - if (vap->iv_flags_ext & IEEE80211_FEXT_SCAN_OFFLOAD) { - /* Nothing to do. */ - } else { + if ((lhw->scan_flags & LKPI_LHW_SCAN_HW) == 0) { + struct ieee80211_scan_state *ss; + struct ieee80211vap *vap; struct ieee80211_hw *hw; struct lkpi_vif *lvif; struct ieee80211_vif *vif; + ss = ic->ic_scan; + vap = ss->ss_vap; hw = LHW_TO_HW(lhw); lvif = VAP_TO_LVIF(vap); vif = LVIF_TO_VIF(lvif); + lkpi_80211_mo_sw_scan_complete(hw, vif); /* Send PS to stop buffering if n80211 does not for us? */ @@ -2721,6 +2722,27 @@ lkpi_ic_scan_end(struct ieee80211com *ic) } } +static void +lkpi_ic_scan_curchan(struct ieee80211_scan_state *ss, + unsigned long maxdwell) +{ + struct lkpi_hw *lhw; + + lhw = ss->ss_ic->ic_softc; + if ((lhw->scan_flags & LKPI_LHW_SCAN_HW) == 0) + lhw->ic_scan_curchan(ss, maxdwell); +} + +static void +lkpi_ic_scan_mindwell(struct ieee80211_scan_state *ss) +{ + struct lkpi_hw *lhw; + + lhw = ss->ss_ic->ic_softc; + if ((lhw->scan_flags & LKPI_LHW_SCAN_HW) == 0) + lhw->ic_scan_mindwell(ss); +} + static void lkpi_ic_set_channel(struct ieee80211com *ic) { @@ -2736,6 +2758,11 @@ lkpi_ic_set_channel(struct ieee80211com *ic) if (lhw->ops->config == NULL) return; + /* If we have a hw_scan running do not switch channels. */ + if ((lhw->scan_flags & (LKPI_LHW_SCAN_RUNNING|LKPI_LHW_SCAN_HW)) == + (LKPI_LHW_SCAN_RUNNING|LKPI_LHW_SCAN_HW)) + return; + c = ic->ic_curchan; if (c == NULL || c == IEEE80211_CHAN_ANYC) { ic_printf(ic, "%s: c %p ops->config %p\n", __func__, @@ -3482,6 +3509,7 @@ linuxkpi_ieee80211_ifattach(struct ieee80211_hw *hw) * the flag. */ ic->ic_flags_ext |= IEEE80211_FEXT_SCAN_OFFLOAD; + lhw->scan_flags |= LKPI_LHW_SCAN_HW; } #ifdef __notyet__ @@ -3540,6 +3568,11 @@ linuxkpi_ieee80211_ifattach(struct ieee80211_hw *hw) ic->ic_getradiocaps = lkpi_ic_getradiocaps; ic->ic_wme.wme_update = lkpi_ic_wme_update; + lhw->ic_scan_curchan = ic->ic_scan_curchan; + ic->ic_scan_curchan = lkpi_ic_scan_curchan; + lhw->ic_scan_mindwell = ic->ic_scan_mindwell; + ic->ic_scan_mindwell = lkpi_ic_scan_mindwell; + lhw->ic_node_alloc = ic->ic_node_alloc; ic->ic_node_alloc = lkpi_ic_node_alloc; lhw->ic_node_init = ic->ic_node_init; @@ -3781,7 +3814,7 @@ linuxkpi_ieee80211_scan_completed(struct ieee80211_hw *hw, LKPI_80211_LHW_LOCK(lhw); free(lhw->hw_req, M_LKPI80211); lhw->hw_req = NULL; - lhw->scan_flags &= ~LKPI_SCAN_RUNNING; + lhw->scan_flags &= ~LKPI_LHW_SCAN_RUNNING; wakeup(lhw); LKPI_80211_LHW_UNLOCK(lhw); diff --git a/sys/compat/linuxkpi/common/src/linux_80211.h b/sys/compat/linuxkpi/common/src/linux_80211.h index c6958cf834e3..65e78ba0fc08 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.h +++ b/sys/compat/linuxkpi/common/src/linux_80211.h @@ -144,6 +144,11 @@ struct lkpi_hw { /* name it mac80211_sc? */ struct mtx mtx; + /* Scan functions we overload to handle depending on scan mode. */ + void (*ic_scan_curchan)(struct ieee80211_scan_state *, + unsigned long); + void (*ic_scan_mindwell)(struct ieee80211_scan_state *); + /* Node functions we overload to sync state. */ struct ieee80211_node * (*ic_node_alloc)(struct ieee80211vap *, const uint8_t [IEEE80211_ADDR_LEN]); @@ -153,7 +158,8 @@ struct lkpi_hw { /* name it mac80211_sc? */ #define LKPI_MAC80211_DRV_STARTED 0x00000001 uint32_t sc_flags; -#define LKPI_SCAN_RUNNING 0x00000001 +#define LKPI_LHW_SCAN_RUNNING 0x00000001 +#define LKPI_LHW_SCAN_HW 0x00000002 uint32_t scan_flags; int supbands; /* Number of supported bands. */ diff --git a/sys/compat/linuxkpi/common/src/linux_80211_macops.c b/sys/compat/linuxkpi/common/src/linux_80211_macops.c index 12cffc11481e..547b94be66c2 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211_macops.c +++ b/sys/compat/linuxkpi/common/src/linux_80211_macops.c @@ -205,10 +205,10 @@ lkpi_80211_mo_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, goto out; } - lhw->scan_flags |= LKPI_SCAN_RUNNING; + lhw->scan_flags |= LKPI_LHW_SCAN_RUNNING; error = lhw->ops->hw_scan(hw, vif, sr); if (error != 0) - lhw->scan_flags &= ~LKPI_SCAN_RUNNING; + lhw->scan_flags &= ~LKPI_LHW_SCAN_RUNNING; out: return (error); @@ -236,7 +236,7 @@ lkpi_80211_mo_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vi return; lhw->ops->sw_scan_complete(hw, vif); - lhw->scan_flags &= ~LKPI_SCAN_RUNNING; + lhw->scan_flags &= ~LKPI_LHW_SCAN_RUNNING; } void