176 lines
6.1 KiB
Diff
176 lines
6.1 KiB
Diff
From 092e35e5b10fdea2d814aa96ab2c2f2aad477640 Mon Sep 17 00:00:00 2001
|
|
From: Iyappan Subramanian <isubramanian@apm.com>
|
|
Date: Mon, 3 Nov 2014 11:59:55 -0800
|
|
Subject: [PATCH 08/11] drivers: net: xgene: Backward compatibility with older
|
|
firmware
|
|
Origin: https://git.kernel.org/cgit/linux/kernel/git/davem/net-next.git/commit/?id=c3f4465d272fa94d5a077c502e83d3e712ec8d62
|
|
|
|
This patch adds support when used with older firmware (<= 1.13.28).
|
|
|
|
- Added xgene_ring_mgr_init() to check whether ring manager is initialized
|
|
- Calling xgene_ring_mgr_init() from xgene_port_ops.reset()
|
|
- To handle errors, changed the return type of xgene_port_ops.reset()
|
|
|
|
Signed-off-by: Iyappan Subramanian <isubramanian@apm.com>
|
|
Signed-off-by: Keyur Chudgar <kchudgar@apm.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/ethernet/apm/xgene/xgene_enet_hw.c | 18 +++++++++++++++++-
|
|
drivers/net/ethernet/apm/xgene/xgene_enet_hw.h | 4 ++++
|
|
drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 5 ++++-
|
|
drivers/net/ethernet/apm/xgene/xgene_enet_main.h | 2 +-
|
|
drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c | 7 ++++++-
|
|
drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c | 7 ++++++-
|
|
6 files changed, 38 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
|
|
index 63ea194..7ba83ff 100644
|
|
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
|
|
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
|
|
@@ -575,10 +575,24 @@ static void xgene_gmac_tx_disable(struct xgene_enet_pdata *pdata)
|
|
xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, data & ~TX_EN);
|
|
}
|
|
|
|
-static void xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
|
+bool xgene_ring_mgr_init(struct xgene_enet_pdata *p)
|
|
+{
|
|
+ if (!ioread32(p->ring_csr_addr + CLKEN_ADDR))
|
|
+ return false;
|
|
+
|
|
+ if (ioread32(p->ring_csr_addr + SRST_ADDR))
|
|
+ return false;
|
|
+
|
|
+ return true;
|
|
+}
|
|
+
|
|
+static int xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
|
{
|
|
u32 val;
|
|
|
|
+ if (!xgene_ring_mgr_init(pdata))
|
|
+ return -ENODEV;
|
|
+
|
|
clk_prepare_enable(pdata->clk);
|
|
clk_disable_unprepare(pdata->clk);
|
|
clk_prepare_enable(pdata->clk);
|
|
@@ -590,6 +604,8 @@ static void xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
|
val |= SCAN_AUTO_INCR;
|
|
MGMT_CLOCK_SEL_SET(&val, 1);
|
|
xgene_enet_wr_mcx_mac(pdata, MII_MGMT_CONFIG_ADDR, val);
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static void xgene_gport_shutdown(struct xgene_enet_pdata *pdata)
|
|
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
|
|
index 3855858..ec45f32 100644
|
|
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
|
|
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
|
|
@@ -104,6 +104,9 @@ enum xgene_enet_rm {
|
|
#define BLOCK_ETH_MAC_OFFSET 0x0000
|
|
#define BLOCK_ETH_MAC_CSR_OFFSET 0x2800
|
|
|
|
+#define CLKEN_ADDR 0xc208
|
|
+#define SRST_ADDR 0xc200
|
|
+
|
|
#define MAC_ADDR_REG_OFFSET 0x00
|
|
#define MAC_COMMAND_REG_OFFSET 0x04
|
|
#define MAC_WRITE_REG_OFFSET 0x08
|
|
@@ -318,6 +321,7 @@ void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring,
|
|
|
|
int xgene_enet_mdio_config(struct xgene_enet_pdata *pdata);
|
|
void xgene_enet_mdio_remove(struct xgene_enet_pdata *pdata);
|
|
+bool xgene_ring_mgr_init(struct xgene_enet_pdata *p);
|
|
|
|
extern struct xgene_mac_ops xgene_gmac_ops;
|
|
extern struct xgene_port_ops xgene_gport_ops;
|
|
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
|
|
index 3c208cc..cc3f955 100644
|
|
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
|
|
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
|
|
@@ -852,7 +852,9 @@ static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
|
|
u16 dst_ring_num;
|
|
int ret;
|
|
|
|
- pdata->port_ops->reset(pdata);
|
|
+ ret = pdata->port_ops->reset(pdata);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
ret = xgene_enet_create_desc_rings(ndev);
|
|
if (ret) {
|
|
@@ -954,6 +956,7 @@ static int xgene_enet_probe(struct platform_device *pdev)
|
|
|
|
return ret;
|
|
err:
|
|
+ unregister_netdev(ndev);
|
|
free_netdev(ndev);
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
|
|
index 874e5a0..dba647d 100644
|
|
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
|
|
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
|
|
@@ -83,7 +83,7 @@ struct xgene_mac_ops {
|
|
};
|
|
|
|
struct xgene_port_ops {
|
|
- void (*reset)(struct xgene_enet_pdata *pdata);
|
|
+ int (*reset)(struct xgene_enet_pdata *pdata);
|
|
void (*cle_bypass)(struct xgene_enet_pdata *pdata,
|
|
u32 dst_ring_num, u16 bufpool_id);
|
|
void (*shutdown)(struct xgene_enet_pdata *pdata);
|
|
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
|
|
index c22f326..f5d4f68 100644
|
|
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
|
|
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
|
|
@@ -311,14 +311,19 @@ static void xgene_sgmac_tx_disable(struct xgene_enet_pdata *p)
|
|
xgene_sgmac_rxtx(p, TX_EN, false);
|
|
}
|
|
|
|
-static void xgene_enet_reset(struct xgene_enet_pdata *p)
|
|
+static int xgene_enet_reset(struct xgene_enet_pdata *p)
|
|
{
|
|
+ if (!xgene_ring_mgr_init(p))
|
|
+ return -ENODEV;
|
|
+
|
|
clk_prepare_enable(p->clk);
|
|
clk_disable_unprepare(p->clk);
|
|
clk_prepare_enable(p->clk);
|
|
|
|
xgene_enet_ecc_init(p);
|
|
xgene_enet_config_ring_if_assoc(p);
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static void xgene_enet_cle_bypass(struct xgene_enet_pdata *p,
|
|
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c
|
|
index 67d0720..a18a9d1 100644
|
|
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c
|
|
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c
|
|
@@ -252,14 +252,19 @@ static void xgene_xgmac_tx_disable(struct xgene_enet_pdata *pdata)
|
|
xgene_enet_wr_mac(pdata, AXGMAC_CONFIG_1, data & ~HSTTFEN);
|
|
}
|
|
|
|
-static void xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
|
+static int xgene_enet_reset(struct xgene_enet_pdata *pdata)
|
|
{
|
|
+ if (!xgene_ring_mgr_init(pdata))
|
|
+ return -ENODEV;
|
|
+
|
|
clk_prepare_enable(pdata->clk);
|
|
clk_disable_unprepare(pdata->clk);
|
|
clk_prepare_enable(pdata->clk);
|
|
|
|
xgene_enet_ecc_init(pdata);
|
|
xgene_enet_config_ring_if_assoc(pdata);
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static void xgene_enet_xgcle_bypass(struct xgene_enet_pdata *pdata,
|
|
--
|
|
2.1.0
|
|
|