From patchwork Tue Dec 17 16:15:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?SsOpcsO0bWUgUG91aWxsZXI=?= X-Patchwork-Id: 11298117 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 17FDD6C1 for ; Tue, 17 Dec 2019 16:17:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D4C4C24676 for ; Tue, 17 Dec 2019 16:17:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=silabs.onmicrosoft.com header.i=@silabs.onmicrosoft.com header.b="V2jaMpLb" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728791AbfLQQRO (ORCPT ); Tue, 17 Dec 2019 11:17:14 -0500 Received: from mail-dm6nam12on2072.outbound.protection.outlook.com ([40.107.243.72]:33729 "EHLO NAM12-DM6-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729107AbfLQQQF (ORCPT ); Tue, 17 Dec 2019 11:16:05 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=aSallF4DR8GCIj97298x4g2ChZkr9GAZcO5wUM22P8b8TWOpU27pBkHWGk9s9iZyD96SPUd6eAGJ3PJM1YaVPIbI112mC4Hy6nA8ibIRE0m8Q2nueBvMj+L2Ri4LtqkDcLK2UD9FRMtHpNTxgWcjmWmYiVNKOcjZEoNCCrmvv50n5MMZer3LanwrvWgsDVJiVZmuC51Ej2QzhBfym/yYEMna0Slk6pvdgnNnA/XHpyFaX5rFVAsl2dandiWSihq51SQBrUUA7ulUk9vgnEH0Fmg9PpN3/5ECupWgZtQaMXzaQqkLJs4wD12/cQcdCldHY4BRdVkHp1UVODwBR1akIg== 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-SenderADCheck; bh=wbH9speXFVud+k2dooXEmIhIUnNVYavXYIFmWKDTAHc=; b=mRJ+BBzm9mBiFwWgKSJD0qba8LAuqVQmdl4pfTArUDbQvpoJ2nhEhFF8ShpeTDIYj1j/X0AwD4qH0MmfSAUOZAEfKDI86z/wAJkAgKpW0vSGEvlbeXpow2PYXgB6aOE9WpHGOhgoroM73hsoaB1B2ynCGOryVVf2CynxdI4HJkBsIlQqfCOHCRGJ+CB9I/GjTrkpuUsFx2YwXhY89f0kzq84z2eO7zf+oeFNdeAVJs+8dIyCNfkVYfwt6Gh63uDpEkVLiWmFblezGWVMuVEf1Rz42kIFFzTlOU9aexnntLbnOii/S95QjtI0c8pSGgA3ptrUN/7lE1q4jn6y/Mwn3g== 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=wbH9speXFVud+k2dooXEmIhIUnNVYavXYIFmWKDTAHc=; b=V2jaMpLbutqtGMhvQhPYowq3EbUr4rxtOfThiPvqLNVNovxi2F72iInwQc9Y4ZLDRcrlHDuT6InuPsuAq74h0qoC1armT4kSvp+Xisy7URR5CGLVfS/O9fEWKAE8kokz2NGeHvO6kSB657tj469MfMe+vAJnOfjNij3OHz9xMlk= Received: from MN2PR11MB4063.namprd11.prod.outlook.com (10.255.180.22) by MN2PR11MB4477.namprd11.prod.outlook.com (52.135.36.93) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2538.17; Tue, 17 Dec 2019 16:15:55 +0000 Received: from MN2PR11MB4063.namprd11.prod.outlook.com ([fe80::f46c:e5b4:2a85:f0bf]) by MN2PR11MB4063.namprd11.prod.outlook.com ([fe80::f46c:e5b4:2a85:f0bf%4]) with mapi id 15.20.2538.019; Tue, 17 Dec 2019 16:15:55 +0000 From: =?utf-8?b?SsOpcsO0bWUgUG91aWxsZXI=?= To: "devel@driverdev.osuosl.org" , "linux-wireless@vger.kernel.org" CC: "netdev@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Greg Kroah-Hartman , Kalle Valo , "David S . Miller" , =?utf-8?b?SsOpcsO0bWUgUG91aWxsZXI=?= Subject: [PATCH v2 47/55] staging: wfx: simplify hif_scan() usage Thread-Topic: [PATCH v2 47/55] staging: wfx: simplify hif_scan() usage Thread-Index: AQHVtPU0k58JN+hftUSF/1n35wvDzA== Date: Tue, 17 Dec 2019 16:15:32 +0000 Message-ID: <20191217161318.31402-48-Jerome.Pouiller@silabs.com> References: <20191217161318.31402-1-Jerome.Pouiller@silabs.com> In-Reply-To: <20191217161318.31402-1-Jerome.Pouiller@silabs.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: PR0P264CA0174.FRAP264.PROD.OUTLOOK.COM (2603:10a6:100:1c::18) To MN2PR11MB4063.namprd11.prod.outlook.com (2603:10b6:208:13f::22) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Jerome.Pouiller@silabs.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.24.0 x-originating-ip: [37.71.187.125] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: a19b595c-2111-42e1-c94c-08d7830c5710 x-ms-traffictypediagnostic: MN2PR11MB4477: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:7691; x-forefront-prvs: 02543CD7CD x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(376002)(346002)(396003)(136003)(366004)(39860400002)(199004)(189003)(1076003)(66574012)(186003)(107886003)(8676002)(6506007)(86362001)(478600001)(85182001)(5660300002)(81156014)(26005)(4326008)(6486002)(8936002)(316002)(110136005)(54906003)(64756008)(66446008)(66946007)(2616005)(66556008)(66476007)(85202003)(36756003)(6512007)(2906002)(52116002)(6666004)(71200400001)(81166006);DIR:OUT;SFP:1101;SCL:1;SRVR:MN2PR11MB4477;H:MN2PR11MB4063.namprd11.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: silabs.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 6r01MSXe2aFAf/ZiENh9p5+0tF7fvy423dEH9urVdDeUckGlI+iqdmHi3QNEUE5mYHmIrBCQxttj441suSrl71u4A85sM0P/yoXicTkr5WHBWNofqoB/kh0R2+pp1frV5kw86GXiV1HYvSOzMDSzVMnMatiV14UT96H1xqbvNwM+uvz1yuog7ouGgq9hNXCkvIDApuB4QuLcTrEPQxyfbEkxoEQ2cBexfs4yJEIjElezWVqCaHdhe4rJNzov/ZISvjFy1pKT1uURt4TfPly0OqZ5665/0BxA5VGWnnRUCHfCx2FllsdgKOE7qq4R+0VTECwgd+PYpM7jZ0yvPAeBIZDL7/AP9lgbS8AKmLI2ZEh+Ggiw6pyEvPlfDir/s45fDTgP6l+moekS0TR3/y84FzzDehgGM2Aogs6kjNH6E9R43ZlJ7GZ9q9azbiUPZ7rr Content-ID: <82EB23D1E0380A4597A80618F5B26810@namprd11.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: a19b595c-2111-42e1-c94c-08d7830c5710 X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Dec 2019 16:15:32.1827 (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: uR22/Lf+ul/a6HuWm99dVwHFSLHVwjJ1gBHQwTTeUhireiJ7CTg3brifXeLzKFCk0PZpBzSRTsSUJ7snZdi8RQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR11MB4477 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Jérôme Pouiller The structures hif_req_start_scan and hif_ssid_def come from hardware API. It is not intended to be manipulated in upper layers of the driver. So, this patch relocate handling of theses structures to hif_scan() (the low level function). This change also allows to drop struct wfx_scan_params. Signed-off-by: Jérôme Pouiller --- drivers/staging/wfx/hif_tx.c | 76 ++++++++++++++++++++++-------------- drivers/staging/wfx/hif_tx.h | 10 ++--- drivers/staging/wfx/scan.c | 54 ++++--------------------- drivers/staging/wfx/wfx.h | 1 + 4 files changed, 59 insertions(+), 82 deletions(-) diff --git a/drivers/staging/wfx/hif_tx.c b/drivers/staging/wfx/hif_tx.c index 259b49b99098..8a34a52dd5b9 100644 --- a/drivers/staging/wfx/hif_tx.c +++ b/drivers/staging/wfx/hif_tx.c @@ -220,41 +220,59 @@ int hif_write_mib(struct wfx_dev *wdev, int vif_id, u16 mib_id, void *val, return ret; } -int hif_scan(struct wfx_vif *wvif, const struct wfx_scan_params *arg) +int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req, + int chan_start_idx, int chan_num) { int ret, i; struct hif_msg *hif; - struct hif_ssid_def *ssids; - size_t buf_len = sizeof(struct hif_req_start_scan) + - arg->scan_req.num_of_channels * sizeof(u8) + - arg->scan_req.num_of_ssids * sizeof(struct hif_ssid_def); - struct hif_req_start_scan *body = wfx_alloc_hif(buf_len, &hif); - u8 *ptr = (u8 *) body + sizeof(*body); - - WARN(arg->scan_req.num_of_channels > HIF_API_MAX_NB_CHANNELS, "invalid params"); - WARN(arg->scan_req.num_of_ssids > 2, "invalid params"); - WARN(arg->scan_req.band > 1, "invalid params"); - - // FIXME: This API is unnecessary complex, fixing NumOfChannels and - // adding a member SsidDef at end of struct hif_req_start_scan would - // simplify that a lot. - memcpy(body, &arg->scan_req, sizeof(*body)); - cpu_to_le32s(&body->min_channel_time); - cpu_to_le32s(&body->max_channel_time); - cpu_to_le32s(&body->tx_power_level); - memcpy(ptr, arg->ssids, - arg->scan_req.num_of_ssids * sizeof(struct hif_ssid_def)); - ssids = (struct hif_ssid_def *) ptr; - for (i = 0; i < body->num_of_ssids; ++i) - cpu_to_le32s(&ssids[i].ssid_length); - ptr += arg->scan_req.num_of_ssids * sizeof(struct hif_ssid_def); - memcpy(ptr, arg->ch, arg->scan_req.num_of_channels * sizeof(u8)); - ptr += arg->scan_req.num_of_channels * sizeof(u8); - WARN(buf_len != ptr - (u8 *) body, "allocation size mismatch"); + size_t buf_len = + sizeof(struct hif_req_start_scan_alt) + chan_num * sizeof(u8); + struct hif_req_start_scan_alt *body = wfx_alloc_hif(buf_len, &hif); + int tmo_chan_fg, tmo_chan_bg, tmo; + + WARN(chan_num > HIF_API_MAX_NB_CHANNELS, "invalid params"); + WARN(req->n_ssids > HIF_API_MAX_NB_SSIDS, "invalid params"); + + compiletime_assert(IEEE80211_MAX_SSID_LEN == HIF_API_SSID_SIZE, + "API inconsistency"); + for (i = 0; i < req->n_ssids; i++) { + memcpy(body->ssid_def[i].ssid, req->ssids[i].ssid, + IEEE80211_MAX_SSID_LEN); + body->ssid_def[i].ssid_length = + cpu_to_le32(req->ssids[i].ssid_len); + } + body->num_of_ssids = HIF_API_MAX_NB_SSIDS; + // Background scan is always a good idea + body->scan_type.type = 1; + body->scan_flags.fbg = 1; + body->tx_power_level = + cpu_to_le32(req->channels[chan_start_idx]->max_power); + body->num_of_channels = chan_num; + for (i = 0; i < chan_num; i++) + body->channel_list[i] = + req->channels[i + chan_start_idx]->hw_value; + if (req->no_cck) + body->max_transmit_rate = API_RATE_INDEX_G_6MBPS; + else + body->max_transmit_rate = API_RATE_INDEX_B_1MBPS; + if (req->channels[chan_start_idx]->flags & IEEE80211_CHAN_NO_IR) { + body->min_channel_time = cpu_to_le32(50); + body->max_channel_time = cpu_to_le32(150); + } else { + body->min_channel_time = cpu_to_le32(10); + body->max_channel_time = cpu_to_le32(50); + body->num_of_probe_requests = 2; + body->probe_delay = 100; + } + tmo_chan_bg = le32_to_cpu(body->max_channel_time) * USEC_PER_TU; + tmo_chan_fg = 512 * USEC_PER_TU + body->probe_delay; + tmo_chan_fg *= body->num_of_probe_requests; + tmo = chan_num * max(tmo_chan_bg, tmo_chan_fg); + wfx_fill_header(hif, wvif->id, HIF_REQ_ID_START_SCAN, buf_len); ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false); kfree(hif); - return ret; + return ret ? ret : usecs_to_jiffies(tmo); } int hif_stop_scan(struct wfx_vif *wvif) diff --git a/drivers/staging/wfx/hif_tx.h b/drivers/staging/wfx/hif_tx.h index d88019421fbc..e8855ead3a18 100644 --- a/drivers/staging/wfx/hif_tx.h +++ b/drivers/staging/wfx/hif_tx.h @@ -13,15 +13,10 @@ #include "hif_api_cmd.h" struct ieee80211_tx_queue_params; +struct cfg80211_scan_request; struct wfx_dev; struct wfx_vif; -struct wfx_scan_params { - struct hif_req_start_scan scan_req; - struct hif_ssid_def *ssids; - u8 *ch; -}; - struct wfx_hif_cmd { struct mutex lock; struct mutex key_renew_lock; @@ -45,7 +40,8 @@ int hif_read_mib(struct wfx_dev *wdev, int vif_id, u16 mib_id, void *buf, size_t buf_size); int hif_write_mib(struct wfx_dev *wdev, int vif_id, u16 mib_id, void *buf, size_t buf_size); -int hif_scan(struct wfx_vif *wvif, const struct wfx_scan_params *arg); +int hif_scan(struct wfx_vif *wvif, struct cfg80211_scan_request *req80211, + int chan_start, int chan_num); int hif_stop_scan(struct wfx_vif *wvif); int hif_join(struct wfx_vif *wvif, const struct hif_req_join *arg); int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout); diff --git a/drivers/staging/wfx/scan.c b/drivers/staging/wfx/scan.c index c043f2f79541..122da87bbf92 100644 --- a/drivers/staging/wfx/scan.c +++ b/drivers/staging/wfx/scan.c @@ -34,19 +34,18 @@ static void wfx_scan_restart_delayed(struct wfx_vif *wvif) } } -static int wfx_scan_start(struct wfx_vif *wvif, struct wfx_scan_params *scan) +static int wfx_scan_start(struct wfx_vif *wvif, + int chan_start_idx, int chan_num) { - int tmo = 500; + int tmo; if (wvif->state == WFX_STATE_PRE_STA) return -EBUSY; - tmo += scan->scan_req.num_of_channels * - ((20 * (scan->scan_req.max_channel_time)) + 10); atomic_set(&wvif->scan.in_progress, 1); - schedule_delayed_work(&wvif->scan.timeout, msecs_to_jiffies(tmo)); - hif_scan(wvif, scan); + tmo = hif_scan(wvif, wvif->scan.req, chan_start_idx, chan_num); + schedule_delayed_work(&wvif->scan.timeout, tmo); return 0; } @@ -128,9 +127,6 @@ void wfx_scan_work(struct work_struct *work) { struct wfx_vif *wvif = container_of(work, struct wfx_vif, scan.work); struct ieee80211_channel **it; - struct wfx_scan_params scan = { - .scan_req.scan_type.type = 0, /* Foreground */ - }; struct ieee80211_channel *first; int i; @@ -173,48 +169,14 @@ void wfx_scan_work(struct work_struct *work) (*it)->max_power != first->max_power) break; } - scan.scan_req.band = first->band; - - if (wvif->scan.req->no_cck) - scan.scan_req.max_transmit_rate = API_RATE_INDEX_G_6MBPS; - else - scan.scan_req.max_transmit_rate = API_RATE_INDEX_B_1MBPS; - scan.scan_req.num_of_probe_requests = - (first->flags & IEEE80211_CHAN_NO_IR) ? 0 : 2; - scan.scan_req.num_of_ssids = wvif->scan.n_ssids; - scan.ssids = &wvif->scan.ssids[0]; - scan.scan_req.num_of_channels = it - wvif->scan.curr; - scan.scan_req.probe_delay = 100; - // FIXME: Check if FW can do active scan while joined. - if (wvif->state == WFX_STATE_STA) { - scan.scan_req.scan_type.type = 1; - scan.scan_req.scan_flags.fbg = 1; - } - - scan.ch = kcalloc(scan.scan_req.num_of_channels, - sizeof(u8), GFP_KERNEL); - - if (!scan.ch) { - wvif->scan.status = -ENOMEM; - goto fail; - } - for (i = 0; i < scan.scan_req.num_of_channels; ++i) - scan.ch[i] = wvif->scan.curr[i]->hw_value; - - if (wvif->scan.curr[0]->flags & IEEE80211_CHAN_NO_IR) { - scan.scan_req.min_channel_time = 50; - scan.scan_req.max_channel_time = 150; - } else { - scan.scan_req.min_channel_time = 10; - scan.scan_req.max_channel_time = 50; - } if (!(first->flags & IEEE80211_CHAN_NO_IR) && wvif->scan.output_power != first->max_power) { wvif->scan.output_power = first->max_power; hif_set_output_power(wvif, wvif->scan.output_power * 10); } - wvif->scan.status = wfx_scan_start(wvif, &scan); - kfree(scan.ch); + wvif->scan.status = wfx_scan_start(wvif, + wvif->scan.curr - wvif->scan.begin, + it - wvif->scan.curr); if (wvif->scan.status) goto fail; wvif->scan.curr = it; diff --git a/drivers/staging/wfx/wfx.h b/drivers/staging/wfx/wfx.h index 97373d047f58..35f5ddc2eeb3 100644 --- a/drivers/staging/wfx/wfx.h +++ b/drivers/staging/wfx/wfx.h @@ -27,6 +27,7 @@ #include "hif_api_general.h" #define USEC_PER_TXOP 32 // see struct ieee80211_tx_queue_params +#define USEC_PER_TU 1024 struct hwbus_ops;