Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 into upstream-fixes

+63 -36
+19 -1
drivers/net/wireless/bcm43xx/bcm43xx_main.c
··· 946 u8 channel; 947 struct bcm43xx_phyinfo *phy; 948 const char *iso_country; 949 950 geo = kzalloc(sizeof(*geo), GFP_KERNEL); 951 if (!geo) ··· 968 } 969 iso_country = bcm43xx_locale_iso(bcm->sprom.locale); 970 971 if (have_a) { 972 for (i = 0, channel = IEEE80211_52GHZ_MIN_CHANNEL; 973 channel <= IEEE80211_52GHZ_MAX_CHANNEL; channel++) { ··· 996 } 997 if (have_bg) { 998 for (i = 0, channel = IEEE80211_24GHZ_MIN_CHANNEL; 999 - channel <= IEEE80211_24GHZ_MAX_CHANNEL; channel++) { 1000 chan = &geo->bg[i++]; 1001 chan->freq = bcm43xx_channel_to_freq_bg(channel); 1002 chan->channel = channel;
··· 946 u8 channel; 947 struct bcm43xx_phyinfo *phy; 948 const char *iso_country; 949 + u8 max_bg_channel; 950 951 geo = kzalloc(sizeof(*geo), GFP_KERNEL); 952 if (!geo) ··· 967 } 968 iso_country = bcm43xx_locale_iso(bcm->sprom.locale); 969 970 + /* set the maximum channel based on locale set in sprom or witle locale option */ 971 + switch (bcm->sprom.locale) { 972 + case BCM43xx_LOCALE_THAILAND: 973 + case BCM43xx_LOCALE_ISRAEL: 974 + case BCM43xx_LOCALE_JORDAN: 975 + case BCM43xx_LOCALE_USA_CANADA_ANZ: 976 + case BCM43xx_LOCALE_USA_LOW: 977 + max_bg_channel = 11; 978 + break; 979 + case BCM43xx_LOCALE_JAPAN: 980 + case BCM43xx_LOCALE_JAPAN_HIGH: 981 + max_bg_channel = 14; 982 + break; 983 + default: 984 + max_bg_channel = 13; 985 + } 986 + 987 if (have_a) { 988 for (i = 0, channel = IEEE80211_52GHZ_MIN_CHANNEL; 989 channel <= IEEE80211_52GHZ_MAX_CHANNEL; channel++) { ··· 978 } 979 if (have_bg) { 980 for (i = 0, channel = IEEE80211_24GHZ_MIN_CHANNEL; 981 + channel <= max_bg_channel; channel++) { 982 chan = &geo->bg[i++]; 983 chan->freq = bcm43xx_channel_to_freq_bg(channel); 984 chan->channel = channel;
+32 -25
drivers/net/wireless/bcm43xx/bcm43xx_phy.c
··· 978 { 979 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); 980 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); 981 - u16 backup_phy[15]; 982 u16 backup_radio[3]; 983 u16 backup_bband; 984 u16 i; ··· 989 backup_phy[1] = bcm43xx_phy_read(bcm, 0x0001); 990 backup_phy[2] = bcm43xx_phy_read(bcm, 0x0811); 991 backup_phy[3] = bcm43xx_phy_read(bcm, 0x0812); 992 - backup_phy[4] = bcm43xx_phy_read(bcm, 0x0814); 993 - backup_phy[5] = bcm43xx_phy_read(bcm, 0x0815); 994 backup_phy[6] = bcm43xx_phy_read(bcm, 0x005A); 995 backup_phy[7] = bcm43xx_phy_read(bcm, 0x0059); 996 backup_phy[8] = bcm43xx_phy_read(bcm, 0x0058); ··· 1020 bcm43xx_phy_read(bcm, 0x0811) | 0x0001); 1021 bcm43xx_phy_write(bcm, 0x0812, 1022 bcm43xx_phy_read(bcm, 0x0812) & 0xFFFE); 1023 - bcm43xx_phy_write(bcm, 0x0814, 1024 - bcm43xx_phy_read(bcm, 0x0814) | 0x0001); 1025 - bcm43xx_phy_write(bcm, 0x0815, 1026 - bcm43xx_phy_read(bcm, 0x0815) & 0xFFFE); 1027 - bcm43xx_phy_write(bcm, 0x0814, 1028 - bcm43xx_phy_read(bcm, 0x0814) | 0x0002); 1029 - bcm43xx_phy_write(bcm, 0x0815, 1030 - bcm43xx_phy_read(bcm, 0x0815) & 0xFFFD); 1031 bcm43xx_phy_write(bcm, 0x0811, 1032 bcm43xx_phy_read(bcm, 0x0811) | 0x000C); 1033 bcm43xx_phy_write(bcm, 0x0812, ··· 1052 bcm43xx_phy_read(bcm, 0x000A) 1053 | 0x2000); 1054 } 1055 - bcm43xx_phy_write(bcm, 0x0814, 1056 - bcm43xx_phy_read(bcm, 0x0814) | 0x0004); 1057 - bcm43xx_phy_write(bcm, 0x0815, 1058 - bcm43xx_phy_read(bcm, 0x0815) & 0xFFFB); 1059 bcm43xx_phy_write(bcm, 0x0003, 1060 (bcm43xx_phy_read(bcm, 0x0003) 1061 & 0xFF9F) | 0x0040); ··· 1144 } 1145 } 1146 1147 - bcm43xx_phy_write(bcm, 0x0814, backup_phy[4]); 1148 - bcm43xx_phy_write(bcm, 0x0815, backup_phy[5]); 1149 bcm43xx_phy_write(bcm, 0x005A, backup_phy[6]); 1150 bcm43xx_phy_write(bcm, 0x0059, backup_phy[7]); 1151 bcm43xx_phy_write(bcm, 0x0058, backup_phy[8]); ··· 1196 bcm43xx_phy_write(bcm, 0x0811, 0x0000); 1197 bcm43xx_phy_write(bcm, 0x0015, 0x00C0); 1198 } 1199 - if (phy->rev >= 3) { 1200 bcm43xx_phy_write(bcm, 0x0811, 0x0400); 1201 bcm43xx_phy_write(bcm, 0x0015, 0x00C0); 1202 } 1203 if (phy->rev >= 2 && phy->connected) { 1204 tmp = bcm43xx_phy_read(bcm, 0x0400) & 0xFF; 1205 - if (tmp < 6) { 1206 bcm43xx_phy_write(bcm, 0x04C2, 0x1816); 1207 bcm43xx_phy_write(bcm, 0x04C3, 0x8006); 1208 - if (tmp != 3) { 1209 bcm43xx_phy_write(bcm, 0x04CC, 1210 (bcm43xx_phy_read(bcm, 0x04CC) 1211 & 0x00FF) | 0x1F00); 1212 } 1213 } 1214 - } 1215 - if (phy->rev < 3 && phy->connected) 1216 bcm43xx_phy_write(bcm, 0x047E, 0x0078); 1217 if (radio->revision == 8) { 1218 bcm43xx_phy_write(bcm, 0x0801, bcm43xx_phy_read(bcm, 0x0801) | 0x0080); 1219 bcm43xx_phy_write(bcm, 0x043E, bcm43xx_phy_read(bcm, 0x043E) | 0x0004); ··· 1239 if (phy->rev >= 6) { 1240 bcm43xx_phy_write(bcm, 0x0036, 1241 (bcm43xx_phy_read(bcm, 0x0036) 1242 - & 0xF000) | (radio->txctl2 << 12)); 1243 } 1244 if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL) 1245 bcm43xx_phy_write(bcm, 0x002E, 0x8075); ··· 1250 else 1251 bcm43xx_phy_write(bcm, 0x002F, 0x0202); 1252 } 1253 - if (phy->connected) { 1254 bcm43xx_phy_lo_adjust(bcm, 0); 1255 bcm43xx_phy_write(bcm, 0x080F, 0x8078); 1256 } ··· 1264 */ 1265 bcm43xx_nrssi_hw_update(bcm, 0xFFFF); 1266 bcm43xx_calc_nrssi_threshold(bcm); 1267 - } else if (phy->connected) { 1268 if (radio->nrssi[0] == -1000) { 1269 assert(radio->nrssi[1] == -1000); 1270 bcm43xx_calc_nrssi_slope(bcm);
··· 978 { 979 struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); 980 struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); 981 + u16 backup_phy[15] = {0}; 982 u16 backup_radio[3]; 983 u16 backup_bband; 984 u16 i; ··· 989 backup_phy[1] = bcm43xx_phy_read(bcm, 0x0001); 990 backup_phy[2] = bcm43xx_phy_read(bcm, 0x0811); 991 backup_phy[3] = bcm43xx_phy_read(bcm, 0x0812); 992 + if (phy->rev != 1) { 993 + backup_phy[4] = bcm43xx_phy_read(bcm, 0x0814); 994 + backup_phy[5] = bcm43xx_phy_read(bcm, 0x0815); 995 + } 996 backup_phy[6] = bcm43xx_phy_read(bcm, 0x005A); 997 backup_phy[7] = bcm43xx_phy_read(bcm, 0x0059); 998 backup_phy[8] = bcm43xx_phy_read(bcm, 0x0058); ··· 1018 bcm43xx_phy_read(bcm, 0x0811) | 0x0001); 1019 bcm43xx_phy_write(bcm, 0x0812, 1020 bcm43xx_phy_read(bcm, 0x0812) & 0xFFFE); 1021 + if (phy->rev != 1) { 1022 + bcm43xx_phy_write(bcm, 0x0814, 1023 + bcm43xx_phy_read(bcm, 0x0814) | 0x0001); 1024 + bcm43xx_phy_write(bcm, 0x0815, 1025 + bcm43xx_phy_read(bcm, 0x0815) & 0xFFFE); 1026 + bcm43xx_phy_write(bcm, 0x0814, 1027 + bcm43xx_phy_read(bcm, 0x0814) | 0x0002); 1028 + bcm43xx_phy_write(bcm, 0x0815, 1029 + bcm43xx_phy_read(bcm, 0x0815) & 0xFFFD); 1030 + } 1031 bcm43xx_phy_write(bcm, 0x0811, 1032 bcm43xx_phy_read(bcm, 0x0811) | 0x000C); 1033 bcm43xx_phy_write(bcm, 0x0812, ··· 1048 bcm43xx_phy_read(bcm, 0x000A) 1049 | 0x2000); 1050 } 1051 + if (phy->rev != 1) { 1052 + bcm43xx_phy_write(bcm, 0x0814, 1053 + bcm43xx_phy_read(bcm, 0x0814) | 0x0004); 1054 + bcm43xx_phy_write(bcm, 0x0815, 1055 + bcm43xx_phy_read(bcm, 0x0815) & 0xFFFB); 1056 + } 1057 bcm43xx_phy_write(bcm, 0x0003, 1058 (bcm43xx_phy_read(bcm, 0x0003) 1059 & 0xFF9F) | 0x0040); ··· 1138 } 1139 } 1140 1141 + if (phy->rev != 1) { 1142 + bcm43xx_phy_write(bcm, 0x0814, backup_phy[4]); 1143 + bcm43xx_phy_write(bcm, 0x0815, backup_phy[5]); 1144 + } 1145 bcm43xx_phy_write(bcm, 0x005A, backup_phy[6]); 1146 bcm43xx_phy_write(bcm, 0x0059, backup_phy[7]); 1147 bcm43xx_phy_write(bcm, 0x0058, backup_phy[8]); ··· 1188 bcm43xx_phy_write(bcm, 0x0811, 0x0000); 1189 bcm43xx_phy_write(bcm, 0x0015, 0x00C0); 1190 } 1191 + if (phy->rev > 5) { 1192 bcm43xx_phy_write(bcm, 0x0811, 0x0400); 1193 bcm43xx_phy_write(bcm, 0x0015, 0x00C0); 1194 } 1195 if (phy->rev >= 2 && phy->connected) { 1196 tmp = bcm43xx_phy_read(bcm, 0x0400) & 0xFF; 1197 + if (tmp ==3 || tmp == 5) { 1198 bcm43xx_phy_write(bcm, 0x04C2, 0x1816); 1199 bcm43xx_phy_write(bcm, 0x04C3, 0x8006); 1200 + if (tmp == 5) { 1201 bcm43xx_phy_write(bcm, 0x04CC, 1202 (bcm43xx_phy_read(bcm, 0x04CC) 1203 & 0x00FF) | 0x1F00); 1204 } 1205 } 1206 bcm43xx_phy_write(bcm, 0x047E, 0x0078); 1207 + } 1208 if (radio->revision == 8) { 1209 bcm43xx_phy_write(bcm, 0x0801, bcm43xx_phy_read(bcm, 0x0801) | 0x0080); 1210 bcm43xx_phy_write(bcm, 0x043E, bcm43xx_phy_read(bcm, 0x043E) | 0x0004); ··· 1232 if (phy->rev >= 6) { 1233 bcm43xx_phy_write(bcm, 0x0036, 1234 (bcm43xx_phy_read(bcm, 0x0036) 1235 + & 0x0FFF) | (radio->txctl2 << 12)); 1236 } 1237 if (bcm->sprom.boardflags & BCM43xx_BFL_PACTRL) 1238 bcm43xx_phy_write(bcm, 0x002E, 0x8075); ··· 1243 else 1244 bcm43xx_phy_write(bcm, 0x002F, 0x0202); 1245 } 1246 + if (phy->connected || phy->rev >= 2) { 1247 bcm43xx_phy_lo_adjust(bcm, 0); 1248 bcm43xx_phy_write(bcm, 0x080F, 0x8078); 1249 } ··· 1257 */ 1258 bcm43xx_nrssi_hw_update(bcm, 0xFFFF); 1259 bcm43xx_calc_nrssi_threshold(bcm); 1260 + } else if (phy->connected || phy->rev >= 2) { 1261 if (radio->nrssi[0] == -1000) { 1262 assert(radio->nrssi[1] == -1000); 1263 bcm43xx_calc_nrssi_slope(bcm);
+4 -8
drivers/net/wireless/zd1211rw/zd_chip.c
··· 337 chip->patch_cr157 = (value >> 13) & 0x1; 338 chip->patch_6m_band_edge = (value >> 21) & 0x1; 339 chip->new_phy_layout = (value >> 31) & 0x1; 340 chip->link_led = ((value >> 4) & 1) ? LED1 : LED2; 341 chip->supports_tx_led = 1; 342 if (value & (1 << 24)) { /* LED scenario */ ··· 592 return r; 593 } 594 595 - /* CR157 can be optionally patched by the EEPROM */ 596 static int patch_cr157(struct zd_chip *chip) 597 { 598 int r; 599 - u32 value; 600 601 if (!chip->patch_cr157) 602 return 0; 603 604 - r = zd_ioread32_locked(chip, &value, E2P_PHY_REG); 605 if (r) 606 return r; 607 ··· 791 goto out; 792 793 r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 794 - if (r) 795 - goto unlock; 796 - 797 - r = patch_cr157(chip); 798 - unlock: 799 t = zd_chip_unlock_phy_regs(chip); 800 if (t && !r) 801 r = t;
··· 337 chip->patch_cr157 = (value >> 13) & 0x1; 338 chip->patch_6m_band_edge = (value >> 21) & 0x1; 339 chip->new_phy_layout = (value >> 31) & 0x1; 340 + chip->al2230s_bit = (value >> 7) & 0x1; 341 chip->link_led = ((value >> 4) & 1) ? LED1 : LED2; 342 chip->supports_tx_led = 1; 343 if (value & (1 << 24)) { /* LED scenario */ ··· 591 return r; 592 } 593 594 + /* CR157 can be optionally patched by the EEPROM for original ZD1211 */ 595 static int patch_cr157(struct zd_chip *chip) 596 { 597 int r; 598 + u16 value; 599 600 if (!chip->patch_cr157) 601 return 0; 602 603 + r = zd_ioread16_locked(chip, &value, E2P_PHY_REG); 604 if (r) 605 return r; 606 ··· 790 goto out; 791 792 r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 793 t = zd_chip_unlock_phy_regs(chip); 794 if (t && !r) 795 r = t;
+2 -2
drivers/net/wireless/zd1211rw/zd_chip.h
··· 641 * also only 11 channels. */ 642 #define E2P_ALLOWED_CHANNEL E2P_DATA(0x18) 643 644 - #define E2P_PHY_REG E2P_DATA(0x1a) 645 #define E2P_DEVICE_VER E2P_DATA(0x20) 646 #define E2P_36M_CAL_VALUE1 E2P_DATA(0x28) 647 #define E2P_36M_CAL_VALUE2 E2P_DATA(0x2a) 648 #define E2P_36M_CAL_VALUE3 E2P_DATA(0x2c) ··· 711 u16 link_led; 712 unsigned int pa_type:4, 713 patch_cck_gain:1, patch_cr157:1, patch_6m_band_edge:1, 714 - new_phy_layout:1, 715 is_zd1211b:1, supports_tx_led:1; 716 }; 717
··· 641 * also only 11 channels. */ 642 #define E2P_ALLOWED_CHANNEL E2P_DATA(0x18) 643 644 #define E2P_DEVICE_VER E2P_DATA(0x20) 645 + #define E2P_PHY_REG E2P_DATA(0x25) 646 #define E2P_36M_CAL_VALUE1 E2P_DATA(0x28) 647 #define E2P_36M_CAL_VALUE2 E2P_DATA(0x2a) 648 #define E2P_36M_CAL_VALUE3 E2P_DATA(0x2c) ··· 711 u16 link_led; 712 unsigned int pa_type:4, 713 patch_cck_gain:1, patch_cr157:1, patch_6m_band_edge:1, 714 + new_phy_layout:1, al2230s_bit:1, 715 is_zd1211b:1, supports_tx_led:1; 716 }; 717
+6
drivers/net/wireless/zd1211rw/zd_rf_al2230.c
··· 358 { 359 struct zd_chip *chip = zd_rf_to_chip(rf); 360 361 rf->switch_radio_off = al2230_switch_radio_off; 362 if (chip->is_zd1211b) { 363 rf->init_hw = zd1211b_al2230_init_hw;
··· 358 { 359 struct zd_chip *chip = zd_rf_to_chip(rf); 360 361 + if (chip->al2230s_bit) { 362 + dev_err(zd_chip_dev(chip), "AL2230S devices are not yet " 363 + "supported by this driver.\n"); 364 + return -ENODEV; 365 + } 366 + 367 rf->switch_radio_off = al2230_switch_radio_off; 368 if (chip->is_zd1211b) { 369 rf->init_hw = zd1211b_al2230_init_hw;