Loading drivers/net/b44.c +44 −1 Original line number Original line Diff line number Diff line Loading @@ -106,6 +106,12 @@ static void b44_init_hw(struct b44 *); static int dma_desc_align_mask; static int dma_desc_align_mask; static int dma_desc_sync_size; static int dma_desc_sync_size; static const char b44_gstrings[][ETH_GSTRING_LEN] = { #define _B44(x...) # x, B44_STAT_REG_DECLARE #undef _B44 }; static inline void b44_sync_dma_desc_for_device(struct pci_dev *pdev, static inline void b44_sync_dma_desc_for_device(struct pci_dev *pdev, dma_addr_t dma_base, dma_addr_t dma_base, unsigned long offset, unsigned long offset, Loading Loading @@ -498,7 +504,10 @@ static void b44_stats_update(struct b44 *bp) for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) { for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) { *val++ += br32(bp, reg); *val++ += br32(bp, reg); } } val = &bp->hw_stats.rx_good_octets; /* Pad */ reg += 8*4UL; for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL) { for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL) { *val++ += br32(bp, reg); *val++ += br32(bp, reg); } } Loading Loading @@ -1772,6 +1781,37 @@ static int b44_set_pauseparam(struct net_device *dev, return 0; return 0; } } static void b44_get_strings(struct net_device *dev, u32 stringset, u8 *data) { switch(stringset) { case ETH_SS_STATS: memcpy(data, *b44_gstrings, sizeof(b44_gstrings)); break; } } static int b44_get_stats_count(struct net_device *dev) { return ARRAY_SIZE(b44_gstrings); } static void b44_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { struct b44 *bp = netdev_priv(dev); u32 *val = &bp->hw_stats.tx_good_octets; u32 i; spin_lock_irq(&bp->lock); b44_stats_update(bp); for (i = 0; i < ARRAY_SIZE(b44_gstrings); i++) *data++ = *val++; spin_unlock_irq(&bp->lock); } static struct ethtool_ops b44_ethtool_ops = { static struct ethtool_ops b44_ethtool_ops = { .get_drvinfo = b44_get_drvinfo, .get_drvinfo = b44_get_drvinfo, .get_settings = b44_get_settings, .get_settings = b44_get_settings, Loading @@ -1784,6 +1824,9 @@ static struct ethtool_ops b44_ethtool_ops = { .set_pauseparam = b44_set_pauseparam, .set_pauseparam = b44_set_pauseparam, .get_msglevel = b44_get_msglevel, .get_msglevel = b44_get_msglevel, .set_msglevel = b44_set_msglevel, .set_msglevel = b44_set_msglevel, .get_strings = b44_get_strings, .get_stats_count = b44_get_stats_count, .get_ethtool_stats = b44_get_ethtool_stats, .get_perm_addr = ethtool_op_get_perm_addr, .get_perm_addr = ethtool_op_get_perm_addr, }; }; Loading drivers/net/b44.h +54 −20 Original line number Original line Diff line number Diff line Loading @@ -346,29 +346,63 @@ struct ring_info { #define B44_MCAST_TABLE_SIZE 32 #define B44_MCAST_TABLE_SIZE 32 #define B44_STAT_REG_DECLARE \ _B44(tx_good_octets) \ _B44(tx_good_pkts) \ _B44(tx_octets) \ _B44(tx_pkts) \ _B44(tx_broadcast_pkts) \ _B44(tx_multicast_pkts) \ _B44(tx_len_64) \ _B44(tx_len_65_to_127) \ _B44(tx_len_128_to_255) \ _B44(tx_len_256_to_511) \ _B44(tx_len_512_to_1023) \ _B44(tx_len_1024_to_max) \ _B44(tx_jabber_pkts) \ _B44(tx_oversize_pkts) \ _B44(tx_fragment_pkts) \ _B44(tx_underruns) \ _B44(tx_total_cols) \ _B44(tx_single_cols) \ _B44(tx_multiple_cols) \ _B44(tx_excessive_cols) \ _B44(tx_late_cols) \ _B44(tx_defered) \ _B44(tx_carrier_lost) \ _B44(tx_pause_pkts) \ _B44(rx_good_octets) \ _B44(rx_good_pkts) \ _B44(rx_octets) \ _B44(rx_pkts) \ _B44(rx_broadcast_pkts) \ _B44(rx_multicast_pkts) \ _B44(rx_len_64) \ _B44(rx_len_65_to_127) \ _B44(rx_len_128_to_255) \ _B44(rx_len_256_to_511) \ _B44(rx_len_512_to_1023) \ _B44(rx_len_1024_to_max) \ _B44(rx_jabber_pkts) \ _B44(rx_oversize_pkts) \ _B44(rx_fragment_pkts) \ _B44(rx_missed_pkts) \ _B44(rx_crc_align_errs) \ _B44(rx_undersize) \ _B44(rx_crc_errs) \ _B44(rx_align_errs) \ _B44(rx_symbol_errs) \ _B44(rx_pause_pkts) \ _B44(rx_nonpause_pkts) /* SW copy of device statistics, kept up to date by periodic timer /* SW copy of device statistics, kept up to date by periodic timer * which probes HW values. Must have same relative layout as HW * which probes HW values. Check b44_stats_update if you mess with * register above, because b44_stats_update depends upon this. * the layout */ */ struct b44_hw_stats { struct b44_hw_stats { u32 tx_good_octets, tx_good_pkts, tx_octets; #define _B44(x) u32 x; u32 tx_pkts, tx_broadcast_pkts, tx_multicast_pkts; B44_STAT_REG_DECLARE u32 tx_len_64, tx_len_65_to_127, tx_len_128_to_255; #undef _B44 u32 tx_len_256_to_511, tx_len_512_to_1023, tx_len_1024_to_max; u32 tx_jabber_pkts, tx_oversize_pkts, tx_fragment_pkts; u32 tx_underruns, tx_total_cols, tx_single_cols; u32 tx_multiple_cols, tx_excessive_cols, tx_late_cols; u32 tx_defered, tx_carrier_lost, tx_pause_pkts; u32 __pad1[8]; u32 rx_good_octets, rx_good_pkts, rx_octets; u32 rx_pkts, rx_broadcast_pkts, rx_multicast_pkts; u32 rx_len_64, rx_len_65_to_127, rx_len_128_to_255; u32 rx_len_256_to_511, rx_len_512_to_1023, rx_len_1024_to_max; u32 rx_jabber_pkts, rx_oversize_pkts, rx_fragment_pkts; u32 rx_missed_pkts, rx_crc_align_errs, rx_undersize; u32 rx_crc_errs, rx_align_errs, rx_symbol_errs; u32 rx_pause_pkts, rx_nonpause_pkts; }; }; struct b44 { struct b44 { Loading Loading
drivers/net/b44.c +44 −1 Original line number Original line Diff line number Diff line Loading @@ -106,6 +106,12 @@ static void b44_init_hw(struct b44 *); static int dma_desc_align_mask; static int dma_desc_align_mask; static int dma_desc_sync_size; static int dma_desc_sync_size; static const char b44_gstrings[][ETH_GSTRING_LEN] = { #define _B44(x...) # x, B44_STAT_REG_DECLARE #undef _B44 }; static inline void b44_sync_dma_desc_for_device(struct pci_dev *pdev, static inline void b44_sync_dma_desc_for_device(struct pci_dev *pdev, dma_addr_t dma_base, dma_addr_t dma_base, unsigned long offset, unsigned long offset, Loading Loading @@ -498,7 +504,10 @@ static void b44_stats_update(struct b44 *bp) for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) { for (reg = B44_TX_GOOD_O; reg <= B44_TX_PAUSE; reg += 4UL) { *val++ += br32(bp, reg); *val++ += br32(bp, reg); } } val = &bp->hw_stats.rx_good_octets; /* Pad */ reg += 8*4UL; for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL) { for (reg = B44_RX_GOOD_O; reg <= B44_RX_NPAUSE; reg += 4UL) { *val++ += br32(bp, reg); *val++ += br32(bp, reg); } } Loading Loading @@ -1772,6 +1781,37 @@ static int b44_set_pauseparam(struct net_device *dev, return 0; return 0; } } static void b44_get_strings(struct net_device *dev, u32 stringset, u8 *data) { switch(stringset) { case ETH_SS_STATS: memcpy(data, *b44_gstrings, sizeof(b44_gstrings)); break; } } static int b44_get_stats_count(struct net_device *dev) { return ARRAY_SIZE(b44_gstrings); } static void b44_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { struct b44 *bp = netdev_priv(dev); u32 *val = &bp->hw_stats.tx_good_octets; u32 i; spin_lock_irq(&bp->lock); b44_stats_update(bp); for (i = 0; i < ARRAY_SIZE(b44_gstrings); i++) *data++ = *val++; spin_unlock_irq(&bp->lock); } static struct ethtool_ops b44_ethtool_ops = { static struct ethtool_ops b44_ethtool_ops = { .get_drvinfo = b44_get_drvinfo, .get_drvinfo = b44_get_drvinfo, .get_settings = b44_get_settings, .get_settings = b44_get_settings, Loading @@ -1784,6 +1824,9 @@ static struct ethtool_ops b44_ethtool_ops = { .set_pauseparam = b44_set_pauseparam, .set_pauseparam = b44_set_pauseparam, .get_msglevel = b44_get_msglevel, .get_msglevel = b44_get_msglevel, .set_msglevel = b44_set_msglevel, .set_msglevel = b44_set_msglevel, .get_strings = b44_get_strings, .get_stats_count = b44_get_stats_count, .get_ethtool_stats = b44_get_ethtool_stats, .get_perm_addr = ethtool_op_get_perm_addr, .get_perm_addr = ethtool_op_get_perm_addr, }; }; Loading
drivers/net/b44.h +54 −20 Original line number Original line Diff line number Diff line Loading @@ -346,29 +346,63 @@ struct ring_info { #define B44_MCAST_TABLE_SIZE 32 #define B44_MCAST_TABLE_SIZE 32 #define B44_STAT_REG_DECLARE \ _B44(tx_good_octets) \ _B44(tx_good_pkts) \ _B44(tx_octets) \ _B44(tx_pkts) \ _B44(tx_broadcast_pkts) \ _B44(tx_multicast_pkts) \ _B44(tx_len_64) \ _B44(tx_len_65_to_127) \ _B44(tx_len_128_to_255) \ _B44(tx_len_256_to_511) \ _B44(tx_len_512_to_1023) \ _B44(tx_len_1024_to_max) \ _B44(tx_jabber_pkts) \ _B44(tx_oversize_pkts) \ _B44(tx_fragment_pkts) \ _B44(tx_underruns) \ _B44(tx_total_cols) \ _B44(tx_single_cols) \ _B44(tx_multiple_cols) \ _B44(tx_excessive_cols) \ _B44(tx_late_cols) \ _B44(tx_defered) \ _B44(tx_carrier_lost) \ _B44(tx_pause_pkts) \ _B44(rx_good_octets) \ _B44(rx_good_pkts) \ _B44(rx_octets) \ _B44(rx_pkts) \ _B44(rx_broadcast_pkts) \ _B44(rx_multicast_pkts) \ _B44(rx_len_64) \ _B44(rx_len_65_to_127) \ _B44(rx_len_128_to_255) \ _B44(rx_len_256_to_511) \ _B44(rx_len_512_to_1023) \ _B44(rx_len_1024_to_max) \ _B44(rx_jabber_pkts) \ _B44(rx_oversize_pkts) \ _B44(rx_fragment_pkts) \ _B44(rx_missed_pkts) \ _B44(rx_crc_align_errs) \ _B44(rx_undersize) \ _B44(rx_crc_errs) \ _B44(rx_align_errs) \ _B44(rx_symbol_errs) \ _B44(rx_pause_pkts) \ _B44(rx_nonpause_pkts) /* SW copy of device statistics, kept up to date by periodic timer /* SW copy of device statistics, kept up to date by periodic timer * which probes HW values. Must have same relative layout as HW * which probes HW values. Check b44_stats_update if you mess with * register above, because b44_stats_update depends upon this. * the layout */ */ struct b44_hw_stats { struct b44_hw_stats { u32 tx_good_octets, tx_good_pkts, tx_octets; #define _B44(x) u32 x; u32 tx_pkts, tx_broadcast_pkts, tx_multicast_pkts; B44_STAT_REG_DECLARE u32 tx_len_64, tx_len_65_to_127, tx_len_128_to_255; #undef _B44 u32 tx_len_256_to_511, tx_len_512_to_1023, tx_len_1024_to_max; u32 tx_jabber_pkts, tx_oversize_pkts, tx_fragment_pkts; u32 tx_underruns, tx_total_cols, tx_single_cols; u32 tx_multiple_cols, tx_excessive_cols, tx_late_cols; u32 tx_defered, tx_carrier_lost, tx_pause_pkts; u32 __pad1[8]; u32 rx_good_octets, rx_good_pkts, rx_octets; u32 rx_pkts, rx_broadcast_pkts, rx_multicast_pkts; u32 rx_len_64, rx_len_65_to_127, rx_len_128_to_255; u32 rx_len_256_to_511, rx_len_512_to_1023, rx_len_1024_to_max; u32 rx_jabber_pkts, rx_oversize_pkts, rx_fragment_pkts; u32 rx_missed_pkts, rx_crc_align_errs, rx_undersize; u32 rx_crc_errs, rx_align_errs, rx_symbol_errs; u32 rx_pause_pkts, rx_nonpause_pkts; }; }; struct b44 { struct b44 { Loading