Skip to content

Commit 2ce66f9

Browse files
committed
Merge branch 'xgene-next'
Iyappan Subramanian says: ==================== Fix warning and issues This patch set fixes the following warning and issues, 1. Fix compiler warnings - drivers: net: xgene: Fix compiler warnings 2. unmap DMA memory on xgene_Enet_delete_bufpoool() - drivers: net: xgene: fix: Add dma_unmap_single 3. Delete descriptor rings and buffer pools on error - drivers: net: xgene: fix: Delete descriptor rings and buffer pools 4. Fix error desconstruction on probe() - drivers: net: xgene: Fix error deconstruction path 5. Fix RSS indirection table fields - drivers: net: xgene: Fix RSS indirection table fields 6. Change the port init sequence as per hardware specification - drivers: net: xgene: Change port init sequence 7. Fix link not recovered after link is down issue - drivers: net: xgene: XFI PCS reset when link is down 8. Fix link up is reported when no SFP+ module is plugged in issue - drivers: net: xgene: Poll link status via GPIO - dtb: xgene: Add rxlos-gpios property - Documentation: dtb: xgene: Add rxlos GPIO mapping 9. Fix backward compatibility when used with older driver - drivers: net: xgene: Fix backward compatibility - dtb: xgene: Fix backward compatibility v2: Address review comments from v1 - Fixed compiler warnings - Removed kbuild fix patch, since Arnd submitted the same - Changed Kconfig to select GPIOLIB (to fix kbuild warning) - Added rxlos-gpio documentation - Fixed backward compatibility with older driver v1: - Initial version ==================== Signed-off-by: Iyappan Subramanian <[email protected]> Tested-by: Fushen Chen <[email protected]> Signed-off-by: David S. Miller <[email protected]>
2 parents 1c23876 + 5ac6caa commit 2ce66f9

File tree

12 files changed

+150
-40
lines changed

12 files changed

+150
-40
lines changed

Documentation/devicetree/bindings/net/apm-xgene-enet.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ Optional properties:
4747
Valid values are between 0 to 7, that maps to
4848
273, 589, 899, 1222, 1480, 1806, 2147, 2464 ps
4949
Default value is 2, which corresponds to 899 ps
50+
- rxlos-gpios: Input gpio from SFP+ module to indicate availability of
51+
incoming signal.
52+
5053

5154
Example:
5255
menetclk: menetclk {

arch/arm64/boot/dts/apm/apm-mustang.dts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474

7575
&xgenet {
7676
status = "ok";
77+
rxlos-gpios = <&sbgpio 12 1>;
7778
};
7879

7980
&mmc0 {

arch/arm64/boot/dts/apm/apm-storm.dtsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@
923923
/* mac address will be overwritten by the bootloader */
924924
local-mac-address = [00 00 00 00 00 00];
925925
phy-connection-type = "rgmii";
926-
phy-handle = <&menet0phy>,<&menetphy>;
926+
phy-handle = <&menetphy>,<&menet0phy>;
927927
mdio {
928928
compatible = "apm,xgene-mdio";
929929
#address-cells = <1>;

drivers/net/ethernet/apm/xgene/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ config NET_XGENE
44
depends on ARCH_XGENE || COMPILE_TEST
55
select PHYLIB
66
select MDIO_XGENE
7+
select GPIOLIB
78
help
89
This is the Ethernet driver for the on-chip ethernet interface on the
910
APM X-Gene SoC.

drivers/net/ethernet/apm/xgene/xgene_enet_cle.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,19 @@ static void xgene_cle_sband_to_hw(u8 frag, enum xgene_cle_prot_version ver,
3232
SET_VAL(SB_HDRLEN, len);
3333
}
3434

35-
static void xgene_cle_idt_to_hw(u32 dstqid, u32 fpsel,
35+
static void xgene_cle_idt_to_hw(struct xgene_enet_pdata *pdata,
36+
u32 dstqid, u32 fpsel,
3637
u32 nfpsel, u32 *idt_reg)
3738
{
38-
*idt_reg = SET_VAL(IDT_DSTQID, dstqid) |
39-
SET_VAL(IDT_FPSEL, fpsel) |
40-
SET_VAL(IDT_NFPSEL, nfpsel);
39+
if (pdata->enet_id == XGENE_ENET1) {
40+
*idt_reg = SET_VAL(IDT_DSTQID, dstqid) |
41+
SET_VAL(IDT_FPSEL1, fpsel) |
42+
SET_VAL(IDT_NFPSEL1, nfpsel);
43+
} else {
44+
*idt_reg = SET_VAL(IDT_DSTQID, dstqid) |
45+
SET_VAL(IDT_FPSEL, fpsel) |
46+
SET_VAL(IDT_NFPSEL, nfpsel);
47+
}
4148
}
4249

4350
static void xgene_cle_dbptr_to_hw(struct xgene_enet_pdata *pdata,
@@ -344,7 +351,7 @@ static int xgene_cle_set_rss_idt(struct xgene_enet_pdata *pdata)
344351
nfpsel = 0;
345352
idt_reg = 0;
346353

347-
xgene_cle_idt_to_hw(dstqid, fpsel, nfpsel, &idt_reg);
354+
xgene_cle_idt_to_hw(pdata, dstqid, fpsel, nfpsel, &idt_reg);
348355
ret = xgene_cle_dram_wr(&pdata->cle, &idt_reg, 1, i,
349356
RSS_IDT, CLE_CMD_WR);
350357
if (ret)

drivers/net/ethernet/apm/xgene/xgene_enet_cle.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,13 @@ enum xgene_cle_ptree_dbptrs {
196196
#define IDT_DSTQID_POS 0
197197
#define IDT_DSTQID_LEN 12
198198
#define IDT_FPSEL_POS 12
199-
#define IDT_FPSEL_LEN 4
200-
#define IDT_NFPSEL_POS 16
201-
#define IDT_NFPSEL_LEN 4
199+
#define IDT_FPSEL_LEN 5
200+
#define IDT_NFPSEL_POS 17
201+
#define IDT_NFPSEL_LEN 5
202+
#define IDT_FPSEL1_POS 12
203+
#define IDT_FPSEL1_LEN 4
204+
#define IDT_NFPSEL1_POS 16
205+
#define IDT_NFPSEL1_LEN 4
202206

203207
struct xgene_cle_ptree_branch {
204208
bool valid;

drivers/net/ethernet/apm/xgene/xgene_enet_hw.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -761,18 +761,18 @@ int xgene_enet_phy_connect(struct net_device *ndev)
761761
if (dev->of_node) {
762762
for (i = 0 ; i < 2; i++) {
763763
np = of_parse_phandle(dev->of_node, "phy-handle", i);
764-
if (np)
765-
break;
766-
}
767764

768-
if (!np) {
769-
netdev_dbg(ndev, "No phy-handle found in DT\n");
770-
return -ENODEV;
765+
if (!np)
766+
continue;
767+
768+
phy_dev = of_phy_connect(ndev, np,
769+
&xgene_enet_adjust_link,
770+
0, pdata->phy_mode);
771+
of_node_put(np);
772+
if (phy_dev)
773+
break;
771774
}
772775

773-
phy_dev = of_phy_connect(ndev, np, &xgene_enet_adjust_link,
774-
0, pdata->phy_mode);
775-
of_node_put(np);
776776
if (!phy_dev) {
777777
netdev_err(ndev, "Could not connect to PHY\n");
778778
return -ENODEV;

drivers/net/ethernet/apm/xgene/xgene_enet_hw.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ enum xgene_enet_rm {
124124
#define MAC_READ_REG_OFFSET 0x0c
125125
#define MAC_COMMAND_DONE_REG_OFFSET 0x10
126126

127+
#define PCS_ADDR_REG_OFFSET 0x00
128+
#define PCS_COMMAND_REG_OFFSET 0x04
129+
#define PCS_WRITE_REG_OFFSET 0x08
130+
#define PCS_READ_REG_OFFSET 0x0c
131+
#define PCS_COMMAND_DONE_REG_OFFSET 0x10
132+
127133
#define MII_MGMT_CONFIG_ADDR 0x20
128134
#define MII_MGMT_COMMAND_ADDR 0x24
129135
#define MII_MGMT_ADDRESS_ADDR 0x28

drivers/net/ethernet/apm/xgene/xgene_enet_main.c

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* along with this program. If not, see <http://www.gnu.org/licenses/>.
2020
*/
2121

22+
#include <linux/gpio.h>
2223
#include "xgene_enet_main.h"
2324
#include "xgene_enet_hw.h"
2425
#include "xgene_enet_sgmac.h"
@@ -72,7 +73,6 @@ static int xgene_enet_refill_bufpool(struct xgene_enet_desc_ring *buf_pool,
7273
skb = netdev_alloc_skb_ip_align(ndev, len);
7374
if (unlikely(!skb))
7475
return -ENOMEM;
75-
buf_pool->rx_skb[tail] = skb;
7676

7777
dma_addr = dma_map_single(dev, skb->data, len, DMA_FROM_DEVICE);
7878
if (dma_mapping_error(dev, dma_addr)) {
@@ -81,6 +81,8 @@ static int xgene_enet_refill_bufpool(struct xgene_enet_desc_ring *buf_pool,
8181
return -EINVAL;
8282
}
8383

84+
buf_pool->rx_skb[tail] = skb;
85+
8486
raw_desc->m1 = cpu_to_le64(SET_VAL(DATAADDR, dma_addr) |
8587
SET_VAL(BUFDATALEN, bufdatalen) |
8688
SET_BIT(COHERENT));
@@ -102,12 +104,21 @@ static u8 xgene_enet_hdr_len(const void *data)
102104

103105
static void xgene_enet_delete_bufpool(struct xgene_enet_desc_ring *buf_pool)
104106
{
107+
struct device *dev = ndev_to_dev(buf_pool->ndev);
108+
struct xgene_enet_raw_desc16 *raw_desc;
109+
dma_addr_t dma_addr;
105110
int i;
106111

107112
/* Free up the buffers held by hardware */
108113
for (i = 0; i < buf_pool->slots; i++) {
109-
if (buf_pool->rx_skb[i])
114+
if (buf_pool->rx_skb[i]) {
110115
dev_kfree_skb_any(buf_pool->rx_skb[i]);
116+
117+
raw_desc = &buf_pool->raw_desc16[i];
118+
dma_addr = GET_VAL(DATAADDR, le64_to_cpu(raw_desc->m1));
119+
dma_unmap_single(dev, dma_addr, XGENE_ENET_MAX_MTU,
120+
DMA_FROM_DEVICE);
121+
}
111122
}
112123
}
113124

@@ -452,7 +463,6 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring,
452463
struct xgene_enet_raw_desc *raw_desc)
453464
{
454465
struct net_device *ndev;
455-
struct xgene_enet_pdata *pdata;
456466
struct device *dev;
457467
struct xgene_enet_desc_ring *buf_pool;
458468
u32 datalen, skb_index;
@@ -461,7 +471,6 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring,
461471
int ret = 0;
462472

463473
ndev = rx_ring->ndev;
464-
pdata = netdev_priv(ndev);
465474
dev = ndev_to_dev(rx_ring->ndev);
466475
buf_pool = rx_ring->buf_pool;
467476

@@ -1312,6 +1321,18 @@ static int xgene_enet_check_phy_handle(struct xgene_enet_pdata *pdata)
13121321
return 0;
13131322
}
13141323

1324+
static void xgene_enet_gpiod_get(struct xgene_enet_pdata *pdata)
1325+
{
1326+
struct device *dev = &pdata->pdev->dev;
1327+
1328+
if (pdata->phy_mode != PHY_INTERFACE_MODE_XGMII)
1329+
return;
1330+
1331+
pdata->sfp_rdy = gpiod_get(dev, "rxlos", GPIOD_IN);
1332+
if (IS_ERR(pdata->sfp_rdy))
1333+
pdata->sfp_rdy = gpiod_get(dev, "sfp", GPIOD_IN);
1334+
}
1335+
13151336
static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
13161337
{
13171338
struct platform_device *pdev;
@@ -1401,6 +1422,8 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
14011422
if (ret)
14021423
return ret;
14031424

1425+
xgene_enet_gpiod_get(pdata);
1426+
14041427
pdata->clk = devm_clk_get(&pdev->dev, NULL);
14051428
if (IS_ERR(pdata->clk)) {
14061429
/* Firmware may have set up the clock already. */
@@ -1425,6 +1448,7 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
14251448
} else {
14261449
pdata->mcx_mac_addr = base_addr + BLOCK_AXG_MAC_OFFSET;
14271450
pdata->mcx_mac_csr_addr = base_addr + BLOCK_AXG_MAC_CSR_OFFSET;
1451+
pdata->pcs_addr = base_addr + BLOCK_PCS_OFFSET;
14281452
}
14291453
pdata->rx_buff_cnt = NUM_PKT_BUF;
14301454

@@ -1454,10 +1478,8 @@ static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
14541478
buf_pool = pdata->rx_ring[i]->buf_pool;
14551479
xgene_enet_init_bufpool(buf_pool);
14561480
ret = xgene_enet_refill_bufpool(buf_pool, pdata->rx_buff_cnt);
1457-
if (ret) {
1458-
xgene_enet_delete_desc_rings(pdata);
1459-
return ret;
1460-
}
1481+
if (ret)
1482+
goto err;
14611483
}
14621484

14631485
dst_ring_num = xgene_enet_dst_ring_num(pdata->rx_ring[0]);
@@ -1474,7 +1496,7 @@ static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
14741496
ret = pdata->cle_ops->cle_init(pdata);
14751497
if (ret) {
14761498
netdev_err(ndev, "Preclass Tree init error\n");
1477-
return ret;
1499+
goto err;
14781500
}
14791501
} else {
14801502
pdata->port_ops->cle_bypass(pdata, dst_ring_num, buf_pool->id);
@@ -1484,6 +1506,10 @@ static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
14841506
pdata->mac_ops->init(pdata);
14851507

14861508
return ret;
1509+
1510+
err:
1511+
xgene_enet_delete_desc_rings(pdata);
1512+
return ret;
14871513
}
14881514

14891515
static void xgene_enet_setup_ops(struct xgene_enet_pdata *pdata)
@@ -1631,8 +1657,8 @@ static int xgene_enet_probe(struct platform_device *pdev)
16311657
}
16321658
#endif
16331659
if (!pdata->enet_id) {
1634-
free_netdev(ndev);
1635-
return -ENODEV;
1660+
ret = -ENODEV;
1661+
goto err;
16361662
}
16371663

16381664
ret = xgene_enet_get_resources(pdata);
@@ -1655,7 +1681,7 @@ static int xgene_enet_probe(struct platform_device *pdev)
16551681

16561682
ret = xgene_enet_init_hw(pdata);
16571683
if (ret)
1658-
goto err_netdev;
1684+
goto err;
16591685

16601686
link_state = pdata->mac_ops->link_state;
16611687
if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) {
@@ -1665,21 +1691,32 @@ static int xgene_enet_probe(struct platform_device *pdev)
16651691
ret = xgene_enet_mdio_config(pdata);
16661692
else
16671693
INIT_DELAYED_WORK(&pdata->link_work, link_state);
1694+
1695+
if (ret)
1696+
goto err1;
16681697
}
1669-
if (ret)
1670-
goto err;
16711698

16721699
xgene_enet_napi_add(pdata);
16731700
ret = register_netdev(ndev);
16741701
if (ret) {
16751702
netdev_err(ndev, "Failed to register netdev\n");
1676-
goto err;
1703+
goto err2;
16771704
}
16781705

16791706
return 0;
16801707

1681-
err_netdev:
1682-
unregister_netdev(ndev);
1708+
err2:
1709+
/*
1710+
* If necessary, free_netdev() will call netif_napi_del() and undo
1711+
* the effects of xgene_enet_napi_add()'s calls to netif_napi_add().
1712+
*/
1713+
1714+
if (pdata->mdio_driver)
1715+
xgene_enet_phy_disconnect(pdata);
1716+
else if (pdata->phy_mode == PHY_INTERFACE_MODE_RGMII)
1717+
xgene_enet_mdio_remove(pdata);
1718+
err1:
1719+
xgene_enet_delete_desc_rings(pdata);
16831720
err:
16841721
free_netdev(ndev);
16851722
return ret;
@@ -1688,11 +1725,9 @@ static int xgene_enet_probe(struct platform_device *pdev)
16881725
static int xgene_enet_remove(struct platform_device *pdev)
16891726
{
16901727
struct xgene_enet_pdata *pdata;
1691-
const struct xgene_mac_ops *mac_ops;
16921728
struct net_device *ndev;
16931729

16941730
pdata = platform_get_drvdata(pdev);
1695-
mac_ops = pdata->mac_ops;
16961731
ndev = pdata->ndev;
16971732

16981733
rtnl_lock();

drivers/net/ethernet/apm/xgene/xgene_enet_main.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ struct xgene_enet_pdata {
196196
void __iomem *mcx_mac_addr;
197197
void __iomem *mcx_mac_csr_addr;
198198
void __iomem *base_addr;
199+
void __iomem *pcs_addr;
199200
void __iomem *ring_csr_addr;
200201
void __iomem *ring_cmd_addr;
201202
int phy_mode;
@@ -216,6 +217,7 @@ struct xgene_enet_pdata {
216217
u8 tx_delay;
217218
u8 rx_delay;
218219
bool mdio_driver;
220+
struct gpio_desc *sfp_rdy;
219221
};
220222

221223
struct xgene_indirect_ctl {

0 commit comments

Comments
 (0)