linux-hardened/drivers/net/ethernet
Thomas Petazzoni 7140860291 net: mvneta: properly disable HW PHY polling and ensure adjust_link() works
This commit fixes a long-standing bug that has been reported by many
users: on some Armada 370 platforms, only the network interface that
has been used in U-Boot to tftp the kernel works properly in
Linux. The other network interfaces can see a 'link up', but are
unable to transmit data. The reports were generally made on the Armada
370-based Mirabox, but have also been given on the Armada 370-RD
board.

The network MAC in the Armada 370/XP (supported by the mvneta driver
in Linux) has a functionality that allows it to continuously poll the
PHY and directly update the MAC configuration accordingly (speed,
duplex, etc.). The very first versions of the driver submitted for
review were using this hardware mechanism, but due to this, the driver
was not integrated with the kernel phylib. Following reviews, the
driver was changed to use the phylib, and therefore a software based
polling. In software based polling, Linux regularly talks to the PHY
over the MDIO bus, and sees if the link status has changed. If it's
the case then the adjust_link() callback of the driver is called to
update the MAC configuration accordingly.

However, it turns out that the adjust_link() callback was not
configuring the hardware in a completely correct way: while it was
setting the speed and duplex bits correctly, it wasn't telling the
hardware to actually take into account those bits rather than what the
hardware-based PHY polling mechanism has concluded. So, in fact the
adjust_link() callback was basically a no-op.

However, the network happened to be working because on the network
interfaces used by U-Boot for tftp on Armada 370 platforms because the
hardware PHY polling was enabled by the bootloader, and left enabled
by Linux. However, the second network interface not used for tftp (or
both network interfaces if the kernel is loaded from USB, NAND or SD
card) didn't had the hardware PHY polling enabled.

This patch fixes this situation by:

 (1) Making sure that the hardware PHY polling is disabled by clearing
     the MVNETA_PHY_POLLING_ENABLE bit in the MVNETA_UNIT_CONTROL
     register in the driver ->probe() function.

 (2) Making sure that the duplex and speed selections made by the
     adjust_link() callback are taken into account by clearing the
     MVNETA_GMAC_AN_SPEED_EN and MVNETA_GMAC_AN_DUPLEX_EN bits in the
     MVNETA_GMAC_AUTONEG_CONFIG register.

This patch has been tested on Armada 370 Mirabox, and now both network
interfaces are usable after boot.

[ Problem introduced by commit c5aff18 ("net: mvneta: driver for
  Marvell Armada 370/XP network unit") ]

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Willy Tarreau <w@1wt.eu>
Cc: Jochen De Smet <jochen.armkernel@leahnim.org>
Cc: Peter Sanford <psanford@nearbuy.io>
Cc: Ethan Tuttle <ethan@ethantuttle.com>
Cc: Chény Yves-Gael <yves@cheny.fr>
Cc: Ryan Press <ryan@presslab.us>
Cc: Simon Guinot <simon.guinot@sequanux.org>
Cc: vdonnefort@lacie.com
Cc: stable@vger.kernel.org
Acked-by: Jason Cooper <jason@lakedaemon.net>
Tested-by: Vincent Donnefort <vdonnefort@gmail.com>
Tested-by: Yves-Gael Cheny <yves@cheny.fr>
Tested-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-09-05 14:31:01 -04:00
..
3com net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
8390 drivers: net: ethernet: 8390: Kconfig: add H8300H_AKI3068NET and H8300H_H8MAX dependancy for NE_H8300 2013-09-03 22:36:59 -04:00
adaptec net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
adi net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
aeroflex net: ethernet: use platform_{get,set}_drvdata() 2013-05-25 21:27:58 -07:00
allwinner drivers: net: sun4i-emac: select MDIO_SUN4I 2013-07-26 13:57:58 -07:00
alteon net/ethernet/alteon/acenic: Use module_pci_driver to register driver 2013-05-22 14:35:04 -07:00
amd amd8111e: use pdev->pm_cap instead of pci_find_capability(.., PCI_CAP_ID_PM) 2013-06-19 22:22:56 -07:00
apple net: Restore unintentional reverts. 2013-06-24 12:43:40 -07:00
arc ethernet/arc/arc_emac - fix NAPI "work > weight" warning 2013-08-13 17:00:45 -07:00
atheros atl1c: Fix misuse of netdev_alloc_skb in refilling rx ring 2013-07-30 18:12:07 -07:00
broadcom tg3: Don't turn off led on 5719 serdes port 0 2013-09-03 22:23:40 -04:00
brocade Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2013-07-09 18:24:39 -07:00
cadence drivers/net/ethernet/cadence: don't use devm_pinctrl_get_select_default() in probe 2013-07-11 17:18:26 -07:00
calxeda net: calxedaxgmac: fix xgmac_xmit DMA mapping error handling 2013-09-03 22:21:16 -04:00
chelsio Revert "cxgb3: Check and handle the dma mapping errors" 2013-08-15 01:23:32 -07:00
cirrus net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
cisco drivers/net: enic: release rtnl_lock on error-path 2013-07-09 12:55:48 -07:00
davicom net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
dec net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
dlink net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
emulex be2net: Check for POST state in suspend-resume sequence 2013-08-26 16:55:26 -04:00
faraday net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
freescale net: fec: fix the error to get the previous BD entry 2013-09-04 14:14:54 -04:00
fujitsu Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2013-05-01 14:08:52 -07:00
hp
i825xx drivers:net: Remove unnecessary OOM messages after netdev_alloc_skb 2013-03-09 16:09:19 -05:00
ibm Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2013-07-09 18:24:39 -07:00
icplus net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
intel net: rename CONFIG_NET_LL_RX_POLL to CONFIG_NET_RX_BUSY_POLL 2013-08-01 15:11:17 -07:00
marvell net: mvneta: properly disable HW PHY polling and ensure adjust_link() works 2013-09-05 14:31:01 -04:00
mellanox net/mlx5_core: Support MANAGE_PAGES and QUERY_PAGES firmware command changes 2013-08-15 15:42:57 -07:00
micrel net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
microchip net: ethernet: enc28j60: use spi_get_drvdata() and spi_set_drvdata() 2013-04-07 16:48:19 -04:00
myricom net/trivial: replace numeric with standard PM state macros 2013-06-28 22:11:48 -07:00
natsemi net: vlan: add protocol argument to packet tagging functions 2013-04-19 14:46:06 -04:00
neterion treewide: Fix typo in printk 2013-06-18 13:48:45 +02:00
nuvoton net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
nvidia net/ethernet/nvidia/forcedeth: Use module_pci_driver to register driver 2013-05-22 14:35:05 -07:00
nxp net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00
octeon Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2013-07-13 14:52:21 -07:00
oki-semi net: pch_gbe depends on x86 2013-07-22 14:43:30 -07:00
packetengines net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
pasemi drivers:net: dma_alloc_coherent: use __GFP_ZERO instead of memset(, 0) 2013-03-17 12:50:24 -04:00
qlogic netxen: lower NAPI weight 2013-08-27 14:59:27 -04:00
rdc net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
realtek r8169: remember WOL preferences on driver load 2013-08-20 16:48:32 -07:00
renesas sh_eth: fix napi_{en|dis}able() calls racing against interrupts 2013-09-04 14:55:34 -04:00
seeq net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00
sfc sfc: Fix lookup of default RX MAC filters when steered using ethtool 2013-08-21 14:18:12 +01:00
sgi net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
silan net/ethernet/silan/sc92031: Use module_pci_driver to register driver 2013-05-22 14:35:03 -07:00
sis sis900: Fix the tx queue timeout issue 2013-08-02 15:04:15 -07:00
smsc net: Move MII out from under NET_CORE and hide it 2013-06-19 22:22:56 -07:00
stmicro net: stmmac: fixed the pbl setting with DT 2013-08-28 17:41:49 -04:00
sun sunvnet: vnet_port_remove must call unregister_netdev 2013-07-10 13:35:52 -07:00
tehuti net: vlan: add protocol argument to packet tagging functions 2013-04-19 14:46:06 -04:00
ti net: ethernet: davinci_emac: drop IRQF_DISABLED 2013-08-03 11:53:04 -07:00
tile tile: support new Tilera hypervisor 2013-05-02 16:20:31 -04:00
toshiba ps3_gelic: lower NAPI weight 2013-08-27 14:59:27 -04:00
tundra net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00
via drivers/net/ethernet/via/via-velocity.c: update napi implementation 2013-08-15 01:38:34 -07:00
wiznet net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00
xilinx net: xilinx: fix memleak 2013-08-28 18:24:31 -04:00
xircom Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2013-05-01 14:08:52 -07:00
xscale net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00
dnet.c
dnet.h
ethoc.c net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00
fealnx.c
jme.c jme: lower NAPI weight 2013-08-27 14:59:27 -04:00
jme.h
Kconfig ethernet/arc/arc_emac - Add new driver 2013-06-25 16:34:32 -07:00
korina.c net: Restore unintentional reverts. 2013-06-24 12:43:40 -07:00
lantiq_etop.c lantiq_etop: use free_netdev(netdev) instead of kfree() 2013-03-21 11:50:10 -04:00
Makefile ethernet/arc/arc_emac - Add new driver 2013-06-25 16:34:32 -07:00
netx-eth.c net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00
s6gmac.c net: ethernet: remove unnecessary platform_set_drvdata() 2013-05-27 22:34:51 -07:00