aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/r8169.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 93228c518ae7..805562b8624e 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -1904,10 +1904,15 @@ rtl8169_hw_start(struct net_device *dev)
1904 */ 1904 */
1905 RTL_W16(IntrMitigate, 0x0000); 1905 RTL_W16(IntrMitigate, 0x0000);
1906 1906
1907 RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_32BIT_MASK)); 1907 /*
1908 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
1909 * register to be written before TxDescAddrLow to work.
1910 * Switching from MMIO to I/O access fixes the issue as well.
1911 */
1908 RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr >> 32)); 1912 RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr >> 32));
1909 RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr & DMA_32BIT_MASK)); 1913 RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_32BIT_MASK));
1910 RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr >> 32)); 1914 RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr >> 32));
1915 RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr & DMA_32BIT_MASK));
1911 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); 1916 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
1912 RTL_W8(Cfg9346, Cfg9346_Lock); 1917 RTL_W8(Cfg9346, Cfg9346_Lock);
1913 1918