]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ravb: Initialize GbEthernet E-MAC
authorBiju Das <biju.das.jz@bp.renesas.com>
Fri, 1 Oct 2021 15:06:36 +0000 (16:06 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 2 Oct 2021 12:52:46 +0000 (13:52 +0100)
Initialize GbEthernet E-MAC found on RZ/G2L SoC.
This patch also renames ravb_set_rate to ravb_set_rate_rcar and
ravb_rcar_emac_init to ravb_emac_init_rcar to be consistent with
the naming convention used in sh_eth driver.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/renesas/ravb.h
drivers/net/ethernet/renesas/ravb_main.c

index d83d3b4f3f5f1cafaeba18828583fa69e7a4b460..5dc1324786e023d380513c592e6aa81c96fcf89f 100644 (file)
@@ -188,6 +188,7 @@ enum ravb_reg {
        PIR     = 0x0520,
        PSR     = 0x0528,
        PIPR    = 0x052c,
+       CXR31   = 0x0530,       /* RZ/G2L only */
        MPR     = 0x0558,
        PFTCR   = 0x055c,
        PFRCR   = 0x0560,
@@ -811,10 +812,11 @@ enum ECMR_BIT {
        ECMR_TXF        = 0x00010000,   /* Documented for R-Car Gen3 only */
        ECMR_RXF        = 0x00020000,
        ECMR_PFR        = 0x00040000,
-       ECMR_ZPF        = 0x00080000,   /* Documented for R-Car Gen3 only */
+       ECMR_ZPF        = 0x00080000,   /* Documented for R-Car Gen3 and RZ/G2L */
        ECMR_RZPF       = 0x00100000,
        ECMR_DPAD       = 0x00200000,
        ECMR_RCSC       = 0x00800000,
+       ECMR_RCPT       = 0x02000000,   /* Documented for RZ/G2L only */
        ECMR_TRCCM      = 0x04000000,
 };
 
@@ -824,6 +826,7 @@ enum ECSR_BIT {
        ECSR_MPD        = 0x00000002,
        ECSR_LCHNG      = 0x00000004,
        ECSR_PHYI       = 0x00000008,
+       ECSR_PFRI       = 0x00000010,
 };
 
 /* ECSIPR */
@@ -858,9 +861,13 @@ enum MPR_BIT {
 
 /* GECMR */
 enum GECMR_BIT {
-       GECMR_SPEED     = 0x00000001,
-       GECMR_SPEED_100 = 0x00000000,
-       GECMR_SPEED_1000 = 0x00000001,
+       GECMR_SPEED             = 0x00000001,
+       GECMR_SPEED_100         = 0x00000000,
+       GECMR_SPEED_1000        = 0x00000001,
+       GBETH_GECMR_SPEED       = 0x00000030,
+       GBETH_GECMR_SPEED_10    = 0x00000000,
+       GBETH_GECMR_SPEED_100   = 0x00000010,
+       GBETH_GECMR_SPEED_1000  = 0x00000020,
 };
 
 /* The Ethernet AVB descriptor definitions. */
@@ -950,6 +957,11 @@ enum RAVB_QUEUE {
        RAVB_NC,        /* Network Control Queue */
 };
 
+enum CXR31_BIT {
+       CXR31_SEL_LINK0 = 0x00000001,
+       CXR31_SEL_LINK1 = 0x00000008,
+};
+
 #define DBAT_ENTRY_NUM 22
 #define RX_QUEUE_OFFSET        4
 #define NUM_RX_QUEUE   2
index 3e694738e683bc22dff1c957c45c4f5c90f0e5b4..9a4888543384502b1fcc90dd2cbf85dbc498fbb9 100644 (file)
@@ -85,10 +85,22 @@ static int ravb_config(struct net_device *ndev)
 
 static void ravb_set_rate_gbeth(struct net_device *ndev)
 {
-       /* Place holder */
+       struct ravb_private *priv = netdev_priv(ndev);
+
+       switch (priv->speed) {
+       case 10:                /* 10BASE */
+               ravb_write(ndev, GBETH_GECMR_SPEED_10, GECMR);
+               break;
+       case 100:               /* 100BASE */
+               ravb_write(ndev, GBETH_GECMR_SPEED_100, GECMR);
+               break;
+       case 1000:              /* 1000BASE */
+               ravb_write(ndev, GBETH_GECMR_SPEED_1000, GECMR);
+               break;
+       }
 }
 
-static void ravb_set_rate(struct net_device *ndev)
+static void ravb_set_rate_rcar(struct net_device *ndev)
 {
        struct ravb_private *priv = netdev_priv(ndev);
 
@@ -449,10 +461,35 @@ error:
 
 static void ravb_emac_init_gbeth(struct net_device *ndev)
 {
-       /* Place holder */
+       struct ravb_private *priv = netdev_priv(ndev);
+
+       /* Receive frame limit set register */
+       ravb_write(ndev, GBETH_RX_BUFF_MAX + ETH_FCS_LEN, RFLR);
+
+       /* PAUSE prohibition */
+       ravb_write(ndev, ECMR_ZPF | ((priv->duplex > 0) ? ECMR_DM : 0) |
+                        ECMR_TE | ECMR_RE | ECMR_RCPT |
+                        ECMR_TXF | ECMR_RXF | ECMR_PRM, ECMR);
+
+       ravb_set_rate_gbeth(ndev);
+
+       /* Set MAC address */
+       ravb_write(ndev,
+                  (ndev->dev_addr[0] << 24) | (ndev->dev_addr[1] << 16) |
+                  (ndev->dev_addr[2] << 8)  | (ndev->dev_addr[3]), MAHR);
+       ravb_write(ndev, (ndev->dev_addr[4] << 8)  | (ndev->dev_addr[5]), MALR);
+
+       /* E-MAC status register clear */
+       ravb_write(ndev, ECSR_ICD | ECSR_LCHNG | ECSR_PFRI, ECSR);
+
+       /* E-MAC interrupt enable register */
+       ravb_write(ndev, ECSIPR_ICDIP, ECSIPR);
+
+       ravb_modify(ndev, CXR31, CXR31_SEL_LINK1, 0);
+       ravb_modify(ndev, CXR31, CXR31_SEL_LINK0, CXR31_SEL_LINK0);
 }
 
-static void ravb_rcar_emac_init(struct net_device *ndev)
+static void ravb_emac_init_rcar(struct net_device *ndev)
 {
        /* Receive frame limit set register */
        ravb_write(ndev, ndev->mtu + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN, RFLR);
@@ -462,7 +499,7 @@ static void ravb_rcar_emac_init(struct net_device *ndev)
                   (ndev->features & NETIF_F_RXCSUM ? ECMR_RCSC : 0) |
                   ECMR_TE | ECMR_RE, ECMR);
 
-       ravb_set_rate(ndev);
+       ravb_set_rate_rcar(ndev);
 
        /* Set MAC address */
        ravb_write(ndev,
@@ -2140,10 +2177,10 @@ static const struct ravb_hw_info ravb_gen3_hw_info = {
        .rx_ring_format = ravb_rx_ring_format,
        .alloc_rx_desc = ravb_alloc_rx_desc,
        .receive = ravb_rcar_rx,
-       .set_rate = ravb_set_rate,
+       .set_rate = ravb_set_rate_rcar,
        .set_feature = ravb_set_features_rcar,
        .dmac_init = ravb_dmac_init_rcar,
-       .emac_init = ravb_rcar_emac_init,
+       .emac_init = ravb_emac_init_rcar,
        .gstrings_stats = ravb_gstrings_stats,
        .gstrings_size = sizeof(ravb_gstrings_stats),
        .net_hw_features = NETIF_F_RXCSUM,
@@ -2164,10 +2201,10 @@ static const struct ravb_hw_info ravb_gen2_hw_info = {
        .rx_ring_format = ravb_rx_ring_format,
        .alloc_rx_desc = ravb_alloc_rx_desc,
        .receive = ravb_rcar_rx,
-       .set_rate = ravb_set_rate,
+       .set_rate = ravb_set_rate_rcar,
        .set_feature = ravb_set_features_rcar,
        .dmac_init = ravb_dmac_init_rcar,
-       .emac_init = ravb_rcar_emac_init,
+       .emac_init = ravb_emac_init_rcar,
        .gstrings_stats = ravb_gstrings_stats,
        .gstrings_size = sizeof(ravb_gstrings_stats),
        .net_hw_features = NETIF_F_RXCSUM,