rtl8180: support for BSS_CHANGED_BASIC_RATES
authorAndrea Merello <andrea.merello@gmail.com>
Sat, 15 Mar 2014 17:29:36 +0000 (18:29 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 17 Mar 2014 17:44:15 +0000 (13:44 -0400)
Basic rates setting is done with hardcoded register write with
fixed settings.

This patch introduces a new function that makes it possible to
configure basic rates and it add a check for mac80211
BSS_CHANGED_BASIC_RATES flag in order to eventually invoke that
function when needed.

Signed-off-by: Andrea Merello <andrea.merello@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rtl818x/rtl8180/dev.c

index 3c2b784fd783a1ce76ec3998e63cdc4019631648..ede8fee1333241eb64d304e93c32eb0bd844a973 100644 (file)
@@ -371,6 +371,36 @@ void rtl8180_set_anaparam(struct rtl8180_priv *priv, u32 anaparam)
        rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
 }
 
+static void rtl8180_conf_basic_rates(struct ieee80211_hw *dev,
+                           u32 rates_mask)
+{
+       struct rtl8180_priv *priv = dev->priv;
+
+       u8 max, min;
+       u16 reg;
+
+       max = fls(rates_mask) - 1;
+       min = ffs(rates_mask) - 1;
+
+       switch (priv->chip_family) {
+
+       case RTL818X_CHIP_FAMILY_RTL8180:
+               /* in 8180 this is NOT a BITMAP */
+               reg = rtl818x_ioread16(priv, &priv->map->BRSR);
+               reg &= ~3;
+               reg |= max;
+               rtl818x_iowrite16(priv, &priv->map->BRSR, reg);
+
+               break;
+
+       case RTL818X_CHIP_FAMILY_RTL8185:
+               /* in 8185 this is a BITMAP */
+               rtl818x_iowrite16(priv, &priv->map->BRSR, rates_mask);
+               rtl818x_iowrite8(priv, &priv->map->RESP_RATE, (max << 4) | min);
+               break;
+       }
+}
+
 static int rtl8180_init_hw(struct ieee80211_hw *dev)
 {
        struct rtl8180_priv *priv = dev->priv;
@@ -441,9 +471,6 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev)
        if (priv->chip_family != RTL818X_CHIP_FAMILY_RTL8180) {
                rtl818x_iowrite8(priv, &priv->map->WPA_CONF, 0);
                rtl818x_iowrite8(priv, &priv->map->RATE_FALLBACK, 0x81);
-               rtl818x_iowrite8(priv, &priv->map->RESP_RATE, (8 << 4) | 0);
-
-               rtl818x_iowrite16(priv, &priv->map->BRSR, 0x01F3);
 
                /* TODO: set ClkRun enable? necessary? */
                reg = rtl818x_ioread8(priv, &priv->map->GP_ENABLE);
@@ -453,7 +480,6 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev)
                rtl818x_iowrite8(priv, &priv->map->CONFIG3, reg | (1 << 2));
                rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
        } else {
-               rtl818x_iowrite16(priv, &priv->map->BRSR, 0x1);
                rtl818x_iowrite8(priv, &priv->map->SECURITY, 0);
 
                rtl818x_iowrite8(priv, &priv->map->PHY_DELAY, 0x6);
@@ -461,8 +487,18 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev)
        }
 
        priv->rf->init(dev);
-       if (priv->chip_family == RTL818X_CHIP_FAMILY_RTL8185)
-               rtl818x_iowrite16(priv, &priv->map->BRSR, 0x01F3);
+
+       /* default basic rates are 1,2 Mbps for rtl8180. 1,2,6,9,12,18,24 Mbps
+        * otherwise. bitmask 0x3 and 0x01f3 respectively.
+        * NOTE: currenty rtl8225 RF code changes basic rates, so we need to do
+        * this after rf init.
+        * TODO: try to find out whether RF code really needs to do this..
+        */
+       if (priv->chip_family == RTL818X_CHIP_FAMILY_RTL8180)
+               rtl8180_conf_basic_rates(dev, 0x3);
+       else
+               rtl8180_conf_basic_rates(dev, 0x1f3);
+
        return 0;
 }
 
@@ -857,6 +893,9 @@ static void rtl8180_bss_info_changed(struct ieee80211_hw *dev,
                rtl818x_iowrite8(priv, &priv->map->MSR, reg);
        }
 
+       if (changed & BSS_CHANGED_BASIC_RATES)
+               rtl8180_conf_basic_rates(dev, info->basic_rates);
+
        if (changed & BSS_CHANGED_ERP_SLOT && priv->rf->conf_erp)
                priv->rf->conf_erp(dev, info);