From patchwork Mon Mar 11 06:48:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamizh chelvam X-Patchwork-Id: 10846817 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3D8FB922 for ; Mon, 11 Mar 2019 06:51:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 24E0D28E5F for ; Mon, 11 Mar 2019 06:51:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1968E28E67; Mon, 11 Mar 2019 06:51:20 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 85B0D28E5F for ; Mon, 11 Mar 2019 06:51:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=xsKscRw+I+ErFYndpSH0VNj65hjtwuQdnDk5L5hyHSE=; b=EjNKlV8myVeeuxwKu/8gFywtJE 1QfMBBqk1GiZTx+yUR6+jjYtRszwJUWXGMO9NDfa1gxlWSq3N/fq+nEwTzvatp3liMIPavjn5QlB7 fcTn+lmNMi8agkp6ByF35DN5xjmNE4IqKq+sgqd2znu2jwAkGhP9UICxGEXkWOAqHHmDtKl2Wd27p 4cdeZ2BEFzbuBrZtawHBRi+LDOZm9xfCcey30pTeqpwHBtlPo7pR3SzSocCkcn7soi2mlc8W/BKFX qVb/vKlJUBUzmR9rjAnMNQxC7A5hBNb3QQ/+e1h+qkWkCgSFxHQY+MzQfryxj5lM/YcNydp1j7IBu lT0XF0SQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1h3EmK-000545-Cn; Mon, 11 Mar 2019 06:51:16 +0000 Received: from smtp.codeaurora.org ([198.145.29.96]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1h3EmB-0004uL-LT for ath10k@lists.infradead.org; Mon, 11 Mar 2019 06:51:12 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 1BFCD6118D; Mon, 11 Mar 2019 06:51:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1552287067; bh=sEOgT+Rqs+UyGQJFBoe99cwa1EM4neucfMniZ+InkoY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QwvIQO7G6AungbxqEDJFZML2WXyCljOvz79oRzwaA8uR4dW0Gq42BzaEFiVH0cboZ sECDao77B2stDZkbsi81KkNg1lGId5rVqWlk++QAJq3klCPKW3nbfAXKEzUA1X+0wI ALprUj/jyN2zGdULVHhiUThLVuyZYHmX19rbx7F0= Received: from cheath10p342229-lin.qca.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: tamizhr@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 5D3B960ADE; Mon, 11 Mar 2019 06:50:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1552287059; bh=sEOgT+Rqs+UyGQJFBoe99cwa1EM4neucfMniZ+InkoY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BraZDDqgXhbar/YNyQho4NU+iaaDNtMpUjV8akfbqfe7vHF/bNThxkYFEV3UWCksl hIzMxEJXN+4hLfEqDesAAvMSMzkS1q5QkXCbCoaFUsxrF+WT1kHOJcXncXA7ISguqI hYfUoWY4GqCbY6pLnCgC/LEYYFNWVuLRe+2drqSg= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 5D3B960ADE Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=tamizhr@codeaurora.org From: Tamizh chelvam To: johannes@sipsolutions.net, ath10k@lists.infradead.org Subject: [PATCHv4 9/9] ath10k: Add extended TID configuration support Date: Mon, 11 Mar 2019 12:18:21 +0530 Message-Id: <1552286901-28285-10-git-send-email-tamizhr@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1552286901-28285-1-git-send-email-tamizhr@codeaurora.org> References: <1552286901-28285-1-git-send-email-tamizhr@codeaurora.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190310_235107_899171_06A6FB3D X-CRM114-Status: GOOD ( 15.96 ) X-BeenThere: ath10k@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-wireless@vger.kernel.org, Tamizh chelvam MIME-Version: 1.0 Sender: "ath10k" Errors-To: ath10k-bounces+patchwork-ath10k=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP This patch extend TID configuration support to configure RTS_CTS control and TX rate limit. Tx rate limit is similar to auto rate but it will be limited to the user configured rate mask rather than the station's highest supported rate mask. Here ext_tid_cfg_bitmap added to notify the target which extended configuration parameter has modified(here RTS_CTS). WMI_10_4_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT service flag introduced to advertise this support. Testing: * Tested HW: QCA9984 * Tested FW: 10.4-3.9.0.2-00021 Signed-off-by: Tamizh chelvam --- drivers/net/wireless/ath/ath10k/core.c | 4 +++ drivers/net/wireless/ath/ath10k/mac.c | 48 ++++++++++++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/wmi.c | 9 ++++-- drivers/net/wireless/ath/ath10k/wmi.h | 20 +++++++++++++ 4 files changed, 78 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index ac2cf3f..248709d 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c @@ -2623,6 +2623,10 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode, if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map)) val |= WMI_10_4_REPORT_AIRTIME; + if (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT, + ar->wmi.svc_map)) + val |= WMI_10_4_EXT_PEER_TID_CONFIGS_SUPPORT; + status = ath10k_mac_ext_resource_config(ar, val); if (status) { ath10k_err(ar, diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index e5ae054..5d4611e 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c @@ -2950,6 +2950,12 @@ static int ath10k_new_peer_tid_config(struct ath10k *ar, arg.aggr_control = vif->ampdu[i]; arg.rate_ctrl = vif->rate_ctrl[i]; arg.rcode_flags = vif->rate_code[i]; + if (vif->rtscts[i]) + arg.ext_tid_cfg_bitmap = + WMI_EXT_TID_RTS_CTS_CONFIG; + else + arg.ext_tid_cfg_bitmap = 0; + arg.rtscts_ctrl = vif->rtscts[i]; } if (vif->noack[i]) { @@ -6560,6 +6566,10 @@ static int ath10k_mac_validate_rate_mask(struct ath10k *ar, if (txrate_type == NL80211_TX_RATE_FIXED) *rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_FIXED_RATE; + else if (txrate_type == NL80211_TX_RATE_LIMITED && + (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT, + ar->wmi.svc_map))) + *rate_ctrl = WMI_PEER_TID_CONFIG_RATE_UPPER_CAP; else return -EOPNOTSUPP; return 0; @@ -6626,6 +6636,14 @@ static int ath10k_mac_validate_rate_mask(struct ath10k *ar, arg->rate_ctrl = 0; } } + + if (changed & IEEE80211_TID_CONF_RTSCTS) { + if (tid_conf->rtscts) + arg->rtscts_ctrl = tid_conf->rtscts - 1; + else + arg->rtscts_ctrl = WMI_TID_CONFIG_RTSCTS_CONTROL_ENABLE; + arg->ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG; + } } static void ath10k_sta_tid_cfg_wk(struct work_struct *wk) @@ -6706,6 +6724,18 @@ static void ath10k_sta_tid_cfg_wk(struct work_struct *wk) } } + if (changed & IEEE80211_TID_CONF_RTSCTS) { + if (sta->rtscts[i]) { + arg.rtscts_ctrl = 0; + arg.ext_tid_cfg_bitmap = 0; + } else { + arg.rtscts_ctrl = vif->rtscts[i] - 1; + arg.ext_tid_cfg_bitmap = + WMI_EXT_TID_RTS_CTS_CONFIG; + config_apply = true; + } + } + arg.tid = i; if (config_apply) { @@ -8401,6 +8431,13 @@ static int ath10k_mac_op_set_tid_config(struct ieee80211_hw *hw, arg.rate_ctrl = 0; arg.rcode_flags = 0; } + + if (changed & IEEE80211_TID_CONF_RTSCTS) { + sta->rtscts[arg.tid] = + tid_config->tid_conf[i].rtscts; + arg.rtscts_ctrl = 0; + arg.ext_tid_cfg_bitmap = 0; + } } else { arvif->tid_conf_changed[arg.tid] |= changed; @@ -8420,6 +8457,10 @@ static int ath10k_mac_op_set_tid_config(struct ieee80211_hw *hw, vif->rate_ctrl[arg.tid] = arg.rate_ctrl; vif->rate_code[arg.tid] = arg.rcode_flags; } + + if (changed & IEEE80211_TID_CONF_RTSCTS) + vif->rtscts[arg.tid] = + tid_config->tid_conf[i].rtscts; } } @@ -9166,6 +9207,13 @@ int ath10k_mac_register(struct ath10k *ar) ar->ops->set_tid_config = NULL; ar->hw->wiphy->flags &= ~WIPHY_FLAG_HAS_MAX_DATA_RETRY_COUNT; } + + if (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) { + wiphy_ext_feature_set(ar->hw->wiphy, + NL80211_EXT_FEATURE_PER_TID_RTSCTS_CTRL); + wiphy_ext_feature_set(ar->hw->wiphy, + NL80211_EXT_FEATURE_PER_STA_RTSCTS_CTRL); + } /* * on LL hardware queues are managed entirely by the FW * so we only advertise to mac we can do the queues thing diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c index 44b66f2..6ae3f8c 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c @@ -8884,11 +8884,14 @@ static u32 ath10k_wmi_prepare_peer_qos(u8 uapsd_queues, u8 sp) cmd->rate_control = cpu_to_le32(arg->rate_ctrl); cmd->retry_count = cpu_to_le32(arg->retry_count); cmd->rcode_flags = cpu_to_le32(arg->rcode_flags); + cmd->ext_tid_cfg_bitmap = cpu_to_le32(arg->ext_tid_cfg_bitmap); + cmd->rtscts_ctrl = cpu_to_le32(arg->rtscts_ctrl); ath10k_dbg(ar, ATH10K_DBG_WMI, - "wmi noack tid %d vdev id %d ack_policy %d aggr %u rate_ctrl %u rcflag %u retry_count %d mac_addr %pM\n", - arg->tid, arg->vdev_id, arg->ack_policy, arg->aggr_control, arg->rate_ctrl, - arg->rcode_flags, arg->retry_count, arg->peer_macaddr.addr); + "wmi noack tid %d vdev id %d ack_policy %d aggr %u rate_ctrl %u rcflag %u retry_count %d rtscts %d ext_tid_cfg_bitmap %d mac_addr %pM\n", + arg->tid, arg->vdev_id, arg->ack_policy, arg->aggr_control, + arg->rate_ctrl, arg->rcode_flags, arg->retry_count, arg->rtscts_ctrl, + arg->ext_tid_cfg_bitmap, arg->peer_macaddr.addr); return skb; } diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h index 187c13e..21a328f 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.h +++ b/drivers/net/wireless/ath/ath10k/wmi.h @@ -201,6 +201,7 @@ enum wmi_service { WMI_SERVICE_PER_PACKET_SW_ENCRYPT, WMI_SERVICE_REPORT_AIRTIME, WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, + WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT, /* Remember to add the new value to wmi_service_name()! */ @@ -493,6 +494,7 @@ static inline char *wmi_service_name(enum wmi_service service_id) SVCSTR(WMI_SERVICE_PER_PACKET_SW_ENCRYPT); SVCSTR(WMI_SERVICE_REPORT_AIRTIME); SVCSTR(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT); + SVCSTR(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT); case WMI_SERVICE_MAX: return NULL; @@ -822,6 +824,8 @@ static inline void wmi_10_4_svc_map(const __le32 *in, unsigned long *out, WMI_SERVICE_REPORT_AIRTIME, len); SVCMAP(WMI_10_4_SERVICE_PEER_TID_CONFIGS_SUPPORT, WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, len); + SVCMAP(WMI_10_4_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT, + WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT, len); } #undef SVCMAP @@ -7169,6 +7173,16 @@ enum wmi_tid_rate_ctrl_conf { WMI_TID_CONFIG_RATE_CONTROL_AUTO, WMI_TID_CONFIG_RATE_CONTROL_FIXED_RATE, WMI_TID_CONFIG_RATE_CONTROL_DEFAULT_LOWEST_RATE, + WMI_PEER_TID_CONFIG_RATE_UPPER_CAP, +}; + +enum wmi_tid_rtscts_control_conf { + WMI_TID_CONFIG_RTSCTS_CONTROL_ENABLE, + WMI_TID_CONFIG_RTSCTS_CONTROL_DISABLE, +}; + +enum wmi_ext_tid_config_map { + WMI_EXT_TID_RTS_CTS_CONFIG = BIT(0), }; struct wmi_per_peer_per_tid_cfg_arg { @@ -7180,6 +7194,8 @@ struct wmi_per_peer_per_tid_cfg_arg { u8 rate_ctrl; u32 retry_count; u32 rcode_flags; + u32 ext_tid_cfg_bitmap; + u32 rtscts_ctrl; }; struct wmi_peer_per_tid_cfg_cmd { @@ -7195,6 +7211,10 @@ struct wmi_peer_per_tid_cfg_cmd { __le32 rate_control; __le32 rcode_flags; __le32 retry_count; + /* See enum wmi_ext_tid_config_map */ + __le32 ext_tid_cfg_bitmap; + /* see enum wmi_tid_rtscts_control_conf */ + __le32 rtscts_ctrl; } __packed; enum wmi_txbf_conf {