|
@@ -22,6 +22,7 @@
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <net/ip.h>
|
|
|
#include <net/ipv6.h>
|
|
|
+#include <linux/io.h>
|
|
|
#include <linux/of.h>
|
|
|
#include <linux/of_irq.h>
|
|
|
#include <linux/of_mdio.h>
|
|
@@ -88,8 +89,9 @@
|
|
|
#define MVNETA_TX_IN_PRGRS BIT(1)
|
|
|
#define MVNETA_TX_FIFO_EMPTY BIT(8)
|
|
|
#define MVNETA_RX_MIN_FRAME_SIZE 0x247c
|
|
|
-#define MVNETA_SGMII_SERDES_CFG 0x24A0
|
|
|
+#define MVNETA_SERDES_CFG 0x24A0
|
|
|
#define MVNETA_SGMII_SERDES_PROTO 0x0cc7
|
|
|
+#define MVNETA_RGMII_SERDES_PROTO 0x0667
|
|
|
#define MVNETA_TYPE_PRIO 0x24bc
|
|
|
#define MVNETA_FORCE_UNI BIT(21)
|
|
|
#define MVNETA_TXQ_CMD_1 0x24e4
|
|
@@ -161,7 +163,7 @@
|
|
|
#define MVNETA_GMAC_MAX_RX_SIZE_MASK 0x7ffc
|
|
|
#define MVNETA_GMAC0_PORT_ENABLE BIT(0)
|
|
|
#define MVNETA_GMAC_CTRL_2 0x2c08
|
|
|
-#define MVNETA_GMAC2_PSC_ENABLE BIT(3)
|
|
|
+#define MVNETA_GMAC2_PCS_ENABLE BIT(3)
|
|
|
#define MVNETA_GMAC2_PORT_RGMII BIT(4)
|
|
|
#define MVNETA_GMAC2_PORT_RESET BIT(6)
|
|
|
#define MVNETA_GMAC_STATUS 0x2c10
|
|
@@ -710,35 +712,6 @@ static void mvneta_rxq_bm_disable(struct mvneta_port *pp,
|
|
|
mvreg_write(pp, MVNETA_RXQ_CONFIG_REG(rxq->id), val);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-/* Sets the RGMII Enable bit (RGMIIEn) in port MAC control register */
|
|
|
-static void mvneta_gmac_rgmii_set(struct mvneta_port *pp, int enable)
|
|
|
-{
|
|
|
- u32 val;
|
|
|
-
|
|
|
- val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
|
|
-
|
|
|
- if (enable)
|
|
|
- val |= MVNETA_GMAC2_PORT_RGMII;
|
|
|
- else
|
|
|
- val &= ~MVNETA_GMAC2_PORT_RGMII;
|
|
|
-
|
|
|
- mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
|
|
|
-}
|
|
|
-
|
|
|
-/* Config SGMII port */
|
|
|
-static void mvneta_port_sgmii_config(struct mvneta_port *pp)
|
|
|
-{
|
|
|
- u32 val;
|
|
|
-
|
|
|
- val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
|
|
- val |= MVNETA_GMAC2_PSC_ENABLE;
|
|
|
- mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
|
|
|
-
|
|
|
- mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO);
|
|
|
-}
|
|
|
-
|
|
|
/* Start the Ethernet port RX and TX activity */
|
|
|
static void mvneta_port_up(struct mvneta_port *pp)
|
|
|
{
|
|
@@ -2756,12 +2729,15 @@ static void mvneta_port_power_up(struct mvneta_port *pp, int phy_mode)
|
|
|
mvreg_write(pp, MVNETA_UNIT_INTR_CAUSE, 0);
|
|
|
|
|
|
if (phy_mode == PHY_INTERFACE_MODE_SGMII)
|
|
|
- mvneta_port_sgmii_config(pp);
|
|
|
+ mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO);
|
|
|
+ else
|
|
|
+ mvreg_write(pp, MVNETA_SERDES_CFG, MVNETA_RGMII_SERDES_PROTO);
|
|
|
+
|
|
|
+ val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
|
|
|
|
|
- mvneta_gmac_rgmii_set(pp, 1);
|
|
|
+ val |= MVNETA_GMAC2_PCS_ENABLE | MVNETA_GMAC2_PORT_RGMII;
|
|
|
|
|
|
/* Cancel Port Reset */
|
|
|
- val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
|
|
|
val &= ~MVNETA_GMAC2_PORT_RESET;
|
|
|
mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
|
|
|
|
|
@@ -2774,6 +2750,7 @@ static void mvneta_port_power_up(struct mvneta_port *pp, int phy_mode)
|
|
|
static int mvneta_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
const struct mbus_dram_target_info *dram_target_info;
|
|
|
+ struct resource *res;
|
|
|
struct device_node *dn = pdev->dev.of_node;
|
|
|
struct device_node *phy_node;
|
|
|
u32 phy_addr;
|
|
@@ -2838,9 +2815,15 @@ static int mvneta_probe(struct platform_device *pdev)
|
|
|
|
|
|
clk_prepare_enable(pp->clk);
|
|
|
|
|
|
- pp->base = of_iomap(dn, 0);
|
|
|
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
+ if (!res) {
|
|
|
+ err = -ENODEV;
|
|
|
+ goto err_clk;
|
|
|
+ }
|
|
|
+
|
|
|
+ pp->base = devm_ioremap_resource(&pdev->dev, res);
|
|
|
if (pp->base == NULL) {
|
|
|
- err = -ENOMEM;
|
|
|
+ err = PTR_ERR(pp->base);
|
|
|
goto err_clk;
|
|
|
}
|
|
|
|
|
@@ -2848,7 +2831,7 @@ static int mvneta_probe(struct platform_device *pdev)
|
|
|
pp->stats = alloc_percpu(struct mvneta_pcpu_stats);
|
|
|
if (!pp->stats) {
|
|
|
err = -ENOMEM;
|
|
|
- goto err_unmap;
|
|
|
+ goto err_clk;
|
|
|
}
|
|
|
|
|
|
for_each_possible_cpu(cpu) {
|
|
@@ -2913,8 +2896,6 @@ err_deinit:
|
|
|
mvneta_deinit(pp);
|
|
|
err_free_stats:
|
|
|
free_percpu(pp->stats);
|
|
|
-err_unmap:
|
|
|
- iounmap(pp->base);
|
|
|
err_clk:
|
|
|
clk_disable_unprepare(pp->clk);
|
|
|
err_free_irq:
|
|
@@ -2934,7 +2915,6 @@ static int mvneta_remove(struct platform_device *pdev)
|
|
|
mvneta_deinit(pp);
|
|
|
clk_disable_unprepare(pp->clk);
|
|
|
free_percpu(pp->stats);
|
|
|
- iounmap(pp->base);
|
|
|
irq_dispose_mapping(dev->irq);
|
|
|
free_netdev(dev);
|
|
|
|