amd-xgbe: Support for 64-bit management counter registers
authorLendacky, Thomas <Thomas.Lendacky@amd.com>
Thu, 3 Nov 2016 18:19:07 +0000 (13:19 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Nov 2016 18:48:44 +0000 (14:48 -0400)
Add support for reading all management counter registers as 64-bit
values.  The indication of whether to read the high 32-bits to form
a 64-bit value is indicated in the version data.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amd/xgbe/xgbe-dev.c
drivers/net/ethernet/amd/xgbe/xgbe.h

index b8a04e7393449b23dc4a16dd8754acb662f7c8dd..fbd60ee0260b5eb7aafe99ccf4d9d3ec3851f348 100644 (file)
@@ -2588,17 +2588,33 @@ static u64 xgbe_mmc_read(struct xgbe_prv_data *pdata, unsigned int reg_lo)
        bool read_hi;
        u64 val;
 
-       switch (reg_lo) {
-       /* These registers are always 64 bit */
-       case MMC_TXOCTETCOUNT_GB_LO:
-       case MMC_TXOCTETCOUNT_G_LO:
-       case MMC_RXOCTETCOUNT_GB_LO:
-       case MMC_RXOCTETCOUNT_G_LO:
-               read_hi = true;
-               break;
+       if (pdata->vdata->mmc_64bit) {
+               switch (reg_lo) {
+               /* These registers are always 32 bit */
+               case MMC_RXRUNTERROR:
+               case MMC_RXJABBERERROR:
+               case MMC_RXUNDERSIZE_G:
+               case MMC_RXOVERSIZE_G:
+               case MMC_RXWATCHDOGERROR:
+                       read_hi = false;
+                       break;
 
-       default:
-               read_hi = false;
+               default:
+                       read_hi = true;
+               }
+       } else {
+               switch (reg_lo) {
+               /* These registers are always 64 bit */
+               case MMC_TXOCTETCOUNT_GB_LO:
+               case MMC_TXOCTETCOUNT_G_LO:
+               case MMC_RXOCTETCOUNT_GB_LO:
+               case MMC_RXOCTETCOUNT_G_LO:
+                       read_hi = true;
+                       break;
+
+               default:
+                       read_hi = false;
+               }
        }
 
        val = XGMAC_IOREAD(pdata, reg_lo);
index 160b4980b2ebeadbcea4eca1b6df78aa40a7344d..7cbf91b4aa7942443b2ce566a0226c683866529a 100644 (file)
@@ -804,6 +804,7 @@ struct xgbe_hw_features {
 struct xgbe_version_data {
        void (*init_function_ptrs_phy_impl)(struct xgbe_phy_if *);
        enum xgbe_xpcs_access xpcs_access;
+       unsigned int mmc_64bit;
 };
 
 struct xgbe_prv_data {