From patchwork Mon May 6 13:54:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sriram R X-Patchwork-Id: 10931103 X-Patchwork-Delegate: kvalo@adurom.com 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 280D715A6 for ; Mon, 6 May 2019 13:55:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1488E28470 for ; Mon, 6 May 2019 13:55:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0687D28632; Mon, 6 May 2019 13:55:58 +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=ham 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 E118B28470 for ; Mon, 6 May 2019 13:55:56 +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: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:In-Reply-To: References:List-Owner; bh=I1fatcGYAA2Bo5JjCXadPEISh3u1r+NwQpKyoreCo5o=; b=I1f GsWcQgzQ0C23eR0MqfwzuisrXEWvTCynEqEOLHc6Bk0ONBiqQjQKKKvFIB5qAsVqpBF9++kAdPhFz 4+IccmSGPS1vXwcnLACPT3Q/R5k+OZj1J+MbaGPy6zoVEmHw83lko5+7sz4EOKHu4hOraI4jgSNGB sHo1Kbn8Zetiq5ovtvI/LVyYrrDrRiqhw3Dc9dLHRd6LXH0zkSDccsf0AobgalNW0xGbhou47ABB3 1gDbcgY+rVivvoc6PnA0TNhQrc+zlAjFXaXhH9AJTTLfoEuk6E6Doh9oGSJ+RaMfT13BRPlVTpQaC CHC/nyItprw6quCUm9SLKWx/+F16qcw==; 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 1hNe5z-0006Sn-Dh; Mon, 06 May 2019 13:55:55 +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 1hNe5w-0006SM-G6 for ath11k@lists.infradead.org; Mon, 06 May 2019 13:55:53 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 827E2608FC; Mon, 6 May 2019 13:55:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1557150951; bh=p2YTpMIj9ydI9kT0VFj7gVzu3eJB3pJpbubKVOyFaRc=; h=From:To:Cc:Subject:Date:From; b=T7eTO20qi0S3GbChCqEJ6saKmBPrQ4na7uPYJuVXQFEPWO0KcqZUbguNzZZ4Nz4S4 Z6SH/4R3IifAG/9aimsFJtxVEzyEdqDZZ8kZAAQntn4MlJqR8pof8SV1bLhqvV6GuN l5ZTk5vEi4GuPONY8dsW4pEgALOdhLpBQdmwRmBc= Received: from checstp253621-lin.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: srirrama@codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id F331560112; Mon, 6 May 2019 13:55:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1557150951; bh=p2YTpMIj9ydI9kT0VFj7gVzu3eJB3pJpbubKVOyFaRc=; h=From:To:Cc:Subject:Date:From; b=T7eTO20qi0S3GbChCqEJ6saKmBPrQ4na7uPYJuVXQFEPWO0KcqZUbguNzZZ4Nz4S4 Z6SH/4R3IifAG/9aimsFJtxVEzyEdqDZZ8kZAAQntn4MlJqR8pof8SV1bLhqvV6GuN l5ZTk5vEi4GuPONY8dsW4pEgALOdhLpBQdmwRmBc= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org F331560112 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=srirrama@codeaurora.org From: Sriram R To: ath11k@lists.infradead.org Subject: [PATCH] ath11k: update dfs cac timeout for weather radar band Date: Mon, 6 May 2019 19:24:31 +0530 Message-Id: <1557150871-1070-1-git-send-email-srirrama@codeaurora.org> X-Mailer: git-send-email 2.7.4 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190506_065552_575704_A487A003 X-CRM114-Status: GOOD ( 15.20 ) X-BeenThere: ath11k@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sriram R MIME-Version: 1.0 Sender: "ath11k" Errors-To: ath11k-bounces+patchwork-ath11k=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP DFS CAC Timeout needs to be updated to 600s for channels in weather radar band. Split the reg rule if the rule has weather radar band between start and end freq and update the cac timeout. Signed-off-by: Sriram R --- drivers/net/wireless/ath/ath11k/reg.c | 137 ++++++++++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/reg.c b/drivers/net/wireless/ath/ath11k/reg.c index 8388299..1fef688 100644 --- a/drivers/net/wireless/ath/ath11k/reg.c +++ b/drivers/net/wireless/ath/ath11k/reg.c @@ -12,6 +12,10 @@ #define ATH11K_5GHZ_5725_5850 REG_RULE(5725 - 10, 5850 + 10, 80, 0, 30,\ NL80211_RRF_NO_IR) +#define ETSI_WEATHER_RADAR_BAND_LOW 5590 +#define ETSI_WEATHER_RADAR_BAND_HIGH 5650 +#define ETSI_WEATHER_RADAR_BAND_CAC_TIMEOUT 600000 + static const struct ieee80211_regdomain ath11k_world_regd = { .n_reg_rules = 3, .alpha2 = "00", @@ -441,6 +445,107 @@ ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region) } } +static u16 +ath11k_reg_adjust_bw(u16 start_freq, u16 end_freq, u16 max_bw) +{ + u16 bw; + + bw = end_freq - start_freq; + bw = min_t(u16, bw, max_bw); + + if (bw >= 80 && bw < 160) + bw = 80; + else if (bw >= 40 && bw < 80) + bw = 40; + else if (bw < 40) + bw = 20; + + return bw; +} + +static void +ath11k_reg_update_weather_radar_band(struct ath11k_base *ab, + struct ieee80211_regdomain *regd, + struct cur_reg_rule *reg_rule, + u8 *rule_idx, u32 flags, u16 max_bw) +{ + u32 end_freq; + u16 bw; + u8 i; + + i = *rule_idx; + + bw = ath11k_reg_adjust_bw(reg_rule->start_freq, + ETSI_WEATHER_RADAR_BAND_LOW, max_bw); + + regd->reg_rules[i] = (struct ieee80211_reg_rule) + REG_RULE(reg_rule->start_freq, + ETSI_WEATHER_RADAR_BAND_LOW, + bw, + reg_rule->ant_gain, + reg_rule->reg_power, + flags); + + ath11k_dbg(ab, ATH11K_DBG_REG, + "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", + i + 1, reg_rule->start_freq, ETSI_WEATHER_RADAR_BAND_LOW, + bw, reg_rule->ant_gain, reg_rule->reg_power, + regd->reg_rules[i].dfs_cac_ms, + flags); + + if (reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_HIGH) + end_freq = ETSI_WEATHER_RADAR_BAND_HIGH; + else + end_freq = reg_rule->end_freq; + + bw = ath11k_reg_adjust_bw(ETSI_WEATHER_RADAR_BAND_LOW, end_freq, + max_bw); + + regd->reg_rules[++i] = (struct ieee80211_reg_rule) + REG_RULE(ETSI_WEATHER_RADAR_BAND_LOW, + end_freq, + bw, + reg_rule->ant_gain, + reg_rule->reg_power, + flags); + + regd->reg_rules[i].dfs_cac_ms = ETSI_WEATHER_RADAR_BAND_CAC_TIMEOUT; + + ath11k_dbg(ab, ATH11K_DBG_REG, + "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", + i + 1, ETSI_WEATHER_RADAR_BAND_LOW, end_freq, + bw, reg_rule->ant_gain, reg_rule->reg_power, + regd->reg_rules[i].dfs_cac_ms, + flags); + + if (end_freq == reg_rule->end_freq) { + regd->n_reg_rules--; + *rule_idx = i; + return; + } + + bw = ath11k_reg_adjust_bw(ETSI_WEATHER_RADAR_BAND_HIGH, + reg_rule->end_freq, max_bw); + + regd->reg_rules[++i] = + (struct ieee80211_reg_rule) + REG_RULE(ETSI_WEATHER_RADAR_BAND_HIGH, + reg_rule->end_freq, + bw, + reg_rule->ant_gain, + reg_rule->reg_power, + flags); + + ath11k_dbg(ab, ATH11K_DBG_REG, + "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", + i + 1, ETSI_WEATHER_RADAR_BAND_HIGH, reg_rule->end_freq, + bw, reg_rule->ant_gain, reg_rule->reg_power, + regd->reg_rules[i].dfs_cac_ms, + flags); + + *rule_idx = i; +} + struct ieee80211_regdomain * ath11k_reg_build_regd(struct ath11k_base *ab, struct cur_regulatory_info *reg_info, bool intersect) @@ -458,6 +563,10 @@ ath11k_reg_build_regd(struct ath11k_base *ab, if (!num_rules) goto ret; + /* Add max additional rules to accommodate weather radar band */ + if (reg_info->dfs_region == DFS_ETSI_REG) + num_rules += 2; + tmp_regd = kzalloc(sizeof(*tmp_regd) + (num_rules * sizeof(struct ieee80211_reg_rule)), GFP_ATOMIC); @@ -477,13 +586,15 @@ ath11k_reg_build_regd(struct ath11k_base *ab, /* Update reg_rules[] below. Firmware is expected to * send these rules in order(2G rules first and then 5G) */ - for (; i < num_rules; i++) { - if (i < reg_info->num_2g_reg_rules) { + for (; i < tmp_regd->n_reg_rules; i++) { + if (reg_info->num_2g_reg_rules && + (i < reg_info->num_2g_reg_rules)) { reg_rule = reg_info->reg_rules_2g_ptr + i; max_bw = min_t(u16, reg_rule->max_bw, reg_info->max_bw_2g); flags = 0; - } else { + } else if (reg_info->num_5g_reg_rules && + (j < reg_info->num_5g_reg_rules)) { reg_rule = reg_info->reg_rules_5g_ptr + j++; max_bw = min_t(u16, reg_rule->max_bw, reg_info->max_bw_5g); @@ -495,6 +606,8 @@ ath11k_reg_build_regd(struct ath11k_base *ab, * per other BW rule flags we pass from here */ flags = NL80211_RRF_AUTO_BW; + } else { + break; } flags |= ath11k_map_fw_reg_flags(reg_rule->flags); @@ -508,12 +621,26 @@ ath11k_reg_build_regd(struct ath11k_base *ab, reg_rule->reg_power, flags); - /* TODO: Fill DFS CAC Timeout (dfs_cac_ms) */ + /* Update dfs cac timeout if the dfs domain is ETSI and the + * new rule covers weather radar band. + * Default value of '0' corresponds to 60s timeout, so no + * need to update that for other rules. + */ + if (flags & NL80211_RRF_DFS && + reg_info->dfs_region == DFS_ETSI_REG && + (reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_LOW && + reg_rule->start_freq < ETSI_WEATHER_RADAR_BAND_HIGH)){ + ath11k_reg_update_weather_radar_band(ab, tmp_regd, + reg_rule, &i, + flags, max_bw); + continue; + } ath11k_dbg(ab, ATH11K_DBG_REG, - "\t%d. (%d - %d @ %d) (%d, %d) (FLAGS %d) \n", + "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", i + 1, reg_rule->start_freq, reg_rule->end_freq, max_bw, reg_rule->ant_gain, reg_rule->reg_power, + tmp_regd->reg_rules[i].dfs_cac_ms, flags); }