aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
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
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')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c13
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00mac.c10
2 files changed, 14 insertions, 9 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 6fa654956f4e..a53536dc882d 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);
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
index 283a8d9874ee..36ddee8dc9e2 100644
--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
@@ -283,14 +283,8 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
283 * invalid behavior in the device. 283 * invalid behavior in the device.
284 */ 284 */
285 memcpy(&intf->mac, vif->addr, ETH_ALEN); 285 memcpy(&intf->mac, vif->addr, ETH_ALEN);
286 if (vif->type == NL80211_IFTYPE_AP) { 286 rt2x00lib_config_intf(rt2x00dev, intf, vif->type,
287 memcpy(&intf->bssid, vif->addr, ETH_ALEN); 287 intf->mac, NULL);
288 rt2x00lib_config_intf(rt2x00dev, intf, vif->type,
289 intf->mac, intf->bssid);
290 } else {
291 rt2x00lib_config_intf(rt2x00dev, intf, vif->type,
292 intf->mac, NULL);
293 }
294 288
295 /* 289 /*
296 * Some filters depend on the current working mode. We can force 290 * Some filters depend on the current working mode. We can force