When chipset is detected it is also a good idea to read the
revision number from the register. This can than also
be used with "ethtool -d".
For rt61pci and rt73usb the firmware version should be stored
so it can be accessed for "ethtool -i"
For the other device just set firmware version to "N/A"

Signed-off-by Ivo van Doorn <[EMAIL PROTECTED]>

---

diff -rU3 wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 
wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c  
2006-08-19 17:38:02.000000000 +0200
+++ wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2400pci.c  
2006-08-27 15:48:21.000000000 +0200
@@ -373,6 +373,7 @@
 
        strcpy(drvinfo->driver, DRV_NAME);
        strcpy(drvinfo->version, DRV_VERSION);
+       strcpy(drvinfo->fw_version, "N/A");
        strcpy(drvinfo->bus_info, pci_name(rt2x00dev_pci(rt2x00dev)));
        drvinfo->eedump_len = EEPROM_SIZE;
        drvinfo->regdump_len = CSR_REG_SIZE;
@@ -389,7 +390,7 @@
        struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
 
        rt2x00_register_multiread(rt2x00dev, CSR_REG_BASE, data, CSR_REG_SIZE);
-       regs->version = *((u32*)data);
+       regs->version = rt2x00_rev(&rt2x00dev->chip);
        regs->len = CSR_REG_SIZE;
 }
 
@@ -2450,7 +2451,8 @@
         * 3 - Identify RF chipset.
         */
        value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
-       rt2x00_set_chip(&rt2x00dev->chip, RT2460, value);
+       rt2x00_register_read(rt2x00dev, CSR0, &reg);
+       rt2x00_set_chip(&rt2x00dev->chip, RT2460, value, reg);
 
        if (!rt2x00_rf(&rt2x00dev->chip, RF2420) &&
            !rt2x00_rf(&rt2x00dev->chip, RF2421))
diff -rU3 wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 
wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c  
2006-08-19 17:38:02.000000000 +0200
+++ wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500pci.c  
2006-08-27 15:48:35.000000000 +0200
@@ -373,6 +373,7 @@
 
        strcpy(drvinfo->driver, DRV_NAME);
        strcpy(drvinfo->version, DRV_VERSION);
+       strcpy(drvinfo->fw_version, "N/A");
        strcpy(drvinfo->bus_info, pci_name(rt2x00dev_pci(rt2x00dev)));
        drvinfo->eedump_len = EEPROM_SIZE;
        drvinfo->regdump_len = CSR_REG_SIZE;
@@ -389,7 +390,7 @@
        struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
 
        rt2x00_register_multiread(rt2x00dev, CSR_REG_BASE, data, CSR_REG_SIZE);
-       regs->version = *((u32*)data);
+       regs->version = rt2x00_rev(&rt2x00dev->chip);
        regs->len = CSR_REG_SIZE;
 }
 
@@ -2589,7 +2590,8 @@
         * 3 - Identify RF chipset.
         */
        value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
-       rt2x00_set_chip(&rt2x00dev->chip, RT2560, value);
+       rt2x00_register_read(rt2x00dev, CSR0, &reg);
+       rt2x00_set_chip(&rt2x00dev->chip, RT2560, value, reg);
 
        if (!rt2x00_rf(&rt2x00dev->chip, RF2522) &&
            !rt2x00_rf(&rt2x00dev->chip, RF2523) &&
diff -rU3 wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 
wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c  
2006-08-19 17:38:02.000000000 +0200
+++ wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2500usb.c  
2006-08-27 15:49:07.000000000 +0200
@@ -224,6 +224,7 @@
 
        strcpy(drvinfo->driver, DRV_NAME);
        strcpy(drvinfo->version, DRV_VERSION);
+       strcpy(drvinfo->fw_version, "N/A");
        strcpy(drvinfo->bus_info, rt2x00dev_usb(rt2x00dev)->dev.bus_id);
        drvinfo->eedump_len = EEPROM_SIZE;
        drvinfo->regdump_len = CSR_REG_SIZE;
@@ -240,7 +241,7 @@
        struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
 
        rt2x00_register_multiread(rt2x00dev, CSR_REG_BASE, data, CSR_REG_SIZE);
-       regs->version = *((u16*)data);
+       regs->version = rt2x00_rev(&rt2x00dev->chip);
        regs->len = CSR_REG_SIZE;
 }
 
@@ -2255,6 +2256,8 @@
 {
        struct ieee80211_conf *conf = ieee80211_get_hw_conf(
                usb_get_intfdata(rt2x00dev_usb(rt2x00dev)));
+       u16 reg;
+       u16 value;
        u16 eeprom;
 
        /*
@@ -2265,8 +2268,9 @@
        /*
         * 2 - Identify RF chipset.
         */
-       rt2x00_set_chip(&rt2x00dev->chip, RT2570,
-               rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE));
+       value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
+       rt2x00_register_read(rt2x00dev, MAC_CSR0, &reg);
+       rt2x00_set_chip(&rt2x00dev->chip, RT2570, value, reg);
 
        if (!rt2x00_rf(&rt2x00dev->chip, RF2522) &&
            !rt2x00_rf(&rt2x00dev->chip, RF2523) &&
diff -rU3 wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2x00.h 
wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2x00.h
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2x00.h     
2006-08-19 17:38:02.000000000 +0200
+++ wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt2x00.h     
2006-08-27 15:45:39.000000000 +0200
@@ -433,18 +433,32 @@
 struct rt2x00_chip {
        u16 rt;
        u16 rf;
+       u16 rev;
+       u8 fw_h;
+       u8 fw_l;
 };
 
 /*
  * Set chipset data.
  */
 static inline void rt2x00_set_chip(struct rt2x00_chip *chipset,
-       const u16 rt, const u16 rf)
+       const u16 rt, const u16 rf, const u16 rev)
 {
-       INFO("Chipset detected - rt: %04x, rf: %04x.\n", rt, rf);
+       INFO("Chipset detected - rt: %04x, rf: %04x, rev: %04x.\n",
+               rt, rf, rev);
 
        chipset->rt = rt;
        chipset->rf = rf;
+       chipset->rev = rev;
+}
+
+static inline void rt2x00_set_chip_fw(struct rt2x00_chip *chipset,
+       const u8 fw_h, const u8 fw_l)
+{
+       INFO("Firmware detected - version: %d.%d.\n", fw_h, fw_l);
+
+       chipset->fw_h = fw_h;
+       chipset->fw_l = fw_l;
 }
 
 static inline char rt2x00_rt(const struct rt2x00_chip *chipset, const u16 chip)
@@ -457,6 +471,16 @@
        return (chipset->rf == chip);
 }
 
+static inline u16 rt2x00_rev(const struct rt2x00_chip *chipset)
+{
+       return chipset->rev;
+}
+
+static inline char* rt2x00_fw(const struct rt2x00_chip *chipset)
+{
+       return chipset->fw_h + "." + chipset->fw_l;
+}
+
 /*
  * data_entry
  * The data ring is a list of data entries.
diff -rU3 wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt61pci.c 
wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt61pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt61pci.c    
2006-08-19 17:38:02.000000000 +0200
+++ wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt61pci.c    
2006-08-27 15:49:42.000000000 +0200
@@ -404,6 +404,7 @@
 
        strcpy(drvinfo->driver, DRV_NAME);
        strcpy(drvinfo->version, DRV_VERSION);
+       strcpy(drvinfo->fw_version, rt2x00_fw(&rt2x00dev->chip));
        strcpy(drvinfo->bus_info, pci_name(rt2x00dev_pci(rt2x00dev)));
        drvinfo->eedump_len = EEPROM_SIZE;
        drvinfo->regdump_len = CSR_REG_SIZE;
@@ -420,7 +421,7 @@
        struct rt2x00_dev       *rt2x00dev = ieee80211_dev_hw_data(net_dev);
 
        rt2x00_register_multiread(rt2x00dev, CSR_REG_BASE, data, CSR_REG_SIZE);
-       regs->version = *((u32*)data);
+       regs->version = rt2x00_rev(&rt2x00dev->chip);
        regs->len = CSR_REG_SIZE;
 }
 
@@ -1359,7 +1360,7 @@
                goto exit;
        }
 
-       DEBUG("Loading Firmware version: %d.%d.\n",
+       rt2x00_set_chip_fw(&rt2x00dev->chip,
                fw->data[fw->size - 4], fw->data[fw->size - 3]);
 
        /*
@@ -3057,11 +3058,11 @@
         * To determine the RT chip we have to read the
         * PCI header of the device.
         */
-       pci_read_config_word(
-               rt2x00dev_pci(rt2x00dev), PCI_CONFIG_HEADER_DEVICE, &device);
-
+       pci_read_config_word(rt2x00dev_pci(rt2x00dev),
+               PCI_CONFIG_HEADER_DEVICE, &device);
        value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
-       rt2x00_set_chip(&rt2x00dev->chip, device, value);
+       rt2x00_register_read(rt2x00dev, MAC_CSR0, &reg);
+       rt2x00_set_chip(&rt2x00dev->chip, device, value, reg);
 
        if (!rt2x00_rf(&rt2x00dev->chip, RF5225) &&
            !rt2x00_rf(&rt2x00dev->chip, RF5325) &&
diff -rU3 wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt73usb.c 
wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt73usb.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt73usb.c    
2006-08-19 17:38:02.000000000 +0200
+++ wireless-dev-rt2x00-ethtool/drivers/net/wireless/d80211/rt2x00/rt73usb.c    
2006-08-27 15:50:11.000000000 +0200
@@ -225,6 +225,7 @@
 
        strcpy(drvinfo->driver, DRV_NAME);
        strcpy(drvinfo->version, DRV_VERSION);
+       strcpy(drvinfo->fw_version, rt2x00_fw(&rt2x00dev->chip));
        strcpy(drvinfo->bus_info, rt2x00dev_usb(rt2x00dev)->dev.bus_id);
        drvinfo->eedump_len = EEPROM_SIZE;
        drvinfo->regdump_len = CSR_REG_SIZE;
@@ -241,7 +242,7 @@
        struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(net_dev);
 
        rt2x00_register_multiread(rt2x00dev, CSR_REG_BASE, data, CSR_REG_SIZE);
-       regs->version = *((u32*)data);
+       regs->version = rt2x00_rev(&rt2x00dev->chip);
        regs->len = CSR_REG_SIZE;
 }
 
@@ -1070,7 +1071,7 @@
                goto exit;
        }
 
-       DEBUG("Loading Firmware version: %d.%d.\n",
+       rt2x00_set_chip_fw(&rt2x00dev->chip,
                fw->data[fw->size - 4], fw->data[fw->size - 3]);
 
        /*
@@ -2577,6 +2578,7 @@
 {
        struct ieee80211_conf *conf = ieee80211_get_hw_conf(
                usb_get_intfdata(rt2x00dev_usb(rt2x00dev)));
+       u32 reg;
        u16 value;
        u16 eeprom;
 
@@ -2589,7 +2591,8 @@
         * 2 - Identify RF chipset.
         */
        value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
-       rt2x00_set_chip(&rt2x00dev->chip, RT73, value);
+       rt2x00_register_read(rt2x00dev, MAC_CSR0, &reg);
+       rt2x00_set_chip(&rt2x00dev->chip, RT73, value, reg);
 
        if (!rt2x00_rf(&rt2x00dev->chip, RF5226) &&
            !rt2x00_rf(&rt2x00dev->chip, RF2528) &&
-
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

Reply via email to