]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/2.6.15.5/skge-genesis-phy-initialization-fix.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 2.6.15.5 / skge-genesis-phy-initialization-fix.patch
1 From stable-bounces@linux.kernel.org Wed Feb 22 13:50:00 2006
2 Date: Wed, 22 Feb 2006 13:52:34 -0800
3 From: Stephen Hemminger <shemminger@osdl.org>
4 To: stable@kernel.org
5 Cc:
6 Subject: [PATCH] skge: genesis phy initialization fix
7
8 The SysKonnect Genesis based board would fail on initialization
9 with phy_read errors caused by not waiting for last phy write.
10
11 Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
12 Signed-off-by: Chris Wright <chrisw@sous-sol.org>
13 ---
14
15 drivers/net/skge.c | 37 ++++++++++++++++++++++++++-----------
16 1 files changed, 26 insertions(+), 11 deletions(-)
17
18 --- linux-2.6.15.4.orig/drivers/net/skge.c
19 +++ linux-2.6.15.4/drivers/net/skge.c
20 @@ -880,13 +880,12 @@ static int __xm_phy_read(struct skge_hw
21 int i;
22
23 xm_write16(hw, port, XM_PHY_ADDR, reg | hw->phy_addr);
24 - xm_read16(hw, port, XM_PHY_DATA);
25 + *val = xm_read16(hw, port, XM_PHY_DATA);
26
27 - /* Need to wait for external PHY */
28 for (i = 0; i < PHY_RETRIES; i++) {
29 - udelay(1);
30 if (xm_read16(hw, port, XM_MMU_CMD) & XM_MMU_PHY_RDY)
31 goto ready;
32 + udelay(1);
33 }
34
35 return -ETIMEDOUT;
36 @@ -919,7 +918,12 @@ static int xm_phy_write(struct skge_hw *
37
38 ready:
39 xm_write16(hw, port, XM_PHY_DATA, val);
40 - return 0;
41 + for (i = 0; i < PHY_RETRIES; i++) {
42 + if (!(xm_read16(hw, port, XM_MMU_CMD) & XM_MMU_PHY_BUSY))
43 + return 0;
44 + udelay(1);
45 + }
46 + return -ETIMEDOUT;
47 }
48
49 static void genesis_init(struct skge_hw *hw)
50 @@ -1169,13 +1173,17 @@ static void genesis_mac_init(struct skge
51 u32 r;
52 const u8 zero[6] = { 0 };
53
54 - /* Clear MIB counters */
55 - xm_write16(hw, port, XM_STAT_CMD,
56 - XM_SC_CLR_RXC | XM_SC_CLR_TXC);
57 - /* Clear two times according to Errata #3 */
58 - xm_write16(hw, port, XM_STAT_CMD,
59 - XM_SC_CLR_RXC | XM_SC_CLR_TXC);
60 + for (i = 0; i < 10; i++) {
61 + skge_write16(hw, SK_REG(port, TX_MFF_CTRL1),
62 + MFF_SET_MAC_RST);
63 + if (skge_read16(hw, SK_REG(port, TX_MFF_CTRL1)) & MFF_SET_MAC_RST)
64 + goto reset_ok;
65 + udelay(1);
66 + }
67
68 + printk(KERN_WARNING PFX "%s: genesis reset failed\n", dev->name);
69 +
70 + reset_ok:
71 /* Unreset the XMAC. */
72 skge_write16(hw, SK_REG(port, TX_MFF_CTRL1), MFF_CLR_MAC_RST);
73
74 @@ -1192,7 +1200,7 @@ static void genesis_mac_init(struct skge
75 r |= GP_DIR_2|GP_IO_2;
76
77 skge_write32(hw, B2_GP_IO, r);
78 - skge_read32(hw, B2_GP_IO);
79 +
80
81 /* Enable GMII interface */
82 xm_write16(hw, port, XM_HW_CFG, XM_HW_GMII_MD);
83 @@ -1206,6 +1214,13 @@ static void genesis_mac_init(struct skge
84 for (i = 1; i < 16; i++)
85 xm_outaddr(hw, port, XM_EXM(i), zero);
86
87 + /* Clear MIB counters */
88 + xm_write16(hw, port, XM_STAT_CMD,
89 + XM_SC_CLR_RXC | XM_SC_CLR_TXC);
90 + /* Clear two times according to Errata #3 */
91 + xm_write16(hw, port, XM_STAT_CMD,
92 + XM_SC_CLR_RXC | XM_SC_CLR_TXC);
93 +
94 /* configure Rx High Water Mark (XM_RX_HI_WM) */
95 xm_write16(hw, port, XM_RX_HI_WM, 1450);
96