ath9k : Display MAC/BB and RF version at startup (v2)
authorBenoit PAPILLAULT <benoit.papillault@free.fr>
Thu, 6 Nov 2008 21:26:49 +0000 (22:26 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 21 Nov 2008 16:06:06 +0000 (11:06 -0500)
This patch decodes the MAC/BB version (for instance: AR5416) and the RF
part version (for instance: AR5133). It has been tested on AR5416/AR5133
which is a 2.4/5GHz 11n device. It also makes the differences between
AR5416 (PCI) and AR5418 (PCI Express). Both are named AR5416 in
the register definitions.

Signed-off-by: Benoit Papillault <benoit.papillault@free.fr>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath9k/hw.c
drivers/net/wireless/ath9k/main.c

index e05c9ef55e471327fa1a213db3e74446ccfaf27e..ff6457e0cb002dd4ed991ccc7810fe7af12c5a43 100644 (file)
@@ -382,8 +382,9 @@ static const char *ath9k_hw_devname(u16 devid)
 {
        switch (devid) {
        case AR5416_DEVID_PCI:
-       case AR5416_DEVID_PCIE:
                return "Atheros 5416";
+       case AR5416_DEVID_PCIE:
+               return "Atheros 5418";
        case AR9160_DEVID_PCI:
                return "Atheros 9160";
        case AR9280_DEVID_PCI:
index f830fe1e4adcd1427c49371bad06356fdf30606a..fbb2dd2373c8cc2b498f73257d7c61c74e532a03 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <linux/nl80211.h>
 #include "core.h"
+#include "reg.h"
 
 #define ATH_PCI_VERSION "0.1"
 
@@ -1519,15 +1520,74 @@ static struct ieee80211_ops ath9k_ops = {
        .set_frag_threshold = ath9k_no_fragmentation,
 };
 
+static struct {
+       u32 version;
+       const char * name;
+} ath_mac_bb_names[] = {
+       { AR_SREV_VERSION_5416_PCI,     "5416" },
+       { AR_SREV_VERSION_5416_PCIE,    "5418" },
+       { AR_SREV_VERSION_9100,         "9100" },
+       { AR_SREV_VERSION_9160,         "9160" },
+       { AR_SREV_VERSION_9280,         "9280" },
+       { AR_SREV_VERSION_9285,         "9285" }
+};
+
+static struct {
+       u16 version;
+       const char * name;
+} ath_rf_names[] = {
+       { 0,                            "5133" },
+       { AR_RAD5133_SREV_MAJOR,        "5133" },
+       { AR_RAD5122_SREV_MAJOR,        "5122" },
+       { AR_RAD2133_SREV_MAJOR,        "2133" },
+       { AR_RAD2122_SREV_MAJOR,        "2122" }
+};
+
+/*
+ * Return the MAC/BB name. "????" is returned if the MAC/BB is unknown.
+ */
+
+static const char *
+ath_mac_bb_name(u32 mac_bb_version)
+{
+       int i;
+
+       for (i=0; i<ARRAY_SIZE(ath_mac_bb_names); i++) {
+               if (ath_mac_bb_names[i].version == mac_bb_version) {
+                       return ath_mac_bb_names[i].name;
+               }
+       }
+
+       return "????";
+}
+
+/*
+ * Return the RF name. "????" is returned if the RF is unknown.
+ */
+
+static const char *
+ath_rf_name(u16 rf_version)
+{
+       int i;
+
+       for (i=0; i<ARRAY_SIZE(ath_rf_names); i++) {
+               if (ath_rf_names[i].version == rf_version) {
+                       return ath_rf_names[i].name;
+               }
+       }
+
+       return "????";
+}
+
 static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        void __iomem *mem;
        struct ath_softc *sc;
        struct ieee80211_hw *hw;
-       const char *athname;
        u8 csz;
        u32 val;
        int ret = 0;
+       struct ath_hal *ah;
 
        if (pci_enable_device(pdev))
                return -EIO;
@@ -1614,11 +1674,15 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto bad4;
        }
 
-       athname = ath9k_hw_probe(id->vendor, id->device);
-
-       printk(KERN_INFO "%s: %s: mem=0x%lx, irq=%d\n",
+       ah = sc->sc_ah;
+       printk(KERN_INFO
+              "%s: Atheros AR%s MAC/BB Rev:%x "
+              "AR%s RF Rev:%x: mem=0x%lx, irq=%d\n",
               wiphy_name(hw->wiphy),
-              athname ? athname : "Atheros ???",
+              ath_mac_bb_name(ah->ah_macVersion),
+              ah->ah_macRev,
+              ath_rf_name((ah->ah_analog5GhzRev & AR_RADIO_SREV_MAJOR)),
+              ah->ah_phyRev,
               (unsigned long)mem, pdev->irq);
 
        return 0;