diff options
| -rw-r--r-- | drivers/net/ethernet/marvell/mvneta.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index d04b1c3c9b85..b248bcbdae63 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c | |||
| @@ -89,9 +89,8 @@ | |||
| 89 | #define MVNETA_TX_IN_PRGRS BIT(1) | 89 | #define MVNETA_TX_IN_PRGRS BIT(1) |
| 90 | #define MVNETA_TX_FIFO_EMPTY BIT(8) | 90 | #define MVNETA_TX_FIFO_EMPTY BIT(8) |
| 91 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c | 91 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c |
| 92 | #define MVNETA_SERDES_CFG 0x24A0 | 92 | #define MVNETA_SGMII_SERDES_CFG 0x24A0 |
| 93 | #define MVNETA_SGMII_SERDES_PROTO 0x0cc7 | 93 | #define MVNETA_SGMII_SERDES_PROTO 0x0cc7 |
| 94 | #define MVNETA_RGMII_SERDES_PROTO 0x0667 | ||
| 95 | #define MVNETA_TYPE_PRIO 0x24bc | 94 | #define MVNETA_TYPE_PRIO 0x24bc |
| 96 | #define MVNETA_FORCE_UNI BIT(21) | 95 | #define MVNETA_FORCE_UNI BIT(21) |
| 97 | #define MVNETA_TXQ_CMD_1 0x24e4 | 96 | #define MVNETA_TXQ_CMD_1 0x24e4 |
| @@ -712,6 +711,35 @@ static void mvneta_rxq_bm_disable(struct mvneta_port *pp, | |||
| 712 | mvreg_write(pp, MVNETA_RXQ_CONFIG_REG(rxq->id), val); | 711 | mvreg_write(pp, MVNETA_RXQ_CONFIG_REG(rxq->id), val); |
| 713 | } | 712 | } |
| 714 | 713 | ||
| 714 | |||
| 715 | |||
| 716 | /* Sets the RGMII Enable bit (RGMIIEn) in port MAC control register */ | ||
| 717 | static void mvneta_gmac_rgmii_set(struct mvneta_port *pp, int enable) | ||
| 718 | { | ||
| 719 | u32 val; | ||
| 720 | |||
| 721 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | ||
| 722 | |||
| 723 | if (enable) | ||
| 724 | val |= MVNETA_GMAC2_PORT_RGMII; | ||
| 725 | else | ||
| 726 | val &= ~MVNETA_GMAC2_PORT_RGMII; | ||
| 727 | |||
| 728 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | ||
| 729 | } | ||
| 730 | |||
| 731 | /* Config SGMII port */ | ||
| 732 | static void mvneta_port_sgmii_config(struct mvneta_port *pp) | ||
| 733 | { | ||
| 734 | u32 val; | ||
| 735 | |||
| 736 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | ||
| 737 | val |= MVNETA_GMAC2_PCS_ENABLE; | ||
| 738 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | ||
| 739 | |||
| 740 | mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO); | ||
| 741 | } | ||
| 742 | |||
| 715 | /* Start the Ethernet port RX and TX activity */ | 743 | /* Start the Ethernet port RX and TX activity */ |
| 716 | static void mvneta_port_up(struct mvneta_port *pp) | 744 | static void mvneta_port_up(struct mvneta_port *pp) |
| 717 | { | 745 | { |
| @@ -2729,15 +2757,12 @@ static void mvneta_port_power_up(struct mvneta_port *pp, int phy_mode) | |||
| 2729 | mvreg_write(pp, MVNETA_UNIT_INTR_CAUSE, 0); | 2757 | mvreg_write(pp, MVNETA_UNIT_INTR_CAUSE, 0); |
| 2730 | 2758 | ||
| 2731 | if (phy_mode == PHY_INTERFACE_MODE_SGMII) | 2759 | if (phy_mode == PHY_INTERFACE_MODE_SGMII) |
| 2732 | mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO); | 2760 | mvneta_port_sgmii_config(pp); |
| 2733 | else | ||
| 2734 | mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_RGMII_SERDES_PROTO); | ||
| 2735 | 2761 | ||
| 2736 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | 2762 | mvneta_gmac_rgmii_set(pp, 1); |
| 2737 | |||
| 2738 | val |= MVNETA_GMAC2_PCS_ENABLE | MVNETA_GMAC2_PORT_RGMII; | ||
| 2739 | 2763 | ||
| 2740 | /* Cancel Port Reset */ | 2764 | /* Cancel Port Reset */ |
| 2765 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | ||
| 2741 | val &= ~MVNETA_GMAC2_PORT_RESET; | 2766 | val &= ~MVNETA_GMAC2_PORT_RESET; |
| 2742 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | 2767 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); |
| 2743 | 2768 | ||
