wl18xx: ipmlement ap_rate_mask hw op
authorArik Nemtsov <arik@wizery.com>
Thu, 10 May 2012 09:13:32 +0000 (12:13 +0300)
committerLuciano Coelho <coelho@ti.com>
Tue, 5 Jun 2012 12:55:38 +0000 (15:55 +0300)
Enable wide-chan or MIMO rates when appropriate.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wl18xx/main.c
drivers/net/wireless/ti/wl18xx/tx.h
drivers/net/wireless/ti/wlcore/conf.h

index fd7a803ff98ccb78b22af3546618840177d08db2..77840ddd31299f9b64ec0cc7b61ee218fbcbafb9 100644 (file)
@@ -862,6 +862,23 @@ static void wl18xx_set_rx_csum(struct wl1271 *wl,
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 }
 
+static u32 wl18xx_sta_get_ap_rate_mask(struct wl1271 *wl,
+                                      struct wl12xx_vif *wlvif)
+{
+       u32 hw_rate_set = wlvif->rate_set;
+
+       if (wlvif->channel_type == NL80211_CHAN_HT40MINUS ||
+           wlvif->channel_type == NL80211_CHAN_HT40PLUS) {
+               wl1271_debug(DEBUG_ACX, "using wide channel rate mask");
+               hw_rate_set |= CONF_TX_RATE_USE_WIDE_CHAN;
+
+               /* we don't support MIMO in wide-channel mode */
+               hw_rate_set &= ~CONF_TX_MIMO_RATES;
+       }
+
+       return hw_rate_set;
+}
+
 static void wl18xx_conf_init(struct wl1271 *wl)
 {
        struct wl18xx_priv *priv = wl->priv;
@@ -888,6 +905,7 @@ static struct wlcore_ops wl18xx_ops = {
        .hw_init        = wl18xx_hw_init,
        .set_tx_desc_csum = wl18xx_set_tx_desc_csum,
        .set_rx_csum = wl18xx_set_rx_csum,
+       .sta_get_ap_rate_mask = wl18xx_sta_get_ap_rate_mask,
 };
 
 int __devinit wl18xx_probe(struct platform_device *pdev)
index a91eb10a42f2ad498d88252c0a757861b76527c2..2417262de207987232903beecbc809f2770cd4e9 100644 (file)
 #define WL18XX_TX_STATUS_DESC_ID_MASK    0x7F
 #define WL18XX_TX_STATUS_STAT_BIT_IDX    7
 
+/*
+ * The FW uses a special bit to indicate a wide channel should be used in
+ * the rate policy.
+ */
+#define CONF_TX_RATE_USE_WIDE_CHAN BIT(31)
+
 void wl18xx_tx_immediate_complete(struct wl1271 *wl);
 
 #endif /* __WL12XX_TX_H__ */
index 0798c1e88814a192e1304e3a3bb01069ae4516df..14dd361fa828a66a5d9e2259bd5896b15c598b6b 100644 (file)
@@ -443,6 +443,12 @@ struct conf_rx_settings {
        CONF_HW_BIT_RATE_MCS_5 | CONF_HW_BIT_RATE_MCS_6 |        \
        CONF_HW_BIT_RATE_MCS_7)
 
+#define CONF_TX_MIMO_RATES (CONF_HW_BIT_RATE_MCS_8 |             \
+       CONF_HW_BIT_RATE_MCS_9 | CONF_HW_BIT_RATE_MCS_10 |       \
+       CONF_HW_BIT_RATE_MCS_11 | CONF_HW_BIT_RATE_MCS_12 |      \
+       CONF_HW_BIT_RATE_MCS_13 | CONF_HW_BIT_RATE_MCS_14 |      \
+       CONF_HW_BIT_RATE_MCS_15)
+
 /*
  * Default rates for management traffic when operating in AP mode. This
  * should be configured according to the basic rate set of the AP