@@ -1550,70 +1550,79 @@ static int keystone_get_sset_count(struct net_device *ndev, int stringset)
1550
1550
}
1551
1551
}
1552
1552
1553
- static void gbe_update_stats (struct gbe_priv * gbe_dev , uint64_t * data )
1553
+ static inline void gbe_update_hw_stats_entry (struct gbe_priv * gbe_dev ,
1554
+ int et_stats_entry )
1554
1555
{
1555
1556
void __iomem * base = NULL ;
1556
1557
u32 __iomem * p ;
1557
1558
u32 tmp = 0 ;
1559
+
1560
+ /* The hw_stats_regs pointers are already
1561
+ * properly set to point to the right base:
1562
+ */
1563
+ base = gbe_dev -> hw_stats_regs [gbe_dev -> et_stats [et_stats_entry ].type ];
1564
+ p = base + gbe_dev -> et_stats [et_stats_entry ].offset ;
1565
+ tmp = readl (p );
1566
+ gbe_dev -> hw_stats [et_stats_entry ] += tmp ;
1567
+
1568
+ /* write-to-decrement:
1569
+ * new register value = old register value - write value
1570
+ */
1571
+ writel (tmp , p );
1572
+ }
1573
+
1574
+ static void gbe_update_stats (struct gbe_priv * gbe_dev , uint64_t * data )
1575
+ {
1558
1576
int i ;
1559
1577
1560
1578
for (i = 0 ; i < gbe_dev -> num_et_stats ; i ++ ) {
1561
- base = gbe_dev -> hw_stats_regs [gbe_dev -> et_stats [i ].type ];
1562
- p = base + gbe_dev -> et_stats [i ].offset ;
1563
- tmp = readl (p );
1564
- gbe_dev -> hw_stats [i ] = gbe_dev -> hw_stats [i ] + tmp ;
1579
+ gbe_update_hw_stats_entry (gbe_dev , i );
1580
+
1565
1581
if (data )
1566
1582
data [i ] = gbe_dev -> hw_stats [i ];
1567
- /* write-to-decrement:
1568
- * new register value = old register value - write value
1569
- */
1570
- writel (tmp , p );
1571
1583
}
1572
1584
}
1573
1585
1574
- static void gbe_update_stats_ver14 (struct gbe_priv * gbe_dev , uint64_t * data )
1586
+ static inline void gbe_stats_mod_visible_ver14 (struct gbe_priv * gbe_dev ,
1587
+ int stats_mod )
1575
1588
{
1576
- void __iomem * gbe_statsa = gbe_dev -> hw_stats_regs [0 ];
1577
- void __iomem * gbe_statsb = gbe_dev -> hw_stats_regs [1 ];
1578
- u64 * hw_stats = & gbe_dev -> hw_stats [0 ];
1579
- void __iomem * base = NULL ;
1580
- u32 __iomem * p ;
1581
- u32 tmp = 0 , val , pair_size = (gbe_dev -> num_et_stats / 2 );
1582
- int i , j , pair ;
1589
+ u32 val ;
1583
1590
1584
- for (pair = 0 ; pair < 2 ; pair ++ ) {
1585
- val = readl (GBE_REG_ADDR (gbe_dev , switch_regs , stat_port_en ));
1591
+ val = readl (GBE_REG_ADDR (gbe_dev , switch_regs , stat_port_en ));
1586
1592
1587
- if (pair == 0 )
1588
- val &= ~GBE_STATS_CD_SEL ;
1589
- else
1590
- val |= GBE_STATS_CD_SEL ;
1593
+ switch (stats_mod ) {
1594
+ case GBE_STATSA_MODULE :
1595
+ case GBE_STATSB_MODULE :
1596
+ val &= ~GBE_STATS_CD_SEL ;
1597
+ break ;
1598
+ case GBE_STATSC_MODULE :
1599
+ case GBE_STATSD_MODULE :
1600
+ val |= GBE_STATS_CD_SEL ;
1601
+ break ;
1602
+ default :
1603
+ return ;
1604
+ }
1605
+
1606
+ /* make the stat module visible */
1607
+ writel (val , GBE_REG_ADDR (gbe_dev , switch_regs , stat_port_en ));
1608
+ }
1591
1609
1592
- /* make the stat modules visible */
1593
- writel (val , GBE_REG_ADDR (gbe_dev , switch_regs , stat_port_en ));
1610
+ static void gbe_update_stats_ver14 (struct gbe_priv * gbe_dev , uint64_t * data )
1611
+ {
1612
+ u32 half_num_et_stats = (gbe_dev -> num_et_stats / 2 );
1613
+ int et_entry , j , pair ;
1594
1614
1595
- for (i = 0 ; i < pair_size ; i ++ ) {
1596
- j = pair * pair_size + i ;
1597
- switch (gbe_dev -> et_stats [j ].type ) {
1598
- case GBE_STATSA_MODULE :
1599
- case GBE_STATSC_MODULE :
1600
- base = gbe_statsa ;
1601
- break ;
1602
- case GBE_STATSB_MODULE :
1603
- case GBE_STATSD_MODULE :
1604
- base = gbe_statsb ;
1605
- break ;
1606
- }
1615
+ for (pair = 0 ; pair < 2 ; pair ++ ) {
1616
+ gbe_stats_mod_visible_ver14 (gbe_dev , (pair ?
1617
+ GBE_STATSC_MODULE :
1618
+ GBE_STATSA_MODULE ));
1619
+
1620
+ for (j = 0 ; j < half_num_et_stats ; j ++ ) {
1621
+ et_entry = pair * half_num_et_stats + j ;
1622
+ gbe_update_hw_stats_entry (gbe_dev , et_entry );
1607
1623
1608
- p = base + gbe_dev -> et_stats [j ].offset ;
1609
- tmp = readl (p );
1610
- hw_stats [j ] += tmp ;
1611
1624
if (data )
1612
- data [j ] = hw_stats [j ];
1613
- /* write-to-decrement:
1614
- * new register value = old register value - write value
1615
- */
1616
- writel (tmp , p );
1625
+ data [et_entry ] = gbe_dev -> hw_stats [et_entry ];
1617
1626
}
1618
1627
}
1619
1628
}
0 commit comments