Cleanup channel initialization and remove device specific value magic calculations. Just deliver a plain list of values. Read the EEPROM for default TXpower values for each channel.
Signed-off-by Ivo van Doorn <[EMAIL PROTECTED]> diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2400pci.c wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2400pci.c --- wireless-2.6/drivers/net/wireless/rt2x00/rt2400pci.c 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2400pci.c 2006-02-12 12:51:28.000000000 +0100 @@ -399,14 +402,8 @@ rt2400pci_config_channel(struct rt2x00_pci *rt2x00pci, int rf2, int channel, int freq) { - u32 rf1 = 0; - u32 rf3 = 0; - - rf1 = cpu_to_le32(0x00022058); - if(rt2x00_rf(&rt2x00pci->chip, RF2420)) - rf3 = cpu_to_le32(0x00000111); - else - rf3 = cpu_to_le32(0x00000101); + u32 rf1 = rt2x00pci->rf1; + u32 rf3 = rt2x00pci->rf3; INFO("Switching channel. RF1: 0x%08x, RF2: 0x%08x, RF3: 0x%08x.\n", rf1, rf2, rf3); @@ -1893,30 +1867,61 @@ struct ieee80211_channel *channels) { int counter = 0; + u16 eeprom = 0; + u32 vals[] = { + 0x000c1fda, 0x000c1fee, 0x000c2002, 0x000c2016, + 0x000c202a, 0x000c203e, 0x000c2052, 0x000c2066, + 0x000c207a, 0x000c208e, 0x000c20a2, 0x000c20b6, + 0x000c20ca, 0x000c20fa + }; /* - * Put the initialization of channels 1-13 in a loop, - * channel 14 needs to be initialized seperately. + * Channel initialization. + * First we set the basic variables. */ for(counter = 0; counter < 13; counter++){ channels[counter].chan = counter + 1; - channels[counter].freq = - 2407 + ((counter + 1) * 5); - channels[counter].val = - cpu_to_le32(0x000c1fda + (counter * 0x14)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; + channels[counter].freq = 2407 + ((counter + 1) * 5); + channels[counter].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN; + channels[counter].val = cpu_to_le32(vals[counter]); + channels[counter].antenna_max = 0xff; } - /* - * Channel 14 initialization. - */ channels[13].chan = 14; channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x000c20fa); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; + channels[13].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN; + channels[13].val = cpu_to_le32(vals[13]); + channels[13].antenna_max = 0xff; + + /* + * Set TX power, each EEPROM TXpower entry + * contains the TXpower value for 2 channels. + */ + for(counter = 0; counter < EEPROM_TXPOWER_SIZE; counter++){ + rt2x00_eeprom_read(rt2x00pci, + EEPROM_TXPOWER_START + counter, &eeprom); + + channels[(counter * 2)].power_level = + rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1); + if(channels[(counter * 2)].power_level > 0x7f) + channels[(counter * 2)].power_level = 0x27; + + channels[(counter * 2) + 1].power_level = + rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2); + if(channels[(counter * 2) + 1].power_level > 0x7f) + channels[(counter * 2) + 1].power_level = 0x27; + } + + /* + * Set device specific, but channel independent RF values. + */ + rt2x00pci->rf1 = cpu_to_le32(0x00022058); + if(rt2x00_rf(&rt2x00pci->chip, RF2420)) + rt2x00pci->rf3 = cpu_to_le32(0x00000111); + else + rt2x00pci->rf3 = cpu_to_le32(0x00000101); } static void diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2500pci.c wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500pci.c --- wireless-2.6/drivers/net/wireless/rt2x00/rt2500pci.c 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500pci.c 2006-02-12 12:51:37.000000000 +0100 @@ -401,54 +404,34 @@ rt2500pci_config_channel(struct rt2x00_pci *rt2x00pci, int rf2, int channel, int freq, int txpower) { - u32 rf1 = 0; - u32 rf3 = 0; - u32 rf4 = 0; + u32 rf1 = rt2x00pci->rf1; + u32 rf3 = rt2x00pci->rf3; + u32 rf4 = rt2x00pci->rf4; txpower = (txpower < 19) ? 19 : txpower; txpower = (txpower > 31) ? 31 : txpower; - if(rt2x00_rf(&rt2x00pci->chip, RF2522)){ - rf1 = cpu_to_le32(0x00002050); - rf3 = cpu_to_le32(0x00000101); - rf4 = 0; - }else if(rt2x00_rf(&rt2x00pci->chip, RF2523)){ - rf1 = cpu_to_le32(0x00022010); - rf3 = cpu_to_le32(0x000e0111); - rf4 = cpu_to_le32(0x00000a1b); - }else if(rt2x00_rf(&rt2x00pci->chip, RF2524)){ - rf1 = cpu_to_le32(0x00032020); - rf3 = cpu_to_le32(0x00000101); - rf4 = cpu_to_le32(0x00000a1b); - }else if(rt2x00_rf(&rt2x00pci->chip, RF2525)){ - rf1 = cpu_to_le32(0x00022020); - rf3 = cpu_to_le32(0x00060111); - rf4 = cpu_to_le32(0x00000a1b); - }else if(rt2x00_rf(&rt2x00pci->chip, RF2525E)){ + if(rt2x00_rf(&rt2x00pci->chip, RF2525E) && channel == 14) + rf4 |= 0x00000010; + + if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ + if(channel < 14){ rf1 = cpu_to_le32(0x00022020); - rf3 = cpu_to_le32(0x00060111); - if(channel != 14) rf4 = cpu_to_le32(0x00000a0b); - else - rf4 = cpu_to_le32(0x00000a1b); - }else if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ - rf3 = cpu_to_le32(0x00000101); - if(channel < 14 - || channel > 149) - rf1 = cpu_to_le32(0x00022020); - else + }else if(channel == 14){ rf1 = cpu_to_le32(0x00022010); - if(channel < 14) - rf4 = cpu_to_le32(0x00000a0b); - else if(channel == 14) rf4 = cpu_to_le32(0x00000a1b); - else if(channel < 64) + }else if(channel < 64){ + rf1 = cpu_to_le32(0x00022010); rf4 = cpu_to_le32(0x00000a1f); - else if(channel < 140) + }else if(channel < 140){ + rf1 = cpu_to_le32(0x00022010); rf4 = cpu_to_le32(0x00000a0f); - else if(channel < 161) + }else if(channel < 161){ + rf1 = cpu_to_le32(0x00022020); rf4 = cpu_to_le32(0x00000a07); } + } INFO("Switching channel. RF1: 0x%08x, RF2: 0x%08x, RF3: 0x%08x, " "RF4: 0x%08x.\n", rf1, rf2, rf3, rf4); @@ -1962,132 +1922,142 @@ struct ieee80211_channel *channels) { int counter = 0; - int channel = 0; + u16 eeprom = 0; + u32 rf2_base = 0; + struct { + unsigned int chip; + u32 val[3]; + } rf[] = { + { RF2522, { 0x00002050, 0x00000101, 0x00000000 } }, + { RF2523, { 0x00022010, 0x000e0111, 0x00000a1b } }, + { RF2524, { 0x00032020, 0x00000101, 0x00000a1b } }, + { RF2525, { 0x00022020, 0x00060111, 0x00000a1b } }, + { RF2525E, { 0x00022020, 0x00060111, 0x00000a0b } }, + { RF5222, { 0x00000000, 0x00000101, 0x00000000 } } + }; /* - * We can put the initialization of channels 1-13 - * in a loop, channel 14 needs to be initialized - * seperately. + * Channel initialization. + * First we set the basic variables. */ - if(rt2x00_rf(&rt2x00pci->chip, RF2522)){ for(counter = 0; counter < 13; counter++){ channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - channels[counter].val = cpu_to_le32(0x000c1fda - + (counter * 0x14)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; + channels[counter].freq = 2407 + ((counter + 1) * 5); + channels[counter].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN; + channels[counter].antenna_max = 0xff; } channels[13].chan = 14; channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x000c20fa); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; + channels[13].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN; + channels[13].antenna_max = 0xff; + + if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ + for(counter = 14; counter < 37; counter++){ + if(counter < 22) + channels[counter].chan = 36; + else if(counter < 33) + channels[counter].chan = 100; + else + channels[counter].chan = 149; + channels[counter].chan += ((counter - 14) * 4); + channels[counter].freq = ((counter - 13) + 1000) * 5; + channels[counter].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN + | IEEE80211_CHAN_W_SCAN; + channels[counter].power_level = 0x18; + channels[counter].antenna_max = 0xff; + } + } + + /* + * Set device specific value. + */ + if(rt2x00_rf(&rt2x00pci->chip, RF2525) + || rt2x00_rf(&rt2x00pci->chip, RF2525E)) + rf2_base = 0x00080000; + + if(rt2x00_rf(&rt2x00pci->chip, RF2522)){ + u32 vals[] = { + 0x000c1fda, 0x000c1fee, 0x000c2002, 0x000c2016, + 0x000c202a, 0x000c203e, 0x000c2052, 0x000c2066, + 0x000c207a, 0x000c208e, 0x000c20a2, 0x000c20b6, + 0x000c20ca, 0x000c20fa + }; + + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) + channels[counter].val = cpu_to_le32(vals[counter]); }else if(rt2x00_rf(&rt2x00pci->chip, RF2523) || rt2x00_rf(&rt2x00pci->chip, RF2524) || rt2x00_rf(&rt2x00pci->chip, RF2525)){ - for(counter = 0; counter < 13; counter++){ - channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - channels[counter].val = cpu_to_le32(0x00000c9e - + (counter * 0x04)); - if(channels[counter].val & 0x00000040) - channels[counter].val += 0x00000040; - if(rt2x00_rf(&rt2x00pci->chip, RF2525)) - channels[counter].val += 0x00080000; - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - } + u32 vals[] = { + 0x00000c9e, 0x00000ca2, 0x00000ca6, 0x00000caa, + 0x00000cae, 0x00000cb2, 0x00000cb6, 0x00000cba, + 0x00000cbe, 0x00000d02, 0x00000d06, 0x00000d0a, + 0x00000d0e, 0x00000d1a + }; - channels[13].chan = 14; - channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x00000d1a); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; - }else if(rt2x00_rf(&rt2x00pci->chip, RF2525E)){ - for(counter = 0; counter < 13; counter++){ - channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - channels[counter].val = cpu_to_le32(0x00081136 - + (counter * 0x04)); - if(channels[counter].val & 0x00000040) - channels[counter].val += 0x00000040; - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - } + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) + channels[counter].val = + cpu_to_le32(vals[counter] | rf2_base); + }else if(rt2x00_rf(&rt2x00pci->chip, RF2525E) + || rt2x00_rf(&rt2x00pci->chip, RF5222)){ + u32 vals[] = { + 0x00001136, 0x0000113a, 0x0000113e, 0x00001182, + 0x00001186, 0x0000118a, 0x0000118e, 0x00001192, + 0x00001196, 0x0000119a, 0x0000119e, 0x000011a2, + 0x000011a6, 0x000011ae + }; - channels[13].chan = 14; - channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x000811ae); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; - }else if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ - for(counter = 0; counter < 13; counter++){ - channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - channels[counter].val = cpu_to_le32(0x00001136 - + (counter * 0x04)); - if(channels[counter].val & 0x00000040) - channels[counter].val += 0x00000040; - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) + channels[counter].val = + cpu_to_le32(vals[counter] | rf2_base); } + if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ + u32 vals[] = { + 0x00018896, 0x0001889a, 0x0001889e, 0x000188a2, + 0x000188a6, 0x000188aa, 0x000188ae, 0x000188b2, + 0x00008802, 0x00008806, 0x0000880a, 0x0000880e, + 0x00008812, 0x00008816, 0x0000881a, 0x0000881e, + 0x00008822, 0x00008826, 0x0000882a, 0x000090a6, + 0x000090ae, 0x000090b6, 0x000090be + }; - channels[13].chan = 14; - channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x000811ae); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; - for(channel = 36; channel <= 64; channel += 4){ - channels[counter].chan = counter + 1; - channels[counter].freq = - ((counter + 1) + 1000) * 5; - channels[counter].val = cpu_to_le32(0x00018896 - + (counter * 0x04)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - counter++; + struct ieee80211_channel *chan = channels + 14; + + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) + (chan++)->val = cpu_to_le32(vals[counter]); } - for(channel = 100; channel <= 140; channel += 4){ - channels[counter].chan = counter + 1; - channels[counter].freq = - ((counter + 1) + 1000) * 5; - channels[counter].val = cpu_to_le32(0x00008802 - + (counter * 0x04)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - counter++; + /* + * Set TX power, each EEPROM TXpower entry + * contains the TXpower value for 2 channels. + */ + for(counter = 0; counter < EEPROM_TXPOWER_SIZE; counter++){ + rt2x00_eeprom_read(rt2x00pci, + EEPROM_TXPOWER_START + counter, &eeprom); + + channels[(counter * 2)].power_level = + rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1); + if(channels[(counter * 2)].power_level > 0x20) + channels[(counter * 2)].power_level = 0x18; + + channels[(counter * 2) + 1].power_level = + rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2); + if(channels[(counter * 2) + 1].power_level > 0x20) + channels[(counter * 2) + 1].power_level = 0x18; } - for(channel = 149; channel <= 161; channel += 4){ - channels[counter].chan = counter + 1; - channels[counter].freq = - ((counter + 1) + 1000) * 5; - channels[counter].val = cpu_to_le32(0x000090a6 - + (counter * 0x08)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - counter++; + /* + * Set device specific, but channel independent RF values. + */ + for (counter = 0; counter < ARRAY_SIZE(rf); counter++) { + if (rt2x00_rf(&rt2x00pci->chip, rf[counter].chip)) { + rt2x00pci->rf1 = cpu_to_le32(rf[counter].val[0]); + rt2x00pci->rf3 = cpu_to_le32(rf[counter].val[1]); + rt2x00pci->rf4 = cpu_to_le32(rf[counter].val[2]); } } } diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2500usb.c wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500usb.c --- wireless-2.6/drivers/net/wireless/rt2x00/rt2500usb.c 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500usb.c 2006-02-12 12:51:43.000000000 +0100 @@ -284,61 +287,45 @@ rt2500usb_config_channel(struct rt2x00_usb *rt2x00usb, int rf2, int channel, int freq, int txpower) { - u32 rf1 = 0; - u32 rf3 = 0; - u32 rf4 = 0; + u32 rf1 = rt2x00usb->rf1; + u32 rf3 = rt2x00usb->rf3; + u32 rf4 = rt2x00usb->rf4; txpower = (txpower < 19) ? 19 : txpower; txpower = (txpower > 31) ? 31 : txpower; - if(rt2x00_rf(&rt2x00usb->chip, RF2522)){ - rf1 = 0x00002050; - rf3 = 0x00000101; - rf4 = 0; - }else if(rt2x00_rf(&rt2x00usb->chip, RF2523)){ - rf1 = 0x00022010; - rf3 = 0x000e0111; - rf4 = 0x00000a1b; - if(channel == 14) - rf4 &= ~0x00000018; - }else if(rt2x00_rf(&rt2x00usb->chip, RF2524)){ - rf1 = 0x00032020; - rf3 = 0x00000101; - rf4 = 0x00000a1b; - if(channel == 14) - rf4 &= ~0x00000018; - }else if(rt2x00_rf(&rt2x00usb->chip, RF2525)){ - rf1 = 0x00022020; - rf3 = 0x00060111; - rf4 = 0x00000a1b; - if(channel == 14) + if((rt2x00_rf(&rt2x00usb->chip, RF2523) + || rt2x00_rf(&rt2x00usb->chip, RF2524) + || rt2x00_rf(&rt2x00usb->chip, RF2525)) + && channel == 14) rf4 &= ~0x00000018; - }else if(rt2x00_rf(&rt2x00usb->chip, RF2525E)){ - rf1 = 0x00022020; - rf3 = 0x00060111; + + if(rt2x00_rf(&rt2x00usb->chip, RF2525E)){ if(channel & 0x01) rf4 = 0x00000e1b; else rf4 = 0x00000e07; if(channel == 14) rf4 = 0x00000e23; - }else if(rt2x00_rf(&rt2x00usb->chip, RF5222)){ - rf3 = 0x00000101; - if(channel < 14 - || channel > 149) - rf1 = 0x00022020; - else - rf1 = 0x00022010; - if(channel < 14) - rf4 = 0x00000a0b; - else if(channel == 14) - rf4 = 0x00000a1b; - else if(channel < 64) - rf4 = 0x00000a1f; - else if(channel < 140) - rf4 = 0x00000a0f; - else if(channel < 161) - rf4 = 0x00000a07; + } + + if(rt2x00_rf(&rt2x00usb->chip, RF5222)){ + if(channel < 14){ + rf1 = cpu_to_le32(0x00022020); + rf4 = cpu_to_le32(0x00000a0b); + }else if(channel == 14){ + rf1 = cpu_to_le32(0x00022010); + rf4 = cpu_to_le32(0x00000a1b); + }else if(channel < 64){ + rf1 = cpu_to_le32(0x00022010); + rf4 = cpu_to_le32(0x00000a1f); + }else if(channel < 140){ + rf1 = cpu_to_le32(0x00022010); + rf4 = cpu_to_le32(0x00000a0f); + }else if(channel < 161){ + rf1 = cpu_to_le32(0x00022020); + rf4 = cpu_to_le32(0x00000a07); + } } INFO("Switching channel. RF1: 0x%08x, RF2: 0x%08x, RF3: 0x%08x, " @@ -1651,137 +1618,140 @@ struct ieee80211_channel *channels) { int counter = 0; - int channel = 0; + u16 eeprom = 0; + u32 rf2_base = 0; + struct { + unsigned int chip; + u32 val[3]; + } rf[] = { + { RF2522, { 0x00002050, 0x00000101, 0x00000000 } }, + { RF2523, { 0x00022010, 0x000e0111, 0x00000a1b } }, + { RF2524, { 0x00032020, 0x00000101, 0x00000a1b } }, + { RF2525, { 0x00022020, 0x00060111, 0x00000a1b } }, + { RF2525E, { 0x00022020, 0x00060111, 0x00000000 } }, + { RF5222, { 0x00000000, 0x00000101, 0x00000000 } } + }; /* - * We can put the initialization of channels 1-13 - * in a loop, channel 14 needs to be initialized - * seperately. + * Channel initialization. + * First we set the basic variables. */ - if(rt2x00_rf(&rt2x00usb->chip, RF2522)){ for(counter = 0; counter < 13; counter++){ channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - channels[counter].val = cpu_to_le32(0x000c1fda - + (counter * 0x14)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; + channels[counter].freq = 2407 + ((counter + 1) * 5); + channels[counter].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN; + channels[counter].antenna_max = 0xff; } channels[13].chan = 14; channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x000c20fa); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; + channels[13].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN; + channels[13].antenna_max = 0xff; + + if(rt2x00_rf(&rt2x00usb->chip, RF5222)){ + for(counter = 14; counter < 37; counter++){ + if(counter < 22) + channels[counter].chan = 36; + else if(counter < 33) + channels[counter].chan = 100; + else + channels[counter].chan = 149; + channels[counter].chan += ((counter - 14) * 4); + channels[counter].freq = ((counter - 13) + 1000) * 5; + channels[counter].flag = IEEE80211_CHAN_W_IBSS + | IEEE80211_CHAN_W_ACTIVE_SCAN + | IEEE80211_CHAN_W_SCAN; + channels[counter].power_level = 0x18; + channels[counter].antenna_max = 0xff; + } + } + + /* + * Set device specific value. + */ + if(rt2x00_rf(&rt2x00usb->chip, RF2525)) + rf2_base = 0x00080000; + + if(rt2x00_rf(&rt2x00usb->chip, RF2522)){ + u32 vals[] = { + 0x000c1fda, 0x000c1fee, 0x000c2002, 0x000c2016, + 0x000c202a, 0x000c203e, 0x000c2052, 0x000c2066, + 0x000c207a, 0x000c208e, 0x000c20a2, 0x000c20b6, + 0x000c20ca, 0x000c20fa + }; + + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) + channels[counter].val = cpu_to_le32(vals[counter]); }else if(rt2x00_rf(&rt2x00usb->chip, RF2523) || rt2x00_rf(&rt2x00usb->chip, RF2524) || rt2x00_rf(&rt2x00usb->chip, RF2525)){ - for(counter = 0; counter < 13; counter++){ - channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - channels[counter].val = cpu_to_le32(0x00000c9e - + (counter * 0x04)); - if(channels[counter].val & 0x00000040) - channels[counter].val += 0x00000040; - if(rt2x00_rf(&rt2x00usb->chip, RF2525)) - channels[counter].val += 0x00080000; - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - } + u32 vals[] = { + 0x00000c9e, 0x00000ca2, 0x00000ca6, 0x00000caa, + 0x00000cae, 0x00000cb2, 0x00000cb6, 0x00000cba, + 0x00000cbe, 0x00000d02, 0x00000d06, 0x00000d0a, + 0x00000d0e, 0x00000d1a + }; - channels[13].chan = 14; - channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x00000d1a); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; - }else if(rt2x00_rf(&rt2x00usb->chip, RF2525E)){ - for(counter = 0; counter < 14; counter++){ - channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - if(counter & 0x01) /* Odd number. */ - channels[counter].val = - cpu_to_le32(0x0000089a - + ((counter + 1) * 0x02)); - else /* Even number */ + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) channels[counter].val = - cpu_to_le32(0x0000089a - + (counter * 0x02)); - if(channels[counter].val & 0x00000040) - channels[counter].val += 0x00000040; - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; + cpu_to_le32(vals[counter] | rf2_base); + }else if(rt2x00_rf(&rt2x00usb->chip, RF2525E)){ + u32 vals[] = { + 0x0000089a, 0x0000089e, 0x0000089e, 0x000008a2, + 0x000008a2, 0x000008a6, 0x000008a6, 0x000008aa, + 0x000008aa, 0x000008ae, 0x000008ae, 0x000008b2, + 0x000008b2, 0x000008b6 + }; + + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) + channels[counter].val = cpu_to_le32(vals[counter]); + }else if(rt2x00_rf(&rt2x00usb->chip, RF5222)){ + u32 vals[] = { + 0x00001136, 0x0000113a, 0x0000113e, 0x00001182, + 0x00001186, 0x0000118a, 0x0000118e, 0x00001192, + 0x00001196, 0x0000119a, 0x0000119e, 0x000011a2, + 0x000011a6, 0x000011ae, 0x0001889a, 0x0001889a, + 0x0001889e, 0x000188a2, 0x000188a6, 0x000188aa, + 0x000188ae, 0x000188b2, 0x00008802, 0x00008806, + 0x0000880a, 0x0000880e, 0x00008812, 0x00008816, + 0x0000881a, 0x0000881e, 0x00008822, 0x00008826, + 0x0000882a, 0x000090a6, 0x000090ae, 0x000090b6, + 0x000090be + }; + + for (counter = 0; counter < ARRAY_SIZE(vals); counter++) + channels[counter].val = cpu_to_le32(vals[counter]); } /* - * Only fix frequency number for channel 14. + * Set TX power, each EEPROM TXpower entry + * contains the TXpower value for 2 channels. */ - channels[13].freq = 2484; - }else if(rt2x00_rf(&rt2x00usb->chip, RF5222)){ - for(counter = 0; counter < 13; counter++){ - channels[counter].chan = counter + 1; - channels[counter].freq = 2407 - + ((counter + 1) * 5); - channels[counter].val = cpu_to_le32(0x00001136 - + (counter * 0x04)); - if(channels[counter].val & 0x00000040) - channels[counter].val += 0x00000040; - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - } + for(counter = 0; counter < EEPROM_TXPOWER_SIZE; counter++){ + rt2x00_eeprom_read(rt2x00usb, + EEPROM_TXPOWER_START + counter, &eeprom, 2); - channels[13].chan = 14; - channels[13].freq = 2484; - channels[13].val = cpu_to_le32(0x000811ae); - channels[13].flag = IEEE80211_CHAN_W_SCAN | - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; - for(channel = 36; channel <= 64; channel += 4){ - channels[counter].chan = counter + 1; - channels[counter].freq = - ((counter + 1) + 1000) * 5; - channels[counter].val = cpu_to_le32(0x00018896 - + (counter * 0x04)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - counter++; - } + channels[(counter * 2)].power_level = + rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1); + if(channels[(counter * 2)].power_level > 0x20) + channels[(counter * 2)].power_level = 0x18; - for(channel = 100; channel <= 140; channel += 4){ - channels[counter].chan = counter + 1; - channels[counter].freq = - ((counter + 1) + 1000) * 5; - channels[counter].val = cpu_to_le32(0x00008802 - + (counter * 0x04)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - counter++; + channels[(counter * 2) + 1].power_level = + rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2); + if(channels[(counter * 2) + 1].power_level > 0x20) + channels[(counter * 2) + 1].power_level = 0x18; } - for(channel = 149; channel <= 161; channel += 4){ - channels[counter].chan = counter + 1; - channels[counter].freq = - ((counter + 1) + 1000) * 5; - channels[counter].val = cpu_to_le32(0x000090a6 - + (counter * 0x08)); - channels[counter].flag = - IEEE80211_CHAN_W_ACTIVE_SCAN - | IEEE80211_CHAN_W_SCAN - | IEEE80211_CHAN_W_IBSS; - counter++; + /* + * Set device specific, but channel independent RF values. + */ + for (counter = 0; counter < ARRAY_SIZE(rf); counter++) { + if (rt2x00_rf(&rt2x00usb->chip, rf[counter].chip)) { + rt2x00usb->rf1 = cpu_to_le32(rf[counter].val[0]); + rt2x00usb->rf3 = cpu_to_le32(rf[counter].val[1]); + rt2x00usb->rf4 = cpu_to_le32(rf[counter].val[2]); } } }
pgphQlgGBUJZm.pgp
Description: PGP signature