sh_eth: add sh_eth_cpu_data::gecmr flag
authorSergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Sat, 15 Feb 2020 20:13:45 +0000 (23:13 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Feb 2020 03:44:41 +0000 (19:44 -0800)
Not all Ether controllers having the Gigabit register layout have GECMR --
RZ/A1 (AKA R7S72100) actually has the same layout but no Gigabit speed
support and hence no GECMR. In the past, the new register map table was
added for this SoC, now I think we should have used the existing Gigabit
table with the differences (such as GECMR) covered by the mere flags in
the 'struct sh_eth_cpu_data'. Add such flag for GECMR -- and then we can
get rid of the R7S72100 specific layout in the next patch...

Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Tested-by: Chris Brandt <chris.brandt@renesas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/renesas/sh_eth.c
drivers/net/ethernet/renesas/sh_eth.h

index 44e8c2a5a7b691d304a0cd1e01f665ca39d621aa..7659b4d696ed6e329af1d89541b9ad5ef99a073b 100644 (file)
@@ -569,6 +569,9 @@ static void sh_eth_set_rate_gether(struct net_device *ndev)
 {
        struct sh_eth_private *mdp = netdev_priv(ndev);
 
+       if (WARN_ON(!mdp->cd->gecmr))
+               return;
+
        switch (mdp->speed) {
        case 10: /* 10BASE */
                sh_eth_write(ndev, GECMR_10, GECMR);
@@ -663,6 +666,7 @@ static struct sh_eth_cpu_data r8a7740_data = {
        .apr            = 1,
        .mpr            = 1,
        .tpauser        = 1,
+       .gecmr          = 1,
        .bculr          = 1,
        .hw_swap        = 1,
        .rpadir         = 1,
@@ -788,6 +792,7 @@ static struct sh_eth_cpu_data r8a77980_data = {
        .apr            = 1,
        .mpr            = 1,
        .tpauser        = 1,
+       .gecmr          = 1,
        .bculr          = 1,
        .hw_swap        = 1,
        .nbst           = 1,
@@ -957,6 +962,9 @@ static void sh_eth_set_rate_giga(struct net_device *ndev)
 {
        struct sh_eth_private *mdp = netdev_priv(ndev);
 
+       if (WARN_ON(!mdp->cd->gecmr))
+               return;
+
        switch (mdp->speed) {
        case 10: /* 10BASE */
                sh_eth_write(ndev, 0x00000000, GECMR);
@@ -1002,6 +1010,7 @@ static struct sh_eth_cpu_data sh7757_data_giga = {
        .apr            = 1,
        .mpr            = 1,
        .tpauser        = 1,
+       .gecmr          = 1,
        .bculr          = 1,
        .hw_swap        = 1,
        .rpadir         = 1,
@@ -1042,6 +1051,7 @@ static struct sh_eth_cpu_data sh7734_data = {
        .apr            = 1,
        .mpr            = 1,
        .tpauser        = 1,
+       .gecmr          = 1,
        .bculr          = 1,
        .hw_swap        = 1,
        .no_trimd       = 1,
@@ -1083,6 +1093,7 @@ static struct sh_eth_cpu_data sh7763_data = {
        .apr            = 1,
        .mpr            = 1,
        .tpauser        = 1,
+       .gecmr          = 1,
        .bculr          = 1,
        .hw_swap        = 1,
        .no_trimd       = 1,
@@ -2181,7 +2192,8 @@ static size_t __sh_eth_get_regs(struct net_device *ndev, u32 *buf)
        if (cd->tpauser)
                add_reg(TPAUSER);
        add_reg(TPAUSECR);
-       add_reg(GECMR);
+       if (cd->gecmr)
+               add_reg(GECMR);
        if (cd->bculr)
                add_reg(BCULR);
        add_reg(MAHR);
index 850726301e1c7ea8cdb90555c65f2429e8825258..621a7d46f79971b5cb4d98452e7e28eebab0e0be 100644 (file)
@@ -490,6 +490,7 @@ struct sh_eth_cpu_data {
        unsigned apr:1;         /* EtherC has APR */
        unsigned mpr:1;         /* EtherC has MPR */
        unsigned tpauser:1;     /* EtherC has TPAUSER */
+       unsigned gecmr:1;       /* EtherC has GECMR */
        unsigned bculr:1;       /* EtherC has BCULR */
        unsigned tsu:1;         /* EtherC has TSU */
        unsigned hw_swap:1;     /* E-DMAC has DE bit in EDMR */