brcmfmac: store revinfo retrieval result
authorArend van Spriel <arend@broadcom.com>
Sun, 25 Jan 2015 19:31:42 +0000 (20:31 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 29 Jan 2015 07:59:17 +0000 (09:59 +0200)
When revinfo retrieval fails we can not show the firmware version
in ethtool driver info. Store the result to be used when handling
ethtool driver info callback.

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 91213a6500173899e1d5be63b761c4409246bd8e..fe54844c75e089cfba03ef8add1e5aae9648d9be 100644 (file)
@@ -57,10 +57,10 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
 
        err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_REVINFO,
                                     &revinfo, sizeof(revinfo));
+       ri = &ifp->drvr->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);
@@ -79,6 +79,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
                ri->chippkg = le32_to_cpu(revinfo.chippkg);
                ri->nvramrev = le32_to_cpu(revinfo.nvramrev);
        }
+       ri->result = err;
 
        /* query for 'ver' to get version info from firmware */
        memset(buf, 0, sizeof(buf));
index 8d03588b54bbc9892ee9ab43f07dac5a1870c9d3..2d6e2cc1b12ce98c6fd8a3039260d56c50070636 100644 (file)
@@ -601,11 +601,12 @@ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
 {
        struct brcmf_if *ifp = netdev_priv(ndev);
        struct brcmf_pub *drvr = ifp->drvr;
-       char drev[BRCMU_DOTREV_LEN];
+       char drev[BRCMU_DOTREV_LEN] = "n/a";
 
+       if (drvr->revinfo.result == 0)
+               brcmu_dotrev_str(drvr->revinfo.driverrev, drev);
        strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
-       strlcpy(info->version, brcmu_dotrev_str(drvr->revinfo.driverrev, drev),
-               sizeof(info->version));
+       strlcpy(info->version, drev, sizeof(info->version));
        strlcpy(info->fw_version, drvr->fwver, sizeof(info->fw_version));
        strlcpy(info->bus_info, dev_name(drvr->bus_if->dev),
                sizeof(info->bus_info));
index db7f35f141e7b8f814a77932d1c2975cdb3c050d..fd74a9c6e9ac62ac310c688f5fade1acbf7c7d73 100644 (file)
@@ -71,8 +71,16 @@ 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
+ *
+ * The result field stores the error code of the
+ * revision info request from firmware. For the
+ * other fields see struct brcmf_rev_info_le in
+ * fwil_types.h
+ */
 struct brcmf_rev_info {
+       int result;
        u32 vendorid;
        u32 deviceid;
        u32 radiorev;