|
@@ -45,7 +45,7 @@
|
|
|
|
|
|
#include <linux/crc32.h>
|
|
|
|
|
|
-#define OFFSET(REG_ADDR) (REG_ADDR << 2)
|
|
|
+#define OFFSET(REG_ADDR) ((REG_ADDR) << 2)
|
|
|
|
|
|
/* Max frame size PM3393 can handle. Includes Ethernet header and CRC. */
|
|
|
#define MAX_FRAME_SIZE 9600
|
|
@@ -428,69 +428,26 @@ static int pm3393_set_speed_duplex_fc(struct cmac *cmac, int speed, int duplex,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void pm3393_rmon_update(struct adapter *adapter, u32 offs, u64 *val,
|
|
|
- int over)
|
|
|
-{
|
|
|
- u32 val0, val1, val2;
|
|
|
-
|
|
|
- t1_tpi_read(adapter, offs, &val0);
|
|
|
- t1_tpi_read(adapter, offs + 4, &val1);
|
|
|
- t1_tpi_read(adapter, offs + 8, &val2);
|
|
|
-
|
|
|
- *val &= ~0ull << 40;
|
|
|
- *val |= val0 & 0xffff;
|
|
|
- *val |= (val1 & 0xffff) << 16;
|
|
|
- *val |= (u64)(val2 & 0xff) << 32;
|
|
|
-
|
|
|
- if (over)
|
|
|
- *val += 1ull << 40;
|
|
|
+#define RMON_UPDATE(mac, name, stat_name) \
|
|
|
+{ \
|
|
|
+ t1_tpi_read((mac)->adapter, OFFSET(name), &val0); \
|
|
|
+ t1_tpi_read((mac)->adapter, OFFSET((name)+1), &val1); \
|
|
|
+ t1_tpi_read((mac)->adapter, OFFSET((name)+2), &val2); \
|
|
|
+ (mac)->stats.stat_name = (u64)(val0 & 0xffff) | \
|
|
|
+ ((u64)(val1 & 0xffff) << 16) | \
|
|
|
+ ((u64)(val2 & 0xff) << 32) | \
|
|
|
+ ((mac)->stats.stat_name & \
|
|
|
+ 0xffffff0000000000ULL); \
|
|
|
+ if (ro & \
|
|
|
+ (1ULL << ((name - SUNI1x10GEXP_REG_MSTAT_COUNTER_0_LOW) >> 2))) \
|
|
|
+ (mac)->stats.stat_name += 1ULL << 40; \
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
+ u64 ro;
|
|
|
+ u32 val0, val1, val2, val3;
|
|
|
|
|
|
/* Snap the counters */
|
|
|
pmwrite(mac, SUNI1x10GEXP_REG_MSTAT_CONTROL,
|
|
@@ -504,14 +461,35 @@ 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);
|
|
|
|
|
|
- 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));
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+ /* 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);
|
|
|
|
|
|
return &mac->stats;
|
|
|
}
|