brcmfmac: always obtain device revision info upon intialization
authorArend van Spriel <arend@broadcom.com>
Sun, 25 Jan 2015 19:31:40 +0000 (20:31 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 29 Jan 2015 07:59:12 +0000 (09:59 +0200)
Obtain device revision information and store it.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/brcm80211/brcmfmac/common.c
drivers/net/wireless/brcm80211/brcmfmac/core.c
drivers/net/wireless/brcm80211/brcmfmac/core.h

index ddf05af13d4465cd389fc03f6d6e895b16348c82..91213a6500173899e1d5be63b761c4409246bd8e 100644 (file)
@@ -41,6 +41,8 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
        s8 eventmask[BRCMF_EVENTING_MASK_LEN];
        u8 buf[BRCMF_DCMD_SMLEN];
        struct brcmf_join_pref_params join_pref_params[2];
+       struct brcmf_rev_info_le revinfo;
+       struct brcmf_rev_info *ri;
        char *ptr;
        s32 err;
 
@@ -48,12 +50,36 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
        err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
                                       sizeof(ifp->mac_addr));
        if (err < 0) {
-               brcmf_err("Retreiving cur_etheraddr failed, %d\n",
-                         err);
+               brcmf_err("Retreiving cur_etheraddr failed, %d\n", err);
                goto done;
        }
        memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
 
+       err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_REVINFO,
+                                    &revinfo, sizeof(revinfo));
+       if (err < 0) {
+               brcmf_err("retrieving revision info failed, %d\n", err);
+       } else {
+               ri = &ifp->drvr->revinfo;
+               ri->vendorid = le32_to_cpu(revinfo.vendorid);
+               ri->deviceid = le32_to_cpu(revinfo.deviceid);
+               ri->radiorev = le32_to_cpu(revinfo.radiorev);
+               ri->chiprev = le32_to_cpu(revinfo.chiprev);
+               ri->corerev = le32_to_cpu(revinfo.corerev);
+               ri->boardid = le32_to_cpu(revinfo.boardid);
+               ri->boardvendor = le32_to_cpu(revinfo.boardvendor);
+               ri->boardrev = le32_to_cpu(revinfo.boardrev);
+               ri->driverrev = le32_to_cpu(revinfo.driverrev);
+               ri->ucoderev = le32_to_cpu(revinfo.ucoderev);
+               ri->bus = le32_to_cpu(revinfo.bus);
+               ri->chipnum = le32_to_cpu(revinfo.chipnum);
+               ri->phytype = le32_to_cpu(revinfo.phytype);
+               ri->phyrev = le32_to_cpu(revinfo.phyrev);
+               ri->anarev = le32_to_cpu(revinfo.anarev);
+               ri->chippkg = le32_to_cpu(revinfo.chippkg);
+               ri->nvramrev = le32_to_cpu(revinfo.nvramrev);
+       }
+
        /* query for 'ver' to get version info from firmware */
        memset(buf, 0, sizeof(buf));
        strcpy(buf, "ver");
index 5f16a7e75d93de7ef2646c9c290918ef203b5b4b..6406f95af0d30812e29fdcba70e2f4aa6f7b7df8 100644 (file)
@@ -948,7 +948,6 @@ int brcmf_bus_start(struct device *dev)
        struct brcmf_pub *drvr = bus_if->drvr;
        struct brcmf_if *ifp;
        struct brcmf_if *p2p_ifp;
-       struct brcmf_rev_info_le revinfo;
 
        brcmf_dbg(TRACE, "\n");
 
@@ -974,17 +973,10 @@ int brcmf_bus_start(struct device *dev)
 
        /* assure we have chipid before feature attach */
        if (!bus_if->chip) {
-               ret = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_REVINFO, &revinfo,
-                                            sizeof(revinfo));
-               if (ret < 0) {
-                       brcmf_err("no chipid determined - device may malfunction\n");
-               } else {
-                       bus_if->chip = le32_to_cpu(revinfo.chipnum);
-                       bus_if->chiprev = le32_to_cpu(revinfo.chiprev);
-                       brcmf_dbg(INFO, "firmware revinfo: chip %x (%d) rev %d\n",
-                                 bus_if->chip, bus_if->chip,
-                                 bus_if->chiprev);
-               }
+               bus_if->chip = drvr->revinfo.chipnum;
+               bus_if->chiprev = drvr->revinfo.chiprev;
+               brcmf_dbg(INFO, "firmware revinfo: chip %x (%d) rev %d\n",
+                         bus_if->chip, bus_if->chip, bus_if->chiprev);
        }
        brcmf_feat_attach(drvr);
 
index f2f7d3d1a8efde27f9a1d748572d3e2cdecb9e35..db7f35f141e7b8f814a77932d1c2975cdb3c050d 100644 (file)
@@ -71,6 +71,27 @@ struct brcmf_proto;  /* device communication protocol info */
 struct brcmf_cfg80211_dev; /* cfg80211 device info */
 struct brcmf_fws_info; /* firmware signalling info */
 
+/* see struct brcmf_rev_info_le in fwil_types.h */
+struct brcmf_rev_info {
+       u32 vendorid;
+       u32 deviceid;
+       u32 radiorev;
+       u32 chiprev;
+       u32 corerev;
+       u32 boardid;
+       u32 boardvendor;
+       u32 boardrev;
+       u32 driverrev;
+       u32 ucoderev;
+       u32 bus;
+       u32 chipnum;
+       u32 phytype;
+       u32 phyrev;
+       u32 anarev;
+       u32 chippkg;
+       u32 nvramrev;
+};
+
 /* Common structure for module and instance linkage */
 struct brcmf_pub {
        /* Linkage ponters */
@@ -104,6 +125,7 @@ struct brcmf_pub {
        u32 feat_flags;
        u32 chip_quirks;
 
+       struct brcmf_rev_info revinfo;
 #ifdef DEBUG
        struct dentry *dbgfs_dir;
 #endif