ravb: Add carrier_counters to struct ravb_hw_info
authorBiju Das <biju.das.jz@bp.renesas.com>
Tue, 12 Oct 2021 16:36:06 +0000 (17:36 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 13 Oct 2021 16:08:56 +0000 (09:08 -0700)
RZ/G2L E-MAC supports carrier counters.
Add a carrier_counter hw feature bit to struct ravb_hw_info
to add this feature only for RZ/G2L.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/renesas/ravb.h
drivers/net/ethernet/renesas/ravb_main.c

index 9916431..527e865 100644 (file)
@@ -196,6 +196,8 @@ enum ravb_reg {
        MAHR    = 0x05c0,
        MALR    = 0x05c8,
        TROCR   = 0x0700,       /* R-Car Gen3 and RZ/G2L only */
+       CXR41   = 0x0708,       /* RZ/G2L only */
+       CXR42   = 0x0710,       /* RZ/G2L only */
        CEFCR   = 0x0740,
        FRECR   = 0x0748,
        TSFRCR  = 0x0750,
@@ -1017,6 +1019,7 @@ struct ravb_hw_info {
        /* hardware features */
        unsigned internal_delay:1;      /* AVB-DMAC has internal delays */
        unsigned tx_counters:1;         /* E-MAC has TX counters */
+       unsigned carrier_counters:1;    /* E-MAC has carrier counters */
        unsigned multi_irqs:1;          /* AVB-DMAC and E-MAC has multiple irqs */
        unsigned gptp:1;                /* AVB-DMAC has gPTP support */
        unsigned ccc_gac:1;             /* AVB-DMAC has gPTP support active in config mode */
index 1a5ebc5..2221a25 100644 (file)
@@ -2053,6 +2053,13 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev)
                ravb_write(ndev, 0, TROCR);     /* (write clear) */
        }
 
+       if (info->carrier_counters) {
+               nstats->collisions += ravb_read(ndev, CXR41);
+               ravb_write(ndev, 0, CXR41);     /* (write clear) */
+               nstats->tx_carrier_errors += ravb_read(ndev, CXR42);
+               ravb_write(ndev, 0, CXR42);     /* (write clear) */
+       }
+
        nstats->rx_packets = stats0->rx_packets;
        nstats->tx_packets = stats0->tx_packets;
        nstats->rx_bytes = stats0->rx_bytes;
@@ -2432,6 +2439,7 @@ static const struct ravb_hw_info gbeth_hw_info = {
        .rx_max_buf_size = SZ_8K,
        .aligned_tx = 1,
        .tx_counters = 1,
+       .carrier_counters = 1,
        .half_duplex = 1,
 };