aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeyur Chudgar <kchudgar@apm.com>2015-03-17 14:27:13 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-18 12:44:05 -0400
commitca6264545a9ffa855e8c49c1d7d8f4ab4b2a9af7 (patch)
tree50c2fbf77074eeb0bfbd24879c2d5b71a23b4766
parent2d33394e23d63b750dcba40e5feaeba425427b52 (diff)
drivers: net: xgene: Add second SGMII based 1G interface
- Added resource initialization based on port-id field - Enabled second SGMII 1G interface Signed-off-by: Keyur Chudgar <kchudgar@apm.com> Signed-off-by: Iyappan Subramanian <isubramanian@apm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.h2
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.c50
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.h17
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c10
4 files changed, 67 insertions, 12 deletions
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
index ec45f3256f0e..d9bc89d69266 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
@@ -97,6 +97,8 @@ enum xgene_enet_rm {
97#define QCOHERENT BIT(4) 97#define QCOHERENT BIT(4)
98#define RECOMBBUF BIT(27) 98#define RECOMBBUF BIT(27)
99 99
100#define MAC_OFFSET 0x30
101
100#define BLOCK_ETH_CSR_OFFSET 0x2000 102#define BLOCK_ETH_CSR_OFFSET 0x2000
101#define BLOCK_ETH_RING_IF_OFFSET 0x9000 103#define BLOCK_ETH_RING_IF_OFFSET 0x9000
102#define BLOCK_ETH_DIAG_CSR_OFFSET 0xD000 104#define BLOCK_ETH_DIAG_CSR_OFFSET 0xD000
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
index edb843650eed..6146a993a136 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
@@ -645,9 +645,11 @@ static int xgene_enet_create_desc_rings(struct net_device *ndev)
645 struct device *dev = ndev_to_dev(ndev); 645 struct device *dev = ndev_to_dev(ndev);
646 struct xgene_enet_desc_ring *rx_ring, *tx_ring, *cp_ring; 646 struct xgene_enet_desc_ring *rx_ring, *tx_ring, *cp_ring;
647 struct xgene_enet_desc_ring *buf_pool = NULL; 647 struct xgene_enet_desc_ring *buf_pool = NULL;
648 u8 cpu_bufnum = 0, eth_bufnum = START_ETH_BUFNUM; 648 u8 cpu_bufnum = pdata->cpu_bufnum;
649 u8 bp_bufnum = START_BP_BUFNUM; 649 u8 eth_bufnum = pdata->eth_bufnum;
650 u16 ring_id, ring_num = START_RING_NUM; 650 u8 bp_bufnum = pdata->bp_bufnum;
651 u16 ring_num = pdata->ring_num;
652 u16 ring_id;
651 int ret; 653 int ret;
652 654
653 /* allocate rx descriptor ring */ 655 /* allocate rx descriptor ring */
@@ -752,6 +754,22 @@ static const struct net_device_ops xgene_ndev_ops = {
752 .ndo_set_mac_address = xgene_enet_set_mac_address, 754 .ndo_set_mac_address = xgene_enet_set_mac_address,
753}; 755};
754 756
757static int xgene_get_port_id(struct device *dev, struct xgene_enet_pdata *pdata)
758{
759 u32 id = 0;
760 int ret;
761
762 ret = device_property_read_u32(dev, "port-id", &id);
763 if (!ret && id > 1) {
764 dev_err(dev, "Incorrect port-id specified\n");
765 return -ENODEV;
766 }
767
768 pdata->port_id = id;
769
770 return 0;
771}
772
755static int xgene_get_mac_address(struct device *dev, 773static int xgene_get_mac_address(struct device *dev,
756 unsigned char *addr) 774 unsigned char *addr)
757{ 775{
@@ -843,6 +861,10 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
843 } 861 }
844 pdata->rx_irq = ret; 862 pdata->rx_irq = ret;
845 863
864 ret = xgene_get_port_id(dev, pdata);
865 if (ret)
866 return ret;
867
846 if (xgene_get_mac_address(dev, ndev->dev_addr) != ETH_ALEN) 868 if (xgene_get_mac_address(dev, ndev->dev_addr) != ETH_ALEN)
847 eth_hw_addr_random(ndev); 869 eth_hw_addr_random(ndev);
848 870
@@ -866,13 +888,13 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
866 pdata->clk = NULL; 888 pdata->clk = NULL;
867 } 889 }
868 890
869 base_addr = pdata->base_addr; 891 base_addr = pdata->base_addr - (pdata->port_id * MAC_OFFSET);
870 pdata->eth_csr_addr = base_addr + BLOCK_ETH_CSR_OFFSET; 892 pdata->eth_csr_addr = base_addr + BLOCK_ETH_CSR_OFFSET;
871 pdata->eth_ring_if_addr = base_addr + BLOCK_ETH_RING_IF_OFFSET; 893 pdata->eth_ring_if_addr = base_addr + BLOCK_ETH_RING_IF_OFFSET;
872 pdata->eth_diag_csr_addr = base_addr + BLOCK_ETH_DIAG_CSR_OFFSET; 894 pdata->eth_diag_csr_addr = base_addr + BLOCK_ETH_DIAG_CSR_OFFSET;
873 if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII || 895 if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII ||
874 pdata->phy_mode == PHY_INTERFACE_MODE_SGMII) { 896 pdata->phy_mode == PHY_INTERFACE_MODE_SGMII) {
875 pdata->mcx_mac_addr = base_addr + BLOCK_ETH_MAC_OFFSET; 897 pdata->mcx_mac_addr = pdata->base_addr + BLOCK_ETH_MAC_OFFSET;
876 pdata->mcx_mac_csr_addr = base_addr + BLOCK_ETH_MAC_CSR_OFFSET; 898 pdata->mcx_mac_csr_addr = base_addr + BLOCK_ETH_MAC_CSR_OFFSET;
877 } else { 899 } else {
878 pdata->mcx_mac_addr = base_addr + BLOCK_AXG_MAC_OFFSET; 900 pdata->mcx_mac_addr = base_addr + BLOCK_AXG_MAC_OFFSET;
@@ -935,6 +957,24 @@ static void xgene_enet_setup_ops(struct xgene_enet_pdata *pdata)
935 pdata->rm = RM0; 957 pdata->rm = RM0;
936 break; 958 break;
937 } 959 }
960
961 switch (pdata->port_id) {
962 case 0:
963 pdata->cpu_bufnum = START_CPU_BUFNUM_0;
964 pdata->eth_bufnum = START_ETH_BUFNUM_0;
965 pdata->bp_bufnum = START_BP_BUFNUM_0;
966 pdata->ring_num = START_RING_NUM_0;
967 break;
968 case 1:
969 pdata->cpu_bufnum = START_CPU_BUFNUM_1;
970 pdata->eth_bufnum = START_ETH_BUFNUM_1;
971 pdata->bp_bufnum = START_BP_BUFNUM_1;
972 pdata->ring_num = START_RING_NUM_1;
973 break;
974 default:
975 break;
976 }
977
938} 978}
939 979
940static int xgene_enet_probe(struct platform_device *pdev) 980static int xgene_enet_probe(struct platform_device *pdev)
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
index c2d465c3db66..b93ed21a157f 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
@@ -41,9 +41,15 @@
41#define SKB_BUFFER_SIZE (XGENE_ENET_MAX_MTU - NET_IP_ALIGN) 41#define SKB_BUFFER_SIZE (XGENE_ENET_MAX_MTU - NET_IP_ALIGN)
42#define NUM_PKT_BUF 64 42#define NUM_PKT_BUF 64
43#define NUM_BUFPOOL 32 43#define NUM_BUFPOOL 32
44#define START_ETH_BUFNUM 2 44
45#define START_BP_BUFNUM 0x22 45#define START_CPU_BUFNUM_0 0
46#define START_RING_NUM 8 46#define START_ETH_BUFNUM_0 2
47#define START_BP_BUFNUM_0 0x22
48#define START_RING_NUM_0 8
49#define START_CPU_BUFNUM_1 12
50#define START_ETH_BUFNUM_1 10
51#define START_BP_BUFNUM_1 0x2A
52#define START_RING_NUM_1 264
47 53
48#define PHY_POLL_LINK_ON (10 * HZ) 54#define PHY_POLL_LINK_ON (10 * HZ)
49#define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5) 55#define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5)
@@ -125,6 +131,11 @@ struct xgene_enet_pdata {
125 struct xgene_mac_ops *mac_ops; 131 struct xgene_mac_ops *mac_ops;
126 struct xgene_port_ops *port_ops; 132 struct xgene_port_ops *port_ops;
127 struct delayed_work link_work; 133 struct delayed_work link_work;
134 u32 port_id;
135 u8 cpu_bufnum;
136 u8 eth_bufnum;
137 u8 bp_bufnum;
138 u16 ring_num;
128}; 139};
129 140
130struct xgene_indirect_ctl { 141struct xgene_indirect_ctl {
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
index f5d4f68c288c..f27fb6f2a93b 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
@@ -226,6 +226,7 @@ static u32 xgene_enet_link_status(struct xgene_enet_pdata *p)
226static void xgene_sgmac_init(struct xgene_enet_pdata *p) 226static void xgene_sgmac_init(struct xgene_enet_pdata *p)
227{ 227{
228 u32 data, loop = 10; 228 u32 data, loop = 10;
229 u32 offset = p->port_id * 4;
229 230
230 xgene_sgmac_reset(p); 231 xgene_sgmac_reset(p);
231 232
@@ -272,9 +273,9 @@ static void xgene_sgmac_init(struct xgene_enet_pdata *p)
272 xgene_enet_wr_csr(p, RSIF_RAM_DBG_REG0_ADDR, 0); 273 xgene_enet_wr_csr(p, RSIF_RAM_DBG_REG0_ADDR, 0);
273 274
274 /* Bypass traffic gating */ 275 /* Bypass traffic gating */
275 xgene_enet_wr_csr(p, CFG_LINK_AGGR_RESUME_0_ADDR, TX_PORT0); 276 xgene_enet_wr_csr(p, CFG_LINK_AGGR_RESUME_0_ADDR + offset, TX_PORT0);
276 xgene_enet_wr_csr(p, CFG_BYPASS_ADDR, RESUME_TX); 277 xgene_enet_wr_csr(p, CFG_BYPASS_ADDR, RESUME_TX);
277 xgene_enet_wr_csr(p, SG_RX_DV_GATE_REG_0_ADDR, RESUME_RX0); 278 xgene_enet_wr_csr(p, SG_RX_DV_GATE_REG_0_ADDR + offset, RESUME_RX0);
278} 279}
279 280
280static void xgene_sgmac_rxtx(struct xgene_enet_pdata *p, u32 bits, bool set) 281static void xgene_sgmac_rxtx(struct xgene_enet_pdata *p, u32 bits, bool set)
@@ -330,13 +331,14 @@ static void xgene_enet_cle_bypass(struct xgene_enet_pdata *p,
330 u32 dst_ring_num, u16 bufpool_id) 331 u32 dst_ring_num, u16 bufpool_id)
331{ 332{
332 u32 data, fpsel; 333 u32 data, fpsel;
334 u32 offset = p->port_id * MAC_OFFSET;
333 335
334 data = CFG_CLE_BYPASS_EN0; 336 data = CFG_CLE_BYPASS_EN0;
335 xgene_enet_wr_csr(p, CLE_BYPASS_REG0_0_ADDR, data); 337 xgene_enet_wr_csr(p, CLE_BYPASS_REG0_0_ADDR + offset, data);
336 338
337 fpsel = xgene_enet_ring_bufnum(bufpool_id) - 0x20; 339 fpsel = xgene_enet_ring_bufnum(bufpool_id) - 0x20;
338 data = CFG_CLE_DSTQID0(dst_ring_num) | CFG_CLE_FPSEL0(fpsel); 340 data = CFG_CLE_DSTQID0(dst_ring_num) | CFG_CLE_FPSEL0(fpsel);
339 xgene_enet_wr_csr(p, CLE_BYPASS_REG1_0_ADDR, data); 341 xgene_enet_wr_csr(p, CLE_BYPASS_REG1_0_ADDR + offset, data);
340} 342}
341 343
342static void xgene_enet_shutdown(struct xgene_enet_pdata *p) 344static void xgene_enet_shutdown(struct xgene_enet_pdata *p)