From nobody Fri Feb 13 09:31:11 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 06F43E82CAE for ; Wed, 27 Sep 2023 16:33:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232037AbjI0Qd5 (ORCPT ); Wed, 27 Sep 2023 12:33:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45060 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231975AbjI0Qdl (ORCPT ); Wed, 27 Sep 2023 12:33:41 -0400 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2088.outbound.protection.outlook.com [40.107.237.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1304310A; Wed, 27 Sep 2023 09:33:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IaOiMBDvYckOVxPr1Hla+orERKqURHWZC5nWLsv98YMqdoUYS7/gz9qQ2y5VoBx564yECGtFn1DP2rtDVyQXr0xTCNN1jA5e24tz7aFKtC9dWuei8YN5GHxnmnwG8zLYjEb/YFWdSIc35s0WEBzobxSOa2NYLX4KSiOdpKujNI9IBAcYDA3r6UjqVHiedEZbiN6kbyq6iLkwXUlGM6GEYcuXn943NRK73WOn3wniyvv3pFIqir9Ju5YJHBeeodWFFnTxC04oJX/DHv6K4+0+/rKDijvSP4VZE+5Kj5sdCBe8gh7jJPBkO6etzYvIPxhJYxduPBBlGyoYfcKYlVYASw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=iEeZTFKIH/xeImm70sYbyeuFRuutq8ymyWu0/ZJegaI=; b=WPW3uW70y0SVLIsEznsuICMnweOSicHWNzU9JbiQvMb9ViYgXt3dgtO8Fr4btWqll4uoYINYsjhckHncJbYz8CgUvwXuh+0N6uOxJTS9MmrCXhR1xBgPFh81fyn/iOmAdVIlIVFAUcyfpR6TIks+jlzni1PnH6tOBjhYSkj9a4Xra0N/IXRPJgPMCcSyTMR1jPVbmdFcEulLClNLUZTdGaru4cOmNzOo35FFtE4xKvEwKDSjiUVrBIojIMo1IkLxvqgQXLj0aA5rVR82YEH3WJQid2sBzhXd+gtfSlhSulkQxYoYkbTwCd07AGmIbzQntfqoILQJsO+Af+NSAemdVg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.onmicrosoft.com; s=selector2-silabs-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=iEeZTFKIH/xeImm70sYbyeuFRuutq8ymyWu0/ZJegaI=; b=fda/Ik9IfkYGLt0Et9jOztRJQQRTlutH0D/ml6f09djFqianiZuR92UySzSnd70kZggGlPt6e99E23w1LipeYz0HmkZx8YEU3XXuFoHF9fTmPILoIBqiPdzV/rLaZgBY/BR6ZuYXKC6EEHRuR9w6PJ4inx/EELHfljjPL5GCZyE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=silabs.com; Received: from IA1PR11MB7773.namprd11.prod.outlook.com (2603:10b6:208:3f0::21) by CO1PR11MB5041.namprd11.prod.outlook.com (2603:10b6:303:90::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6813.28; Wed, 27 Sep 2023 16:33:25 +0000 Received: from IA1PR11MB7773.namprd11.prod.outlook.com ([fe80::d6c8:4cb6:2594:d8f3]) by IA1PR11MB7773.namprd11.prod.outlook.com ([fe80::d6c8:4cb6:2594:d8f3%4]) with mapi id 15.20.6813.027; Wed, 27 Sep 2023 16:33:25 +0000 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Pouiller?= To: Kalle Valo Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, =?UTF-8?q?J=C3=A9r=C3=B4me=20Pouiller?= Subject: [PATCH v2 6/9] wifi: wfx: implement wfx_remain_on_channel() Date: Wed, 27 Sep 2023 18:32:54 +0200 Message-Id: <20230927163257.568496-7-jerome.pouiller@silabs.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230927163257.568496-1-jerome.pouiller@silabs.com> References: <20230927163257.568496-1-jerome.pouiller@silabs.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: DS7PR06CA0052.namprd06.prod.outlook.com (2603:10b6:8:54::30) To IA1PR11MB7773.namprd11.prod.outlook.com (2603:10b6:208:3f0::21) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: IA1PR11MB7773:EE_|CO1PR11MB5041:EE_ X-MS-Office365-Filtering-Correlation-Id: df86e403-c273-459e-e310-08dbbf7778a4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: psEKFvqlgqj6D4cS6qe0J8z72okMKj4lVDIsEs5aDKIjDgBEAZToemheGobdfmayAKIIqCHiEDlpe+wgDTkUqXhCI1Byh7ltMx7NsN7a5Tg9ezRdzABrGGMhiGCBFwOOGI7tuD7dwDltSgXZVpAcWAodUBfbi36Y+vO7q78ScCxPqwovsrPrtAUth6O0jVaUxOtBG+QvWhE6PDVD+wOyCKO37JxD7D2/yHW/B7INz+PttFeFwQNloo3Kuh4winYIK7+z8zIFfYFg5UCLCp2+2HHkw/m12TB7yOIF2ZLzPHNFYWS53x9uJEZLxTPX/RSy/UoXoLNvP5iRuP0gaoW3Vy69O1Hx5s9A3MjDaGuoenocKJezR9nOOxnZsKaFQ/l0BAa7dcw1tp0dcRtwOvIiuER6LhFYXZlMa4n+zlLnvY1xjMADPBLhmCgqeThK0NvAJwa1K9dv2kyAISrRqXnFvUSG3fRLWakMtr1+z8y/6rnUx3S+T5a0zRNNGC1Z7/PEzrqE4qDUrvVbQsAHjGj4DKsZ9z8SfVrOb8bmO6XwNjEvifrXlerAFZLUEOUpXaHY X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:IA1PR11MB7773.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376002)(136003)(346002)(39850400004)(396003)(366004)(230922051799003)(1800799009)(186009)(451199024)(6506007)(107886003)(66574015)(66556008)(66476007)(6666004)(1076003)(86362001)(6486002)(52116002)(6512007)(478600001)(38100700002)(2906002)(83380400001)(5660300002)(316002)(6916009)(36756003)(8936002)(8676002)(2616005)(66946007)(4326008)(41300700001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NmxmN0NaZ2twekRKem8zMWR2SzF5Wko0YVIySDBzSm9XSTBmK1UzYnFRaG5T?= =?utf-8?B?aktPRXN1S3ZUR1h4T3NsMno1d3k2SmhxVFF5T0liRlRxNXRtS25INE9EenBx?= =?utf-8?B?ZnBHaEVFYzI0c2Y3ZlhDOHNPL3l1N0sxKzNwR1ZUOEptdVZzaWp6N0xEdEo1?= =?utf-8?B?dGQzV0FoSTg2YSsreHBhYXJDTmdCV0hyRmpVeEozZ3h4bUlMNjFYQ0JNa0R0?= =?utf-8?B?QjJSOUQ1WUdlYmlHSE1PZFYyWjhaMDY2N3Z0eHNoMXNNekJMNllWNE1DMVQ4?= =?utf-8?B?RVQrM1JYbGVuMnpjNFVnK3h5MktqU3VLSkhHYmFxYjJ5UE9RdUozcFlOdGRr?= =?utf-8?B?NExXVS85dkRRd1B3VmJ5VUlpaFBlMjdoL1RBRDQxZVIrWlBFZDZOU084ejh5?= =?utf-8?B?WFFERkJ5K0ZWYmNwU1pFY2s2YzdOQS9ncmRKcDZ3RU8wQmx4V3Fxa3phRVhI?= =?utf-8?B?WWtkazFjclV5cFRQYTJwVWtSbUt5UUp6V0xKejhLV25GU2dZU0lSc2tVcXdM?= =?utf-8?B?RlBuMnVMa2N5ZlFMcitvbXdFY0tjODVoODc2dU8yUWVveXVHRE1RMnEvNGZr?= =?utf-8?B?dWZLdkdtdG93SC8wT3ZWSmo3ZjdEVUtZcm5ENk1McmRrT1JLcG1CWE9ORldD?= =?utf-8?B?WGVlYkxEUVdNN3NSZnh3bDZiTXo2ZCtlWGtuWWlEdUZTMkQxdFJkUkViSEZs?= =?utf-8?B?RXRkTm1TYm94dGVjMXBPaHY2NFZBcmI4d043VVdiL0ErU0U1V0Z6U1krc05o?= =?utf-8?B?TFc2dlY3bjNxUnRiMXNOMVUxRlZ4RUNNUWdvT0lVYzg0K1VpYXBCVm5mdU5Z?= =?utf-8?B?T0xxL1ZlRzdWOXhhbmVLTGRrbllYb0NPN29lZnZLSUM1d3BCazFKZkFodmVs?= =?utf-8?B?Sm5pdkNxODU3MlIvZnNNMjc0UGhVeDZNMTVjZjh3WldJMm5zSVRtNEpMU2FF?= =?utf-8?B?ZXUzcjV2M1ZQSzZ3b3M5K1g1VTdtYkNYNlM5SVMrbTlWMkFFanRqb1lPeXox?= =?utf-8?B?dVpPSCt6VWRDdGxWaFJ3NkJBNUEzMEdFOThkc2hyb2VSZUpLek0xa2tiU2k2?= =?utf-8?B?R1kwMEN5bEhCWGVnYjNBUVIvbVJLdFk3Rmc4TkZ6U0d6U0dpK3NvQVRIOFhE?= =?utf-8?B?T0dNdDZhK3VZeDhrY1ZkeGk4TmlhVGc2eWZjWWw2ZzhTWTZYYngvTTFycXI4?= =?utf-8?B?cEQxNzQ0L1hZNjMrQmdBRDVsd01JMEZNZm5ZaktNYzhybHBudzZCRjI5SzRB?= =?utf-8?B?RmtFTURNRHkyNlpsS1NoQXIxVERXV21LalFwVFVnQVBCeTI4S2pZbW5oNkUw?= =?utf-8?B?ZFd3eGNNWGg2N1JpR2tXdllzZTlrVmNPdmtmdllvcjNQL1cvSUs4bTRHd0xJ?= =?utf-8?B?TkNjUWtERzVpU1JPWU1WZnJ1cmx6S05nci9DR3RrdjNGNVljODNEQnJEMC9s?= =?utf-8?B?SkFGUE42Y1lhdWhEM0VUeWFSNCtValpSY0krT0k2a2xWYmNzdzhzaFZjM2tv?= =?utf-8?B?emxvVDVjZXRoWXFsRy9vSStaNkxDaTBQdDlXcmJYblk5UmZxdGlHYlcrR1lR?= =?utf-8?B?cjhtYVFNSDduVTZiV1lZMXFoWG00dFZYUmc5Ym9KZUdIMUtNYW1pa0F0WUp6?= =?utf-8?B?NGE1b0VaMHNoMGx4cVdaa1E2eUNlbUJKdkNVV2oybGNaRHR0UmVyL3p0c29h?= =?utf-8?B?NXdxRCtTSk1LdHpic0FDNkhVSHZEczNHYWNmOXRaVnMxWHRZd2h5eDlrVU5y?= =?utf-8?B?Q2cvZkdmV0crOFEvU0Jvc253WVNLbTZSYklkb1JxZ251WWNRMHliV3R6NHVJ?= =?utf-8?B?WS9MQmNLQ3MwRy8wZzBRbGxPd1RjUGdYcVozbWR6L1E3YVNEM2hmVFArSHM1?= =?utf-8?B?Y0l4M09mZmZJVVB1RUZOYTUrMTkwK1dRQlZiQlRVVFJObDF2azdMK0dTWms5?= =?utf-8?B?b1VKcDFuMXdlbGpCQ0NqZytMb3d1VTRXVlhhRUJJVGhnZ2FoZVVsd2ZFZkg4?= =?utf-8?B?bFRUbWxWNDNLYTJ3QlhRWHA5Qzd4Z0FRQmRZZk11c1g4Zk1seDEzREIveG03?= =?utf-8?B?Z09HUXpkeUhoNXZZMDFSd3JzYkhtOGs4eFpnKzM4a3NoT1hQNERxc3M2WEth?= =?utf-8?B?S0JFVkx2dkY0NWp2Q0R5T3BmTlRGWityT3NwN3pjeUxzQ0xuNUprRlNldHY4?= =?utf-8?Q?NUeep18txiM6C+H57y1C6fY0au20THgcfgB/WJMLTGnU?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: df86e403-c273-459e-e310-08dbbf7778a4 X-MS-Exchange-CrossTenant-AuthSource: IA1PR11MB7773.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Sep 2023 16:33:25.1534 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: +EtFPXgzDBtIXhWii7FtMesjF4B5f+da96sPJQmjxipf8SE4wHoLh9Wg93dQKfUOin76Ni6w9ApAJnnZCuIT9w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR11MB5041 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" With some conditions, the device is able to send/receive frames during scan operation. So, it is possible to use it implement the "remain on channel" feature. We just ask for a passive scan (without sending any probe request) on one channel. This architecture allows to leverage some interesting features: - if the device is AP, the device switches channel just after the next beacon and the beacons are stopped during the off-channel interval. - if the device is connected, it advertises it is asleep before to switch channel (so the AP should stop to try to send data) Signed-off-by: J=C3=A9r=C3=B4me Pouiller --- drivers/net/wireless/silabs/wfx/scan.c | 50 ++++++++++++++++++++++++++ drivers/net/wireless/silabs/wfx/scan.h | 1 + drivers/net/wireless/silabs/wfx/sta.c | 1 + drivers/net/wireless/silabs/wfx/wfx.h | 5 ++- 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/silabs/wfx/scan.c b/drivers/net/wireless/= silabs/wfx/scan.c index 51338fd43ae4f..57a2d63dd2a62 100644 --- a/drivers/net/wireless/silabs/wfx/scan.c +++ b/drivers/net/wireless/silabs/wfx/scan.c @@ -146,14 +146,64 @@ void wfx_scan_complete(struct wfx_vif *wvif, int nb_c= han_done) complete(&wvif->scan_complete); } =20 +void wfx_remain_on_channel_work(struct work_struct *work) +{ + struct wfx_vif *wvif =3D container_of(work, struct wfx_vif, remain_on_cha= nnel_work); + struct ieee80211_channel *chan =3D wvif->remain_on_channel_chan; + int duration =3D wvif->remain_on_channel_duration; + int ret; + + /* Hijack scan request to implement Remain-On-Channel */ + mutex_lock(&wvif->wdev->conf_mutex); + mutex_lock(&wvif->scan_lock); + if (wvif->join_in_progress) { + dev_info(wvif->wdev->dev, "abort in-progress REQ_JOIN"); + wfx_reset(wvif); + } + wfx_tx_lock_flush(wvif->wdev); + + reinit_completion(&wvif->scan_complete); + ret =3D wfx_hif_scan_uniq(wvif, chan, duration); + if (ret) + goto end; + ieee80211_ready_on_channel(wvif->wdev->hw); + ret =3D wait_for_completion_timeout(&wvif->scan_complete, + msecs_to_jiffies(duration * 120 / 100)); + if (!ret) { + wfx_hif_stop_scan(wvif); + ret =3D wait_for_completion_timeout(&wvif->scan_complete, 1 * HZ); + dev_dbg(wvif->wdev->dev, "roc timeout\n"); + } + if (!ret) + dev_err(wvif->wdev->dev, "roc didn't stop\n"); + ieee80211_remain_on_channel_expired(wvif->wdev->hw); +end: + wfx_tx_unlock(wvif->wdev); + mutex_unlock(&wvif->scan_lock); + mutex_unlock(&wvif->wdev->conf_mutex); +} + int wfx_remain_on_channel(struct ieee80211_hw *hw, struct ieee80211_vif *v= if, struct ieee80211_channel *chan, int duration, enum ieee80211_roc_type type) { + struct wfx_dev *wdev =3D hw->priv; + struct wfx_vif *wvif =3D (struct wfx_vif *)vif->drv_priv; + + if (wfx_api_older_than(wdev, 3, 10)) + return -EOPNOTSUPP; + + wvif->remain_on_channel_duration =3D duration; + wvif->remain_on_channel_chan =3D chan; + schedule_work(&wvif->remain_on_channel_work); return 0; } =20 int wfx_cancel_remain_on_channel(struct ieee80211_hw *hw, struct ieee80211= _vif *vif) { + struct wfx_vif *wvif =3D (struct wfx_vif *)vif->drv_priv; + + wfx_hif_stop_scan(wvif); + flush_work(&wvif->remain_on_channel_work); return 0; } diff --git a/drivers/net/wireless/silabs/wfx/scan.h b/drivers/net/wireless/= silabs/wfx/scan.h index 2f8361769303e..995ab8c6cb5ef 100644 --- a/drivers/net/wireless/silabs/wfx/scan.h +++ b/drivers/net/wireless/silabs/wfx/scan.h @@ -19,6 +19,7 @@ int wfx_hw_scan(struct ieee80211_hw *hw, struct ieee80211= _vif *vif, void wfx_cancel_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif= ); void wfx_scan_complete(struct wfx_vif *wvif, int nb_chan_done); =20 +void wfx_remain_on_channel_work(struct work_struct *work); int wfx_remain_on_channel(struct ieee80211_hw *hw, struct ieee80211_vif *v= if, struct ieee80211_channel *chan, int duration, enum ieee80211_roc_type type); diff --git a/drivers/net/wireless/silabs/wfx/sta.c b/drivers/net/wireless/s= ilabs/wfx/sta.c index c58db2bcea87b..f42341c2baffb 100644 --- a/drivers/net/wireless/silabs/wfx/sta.c +++ b/drivers/net/wireless/silabs/wfx/sta.c @@ -733,6 +733,7 @@ int wfx_add_interface(struct ieee80211_hw *hw, struct i= eee80211_vif *vif) mutex_init(&wvif->scan_lock); init_completion(&wvif->scan_complete); INIT_WORK(&wvif->scan_work, wfx_hw_scan_work); + INIT_WORK(&wvif->remain_on_channel_work, wfx_remain_on_channel_work); =20 wfx_tx_queues_init(wvif); wfx_tx_policy_init(wvif); diff --git a/drivers/net/wireless/silabs/wfx/wfx.h b/drivers/net/wireless/s= ilabs/wfx/wfx.h index 13ba84b3b2c33..5fd80c423d6f6 100644 --- a/drivers/net/wireless/silabs/wfx/wfx.h +++ b/drivers/net/wireless/silabs/wfx/wfx.h @@ -69,6 +69,7 @@ struct wfx_vif { =20 bool after_dtim_tx_allowed; bool join_in_progress; + struct completion set_pm_mode_complete; =20 struct delayed_work beacon_loss_work; =20 @@ -88,7 +89,9 @@ struct wfx_vif { bool scan_abort; struct ieee80211_scan_request *scan_req; =20 - struct completion set_pm_mode_complete; + struct ieee80211_channel *remain_on_channel_chan; + int remain_on_channel_duration; + struct work_struct remain_on_channel_work; }; =20 static inline struct ieee80211_vif *wvif_to_vif(struct wfx_vif *wvif) --=20 2.39.2