chelsio: tabulate the update of the statistic counters
[linux-3.10.git] / drivers / net / chelsio / pm3393.c
index 76a7ca9e0947880fad86d16633c8a584f468d16c..69129edeefd64ad266e35785f346ed5171303bd2 100644 (file)
@@ -446,17 +446,51 @@ static void pm3393_rmon_update(struct adapter *adapter, u32 offs, u64 *val,
                *val += 1ull << 40;
 }
 
-#define RMON_UPDATE(mac, name, stat_name) \
-       pm3393_rmon_update((mac)->adapter, OFFSET(name),                \
-                          &(mac)->stats.stat_name,                     \
-                  (ro &((name - SUNI1x10GEXP_REG_MSTAT_COUNTER_0_LOW) >> 2)))
-
-
 static const struct cmac_statistics *pm3393_update_statistics(struct cmac *mac,
                                                              int flag)
 {
+       static struct {
+               unsigned int reg;
+               unsigned int offset;
+       } hw_stats [] = {
+
+#define HW_STAT(name, stat_name) \
+       { name, (&((struct cmac_statistics *)NULL)->stat_name) - (u64 *)NULL }
+
+               /* Rx stats */
+               HW_STAT(RxOctetsReceivedOK, RxOctetsOK),
+               HW_STAT(RxUnicastFramesReceivedOK, RxUnicastFramesOK),
+               HW_STAT(RxMulticastFramesReceivedOK, RxMulticastFramesOK),
+               HW_STAT(RxBroadcastFramesReceivedOK, RxBroadcastFramesOK),
+               HW_STAT(RxPAUSEMACCtrlFramesReceived, RxPauseFrames),
+               HW_STAT(RxFrameCheckSequenceErrors, RxFCSErrors),
+               HW_STAT(RxFramesLostDueToInternalMACErrors,
+                               RxInternalMACRcvError),
+               HW_STAT(RxSymbolErrors, RxSymbolErrors),
+               HW_STAT(RxInRangeLengthErrors, RxInRangeLengthErrors),
+               HW_STAT(RxFramesTooLongErrors , RxFrameTooLongErrors),
+               HW_STAT(RxJabbers, RxJabberErrors),
+               HW_STAT(RxFragments, RxRuntErrors),
+               HW_STAT(RxUndersizedFrames, RxRuntErrors),
+               HW_STAT(RxJumboFramesReceivedOK, RxJumboFramesOK),
+               HW_STAT(RxJumboOctetsReceivedOK, RxJumboOctetsOK),
+
+               /* Tx stats */
+               HW_STAT(TxOctetsTransmittedOK, TxOctetsOK),
+               HW_STAT(TxFramesLostDueToInternalMACTransmissionError,
+                               TxInternalMACXmitError),
+               HW_STAT(TxTransmitSystemError, TxFCSErrors),
+               HW_STAT(TxUnicastFramesTransmittedOK, TxUnicastFramesOK),
+               HW_STAT(TxMulticastFramesTransmittedOK, TxMulticastFramesOK),
+               HW_STAT(TxBroadcastFramesTransmittedOK, TxBroadcastFramesOK),
+               HW_STAT(TxPAUSEMACCtrlFramesTransmitted, TxPauseFrames),
+               HW_STAT(TxJumboFramesReceivedOK, TxJumboFramesOK),
+               HW_STAT(TxJumboOctetsReceivedOK, TxJumboOctetsOK)
+       }, *p = hw_stats;
        u64 ro;
        u32 val0, val1, val2, val3;
+       u64 *stats = (u64 *) &mac->stats;
+       unsigned int i;
 
        /* Snap the counters */
        pmwrite(mac, SUNI1x10GEXP_REG_MSTAT_CONTROL,
@@ -470,35 +504,14 @@ static const struct cmac_statistics *pm3393_update_statistics(struct cmac *mac,
        ro = ((u64)val0 & 0xffff) | (((u64)val1 & 0xffff) << 16) |
                (((u64)val2 & 0xffff) << 32) | (((u64)val3 & 0xffff) << 48);
 
-       /* Rx stats */
-       RMON_UPDATE(mac, RxOctetsReceivedOK, RxOctetsOK);
-       RMON_UPDATE(mac, RxUnicastFramesReceivedOK, RxUnicastFramesOK);
-       RMON_UPDATE(mac, RxMulticastFramesReceivedOK, RxMulticastFramesOK);
-       RMON_UPDATE(mac, RxBroadcastFramesReceivedOK, RxBroadcastFramesOK);
-       RMON_UPDATE(mac, RxPAUSEMACCtrlFramesReceived, RxPauseFrames);
-       RMON_UPDATE(mac, RxFrameCheckSequenceErrors, RxFCSErrors);
-       RMON_UPDATE(mac, RxFramesLostDueToInternalMACErrors,
-                               RxInternalMACRcvError);
-       RMON_UPDATE(mac, RxSymbolErrors, RxSymbolErrors);
-       RMON_UPDATE(mac, RxInRangeLengthErrors, RxInRangeLengthErrors);
-       RMON_UPDATE(mac, RxFramesTooLongErrors , RxFrameTooLongErrors);
-       RMON_UPDATE(mac, RxJabbers, RxJabberErrors);
-       RMON_UPDATE(mac, RxFragments, RxRuntErrors);
-       RMON_UPDATE(mac, RxUndersizedFrames, RxRuntErrors);
-       RMON_UPDATE(mac, RxJumboFramesReceivedOK, RxJumboFramesOK);
-       RMON_UPDATE(mac, RxJumboOctetsReceivedOK, RxJumboOctetsOK);
-
-       /* Tx stats */
-       RMON_UPDATE(mac, TxOctetsTransmittedOK, TxOctetsOK);
-       RMON_UPDATE(mac, TxFramesLostDueToInternalMACTransmissionError,
-                               TxInternalMACXmitError);
-       RMON_UPDATE(mac, TxTransmitSystemError, TxFCSErrors);
-       RMON_UPDATE(mac, TxUnicastFramesTransmittedOK, TxUnicastFramesOK);
-       RMON_UPDATE(mac, TxMulticastFramesTransmittedOK, TxMulticastFramesOK);
-       RMON_UPDATE(mac, TxBroadcastFramesTransmittedOK, TxBroadcastFramesOK);
-       RMON_UPDATE(mac, TxPAUSEMACCtrlFramesTransmitted, TxPauseFrames);
-       RMON_UPDATE(mac, TxJumboFramesReceivedOK, TxJumboFramesOK);
-       RMON_UPDATE(mac, TxJumboOctetsReceivedOK, TxJumboOctetsOK);
+       for (i = 0; i < ARRAY_SIZE(hw_stats); i++) {
+               unsigned reg = p->reg - SUNI1x10GEXP_REG_MSTAT_COUNTER_0_LOW;
+
+               pm3393_rmon_update((mac)->adapter, OFFSET(p->reg),
+                                  stats + p->offset, ro & (reg >> 2));
+       }
+
+
 
        return &mac->stats;
 }