aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2800lib.c
diff options
context:
space:
mode:
authorHelmut Schaa <helmut.schaa@googlemail.com>2010-11-04 15:42:36 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-11-15 13:26:08 -0500
commitfa8b4b22d543b4052602b0c86065150613ed19e8 (patch)
tree7ec20ce5695b7b2f7bfbfe6b149f9a639b6f586a /drivers/net/wireless/rt2x00/rt2800lib.c
parent070192dd2975c0e97bbdeac7623b755235c6db7d (diff)
rt2x00: Fix hw crypto in AP mode for some devices
The BSSID register shouldn't be set in AP mode on some older devices (like rt73usb) as it breaks hw crypto on these. However, rt2800 devices explicitly need the BSSID register set to the same value as our own MAC address (only in AP mode). Hence, don't set the BSSID from rt2x00lib but move it down into rt2800 to avoid problems on older devices. This fixes a regression (at least for rt73usb) and avoids a new regression for rt2800 devices in 2.6.36. Reported-by: Johannes Stezenbach <js@sig21.net> Reported-by: Lee <lee-in-berlin@web.de> Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800lib.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 6fa654956f4..a53536dc882 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1148,6 +1148,7 @@ void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
1148 struct rt2x00intf_conf *conf, const unsigned int flags) 1148 struct rt2x00intf_conf *conf, const unsigned int flags)
1149{ 1149{
1150 u32 reg; 1150 u32 reg;
1151 bool update_bssid = false;
1151 1152
1152 if (flags & CONFIG_UPDATE_TYPE) { 1153 if (flags & CONFIG_UPDATE_TYPE) {
1153 /* 1154 /*
@@ -1177,6 +1178,16 @@ void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
1177 } 1178 }
1178 1179
1179 if (flags & CONFIG_UPDATE_MAC) { 1180 if (flags & CONFIG_UPDATE_MAC) {
1181 if (flags & CONFIG_UPDATE_TYPE &&
1182 conf->sync == TSF_SYNC_AP_NONE) {
1183 /*
1184 * The BSSID register has to be set to our own mac
1185 * address in AP mode.
1186 */
1187 memcpy(conf->bssid, conf->mac, sizeof(conf->mac));
1188 update_bssid = true;
1189 }
1190
1180 if (!is_zero_ether_addr((const u8 *)conf->mac)) { 1191 if (!is_zero_ether_addr((const u8 *)conf->mac)) {
1181 reg = le32_to_cpu(conf->mac[1]); 1192 reg = le32_to_cpu(conf->mac[1]);
1182 rt2x00_set_field32(&reg, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff); 1193 rt2x00_set_field32(&reg, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff);
@@ -1187,7 +1198,7 @@ void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
1187 conf->mac, sizeof(conf->mac)); 1198 conf->mac, sizeof(conf->mac));
1188 } 1199 }
1189 1200
1190 if (flags & CONFIG_UPDATE_BSSID) { 1201 if ((flags & CONFIG_UPDATE_BSSID) || update_bssid) {
1191 if (!is_zero_ether_addr((const u8 *)conf->bssid)) { 1202 if (!is_zero_ether_addr((const u8 *)conf->bssid)) {
1192 reg = le32_to_cpu(conf->bssid[1]); 1203 reg = le32_to_cpu(conf->bssid[1]);
1193 rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 3); 1204 rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 3);