Ivo van Doorn <[EMAIL PROTECTED]> : > 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-11 22:56:08.000000000 +0100 [...] > @@ -1962,133 +1922,175 @@ > struct ieee80211_channel *channels) > { > int counter = 0; > - int channel = 0; > + u16 eeprom = 0; > + u32 rf2_base = 0; > > /* > - * 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].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)){ > + channels[0].val = cpu_to_le32(0x000c1fda); > + channels[1].val = cpu_to_le32(0x000c1fee); > + channels[2].val = cpu_to_le32(0x000c2002); > + channels[3].val = cpu_to_le32(0x000c2016); > + channels[4].val = cpu_to_le32(0x000c202a); > + channels[5].val = cpu_to_le32(0x000c203e); > + channels[6].val = cpu_to_le32(0x000c2052); > + channels[7].val = cpu_to_le32(0x000c2066); > + channels[8].val = cpu_to_le32(0x000c207a); > + channels[9].val = cpu_to_le32(0x000c208e); > + channels[10].val = cpu_to_le32(0x000c20a2); > + channels[11].val = cpu_to_le32(0x000c20b6); > + channels[12].val = cpu_to_le32(0x000c20ca); > channels[13].val = cpu_to_le32(0x000c20fa); > - channels[13].flag = IEEE80211_CHAN_W_SCAN | > - IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_IBSS; > }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; > + channels[0].val = cpu_to_le32(0x00000c9e | rf2_base); > + channels[1].val = cpu_to_le32(0x00000ca2 | rf2_base); > + channels[2].val = cpu_to_le32(0x00000ca6 | rf2_base); > + channels[3].val = cpu_to_le32(0x00000caa | rf2_base); > + channels[4].val = cpu_to_le32(0x00000cae | rf2_base); > + channels[5].val = cpu_to_le32(0x00000cb2 | rf2_base); > + channels[6].val = cpu_to_le32(0x00000cb6 | rf2_base); > + channels[7].val = cpu_to_le32(0x00000cba | rf2_base); > + channels[8].val = cpu_to_le32(0x00000cbe | rf2_base); > + channels[9].val = cpu_to_le32(0x00000d02 | rf2_base); > + channels[10].val = cpu_to_le32(0x00000d06 | rf2_base); > + channels[11].val = cpu_to_le32(0x00000d0a | rf2_base); > + channels[12].val = cpu_to_le32(0x00000d0e | rf2_base); > + channels[13].val = cpu_to_le32(0x00000d1a | rf2_base); > + }else if(rt2x00_rf(&rt2x00pci->chip, RF2525E) > + || rt2x00_rf(&rt2x00pci->chip, RF5222)){ > + channels[0].val = cpu_to_le32(0x00001136 | rf2_base); > + channels[1].val = cpu_to_le32(0x0000113a | rf2_base); > + channels[2].val = cpu_to_le32(0x0000113e | rf2_base); > + channels[3].val = cpu_to_le32(0x00001182 | rf2_base); > + channels[4].val = cpu_to_le32(0x00001186 | rf2_base); > + channels[5].val = cpu_to_le32(0x0000118a | rf2_base); > + channels[6].val = cpu_to_le32(0x0000118e | rf2_base); > + channels[7].val = cpu_to_le32(0x00001192 | rf2_base); > + channels[8].val = cpu_to_le32(0x00001196 | rf2_base); > + channels[9].val = cpu_to_le32(0x0000119a | rf2_base); > + channels[10].val = cpu_to_le32(0x0000119e | rf2_base); > + channels[11].val = cpu_to_le32(0x000011a2 | rf2_base); > + channels[12].val = cpu_to_le32(0x000011a6 | rf2_base); > + channels[13].val = cpu_to_le32(0x000011ae | rf2_base); > } > + if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ > + channels[14].val = cpu_to_le32(0x00018896); > + channels[15].val = cpu_to_le32(0x0001889a); > + channels[16].val = cpu_to_le32(0x0001889e); > + channels[17].val = cpu_to_le32(0x000188a2); > + channels[18].val = cpu_to_le32(0x000188a6); > + channels[19].val = cpu_to_le32(0x000188aa); > + channels[20].val = cpu_to_le32(0x000188ae); > + channels[21].val = cpu_to_le32(0x000188b2); > > - 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; > - } > + channels[22].val = cpu_to_le32(0x00008802); > + channels[23].val = cpu_to_le32(0x00008806); > + channels[24].val = cpu_to_le32(0x0000880a); > + channels[25].val = cpu_to_le32(0x0000880e); > + channels[26].val = cpu_to_le32(0x00008812); > + channels[27].val = cpu_to_le32(0x00008816); > + channels[28].val = cpu_to_le32(0x0000881a); > + channels[29].val = cpu_to_le32(0x0000881e); > + channels[30].val = cpu_to_le32(0x00008822); > + channels[31].val = cpu_to_le32(0x00008826); > + channels[32].val = cpu_to_le32(0x0000882a); > > - 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; > + channels[33].val = cpu_to_le32(0x000090a6); > + channels[34].val = cpu_to_le32(0x000090ae); > + channels[35].val = cpu_to_le32(0x000090b6); > + channels[36].val = cpu_to_le32(0x000090be); > }
What about something like: if (rt2x00_rf(&rt2x00pci->chip, RF2522)) { u32 vals[] = { 0x000c1fda, 0x000c1fee, 0x000c2002, 0x000c2016, 0x000c202a, 0x000c203e, 0x000c2052, 0x000c2066, 0x000c207a, 0x000c208e, 0x000c20a2, 0x000c20b6, 0x000c20ca, 0x000c20fa }; for (i = 0; i < ARRAY_SIZE(vals); i++) channels[i].val = cpu_to_le32(vals[i]); } else if (rt2x00_rf(&rt2x00pci->chip, RF2523) || rt2x00_rf(&rt2x00pci->chip, RF2524) || rt2x00_rf(&rt2x00pci->chip, RF2525)) { u32 vals[] = { 0x00000c9e, 0x00000ca2, 0x00000ca6, 0x00000caa, 0x00000cae, 0x00000cb2, 0x00000cb6, 0x00000cba, 0x00000cbe, 0x00000d02, 0x00000d06, 0x00000d0a, 0x00000d0e, 0x00000d1a }; for (i = 0; i < ARRAY_SIZE(vals); i++) channels[i].val = cpu_to_le32(vals[i] | 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 }; for (i = 0; i < ARRAY_SIZE(vals); i++) channels[i].val = cpu_to_le32(vals[i] | 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 }; struct ieee80211_channel *chan = channels + 14; for (i = 0; i < ARRAY_SIZE(vals); i++) (chan++)->val = cpu_to_le32(vals[i] | rf2_base); } [...] > + > + /* > + * Set device specific, but channel independent RF values. > + */ > + if(rt2x00_rf(&rt2x00pci->chip, RF2522)){ > + rt2x00pci->rf1 = cpu_to_le32(0x00002050); > + rt2x00pci->rf3 = cpu_to_le32(0x00000101); > + rt2x00pci->rf4 = 0; > + }else if(rt2x00_rf(&rt2x00pci->chip, RF2523)){ > + rt2x00pci->rf1 = cpu_to_le32(0x00022010); > + rt2x00pci->rf3 = cpu_to_le32(0x000e0111); > + rt2x00pci->rf4 = cpu_to_le32(0x00000a1b); > + }else if(rt2x00_rf(&rt2x00pci->chip, RF2524)){ > + rt2x00pci->rf1 = cpu_to_le32(0x00032020); > + rt2x00pci->rf3 = cpu_to_le32(0x00000101); > + rt2x00pci->rf4 = cpu_to_le32(0x00000a1b); > + }else if(rt2x00_rf(&rt2x00pci->chip, RF2525)){ > + rt2x00pci->rf1 = cpu_to_le32(0x00022020); > + rt2x00pci->rf3 = cpu_to_le32(0x00060111); > + rt2x00pci->rf4 = cpu_to_le32(0x00000a1b); > + }else if(rt2x00_rf(&rt2x00pci->chip, RF2525E)){ > + rt2x00pci->rf1 = cpu_to_le32(0x00022020); > + rt2x00pci->rf3 = cpu_to_le32(0x00060111); > + rt2x00pci->rf4 = cpu_to_le32(0x00000a0b); > + }else if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ > + rt2x00pci->rf1 = 0; > + rt2x00pci->rf3 = cpu_to_le32(0x00000101); > + rt2x00pci->rf4 = 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 } } }; for (i = 0; i < ARRAY_SIZE(rf); i++) { if (rt2x00_rf(&rt2x00pci->chip, rf[i].chip)) { rt2x00pci->rf1 = cpu_to_le32(rf[i].val[0]); rt2x00pci->rf3 = cpu_to_le32(rf[i].val[1]); rt2x00pci->rf4 = cpu_to_le32(rf[i].val[2]); } } -- Ueimor - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html