Commit 516a0930 authored by Andrea Merello's avatar Andrea Merello Committed by John W. Linville

rtl8180: support for BSS_CHANGED_BASIC_RATES

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: default avatarAndrea Merello <andrea.merello@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent bf888184
...@@ -371,6 +371,36 @@ void rtl8180_set_anaparam(struct rtl8180_priv *priv, u32 anaparam) ...@@ -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); 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) static int rtl8180_init_hw(struct ieee80211_hw *dev)
{ {
struct rtl8180_priv *priv = dev->priv; struct rtl8180_priv *priv = dev->priv;
...@@ -441,9 +471,6 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev) ...@@ -441,9 +471,6 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev)
if (priv->chip_family != RTL818X_CHIP_FAMILY_RTL8180) { if (priv->chip_family != RTL818X_CHIP_FAMILY_RTL8180) {
rtl818x_iowrite8(priv, &priv->map->WPA_CONF, 0); rtl818x_iowrite8(priv, &priv->map->WPA_CONF, 0);
rtl818x_iowrite8(priv, &priv->map->RATE_FALLBACK, 0x81); 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? */ /* TODO: set ClkRun enable? necessary? */
reg = rtl818x_ioread8(priv, &priv->map->GP_ENABLE); reg = rtl818x_ioread8(priv, &priv->map->GP_ENABLE);
...@@ -453,7 +480,6 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev) ...@@ -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->CONFIG3, reg | (1 << 2));
rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
} else { } else {
rtl818x_iowrite16(priv, &priv->map->BRSR, 0x1);
rtl818x_iowrite8(priv, &priv->map->SECURITY, 0); rtl818x_iowrite8(priv, &priv->map->SECURITY, 0);
rtl818x_iowrite8(priv, &priv->map->PHY_DELAY, 0x6); rtl818x_iowrite8(priv, &priv->map->PHY_DELAY, 0x6);
...@@ -461,8 +487,18 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev) ...@@ -461,8 +487,18 @@ static int rtl8180_init_hw(struct ieee80211_hw *dev)
} }
priv->rf->init(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; return 0;
} }
...@@ -857,6 +893,9 @@ static void rtl8180_bss_info_changed(struct ieee80211_hw *dev, ...@@ -857,6 +893,9 @@ static void rtl8180_bss_info_changed(struct ieee80211_hw *dev,
rtl818x_iowrite8(priv, &priv->map->MSR, reg); 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) if (changed & BSS_CHANGED_ERP_SLOT && priv->rf->conf_erp)
priv->rf->conf_erp(dev, info); priv->rf->conf_erp(dev, info);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment