rt2x00: rt2800lib: probe RT chipset earlier
authorGabor Juhos <juhosg@openwrt.org>
Sat, 30 Mar 2013 13:53:10 +0000 (14:53 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 1 Apr 2013 20:09:41 +0000 (16:09 -0400)
The 'rt2800_validate_eeprom' function uses the type of
the RT chipset for verifying the number of RX streams
on RT28x0 devices. However the type of the RT chipset
is not yet detected when the 'rt2800_validate_eeprom'
function is called.

Move the RT chipset detection code into a separate helper
function, and call it before rt2800_validate_eeprom.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2800lib.c

index c4cc624..7deac4d 100644 (file)
@@ -5431,45 +5431,10 @@ static int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 
 static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 {
-       u32 reg;
        u16 value;
        u16 eeprom;
-       u32 rt;
-       u32 rev;
        u16 rf;
 
-       if (rt2x00_rt(rt2x00dev, RT3290))
-               rt2800_register_read(rt2x00dev, MAC_CSR0_3290, &reg);
-       else
-               rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
-
-       rt = rt2x00_get_field32(reg, MAC_CSR0_CHIPSET);
-       rev = rt2x00_get_field32(reg, MAC_CSR0_REVISION);
-
-       switch (rt) {
-       case RT2860:
-       case RT2872:
-       case RT2883:
-       case RT3070:
-       case RT3071:
-       case RT3090:
-       case RT3290:
-       case RT3352:
-       case RT3390:
-       case RT3572:
-       case RT5390:
-       case RT5392:
-       case RT5592:
-               break;
-       default:
-               ERROR(rt2x00dev,
-                     "Invalid RT chipset 0x%04x, rev %04x detected.\n",
-                     rt, rev);
-               return -ENODEV;
-       }
-
-       rt2x00_set_rt(rt2x00dev, rt, rev);
-
        /*
         * Read EEPROM word for configuration.
         */
@@ -6067,11 +6032,56 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
        return 0;
 }
 
+static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
+{
+       u32 reg;
+       u32 rt;
+       u32 rev;
+
+       if (rt2x00_rt(rt2x00dev, RT3290))
+               rt2800_register_read(rt2x00dev, MAC_CSR0_3290, &reg);
+       else
+               rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
+
+       rt = rt2x00_get_field32(reg, MAC_CSR0_CHIPSET);
+       rev = rt2x00_get_field32(reg, MAC_CSR0_REVISION);
+
+       switch (rt) {
+       case RT2860:
+       case RT2872:
+       case RT2883:
+       case RT3070:
+       case RT3071:
+       case RT3090:
+       case RT3290:
+       case RT3352:
+       case RT3390:
+       case RT3572:
+       case RT5390:
+       case RT5392:
+       case RT5592:
+               break;
+       default:
+               ERROR(rt2x00dev,
+                     "Invalid RT chipset 0x%04x, rev %04x detected.\n",
+                     rt, rev);
+               return -ENODEV;
+       }
+
+       rt2x00_set_rt(rt2x00dev, rt, rev);
+
+       return 0;
+}
+
 int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
        u32 reg;
 
+       retval = rt2800_probe_rt(rt2x00dev);
+       if (retval)
+               return retval;
+
        /*
         * Allocate eeprom data.
         */