From e1ab1fcace1fb828b007bafca84a70185cb2dd72 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sat, 22 Dec 2012 12:12:35 +0000 Subject: generic: ar8216: rename cpuport_cfg to port0_cfg in ar8327_platform_data Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34846 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 9cbe3a838..f20cc281b 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1084,7 +1084,7 @@ ar8327_init_cpuport(struct ar8216_priv *priv) if (!pdata) return; - cfg = &pdata->cpuport_cfg; + cfg = &pdata->port0_cfg; if (!cfg->force_link) { priv->write(priv, AR8327_REG_PORT_STATUS(AR8216_PORT_CPU), AR8216_PORT_STATUS_LINK_AUTO); -- cgit v1.2.3 From 565673cb046dbdc776fdfd34ab06884d6b3e4428 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sat, 22 Dec 2012 12:12:37 +0000 Subject: generic: ar8316: allow to configure port 6 via platform data on AR8327 Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34847 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index f20cc281b..e47a7da28 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1074,19 +1074,13 @@ ar8327_init_globals(struct ar8216_priv *priv) } static void -ar8327_init_cpuport(struct ar8216_priv *priv) +ar8327_config_port(struct ar8216_priv *priv, unsigned int port, + struct ar8327_port_cfg *cfg) { - struct ar8327_platform_data *pdata; - struct ar8327_port_cfg *cfg; u32 t; - pdata = priv->phy->dev.platform_data; - if (!pdata) - return; - - cfg = &pdata->port0_cfg; - if (!cfg->force_link) { - priv->write(priv, AR8327_REG_PORT_STATUS(AR8216_PORT_CPU), + if (!cfg || !cfg->force_link) { + priv->write(priv, AR8327_REG_PORT_STATUS(port), AR8216_PORT_STATUS_LINK_AUTO); return; } @@ -1095,6 +1089,7 @@ ar8327_init_cpuport(struct ar8216_priv *priv) t |= cfg->duplex ? AR8216_PORT_STATUS_DUPLEX : 0; t |= cfg->rxpause ? AR8216_PORT_STATUS_RXFLOW : 0; t |= cfg->txpause ? AR8216_PORT_STATUS_TXFLOW : 0; + switch (cfg->speed) { case AR8327_PORT_SPEED_10: t |= AR8216_PORT_SPEED_10M; @@ -1107,21 +1102,27 @@ ar8327_init_cpuport(struct ar8216_priv *priv) break; } - priv->write(priv, AR8327_REG_PORT_STATUS(AR8216_PORT_CPU), t); + priv->write(priv, AR8327_REG_PORT_STATUS(port), t); } static void ar8327_init_port(struct ar8216_priv *priv, int port) { + struct ar8327_platform_data *pdata; + struct ar8327_port_cfg *cfg; u32 t; - if (port == AR8216_PORT_CPU) { - ar8327_init_cpuport(priv); - } else { - t = AR8216_PORT_STATUS_LINK_AUTO; - priv->write(priv, AR8327_REG_PORT_STATUS(port), t); - } + pdata = priv->phy->dev.platform_data; + + if (pdata && port == AR8216_PORT_CPU) + cfg = &pdata->port0_cfg; + else if (pdata && port == 6) + cfg = &pdata->port6_cfg; + else + cfg = NULL; + ar8327_config_port(priv, port, cfg); + priv->write(priv, AR8327_REG_PORT_HEADER(port), 0); priv->write(priv, AR8327_REG_PORT_VLAN0(port), 0); -- cgit v1.2.3 From 7eb00109f869a7aa0290aee30f9cd33e5d471dae Mon Sep 17 00:00:00 2001 From: juhosg Date: Sat, 22 Dec 2012 18:30:04 +0000 Subject: generic: ar8216: don't use 0 as default VID on AR8327 VID0 is reserved for priority-tagged packets. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34862 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index e47a7da28..8dcaf0a48 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1125,7 +1125,9 @@ ar8327_init_port(struct ar8216_priv *priv, int port) priv->write(priv, AR8327_REG_PORT_HEADER(port), 0); - priv->write(priv, AR8327_REG_PORT_VLAN0(port), 0); + t = 1 << AR8327_PORT_VLAN0_DEF_SVID_S; + t |= 1 << AR8327_PORT_VLAN0_DEF_CVID_S; + priv->write(priv, AR8327_REG_PORT_VLAN0(port), t); t = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH << AR8327_PORT_VLAN1_OUT_MODE_S; priv->write(priv, AR8327_REG_PORT_VLAN1(port), t); -- cgit v1.2.3 From a735287d68606c95d42bceb571d83c40f6de458b Mon Sep 17 00:00:00 2001 From: juhosg Date: Tue, 25 Dec 2012 18:45:31 +0000 Subject: generic: ar8216: add sgmii_delay_en field to ar8327_platform_data Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34881 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 8dcaf0a48..b274b1366 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -917,6 +917,9 @@ ar8327_get_pad_cfg(struct ar8327_pad_cfg *cfg) if (cfg->txclk_delay_en) t |= AR8327_PAD_RGMII_TXCLK_DELAY_EN; + if (cfg->sgmii_delay_en) + t |= AR8327_PAD_SGMII_DELAY_EN; + break; case AR8327_PAD_MAC2PHY_MII: -- cgit v1.2.3 From 6dc5aa068a75932d19b579487f0d52b441dc3f76 Mon Sep 17 00:00:00 2001 From: juhosg Date: Tue, 5 Feb 2013 08:39:24 +0000 Subject: generic: ar8216: unregister switch on error path Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35496 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index b274b1366..3a0483ddb 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1125,7 +1125,7 @@ ar8327_init_port(struct ar8216_priv *priv, int port) cfg = NULL; ar8327_config_port(priv, port, cfg); - + priv->write(priv, AR8327_REG_PORT_HEADER(port), 0); t = 1 << AR8327_PORT_VLAN0_DEF_SVID_S; @@ -1864,7 +1864,7 @@ ar8216_config_init(struct phy_device *pdev) if (ret) goto err_free_priv; - ret = register_switch(&priv->dev, pdev->attached_dev); + ret = register_switch(swdev, pdev->attached_dev); if (ret) goto err_cleanup_mib; @@ -1875,11 +1875,11 @@ ar8216_config_init(struct phy_device *pdev) ret = priv->chip->hw_init(priv); if (ret) - goto err_cleanup_mib; + goto err_unregister_switch; ret = ar8216_sw_reset_switch(&priv->dev); if (ret) - goto err_cleanup_mib; + goto err_unregister_switch; dev->phy_ptr = priv; @@ -1896,6 +1896,8 @@ ar8216_config_init(struct phy_device *pdev) return 0; +err_unregister_switch: + unregister_switch(&priv->dev); err_cleanup_mib: ar8xxx_mib_cleanup(priv); err_free_priv: -- cgit v1.2.3 From 9b6fd35e8ddba1321d8ca7d4cb274ead92a415cf Mon Sep 17 00:00:00 2001 From: juhosg Date: Tue, 5 Feb 2013 08:39:26 +0000 Subject: generic: ar8216: clear driver specific data pointer in phy_device This is needed to avoid a NULL pointer dereference: [ 19.525270] Unable to handle kernel paging request for data at address 0x00000018 [ 19.532750] Faulting instruction address: 0xc016e104 [ 19.537714] Oops: Kernel access of bad area, sig: 11 [#1] [ 19.543102] P1010 RDB [ 19.545365] Modules linked in: booke_wdt nf_nat_irc nf_nat_ftp nf_conntrack_irc nf_conntrack_ftp ipt_MASQUERADE iptable_nat xt_nat d [ 19.590725] NIP: c016e104 LR: c0171490 CTR: 00000000 [ 19.595681] REGS: c4bc3c10 TRAP: 0300 Tainted: G W O (3.7.6) [ 19.602284] MSR: 00029000 CR: 82002022 XER: 20000000 [ 19.608381] DEAR: 00000018, ESR: 00000000 [ 19.612382] TASK = c4cd9c80[2070] 'ifconfig' THREAD: c4bc2000 GPR00: 00000001 c4bc3cc0 c4cd9c80 00000000 c7811000 00000000 00000000 0000e8ec GPR08: 0000e8eb 00000000 00029000 00000001 00000000 100801f8 1005c51c 1005c514 GPR16: 1005c468 1005c54c 1005c258 1005c530 10060000 00000000 c7811000 ffff8914 GPR24: c7815030 c793e400 10063adb 00000000 c7811000 c045594c c78ca600 c7815000 [ 19.646352] NIP [c016e104] register_switch+0x98/0x2d0 [ 19.651397] LR [c0171490] ar8216_config_init+0x2d8/0x3f4 [ 19.656697] Call Trace: [ 19.659138] [c4bc3cc0] [c0170490] ar8216_mii_read+0x64/0xc4 (unreliable) [ 19.665835] [c4bc3d00] [c0171490] ar8216_config_init+0x2d8/0x3f4 [ 19.671835] [c4bc3d20] [c016cf8c] phy_init_hw+0x50/0x6c [ 19.677053] [c4bc3d30] [c016d078] phy_attach_direct+0xd0/0xf8 [ 19.682793] [c4bc3d50] [c016d154] phy_connect_direct+0x24/0x68 [ 19.688621] [c4bc3d70] [c0183b70] of_phy_connect+0x48/0x6c [ 19.694102] [c4bc3d90] [c0175aac] gfar_enet_open+0x254/0x3d8 [ 19.699755] [c4bc3db0] [c019acc4] __dev_open+0xc0/0x120 [ 19.704975] [c4bc3dd0] [c019af98] __dev_change_flags+0xd4/0x15c [ 19.710888] [c4bc3df0] [c019b0d4] dev_change_flags+0x1c/0x60 [ 19.716544] [c4bc3e10] [c01ebb94] devinet_ioctl+0x290/0x690 [ 19.722111] [c4bc3e70] [c01ec8d4] inet_ioctl+0x88/0xbc [ 19.727245] [c4bc3e80] [c0186b98] sock_ioctl+0x258/0x294 [ 19.732551] [c4bc3ea0] [c009c00c] do_vfs_ioctl+0x6a4/0x728 [ 19.738031] [c4bc3f10] [c009c0d4] sys_ioctl+0x44/0x70 [ 19.743077] [c4bc3f40] [c000c74c] ret_from_syscall+0x0/0x3c [ 19.748646] --- Exception: c01 at 0x48091b34 [ 19.748646] LR = 0x480e4b64 [ 19.756033] Instruction dump: [ 19.758991] 2f830000 907f0050 3860fff4 419e021c 837f0000 38000000 901f0038 901f0040 [ 19.766744] 901f003c 7f600034 5400d97e 0f000000 <801b0018> 2f800000 40be0010 801b001c Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35497 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 3a0483ddb..cf28af0c7 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1902,6 +1902,7 @@ err_cleanup_mib: ar8xxx_mib_cleanup(priv); err_free_priv: kfree(priv); + pdev->priv = NULL; return ret; } @@ -1983,6 +1984,8 @@ ar8216_remove(struct phy_device *pdev) if (!priv) return; + pdev->priv = NULL; + dev->priv_flags &= ~IFF_NO_IP_ALIGN; dev->eth_mangle_rx = NULL; dev->eth_mangle_tx = NULL; -- cgit v1.2.3 From 4a7ecbb10cd0559f540111e91c15710d767e2321 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 7 Feb 2013 15:18:32 +0000 Subject: generic: ar8216: add detach callback The current code uses the 'remove' callback to disable packet mangle on the underlying ethernet device. However the attached_dev is always NULL when the 'remove' callback is called by phylib, and this causes NULL pointer dereference, like this: [ 475.300000] CPU 0 Unable to handle kernel paging request at virtual address 000000f0, epc == 801cdcf0, ra == 801c7eac [ 475.310000] Oops[#1]: [ 475.310000] Cpu 0 [ 475.310000] $ 0 : 00000000 00000000 00000000 00000001 [ 475.310000] $ 4 : 828dde00 00000005 828dde08 ffffffff [ 475.310000] $ 8 : 00380081 00380081 82902a40 00000001 [ 475.310000] $12 : 00000037 00370081 00000001 00000000 [ 475.310000] $16 : 82865000 828dde08 828dde00 00000001 [ 475.310000] $20 : 00000080 00460000 00000002 77151448 [ 475.310000] $24 : 00000000 801abfd4 [ 475.310000] $28 : 82cc2000 82cc3d58 0053c3c4 801c7eac [ 475.310000] Hi : 00000007 [ 475.310000] Lo : 00000004 [ 475.310000] epc : 801cdcf0 ar8216_remove+0x1c/0x94 [ 475.310000] Tainted: G O [ 475.310000] ra : 801c7eac phy_remove+0x4c/0x6c [ 475.310000] Status: 1000cc03 KERNEL EXL IE [ 475.310000] Cause : 00800008 [ 475.310000] BadVA : 000000f0 [ 475.310000] PrId : 00019750 (MIPS 74Kc) [ 475.310000] Modules linked in: ath79_wdt ledtrig_usbdev ledtrig_netdev ag71xx(-) nf_nat_irc nf_nat_ftp nf_conntrack_irc nf_conntrack_ft p ipt_MASQUERADE iptable_nat xt_nat nf_nat_ipv4 nf_nat pppoext_conntrack xt_CT iptable_raw xt_state nf_conntrack_ipv4 nf_defrag_ipv4 nf_co nntrack ehci_hcd pppox ipt_REJECT xt_TCPMSS xt_LOG xt_comment xt_multiport xt_mac xt_limit iptable_mangle iptable_filter ip_tables xt_tcpu dp x_tables ppp_async ppp_generic slhc ath9k(O) ath9k_common(O) ath9k_hw(O) ath(O) mac80211(O) usbcore usb_common nls_base crc_ccitt cfg80 211(O) compat(O) arc4 crypto_blkcipher aead ledtrig_timer ledtrig_default_on leds_gpio gpio_button_hotplug(O) [ 475.310000] Process rmmod (pid: 1160, threadinfo=82cc2000, task=83969920, tls=7747c440) [ 475.310000] Stack : 828dde08 802f5004 802f4680 00000001 828ddf70 801c7eac 802f4680 801ad6d8 82902940 00000000 828dde08 802f5004 802f4680 801ad770 00000002 80269d94 00000000 00000001 00000080 828dde08 828dde3c 801ad7fc 82902940 00000000 83859100 00000000 8384dd2c 8384dd2c 828dde08 801ad230 82902800 00000000 00000000 001a0041 828dde08 828dde08 802e80e8 801aac44 00000080 00460000 ... [ 475.310000] Call Trace: [ 475.310000] [<801cdcf0>] ar8216_remove+0x1c/0x94 [ 475.310000] [<801c7eac>] phy_remove+0x4c/0x6c [ 475.310000] [<801ad770>] __device_release_driver+0x6c/0xd0 [ 475.310000] [<801ad7fc>] device_release_driver+0x28/0x40 [ 475.310000] [<801ad230>] bus_remove_device+0xd8/0x10c [ 475.310000] [<801aac44>] device_del+0x110/0x170 [ 475.310000] [<801aacb8>] device_unregister+0x14/0x28 [ 475.310000] [<801c92b0>] mdiobus_unregister+0x4c/0x70 [ 475.310000] [<82913060>] ag71xx_remove_ar8216_header+0xdc/0x5a8 [ag71xx] [ 475.310000] [ 475.310000] Code: 1200001c 8c82017c ac800128 <8c4500f0> 3c03ffdf 3463ffff 00a31824 ac4300f0 ac4000e0 Add a detach callback and disable packet mangling in that to fix the problem. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35511 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index cf28af0c7..a27d65018 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1976,19 +1976,28 @@ ar8216_probe(struct phy_device *pdev) } static void -ar8216_remove(struct phy_device *pdev) +ar8216_detach(struct phy_device *pdev) { - struct ar8216_priv *priv = pdev->priv; struct net_device *dev = pdev->attached_dev; - if (!priv) + if (!dev) return; - pdev->priv = NULL; - + dev->phy_ptr = NULL; dev->priv_flags &= ~IFF_NO_IP_ALIGN; dev->eth_mangle_rx = NULL; dev->eth_mangle_tx = NULL; +} + +static void +ar8216_remove(struct phy_device *pdev) +{ + struct ar8216_priv *priv = pdev->priv; + + if (!priv) + return; + + pdev->priv = NULL; if (pdev->addr == 0) unregister_switch(&priv->dev); @@ -2004,6 +2013,7 @@ static struct phy_driver ar8216_driver = { .features = PHY_BASIC_FEATURES, .probe = ar8216_probe, .remove = ar8216_remove, + .detach = ar8216_detach, .config_init = &ar8216_config_init, .config_aneg = &ar8216_config_aneg, .read_status = &ar8216_read_status, -- cgit v1.2.3 From 8e2d25ac7a64e1fbd8e250ddee594284652f38cb Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 7 Feb 2013 15:18:35 +0000 Subject: generic: ar8216: add mii_bus field to struct ar8216_priv Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35513 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index a27d65018..fdf5d6809 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -79,6 +79,7 @@ struct ar8xxx_chip { struct ar8216_priv { struct switch_dev dev; + struct mii_bus *mii_bus; struct phy_device *phy; u32 (*read)(struct ar8216_priv *priv, int reg); void (*write)(struct ar8216_priv *priv, int reg, u32 val); @@ -245,8 +246,7 @@ split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) static u32 ar8216_mii_read(struct ar8216_priv *priv, int reg) { - struct phy_device *phy = priv->phy; - struct mii_bus *bus = phy->bus; + struct mii_bus *bus = priv->mii_bus; u16 r1, r2, page; u16 lo, hi; @@ -267,8 +267,7 @@ ar8216_mii_read(struct ar8216_priv *priv, int reg) static void ar8216_mii_write(struct ar8216_priv *priv, int reg, u32 val) { - struct phy_device *phy = priv->phy; - struct mii_bus *bus = phy->bus; + struct mii_bus *bus = priv->mii_bus; u16 r1, r2, r3; u16 lo, hi; @@ -295,7 +294,7 @@ static void ar8216_phy_dbg_write(struct ar8216_priv *priv, int phy_addr, u16 dbg_addr, u16 dbg_data) { - struct mii_bus *bus = priv->phy->bus; + struct mii_bus *bus = priv->mii_bus; mutex_lock(&bus->mdio_lock); bus->write(bus, phy_addr, MII_ATH_DBG_ADDR, dbg_addr); @@ -306,7 +305,7 @@ ar8216_phy_dbg_write(struct ar8216_priv *priv, int phy_addr, static void ar8216_phy_mmd_write(struct ar8216_priv *priv, int phy_addr, u16 addr, u16 data) { - struct mii_bus *bus = priv->phy->bus; + struct mii_bus *bus = priv->mii_bus; mutex_lock(&bus->mdio_lock); bus->write(bus, phy_addr, MII_ATH_MMD_ADDR, addr); @@ -737,7 +736,7 @@ ar8236_hw_init(struct ar8216_priv *priv) return 0; /* Initialize the PHYs */ - bus = priv->phy->bus; + bus = priv->mii_bus; for (i = 0; i < 5; i++) { mdiobus_write(bus, i, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_PAUSE_CAP | @@ -812,7 +811,7 @@ ar8316_hw_init(struct ar8216_priv *priv) priv->write(priv, 0x8, newval); /* Initialize the ports */ - bus = priv->phy->bus; + bus = priv->mii_bus; for (i = 0; i < 5; i++) { if ((i == 4) && priv->port4_phy && priv->phy->interface == PHY_INTERFACE_MODE_RGMII) { @@ -1034,7 +1033,7 @@ ar8327_hw_init(struct ar8216_priv *priv) priv->write(priv, AR8327_REG_POWER_ON_STRIP, new_pos); } - bus = priv->phy->bus; + bus = priv->mii_bus; for (i = 0; i < AR8327_NUM_PHYS; i++) { ar8327_phy_fixup(priv, i); @@ -1688,8 +1687,8 @@ ar8216_id_chip(struct ar8216_priv *priv) printk(KERN_DEBUG "ar8216: Unknown Atheros device [ver=%d, rev=%d, phy_id=%04x%04x]\n", priv->chip_ver, priv->chip_rev, - mdiobus_read(priv->phy->bus, priv->phy->addr, 2), - mdiobus_read(priv->phy->bus, priv->phy->addr, 3)); + mdiobus_read(priv->mii_bus, priv->phy->addr, 2), + mdiobus_read(priv->mii_bus, priv->phy->addr, 3)); return -ENODEV; } @@ -1780,6 +1779,7 @@ ar8216_config_init(struct phy_device *pdev) return -ENOMEM; } + priv->mii_bus = pdev->bus; priv->phy = pdev; ret = ar8216_id_chip(priv); @@ -1967,6 +1967,7 @@ ar8216_probe(struct phy_device *pdev) if (priv == NULL) return -ENOMEM; + priv->mii_bus = pdev->bus; priv->phy = pdev; ret = ar8216_id_chip(priv); -- cgit v1.2.3 From e2cef5cb8fda4e4f7f9d7ff6543ee601c8055df8 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 7 Feb 2013 15:18:36 +0000 Subject: generic: ar8216: use inline function to convert swdev to ar8216 Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35514 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 34 ++++++++++++---------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index fdf5d6809..c02803b5e 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -198,7 +198,11 @@ static const struct ar8xxx_mib_desc ar8236_mibs[] = { MIB_DESC(1, AR8236_STATS_TXLATECOL, "TxLateCol"), }; -#define to_ar8216(_dev) container_of(_dev, struct ar8216_priv, dev) +static inline struct ar8216_priv * +swdev_to_ar8216(struct switch_dev *swdev) +{ + return container_of(swdev, struct ar8216_priv, dev); +} static inline bool ar8xxx_has_gige(struct ar8216_priv *priv) { @@ -1259,7 +1263,7 @@ static int ar8216_sw_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); priv->vlan = !!val->value.i; return 0; } @@ -1268,7 +1272,7 @@ static int ar8216_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); val->value.i = priv->vlan; return 0; } @@ -1277,7 +1281,7 @@ ar8216_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, static int ar8216_sw_set_pvid(struct switch_dev *dev, int port, int vlan) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); /* make sure no invalid PVIDs get set */ @@ -1291,7 +1295,7 @@ ar8216_sw_set_pvid(struct switch_dev *dev, int port, int vlan) static int ar8216_sw_get_pvid(struct switch_dev *dev, int port, int *vlan) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); *vlan = priv->pvid[port]; return 0; } @@ -1300,7 +1304,7 @@ static int ar8216_sw_set_vid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); priv->vlan_id[val->port_vlan] = val->value.i; return 0; } @@ -1309,7 +1313,7 @@ static int ar8216_sw_get_vid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); val->value.i = priv->vlan_id[val->port_vlan]; return 0; } @@ -1318,7 +1322,7 @@ static int ar8216_sw_get_port_link(struct switch_dev *dev, int port, struct switch_port_link *link) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); ar8216_read_port_link(priv, port, link); return 0; @@ -1327,7 +1331,7 @@ ar8216_sw_get_port_link(struct switch_dev *dev, int port, static int ar8216_sw_get_ports(struct switch_dev *dev, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); u8 ports = priv->vlan_table[val->port_vlan]; int i; @@ -1351,7 +1355,7 @@ ar8216_sw_get_ports(struct switch_dev *dev, struct switch_val *val) static int ar8216_sw_set_ports(struct switch_dev *dev, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); u8 *vt = &priv->vlan_table[val->port_vlan]; int i, j; @@ -1382,7 +1386,7 @@ ar8216_sw_set_ports(struct switch_dev *dev, struct switch_val *val) static int ar8216_sw_hw_apply(struct switch_dev *dev) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); u8 portmask[AR8X16_MAX_PORTS]; int i, j; @@ -1449,7 +1453,7 @@ ar8216_sw_hw_apply(struct switch_dev *dev) static int ar8216_sw_reset_switch(struct switch_dev *dev) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); int i; mutex_lock(&priv->reg_mutex); @@ -1474,7 +1478,7 @@ ar8216_sw_set_reset_mibs(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); unsigned int len; int ret; @@ -1502,7 +1506,7 @@ ar8216_sw_set_port_reset_mib(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); int port; int ret; @@ -1532,7 +1536,7 @@ ar8216_sw_get_port_mib(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = to_ar8216(dev); + struct ar8216_priv *priv = swdev_to_ar8216(dev); const struct ar8xxx_chip *chip = priv->chip; u64 *mib_stats; int port; -- cgit v1.2.3 From 2550d8c15548661cb7a96384d12b8b1a9bd55e28 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 8 Feb 2013 09:13:14 +0000 Subject: generic: ar8216: don't use mdio bus specific functions in ar8216_id_chip Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35517 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index c02803b5e..d980e24ee 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1653,7 +1653,7 @@ ar8216_id_chip(struct ar8216_priv *priv) u16 id; int i; - val = ar8216_mii_read(priv, AR8216_REG_CTRL); + val = priv->read(priv, AR8216_REG_CTRL); if (val == ~0) return -ENODEV; @@ -1661,7 +1661,7 @@ ar8216_id_chip(struct ar8216_priv *priv) for (i = 0; i < AR8X16_PROBE_RETRIES; i++) { u16 t; - val = ar8216_mii_read(priv, AR8216_REG_CTRL); + val = priv->read(priv, AR8216_REG_CTRL); if (val == ~0) return -ENODEV; @@ -1689,10 +1689,8 @@ ar8216_id_chip(struct ar8216_priv *priv) break; default: printk(KERN_DEBUG - "ar8216: Unknown Atheros device [ver=%d, rev=%d, phy_id=%04x%04x]\n", - priv->chip_ver, priv->chip_rev, - mdiobus_read(priv->mii_bus, priv->phy->addr, 2), - mdiobus_read(priv->mii_bus, priv->phy->addr, 3)); + "ar8216: Unknown Atheros device [ver=%d, rev=%d]\n", + priv->chip_ver, priv->chip_rev); return -ENODEV; } @@ -1784,6 +1782,9 @@ ar8216_config_init(struct phy_device *pdev) } priv->mii_bus = pdev->bus; + priv->read = ar8216_mii_read; + priv->write = ar8216_mii_write; + priv->phy = pdev; ret = ar8216_id_chip(priv); @@ -1833,8 +1834,6 @@ ar8216_config_init(struct phy_device *pdev) pdev->advertising = pdev->supported; mutex_init(&priv->reg_mutex); - priv->read = ar8216_mii_read; - priv->write = ar8216_mii_write; pdev->priv = priv; @@ -1972,6 +1971,8 @@ ar8216_probe(struct phy_device *pdev) return -ENOMEM; priv->mii_bus = pdev->bus; + priv->read = ar8216_mii_read; + priv->write = ar8216_mii_write; priv->phy = pdev; ret = ar8216_id_chip(priv); -- cgit v1.2.3 From b67cc3a0cdd02973610d4d5a63226d1c44841e94 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 8 Feb 2013 09:13:18 +0000 Subject: generic: ar8216: simplify phy features setup Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35518 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index d980e24ee..e6a460734 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1791,12 +1791,13 @@ ar8216_config_init(struct phy_device *pdev) if (ret) goto err_free_priv; - if (pdev->addr != 0) { - if (ar8xxx_has_gige(priv)) { - pdev->supported |= SUPPORTED_1000baseT_Full; - pdev->advertising |= ADVERTISED_1000baseT_Full; - } + if (ar8xxx_has_gige(priv)) + pdev->supported = SUPPORTED_1000baseT_Full; + else + pdev->supported = SUPPORTED_100baseT_Full; + pdev->advertising = pdev->supported; + if (pdev->addr != 0) { if (chip_is_ar8316(priv)) { /* check if we're attaching to the switch twice */ pdev = pdev->bus->phy_map[0]; @@ -1827,12 +1828,6 @@ ar8216_config_init(struct phy_device *pdev) return 0; } - if (ar8xxx_has_gige(priv)) - pdev->supported = SUPPORTED_1000baseT_Full; - else - pdev->supported = SUPPORTED_100baseT_Full; - pdev->advertising = pdev->supported; - mutex_init(&priv->reg_mutex); pdev->priv = priv; -- cgit v1.2.3 From 7685a5601ecfa292854c1c67c0afd9138bfc3ab3 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sat, 9 Feb 2013 13:26:04 +0000 Subject: generic: ar8216: move sleep out of the loop It is enough to sleep once after ANEG is enabled on all PHYs. This reduces boot time on boards with AR8316 switch. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35532 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index e6a460734..4547f7c3b 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -833,9 +833,10 @@ ar8316_hw_init(struct ar8216_priv *priv) ADVERTISE_ALL | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM); mdiobus_write(bus, i, MII_CTRL1000, ADVERTISE_1000FULL); mdiobus_write(bus, i, MII_BMCR, BMCR_RESET | BMCR_ANENABLE); - msleep(1000); } + msleep(1000); + out: priv->initialized = true; return 0; -- cgit v1.2.3 From 8fed7b76c73b7593009fdc9cf57cb0c0d4df53a2 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 13:05:12 +0000 Subject: generic: ar8216: skip probe on unused PHY addresses Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35536 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 4547f7c3b..45b2bd7a6 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1962,6 +1962,10 @@ ar8216_probe(struct phy_device *pdev) struct ar8216_priv *priv; int ret; + /* skip PHYs at unused adresses */ + if (pdev->addr != 0 && pdev->addr != 4) + return -ENODEV; + priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL); if (priv == NULL) return -ENOMEM; -- cgit v1.2.3 From a1483517cd0daff3e27624ce227840562ee89ab6 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 13:05:14 +0000 Subject: generic: ar8216: add sanity check to ar8216_probe Verify that the mdio bus has PHY devices with a supported PHY ID at address 0-4. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35537 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 45b2bd7a6..f356eafe5 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1956,6 +1956,44 @@ ar8216_config_aneg(struct phy_device *phydev) return genphy_config_aneg(phydev); } +static const u32 ar8xxx_phy_ids[] = { + 0x004dd033, + 0x004dd041, + 0x004dd042, +}; + +static bool +ar8xxx_phy_match(u32 phy_id) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(ar8xxx_phy_ids); i++) + if (phy_id == ar8xxx_phy_ids[i]) + return true; + + return false; +} + +static bool +ar8xxx_is_possible(struct mii_bus *bus) +{ + unsigned i; + + for (i = 0; i < 4; i++) { + u32 phy_id; + + phy_id = mdiobus_read(bus, i, MII_PHYSID1) << 16; + phy_id |= mdiobus_read(bus, i, MII_PHYSID2); + if (!ar8xxx_phy_match(phy_id)) { + pr_debug("ar8xxx: unknown PHY at %s:%02x id:%08x\n", + dev_name(&bus->dev), i, phy_id); + return false; + } + } + + return true; +} + static int ar8216_probe(struct phy_device *pdev) { @@ -1966,6 +2004,9 @@ ar8216_probe(struct phy_device *pdev) if (pdev->addr != 0 && pdev->addr != 4) return -ENODEV; + if (!ar8xxx_is_possible(pdev->bus)) + return -ENODEV; + priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL); if (priv == NULL) return -ENOMEM; -- cgit v1.2.3 From 03715e59dbcfa4249552f291f2e64557b7ccc0ce Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 13:05:15 +0000 Subject: generic: ar8216: don't probe the chip multiple times It is only needed when the private data is allocated. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35538 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index f356eafe5..ec6d23266 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1780,17 +1780,17 @@ ar8216_config_init(struct phy_device *pdev) priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL); if (priv == NULL) return -ENOMEM; - } - priv->mii_bus = pdev->bus; - priv->read = ar8216_mii_read; - priv->write = ar8216_mii_write; + priv->mii_bus = pdev->bus; + priv->read = ar8216_mii_read; + priv->write = ar8216_mii_write; - priv->phy = pdev; + ret = ar8216_id_chip(priv); + if (ret) + goto err_free_priv; + } - ret = ar8216_id_chip(priv); - if (ret) - goto err_free_priv; + priv->phy = pdev; if (ar8xxx_has_gige(priv)) pdev->supported = SUPPORTED_1000baseT_Full; -- cgit v1.2.3 From b8a4ecae67732a20840ad716c110021d0b1393f9 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 13:18:48 +0000 Subject: generic: ar8216: add defines for the AR8316 POSTRIP register Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35539 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index ec6d23266..720b0eec3 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -788,7 +788,7 @@ ar8316_hw_init(struct ar8216_priv *priv) u32 val, newval; struct mii_bus *bus; - val = priv->read(priv, 0x8); + val = priv->read(priv, AR8316_REG_POSTRIP); if (priv->phy->interface == PHY_INTERFACE_MODE_RGMII) { if (priv->port4_phy) { @@ -812,7 +812,7 @@ ar8316_hw_init(struct ar8216_priv *priv) if (val == newval) goto out; - priv->write(priv, 0x8, newval); + priv->write(priv, AR8316_REG_POSTRIP, newval); /* Initialize the ports */ bus = priv->mii_bus; -- cgit v1.2.3 From 21c82adbb1400c2d42b30be8fc5922b06dde4cb6 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 18:38:10 +0000 Subject: generic: ar8216: only set phy_ptr if packet mangling is used Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35541 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 720b0eec3..f7ce0189f 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1880,10 +1880,9 @@ ar8216_config_init(struct phy_device *pdev) if (ret) goto err_unregister_switch; - dev->phy_ptr = priv; - /* VID fixup only needed on ar8216 */ if (chip_is_ar8216(priv) && pdev->addr == 0) { + dev->phy_ptr = priv; dev->priv_flags |= IFF_NO_IP_ALIGN; dev->eth_mangle_rx = ar8216_mangle_rx; dev->eth_mangle_tx = ar8216_mangle_tx; -- cgit v1.2.3 From 737f4a1c05c0bb6c9865eb9953f5b2460588a1d9 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 18:38:12 +0000 Subject: generic: ar8216: remove redundant phy address check Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35542 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index f7ce0189f..4c83a6f62 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1881,7 +1881,7 @@ ar8216_config_init(struct phy_device *pdev) goto err_unregister_switch; /* VID fixup only needed on ar8216 */ - if (chip_is_ar8216(priv) && pdev->addr == 0) { + if (chip_is_ar8216(priv)) { dev->phy_ptr = priv; dev->priv_flags |= IFF_NO_IP_ALIGN; dev->eth_mangle_rx = ar8216_mangle_rx; -- cgit v1.2.3 From a38fe2356910a1803ad60f365494005a6992613b Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 18:42:04 +0000 Subject: generic: ar8216: add ar8xxx_create{,mii} helpers Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35543 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 47 +++++++++++++++------- 1 file changed, 33 insertions(+), 14 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 4c83a6f62..f7fbf4e49 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1742,9 +1742,6 @@ ar8xxx_mib_init(struct ar8216_priv *priv) if (!priv->mib_stats) return -ENOMEM; - mutex_init(&priv->mib_lock); - INIT_DELAYED_WORK(&priv->mib_work, ar8xxx_mib_work_func); - return 0; } @@ -1768,6 +1765,37 @@ ar8xxx_mib_cleanup(struct ar8216_priv *priv) kfree(priv->mib_stats); } +static struct ar8216_priv * +ar8xxx_create(void) +{ + struct ar8216_priv *priv; + + priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL); + if (priv == NULL) + return NULL; + + mutex_init(&priv->reg_mutex); + mutex_init(&priv->mib_lock); + INIT_DELAYED_WORK(&priv->mib_work, ar8xxx_mib_work_func); + + return priv; +} + +static struct ar8216_priv * +ar8xxx_create_mii(struct mii_bus *bus) +{ + struct ar8216_priv *priv; + + priv = ar8xxx_create(); + if (priv) { + priv->mii_bus = bus; + priv->read = ar8216_mii_read; + priv->write = ar8216_mii_write; + } + + return priv; +} + static int ar8216_config_init(struct phy_device *pdev) { @@ -1777,14 +1805,10 @@ ar8216_config_init(struct phy_device *pdev) int ret; if (!priv) { - priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL); + priv = ar8xxx_create_mii(pdev->bus); if (priv == NULL) return -ENOMEM; - priv->mii_bus = pdev->bus; - priv->read = ar8216_mii_read; - priv->write = ar8216_mii_write; - ret = ar8216_id_chip(priv); if (ret) goto err_free_priv; @@ -1829,8 +1853,6 @@ ar8216_config_init(struct phy_device *pdev) return 0; } - mutex_init(&priv->reg_mutex); - pdev->priv = priv; swdev = &priv->dev; @@ -2006,13 +2028,10 @@ ar8216_probe(struct phy_device *pdev) if (!ar8xxx_is_possible(pdev->bus)) return -ENODEV; - priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL); + priv = ar8xxx_create_mii(pdev->bus); if (priv == NULL) return -ENOMEM; - priv->mii_bus = pdev->bus; - priv->read = ar8216_mii_read; - priv->write = ar8216_mii_write; priv->phy = pdev; ret = ar8216_id_chip(priv); -- cgit v1.2.3 From 07545275066cb291138dea881e9f055205ed03dc Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 18:42:05 +0000 Subject: generic: ar8216: add ar8xxx_free helper Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35544 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index f7fbf4e49..a7a2a6356 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1781,6 +1781,12 @@ ar8xxx_create(void) return priv; } +static void +ar8xxx_free(struct ar8216_priv *priv) +{ + kfree(priv); +} + static struct ar8216_priv * ar8xxx_create_mii(struct mii_bus *bus) { @@ -1827,7 +1833,7 @@ ar8216_config_init(struct phy_device *pdev) /* check if we're attaching to the switch twice */ pdev = pdev->bus->phy_map[0]; if (!pdev) { - kfree(priv); + ar8xxx_free(priv); return 0; } @@ -1838,7 +1844,7 @@ ar8216_config_init(struct phy_device *pdev) return 0; } - kfree(priv); + ar8xxx_free(priv); /* switch device has been initialized, reinit */ priv = pdev->priv; @@ -1849,7 +1855,7 @@ ar8216_config_init(struct phy_device *pdev) return 0; } - kfree(priv); + ar8xxx_free(priv); return 0; } @@ -1921,7 +1927,7 @@ err_unregister_switch: err_cleanup_mib: ar8xxx_mib_cleanup(priv); err_free_priv: - kfree(priv); + ar8xxx_free(priv); pdev->priv = NULL; return ret; } @@ -2035,7 +2041,7 @@ ar8216_probe(struct phy_device *pdev) priv->phy = pdev; ret = ar8216_id_chip(priv); - kfree(priv); + ar8xxx_free(priv); return ret; } @@ -2068,7 +2074,7 @@ ar8216_remove(struct phy_device *pdev) unregister_switch(&priv->dev); ar8xxx_mib_cleanup(priv); - kfree(priv); + ar8xxx_free(priv); } static struct phy_driver ar8216_driver = { -- cgit v1.2.3 From 0ee6eaa43bf3f462453726729ac6d95f0a475359 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 18:42:07 +0000 Subject: generic: ar8216: free mib counters from ar8xxx_free Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35545 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index a7a2a6356..492963de1 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1762,7 +1762,6 @@ ar8xxx_mib_cleanup(struct ar8216_priv *priv) return; cancel_delayed_work(&priv->mib_work); - kfree(priv->mib_stats); } static struct ar8216_priv * @@ -1784,6 +1783,7 @@ ar8xxx_create(void) static void ar8xxx_free(struct ar8216_priv *priv) { + kfree(priv->mib_stats); kfree(priv); } @@ -1893,7 +1893,7 @@ ar8216_config_init(struct phy_device *pdev) ret = register_switch(swdev, pdev->attached_dev); if (ret) - goto err_cleanup_mib; + goto err_free_priv; printk(KERN_INFO "%s: %s switch driver attached.\n", pdev->attached_dev->name, swdev->name); @@ -1924,8 +1924,6 @@ ar8216_config_init(struct phy_device *pdev) err_unregister_switch: unregister_switch(&priv->dev); -err_cleanup_mib: - ar8xxx_mib_cleanup(priv); err_free_priv: ar8xxx_free(priv); pdev->priv = NULL; -- cgit v1.2.3 From 8cafb4a62a5a0ba727bac8940b35a9402dfc27b0 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 18:42:08 +0000 Subject: generic: ar8216: rename ar8xxx_mib_cleanup to ar8xxx_mib_stop Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35546 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 492963de1..2edd41577 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1756,7 +1756,7 @@ ar8xxx_mib_start(struct ar8216_priv *priv) } static void -ar8xxx_mib_cleanup(struct ar8216_priv *priv) +ar8xxx_mib_stop(struct ar8216_priv *priv) { if (!ar8xxx_has_mib_counters(priv)) return; @@ -2071,7 +2071,7 @@ ar8216_remove(struct phy_device *pdev) if (pdev->addr == 0) unregister_switch(&priv->dev); - ar8xxx_mib_cleanup(priv); + ar8xxx_mib_stop(priv); ar8xxx_free(priv); } -- cgit v1.2.3 From dbeab3d4f98464c7c67832dbf38e35d5947442dd Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 10 Feb 2013 19:02:01 +0000 Subject: generic: ar8216: add ar8xxx_probe_switch helper Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35547 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 73 +++++++++++++--------- 1 file changed, 42 insertions(+), 31 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 2edd41577..c0b51e7c6 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1802,6 +1802,45 @@ ar8xxx_create_mii(struct mii_bus *bus) return priv; } +static int +ar8xxx_probe_switch(struct ar8216_priv *priv) +{ + struct switch_dev *swdev; + int ret; + + ret = ar8216_id_chip(priv); + if (ret) + return ret; + + swdev = &priv->dev; + swdev->cpu_port = AR8216_PORT_CPU; + swdev->ops = &ar8216_sw_ops; + + if (chip_is_ar8316(priv)) { + swdev->name = "Atheros AR8316"; + swdev->vlans = AR8X16_MAX_VLANS; + swdev->ports = AR8216_NUM_PORTS; + } else if (chip_is_ar8236(priv)) { + swdev->name = "Atheros AR8236"; + swdev->vlans = AR8216_NUM_VLANS; + swdev->ports = AR8216_NUM_PORTS; + } else if (chip_is_ar8327(priv)) { + swdev->name = "Atheros AR8327"; + swdev->vlans = AR8X16_MAX_VLANS; + swdev->ports = AR8327_NUM_PORTS; + } else { + swdev->name = "Atheros AR8216"; + swdev->vlans = AR8216_NUM_VLANS; + swdev->ports = AR8216_NUM_PORTS; + } + + ret = ar8xxx_mib_init(priv); + if (ret) + return ret; + + return 0; +} + static int ar8216_config_init(struct phy_device *pdev) { @@ -1815,7 +1854,7 @@ ar8216_config_init(struct phy_device *pdev) if (priv == NULL) return -ENOMEM; - ret = ar8216_id_chip(priv); + ret = ar8xxx_probe_switch(priv); if (ret) goto err_free_priv; } @@ -1840,6 +1879,7 @@ ar8216_config_init(struct phy_device *pdev) /* switch device has not been initialized, reuse priv */ if (!pdev->priv) { priv->port4_phy = true; + priv->dev.ports = (AR8216_NUM_PORTS - 1); pdev->priv = priv; return 0; } @@ -1862,35 +1902,6 @@ ar8216_config_init(struct phy_device *pdev) pdev->priv = priv; swdev = &priv->dev; - swdev->cpu_port = AR8216_PORT_CPU; - swdev->ops = &ar8216_sw_ops; - swdev->ports = AR8216_NUM_PORTS; - - if (chip_is_ar8316(priv)) { - swdev->name = "Atheros AR8316"; - swdev->vlans = AR8X16_MAX_VLANS; - - if (priv->port4_phy) { - /* port 5 connected to the other mac, therefore unusable */ - swdev->ports = (AR8216_NUM_PORTS - 1); - } - } else if (chip_is_ar8236(priv)) { - swdev->name = "Atheros AR8236"; - swdev->vlans = AR8216_NUM_VLANS; - swdev->ports = AR8216_NUM_PORTS; - } else if (chip_is_ar8327(priv)) { - swdev->name = "Atheros AR8327"; - swdev->vlans = AR8X16_MAX_VLANS; - swdev->ports = AR8327_NUM_PORTS; - } else { - swdev->name = "Atheros AR8216"; - swdev->vlans = AR8216_NUM_VLANS; - } - - ret = ar8xxx_mib_init(priv); - if (ret) - goto err_free_priv; - ret = register_switch(swdev, pdev->attached_dev); if (ret) goto err_free_priv; @@ -2038,7 +2049,7 @@ ar8216_probe(struct phy_device *pdev) priv->phy = pdev; - ret = ar8216_id_chip(priv); + ret = ar8xxx_probe_switch(priv); ar8xxx_free(priv); return ret; -- cgit v1.2.3 From c475d8eda70a4a6bb1e7568567b65b327d0f47cc Mon Sep 17 00:00:00 2001 From: juhosg Date: Mon, 11 Feb 2013 10:05:35 +0000 Subject: generic: ar8216: fix PHY features setup Sujith says: This commit breaks the WAN port on my AP96 - DHCP fails. Reverting it fixes the issue. commit b67cc3a0cdd02973610d4d5a63226d1c44841e94 Author: juhosg Date: Fri Feb 8 09:13:18 2013 +0000 generic: ar8216: simplify phy features setup Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@355183c298f89-4303-0410-b956-a3cf2f4a3e73 This change restores the previous behaviour and moves the code into the ar8216_probe function. Reported-by: Sujith Manoharan Signed-off-by: Gabor Juhos Tested-by: Sujith Manoharan git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35549 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 28 ++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index c0b51e7c6..c4631080e 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1861,12 +1861,6 @@ ar8216_config_init(struct phy_device *pdev) priv->phy = pdev; - if (ar8xxx_has_gige(priv)) - pdev->supported = SUPPORTED_1000baseT_Full; - else - pdev->supported = SUPPORTED_100baseT_Full; - pdev->advertising = pdev->supported; - if (pdev->addr != 0) { if (chip_is_ar8316(priv)) { /* check if we're attaching to the switch twice */ @@ -2050,8 +2044,28 @@ ar8216_probe(struct phy_device *pdev) priv->phy = pdev; ret = ar8xxx_probe_switch(priv); - ar8xxx_free(priv); + if (ret) + goto out; + if (pdev->addr == 0) { + if (ar8xxx_has_gige(priv)) { + pdev->supported = SUPPORTED_1000baseT_Full; + pdev->advertising = ADVERTISED_1000baseT_Full; + } else { + pdev->supported = SUPPORTED_100baseT_Full; + pdev->advertising = ADVERTISED_100baseT_Full; + } + } else { + if (ar8xxx_has_gige(priv)) { + pdev->supported |= SUPPORTED_1000baseT_Full; + pdev->advertising |= ADVERTISED_1000baseT_Full; + } + } + + ret = 0; + +out: + ar8xxx_free(priv); return ret; } -- cgit v1.2.3 From f4ce24ace18e5a594f6abe7436f7eb6bc499d405 Mon Sep 17 00:00:00 2001 From: juhosg Date: Mon, 11 Feb 2013 13:14:00 +0000 Subject: generic: ar8216: use pr_* macros for kernel messages Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35554 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index c4631080e..a34a749f2 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -794,18 +794,18 @@ ar8316_hw_init(struct ar8216_priv *priv) if (priv->port4_phy) { /* value taken from Ubiquiti RouterStation Pro */ newval = 0x81461bea; - printk(KERN_INFO "ar8316: Using port 4 as PHY\n"); + pr_info("ar8316: Using port 4 as PHY\n"); } else { newval = 0x01261be2; - printk(KERN_INFO "ar8316: Using port 4 as switch port\n"); + pr_info("ar8316: Using port 4 as switch port\n"); } } else if (priv->phy->interface == PHY_INTERFACE_MODE_GMII) { /* value taken from AVM Fritz!Box 7390 sources */ newval = 0x010e5b71; } else { /* no known value for phy interface */ - printk(KERN_ERR "ar8316: unsupported mii mode: %d.\n", - priv->phy->interface); + pr_err("ar8316: unsupported mii mode: %d.\n", + priv->phy->interface); return -EINVAL; } @@ -1689,9 +1689,8 @@ ar8216_id_chip(struct ar8216_priv *priv) priv->chip = &ar8327_chip; break; default: - printk(KERN_DEBUG - "ar8216: Unknown Atheros device [ver=%d, rev=%d]\n", - priv->chip_ver, priv->chip_rev); + pr_err("ar8216: Unknown Atheros device [ver=%d, rev=%d]\n", + priv->chip_ver, priv->chip_rev); return -ENODEV; } @@ -1900,7 +1899,7 @@ ar8216_config_init(struct phy_device *pdev) if (ret) goto err_free_priv; - printk(KERN_INFO "%s: %s switch driver attached.\n", + pr_info("%s: %s switch driver attached.\n", pdev->attached_dev->name, swdev->name); priv->init = true; -- cgit v1.2.3 From ddf1e04eecbd30dc2ae54207342c8b94ec7d091f Mon Sep 17 00:00:00 2001 From: juhosg Date: Mon, 11 Feb 2013 13:25:43 +0000 Subject: generic: ar8216: use phydev instead of pdev everywhere Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35555 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 66 +++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index a34a749f2..7fbc53124 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1841,15 +1841,15 @@ ar8xxx_probe_switch(struct ar8216_priv *priv) } static int -ar8216_config_init(struct phy_device *pdev) +ar8216_config_init(struct phy_device *phydev) { - struct ar8216_priv *priv = pdev->priv; - struct net_device *dev = pdev->attached_dev; + struct ar8216_priv *priv = phydev->priv; + struct net_device *dev = phydev->attached_dev; struct switch_dev *swdev; int ret; if (!priv) { - priv = ar8xxx_create_mii(pdev->bus); + priv = ar8xxx_create_mii(phydev->bus); if (priv == NULL) return -ENOMEM; @@ -1858,29 +1858,29 @@ ar8216_config_init(struct phy_device *pdev) goto err_free_priv; } - priv->phy = pdev; + priv->phy = phydev; - if (pdev->addr != 0) { + if (phydev->addr != 0) { if (chip_is_ar8316(priv)) { /* check if we're attaching to the switch twice */ - pdev = pdev->bus->phy_map[0]; - if (!pdev) { + phydev = phydev->bus->phy_map[0]; + if (!phydev) { ar8xxx_free(priv); return 0; } /* switch device has not been initialized, reuse priv */ - if (!pdev->priv) { + if (!phydev->priv) { priv->port4_phy = true; priv->dev.ports = (AR8216_NUM_PORTS - 1); - pdev->priv = priv; + phydev->priv = priv; return 0; } ar8xxx_free(priv); /* switch device has been initialized, reinit */ - priv = pdev->priv; + priv = phydev->priv; priv->dev.ports = (AR8216_NUM_PORTS - 1); priv->initialized = false; priv->port4_phy = true; @@ -1892,15 +1892,15 @@ ar8216_config_init(struct phy_device *pdev) return 0; } - pdev->priv = priv; + phydev->priv = priv; swdev = &priv->dev; - ret = register_switch(swdev, pdev->attached_dev); + ret = register_switch(swdev, phydev->attached_dev); if (ret) goto err_free_priv; pr_info("%s: %s switch driver attached.\n", - pdev->attached_dev->name, swdev->name); + phydev->attached_dev->name, swdev->name); priv->init = true; @@ -1930,7 +1930,7 @@ err_unregister_switch: unregister_switch(&priv->dev); err_free_priv: ar8xxx_free(priv); - pdev->priv = NULL; + phydev->priv = NULL; return ret; } @@ -2024,40 +2024,40 @@ ar8xxx_is_possible(struct mii_bus *bus) } static int -ar8216_probe(struct phy_device *pdev) +ar8216_probe(struct phy_device *phydev) { struct ar8216_priv *priv; int ret; /* skip PHYs at unused adresses */ - if (pdev->addr != 0 && pdev->addr != 4) + if (phydev->addr != 0 && phydev->addr != 4) return -ENODEV; - if (!ar8xxx_is_possible(pdev->bus)) + if (!ar8xxx_is_possible(phydev->bus)) return -ENODEV; - priv = ar8xxx_create_mii(pdev->bus); + priv = ar8xxx_create_mii(phydev->bus); if (priv == NULL) return -ENOMEM; - priv->phy = pdev; + priv->phy = phydev; ret = ar8xxx_probe_switch(priv); if (ret) goto out; - if (pdev->addr == 0) { + if (phydev->addr == 0) { if (ar8xxx_has_gige(priv)) { - pdev->supported = SUPPORTED_1000baseT_Full; - pdev->advertising = ADVERTISED_1000baseT_Full; + phydev->supported = SUPPORTED_1000baseT_Full; + phydev->advertising = ADVERTISED_1000baseT_Full; } else { - pdev->supported = SUPPORTED_100baseT_Full; - pdev->advertising = ADVERTISED_100baseT_Full; + phydev->supported = SUPPORTED_100baseT_Full; + phydev->advertising = ADVERTISED_100baseT_Full; } } else { if (ar8xxx_has_gige(priv)) { - pdev->supported |= SUPPORTED_1000baseT_Full; - pdev->advertising |= ADVERTISED_1000baseT_Full; + phydev->supported |= SUPPORTED_1000baseT_Full; + phydev->advertising |= ADVERTISED_1000baseT_Full; } } @@ -2069,9 +2069,9 @@ out: } static void -ar8216_detach(struct phy_device *pdev) +ar8216_detach(struct phy_device *phydev) { - struct net_device *dev = pdev->attached_dev; + struct net_device *dev = phydev->attached_dev; if (!dev) return; @@ -2083,16 +2083,16 @@ ar8216_detach(struct phy_device *pdev) } static void -ar8216_remove(struct phy_device *pdev) +ar8216_remove(struct phy_device *phydev) { - struct ar8216_priv *priv = pdev->priv; + struct ar8216_priv *priv = phydev->priv; if (!priv) return; - pdev->priv = NULL; + phydev->priv = NULL; - if (pdev->addr == 0) + if (phydev->addr == 0) unregister_switch(&priv->dev); ar8xxx_mib_stop(priv); -- cgit v1.2.3 From 39c34fd7b3bd275cff53e1ea536af940d00fe940 Mon Sep 17 00:00:00 2001 From: juhosg Date: Mon, 11 Feb 2013 16:11:30 +0000 Subject: generic: ar8216: reuse the private data from ar8216_probe The private data of the switch is already allocated in ar8216_priv, assign that to each PHY on the same MDIO bus. Also remove the redundant code from ar8216_config_init. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35559 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 73 ++++++++++++---------- 1 file changed, 40 insertions(+), 33 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 7fbc53124..baf752bf1 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -101,6 +101,9 @@ struct ar8216_priv { int mib_next_port; u64 *mib_stats; + struct list_head list; + unsigned int use_count; + /* all fields below are cleared on reset */ bool vlan; u16 vlan_id[AR8X16_MAX_VLANS]; @@ -198,6 +201,9 @@ static const struct ar8xxx_mib_desc ar8236_mibs[] = { MIB_DESC(1, AR8236_STATS_TXLATECOL, "TxLateCol"), }; +static DEFINE_MUTEX(ar8xxx_dev_list_lock); +static LIST_HEAD(ar8xxx_dev_list); + static inline struct ar8216_priv * swdev_to_ar8216(struct switch_dev *swdev) { @@ -1848,15 +1854,8 @@ ar8216_config_init(struct phy_device *phydev) struct switch_dev *swdev; int ret; - if (!priv) { - priv = ar8xxx_create_mii(phydev->bus); - if (priv == NULL) - return -ENOMEM; - - ret = ar8xxx_probe_switch(priv); - if (ret) - goto err_free_priv; - } + if (WARN_ON(!priv)) + return -ENODEV; priv->phy = phydev; @@ -1864,23 +1863,17 @@ ar8216_config_init(struct phy_device *phydev) if (chip_is_ar8316(priv)) { /* check if we're attaching to the switch twice */ phydev = phydev->bus->phy_map[0]; - if (!phydev) { - ar8xxx_free(priv); + if (!phydev) return 0; - } /* switch device has not been initialized, reuse priv */ if (!phydev->priv) { priv->port4_phy = true; priv->dev.ports = (AR8216_NUM_PORTS - 1); - phydev->priv = priv; return 0; } - ar8xxx_free(priv); - /* switch device has been initialized, reinit */ - priv = phydev->priv; priv->dev.ports = (AR8216_NUM_PORTS - 1); priv->initialized = false; priv->port4_phy = true; @@ -1888,16 +1881,13 @@ ar8216_config_init(struct phy_device *phydev) return 0; } - ar8xxx_free(priv); return 0; } - phydev->priv = priv; - swdev = &priv->dev; ret = register_switch(swdev, phydev->attached_dev); if (ret) - goto err_free_priv; + goto err; pr_info("%s: %s switch driver attached.\n", phydev->attached_dev->name, swdev->name); @@ -1928,9 +1918,7 @@ ar8216_config_init(struct phy_device *phydev) err_unregister_switch: unregister_switch(&priv->dev); -err_free_priv: - ar8xxx_free(priv); - phydev->priv = NULL; +err: return ret; } @@ -2036,16 +2024,22 @@ ar8216_probe(struct phy_device *phydev) if (!ar8xxx_is_possible(phydev->bus)) return -ENODEV; - priv = ar8xxx_create_mii(phydev->bus); - if (priv == NULL) - return -ENOMEM; + mutex_lock(&ar8xxx_dev_list_lock); + list_for_each_entry(priv, &ar8xxx_dev_list, list) + if (priv->mii_bus == phydev->bus) + goto found; - priv->phy = phydev; + priv = ar8xxx_create_mii(phydev->bus); + if (priv == NULL) { + ret = -ENOMEM; + goto unlock; + } ret = ar8xxx_probe_switch(priv); if (ret) - goto out; + goto free_priv; +found: if (phydev->addr == 0) { if (ar8xxx_has_gige(priv)) { phydev->supported = SUPPORTED_1000baseT_Full; @@ -2061,10 +2055,19 @@ ar8216_probe(struct phy_device *phydev) } } - ret = 0; + phydev->priv = priv; + priv->use_count++; -out: + list_add(&priv->list, &ar8xxx_dev_list); + + mutex_unlock(&ar8xxx_dev_list_lock); + + return 0; + +free_priv: ar8xxx_free(priv); +unlock: + mutex_unlock(&ar8xxx_dev_list_lock); return ret; } @@ -2087,14 +2090,18 @@ ar8216_remove(struct phy_device *phydev) { struct ar8216_priv *priv = phydev->priv; - if (!priv) + if (WARN_ON(!priv)) return; phydev->priv = NULL; + if (--priv->use_count > 0) + return; - if (phydev->addr == 0) - unregister_switch(&priv->dev); + mutex_lock(&ar8xxx_dev_list_lock); + list_del(&priv->list); + mutex_unlock(&ar8xxx_dev_list_lock); + unregister_switch(&priv->dev); ar8xxx_mib_stop(priv); ar8xxx_free(priv); } -- cgit v1.2.3 From 38d421179ae10e82c6fb7dc235c2231bb2d1c264 Mon Sep 17 00:00:00 2001 From: juhosg Date: Mon, 11 Feb 2013 16:11:31 +0000 Subject: generic: ar8216: don't use ethernet device name in register_switch The switches are accessed via an MDIO bus. Set the alias to the name of the MDIO bus, and show that in the message along with the name of the switch switch device. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35560 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index baf752bf1..b1791172e 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1885,12 +1885,13 @@ ar8216_config_init(struct phy_device *phydev) } swdev = &priv->dev; - ret = register_switch(swdev, phydev->attached_dev); + swdev->alias = dev_name(&priv->mii_bus->dev); + ret = register_switch(swdev, NULL); if (ret) goto err; - pr_info("%s: %s switch driver attached.\n", - phydev->attached_dev->name, swdev->name); + pr_info("%s: %s switch registered on %s\n", + swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev)); priv->init = true; -- cgit v1.2.3 From d6c3cd0d2da1aa1bd34195369069a093686c1a22 Mon Sep 17 00:00:00 2001 From: juhosg Date: Mon, 11 Feb 2013 16:57:31 +0000 Subject: ar8216: remove superfluous code from ar8216_config_init Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35562 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index b1791172e..811e406f3 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1861,18 +1861,6 @@ ar8216_config_init(struct phy_device *phydev) if (phydev->addr != 0) { if (chip_is_ar8316(priv)) { - /* check if we're attaching to the switch twice */ - phydev = phydev->bus->phy_map[0]; - if (!phydev) - return 0; - - /* switch device has not been initialized, reuse priv */ - if (!phydev->priv) { - priv->port4_phy = true; - priv->dev.ports = (AR8216_NUM_PORTS - 1); - return 0; - } - /* switch device has been initialized, reinit */ priv->dev.ports = (AR8216_NUM_PORTS - 1); priv->initialized = false; -- cgit v1.2.3 From 66e79cf7ba2d221ff0aa52e1e4de6cb3d8c973f6 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 14 Feb 2013 14:01:24 +0000 Subject: generic: ar8216: register the switch from the probe routine Currently the switch gets registered when an ethernet driver connects to a PHY of the switch. This method does not work with the ethernet drivers which are connecting to the PHY from their ndo_open callback. With those ethernet drivers, the driver tries to register the switch each time when the etherned device is opened and this causes a deadlock. Move the switch registration into the probe routine to fix this problem. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35602 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 29 +++++++++------------- 1 file changed, 12 insertions(+), 17 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 811e406f3..97a2cca6c 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1851,7 +1851,6 @@ ar8216_config_init(struct phy_device *phydev) { struct ar8216_priv *priv = phydev->priv; struct net_device *dev = phydev->attached_dev; - struct switch_dev *swdev; int ret; if (WARN_ON(!priv)) @@ -1872,24 +1871,15 @@ ar8216_config_init(struct phy_device *phydev) return 0; } - swdev = &priv->dev; - swdev->alias = dev_name(&priv->mii_bus->dev); - ret = register_switch(swdev, NULL); - if (ret) - goto err; - - pr_info("%s: %s switch registered on %s\n", - swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev)); - priv->init = true; ret = priv->chip->hw_init(priv); if (ret) - goto err_unregister_switch; + return ret; ret = ar8216_sw_reset_switch(&priv->dev); if (ret) - goto err_unregister_switch; + return ret; /* VID fixup only needed on ar8216 */ if (chip_is_ar8216(priv)) { @@ -1904,11 +1894,6 @@ ar8216_config_init(struct phy_device *phydev) ar8xxx_mib_start(priv); return 0; - -err_unregister_switch: - unregister_switch(&priv->dev); -err: - return ret; } static int @@ -2004,6 +1989,7 @@ static int ar8216_probe(struct phy_device *phydev) { struct ar8216_priv *priv; + struct switch_dev *swdev; int ret; /* skip PHYs at unused adresses */ @@ -2028,6 +2014,15 @@ ar8216_probe(struct phy_device *phydev) if (ret) goto free_priv; + swdev = &priv->dev; + swdev->alias = dev_name(&priv->mii_bus->dev); + ret = register_switch(swdev, NULL); + if (ret) + goto free_priv; + + pr_info("%s: %s switch registered on %s\n", + swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev)); + found: if (phydev->addr == 0) { if (ar8xxx_has_gige(priv)) { -- cgit v1.2.3 From ed393487fdd365391940b832e8c63b83c87d2514 Mon Sep 17 00:00:00 2001 From: juhosg Date: Thu, 14 Feb 2013 14:55:40 +0000 Subject: generic: ar8216: move PHY4 RGMII workaround code out of the loop Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35603 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 97a2cca6c..b34c2a863 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -820,20 +820,20 @@ ar8316_hw_init(struct ar8216_priv *priv) priv->write(priv, AR8316_REG_POSTRIP, newval); + if (priv->port4_phy && + priv->phy->interface == PHY_INTERFACE_MODE_RGMII) { + /* work around for phy4 rgmii mode */ + ar8216_phy_dbg_write(priv, 4, 0x12, 0x480c); + /* rx delay */ + ar8216_phy_dbg_write(priv, 4, 0x0, 0x824e); + /* tx delay */ + ar8216_phy_dbg_write(priv, 4, 0x5, 0x3d47); + msleep(1000); + } + /* Initialize the ports */ bus = priv->mii_bus; for (i = 0; i < 5; i++) { - if ((i == 4) && priv->port4_phy && - priv->phy->interface == PHY_INTERFACE_MODE_RGMII) { - /* work around for phy4 rgmii mode */ - ar8216_phy_dbg_write(priv, i, 0x12, 0x480c); - /* rx delay */ - ar8216_phy_dbg_write(priv, i, 0x0, 0x824e); - /* tx delay */ - ar8216_phy_dbg_write(priv, i, 0x5, 0x3d47); - msleep(1000); - } - /* initialize the port itself */ mdiobus_write(bus, i, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM); -- cgit v1.2.3 From 8daed33d885a1960470bce242ddd9a73111eceac Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 17 Feb 2013 12:48:23 +0000 Subject: generic: ar8216: rename struct ar8216_priv to ar8xxx_priv Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35641 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 188 ++++++++++----------- 1 file changed, 94 insertions(+), 94 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index b34c2a863..0e61767b9 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -42,7 +42,7 @@ #define AR8XXX_MIB_WORK_DELAY 2000 /* msecs */ -struct ar8216_priv; +struct ar8xxx_priv; #define AR8XXX_CAP_GIGE BIT(0) #define AR8XXX_CAP_MIB_COUNTERS BIT(1) @@ -63,26 +63,26 @@ struct ar8xxx_mib_desc { struct ar8xxx_chip { unsigned long caps; - int (*hw_init)(struct ar8216_priv *priv); - void (*init_globals)(struct ar8216_priv *priv); - void (*init_port)(struct ar8216_priv *priv, int port); - void (*setup_port)(struct ar8216_priv *priv, int port, u32 egress, + int (*hw_init)(struct ar8xxx_priv *priv); + void (*init_globals)(struct ar8xxx_priv *priv); + void (*init_port)(struct ar8xxx_priv *priv, int port); + void (*setup_port)(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, u32 members, u32 pvid); - u32 (*read_port_status)(struct ar8216_priv *priv, int port); - int (*atu_flush)(struct ar8216_priv *priv); - void (*vtu_flush)(struct ar8216_priv *priv); - void (*vtu_load_vlan)(struct ar8216_priv *priv, u32 vid, u32 port_mask); + u32 (*read_port_status)(struct ar8xxx_priv *priv, int port); + int (*atu_flush)(struct ar8xxx_priv *priv); + void (*vtu_flush)(struct ar8xxx_priv *priv); + void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vid, u32 port_mask); const struct ar8xxx_mib_desc *mib_decs; unsigned num_mibs; }; -struct ar8216_priv { +struct ar8xxx_priv { struct switch_dev dev; struct mii_bus *mii_bus; struct phy_device *phy; - u32 (*read)(struct ar8216_priv *priv, int reg); - void (*write)(struct ar8216_priv *priv, int reg, u32 val); + u32 (*read)(struct ar8xxx_priv *priv, int reg); + void (*write)(struct ar8xxx_priv *priv, int reg, u32 val); const struct net_device_ops *ndo_old; struct net_device_ops ndo; struct mutex reg_mutex; @@ -204,38 +204,38 @@ static const struct ar8xxx_mib_desc ar8236_mibs[] = { static DEFINE_MUTEX(ar8xxx_dev_list_lock); static LIST_HEAD(ar8xxx_dev_list); -static inline struct ar8216_priv * -swdev_to_ar8216(struct switch_dev *swdev) +static inline struct ar8xxx_priv * +swdev_to_ar8xxx(struct switch_dev *swdev) { - return container_of(swdev, struct ar8216_priv, dev); + return container_of(swdev, struct ar8xxx_priv, dev); } -static inline bool ar8xxx_has_gige(struct ar8216_priv *priv) +static inline bool ar8xxx_has_gige(struct ar8xxx_priv *priv) { return priv->chip->caps & AR8XXX_CAP_GIGE; } -static inline bool ar8xxx_has_mib_counters(struct ar8216_priv *priv) +static inline bool ar8xxx_has_mib_counters(struct ar8xxx_priv *priv) { return priv->chip->caps & AR8XXX_CAP_MIB_COUNTERS; } -static inline bool chip_is_ar8216(struct ar8216_priv *priv) +static inline bool chip_is_ar8216(struct ar8xxx_priv *priv) { return priv->chip_ver == AR8XXX_VER_AR8216; } -static inline bool chip_is_ar8236(struct ar8216_priv *priv) +static inline bool chip_is_ar8236(struct ar8xxx_priv *priv) { return priv->chip_ver == AR8XXX_VER_AR8236; } -static inline bool chip_is_ar8316(struct ar8216_priv *priv) +static inline bool chip_is_ar8316(struct ar8xxx_priv *priv) { return priv->chip_ver == AR8XXX_VER_AR8316; } -static inline bool chip_is_ar8327(struct ar8216_priv *priv) +static inline bool chip_is_ar8327(struct ar8xxx_priv *priv) { return priv->chip_ver == AR8XXX_VER_AR8327; } @@ -254,7 +254,7 @@ split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) } static u32 -ar8216_mii_read(struct ar8216_priv *priv, int reg) +ar8216_mii_read(struct ar8xxx_priv *priv, int reg) { struct mii_bus *bus = priv->mii_bus; u16 r1, r2, page; @@ -275,7 +275,7 @@ ar8216_mii_read(struct ar8216_priv *priv, int reg) } static void -ar8216_mii_write(struct ar8216_priv *priv, int reg, u32 val) +ar8216_mii_write(struct ar8xxx_priv *priv, int reg, u32 val) { struct mii_bus *bus = priv->mii_bus; u16 r1, r2, r3; @@ -301,7 +301,7 @@ ar8216_mii_write(struct ar8216_priv *priv, int reg, u32 val) } static void -ar8216_phy_dbg_write(struct ar8216_priv *priv, int phy_addr, +ar8216_phy_dbg_write(struct ar8xxx_priv *priv, int phy_addr, u16 dbg_addr, u16 dbg_data) { struct mii_bus *bus = priv->mii_bus; @@ -313,7 +313,7 @@ ar8216_phy_dbg_write(struct ar8216_priv *priv, int phy_addr, } static void -ar8216_phy_mmd_write(struct ar8216_priv *priv, int phy_addr, u16 addr, u16 data) +ar8216_phy_mmd_write(struct ar8xxx_priv *priv, int phy_addr, u16 addr, u16 data) { struct mii_bus *bus = priv->mii_bus; @@ -324,7 +324,7 @@ ar8216_phy_mmd_write(struct ar8216_priv *priv, int phy_addr, u16 addr, u16 data) } static u32 -ar8216_rmw(struct ar8216_priv *priv, int reg, u32 mask, u32 val) +ar8216_rmw(struct ar8xxx_priv *priv, int reg, u32 mask, u32 val) { u32 v; @@ -339,7 +339,7 @@ ar8216_rmw(struct ar8216_priv *priv, int reg, u32 mask, u32 val) } static inline void -ar8216_reg_set(struct ar8216_priv *priv, int reg, u32 val) +ar8216_reg_set(struct ar8xxx_priv *priv, int reg, u32 val) { u32 v; @@ -351,7 +351,7 @@ ar8216_reg_set(struct ar8216_priv *priv, int reg, u32 val) } static int -ar8216_reg_wait(struct ar8216_priv *priv, u32 reg, u32 mask, u32 val, +ar8216_reg_wait(struct ar8xxx_priv *priv, u32 reg, u32 mask, u32 val, unsigned timeout) { int i; @@ -370,7 +370,7 @@ ar8216_reg_wait(struct ar8216_priv *priv, u32 reg, u32 mask, u32 val, } static int -ar8216_mib_op(struct ar8216_priv *priv, u32 op) +ar8216_mib_op(struct ar8xxx_priv *priv, u32 op) { unsigned mib_func; int ret; @@ -399,19 +399,19 @@ out: } static int -ar8216_mib_capture(struct ar8216_priv *priv) +ar8216_mib_capture(struct ar8xxx_priv *priv) { return ar8216_mib_op(priv, AR8216_MIB_FUNC_CAPTURE); } static int -ar8216_mib_flush(struct ar8216_priv *priv) +ar8216_mib_flush(struct ar8xxx_priv *priv) { return ar8216_mib_op(priv, AR8216_MIB_FUNC_FLUSH); } static void -ar8216_mib_fetch_port_stat(struct ar8216_priv *priv, int port, bool flush) +ar8216_mib_fetch_port_stat(struct ar8xxx_priv *priv, int port, bool flush) { unsigned int base; u64 *mib_stats; @@ -451,7 +451,7 @@ ar8216_mib_fetch_port_stat(struct ar8216_priv *priv, int port, bool flush) } static void -ar8216_read_port_link(struct ar8216_priv *priv, int port, +ar8216_read_port_link(struct ar8xxx_priv *priv, int port, struct switch_port_link *link) { u32 status; @@ -496,7 +496,7 @@ ar8216_read_port_link(struct ar8216_priv *priv, int port, static struct sk_buff * ar8216_mangle_tx(struct net_device *dev, struct sk_buff *skb) { - struct ar8216_priv *priv = dev->phy_ptr; + struct ar8xxx_priv *priv = dev->phy_ptr; unsigned char *buf; if (unlikely(!priv)) @@ -525,7 +525,7 @@ error: static void ar8216_mangle_rx(struct net_device *dev, struct sk_buff *skb) { - struct ar8216_priv *priv; + struct ar8xxx_priv *priv; unsigned char *buf; int port, vlan; @@ -560,7 +560,7 @@ ar8216_mangle_rx(struct net_device *dev, struct sk_buff *skb) } static int -ar8216_wait_bit(struct ar8216_priv *priv, int reg, u32 mask, u32 val) +ar8216_wait_bit(struct ar8xxx_priv *priv, int reg, u32 mask, u32 val) { int timeout = 20; u32 t = 0; @@ -582,7 +582,7 @@ ar8216_wait_bit(struct ar8216_priv *priv, int reg, u32 mask, u32 val) } static void -ar8216_vtu_op(struct ar8216_priv *priv, u32 op, u32 val) +ar8216_vtu_op(struct ar8xxx_priv *priv, u32 op, u32 val) { if (ar8216_wait_bit(priv, AR8216_REG_VTU, AR8216_VTU_ACTIVE, 0)) return; @@ -596,13 +596,13 @@ ar8216_vtu_op(struct ar8216_priv *priv, u32 op, u32 val) } static void -ar8216_vtu_flush(struct ar8216_priv *priv) +ar8216_vtu_flush(struct ar8xxx_priv *priv) { ar8216_vtu_op(priv, AR8216_VTU_OP_FLUSH, 0); } static void -ar8216_vtu_load_vlan(struct ar8216_priv *priv, u32 vid, u32 port_mask) +ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask) { u32 op; @@ -611,7 +611,7 @@ ar8216_vtu_load_vlan(struct ar8216_priv *priv, u32 vid, u32 port_mask) } static int -ar8216_atu_flush(struct ar8216_priv *priv) +ar8216_atu_flush(struct ar8xxx_priv *priv) { int ret; @@ -623,13 +623,13 @@ ar8216_atu_flush(struct ar8216_priv *priv) } static u32 -ar8216_read_port_status(struct ar8216_priv *priv, int port) +ar8216_read_port_status(struct ar8xxx_priv *priv, int port) { return priv->read(priv, AR8216_REG_PORT_STATUS(port)); } static void -ar8216_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, +ar8216_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, u32 members, u32 pvid) { u32 header; @@ -656,13 +656,13 @@ ar8216_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, } static int -ar8216_hw_init(struct ar8216_priv *priv) +ar8216_hw_init(struct ar8xxx_priv *priv) { return 0; } static void -ar8216_init_globals(struct ar8216_priv *priv) +ar8216_init_globals(struct ar8xxx_priv *priv) { /* standard atheros magic */ priv->write(priv, 0x38, 0xc000050e); @@ -672,7 +672,7 @@ ar8216_init_globals(struct ar8216_priv *priv) } static void -ar8216_init_port(struct ar8216_priv *priv, int port) +ar8216_init_port(struct ar8xxx_priv *priv, int port) { /* Enable port learning and tx */ priv->write(priv, AR8216_REG_PORT_CTRL(port), @@ -714,7 +714,7 @@ static const struct ar8xxx_chip ar8216_chip = { }; static void -ar8236_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, +ar8236_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, u32 members, u32 pvid) { ar8216_rmw(priv, AR8216_REG_PORT_CTRL(port), @@ -737,7 +737,7 @@ ar8236_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, } static int -ar8236_hw_init(struct ar8216_priv *priv) +ar8236_hw_init(struct ar8xxx_priv *priv) { int i; struct mii_bus *bus; @@ -760,7 +760,7 @@ ar8236_hw_init(struct ar8216_priv *priv) } static void -ar8236_init_globals(struct ar8216_priv *priv) +ar8236_init_globals(struct ar8xxx_priv *priv) { /* enable jumbo frames */ ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, @@ -788,7 +788,7 @@ static const struct ar8xxx_chip ar8236_chip = { }; static int -ar8316_hw_init(struct ar8216_priv *priv) +ar8316_hw_init(struct ar8xxx_priv *priv) { int i; u32 val, newval; @@ -849,7 +849,7 @@ out: } static void -ar8316_init_globals(struct ar8216_priv *priv) +ar8316_init_globals(struct ar8xxx_priv *priv) { /* standard atheros magic */ priv->write(priv, 0x38, 0xc000050e); @@ -977,7 +977,7 @@ ar8327_get_pad_cfg(struct ar8327_pad_cfg *cfg) } static void -ar8327_phy_fixup(struct ar8216_priv *priv, int phy) +ar8327_phy_fixup(struct ar8xxx_priv *priv, int phy) { switch (priv->chip_rev) { case 1: @@ -1003,7 +1003,7 @@ ar8327_phy_fixup(struct ar8216_priv *priv, int phy) } static int -ar8327_hw_init(struct ar8216_priv *priv) +ar8327_hw_init(struct ar8xxx_priv *priv) { struct ar8327_platform_data *pdata; struct ar8327_led_cfg *led_cfg; @@ -1062,7 +1062,7 @@ ar8327_hw_init(struct ar8216_priv *priv) } static void -ar8327_init_globals(struct ar8216_priv *priv) +ar8327_init_globals(struct ar8xxx_priv *priv) { u32 t; @@ -1087,7 +1087,7 @@ ar8327_init_globals(struct ar8216_priv *priv) } static void -ar8327_config_port(struct ar8216_priv *priv, unsigned int port, +ar8327_config_port(struct ar8xxx_priv *priv, unsigned int port, struct ar8327_port_cfg *cfg) { u32 t; @@ -1119,7 +1119,7 @@ ar8327_config_port(struct ar8216_priv *priv, unsigned int port, } static void -ar8327_init_port(struct ar8216_priv *priv, int port) +ar8327_init_port(struct ar8xxx_priv *priv, int port) { struct ar8327_platform_data *pdata; struct ar8327_port_cfg *cfg; @@ -1151,13 +1151,13 @@ ar8327_init_port(struct ar8216_priv *priv, int port) } static u32 -ar8327_read_port_status(struct ar8216_priv *priv, int port) +ar8327_read_port_status(struct ar8xxx_priv *priv, int port) { return priv->read(priv, AR8327_REG_PORT_STATUS(port)); } static int -ar8327_atu_flush(struct ar8216_priv *priv) +ar8327_atu_flush(struct ar8xxx_priv *priv) { int ret; @@ -1171,7 +1171,7 @@ ar8327_atu_flush(struct ar8216_priv *priv) } static void -ar8327_vtu_op(struct ar8216_priv *priv, u32 op, u32 val) +ar8327_vtu_op(struct ar8xxx_priv *priv, u32 op, u32 val) { if (ar8216_wait_bit(priv, AR8327_REG_VTU_FUNC1, AR8327_VTU_FUNC1_BUSY, 0)) @@ -1185,13 +1185,13 @@ ar8327_vtu_op(struct ar8216_priv *priv, u32 op, u32 val) } static void -ar8327_vtu_flush(struct ar8216_priv *priv) +ar8327_vtu_flush(struct ar8xxx_priv *priv) { ar8327_vtu_op(priv, AR8327_VTU_FUNC1_OP_FLUSH, 0); } static void -ar8327_vtu_load_vlan(struct ar8216_priv *priv, u32 vid, u32 port_mask) +ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask) { u32 op; u32 val; @@ -1217,7 +1217,7 @@ ar8327_vtu_load_vlan(struct ar8216_priv *priv, u32 vid, u32 port_mask) } static void -ar8327_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, +ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, u32 members, u32 pvid) { u32 t; @@ -1270,7 +1270,7 @@ static int ar8216_sw_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); priv->vlan = !!val->value.i; return 0; } @@ -1279,7 +1279,7 @@ static int ar8216_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); val->value.i = priv->vlan; return 0; } @@ -1288,7 +1288,7 @@ ar8216_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, static int ar8216_sw_set_pvid(struct switch_dev *dev, int port, int vlan) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); /* make sure no invalid PVIDs get set */ @@ -1302,7 +1302,7 @@ ar8216_sw_set_pvid(struct switch_dev *dev, int port, int vlan) static int ar8216_sw_get_pvid(struct switch_dev *dev, int port, int *vlan) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); *vlan = priv->pvid[port]; return 0; } @@ -1311,7 +1311,7 @@ static int ar8216_sw_set_vid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); priv->vlan_id[val->port_vlan] = val->value.i; return 0; } @@ -1320,7 +1320,7 @@ static int ar8216_sw_get_vid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); val->value.i = priv->vlan_id[val->port_vlan]; return 0; } @@ -1329,7 +1329,7 @@ static int ar8216_sw_get_port_link(struct switch_dev *dev, int port, struct switch_port_link *link) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); ar8216_read_port_link(priv, port, link); return 0; @@ -1338,7 +1338,7 @@ ar8216_sw_get_port_link(struct switch_dev *dev, int port, static int ar8216_sw_get_ports(struct switch_dev *dev, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); u8 ports = priv->vlan_table[val->port_vlan]; int i; @@ -1362,7 +1362,7 @@ ar8216_sw_get_ports(struct switch_dev *dev, struct switch_val *val) static int ar8216_sw_set_ports(struct switch_dev *dev, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); u8 *vt = &priv->vlan_table[val->port_vlan]; int i, j; @@ -1393,7 +1393,7 @@ ar8216_sw_set_ports(struct switch_dev *dev, struct switch_val *val) static int ar8216_sw_hw_apply(struct switch_dev *dev) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); u8 portmask[AR8X16_MAX_PORTS]; int i, j; @@ -1460,12 +1460,12 @@ ar8216_sw_hw_apply(struct switch_dev *dev) static int ar8216_sw_reset_switch(struct switch_dev *dev) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); int i; mutex_lock(&priv->reg_mutex); - memset(&priv->vlan, 0, sizeof(struct ar8216_priv) - - offsetof(struct ar8216_priv, vlan)); + memset(&priv->vlan, 0, sizeof(struct ar8xxx_priv) - + offsetof(struct ar8xxx_priv, vlan)); for (i = 0; i < AR8X16_MAX_VLANS; i++) priv->vlan_id[i] = i; @@ -1485,7 +1485,7 @@ ar8216_sw_set_reset_mibs(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); unsigned int len; int ret; @@ -1513,7 +1513,7 @@ ar8216_sw_set_port_reset_mib(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); int port; int ret; @@ -1543,7 +1543,7 @@ ar8216_sw_get_port_mib(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { - struct ar8216_priv *priv = swdev_to_ar8216(dev); + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); const struct ar8xxx_chip *chip = priv->chip; u64 *mib_stats; int port; @@ -1654,7 +1654,7 @@ static const struct switch_dev_ops ar8216_sw_ops = { }; static int -ar8216_id_chip(struct ar8216_priv *priv) +ar8216_id_chip(struct ar8xxx_priv *priv) { u32 val; u16 id; @@ -1707,10 +1707,10 @@ ar8216_id_chip(struct ar8216_priv *priv) static void ar8xxx_mib_work_func(struct work_struct *work) { - struct ar8216_priv *priv; + struct ar8xxx_priv *priv; int err; - priv = container_of(work, struct ar8216_priv, mib_work.work); + priv = container_of(work, struct ar8xxx_priv, mib_work.work); mutex_lock(&priv->mib_lock); @@ -1731,7 +1731,7 @@ next_port: } static int -ar8xxx_mib_init(struct ar8216_priv *priv) +ar8xxx_mib_init(struct ar8xxx_priv *priv) { unsigned int len; @@ -1751,7 +1751,7 @@ ar8xxx_mib_init(struct ar8216_priv *priv) } static void -ar8xxx_mib_start(struct ar8216_priv *priv) +ar8xxx_mib_start(struct ar8xxx_priv *priv) { if (!ar8xxx_has_mib_counters(priv)) return; @@ -1761,7 +1761,7 @@ ar8xxx_mib_start(struct ar8216_priv *priv) } static void -ar8xxx_mib_stop(struct ar8216_priv *priv) +ar8xxx_mib_stop(struct ar8xxx_priv *priv) { if (!ar8xxx_has_mib_counters(priv)) return; @@ -1769,12 +1769,12 @@ ar8xxx_mib_stop(struct ar8216_priv *priv) cancel_delayed_work(&priv->mib_work); } -static struct ar8216_priv * +static struct ar8xxx_priv * ar8xxx_create(void) { - struct ar8216_priv *priv; + struct ar8xxx_priv *priv; - priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL); + priv = kzalloc(sizeof(struct ar8xxx_priv), GFP_KERNEL); if (priv == NULL) return NULL; @@ -1786,16 +1786,16 @@ ar8xxx_create(void) } static void -ar8xxx_free(struct ar8216_priv *priv) +ar8xxx_free(struct ar8xxx_priv *priv) { kfree(priv->mib_stats); kfree(priv); } -static struct ar8216_priv * +static struct ar8xxx_priv * ar8xxx_create_mii(struct mii_bus *bus) { - struct ar8216_priv *priv; + struct ar8xxx_priv *priv; priv = ar8xxx_create(); if (priv) { @@ -1808,7 +1808,7 @@ ar8xxx_create_mii(struct mii_bus *bus) } static int -ar8xxx_probe_switch(struct ar8216_priv *priv) +ar8xxx_probe_switch(struct ar8xxx_priv *priv) { struct switch_dev *swdev; int ret; @@ -1849,7 +1849,7 @@ ar8xxx_probe_switch(struct ar8216_priv *priv) static int ar8216_config_init(struct phy_device *phydev) { - struct ar8216_priv *priv = phydev->priv; + struct ar8xxx_priv *priv = phydev->priv; struct net_device *dev = phydev->attached_dev; int ret; @@ -1899,7 +1899,7 @@ ar8216_config_init(struct phy_device *phydev) static int ar8216_read_status(struct phy_device *phydev) { - struct ar8216_priv *priv = phydev->priv; + struct ar8xxx_priv *priv = phydev->priv; struct switch_port_link link; int ret; @@ -1988,7 +1988,7 @@ ar8xxx_is_possible(struct mii_bus *bus) static int ar8216_probe(struct phy_device *phydev) { - struct ar8216_priv *priv; + struct ar8xxx_priv *priv; struct switch_dev *swdev; int ret; @@ -2072,7 +2072,7 @@ ar8216_detach(struct phy_device *phydev) static void ar8216_remove(struct phy_device *phydev) { - struct ar8216_priv *priv = phydev->priv; + struct ar8xxx_priv *priv = phydev->priv; if (WARN_ON(!priv)) return; -- cgit v1.2.3 From 9bb2a18ead3153d57a4e3ef169c04315a6b171fa Mon Sep 17 00:00:00 2001 From: juhosg Date: Sun, 17 Feb 2013 12:48:25 +0000 Subject: generic: ar8216: cleanup function/variable names Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35642 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 220 ++++++++++----------- 1 file changed, 110 insertions(+), 110 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 0e61767b9..1d77341a8 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -254,7 +254,7 @@ split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page) } static u32 -ar8216_mii_read(struct ar8xxx_priv *priv, int reg) +ar8xxx_mii_read(struct ar8xxx_priv *priv, int reg) { struct mii_bus *bus = priv->mii_bus; u16 r1, r2, page; @@ -275,7 +275,7 @@ ar8216_mii_read(struct ar8xxx_priv *priv, int reg) } static void -ar8216_mii_write(struct ar8xxx_priv *priv, int reg, u32 val) +ar8xxx_mii_write(struct ar8xxx_priv *priv, int reg, u32 val) { struct mii_bus *bus = priv->mii_bus; u16 r1, r2, r3; @@ -301,7 +301,7 @@ ar8216_mii_write(struct ar8xxx_priv *priv, int reg, u32 val) } static void -ar8216_phy_dbg_write(struct ar8xxx_priv *priv, int phy_addr, +ar8xxx_phy_dbg_write(struct ar8xxx_priv *priv, int phy_addr, u16 dbg_addr, u16 dbg_data) { struct mii_bus *bus = priv->mii_bus; @@ -313,7 +313,7 @@ ar8216_phy_dbg_write(struct ar8xxx_priv *priv, int phy_addr, } static void -ar8216_phy_mmd_write(struct ar8xxx_priv *priv, int phy_addr, u16 addr, u16 data) +ar8xxx_phy_mmd_write(struct ar8xxx_priv *priv, int phy_addr, u16 addr, u16 data) { struct mii_bus *bus = priv->mii_bus; @@ -324,7 +324,7 @@ ar8216_phy_mmd_write(struct ar8xxx_priv *priv, int phy_addr, u16 addr, u16 data) } static u32 -ar8216_rmw(struct ar8xxx_priv *priv, int reg, u32 mask, u32 val) +ar8xxx_rmw(struct ar8xxx_priv *priv, int reg, u32 mask, u32 val) { u32 v; @@ -339,7 +339,7 @@ ar8216_rmw(struct ar8xxx_priv *priv, int reg, u32 mask, u32 val) } static inline void -ar8216_reg_set(struct ar8xxx_priv *priv, int reg, u32 val) +ar8xxx_reg_set(struct ar8xxx_priv *priv, int reg, u32 val) { u32 v; @@ -351,7 +351,7 @@ ar8216_reg_set(struct ar8xxx_priv *priv, int reg, u32 val) } static int -ar8216_reg_wait(struct ar8xxx_priv *priv, u32 reg, u32 mask, u32 val, +ar8xxx_reg_wait(struct ar8xxx_priv *priv, u32 reg, u32 mask, u32 val, unsigned timeout) { int i; @@ -370,7 +370,7 @@ ar8216_reg_wait(struct ar8xxx_priv *priv, u32 reg, u32 mask, u32 val, } static int -ar8216_mib_op(struct ar8xxx_priv *priv, u32 op) +ar8xxx_mib_op(struct ar8xxx_priv *priv, u32 op) { unsigned mib_func; int ret; @@ -384,11 +384,11 @@ ar8216_mib_op(struct ar8xxx_priv *priv, u32 op) mutex_lock(&priv->reg_mutex); /* Capture the hardware statistics for all ports */ - ar8216_rmw(priv, mib_func, AR8216_MIB_FUNC, (op << AR8216_MIB_FUNC_S)); + ar8xxx_rmw(priv, mib_func, AR8216_MIB_FUNC, (op << AR8216_MIB_FUNC_S)); mutex_unlock(&priv->reg_mutex); /* Wait for the capturing to complete. */ - ret = ar8216_reg_wait(priv, mib_func, AR8216_MIB_BUSY, 0, 10); + ret = ar8xxx_reg_wait(priv, mib_func, AR8216_MIB_BUSY, 0, 10); if (ret) goto out; @@ -399,19 +399,19 @@ out: } static int -ar8216_mib_capture(struct ar8xxx_priv *priv) +ar8xxx_mib_capture(struct ar8xxx_priv *priv) { - return ar8216_mib_op(priv, AR8216_MIB_FUNC_CAPTURE); + return ar8xxx_mib_op(priv, AR8216_MIB_FUNC_CAPTURE); } static int -ar8216_mib_flush(struct ar8xxx_priv *priv) +ar8xxx_mib_flush(struct ar8xxx_priv *priv) { - return ar8216_mib_op(priv, AR8216_MIB_FUNC_FLUSH); + return ar8xxx_mib_op(priv, AR8216_MIB_FUNC_FLUSH); } static void -ar8216_mib_fetch_port_stat(struct ar8xxx_priv *priv, int port, bool flush) +ar8xxx_mib_fetch_port_stat(struct ar8xxx_priv *priv, int port, bool flush) { unsigned int base; u64 *mib_stats; @@ -639,7 +639,7 @@ ar8216_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, else header = 0; - ar8216_rmw(priv, AR8216_REG_PORT_CTRL(port), + ar8xxx_rmw(priv, AR8216_REG_PORT_CTRL(port), AR8216_PORT_CTRL_LEARN | AR8216_PORT_CTRL_VLAN_MODE | AR8216_PORT_CTRL_SINGLE_VLAN | AR8216_PORT_CTRL_STATE | AR8216_PORT_CTRL_HEADER | AR8216_PORT_CTRL_LEARN_LOCK, @@ -647,7 +647,7 @@ ar8216_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, (egress << AR8216_PORT_CTRL_VLAN_MODE_S) | (AR8216_PORT_STATE_FORWARD << AR8216_PORT_CTRL_STATE_S)); - ar8216_rmw(priv, AR8216_REG_PORT_VLAN(port), + ar8xxx_rmw(priv, AR8216_REG_PORT_VLAN(port), AR8216_PORT_VLAN_DEST_PORTS | AR8216_PORT_VLAN_MODE | AR8216_PORT_VLAN_DEFAULT_ID, (members << AR8216_PORT_VLAN_DEST_PORTS_S) | @@ -667,7 +667,7 @@ ar8216_init_globals(struct ar8xxx_priv *priv) /* standard atheros magic */ priv->write(priv, 0x38, 0xc000050e); - ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, + ar8xxx_rmw(priv, AR8216_REG_GLOBAL_CTRL, AR8216_GCTRL_MTU, 1518 + 8 + 2); } @@ -717,7 +717,7 @@ static void ar8236_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, u32 members, u32 pvid) { - ar8216_rmw(priv, AR8216_REG_PORT_CTRL(port), + ar8xxx_rmw(priv, AR8216_REG_PORT_CTRL(port), AR8216_PORT_CTRL_LEARN | AR8216_PORT_CTRL_VLAN_MODE | AR8216_PORT_CTRL_SINGLE_VLAN | AR8216_PORT_CTRL_STATE | AR8216_PORT_CTRL_HEADER | AR8216_PORT_CTRL_LEARN_LOCK, @@ -725,11 +725,11 @@ ar8236_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, (egress << AR8216_PORT_CTRL_VLAN_MODE_S) | (AR8216_PORT_STATE_FORWARD << AR8216_PORT_CTRL_STATE_S)); - ar8216_rmw(priv, AR8236_REG_PORT_VLAN(port), + ar8xxx_rmw(priv, AR8236_REG_PORT_VLAN(port), AR8236_PORT_VLAN_DEFAULT_ID, (pvid << AR8236_PORT_VLAN_DEFAULT_ID_S)); - ar8216_rmw(priv, AR8236_REG_PORT_VLAN2(port), + ar8xxx_rmw(priv, AR8236_REG_PORT_VLAN2(port), AR8236_PORT_VLAN2_VLAN_MODE | AR8236_PORT_VLAN2_MEMBER, (ingress << AR8236_PORT_VLAN2_VLAN_MODE_S) | @@ -763,11 +763,11 @@ static void ar8236_init_globals(struct ar8xxx_priv *priv) { /* enable jumbo frames */ - ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, + ar8xxx_rmw(priv, AR8216_REG_GLOBAL_CTRL, AR8316_GCTRL_MTU, 9018 + 8 + 2); /* Enable MIB counters */ - ar8216_rmw(priv, AR8216_REG_MIB_FUNC, AR8216_MIB_FUNC | AR8236_MIB_EN, + ar8xxx_rmw(priv, AR8216_REG_MIB_FUNC, AR8216_MIB_FUNC | AR8236_MIB_EN, (AR8216_MIB_FUNC_NO_OP << AR8216_MIB_FUNC_S) | AR8236_MIB_EN); } @@ -823,11 +823,11 @@ ar8316_hw_init(struct ar8xxx_priv *priv) if (priv->port4_phy && priv->phy->interface == PHY_INTERFACE_MODE_RGMII) { /* work around for phy4 rgmii mode */ - ar8216_phy_dbg_write(priv, 4, 0x12, 0x480c); + ar8xxx_phy_dbg_write(priv, 4, 0x12, 0x480c); /* rx delay */ - ar8216_phy_dbg_write(priv, 4, 0x0, 0x824e); + ar8xxx_phy_dbg_write(priv, 4, 0x0, 0x824e); /* tx delay */ - ar8216_phy_dbg_write(priv, 4, 0x5, 0x3d47); + ar8xxx_phy_dbg_write(priv, 4, 0x5, 0x3d47); msleep(1000); } @@ -858,11 +858,11 @@ ar8316_init_globals(struct ar8xxx_priv *priv) priv->write(priv, AR8216_REG_FLOOD_MASK, 0x003f003f); /* enable jumbo frames */ - ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, + ar8xxx_rmw(priv, AR8216_REG_GLOBAL_CTRL, AR8316_GCTRL_MTU, 9018 + 8 + 2); /* Enable MIB counters */ - ar8216_rmw(priv, AR8216_REG_MIB_FUNC, AR8216_MIB_FUNC | AR8236_MIB_EN, + ar8xxx_rmw(priv, AR8216_REG_MIB_FUNC, AR8216_MIB_FUNC | AR8236_MIB_EN, (AR8216_MIB_FUNC_NO_OP << AR8216_MIB_FUNC_S) | AR8236_MIB_EN); } @@ -982,22 +982,22 @@ ar8327_phy_fixup(struct ar8xxx_priv *priv, int phy) switch (priv->chip_rev) { case 1: /* For 100M waveform */ - ar8216_phy_dbg_write(priv, phy, 0, 0x02ea); + ar8xxx_phy_dbg_write(priv, phy, 0, 0x02ea); /* Turn on Gigabit clock */ - ar8216_phy_dbg_write(priv, phy, 0x3d, 0x68a0); + ar8xxx_phy_dbg_write(priv, phy, 0x3d, 0x68a0); break; case 2: - ar8216_phy_mmd_write(priv, phy, 0x7, 0x3c); - ar8216_phy_mmd_write(priv, phy, 0x4007, 0x0); + ar8xxx_phy_mmd_write(priv, phy, 0x7, 0x3c); + ar8xxx_phy_mmd_write(priv, phy, 0x4007, 0x0); /* fallthrough */ case 4: - ar8216_phy_mmd_write(priv, phy, 0x3, 0x800d); - ar8216_phy_mmd_write(priv, phy, 0x4003, 0x803f); + ar8xxx_phy_mmd_write(priv, phy, 0x3, 0x800d); + ar8xxx_phy_mmd_write(priv, phy, 0x4003, 0x803f); - ar8216_phy_dbg_write(priv, phy, 0x3d, 0x6860); - ar8216_phy_dbg_write(priv, phy, 0x5, 0x2c46); - ar8216_phy_dbg_write(priv, phy, 0x3c, 0x6000); + ar8xxx_phy_dbg_write(priv, phy, 0x3d, 0x6860); + ar8xxx_phy_dbg_write(priv, phy, 0x5, 0x2c46); + ar8xxx_phy_dbg_write(priv, phy, 0x3c, 0x6000); break; } } @@ -1078,11 +1078,11 @@ ar8327_init_globals(struct ar8xxx_priv *priv) priv->write(priv, AR8327_REG_FWD_CTRL1, t); /* setup MTU */ - ar8216_rmw(priv, AR8327_REG_MAX_FRAME_SIZE, + ar8xxx_rmw(priv, AR8327_REG_MAX_FRAME_SIZE, AR8327_MAX_FRAME_SIZE_MTU, 1518 + 8 + 2); /* Enable MIB counters */ - ar8216_reg_set(priv, AR8327_REG_MODULE_EN, + ar8xxx_reg_set(priv, AR8327_REG_MODULE_EN, AR8327_MODULE_EN_MIB); } @@ -1267,7 +1267,7 @@ static const struct ar8xxx_chip ar8327_chip = { }; static int -ar8216_sw_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, +ar8xxx_sw_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); @@ -1276,7 +1276,7 @@ ar8216_sw_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, } static int -ar8216_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, +ar8xxx_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); @@ -1286,7 +1286,7 @@ ar8216_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, static int -ar8216_sw_set_pvid(struct switch_dev *dev, int port, int vlan) +ar8xxx_sw_set_pvid(struct switch_dev *dev, int port, int vlan) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); @@ -1300,7 +1300,7 @@ ar8216_sw_set_pvid(struct switch_dev *dev, int port, int vlan) } static int -ar8216_sw_get_pvid(struct switch_dev *dev, int port, int *vlan) +ar8xxx_sw_get_pvid(struct switch_dev *dev, int port, int *vlan) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); *vlan = priv->pvid[port]; @@ -1308,7 +1308,7 @@ ar8216_sw_get_pvid(struct switch_dev *dev, int port, int *vlan) } static int -ar8216_sw_set_vid(struct switch_dev *dev, const struct switch_attr *attr, +ar8xxx_sw_set_vid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); @@ -1317,7 +1317,7 @@ ar8216_sw_set_vid(struct switch_dev *dev, const struct switch_attr *attr, } static int -ar8216_sw_get_vid(struct switch_dev *dev, const struct switch_attr *attr, +ar8xxx_sw_get_vid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); @@ -1326,7 +1326,7 @@ ar8216_sw_get_vid(struct switch_dev *dev, const struct switch_attr *attr, } static int -ar8216_sw_get_port_link(struct switch_dev *dev, int port, +ar8xxx_sw_get_port_link(struct switch_dev *dev, int port, struct switch_port_link *link) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); @@ -1336,7 +1336,7 @@ ar8216_sw_get_port_link(struct switch_dev *dev, int port, } static int -ar8216_sw_get_ports(struct switch_dev *dev, struct switch_val *val) +ar8xxx_sw_get_ports(struct switch_dev *dev, struct switch_val *val) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); u8 ports = priv->vlan_table[val->port_vlan]; @@ -1360,7 +1360,7 @@ ar8216_sw_get_ports(struct switch_dev *dev, struct switch_val *val) } static int -ar8216_sw_set_ports(struct switch_dev *dev, struct switch_val *val) +ar8xxx_sw_set_ports(struct switch_dev *dev, struct switch_val *val) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); u8 *vt = &priv->vlan_table[val->port_vlan]; @@ -1391,7 +1391,7 @@ ar8216_sw_set_ports(struct switch_dev *dev, struct switch_val *val) } static int -ar8216_sw_hw_apply(struct switch_dev *dev) +ar8xxx_sw_hw_apply(struct switch_dev *dev) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); u8 portmask[AR8X16_MAX_PORTS]; @@ -1458,7 +1458,7 @@ ar8216_sw_hw_apply(struct switch_dev *dev) } static int -ar8216_sw_reset_switch(struct switch_dev *dev) +ar8xxx_sw_reset_switch(struct switch_dev *dev) { struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); int i; @@ -1477,11 +1477,11 @@ ar8216_sw_reset_switch(struct switch_dev *dev) priv->chip->init_globals(priv); mutex_unlock(&priv->reg_mutex); - return ar8216_sw_hw_apply(dev); + return ar8xxx_sw_hw_apply(dev); } static int -ar8216_sw_set_reset_mibs(struct switch_dev *dev, +ar8xxx_sw_set_reset_mibs(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { @@ -1497,7 +1497,7 @@ ar8216_sw_set_reset_mibs(struct switch_dev *dev, len = priv->dev.ports * priv->chip->num_mibs * sizeof(*priv->mib_stats); memset(priv->mib_stats, '\0', len); - ret = ar8216_mib_flush(priv); + ret = ar8xxx_mib_flush(priv); if (ret) goto unlock; @@ -1509,7 +1509,7 @@ unlock: } static int -ar8216_sw_set_port_reset_mib(struct switch_dev *dev, +ar8xxx_sw_set_port_reset_mib(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { @@ -1525,11 +1525,11 @@ ar8216_sw_set_port_reset_mib(struct switch_dev *dev, return -EINVAL; mutex_lock(&priv->mib_lock); - ret = ar8216_mib_capture(priv); + ret = ar8xxx_mib_capture(priv); if (ret) goto unlock; - ar8216_mib_fetch_port_stat(priv, port, true); + ar8xxx_mib_fetch_port_stat(priv, port, true); ret = 0; @@ -1539,7 +1539,7 @@ unlock: } static int -ar8216_sw_get_port_mib(struct switch_dev *dev, +ar8xxx_sw_get_port_mib(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { @@ -1559,11 +1559,11 @@ ar8216_sw_get_port_mib(struct switch_dev *dev, return -EINVAL; mutex_lock(&priv->mib_lock); - ret = ar8216_mib_capture(priv); + ret = ar8xxx_mib_capture(priv); if (ret) goto unlock; - ar8216_mib_fetch_port_stat(priv, port, false); + ar8xxx_mib_fetch_port_stat(priv, port, false); len += snprintf(buf + len, sizeof(priv->buf) - len, "Port %d MIB counters\n", @@ -1586,75 +1586,75 @@ unlock: return ret; } -static struct switch_attr ar8216_globals[] = { +static struct switch_attr ar8xxx_sw_attr_globals[] = { { .type = SWITCH_TYPE_INT, .name = "enable_vlan", .description = "Enable VLAN mode", - .set = ar8216_sw_set_vlan, - .get = ar8216_sw_get_vlan, + .set = ar8xxx_sw_set_vlan, + .get = ar8xxx_sw_get_vlan, .max = 1 }, { .type = SWITCH_TYPE_NOVAL, .name = "reset_mibs", .description = "Reset all MIB counters", - .set = ar8216_sw_set_reset_mibs, + .set = ar8xxx_sw_set_reset_mibs, }, }; -static struct switch_attr ar8216_port[] = { +static struct switch_attr ar8xxx_sw_attr_port[] = { { .type = SWITCH_TYPE_NOVAL, .name = "reset_mib", .description = "Reset single port MIB counters", - .set = ar8216_sw_set_port_reset_mib, + .set = ar8xxx_sw_set_port_reset_mib, }, { .type = SWITCH_TYPE_STRING, .name = "mib", .description = "Get port's MIB counters", .set = NULL, - .get = ar8216_sw_get_port_mib, + .get = ar8xxx_sw_get_port_mib, }, }; -static struct switch_attr ar8216_vlan[] = { +static struct switch_attr ar8xxx_sw_attr_vlan[] = { { .type = SWITCH_TYPE_INT, .name = "vid", .description = "VLAN ID (0-4094)", - .set = ar8216_sw_set_vid, - .get = ar8216_sw_get_vid, + .set = ar8xxx_sw_set_vid, + .get = ar8xxx_sw_get_vid, .max = 4094, }, }; -static const struct switch_dev_ops ar8216_sw_ops = { +static const struct switch_dev_ops ar8xxx_sw_ops = { .attr_global = { - .attr = ar8216_globals, - .n_attr = ARRAY_SIZE(ar8216_globals), + .attr = ar8xxx_sw_attr_globals, + .n_attr = ARRAY_SIZE(ar8xxx_sw_attr_globals), }, .attr_port = { - .attr = ar8216_port, - .n_attr = ARRAY_SIZE(ar8216_port), + .attr = ar8xxx_sw_attr_port, + .n_attr = ARRAY_SIZE(ar8xxx_sw_attr_port), }, .attr_vlan = { - .attr = ar8216_vlan, - .n_attr = ARRAY_SIZE(ar8216_vlan), + .attr = ar8xxx_sw_attr_vlan, + .n_attr = ARRAY_SIZE(ar8xxx_sw_attr_vlan), }, - .get_port_pvid = ar8216_sw_get_pvid, - .set_port_pvid = ar8216_sw_set_pvid, - .get_vlan_ports = ar8216_sw_get_ports, - .set_vlan_ports = ar8216_sw_set_ports, - .apply_config = ar8216_sw_hw_apply, - .reset_switch = ar8216_sw_reset_switch, - .get_port_link = ar8216_sw_get_port_link, + .get_port_pvid = ar8xxx_sw_get_pvid, + .set_port_pvid = ar8xxx_sw_set_pvid, + .get_vlan_ports = ar8xxx_sw_get_ports, + .set_vlan_ports = ar8xxx_sw_set_ports, + .apply_config = ar8xxx_sw_hw_apply, + .reset_switch = ar8xxx_sw_reset_switch, + .get_port_link = ar8xxx_sw_get_port_link, }; static int -ar8216_id_chip(struct ar8xxx_priv *priv) +ar8xxx_id_chip(struct ar8xxx_priv *priv) { u32 val; u16 id; @@ -1714,11 +1714,11 @@ ar8xxx_mib_work_func(struct work_struct *work) mutex_lock(&priv->mib_lock); - err = ar8216_mib_capture(priv); + err = ar8xxx_mib_capture(priv); if (err) goto next_port; - ar8216_mib_fetch_port_stat(priv, priv->mib_next_port, false); + ar8xxx_mib_fetch_port_stat(priv, priv->mib_next_port, false); next_port: priv->mib_next_port++; @@ -1800,8 +1800,8 @@ ar8xxx_create_mii(struct mii_bus *bus) priv = ar8xxx_create(); if (priv) { priv->mii_bus = bus; - priv->read = ar8216_mii_read; - priv->write = ar8216_mii_write; + priv->read = ar8xxx_mii_read; + priv->write = ar8xxx_mii_write; } return priv; @@ -1813,13 +1813,13 @@ ar8xxx_probe_switch(struct ar8xxx_priv *priv) struct switch_dev *swdev; int ret; - ret = ar8216_id_chip(priv); + ret = ar8xxx_id_chip(priv); if (ret) return ret; swdev = &priv->dev; swdev->cpu_port = AR8216_PORT_CPU; - swdev->ops = &ar8216_sw_ops; + swdev->ops = &ar8xxx_sw_ops; if (chip_is_ar8316(priv)) { swdev->name = "Atheros AR8316"; @@ -1847,7 +1847,7 @@ ar8xxx_probe_switch(struct ar8xxx_priv *priv) } static int -ar8216_config_init(struct phy_device *phydev) +ar8xxx_phy_config_init(struct phy_device *phydev) { struct ar8xxx_priv *priv = phydev->priv; struct net_device *dev = phydev->attached_dev; @@ -1877,7 +1877,7 @@ ar8216_config_init(struct phy_device *phydev) if (ret) return ret; - ret = ar8216_sw_reset_switch(&priv->dev); + ret = ar8xxx_sw_reset_switch(&priv->dev); if (ret) return ret; @@ -1897,7 +1897,7 @@ ar8216_config_init(struct phy_device *phydev) } static int -ar8216_read_status(struct phy_device *phydev) +ar8xxx_phy_read_status(struct phy_device *phydev) { struct ar8xxx_priv *priv = phydev->priv; struct switch_port_link link; @@ -1939,7 +1939,7 @@ ar8216_read_status(struct phy_device *phydev) } static int -ar8216_config_aneg(struct phy_device *phydev) +ar8xxx_phy_config_aneg(struct phy_device *phydev) { if (phydev->addr == 0) return 0; @@ -1986,7 +1986,7 @@ ar8xxx_is_possible(struct mii_bus *bus) } static int -ar8216_probe(struct phy_device *phydev) +ar8xxx_phy_probe(struct phy_device *phydev) { struct ar8xxx_priv *priv; struct switch_dev *swdev; @@ -2056,7 +2056,7 @@ unlock: } static void -ar8216_detach(struct phy_device *phydev) +ar8xxx_phy_detach(struct phy_device *phydev) { struct net_device *dev = phydev->attached_dev; @@ -2070,7 +2070,7 @@ ar8216_detach(struct phy_device *phydev) } static void -ar8216_remove(struct phy_device *phydev) +ar8xxx_phy_remove(struct phy_device *phydev) { struct ar8xxx_priv *priv = phydev->priv; @@ -2090,33 +2090,33 @@ ar8216_remove(struct phy_device *phydev) ar8xxx_free(priv); } -static struct phy_driver ar8216_driver = { +static struct phy_driver ar8xxx_phy_driver = { .phy_id = 0x004d0000, .name = "Atheros AR8216/AR8236/AR8316", .phy_id_mask = 0xffff0000, .features = PHY_BASIC_FEATURES, - .probe = ar8216_probe, - .remove = ar8216_remove, - .detach = ar8216_detach, - .config_init = &ar8216_config_init, - .config_aneg = &ar8216_config_aneg, - .read_status = &ar8216_read_status, + .probe = ar8xxx_phy_probe, + .remove = ar8xxx_phy_remove, + .detach = ar8xxx_phy_detach, + .config_init = ar8xxx_phy_config_init, + .config_aneg = ar8xxx_phy_config_aneg, + .read_status = ar8xxx_phy_read_status, .driver = { .owner = THIS_MODULE }, }; int __init -ar8216_init(void) +ar8xxx_init(void) { - return phy_driver_register(&ar8216_driver); + return phy_driver_register(&ar8xxx_phy_driver); } void __exit -ar8216_exit(void) +ar8xxx_exit(void) { - phy_driver_unregister(&ar8216_driver); + phy_driver_unregister(&ar8xxx_phy_driver); } -module_init(ar8216_init); -module_exit(ar8216_exit); +module_init(ar8xxx_init); +module_exit(ar8xxx_exit); MODULE_LICENSE("GPL"); -- cgit v1.2.3 From 884b112524ad5a6879f592badc0733acd658338b Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 15:49:55 +0000 Subject: generic: ar8216: remove superfluous pdata checks The presence of the platform data is already verified in ar8327_hw_init, and the driver does not start without that anyway. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36042 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 1d77341a8..7cb5186f3 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1127,9 +1127,9 @@ ar8327_init_port(struct ar8xxx_priv *priv, int port) pdata = priv->phy->dev.platform_data; - if (pdata && port == AR8216_PORT_CPU) + if (port == AR8216_PORT_CPU) cfg = &pdata->port0_cfg; - else if (pdata && port == 6) + else if (port == 6) cfg = &pdata->port6_cfg; else cfg = NULL; -- cgit v1.2.3 From 1f6aeadc29ac036492b1b3246f5dc8c8aab1d917 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 15:49:57 +0000 Subject: generic: ar8216: simplify and rename ar8327_config_port Return with the PORT_STATUS register value instead of writing that directly into the corresponding register. Also rename the function to ar8327_get_port_init_status. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36043 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 24 ++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 7cb5186f3..6454b2b21 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1086,17 +1086,13 @@ ar8327_init_globals(struct ar8xxx_priv *priv) AR8327_MODULE_EN_MIB); } -static void -ar8327_config_port(struct ar8xxx_priv *priv, unsigned int port, - struct ar8327_port_cfg *cfg) +static u32 +ar8327_get_port_init_status(struct ar8327_port_cfg *cfg) { u32 t; - if (!cfg || !cfg->force_link) { - priv->write(priv, AR8327_REG_PORT_STATUS(port), - AR8216_PORT_STATUS_LINK_AUTO); - return; - } + if (!cfg->force_link) + return AR8216_PORT_STATUS_LINK_AUTO; t = AR8216_PORT_STATUS_TXMAC | AR8216_PORT_STATUS_RXMAC; t |= cfg->duplex ? AR8216_PORT_STATUS_DUPLEX : 0; @@ -1115,27 +1111,25 @@ ar8327_config_port(struct ar8xxx_priv *priv, unsigned int port, break; } - priv->write(priv, AR8327_REG_PORT_STATUS(port), t); + return t; } static void ar8327_init_port(struct ar8xxx_priv *priv, int port) { struct ar8327_platform_data *pdata; - struct ar8327_port_cfg *cfg; u32 t; pdata = priv->phy->dev.platform_data; if (port == AR8216_PORT_CPU) - cfg = &pdata->port0_cfg; + t = ar8327_get_port_init_status(&pdata->port0_cfg); else if (port == 6) - cfg = &pdata->port6_cfg; + t = ar8327_get_port_init_status(&pdata->port6_cfg); else - cfg = NULL; - - ar8327_config_port(priv, port, cfg); + t = AR8216_PORT_STATUS_LINK_AUTO; + priv->write(priv, AR8327_REG_PORT_STATUS(port), t); priv->write(priv, AR8327_REG_PORT_HEADER(port), 0); t = 1 << AR8327_PORT_VLAN0_DEF_SVID_S; -- cgit v1.2.3 From 4fa4daa61447b1db0841fb45e4f8d45761e08c12 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 15:50:00 +0000 Subject: generic: ar8216: move the ar8327_get_port_init_status function It will be used in ar8327_probe routine. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36044 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 56 +++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 6454b2b21..47067c9e6 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1002,6 +1002,34 @@ ar8327_phy_fixup(struct ar8xxx_priv *priv, int phy) } } +static u32 +ar8327_get_port_init_status(struct ar8327_port_cfg *cfg) +{ + u32 t; + + if (!cfg->force_link) + return AR8216_PORT_STATUS_LINK_AUTO; + + t = AR8216_PORT_STATUS_TXMAC | AR8216_PORT_STATUS_RXMAC; + t |= cfg->duplex ? AR8216_PORT_STATUS_DUPLEX : 0; + t |= cfg->rxpause ? AR8216_PORT_STATUS_RXFLOW : 0; + t |= cfg->txpause ? AR8216_PORT_STATUS_TXFLOW : 0; + + switch (cfg->speed) { + case AR8327_PORT_SPEED_10: + t |= AR8216_PORT_SPEED_10M; + break; + case AR8327_PORT_SPEED_100: + t |= AR8216_PORT_SPEED_100M; + break; + case AR8327_PORT_SPEED_1000: + t |= AR8216_PORT_SPEED_1000M; + break; + } + + return t; +} + static int ar8327_hw_init(struct ar8xxx_priv *priv) { @@ -1086,34 +1114,6 @@ ar8327_init_globals(struct ar8xxx_priv *priv) AR8327_MODULE_EN_MIB); } -static u32 -ar8327_get_port_init_status(struct ar8327_port_cfg *cfg) -{ - u32 t; - - if (!cfg->force_link) - return AR8216_PORT_STATUS_LINK_AUTO; - - t = AR8216_PORT_STATUS_TXMAC | AR8216_PORT_STATUS_RXMAC; - t |= cfg->duplex ? AR8216_PORT_STATUS_DUPLEX : 0; - t |= cfg->rxpause ? AR8216_PORT_STATUS_RXFLOW : 0; - t |= cfg->txpause ? AR8216_PORT_STATUS_TXFLOW : 0; - - switch (cfg->speed) { - case AR8327_PORT_SPEED_10: - t |= AR8216_PORT_SPEED_10M; - break; - case AR8327_PORT_SPEED_100: - t |= AR8216_PORT_SPEED_100M; - break; - case AR8327_PORT_SPEED_1000: - t |= AR8216_PORT_SPEED_1000M; - break; - } - - return t; -} - static void ar8327_init_port(struct ar8xxx_priv *priv, int port) { -- cgit v1.2.3 From 8edb514ae9c6718df5fdad8d3b3e9c36ce75a624 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 15:50:02 +0000 Subject: generic: ar8216: don't use platform_data in ar8327_init_port Fetch the PORT_STATUS values in ar8327_hw_init and store those in a private data stucture for later use. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36045 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 47067c9e6..74fecd6f8 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -77,6 +77,11 @@ struct ar8xxx_chip { unsigned num_mibs; }; +struct ar8327_data { + u32 port0_status; + u32 port6_status; +}; + struct ar8xxx_priv { struct switch_dev dev; struct mii_bus *mii_bus; @@ -89,6 +94,9 @@ struct ar8xxx_priv { u8 chip_ver; u8 chip_rev; const struct ar8xxx_chip *chip; + union { + struct ar8327_data ar8327; + } chip_data; bool initialized; bool port4_phy; char buf[2048]; @@ -1035,6 +1043,7 @@ ar8327_hw_init(struct ar8xxx_priv *priv) { struct ar8327_platform_data *pdata; struct ar8327_led_cfg *led_cfg; + struct ar8327_data *data; struct mii_bus *bus; u32 pos, new_pos; u32 t; @@ -1044,6 +1053,11 @@ ar8327_hw_init(struct ar8xxx_priv *priv) if (!pdata) return -EINVAL; + data = &priv->chip_data.ar8327; + + data->port0_status = ar8327_get_port_init_status(&pdata->port0_cfg); + data->port6_status = ar8327_get_port_init_status(&pdata->port6_cfg); + t = ar8327_get_pad_cfg(pdata->pad0_cfg); priv->write(priv, AR8327_REG_PAD0_MODE, t); t = ar8327_get_pad_cfg(pdata->pad5_cfg); @@ -1117,15 +1131,12 @@ ar8327_init_globals(struct ar8xxx_priv *priv) static void ar8327_init_port(struct ar8xxx_priv *priv, int port) { - struct ar8327_platform_data *pdata; u32 t; - pdata = priv->phy->dev.platform_data; - if (port == AR8216_PORT_CPU) - t = ar8327_get_port_init_status(&pdata->port0_cfg); + t = priv->chip_data.ar8327.port0_status; else if (port == 6) - t = ar8327_get_port_init_status(&pdata->port6_cfg); + t = priv->chip_data.ar8327.port6_status; else t = AR8216_PORT_STATUS_LINK_AUTO; -- cgit v1.2.3 From 26e9527e42ed267f945d4ed5bdba1a278532838c Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 15:50:05 +0000 Subject: generic: ar8216: separate platform_data based AR8327 code Move platform_data specific configuration code into a separate routine. Do it in preparation for the upcoming OF support. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36046 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 74fecd6f8..d4ef7bd19 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1039,17 +1039,14 @@ ar8327_get_port_init_status(struct ar8327_port_cfg *cfg) } static int -ar8327_hw_init(struct ar8xxx_priv *priv) +ar8327_hw_config_pdata(struct ar8xxx_priv *priv, + struct ar8327_platform_data *pdata) { - struct ar8327_platform_data *pdata; struct ar8327_led_cfg *led_cfg; struct ar8327_data *data; - struct mii_bus *bus; u32 pos, new_pos; u32 t; - int i; - pdata = priv->phy->dev.platform_data; if (!pdata) return -EINVAL; @@ -1086,6 +1083,20 @@ ar8327_hw_init(struct ar8xxx_priv *priv) priv->write(priv, AR8327_REG_POWER_ON_STRIP, new_pos); } + return 0; +} + +static int +ar8327_hw_init(struct ar8xxx_priv *priv) +{ + struct mii_bus *bus; + int ret; + int i; + + ret = ar8327_hw_config_pdata(priv, priv->phy->dev.platform_data); + if (ret) + return ret; + bus = priv->mii_bus; for (i = 0; i < AR8327_NUM_PHYS; i++) { ar8327_phy_fixup(priv, i); -- cgit v1.2.3 From 70d97927a7b5d8a34daa220795eca390dc6e55d2 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 15:50:08 +0000 Subject: generic: ar8216: add OF configuration support for AR8327 Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36047 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 53 +++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index d4ef7bd19..9889698b0 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -33,6 +33,8 @@ #include #include #include +#include + #include "ar8216.h" /* size of the vlan table */ @@ -1086,6 +1088,50 @@ ar8327_hw_config_pdata(struct ar8xxx_priv *priv, return 0; } +#ifdef CONFIG_OF +static int +ar8327_hw_config_of(struct ar8xxx_priv *priv, struct device_node *np) +{ + const __be32 *paddr; + int len; + int i; + + paddr = of_get_property(np, "qca,ar8327-initvals", &len); + if (!paddr || len < (2 * sizeof(*paddr))) + return -EINVAL; + + len /= sizeof(*paddr); + + for (i = 0; i < len - 1; i += 2) { + u32 reg; + u32 val; + + reg = be32_to_cpup(paddr + i); + val = be32_to_cpup(paddr + i + 1); + + switch (reg) { + case AR8327_REG_PORT_STATUS(0): + priv->chip_data.ar8327.port0_status = val; + break; + case AR8327_REG_PORT_STATUS(6): + priv->chip_data.ar8327.port6_status = val; + break; + default: + priv->write(priv, reg, val); + break; + } + } + + return 0; +} +#else +static inline int +ar8327_hw_config_of(struct ar8xxx_priv *priv, struct device_node *np) +{ + return -EINVAL; +} +#endif + static int ar8327_hw_init(struct ar8xxx_priv *priv) { @@ -1093,7 +1139,12 @@ ar8327_hw_init(struct ar8xxx_priv *priv) int ret; int i; - ret = ar8327_hw_config_pdata(priv, priv->phy->dev.platform_data); + if (priv->phy->dev.of_node) + ret = ar8327_hw_config_of(priv, priv->phy->dev.of_node); + else + ret = ar8327_hw_config_pdata(priv, + priv->phy->dev.platform_data); + if (ret) return ret; -- cgit v1.2.3 From 33d879aa19a0024908fd657e4373b46a22217e75 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 16:06:25 +0000 Subject: generic: ar8216: add ar8xxx_start helper Move switch starting code into a separate function. This makes it usable from other places. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36049 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 34 +++++++++++++++------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 9889698b0..f1b743624 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1913,6 +1913,28 @@ ar8xxx_probe_switch(struct ar8xxx_priv *priv) return 0; } +static int +ar8xxx_start(struct ar8xxx_priv *priv) +{ + int ret; + + priv->init = true; + + ret = priv->chip->hw_init(priv); + if (ret) + return ret; + + ret = ar8xxx_sw_reset_switch(&priv->dev); + if (ret) + return ret; + + priv->init = false; + + ar8xxx_mib_start(priv); + + return 0; +} + static int ar8xxx_phy_config_init(struct phy_device *phydev) { @@ -1938,13 +1960,7 @@ ar8xxx_phy_config_init(struct phy_device *phydev) return 0; } - priv->init = true; - - ret = priv->chip->hw_init(priv); - if (ret) - return ret; - - ret = ar8xxx_sw_reset_switch(&priv->dev); + ret = ar8xxx_start(priv); if (ret) return ret; @@ -1956,10 +1972,6 @@ ar8xxx_phy_config_init(struct phy_device *phydev) dev->eth_mangle_tx = ar8216_mangle_tx; } - priv->init = false; - - ar8xxx_mib_start(priv); - return 0; } -- cgit v1.2.3 From c6f0aff5c8e2fc638814ac1e4ffd28045c27d225 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 15 Mar 2013 16:06:28 +0000 Subject: generic: ar8216: start AR8327 switch from the probe routine The AR8327 switch gets its configuration from platform data or from the device-tree. This allows to start it from the probe routine. Doing so makes it usable with ethernet drivers which only connects to the PHY device when the ethernet interface is opened. Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36050 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index f1b743624..ccc074fde 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1945,6 +1945,9 @@ ar8xxx_phy_config_init(struct phy_device *phydev) if (WARN_ON(!priv)) return -ENODEV; + if (chip_is_ar8327(priv)) + return 0; + priv->phy = phydev; if (phydev->addr != 0) { @@ -2103,6 +2106,8 @@ ar8xxx_phy_probe(struct phy_device *phydev) swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev)); found: + priv->use_count++; + if (phydev->addr == 0) { if (ar8xxx_has_gige(priv)) { phydev->supported = SUPPORTED_1000baseT_Full; @@ -2111,6 +2116,14 @@ found: phydev->supported = SUPPORTED_100baseT_Full; phydev->advertising = ADVERTISED_100baseT_Full; } + + if (chip_is_ar8327(priv)) { + priv->phy = phydev; + + ret = ar8xxx_start(priv); + if (ret) + goto err_unregister_switch; + } } else { if (ar8xxx_has_gige(priv)) { phydev->supported |= SUPPORTED_1000baseT_Full; @@ -2119,7 +2132,6 @@ found: } phydev->priv = priv; - priv->use_count++; list_add(&priv->list, &ar8xxx_dev_list); @@ -2127,6 +2139,12 @@ found: return 0; +err_unregister_switch: + if (--priv->use_count) + goto unlock; + + unregister_switch(&priv->dev); + free_priv: ar8xxx_free(priv); unlock: -- cgit v1.2.3 From 048d9254497c80e71131b456c1077893adb40c18 Mon Sep 17 00:00:00 2001 From: nbd Date: Mon, 13 May 2013 19:13:27 +0000 Subject: kernel: add missing PHY ID for an AR8327 switch variant Signed-off-by: Felix Fietkau git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36630 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/generic/files/drivers/net/phy/ar8216.c | 1 + 1 file changed, 1 insertion(+) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index ccc074fde..a07dd7848 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -2031,6 +2031,7 @@ ar8xxx_phy_config_aneg(struct phy_device *phydev) static const u32 ar8xxx_phy_ids[] = { 0x004dd033, + 0x004dd034, 0x004dd041, 0x004dd042, }; -- cgit v1.2.3 From c7f3f603795f07fcb7c6c4f6bfa9c74280726bac Mon Sep 17 00:00:00 2001 From: luka Date: Fri, 24 May 2013 13:10:22 +0000 Subject: generic: ar8216: add port mirroring Tested on Buffalo WZR-600DHP with ar8316 switch. Commands used to mirror both RX and TX traffic from LAN port 1 to LAN port 4: $ swconfig dev switch0 set enable_mirror_rx 1 $ swconfig dev switch0 set enable_mirror_tx 1 $ swconfig dev switch0 set mirror_monitor_port 4 $ swconfig dev switch0 set mirror_source_port 1 Signed-off-by: Colin Leitner Tested-by: Luka Perkov git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36713 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../linux/generic/files/drivers/net/phy/ar8216.c | 310 +++++++++++++++++++++ 1 file changed, 310 insertions(+) (limited to 'target/linux/generic/files/drivers/net/phy/ar8216.c') diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index a07dd7848..b6df6425a 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -120,6 +120,12 @@ struct ar8xxx_priv { u8 vlan_table[AR8X16_MAX_VLANS]; u8 vlan_tagged; u16 pvid[AR8X16_MAX_PORTS]; + + /* mirroring */ + bool mirror_rx; + bool mirror_tx; + int source_port; + int monitor_port; }; #define MIB_DESC(_s , _o, _n) \ @@ -1457,6 +1463,98 @@ ar8xxx_sw_set_ports(struct switch_dev *dev, struct switch_val *val) return 0; } +static void +ar8327_set_mirror_regs(struct ar8xxx_priv *priv) +{ + int port; + + /* reset all mirror registers */ + ar8xxx_rmw(priv, AR8327_REG_FWD_CTRL0, + AR8327_FWD_CTRL0_MIRROR_PORT, + (0xF << AR8327_FWD_CTRL0_MIRROR_PORT_S)); + for (port = 0; port < AR8327_NUM_PORTS; port++) { + ar8xxx_rmw(priv, AR8327_REG_PORT_LOOKUP(port), + AR8327_PORT_LOOKUP_ING_MIRROR_EN, + 0); + + ar8xxx_rmw(priv, AR8327_REG_PORT_HOL_CTRL1(port), + AR8327_PORT_HOL_CTRL1_EG_MIRROR_EN, + 0); + } + + /* now enable mirroring if necessary */ + if (priv->source_port >= AR8327_NUM_PORTS || + priv->monitor_port >= AR8327_NUM_PORTS || + priv->source_port == priv->monitor_port) { + return; + } + + ar8xxx_rmw(priv, AR8327_REG_FWD_CTRL0, + AR8327_FWD_CTRL0_MIRROR_PORT, + (priv->monitor_port << AR8327_FWD_CTRL0_MIRROR_PORT_S)); + + if (priv->mirror_rx) + ar8xxx_rmw(priv, AR8327_REG_PORT_LOOKUP(priv->source_port), + AR8327_PORT_LOOKUP_ING_MIRROR_EN, + AR8327_PORT_LOOKUP_ING_MIRROR_EN); + + if (priv->mirror_tx) + ar8xxx_rmw(priv, AR8327_REG_PORT_HOL_CTRL1(priv->source_port), + AR8327_PORT_HOL_CTRL1_EG_MIRROR_EN, + AR8327_PORT_HOL_CTRL1_EG_MIRROR_EN); +} + +static void +ar8216_set_mirror_regs(struct ar8xxx_priv *priv) +{ + int port; + + /* reset all mirror registers */ + ar8xxx_rmw(priv, AR8216_REG_GLOBAL_CPUPORT, + AR8216_GLOBAL_CPUPORT_MIRROR_PORT, + (0xF << AR8216_GLOBAL_CPUPORT_MIRROR_PORT_S)); + for (port = 0; port < AR8216_NUM_PORTS; port++) { + ar8xxx_rmw(priv, AR8216_REG_PORT_CTRL(port), + AR8216_PORT_CTRL_MIRROR_RX, + 0); + + ar8xxx_rmw(priv, AR8216_REG_PORT_CTRL(port), + AR8216_PORT_CTRL_MIRROR_TX, + 0); + } + + /* now enable mirroring if necessary */ + if (priv->source_port >= AR8216_NUM_PORTS || + priv->monitor_port >= AR8216_NUM_PORTS || + priv->source_port == priv->monitor_port) { + return; + } + + ar8xxx_rmw(priv, AR8216_REG_GLOBAL_CPUPORT, + AR8216_GLOBAL_CPUPORT_MIRROR_PORT, + (priv->monitor_port << AR8216_GLOBAL_CPUPORT_MIRROR_PORT_S)); + + if (priv->mirror_rx) + ar8xxx_rmw(priv, AR8216_REG_PORT_CTRL(priv->source_port), + AR8216_PORT_CTRL_MIRROR_RX, + AR8216_PORT_CTRL_MIRROR_RX); + + if (priv->mirror_tx) + ar8xxx_rmw(priv, AR8216_REG_PORT_CTRL(priv->source_port), + AR8216_PORT_CTRL_MIRROR_TX, + AR8216_PORT_CTRL_MIRROR_TX); +} + +static void +ar8xxx_set_mirror_regs(struct ar8xxx_priv *priv) +{ + if (chip_is_ar8327(priv)) { + ar8327_set_mirror_regs(priv); + } else { + ar8216_set_mirror_regs(priv); + } +} + static int ar8xxx_sw_hw_apply(struct switch_dev *dev) { @@ -1520,6 +1618,9 @@ ar8xxx_sw_hw_apply(struct switch_dev *dev) priv->chip->setup_port(priv, i, egress, ingress, portmask[i], pvid); } + + ar8xxx_set_mirror_regs(priv); + mutex_unlock(&priv->reg_mutex); return 0; } @@ -1541,7 +1642,13 @@ ar8xxx_sw_reset_switch(struct switch_dev *dev) for (i = 0; i < dev->ports; i++) priv->chip->init_port(priv, i); + priv->mirror_rx = false; + priv->mirror_tx = false; + priv->source_port = 0; + priv->monitor_port = 0; + priv->chip->init_globals(priv); + mutex_unlock(&priv->reg_mutex); return ar8xxx_sw_hw_apply(dev); @@ -1575,6 +1682,106 @@ unlock: return ret; } +static int +ar8xxx_sw_set_mirror_rx_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + + mutex_lock(&priv->reg_mutex); + priv->mirror_rx = !!val->value.i; + ar8xxx_set_mirror_regs(priv); + mutex_unlock(&priv->reg_mutex); + + return 0; +} + +static int +ar8xxx_sw_get_mirror_rx_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + val->value.i = priv->mirror_rx; + return 0; +} + +static int +ar8xxx_sw_set_mirror_tx_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + + mutex_lock(&priv->reg_mutex); + priv->mirror_tx = !!val->value.i; + ar8xxx_set_mirror_regs(priv); + mutex_unlock(&priv->reg_mutex); + + return 0; +} + +static int +ar8xxx_sw_get_mirror_tx_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + val->value.i = priv->mirror_tx; + return 0; +} + +static int +ar8xxx_sw_set_mirror_monitor_port(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + + mutex_lock(&priv->reg_mutex); + priv->monitor_port = val->value.i; + ar8xxx_set_mirror_regs(priv); + mutex_unlock(&priv->reg_mutex); + + return 0; +} + +static int +ar8xxx_sw_get_mirror_monitor_port(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + val->value.i = priv->monitor_port; + return 0; +} + +static int +ar8xxx_sw_set_mirror_source_port(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + + mutex_lock(&priv->reg_mutex); + priv->source_port = val->value.i; + ar8xxx_set_mirror_regs(priv); + mutex_unlock(&priv->reg_mutex); + + return 0; +} + +static int +ar8xxx_sw_get_mirror_source_port(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); + val->value.i = priv->source_port; + return 0; +} + static int ar8xxx_sw_set_port_reset_mib(struct switch_dev *dev, const struct switch_attr *attr, @@ -1668,7 +1875,87 @@ static struct switch_attr ar8xxx_sw_attr_globals[] = { .description = "Reset all MIB counters", .set = ar8xxx_sw_set_reset_mibs, }, + { + .type = SWITCH_TYPE_INT, + .name = "enable_mirror_rx", + .description = "Enable mirroring of RX packets", + .set = ar8xxx_sw_set_mirror_rx_enable, + .get = ar8xxx_sw_get_mirror_rx_enable, + .max = 1 + }, + { + .type = SWITCH_TYPE_INT, + .name = "enable_mirror_tx", + .description = "Enable mirroring of TX packets", + .set = ar8xxx_sw_set_mirror_tx_enable, + .get = ar8xxx_sw_get_mirror_tx_enable, + .max = 1 + }, + { + .type = SWITCH_TYPE_INT, + .name = "mirror_monitor_port", + .description = "Mirror monitor port", + .set = ar8xxx_sw_set_mirror_monitor_port, + .get = ar8xxx_sw_get_mirror_monitor_port, + .max = AR8216_NUM_PORTS - 1 + }, + { + .type = SWITCH_TYPE_INT, + .name = "mirror_source_port", + .description = "Mirror source port", + .set = ar8xxx_sw_set_mirror_source_port, + .get = ar8xxx_sw_get_mirror_source_port, + .max = AR8216_NUM_PORTS - 1 + }, +}; +static struct switch_attr ar8327_sw_attr_globals[] = { + { + .type = SWITCH_TYPE_INT, + .name = "enable_vlan", + .description = "Enable VLAN mode", + .set = ar8xxx_sw_set_vlan, + .get = ar8xxx_sw_get_vlan, + .max = 1 + }, + { + .type = SWITCH_TYPE_NOVAL, + .name = "reset_mibs", + .description = "Reset all MIB counters", + .set = ar8xxx_sw_set_reset_mibs, + }, + { + .type = SWITCH_TYPE_INT, + .name = "enable_mirror_rx", + .description = "Enable mirroring of RX packets", + .set = ar8xxx_sw_set_mirror_rx_enable, + .get = ar8xxx_sw_get_mirror_rx_enable, + .max = 1 + }, + { + .type = SWITCH_TYPE_INT, + .name = "enable_mirror_tx", + .description = "Enable mirroring of TX packets", + .set = ar8xxx_sw_set_mirror_tx_enable, + .get = ar8xxx_sw_get_mirror_tx_enable, + .max = 1 + }, + { + .type = SWITCH_TYPE_INT, + .name = "mirror_monitor_port", + .description = "Mirror monitor port", + .set = ar8xxx_sw_set_mirror_monitor_port, + .get = ar8xxx_sw_get_mirror_monitor_port, + .max = AR8327_NUM_PORTS - 1 + }, + { + .type = SWITCH_TYPE_INT, + .name = "mirror_source_port", + .description = "Mirror source port", + .set = ar8xxx_sw_set_mirror_source_port, + .get = ar8xxx_sw_get_mirror_source_port, + .max = AR8327_NUM_PORTS - 1 + }, }; static struct switch_attr ar8xxx_sw_attr_port[] = { @@ -1720,6 +2007,28 @@ static const struct switch_dev_ops ar8xxx_sw_ops = { .get_port_link = ar8xxx_sw_get_port_link, }; +static const struct switch_dev_ops ar8327_sw_ops = { + .attr_global = { + .attr = ar8327_sw_attr_globals, + .n_attr = ARRAY_SIZE(ar8327_sw_attr_globals), + }, + .attr_port = { + .attr = ar8xxx_sw_attr_port, + .n_attr = ARRAY_SIZE(ar8xxx_sw_attr_port), + }, + .attr_vlan = { + .attr = ar8xxx_sw_attr_vlan, + .n_attr = ARRAY_SIZE(ar8xxx_sw_attr_vlan), + }, + .get_port_pvid = ar8xxx_sw_get_pvid, + .set_port_pvid = ar8xxx_sw_set_pvid, + .get_vlan_ports = ar8xxx_sw_get_ports, + .set_vlan_ports = ar8xxx_sw_set_ports, + .apply_config = ar8xxx_sw_hw_apply, + .reset_switch = ar8xxx_sw_reset_switch, + .get_port_link = ar8xxx_sw_get_port_link, +}; + static int ar8xxx_id_chip(struct ar8xxx_priv *priv) { @@ -1900,6 +2209,7 @@ ar8xxx_probe_switch(struct ar8xxx_priv *priv) swdev->name = "Atheros AR8327"; swdev->vlans = AR8X16_MAX_VLANS; swdev->ports = AR8327_NUM_PORTS; + swdev->ops = &ar8327_sw_ops; } else { swdev->name = "Atheros AR8216"; swdev->vlans = AR8216_NUM_VLANS; -- cgit v1.2.3