From patchwork Fri Oct 29 22:36:53 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Lamparter X-Patchwork-Id: 291462 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o9TNZtgt003486 for ; Fri, 29 Oct 2010 23:35:55 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762175Ab0J2Xft (ORCPT ); Fri, 29 Oct 2010 19:35:49 -0400 Received: from mail-bw0-f46.google.com ([209.85.214.46]:52780 "EHLO mail-bw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1762166Ab0J2Xfl (ORCPT ); Fri, 29 Oct 2010 19:35:41 -0400 Received: by bwz11 with SMTP id 11so3037818bwz.19 for ; Fri, 29 Oct 2010 16:35:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:received:received:received:message-id :in-reply-to:references:from:date:subject:to:cc; bh=BH6FAjVLFbwSXQY66WLG7xfKJ7yHTJoKoueTAiSPAqg=; b=FkDznmrMSE/QHNuYvo7oDkBotgN9jrYBV++5/6v8zV4fmTsm5xtVR5bGqRzbMHKSqC P1fjYipoC/yQSLCTjb7zorGHj379Smzom2/OaOIolMMsslA6Et8ppioMDN8u0hfanrkt /lBJKStETGUUrA9/F+CzeXhXR7bMWZMAuHN7U= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=message-id:in-reply-to:references:from:date:subject:to:cc; b=Wo8vHiA92GG/G+oGtDAvjb41VF5nXxpzHd4j+ZFXYfBLV0GHI4roio6dI9DiEb3Rg7 lGe+ivD+DrEXmBpsno+9BgZVcuk5l7eeiYNmJ7CYShOqGzkFtFifowzOBeg1fOW5bx+p dLV4aFgM0Y9j09/dKrCqDDeEslUDWyJlCEA7w= Received: by 10.204.120.80 with SMTP id c16mr3972193bkr.162.1288395340395; Fri, 29 Oct 2010 16:35:40 -0700 (PDT) Received: from debian64.daheim (p549CD71F.dip.t-dialin.net [84.156.215.31]) by mx.google.com with ESMTPS id t10sm1261151bkj.16.2010.10.29.16.35.38 (version=TLSv1/SSLv3 cipher=RC4-MD5); Fri, 29 Oct 2010 16:35:39 -0700 (PDT) Received: from debian64.daheim ([192.168.0.4] helo=debian64.localnet ident=chuck) by debian64.daheim with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1PByTx-0002K8-Pz; Sat, 30 Oct 2010 01:35:37 +0200 Message-Id: <575d9ba986bd3ae5c8f2bbc5dd64fdbb38fcbaff.1288393804.git.chunkeey@googlemail.com> In-Reply-To: References: From: Christian Lamparter Date: Sat, 30 Oct 2010 00:36:53 +0200 Subject: [PATCH 6/6] carl9170: configurable beacon rates To: linux-wireless@vger.kernel.org Cc: linville@tuxdriver.com Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Fri, 29 Oct 2010 23:35:55 +0000 (UTC) diff --git a/drivers/net/wireless/ath/carl9170/mac.c b/drivers/net/wireless/ath/carl9170/mac.c index c34eeee..385cf50 100644 --- a/drivers/net/wireless/ath/carl9170/mac.c +++ b/drivers/net/wireless/ath/carl9170/mac.c @@ -457,8 +457,9 @@ int carl9170_set_beacon_timers(struct ar9170 *ar) int carl9170_update_beacon(struct ar9170 *ar, const bool submit) { - struct sk_buff *skb; + struct sk_buff *skb = NULL; struct carl9170_vif_info *cvif; + struct ieee80211_tx_info *txinfo; __le32 *data, *old = NULL; u32 word, off, addr, len; int i = 0, err = 0; @@ -487,7 +488,13 @@ found: if (!skb) { err = -ENOMEM; - goto out_unlock; + goto err_free; + } + + txinfo = IEEE80211_SKB_CB(skb); + if (txinfo->control.rates[0].flags & IEEE80211_TX_RC_MCS) { + err = -EINVAL; + goto err_free; } spin_lock_bh(&ar->beacon_lock); @@ -504,11 +511,8 @@ found: wiphy_err(ar->hw->wiphy, "beacon does not " "fit into device memory!\n"); } - - spin_unlock_bh(&ar->beacon_lock); - dev_kfree_skb_any(skb); err = -EINVAL; - goto out_unlock; + goto err_unlock; } if (len > AR9170_MAC_BCN_LENGTH_MAX) { @@ -518,22 +522,22 @@ found: AR9170_MAC_BCN_LENGTH_MAX, len); } - spin_unlock_bh(&ar->beacon_lock); - dev_kfree_skb_any(skb); err = -EMSGSIZE; - goto out_unlock; + goto err_unlock; } - carl9170_async_regwrite_begin(ar); + i = txinfo->control.rates[0].idx; + if (txinfo->band != IEEE80211_BAND_2GHZ) + i += 4; - /* XXX: use skb->cb info */ - if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ) { - carl9170_async_regwrite(AR9170_MAC_REG_BCN_PLCP, - ((skb->len + FCS_LEN) << (3 + 16)) + 0x0400); - } else { - carl9170_async_regwrite(AR9170_MAC_REG_BCN_PLCP, - ((skb->len + FCS_LEN) << 16) + 0x001b); - } + word = __carl9170_ratetable[i].hw_value & 0xf; + if (i < 4) + word |= ((skb->len + FCS_LEN) << (3 + 16)) + 0x0400; + else + word |= ((skb->len + FCS_LEN) << 16) + 0x0010; + + carl9170_async_regwrite_begin(ar); + carl9170_async_regwrite(AR9170_MAC_REG_BCN_PLCP, word); for (i = 0; i < DIV_ROUND_UP(skb->len, 4); i++) { /* @@ -557,7 +561,7 @@ found: cvif->beacon = skb; spin_unlock_bh(&ar->beacon_lock); if (err) - goto out_unlock; + goto err_free; if (submit) { err = carl9170_bcn_ctrl(ar, cvif->id, @@ -565,10 +569,18 @@ found: addr, skb->len + FCS_LEN); if (err) - goto out_unlock; + goto err_free; } out_unlock: rcu_read_unlock(); + return 0; + +err_unlock: + spin_unlock_bh(&ar->beacon_lock); + +err_free: + rcu_read_unlock(); + dev_kfree_skb_any(skb); return err; }