Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'xgene-next'

Keyur Chudgar says:

====================
drivers: net: xgene: Add second SGMII based 1G interface

This patch adds support for second SGMII based 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>

+98 -12
+2
Documentation/devicetree/bindings/net/apm-xgene-enet.txt
··· 15 15 - "ring_csr": Descriptor ring control and status register address space 16 16 - "ring_cmd": Descriptor ring command register address space 17 17 - interrupts: Ethernet main interrupt 18 + - port-id: Port number (0 or 1) 18 19 - clocks: Reference to the clock entry. 19 20 - local-mac-address: MAC address assigned to this device 20 21 - phy-connection-type: Interface type between ethernet device and PHY device ··· 50 49 <0x0 0X10000000 0x0 0X200>; 51 50 reg-names = "enet_csr", "ring_csr", "ring_cmd"; 52 51 interrupts = <0x0 0x3c 0x4>; 52 + port-id = <0>; 53 53 clocks = <&menetclk 0>; 54 54 local-mac-address = [00 01 73 00 00 01]; 55 55 phy-connection-type = "rgmii";
+4
arch/arm64/boot/dts/apm/apm-mustang.dts
··· 45 45 status = "ok"; 46 46 }; 47 47 48 + &sgenet1 { 49 + status = "ok"; 50 + }; 51 + 48 52 &xgenet { 49 53 status = "ok"; 50 54 };
+25
arch/arm64/boot/dts/apm/apm-storm.dtsi
··· 186 186 clock-output-names = "sge0clk"; 187 187 }; 188 188 189 + sge1clk: sge1clk@1f21c000 { 190 + compatible = "apm,xgene-device-clock"; 191 + #clock-cells = <1>; 192 + clocks = <&socplldiv2 0>; 193 + reg = <0x0 0x1f21c000 0x0 0x1000>; 194 + reg-names = "csr-reg"; 195 + csr-mask = <0xc>; 196 + clock-output-names = "sge1clk"; 197 + }; 198 + 189 199 xge0clk: xge0clk@1f61c000 { 190 200 compatible = "apm,xgene-device-clock"; 191 201 #clock-cells = <1>; ··· 641 631 interrupts = <0x0 0xA0 0x4>; 642 632 dma-coherent; 643 633 clocks = <&sge0clk 0>; 634 + local-mac-address = [00 00 00 00 00 00]; 635 + phy-connection-type = "sgmii"; 636 + }; 637 + 638 + sgenet1: ethernet@1f210030 { 639 + compatible = "apm,xgene1-sgenet"; 640 + status = "disabled"; 641 + reg = <0x0 0x1f210030 0x0 0xd100>, 642 + <0x0 0x1f200000 0x0 0Xc300>, 643 + <0x0 0x1B000000 0x0 0X8000>; 644 + reg-names = "enet_csr", "ring_csr", "ring_cmd"; 645 + interrupts = <0x0 0xAC 0x4>; 646 + port-id = <1>; 647 + dma-coherent; 648 + clocks = <&sge1clk 0>; 644 649 local-mac-address = [00 00 00 00 00 00]; 645 650 phy-connection-type = "sgmii"; 646 651 };
+2
drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
··· 97 97 #define QCOHERENT BIT(4) 98 98 #define RECOMBBUF BIT(27) 99 99 100 + #define MAC_OFFSET 0x30 101 + 100 102 #define BLOCK_ETH_CSR_OFFSET 0x2000 101 103 #define BLOCK_ETH_RING_IF_OFFSET 0x9000 102 104 #define BLOCK_ETH_DIAG_CSR_OFFSET 0xD000
+45 -5
drivers/net/ethernet/apm/xgene/xgene_enet_main.c
··· 645 645 struct device *dev = ndev_to_dev(ndev); 646 646 struct xgene_enet_desc_ring *rx_ring, *tx_ring, *cp_ring; 647 647 struct xgene_enet_desc_ring *buf_pool = NULL; 648 - u8 cpu_bufnum = 0, eth_bufnum = START_ETH_BUFNUM; 649 - u8 bp_bufnum = START_BP_BUFNUM; 650 - u16 ring_id, ring_num = START_RING_NUM; 648 + u8 cpu_bufnum = pdata->cpu_bufnum; 649 + u8 eth_bufnum = pdata->eth_bufnum; 650 + u8 bp_bufnum = pdata->bp_bufnum; 651 + u16 ring_num = pdata->ring_num; 652 + u16 ring_id; 651 653 int ret; 652 654 653 655 /* allocate rx descriptor ring */ ··· 754 752 .ndo_set_mac_address = xgene_enet_set_mac_address, 755 753 }; 756 754 755 + static int xgene_get_port_id(struct device *dev, struct xgene_enet_pdata *pdata) 756 + { 757 + u32 id = 0; 758 + int ret; 759 + 760 + ret = device_property_read_u32(dev, "port-id", &id); 761 + if (!ret && id > 1) { 762 + dev_err(dev, "Incorrect port-id specified\n"); 763 + return -ENODEV; 764 + } 765 + 766 + pdata->port_id = id; 767 + 768 + return 0; 769 + } 770 + 757 771 static int xgene_get_mac_address(struct device *dev, 758 772 unsigned char *addr) 759 773 { ··· 861 843 } 862 844 pdata->rx_irq = ret; 863 845 846 + ret = xgene_get_port_id(dev, pdata); 847 + if (ret) 848 + return ret; 849 + 864 850 if (xgene_get_mac_address(dev, ndev->dev_addr) != ETH_ALEN) 865 851 eth_hw_addr_random(ndev); 866 852 ··· 888 866 pdata->clk = NULL; 889 867 } 890 868 891 - base_addr = pdata->base_addr; 869 + base_addr = pdata->base_addr - (pdata->port_id * MAC_OFFSET); 892 870 pdata->eth_csr_addr = base_addr + BLOCK_ETH_CSR_OFFSET; 893 871 pdata->eth_ring_if_addr = base_addr + BLOCK_ETH_RING_IF_OFFSET; 894 872 pdata->eth_diag_csr_addr = base_addr + BLOCK_ETH_DIAG_CSR_OFFSET; 895 873 if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII || 896 874 pdata->phy_mode == PHY_INTERFACE_MODE_SGMII) { 897 - pdata->mcx_mac_addr = base_addr + BLOCK_ETH_MAC_OFFSET; 875 + pdata->mcx_mac_addr = pdata->base_addr + BLOCK_ETH_MAC_OFFSET; 898 876 pdata->mcx_mac_csr_addr = base_addr + BLOCK_ETH_MAC_CSR_OFFSET; 899 877 } else { 900 878 pdata->mcx_mac_addr = base_addr + BLOCK_AXG_MAC_OFFSET; ··· 957 935 pdata->rm = RM0; 958 936 break; 959 937 } 938 + 939 + switch (pdata->port_id) { 940 + case 0: 941 + pdata->cpu_bufnum = START_CPU_BUFNUM_0; 942 + pdata->eth_bufnum = START_ETH_BUFNUM_0; 943 + pdata->bp_bufnum = START_BP_BUFNUM_0; 944 + pdata->ring_num = START_RING_NUM_0; 945 + break; 946 + case 1: 947 + pdata->cpu_bufnum = START_CPU_BUFNUM_1; 948 + pdata->eth_bufnum = START_ETH_BUFNUM_1; 949 + pdata->bp_bufnum = START_BP_BUFNUM_1; 950 + pdata->ring_num = START_RING_NUM_1; 951 + break; 952 + default: 953 + break; 954 + } 955 + 960 956 } 961 957 962 958 static int xgene_enet_probe(struct platform_device *pdev)
+14 -3
drivers/net/ethernet/apm/xgene/xgene_enet_main.h
··· 41 41 #define SKB_BUFFER_SIZE (XGENE_ENET_MAX_MTU - NET_IP_ALIGN) 42 42 #define NUM_PKT_BUF 64 43 43 #define NUM_BUFPOOL 32 44 - #define START_ETH_BUFNUM 2 45 - #define START_BP_BUFNUM 0x22 46 - #define START_RING_NUM 8 44 + 45 + #define START_CPU_BUFNUM_0 0 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 54 #define PHY_POLL_LINK_ON (10 * HZ) 49 55 #define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5) ··· 131 125 struct xgene_mac_ops *mac_ops; 132 126 struct xgene_port_ops *port_ops; 133 127 struct delayed_work link_work; 128 + u32 port_id; 129 + u8 cpu_bufnum; 130 + u8 eth_bufnum; 131 + u8 bp_bufnum; 132 + u16 ring_num; 134 133 }; 135 134 136 135 struct xgene_indirect_ctl {
+6 -4
drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
··· 226 226 static void xgene_sgmac_init(struct xgene_enet_pdata *p) 227 227 { 228 228 u32 data, loop = 10; 229 + u32 offset = p->port_id * 4; 229 230 230 231 xgene_sgmac_reset(p); 231 232 ··· 273 272 xgene_enet_wr_csr(p, RSIF_RAM_DBG_REG0_ADDR, 0); 274 273 275 274 /* Bypass traffic gating */ 276 - xgene_enet_wr_csr(p, CFG_LINK_AGGR_RESUME_0_ADDR, TX_PORT0); 275 + xgene_enet_wr_csr(p, CFG_LINK_AGGR_RESUME_0_ADDR + offset, TX_PORT0); 277 276 xgene_enet_wr_csr(p, CFG_BYPASS_ADDR, RESUME_TX); 278 - xgene_enet_wr_csr(p, SG_RX_DV_GATE_REG_0_ADDR, RESUME_RX0); 277 + xgene_enet_wr_csr(p, SG_RX_DV_GATE_REG_0_ADDR + offset, RESUME_RX0); 279 278 } 280 279 281 280 static void xgene_sgmac_rxtx(struct xgene_enet_pdata *p, u32 bits, bool set) ··· 331 330 u32 dst_ring_num, u16 bufpool_id) 332 331 { 333 332 u32 data, fpsel; 333 + u32 offset = p->port_id * MAC_OFFSET; 334 334 335 335 data = CFG_CLE_BYPASS_EN0; 336 - xgene_enet_wr_csr(p, CLE_BYPASS_REG0_0_ADDR, data); 336 + xgene_enet_wr_csr(p, CLE_BYPASS_REG0_0_ADDR + offset, data); 337 337 338 338 fpsel = xgene_enet_ring_bufnum(bufpool_id) - 0x20; 339 339 data = CFG_CLE_DSTQID0(dst_ring_num) | CFG_CLE_FPSEL0(fpsel); 340 - xgene_enet_wr_csr(p, CLE_BYPASS_REG1_0_ADDR, data); 340 + xgene_enet_wr_csr(p, CLE_BYPASS_REG1_0_ADDR + offset, data); 341 341 } 342 342 343 343 static void xgene_enet_shutdown(struct xgene_enet_pdata *p)