From patchwork Tue May 26 17:18:20 2020 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: 215521 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.7 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2427CC433E1 for ; Tue, 26 May 2020 17:19:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EEAE7207FB for ; Tue, 26 May 2020 17:19:31 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=silabs.onmicrosoft.com header.i=@silabs.onmicrosoft.com header.b="dwGkzJKb" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389096AbgEZRTR (ORCPT ); Tue, 26 May 2020 13:19:17 -0400 Received: from mail-bn8nam11on2083.outbound.protection.outlook.com ([40.107.236.83]:48578 "EHLO NAM11-BN8-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2388955AbgEZRTP (ORCPT ); Tue, 26 May 2020 13:19:15 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TiHYn304vWKuMxbltqPfbdqFMxGyrnIXC7fHnfbMbjXmkaKWFst5QphEXVoSGmYw4n9XHlyaT5T72BDOjRboWxXMYF8/bS5BCbQ4rDoZKX2+BvrqDzxhOprizRBvljQXYQ2xdvnnmJjgZnBBrn2Ra8kgd6rzfgEFAhL0iXtWP9MMe6kOPuZANGYfouvIIkUUzg1/kXlCc84gJ8rsWrLVn4rWKNlNj4J8TeF1QXvcclfP/YT2Dy5IFuMAuMnXNxbCasSn6HWfPD4mFvmaBLyWisrU9ErxJSrk8VWf3PIBgL/8srUZ7moBpEZDhUTdO8kTPN6P8OQdSCeaQIT7AhXMrQ== 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=eSH+4+k3JusHMRstcmgX3C9b+JhpbSv4FizBu66MENE=; b=G0hw/65bvuy6uDJtab33NJWhQlDYbhZhWODEBDWfeZ9RnqDzygNvBj1SR/Q6cFKlHc39rzfzU8kOfidX1rPx3MPvu1zWmStm7EzCQGESnmCsZAknhQlqa+vbU4ZI8wXsD/n+M0uF1950d4nnkWJsfVp4kx3l4liPUdg79IikqfeuyII5OLoeQhJWux/9AuEK71cX5XfxWw9cw4z/PZYqwYaA8xcrQqh+z0acDIY1SUyoUQSysel/RroRCUFeDuT1A5N/0xWEv0TmkhkUZBRHaZBjK/5aoc6/rB9HyCCzVU8CixxJRxqApKhFepY1VUC8tVJYz362B3HFQrqio3mfFw== 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=eSH+4+k3JusHMRstcmgX3C9b+JhpbSv4FizBu66MENE=; b=dwGkzJKbJiJfcQ3b5DxCPj62Y333j17vqP6fDZKqaUARzeBXa2JDqd+HZl0Z4+gM3XXHZN3P+ajQqdplhxnSVjnj6uNKn0IIFjCtM5mSRJhiF8YP4GbYINCyKQwxM1Kzz/BANwQy5VJdYAfl1Wn2Al+cvMp666gvfsEMgWhdUdY= Authentication-Results: driverdev.osuosl.org; dkim=none (message not signed) header.d=none; driverdev.osuosl.org; dmarc=none action=none header.from=silabs.com; Received: from SN6PR11MB2718.namprd11.prod.outlook.com (2603:10b6:805:63::18) by SN6PR11MB2750.namprd11.prod.outlook.com (2603:10b6:805:54::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3021.25; Tue, 26 May 2020 17:18:55 +0000 Received: from SN6PR11MB2718.namprd11.prod.outlook.com ([fe80::c504:2d66:a8f7:2336]) by SN6PR11MB2718.namprd11.prod.outlook.com ([fe80::c504:2d66:a8f7:2336%7]) with mapi id 15.20.3021.029; Tue, 26 May 2020 17:18:55 +0000 From: Jerome Pouiller 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 09/10] staging: wfx: allow to set PTA settings Date: Tue, 26 May 2020 19:18:20 +0200 Message-Id: <20200526171821.934581-10-Jerome.Pouiller@silabs.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200526171821.934581-1-Jerome.Pouiller@silabs.com> References: <20200526171821.934581-1-Jerome.Pouiller@silabs.com> X-ClientProxiedBy: PR1PR01CA0007.eurprd01.prod.exchangelabs.com (2603:10a6:102::20) To SN6PR11MB2718.namprd11.prod.outlook.com (2603:10b6:805:63::18) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from pc-42.home (2a01:e35:2435:66a0:544b:f17b:7ae8:fb7) by PR1PR01CA0007.eurprd01.prod.exchangelabs.com (2603:10a6:102::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3045.17 via Frontend Transport; Tue, 26 May 2020 17:18:53 +0000 X-Mailer: git-send-email 2.26.2 X-Originating-IP: [2a01:e35:2435:66a0:544b:f17b:7ae8:fb7] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 15e8e816-98a3-4326-ec72-08d80198de6f X-MS-TrafficTypeDiagnostic: SN6PR11MB2750: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:3173; X-Forefront-PRVS: 041517DFAB X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: StMQGCRjNe6N8EzyQb8MeaMhJHIn2Smah4N9hdoUCv4XESyXkQsUSZXthzuiIZ7AtrIXrNtAqdNBiGcLBpBksGnBNSGo+hiTSe76onYNhb4A+mBXM03nO31QEyHiMcB4LuqCo0HEUEjL3EFsMg3GRnFRc0pOwQLPtj1U+4C3HGkA5TaJysG5Ieb2f0J3nsNPjfayf5UWc04aR2N2bruxIE9fUIA9VHG0tjUerfxvlKbos5kV8avGAkwGnLrryGcyNYX5fx7XJsPFmvBPnDDGwEnU657vQr7JrhZ4B/QP/udPYQdo42piIznCVySaSptA X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN6PR11MB2718.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(396003)(376002)(366004)(39860400002)(136003)(346002)(4326008)(6512007)(316002)(8676002)(8936002)(2616005)(6486002)(2906002)(107886003)(1076003)(86362001)(6666004)(186003)(16526019)(5660300002)(66574014)(36756003)(54906003)(66556008)(478600001)(8886007)(6506007)(66946007)(66476007)(52116002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: d6DcMiRydztx7KEZxPujyEV85zBBmiO3mjw5dugUX428q4XK2Q2NRabyBIAk4nXDKS8jn97cL2t59/8eR62bSVTlWf0f+/qSwSqNI/QPElnxZ6fL3kFYmg3cg/UHOANDlWAhlaA7z4qrOfeY3YjPtfLMzG+w+MAtWJ541Fw2la129SUI1I3/F+VSRLVt8x81VLkprbezNNd4kEW9A+xf623xVUR8fTqRv/R20P5WfMvRO2XtNFzosVweiVyjkTbjykiZGACaRXpFWxKeLOLD9aIS1pGaj8vkJjIwHHMPXbhsGvgVdQ9WBDRTdOnsrnMGNxu4/d7hPffonwlI6bqXTcpojj+Iu1/Oi63jK/hv2G8d/4qsnxdGwb2sA1ITxr1H9IU4+hW319OUeVZUvRtqew9igL+Hr0av3W1FZLt6eXIY5WHfR9tAm+gs9LGBV3yADHn85TK+olmAwIMG7sBXqWPTwtrbmbtA9SmqHr9ZS6YrxLmh5xC+DZTkuy1qRxDq81W8kZD+pxcZZXsooywlL13NpYR5o7874GXqTvzECtA= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 15e8e816-98a3-4326-ec72-08d80198de6f X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2020 17:18:55.3018 (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: 3ZDHmM9rFan3Iio/5Qai+nn3cKXeaa7StWKWoAOq4EKTHqHllfOfdcV+vJ3vFB/9k4u7OIPYiaibIhtzQxuHdA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR11MB2750 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 device allows to do Packet Traffic Arbitration (PTA or also Coex) with other RF chips. Currently, there is no API to manage the PTA parameters. This patch provides a vendor extension to nl80211 to change the PTA parameters. Signed-off-by: Jérôme Pouiller --- drivers/staging/wfx/hif_api_general.h | 41 ++++++++++++++++ drivers/staging/wfx/hif_tx.c | 46 +++++++++++++++++ drivers/staging/wfx/hif_tx.h | 5 ++ drivers/staging/wfx/nl80211_vendor.c | 71 +++++++++++++++++++++++++++ drivers/staging/wfx/nl80211_vendor.h | 16 ++++++ drivers/staging/wfx/wfx.h | 4 ++ 6 files changed, 183 insertions(+) diff --git a/drivers/staging/wfx/hif_api_general.h b/drivers/staging/wfx/hif_api_general.h index c8af3534700ca..eb90164ab87c7 100644 --- a/drivers/staging/wfx/hif_api_general.h +++ b/drivers/staging/wfx/hif_api_general.h @@ -369,4 +369,45 @@ struct hif_cnf_prevent_rollback { __le32 status; } __packed; +struct hif_req_pta_settings { + u8 PtaMode; + u8 RequestSignalActiveLevel; + u8 PrioritySignalActiveLevel; + u8 FreqSignalActiveLevel; + u8 GrantSignalActiveLevel; + u8 CoexType; + u8 DefaultGrantState; + u8 SimultaneousRxAccesses; + u8 PrioritySamplingTime; + u8 TxRxSamplingTime; + u8 FreqSamplingTime; + u8 GrantValidTime; + u8 FemControlTime; + u8 FirstSlotTime; + __le16 PeriodicTxRxSamplingTime; + __le16 CoexQuota; + __le16 WlanQuota; +} __packed; + +struct hif_cnf_pta_settings { + __le32 status; +} __packed; + +struct hif_req_pta_priority { + __le32 priority; +} __packed; + +struct hif_cnf_pta_priority { + __le32 status; +} __packed; + +struct hif_req_pta_enable { + u8 enable; + u8 reserved[3]; +} __packed; + +struct hif_cnf_pta_enable { + __le32 status; +} __packed; + #endif diff --git a/drivers/staging/wfx/hif_tx.c b/drivers/staging/wfx/hif_tx.c index 899e1eb71a44b..4cb8fe865e58f 100644 --- a/drivers/staging/wfx/hif_tx.c +++ b/drivers/staging/wfx/hif_tx.c @@ -535,6 +535,52 @@ int hif_update_ie_beacon(struct wfx_vif *wvif, const u8 *ies, size_t ies_len) return ret; } +int hif_pta_settings(struct wfx_dev *wdev, + const struct hif_req_pta_settings *parms) +{ + int ret; + struct hif_msg *hif; + struct hif_req_pta_settings *body = wfx_alloc_hif(sizeof(*body), &hif); + + if (!hif) + return -ENOMEM; + memcpy(body, parms, sizeof(*body)); + wfx_fill_header(hif, -1, HIF_REQ_ID_PTA_SETTINGS, sizeof(*body)); + ret = wfx_cmd_send(wdev, hif, NULL, 0, false); + kfree(hif); + return ret; +} + +int hif_pta_priority(struct wfx_dev *wdev, u32 priority) +{ + int ret; + struct hif_msg *hif; + struct hif_req_pta_priority *body = wfx_alloc_hif(sizeof(*body), &hif); + + if (!hif) + return -ENOMEM; + body->priority = cpu_to_le32(priority); + wfx_fill_header(hif, -1, HIF_REQ_ID_PTA_PRIORITY, sizeof(*body)); + ret = wfx_cmd_send(wdev, hif, NULL, 0, false); + kfree(hif); + return ret; +} + +int hif_pta_enable(struct wfx_dev *wdev, bool enable) +{ + int ret; + struct hif_msg *hif; + struct hif_req_pta_enable *body = wfx_alloc_hif(sizeof(*body), &hif); + + if (!hif) + return -ENOMEM; + body->enable = enable; + wfx_fill_header(hif, -1, HIF_REQ_ID_PTA_STATE, sizeof(*body)); + ret = wfx_cmd_send(wdev, hif, NULL, 0, false); + kfree(hif); + return ret; +} + int hif_burn_prevent_rollback(struct wfx_dev *wdev, u32 magic_word) { int ret; diff --git a/drivers/staging/wfx/hif_tx.h b/drivers/staging/wfx/hif_tx.h index d29c72d94789a..f7202be4e7fc6 100644 --- a/drivers/staging/wfx/hif_tx.h +++ b/drivers/staging/wfx/hif_tx.h @@ -15,6 +15,7 @@ struct ieee80211_bss_conf; struct ieee80211_tx_queue_params; struct cfg80211_scan_request; struct hif_req_add_key; +struct hif_req_pta_settings; struct wfx_dev; struct wfx_vif; @@ -57,6 +58,10 @@ int hif_start(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, int hif_beacon_transmit(struct wfx_vif *wvif, bool enable); int hif_map_link(struct wfx_vif *wvif, u8 *mac_addr, int flags, int sta_id); int hif_update_ie_beacon(struct wfx_vif *wvif, const u8 *ies, size_t ies_len); +int hif_pta_settings(struct wfx_dev *wdev, + const struct hif_req_pta_settings *parms); +int hif_pta_priority(struct wfx_dev *wdev, u32 priority); +int hif_pta_enable(struct wfx_dev *wdev, bool enable); int hif_burn_prevent_rollback(struct wfx_dev *wdev, u32 magic_word); int hif_sl_set_mac_key(struct wfx_dev *wdev, const u8 *slk_key, int destination); diff --git a/drivers/staging/wfx/nl80211_vendor.c b/drivers/staging/wfx/nl80211_vendor.c index 1a9d411718a73..d08072adaf9d6 100644 --- a/drivers/staging/wfx/nl80211_vendor.c +++ b/drivers/staging/wfx/nl80211_vendor.c @@ -70,3 +70,74 @@ int wfx_nl_burn_antirollback(struct wiphy *wiphy, struct wireless_dev *widev, return 0; } +int wfx_nl_pta_params(struct wiphy *wiphy, struct wireless_dev *widev, + const void *data, int data_len) +{ + struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); + struct wfx_dev *wdev = (struct wfx_dev *)hw->priv; + int reply_size = nla_total_size(sizeof(wdev->pta_settings)) + + nla_total_size(sizeof(u8)) + + nla_total_size(sizeof(u32)); + struct nlattr *tb[WFX_NL80211_ATTR_MAX]; + bool do_enable = false; + struct sk_buff *msg; + struct nlattr *nla; + int rc; + + rc = nla_parse(tb, WFX_NL80211_ATTR_MAX - 1, data, data_len, + wfx_nl_policy, NULL); + if (rc) + return rc; + nla = tb[WFX_NL80211_ATTR_PTA_ENABLE]; + if (nla) { + do_enable = true; + wdev->pta_enable = nla_get_u8(tb[WFX_NL80211_ATTR_PTA_ENABLE]); + } + if (do_enable && !wdev->pta_enable) + rc = hif_pta_enable(wdev, wdev->pta_enable); + if (rc) + return rc; + nla = tb[WFX_NL80211_ATTR_PTA_SETTINGS]; + if (nla) { + // User has to care about endianness of data it send. + memcpy(&wdev->pta_settings, nla_data(nla), + sizeof(wdev->pta_settings)); + rc = hif_pta_settings(wdev, &wdev->pta_settings); + } + if (rc) + return rc; + nla = tb[WFX_NL80211_ATTR_PTA_PRIORITY]; + if (nla) { + wdev->pta_priority = + nla_get_u32(tb[WFX_NL80211_ATTR_PTA_PRIORITY]); + rc = hif_pta_priority(wdev, wdev->pta_priority); + } + if (rc) + return rc; + if (do_enable && wdev->pta_enable) + rc = hif_pta_enable(wdev, wdev->pta_enable); + if (rc) + return rc; + + msg = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, reply_size); + if (!msg) + return -ENOMEM; + rc = nla_put(msg, WFX_NL80211_ATTR_PTA_SETTINGS, + sizeof(wdev->pta_settings), &wdev->pta_settings); + if (rc) + goto error; + rc = nla_put_u32(msg, WFX_NL80211_ATTR_PTA_PRIORITY, + wdev->pta_priority); + if (rc) + goto error; + rc = nla_put_u8(msg, WFX_NL80211_ATTR_PTA_ENABLE, + wdev->pta_enable ? 1 : 0); + if (rc) + goto error; + return cfg80211_vendor_cmd_reply(msg); + +error: + kfree_skb(msg); + return rc; +} + diff --git a/drivers/staging/wfx/nl80211_vendor.h b/drivers/staging/wfx/nl80211_vendor.h index 49efe8716a654..0ff3bf73f0ad3 100644 --- a/drivers/staging/wfx/nl80211_vendor.h +++ b/drivers/staging/wfx/nl80211_vendor.h @@ -18,21 +18,31 @@ int wfx_nl_ps_timeout(struct wiphy *wiphy, struct wireless_dev *widev, const void *data, int data_len); int wfx_nl_burn_antirollback(struct wiphy *wiphy, struct wireless_dev *widev, const void *data, int data_len); +int wfx_nl_pta_params(struct wiphy *wiphy, struct wireless_dev *widev, + const void *data, int data_len); enum { WFX_NL80211_SUBCMD_PS_TIMEOUT = 0x10, WFX_NL80211_SUBCMD_BURN_PREVENT_ROLLBACK = 0x20, + WFX_NL80211_SUBCMD_PTA_PARMS = 0x30, }; enum { WFX_NL80211_ATTR_PS_TIMEOUT = 1, WFX_NL80211_ATTR_ROLLBACK_MAGIC = 2, + WFX_NL80211_ATTR_PTA_ENABLE = 3, + WFX_NL80211_ATTR_PTA_PRIORITY = 4, + WFX_NL80211_ATTR_PTA_SETTINGS = 5, WFX_NL80211_ATTR_MAX }; static const struct nla_policy wfx_nl_policy[WFX_NL80211_ATTR_MAX] = { [WFX_NL80211_ATTR_PS_TIMEOUT] = NLA_POLICY_RANGE(NLA_S32, -1, 127), [WFX_NL80211_ATTR_ROLLBACK_MAGIC] = { .type = NLA_U32 }, + [WFX_NL80211_ATTR_PTA_ENABLE] = NLA_POLICY_MAX(NLA_U8, 1), + [WFX_NL80211_ATTR_PTA_PRIORITY] = { .type = NLA_U32 }, + [WFX_NL80211_ATTR_PTA_SETTINGS] = + NLA_POLICY_EXACT_LEN(sizeof(struct hif_req_pta_settings)), }; static const struct wiphy_vendor_command wfx_nl80211_vendor_commands[] = { @@ -49,6 +59,12 @@ static const struct wiphy_vendor_command wfx_nl80211_vendor_commands[] = { .policy = wfx_nl_policy, .doit = wfx_nl_burn_antirollback, .maxattr = WFX_NL80211_ATTR_MAX - 1, + }, { + .info.vendor_id = WFX_NL80211_ID, + .info.subcmd = WFX_NL80211_SUBCMD_PTA_PARMS, + .policy = wfx_nl_policy, + .doit = wfx_nl_pta_params, + .maxattr = WFX_NL80211_ATTR_MAX - 1, }, }; diff --git a/drivers/staging/wfx/wfx.h b/drivers/staging/wfx/wfx.h index ef68aa4086e01..078f7885bf2fa 100644 --- a/drivers/staging/wfx/wfx.h +++ b/drivers/staging/wfx/wfx.h @@ -60,6 +60,10 @@ struct wfx_dev { struct mutex rx_stats_lock; struct hif_tx_power_loop_info tx_power_loop_info; struct mutex tx_power_loop_info_lock; + + bool pta_enable; + u32 pta_priority; + struct hif_req_pta_settings pta_settings; }; struct wfx_vif {