From nobody Mon Jun 26 12:09:04 2023 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 4QqRTY1bTTz4k77C; Mon, 26 Jun 2023 12:09:05 +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 4QqRTY0b9jz3kLy; Mon, 26 Jun 2023 12:09:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1687781345; 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=VE8NqAisBcEJPok93R2HZz+X0Tu60Yt/vnXvq8BPt8c=; b=vDk4i8v/bTdwYJWOocFqVp4Owu86aNJm9RrAIa8PKScnLgWk6WuZDqE+07Nun3EWACALVX tRaK7QRJfp0pCeIy+oY348VOCd9o6SmNJBEpVviWV7hC1ZtJWzYarQfvTvUN4+Lz48mQ9j b5vdROw3PiGIcAV/oIGJDFCEvmeD8knYdr6QoeabdQjFBvMdmZFC+Enr3slzANFUyceyw2 UQ7SeNIdW09yEK8s0MfjneEerw7RS87MFeP0kPX7bkMStliR+zN4i8MehnBY+pWvkcUpGr FyhWSv6Ye+/UKdaPv50lRzbp2635q3C9Z+MPoPJNGb/AIurkXLyMeytHmM1tgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1687781345; 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=VE8NqAisBcEJPok93R2HZz+X0Tu60Yt/vnXvq8BPt8c=; b=TF3UY7iXuumvys5yaktk2UMAqUxCWnEGAflveBBLjGWDAZDb2HlWN50PY2jJSVFULIhcbq +SRLtbPOhRQnQcKsfdw6XMIArchojyYZ8KLiLxLgEwA2mXFHF72JGcM/D0hbeC/ZJvGTbt xU1nFhEV7uVT+cPlLhFTDmvAKrNw/7pBtQdJvtg+FrR1ZeanreobQXGfqATyueI843t9wQ MfSpUPt9CmWhRMkKgRhlorZxL7Bw80DN8NeacIExghHVo3pnpot2sdj0wG4F18JwjfF3Wc vr3jd4HGk1h8i3Izd7kxo1QHuwmaOy68eCbvzY53zp7loFRwytyhpdKatQehmw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1687781345; a=rsa-sha256; cv=none; b=btTcTEm/Z2L2V4XUj+sVHOx1wm65bitaB9jXHWJgsCbEl6Lat+N422B+AEOEVYMENg6mY8 X2qeleJlUfs+p5GlahG21ioNzJXycLKd/GSTAlhcUZUBXLmQVhubXd+TJpsVVzi/YDTP4Q yHOUgzOiekxD67wFKLCeWJODCl0locWPFO3470mXLqHXxC5jYBx+h5aIFrV6Qb3dxLtoL2 NMQIcf8zkQr8qv0v/mn5DRr9CqC8YtemVIpmJazUSUcfzRIueRp97l4+cMhckAUxATKwiR slPLG3sU3M84liCeDQtDCSY5pFyXJ0QSWd056iah230V7N87TghePirCCmOu0A== 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 4QqRTX6klCz18Ld; Mon, 26 Jun 2023 12:09:04 +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 35QC94vL083633; Mon, 26 Jun 2023 12:09:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 35QC94Cn083632; Mon, 26 Jun 2023 12:09:04 GMT (envelope-from git) Date: Mon, 26 Jun 2023 12:09:04 GMT Message-Id: <202306261209.35QC94Cn083632@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: 2c284913a976 - stable/13 - LinuxKPI: 802.11: improve scan handling 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: 2c284913a97600a2c2bc1ee4fee4cdc0c4c2791c Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=2c284913a97600a2c2bc1ee4fee4cdc0c4c2791c commit 2c284913a97600a2c2bc1ee4fee4cdc0c4c2791c Author: Bjoern A. Zeeb AuthorDate: 2023-06-10 21:53:56 +0000 Commit: Bjoern A. Zeeb CommitDate: 2023-06-26 09:26:03 +0000 LinuxKPI: 802.11: improve scan handling Under certain circumstances a hw_scan may be downgraded to a software scan. Handle these situations better and make sure we free resources in all cases once. [1] Also leave a note about scanning all bands (or we would have to switch bands manually). In both cases hardware doing and driver saying seem not entirely consistent for all and all firmware. Sponsored by: The FreeBSD Foundation Reported by: imp [1] (cherry picked from commit 3206587a20de9810b549ba8fd0032f7ab884bbec) --- sys/compat/linuxkpi/common/src/linux_80211.c | 72 ++++++++++++++++++---- .../linuxkpi/common/src/linux_80211_macops.c | 21 ++++--- 2 files changed, 72 insertions(+), 21 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c index d0b760cd6f4f..eefa3de54125 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.c +++ b/sys/compat/linuxkpi/common/src/linux_80211.c @@ -2669,12 +2669,7 @@ sw_scan: int band, i, ssid_count, common_ie_len; uint32_t band_mask; uint8_t *ie, *ieend; - - if (!ieee80211_hw_check(hw, SINGLE_SCAN_ON_ALL_BANDS)) { - IMPROVE("individual band scans not yet supported"); - /* In theory net80211 would have to drive this. */ - return; - } + bool running; ssid_count = min(ss->ss_nssid, hw->wiphy->max_scan_ssids); ssids_len = ssid_count * sizeof(*ssids); @@ -2688,6 +2683,18 @@ sw_scan: ss->ss_chans[ss->ss_next + i]); band_mask |= (1 << band); } + + if (!ieee80211_hw_check(hw, SINGLE_SCAN_ON_ALL_BANDS)) { + IMPROVE("individual band scans not yet supported, only scanning first band"); + /* In theory net80211 should drive this. */ + /* Probably we need to add local logic for now; + * need to deal with scan_complete + * and cancel_scan and keep local state. + * Also cut the nchan down above. + */ + /* XXX-BZ ath10k does not set this but still does it? &$%^ */ + } + chan_len = nchan * (sizeof(lc) + sizeof(*lc)); common_ie_len = 0; @@ -2704,10 +2711,7 @@ sw_scan: common_ie_len, hw->wiphy->max_scan_ie_len); } - KASSERT(lhw->hw_req == NULL, ("%s: ic %p lhw %p hw_req %p " - "!= NULL\n", __func__, ic, lhw, lhw->hw_req)); - - lhw->hw_req = hw_req = malloc(sizeof(*hw_req) + ssids_len + + hw_req = malloc(sizeof(*hw_req) + ssids_len + s6ghzlen + chan_len + lhw->supbands * lhw->scan_ie_len + common_ie_len, M_LKPI80211, M_WAITOK | M_ZERO); @@ -2737,7 +2741,7 @@ sw_scan: c = ss->ss_chans[ss->ss_next + i]; lc->hw_value = c->ic_ieee; - lc->center_freq = c->ic_freq; + lc->center_freq = c->ic_freq; /* XXX */ /* lc->flags */ lc->band = lkpi_net80211_chan_to_nl80211_band(c); lc->max_power = c->ic_maxpower; @@ -2774,12 +2778,48 @@ sw_scan: lvif = VAP_TO_LVIF(vap); vif = LVIF_TO_VIF(lvif); + + LKPI_80211_LHW_SCAN_LOCK(lhw); + /* Re-check under lock. */ + running = (lhw->scan_flags & LKPI_LHW_SCAN_RUNNING) != 0; + if (!running) { + KASSERT(lhw->hw_req == NULL, ("%s: ic %p lhw %p hw_req %p " + "!= NULL\n", __func__, ic, lhw, lhw->hw_req)); + + lhw->scan_flags |= LKPI_LHW_SCAN_RUNNING; + lhw->hw_req = hw_req; + } + LKPI_80211_LHW_SCAN_UNLOCK(lhw); + if (running) { + free(hw_req, M_LKPI80211); + return; + } + error = lkpi_80211_mo_hw_scan(hw, vif, hw_req); if (error != 0) { ieee80211_cancel_scan(vap); - free(hw_req, M_LKPI80211); - lhw->hw_req = NULL; + /* + * ieee80211_scan_completed must be called in either + * case of error or none. So let the free happen there + * and only there. + * That would be fine in theory but in practice drivers + * behave differently: + * ath10k does not return hw_scan until after scan_complete + * and can then still return an error. + * rtw88 can return 1 or -EBUSY without scan_complete + * iwlwifi can return various errors before scan starts + * ... + * So we cannot rely on that behaviour and have to check + * and balance between both code paths. + */ + LKPI_80211_LHW_SCAN_LOCK(lhw); + if ((lhw->scan_flags & LKPI_LHW_SCAN_RUNNING) != 0) { + free(lhw->hw_req, M_LKPI80211); + lhw->hw_req = NULL; + lhw->scan_flags &= ~LKPI_LHW_SCAN_RUNNING; + } + LKPI_80211_LHW_SCAN_UNLOCK(lhw); /* * XXX-SIGH magic number. @@ -2790,6 +2830,12 @@ sw_scan: LKPI_80211_LHW_SCAN_LOCK(lhw); lhw->scan_flags &= ~LKPI_LHW_SCAN_HW; LKPI_80211_LHW_SCAN_UNLOCK(lhw); + /* + * XXX If we clear this now and later a driver + * thinks it * can do a hw_scan again, we will + * currently not re-enable it? + */ + vap->iv_flags_ext &= ~IEEE80211_FEXT_SCAN_OFFLOAD; ieee80211_start_scan(vap, IEEE80211_SCAN_ACTIVE | IEEE80211_SCAN_NOPICK | diff --git a/sys/compat/linuxkpi/common/src/linux_80211_macops.c b/sys/compat/linuxkpi/common/src/linux_80211_macops.c index 762a54e4a823..16b502b1ca49 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211_macops.c +++ b/sys/compat/linuxkpi/common/src/linux_80211_macops.c @@ -43,8 +43,9 @@ __FBSDID("$FreeBSD$"); #ifdef LINUXKPI_DEBUG_80211 #define LKPI_80211_TRACE_MO(fmt, ...) \ if (linuxkpi_debug_80211 & D80211_TRACE_MO) \ - printf("LKPI_80211_TRACE_MO %s:%d:_" fmt "\n", \ - __func__, __LINE__, __VA_ARGS__) + printf("LKPI_80211_TRACE_MO %s:%d: %d %d %u_" fmt "\n", \ + __func__, __LINE__, curcpu, curthread->td_tid, \ + (unsigned int)ticks, __VA_ARGS__) #else #define LKPI_80211_TRACE_MO(...) do { } while(0) #endif @@ -215,18 +216,22 @@ lkpi_80211_mo_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct lkpi_hw *lhw; int error; + /* + * MUST NOT return EPERM as that is a "magic number 1" based on rtw88 + * driver indicating hw_scan is not supported despite the ops call + * being available. + */ + lhw = HW_TO_LHW(hw); if (lhw->ops->hw_scan == NULL) { - /* XXX-BZ can we hide other scans like we can for sta_add..? */ - error = EOPNOTSUPP; + /* Return magic number to use sw scan. */ + error = 1; goto out; } - lhw->scan_flags |= LKPI_LHW_SCAN_RUNNING; - LKPI_80211_TRACE_MO("hw %p vif %p sr %p", hw, vif, sr); + LKPI_80211_TRACE_MO("CALLING hw %p vif %p sr %p", hw, vif, sr); error = lhw->ops->hw_scan(hw, vif, sr); - if (error != 0) - lhw->scan_flags &= ~LKPI_LHW_SCAN_RUNNING; + LKPI_80211_TRACE_MO("RETURNING hw %p vif %p sr %p error %d", hw, vif, sr, error); out: return (error);