From patchwork Tue Apr 1 07:25:23 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Kazior X-Patchwork-Id: 3919131 Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id BF9F8BF540 for ; Tue, 1 Apr 2014 07:31:32 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BEDE4203AF for ; Tue, 1 Apr 2014 07:31:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3A7DB20380 for ; Tue, 1 Apr 2014 07:31:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751289AbaDAHb1 (ORCPT ); Tue, 1 Apr 2014 03:31:27 -0400 Received: from mail-wg0-f42.google.com ([74.125.82.42]:51858 "EHLO mail-wg0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751236AbaDAHb0 (ORCPT ); Tue, 1 Apr 2014 03:31:26 -0400 Received: by mail-wg0-f42.google.com with SMTP id y10so6830999wgg.1 for ; Tue, 01 Apr 2014 00:31:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tieto.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=T5/1IYvwTFoWeFC2QlawIt1TSNtzAvys6AJ2hWEngkk=; b=Tysv0M44emGDRCwTb8mNADd9jiS/YuGxatEt6BGqsUJzl/F1UPE50rs56JMFZ703fH ZzuMpwxfBiPO2B1GOZs4ub/PFpU9UcW6lg+0SVbE51UQm7EzCwT27FstFYmKjbSWBKL/ YPXH32X2N4Dku7jwiXWOGTPe4vhypXJ8b+7Uo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=T5/1IYvwTFoWeFC2QlawIt1TSNtzAvys6AJ2hWEngkk=; b=LWQoOTsxcvy5WLfy+vJMgvsPkuWDzPIiLSJXQWG8T1hzT1kFEjWo5TLYbwId55n1kD WsScFaSrzSK9VQNKWaZDf3D/NXqaKkfmKigeJOfKc1l0KYUtg6uCrI9GMDbIB3C74Z5l rkngBcqCfgZhHZo6acm5M1fB91LFJ/Rumz4YV2Ff/5K7f+tKsjyydUWUBCYaQnvBzIWp /vvBBnapTMLLAFtGYhBe1oXLQD4PswFOfGmIJZin0PsnSFCkEIBfk20z1YZNkYp+OSNL XlXQc360Gf83CPre5cNbIt3rhUdz+bCitnWjqVfV9o8DhQm5Op1CKZkm1Eo1PILzuSoQ dllQ== X-Gm-Message-State: ALoCoQkTblEvzHV5QveN1xzbs55TdV99iQJD5EgG7c/kjjSFH7mUhuxDNUEPrncdop+E+p764hAv4jV2ysjGbIhxtXIe0gLDY2UsXWgdqfjNRilsWXnKt4E= X-Received: by 10.180.19.69 with SMTP id c5mr17874395wie.7.1396337484584; Tue, 01 Apr 2014 00:31:24 -0700 (PDT) Received: from localhost.localdomain ([91.198.246.8]) by mx.google.com with ESMTPSA id u1sm38559237eex.31.2014.04.01.00.31.23 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Apr 2014 00:31:24 -0700 (PDT) From: Michal Kazior To: ath10k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, Michal Kazior Subject: [PATCH] ath10k: fix initial radar detection logic Date: Tue, 1 Apr 2014 09:25:23 +0200 Message-Id: <1396337123-12622-1-git-send-email-michal.kazior@tieto.com> X-Mailer: git-send-email 1.8.5.3 In-Reply-To: <1396015934-7723-1-git-send-email-michal.kazior@tieto.com> References: <1396015934-7723-1-git-send-email-michal.kazior@tieto.com> X-DomainID: tieto.com Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This fixes a problem of initial radar detection (CAC) being stuck and blocking Rx in some cases until all interfaces were brought down. For userspace this meant first run of hostapd would perform CAC but due to filtered Rx no clients would associate. Subsequent runs of hostapd would not perform CAC (as it was already done) and would associate clients. This also makes sure radar detection is performed when bandwidth is widened. Before if 20MHz CAC was performed then 40MHz CAC wouldn't start monitor vdev effectively disabling initial radar detection. A driver should just start/stop radar detection based on hw->conf.radar_enabled. However, since ath10k needs to start a monitor vdev for the initial radar detection special care needs to be applied. While at it cleanup the code a bit. Signed-off-by: Michal Kazior --- drivers/net/wireless/ath/ath10k/core.h | 2 ++ drivers/net/wireless/ath/ath10k/mac.c | 56 ++++++++++++---------------------- 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h index 8edd6da..ca2abe2 100644 --- a/drivers/net/wireless/ath/ath10k/core.h +++ b/drivers/net/wireless/ath/ath10k/core.h @@ -434,6 +434,8 @@ struct ath10k { unsigned int filter_flags; unsigned long dev_flags; u32 dfs_block_radar_events; + bool radar_enabled; /* protected by conf_mutex */ + int num_started_vdevs; /* protected by conf_mutex */ struct wmi_pdev_set_wmm_params_arg wmm_params; struct completion install_key_done; diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index 58ec5a7..024fce4 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c @@ -489,6 +489,8 @@ static inline int ath10k_vdev_setup_sync(struct ath10k *ar) return 0; } +static void ath10k_recalc_radar_detection(struct ath10k *ar); + static int ath10k_vdev_start(struct ath10k_vif *arvif) { struct ath10k *ar = arvif->ar; @@ -545,6 +547,9 @@ static int ath10k_vdev_start(struct ath10k_vif *arvif) return ret; } + ar->num_started_vdevs++; + ath10k_recalc_radar_detection(ar); + return ret; } @@ -571,6 +576,11 @@ static int ath10k_vdev_stop(struct ath10k_vif *arvif) return ret; } + if (WARN_ON(ar->num_started_vdevs == 0)) { + ar->num_started_vdevs--; + ath10k_recalc_radar_detection(ar); + } + return ret; } @@ -804,49 +814,18 @@ static int ath10k_stop_cac(struct ath10k *ar) return 0; } -static const char *ath10k_dfs_state(enum nl80211_dfs_state dfs_state) -{ - switch (dfs_state) { - case NL80211_DFS_USABLE: - return "USABLE"; - case NL80211_DFS_UNAVAILABLE: - return "UNAVAILABLE"; - case NL80211_DFS_AVAILABLE: - return "AVAILABLE"; - default: - WARN_ON(1); - return "bug"; - } -} - -static void ath10k_config_radar_detection(struct ath10k *ar) +static void ath10k_recalc_radar_detection(struct ath10k *ar) { - struct ieee80211_channel *chan = ar->hw->conf.chandef.chan; - bool radar = ar->hw->conf.radar_enabled; - bool chan_radar = !!(chan->flags & IEEE80211_CHAN_RADAR); - enum nl80211_dfs_state dfs_state = chan->dfs_state; int ret; lockdep_assert_held(&ar->conf_mutex); - ath10k_dbg(ATH10K_DBG_MAC, - "mac radar config update: chan %dMHz radar %d chan radar %d chan state %s\n", - chan->center_freq, radar, chan_radar, - ath10k_dfs_state(dfs_state)); - - /* - * It's safe to call it even if CAC is not started. - * This call here guarantees changing channel, etc. will stop CAC. - */ ath10k_stop_cac(ar); - if (!radar) - return; - - if (!chan_radar) + if (!ar->radar_enabled) return; - if (dfs_state != NL80211_DFS_USABLE) + if (ar->num_started_vdevs > 0) return; ret = ath10k_start_cac(ar); @@ -2341,6 +2320,7 @@ static int ath10k_start(struct ieee80211_hw *hw) goto exit; } + ar->num_started_vdevs = 0; ath10k_regd_update(ar); ret = 0; @@ -2490,15 +2470,17 @@ static int ath10k_config(struct ieee80211_hw *hw, u32 changed) if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { ath10k_dbg(ATH10K_DBG_MAC, - "mac config channel %d mhz flags 0x%x\n", + "mac config channel %dMHz flags 0x%x radar %d\n", conf->chandef.chan->center_freq, - conf->chandef.chan->flags); + conf->chandef.chan->flags, + conf->radar_enabled); spin_lock_bh(&ar->data_lock); ar->rx_channel = conf->chandef.chan; spin_unlock_bh(&ar->data_lock); - ath10k_config_radar_detection(ar); + ar->radar_enabled = conf->radar_enabled; + ath10k_recalc_radar_detection(ar); if (!cfg80211_chandef_identical(&ar->chandef, &conf->chandef)) { ar->chandef = conf->chandef;