diff options
author | Keyur Chudgar <kchudgar@apm.com> | 2015-03-17 14:27:13 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-18 12:44:05 -0400 |
commit | ca6264545a9ffa855e8c49c1d7d8f4ab4b2a9af7 (patch) | |
tree | 50c2fbf77074eeb0bfbd24879c2d5b71a23b4766 | |
parent | 2d33394e23d63b750dcba40e5feaeba425427b52 (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.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 50 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_main.h | 17 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c | 10 |
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 | ||
757 | static 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 | |||
755 | static int xgene_get_mac_address(struct device *dev, | 773 | static 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 | ||
940 | static int xgene_enet_probe(struct platform_device *pdev) | 980 | static 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 | ||
130 | struct xgene_indirect_ctl { | 141 | struct 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) | |||
226 | static void xgene_sgmac_init(struct xgene_enet_pdata *p) | 226 | static 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 | ||
280 | static void xgene_sgmac_rxtx(struct xgene_enet_pdata *p, u32 bits, bool set) | 281 | static 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 | ||
342 | static void xgene_enet_shutdown(struct xgene_enet_pdata *p) | 344 | static void xgene_enet_shutdown(struct xgene_enet_pdata *p) |