1 /*
2 * Copyright (c) 2008 Marty Connor <mdc@etherboot.org>
3 * Copyright (c) 2008 Entity Cyber, Inc.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 * This driver is based on rtl8169 data sheets and work by:
20 *
21 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
22 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
23 * Copyright (c) a lot of people too. Please respect their work.
24 */
25
26 FILE_LICENCE ( GPL2_OR_LATER );
27
28 #include <stdint.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <unistd.h>
33 #include <assert.h>
34 #include <byteswap.h>
35 #include <errno.h>
36 #include <gpxe/ethernet.h>
37 #include <gpxe/if_ether.h>
38 #include <gpxe/io.h>
39 #include <gpxe/iobuf.h>
40 #include <gpxe/malloc.h>
41 #include <gpxe/netdevice.h>
42 #include <gpxe/pci.h>
43 #include <gpxe/timer.h>
44 #include <mii.h>
45
46 #include "r8169.h"
47
48 /*** Low level hardware routines ***/
49
mdio_write(void * ioaddr,int reg_addr,int value)50 static void mdio_write(void *ioaddr, int reg_addr, int value)
51 {
52 int i;
53
54 DBGP ( "mdio_write\n" );
55
56 RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
57
58 for (i = 20; i > 0; i--) {
59 /*
60 * Check if the RTL8169 has completed writing to the specified
61 * MII register.
62 */
63 if (!(RTL_R32(PHYAR) & 0x80000000))
64 break;
65 udelay(25);
66 }
67 }
68
mdio_read(void * ioaddr,int reg_addr)69 static int mdio_read(void *ioaddr, int reg_addr)
70 {
71 int i, value = -1;
72
73 DBGP ( "mdio_read\n" );
74
75 RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
76
77 for (i = 20; i > 0; i--) {
78 /*
79 * Check if the RTL8169 has completed retrieving data from
80 * the specified MII register.
81 */
82 if (RTL_R32(PHYAR) & 0x80000000) {
83 value = RTL_R32(PHYAR) & 0xffff;
84 break;
85 }
86 udelay(25);
87 }
88 return value;
89 }
90
mdio_patch(void * ioaddr,int reg_addr,int value)91 static void mdio_patch(void *ioaddr, int reg_addr, int value)
92 {
93 DBGP ( "mdio_patch\n" );
94
95 mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
96 }
97
rtl_ephy_write(void * ioaddr,int reg_addr,int value)98 static void rtl_ephy_write(void *ioaddr, int reg_addr, int value)
99 {
100 unsigned int i;
101
102 DBGP ( "rtl_ephy_write\n" );
103
104 RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
105 (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
106
107 for (i = 0; i < 100; i++) {
108 if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
109 break;
110 udelay(10);
111 }
112 }
113
rtl_ephy_read(void * ioaddr,int reg_addr)114 static u16 rtl_ephy_read(void *ioaddr, int reg_addr)
115 {
116 u16 value = 0xffff;
117 unsigned int i;
118
119 DBGP ( "rtl_ephy_read\n" );
120
121 RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
122
123 for (i = 0; i < 100; i++) {
124 if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
125 value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
126 break;
127 }
128 udelay(10);
129 }
130
131 return value;
132 }
133
rtl_csi_write(void * ioaddr,int addr,int value)134 static void rtl_csi_write(void *ioaddr, int addr, int value)
135 {
136 unsigned int i;
137
138 DBGP ( "rtl_csi_write\n" );
139
140 RTL_W32(CSIDR, value);
141 RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
142 CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
143
144 for (i = 0; i < 100; i++) {
145 if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
146 break;
147 udelay(10);
148 }
149 }
150
rtl_csi_read(void * ioaddr,int addr)151 static u32 rtl_csi_read(void *ioaddr, int addr)
152 {
153 u32 value = ~0x00;
154 unsigned int i;
155
156 DBGP ( "rtl_csi_read\n" );
157
158 RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
159 CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
160
161 for (i = 0; i < 100; i++) {
162 if (RTL_R32(CSIAR) & CSIAR_FLAG) {
163 value = RTL_R32(CSIDR);
164 break;
165 }
166 udelay(10);
167 }
168
169 return value;
170 }
171
rtl8169_irq_mask_and_ack(void * ioaddr)172 static void rtl8169_irq_mask_and_ack(void *ioaddr)
173 {
174 DBGP ( "rtl8169_irq_mask_and_ack\n" );
175
176 RTL_W16(IntrMask, 0x0000);
177
178 RTL_W16(IntrStatus, 0xffff);
179 }
180
rtl8169_tbi_reset_pending(void * ioaddr)181 static unsigned int rtl8169_tbi_reset_pending(void *ioaddr)
182 {
183 DBGP ( "rtl8169_tbi_reset_pending\n" );
184
185 return RTL_R32(TBICSR) & TBIReset;
186 }
187
rtl8169_xmii_reset_pending(void * ioaddr)188 static unsigned int rtl8169_xmii_reset_pending(void *ioaddr)
189 {
190 DBGP ( "rtl8169_xmii_reset_pending\n" );
191
192 return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
193 }
194
rtl8169_tbi_link_ok(void * ioaddr)195 static unsigned int rtl8169_tbi_link_ok(void *ioaddr)
196 {
197 DBGP ( "rtl8169_tbi_link_ok\n" );
198
199 return RTL_R32(TBICSR) & TBILinkOk;
200 }
201
rtl8169_xmii_link_ok(void * ioaddr)202 static unsigned int rtl8169_xmii_link_ok(void *ioaddr)
203 {
204 DBGP ( "rtl8169_xmii_link_ok\n" );
205
206 return RTL_R8(PHYstatus) & LinkStatus;
207 }
208
rtl8169_tbi_reset_enable(void * ioaddr)209 static void rtl8169_tbi_reset_enable(void *ioaddr)
210 {
211 DBGP ( "rtl8169_tbi_reset_enable\n" );
212
213 RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
214 }
215
rtl8169_xmii_reset_enable(void * ioaddr)216 static void rtl8169_xmii_reset_enable(void *ioaddr)
217 {
218 unsigned int val;
219
220 DBGP ( "rtl8169_xmii_reset_enable\n" );
221
222 val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
223 mdio_write(ioaddr, MII_BMCR, val & 0xffff);
224 }
225
rtl8169_set_speed_tbi(struct net_device * dev,u8 autoneg,u16 speed,u8 duplex)226 static int rtl8169_set_speed_tbi(struct net_device *dev,
227 u8 autoneg, u16 speed, u8 duplex)
228 {
229 struct rtl8169_private *tp = netdev_priv(dev);
230 void *ioaddr = tp->mmio_addr;
231 int ret = 0;
232 u32 reg;
233
234 DBGP ( "rtl8169_set_speed_tbi\n" );
235
236 reg = RTL_R32(TBICSR);
237 if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
238 (duplex == DUPLEX_FULL)) {
239 RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
240 } else if (autoneg == AUTONEG_ENABLE)
241 RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
242 else {
243 DBG ( "incorrect speed setting refused in TBI mode\n" );
244 ret = -EOPNOTSUPP;
245 }
246 return ret;
247 }
248
rtl8169_set_speed_xmii(struct net_device * dev,u8 autoneg,u16 speed,u8 duplex)249 static int rtl8169_set_speed_xmii(struct net_device *dev,
250 u8 autoneg, u16 speed, u8 duplex)
251 {
252 struct rtl8169_private *tp = netdev_priv(dev);
253 void *ioaddr = tp->mmio_addr;
254 int auto_nego, giga_ctrl;
255
256 DBGP ( "rtl8169_set_speed_xmii\n" );
257
258 auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
259 auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
260 ADVERTISE_100HALF | ADVERTISE_100FULL);
261 giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
262 giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
263
264 if (autoneg == AUTONEG_ENABLE) {
265 auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
266 ADVERTISE_100HALF | ADVERTISE_100FULL);
267 giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
268 } else {
269 if (speed == SPEED_10)
270 auto_nego |= ADVERTISE_10HALF | ADVERTISE_10FULL;
271 else if (speed == SPEED_100)
272 auto_nego |= ADVERTISE_100HALF | ADVERTISE_100FULL;
273 else if (speed == SPEED_1000)
274 giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
275
276 if (duplex == DUPLEX_HALF)
277 auto_nego &= ~(ADVERTISE_10FULL | ADVERTISE_100FULL);
278
279 if (duplex == DUPLEX_FULL)
280 auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_100HALF);
281
282 /* This tweak comes straight from Realtek's driver. */
283 if ((speed == SPEED_100) && (duplex == DUPLEX_HALF) &&
284 ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
285 (tp->mac_version == RTL_GIGA_MAC_VER_16))) {
286 auto_nego = ADVERTISE_100HALF | ADVERTISE_CSMA;
287 }
288 }
289
290 /* The 8100e/8101e/8102e do Fast Ethernet only. */
291 if ((tp->mac_version == RTL_GIGA_MAC_VER_07) ||
292 (tp->mac_version == RTL_GIGA_MAC_VER_08) ||
293 (tp->mac_version == RTL_GIGA_MAC_VER_09) ||
294 (tp->mac_version == RTL_GIGA_MAC_VER_10) ||
295 (tp->mac_version == RTL_GIGA_MAC_VER_13) ||
296 (tp->mac_version == RTL_GIGA_MAC_VER_14) ||
297 (tp->mac_version == RTL_GIGA_MAC_VER_15) ||
298 (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
299 if ((giga_ctrl & (ADVERTISE_1000FULL | ADVERTISE_1000HALF))) {
300 DBG ( "PHY does not support 1000Mbps.\n" );
301 }
302 giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
303 }
304
305 auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
306
307 if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
308 (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
309 (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
310 /*
311 * Wake up the PHY.
312 * Vendor specific (0x1f) and reserved (0x0e) MII registers.
313 */
314 mdio_write(ioaddr, 0x1f, 0x0000);
315 mdio_write(ioaddr, 0x0e, 0x0000);
316 }
317
318 tp->phy_auto_nego_reg = auto_nego;
319 tp->phy_1000_ctrl_reg = giga_ctrl;
320
321 mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
322 mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
323 mdio_write(ioaddr, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
324 return 0;
325 }
326
rtl8169_set_speed(struct net_device * dev,u8 autoneg,u16 speed,u8 duplex)327 static int rtl8169_set_speed(struct net_device *dev,
328 u8 autoneg, u16 speed, u8 duplex)
329 {
330 struct rtl8169_private *tp = netdev_priv(dev);
331 int ret;
332
333 DBGP ( "rtl8169_set_speed\n" );
334
335 ret = tp->set_speed(dev, autoneg, speed, duplex);
336
337 return ret;
338 }
339
rtl8169_write_gmii_reg_bit(void * ioaddr,int reg,int bitnum,int bitval)340 static void rtl8169_write_gmii_reg_bit(void *ioaddr, int reg,
341 int bitnum, int bitval)
342 {
343 int val;
344
345 DBGP ( "rtl8169_write_gmii_reg_bit\n" );
346
347 val = mdio_read(ioaddr, reg);
348 val = (bitval == 1) ?
349 val | (bitval << bitnum) : val & ~(0x0001 << bitnum);
350 mdio_write(ioaddr, reg, val & 0xffff);
351 }
352
rtl8169_get_mac_version(struct rtl8169_private * tp,void * ioaddr)353 static void rtl8169_get_mac_version(struct rtl8169_private *tp,
354 void *ioaddr)
355 {
356 /*
357 * The driver currently handles the 8168Bf and the 8168Be identically
358 * but they can be identified more specifically through the test below
359 * if needed:
360 *
361 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
362 *
363 * Same thing for the 8101Eb and the 8101Ec:
364 *
365 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
366 */
367 const struct {
368 u32 mask;
369 u32 val;
370 int mac_version;
371 } mac_info[] = {
372 /* 8168D family. */
373 { 0x7c800000, 0x28000000, RTL_GIGA_MAC_VER_25 },
374
375 /* 8168C family. */
376 { 0x7cf00000, 0x3ca00000, RTL_GIGA_MAC_VER_24 },
377 { 0x7cf00000, 0x3c900000, RTL_GIGA_MAC_VER_23 },
378 { 0x7cf00000, 0x3c800000, RTL_GIGA_MAC_VER_18 },
379 { 0x7c800000, 0x3c800000, RTL_GIGA_MAC_VER_24 },
380 { 0x7cf00000, 0x3c000000, RTL_GIGA_MAC_VER_19 },
381 { 0x7cf00000, 0x3c200000, RTL_GIGA_MAC_VER_20 },
382 { 0x7cf00000, 0x3c300000, RTL_GIGA_MAC_VER_21 },
383 { 0x7cf00000, 0x3c400000, RTL_GIGA_MAC_VER_22 },
384 { 0x7c800000, 0x3c000000, RTL_GIGA_MAC_VER_22 },
385
386 /* 8168B family. */
387 { 0x7cf00000, 0x38000000, RTL_GIGA_MAC_VER_12 },
388 { 0x7cf00000, 0x38500000, RTL_GIGA_MAC_VER_17 },
389 { 0x7c800000, 0x38000000, RTL_GIGA_MAC_VER_17 },
390 { 0x7c800000, 0x30000000, RTL_GIGA_MAC_VER_11 },
391
392 /* 8101 family. */
393 { 0x7cf00000, 0x34a00000, RTL_GIGA_MAC_VER_09 },
394 { 0x7cf00000, 0x24a00000, RTL_GIGA_MAC_VER_09 },
395 { 0x7cf00000, 0x34900000, RTL_GIGA_MAC_VER_08 },
396 { 0x7cf00000, 0x24900000, RTL_GIGA_MAC_VER_08 },
397 { 0x7cf00000, 0x34800000, RTL_GIGA_MAC_VER_07 },
398 { 0x7cf00000, 0x24800000, RTL_GIGA_MAC_VER_07 },
399 { 0x7cf00000, 0x34000000, RTL_GIGA_MAC_VER_13 },
400 { 0x7cf00000, 0x34300000, RTL_GIGA_MAC_VER_10 },
401 { 0x7cf00000, 0x34200000, RTL_GIGA_MAC_VER_16 },
402 { 0x7c800000, 0x34800000, RTL_GIGA_MAC_VER_09 },
403 { 0x7c800000, 0x24800000, RTL_GIGA_MAC_VER_09 },
404 { 0x7c800000, 0x34000000, RTL_GIGA_MAC_VER_16 },
405 /* FIXME: where did these entries come from ? -- FR */
406 { 0xfc800000, 0x38800000, RTL_GIGA_MAC_VER_15 },
407 { 0xfc800000, 0x30800000, RTL_GIGA_MAC_VER_14 },
408
409 /* 8110 family. */
410 { 0xfc800000, 0x98000000, RTL_GIGA_MAC_VER_06 },
411 { 0xfc800000, 0x18000000, RTL_GIGA_MAC_VER_05 },
412 { 0xfc800000, 0x10000000, RTL_GIGA_MAC_VER_04 },
413 { 0xfc800000, 0x04000000, RTL_GIGA_MAC_VER_03 },
414 { 0xfc800000, 0x00800000, RTL_GIGA_MAC_VER_02 },
415 { 0xfc800000, 0x00000000, RTL_GIGA_MAC_VER_01 },
416
417 { 0x00000000, 0x00000000, RTL_GIGA_MAC_VER_01 } /* Catch-all */
418 }, *p = mac_info;
419 u32 reg;
420
421 DBGP ( "rtl8169_get_mac_version\n" );
422
423 reg = RTL_R32(TxConfig);
424 while ((reg & p->mask) != p->val)
425 p++;
426 tp->mac_version = p->mac_version;
427
428 DBG ( "tp->mac_version = %d\n", tp->mac_version );
429
430 if (p->mask == 0x00000000) {
431 DBG ( "unknown MAC (%08x)\n", reg );
432 }
433 }
434
435 struct phy_reg {
436 u16 reg;
437 u16 val;
438 };
439
rtl_phy_write(void * ioaddr,struct phy_reg * regs,int len)440 static void rtl_phy_write(void *ioaddr, struct phy_reg *regs, int len)
441 {
442 DBGP ( "rtl_phy_write\n" );
443
444 while (len-- > 0) {
445 mdio_write(ioaddr, regs->reg, regs->val);
446 regs++;
447 }
448 }
449
rtl8169s_hw_phy_config(void * ioaddr)450 static void rtl8169s_hw_phy_config(void *ioaddr)
451 {
452 struct {
453 u16 regs[5]; /* Beware of bit-sign propagation */
454 } phy_magic[5] = { {
455 { 0x0000, //w 4 15 12 0
456 0x00a1, //w 3 15 0 00a1
457 0x0008, //w 2 15 0 0008
458 0x1020, //w 1 15 0 1020
459 0x1000 } },{ //w 0 15 0 1000
460 { 0x7000, //w 4 15 12 7
461 0xff41, //w 3 15 0 ff41
462 0xde60, //w 2 15 0 de60
463 0x0140, //w 1 15 0 0140
464 0x0077 } },{ //w 0 15 0 0077
465 { 0xa000, //w 4 15 12 a
466 0xdf01, //w 3 15 0 df01
467 0xdf20, //w 2 15 0 df20
468 0xff95, //w 1 15 0 ff95
469 0xfa00 } },{ //w 0 15 0 fa00
470 { 0xb000, //w 4 15 12 b
471 0xff41, //w 3 15 0 ff41
472 0xde20, //w 2 15 0 de20
473 0x0140, //w 1 15 0 0140
474 0x00bb } },{ //w 0 15 0 00bb
475 { 0xf000, //w 4 15 12 f
476 0xdf01, //w 3 15 0 df01
477 0xdf20, //w 2 15 0 df20
478 0xff95, //w 1 15 0 ff95
479 0xbf00 } //w 0 15 0 bf00
480 }
481 }, *p = phy_magic;
482 unsigned int i;
483
484 DBGP ( "rtl8169s_hw_phy_config\n" );
485
486 mdio_write(ioaddr, 0x1f, 0x0001); //w 31 2 0 1
487 mdio_write(ioaddr, 0x15, 0x1000); //w 21 15 0 1000
488 mdio_write(ioaddr, 0x18, 0x65c7); //w 24 15 0 65c7
489 rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
490
491 for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
492 int val, pos = 4;
493
494 val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
495 mdio_write(ioaddr, pos, val);
496 while (--pos >= 0)
497 mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
498 rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
499 rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
500 }
501 mdio_write(ioaddr, 0x1f, 0x0000); //w 31 2 0 0
502 }
503
rtl8169sb_hw_phy_config(void * ioaddr)504 static void rtl8169sb_hw_phy_config(void *ioaddr)
505 {
506 struct phy_reg phy_reg_init[] = {
507 { 0x1f, 0x0002 },
508 { 0x01, 0x90d0 },
509 { 0x1f, 0x0000 }
510 };
511
512 DBGP ( "rtl8169sb_hw_phy_config\n" );
513
514 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
515 }
516
rtl8168bb_hw_phy_config(void * ioaddr)517 static void rtl8168bb_hw_phy_config(void *ioaddr)
518 {
519 struct phy_reg phy_reg_init[] = {
520 { 0x10, 0xf41b },
521 { 0x1f, 0x0000 }
522 };
523
524 mdio_write(ioaddr, 0x1f, 0x0001);
525 mdio_patch(ioaddr, 0x16, 1 << 0);
526
527 DBGP ( "rtl8168bb_hw_phy_config\n" );
528
529 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
530 }
531
rtl8168bef_hw_phy_config(void * ioaddr)532 static void rtl8168bef_hw_phy_config(void *ioaddr)
533 {
534 struct phy_reg phy_reg_init[] = {
535 { 0x1f, 0x0001 },
536 { 0x10, 0xf41b },
537 { 0x1f, 0x0000 }
538 };
539
540 DBGP ( "rtl8168bef_hw_phy_config\n" );
541
542 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
543 }
544
rtl8168cp_1_hw_phy_config(void * ioaddr)545 static void rtl8168cp_1_hw_phy_config(void *ioaddr)
546 {
547 struct phy_reg phy_reg_init[] = {
548 { 0x1f, 0x0000 },
549 { 0x1d, 0x0f00 },
550 { 0x1f, 0x0002 },
551 { 0x0c, 0x1ec8 },
552 { 0x1f, 0x0000 }
553 };
554
555 DBGP ( "rtl8168cp_1_hw_phy_config\n" );
556
557 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
558 }
559
rtl8168cp_2_hw_phy_config(void * ioaddr)560 static void rtl8168cp_2_hw_phy_config(void *ioaddr)
561 {
562 struct phy_reg phy_reg_init[] = {
563 { 0x1f, 0x0001 },
564 { 0x1d, 0x3d98 },
565 { 0x1f, 0x0000 }
566 };
567
568 DBGP ( "rtl8168cp_2_hw_phy_config\n" );
569
570 mdio_write(ioaddr, 0x1f, 0x0000);
571 mdio_patch(ioaddr, 0x14, 1 << 5);
572 mdio_patch(ioaddr, 0x0d, 1 << 5);
573
574 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
575 }
576
rtl8168c_1_hw_phy_config(void * ioaddr)577 static void rtl8168c_1_hw_phy_config(void *ioaddr)
578 {
579 struct phy_reg phy_reg_init[] = {
580 { 0x1f, 0x0001 },
581 { 0x12, 0x2300 },
582 { 0x1f, 0x0002 },
583 { 0x00, 0x88d4 },
584 { 0x01, 0x82b1 },
585 { 0x03, 0x7002 },
586 { 0x08, 0x9e30 },
587 { 0x09, 0x01f0 },
588 { 0x0a, 0x5500 },
589 { 0x0c, 0x00c8 },
590 { 0x1f, 0x0003 },
591 { 0x12, 0xc096 },
592 { 0x16, 0x000a },
593 { 0x1f, 0x0000 },
594 { 0x1f, 0x0000 },
595 { 0x09, 0x2000 },
596 { 0x09, 0x0000 }
597 };
598
599 DBGP ( "rtl8168c_1_hw_phy_config\n" );
600
601 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
602
603 mdio_patch(ioaddr, 0x14, 1 << 5);
604 mdio_patch(ioaddr, 0x0d, 1 << 5);
605 mdio_write(ioaddr, 0x1f, 0x0000);
606 }
607
rtl8168c_2_hw_phy_config(void * ioaddr)608 static void rtl8168c_2_hw_phy_config(void *ioaddr)
609 {
610 struct phy_reg phy_reg_init[] = {
611 { 0x1f, 0x0001 },
612 { 0x12, 0x2300 },
613 { 0x03, 0x802f },
614 { 0x02, 0x4f02 },
615 { 0x01, 0x0409 },
616 { 0x00, 0xf099 },
617 { 0x04, 0x9800 },
618 { 0x04, 0x9000 },
619 { 0x1d, 0x3d98 },
620 { 0x1f, 0x0002 },
621 { 0x0c, 0x7eb8 },
622 { 0x06, 0x0761 },
623 { 0x1f, 0x0003 },
624 { 0x16, 0x0f0a },
625 { 0x1f, 0x0000 }
626 };
627
628 DBGP ( "rtl8168c_2_hw_phy_config\n" );
629
630 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
631
632 mdio_patch(ioaddr, 0x16, 1 << 0);
633 mdio_patch(ioaddr, 0x14, 1 << 5);
634 mdio_patch(ioaddr, 0x0d, 1 << 5);
635 mdio_write(ioaddr, 0x1f, 0x0000);
636 }
637
rtl8168c_3_hw_phy_config(void * ioaddr)638 static void rtl8168c_3_hw_phy_config(void *ioaddr)
639 {
640 struct phy_reg phy_reg_init[] = {
641 { 0x1f, 0x0001 },
642 { 0x12, 0x2300 },
643 { 0x1d, 0x3d98 },
644 { 0x1f, 0x0002 },
645 { 0x0c, 0x7eb8 },
646 { 0x06, 0x5461 },
647 { 0x1f, 0x0003 },
648 { 0x16, 0x0f0a },
649 { 0x1f, 0x0000 }
650 };
651
652 DBGP ( "rtl8168c_3_hw_phy_config\n" );
653
654 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
655
656 mdio_patch(ioaddr, 0x16, 1 << 0);
657 mdio_patch(ioaddr, 0x14, 1 << 5);
658 mdio_patch(ioaddr, 0x0d, 1 << 5);
659 mdio_write(ioaddr, 0x1f, 0x0000);
660 }
661
rtl8168c_4_hw_phy_config(void * ioaddr)662 static void rtl8168c_4_hw_phy_config(void *ioaddr)
663 {
664 DBGP ( "rtl8168c_4_hw_phy_config\n" );
665
666 rtl8168c_3_hw_phy_config(ioaddr);
667 }
668
rtl8168d_hw_phy_config(void * ioaddr)669 static void rtl8168d_hw_phy_config(void *ioaddr)
670 {
671 struct phy_reg phy_reg_init_0[] = {
672 { 0x1f, 0x0001 },
673 { 0x09, 0x2770 },
674 { 0x08, 0x04d0 },
675 { 0x0b, 0xad15 },
676 { 0x0c, 0x5bf0 },
677 { 0x1c, 0xf101 },
678 { 0x1f, 0x0003 },
679 { 0x14, 0x94d7 },
680 { 0x12, 0xf4d6 },
681 { 0x09, 0xca0f },
682 { 0x1f, 0x0002 },
683 { 0x0b, 0x0b10 },
684 { 0x0c, 0xd1f7 },
685 { 0x1f, 0x0002 },
686 { 0x06, 0x5461 },
687 { 0x1f, 0x0002 },
688 { 0x05, 0x6662 },
689 { 0x1f, 0x0000 },
690 { 0x14, 0x0060 },
691 { 0x1f, 0x0000 },
692 { 0x0d, 0xf8a0 },
693 { 0x1f, 0x0005 },
694 { 0x05, 0xffc2 }
695 };
696
697 DBGP ( "rtl8168d_hw_phy_config\n" );
698
699 rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
700
701 if (mdio_read(ioaddr, 0x06) == 0xc400) {
702 struct phy_reg phy_reg_init_1[] = {
703 { 0x1f, 0x0005 },
704 { 0x01, 0x0300 },
705 { 0x1f, 0x0000 },
706 { 0x11, 0x401c },
707 { 0x16, 0x4100 },
708 { 0x1f, 0x0005 },
709 { 0x07, 0x0010 },
710 { 0x05, 0x83dc },
711 { 0x06, 0x087d },
712 { 0x05, 0x8300 },
713 { 0x06, 0x0101 },
714 { 0x06, 0x05f8 },
715 { 0x06, 0xf9fa },
716 { 0x06, 0xfbef },
717 { 0x06, 0x79e2 },
718 { 0x06, 0x835f },
719 { 0x06, 0xe0f8 },
720 { 0x06, 0x9ae1 },
721 { 0x06, 0xf89b },
722 { 0x06, 0xef31 },
723 { 0x06, 0x3b65 },
724 { 0x06, 0xaa07 },
725 { 0x06, 0x81e4 },
726 { 0x06, 0xf89a },
727 { 0x06, 0xe5f8 },
728 { 0x06, 0x9baf },
729 { 0x06, 0x06ae },
730 { 0x05, 0x83dc },
731 { 0x06, 0x8300 },
732 };
733
734 rtl_phy_write(ioaddr, phy_reg_init_1,
735 ARRAY_SIZE(phy_reg_init_1));
736 }
737
738 mdio_write(ioaddr, 0x1f, 0x0000);
739 }
740
rtl8102e_hw_phy_config(void * ioaddr)741 static void rtl8102e_hw_phy_config(void *ioaddr)
742 {
743 struct phy_reg phy_reg_init[] = {
744 { 0x1f, 0x0003 },
745 { 0x08, 0x441d },
746 { 0x01, 0x9100 },
747 { 0x1f, 0x0000 }
748 };
749
750 DBGP ( "rtl8102e_hw_phy_config\n" );
751
752 mdio_write(ioaddr, 0x1f, 0x0000);
753 mdio_patch(ioaddr, 0x11, 1 << 12);
754 mdio_patch(ioaddr, 0x19, 1 << 13);
755
756 rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
757 }
758
rtl_hw_phy_config(struct net_device * dev)759 static void rtl_hw_phy_config(struct net_device *dev)
760 {
761 struct rtl8169_private *tp = netdev_priv(dev);
762 void *ioaddr = tp->mmio_addr;
763
764 DBGP ( "rtl_hw_phy_config\n" );
765
766 DBG ( "mac_version = 0x%02x\n", tp->mac_version );
767
768 switch (tp->mac_version) {
769 case RTL_GIGA_MAC_VER_01:
770 break;
771 case RTL_GIGA_MAC_VER_02:
772 case RTL_GIGA_MAC_VER_03:
773 rtl8169s_hw_phy_config(ioaddr);
774 break;
775 case RTL_GIGA_MAC_VER_04:
776 rtl8169sb_hw_phy_config(ioaddr);
777 break;
778 case RTL_GIGA_MAC_VER_07:
779 case RTL_GIGA_MAC_VER_08:
780 case RTL_GIGA_MAC_VER_09:
781 rtl8102e_hw_phy_config(ioaddr);
782 break;
783 case RTL_GIGA_MAC_VER_11:
784 rtl8168bb_hw_phy_config(ioaddr);
785 break;
786 case RTL_GIGA_MAC_VER_12:
787 rtl8168bef_hw_phy_config(ioaddr);
788 break;
789 case RTL_GIGA_MAC_VER_17:
790 rtl8168bef_hw_phy_config(ioaddr);
791 break;
792 case RTL_GIGA_MAC_VER_18:
793 rtl8168cp_1_hw_phy_config(ioaddr);
794 break;
795 case RTL_GIGA_MAC_VER_19:
796 rtl8168c_1_hw_phy_config(ioaddr);
797 break;
798 case RTL_GIGA_MAC_VER_20:
799 rtl8168c_2_hw_phy_config(ioaddr);
800 break;
801 case RTL_GIGA_MAC_VER_21:
802 rtl8168c_3_hw_phy_config(ioaddr);
803 break;
804 case RTL_GIGA_MAC_VER_22:
805 rtl8168c_4_hw_phy_config(ioaddr);
806 break;
807 case RTL_GIGA_MAC_VER_23:
808 case RTL_GIGA_MAC_VER_24:
809 rtl8168cp_2_hw_phy_config(ioaddr);
810 break;
811 case RTL_GIGA_MAC_VER_25:
812 rtl8168d_hw_phy_config(ioaddr);
813 break;
814
815 default:
816 break;
817 }
818 }
819
rtl8169_phy_reset(struct net_device * dev __unused,struct rtl8169_private * tp)820 static void rtl8169_phy_reset(struct net_device *dev __unused,
821 struct rtl8169_private *tp)
822 {
823 void *ioaddr = tp->mmio_addr;
824 unsigned int i;
825
826 DBGP ( "rtl8169_phy_reset\n" );
827
828 tp->phy_reset_enable(ioaddr);
829 for (i = 0; i < 100; i++) {
830 if (!tp->phy_reset_pending(ioaddr))
831 return;
832 mdelay ( 1 );
833 }
834 DBG ( "PHY reset failed.\n" );
835 }
836
rtl8169_init_phy(struct net_device * dev,struct rtl8169_private * tp)837 static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
838 {
839 void *ioaddr = tp->mmio_addr;
840
841 DBGP ( "rtl8169_init_phy\n" );
842
843 rtl_hw_phy_config(dev);
844
845 if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
846 DBG ( "Set MAC Reg C+CR Offset 0x82h = 0x01h\n" );
847 RTL_W8(0x82, 0x01);
848 }
849
850 pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
851
852 if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
853 pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
854
855 if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
856 DBG ( "Set MAC Reg C+CR Offset 0x82h = 0x01h\n" );
857 RTL_W8(0x82, 0x01);
858 DBG ( "Set PHY Reg 0x0bh = 0x00h\n" );
859 mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
860 }
861
862 rtl8169_phy_reset(dev, tp);
863
864 /*
865 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
866 * only 8101. Don't panic.
867 */
868 rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
869
870 if ((RTL_R8(PHYstatus) & TBI_Enable))
871 DBG ( "TBI auto-negotiating\n" );
872 }
873
874 static const struct rtl_cfg_info {
875 void (*hw_start)(struct net_device *);
876 unsigned int region;
877 unsigned int align;
878 u16 intr_event;
879 u16 napi_event;
880 unsigned features;
881 } rtl_cfg_infos [] = {
882 [RTL_CFG_0] = {
883 .hw_start = rtl_hw_start_8169,
884 .region = 1,
885 .align = 0,
886 .intr_event = SYSErr | LinkChg | RxOverflow |
887 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
888 .napi_event = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
889 .features = RTL_FEATURE_GMII
890 },
891 [RTL_CFG_1] = {
892 .hw_start = rtl_hw_start_8168,
893 .region = 2,
894 .align = 8,
895 .intr_event = SYSErr | LinkChg | RxOverflow |
896 TxErr | TxOK | RxOK | RxErr,
897 .napi_event = TxErr | TxOK | RxOK | RxOverflow,
898 .features = RTL_FEATURE_GMII
899 },
900 [RTL_CFG_2] = {
901 .hw_start = rtl_hw_start_8101,
902 .region = 2,
903 .align = 8,
904 .intr_event = SYSErr | LinkChg | RxOverflow | PCSTimeout |
905 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
906 .napi_event = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
907 }
908 };
909
rtl8169_hw_reset(void * ioaddr)910 static void rtl8169_hw_reset(void *ioaddr)
911 {
912 DBGP ( "rtl8169_hw_reset\n" );
913
914 /* Disable interrupts */
915 rtl8169_irq_mask_and_ack(ioaddr);
916
917 /* Reset the chipset */
918 RTL_W8(ChipCmd, CmdReset);
919
920 /* PCI commit */
921 RTL_R8(ChipCmd);
922 }
923
rtl_set_rx_tx_config_registers(struct rtl8169_private * tp)924 static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
925 {
926 void *ioaddr = tp->mmio_addr;
927 u32 cfg = rtl8169_rx_config;
928
929 DBGP ( "rtl_set_rx_tx_config_registers\n" );
930
931 cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
932 RTL_W32(RxConfig, cfg);
933
934 /* Set DMA burst size and Interframe Gap Time */
935 RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
936 (InterFrameGap << TxInterFrameGapShift));
937 }
938
rtl_soft_reset(struct net_device * dev)939 static void rtl_soft_reset ( struct net_device *dev )
940 {
941 struct rtl8169_private *tp = netdev_priv(dev);
942 void *ioaddr = tp->mmio_addr;
943 unsigned int i;
944
945 DBGP ( "rtl_hw_soft_reset\n" );
946
947 /* Soft reset the chip. */
948 RTL_W8(ChipCmd, CmdReset);
949
950 /* Check that the chip has finished the reset. */
951 for (i = 0; i < 100; i++) {
952 if ((RTL_R8(ChipCmd) & CmdReset) == 0)
953 break;
954 mdelay ( 1 );
955 }
956
957 if ( i == 100 ) {
958 DBG ( "Reset Failed! (> 100 iterations)\n" );
959 }
960 }
961
rtl_hw_start(struct net_device * dev)962 static void rtl_hw_start ( struct net_device *dev )
963 {
964 struct rtl8169_private *tp = netdev_priv ( dev );
965
966 DBGP ( "rtl_hw_start\n" );
967
968 /* Soft reset NIC */
969 rtl_soft_reset ( dev );
970
971 tp->hw_start ( dev );
972 }
973
rtl_set_rx_tx_desc_registers(struct rtl8169_private * tp,void * ioaddr)974 static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
975 void *ioaddr)
976 {
977 DBGP ( "rtl_set_rx_tx_desc_registers\n" );
978
979 /*
980 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
981 * register to be written before TxDescAddrLow to work.
982 * Switching from MMIO to I/O access fixes the issue as well.
983 */
984 RTL_W32 ( TxDescStartAddrHigh, 0 );
985 RTL_W32 ( TxDescStartAddrLow, virt_to_bus ( tp->tx_base ) );
986 RTL_W32 ( RxDescAddrHigh, 0 );
987 RTL_W32 ( RxDescAddrLow, virt_to_bus ( tp->rx_base ) );
988 }
989
rtl_rw_cpluscmd(void * ioaddr)990 static u16 rtl_rw_cpluscmd(void *ioaddr)
991 {
992 u16 cmd;
993
994 DBGP ( "rtl_rw_cpluscmd\n" );
995
996 cmd = RTL_R16(CPlusCmd);
997 RTL_W16(CPlusCmd, cmd);
998 return cmd;
999 }
1000
rtl_set_rx_max_size(void * ioaddr)1001 static void rtl_set_rx_max_size(void *ioaddr)
1002 {
1003 DBGP ( "rtl_set_rx_max_size\n" );
1004
1005 RTL_W16 ( RxMaxSize, RX_BUF_SIZE );
1006 }
1007
rtl8169_set_magic_reg(void * ioaddr,unsigned mac_version)1008 static void rtl8169_set_magic_reg(void *ioaddr, unsigned mac_version)
1009 {
1010 struct {
1011 u32 mac_version;
1012 u32 clk;
1013 u32 val;
1014 } cfg2_info [] = {
1015 { RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
1016 { RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
1017 { RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
1018 { RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
1019 }, *p = cfg2_info;
1020 unsigned int i;
1021 u32 clk;
1022
1023 DBGP ( "rtl8169_set_magic_reg\n" );
1024
1025 clk = RTL_R8(Config2) & PCI_Clock_66MHz;
1026 for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
1027 if ((p->mac_version == mac_version) && (p->clk == clk)) {
1028 RTL_W32(0x7c, p->val);
1029 break;
1030 }
1031 }
1032 }
1033
rtl_set_rx_mode(struct net_device * netdev)1034 static void rtl_set_rx_mode ( struct net_device *netdev )
1035 {
1036 struct rtl8169_private *tp = netdev_priv ( netdev );
1037 void *ioaddr = tp->mmio_addr;
1038 u32 tmp;
1039
1040 DBGP ( "rtl_set_rx_mode\n" );
1041
1042 /* Accept all Multicast Packets */
1043
1044 RTL_W32 ( MAR0 + 0, 0xffffffff );
1045 RTL_W32 ( MAR0 + 4, 0xffffffff );
1046
1047 tmp = rtl8169_rx_config | AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
1048 ( RTL_R32 ( RxConfig ) & rtl_chip_info[tp->chipset].RxConfigMask );
1049
1050 RTL_W32 ( RxConfig, tmp );
1051 }
1052
rtl_hw_start_8169(struct net_device * dev)1053 static void rtl_hw_start_8169(struct net_device *dev)
1054 {
1055 struct rtl8169_private *tp = netdev_priv(dev);
1056 void *ioaddr = tp->mmio_addr;
1057 struct pci_device *pdev = tp->pci_dev;
1058
1059 DBGP ( "rtl_hw_start_8169\n" );
1060
1061 if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
1062 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
1063 pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
1064 }
1065
1066 RTL_W8(Cfg9346, Cfg9346_Unlock);
1067
1068 if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
1069 (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
1070 (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
1071 (tp->mac_version == RTL_GIGA_MAC_VER_04))
1072 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
1073
1074 RTL_W8(EarlyTxThres, EarlyTxThld);
1075
1076 rtl_set_rx_max_size(ioaddr);
1077
1078 if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
1079 (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
1080 (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
1081 (tp->mac_version == RTL_GIGA_MAC_VER_04))
1082 rtl_set_rx_tx_config_registers(tp);
1083
1084 tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
1085
1086 if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
1087 (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
1088 DBG ( "Set MAC Reg C+CR Offset 0xE0. "
1089 "Bit-3 and bit-14 MUST be 1\n" );
1090 tp->cp_cmd |= (1 << 14);
1091 }
1092
1093 RTL_W16(CPlusCmd, tp->cp_cmd);
1094
1095 rtl8169_set_magic_reg(ioaddr, tp->mac_version);
1096
1097 /*
1098 * Undocumented corner. Supposedly:
1099 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
1100 */
1101 RTL_W16(IntrMitigate, 0x0000);
1102
1103 rtl_set_rx_tx_desc_registers(tp, ioaddr);
1104
1105 if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
1106 (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
1107 (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
1108 (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
1109 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
1110 rtl_set_rx_tx_config_registers(tp);
1111 }
1112
1113 RTL_W8(Cfg9346, Cfg9346_Lock);
1114
1115 /* Initially a 10 us delay. Turned it into a PCI commit. - FR */
1116 RTL_R8(IntrMask);
1117
1118 RTL_W32(RxMissed, 0);
1119
1120 rtl_set_rx_mode(dev);
1121
1122 /* no early-rx interrupts */
1123 RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
1124
1125 // RTL_W16(IntrMask, tp->intr_event);
1126 }
1127
rtl_tx_performance_tweak(struct pci_device * pdev,u16 force)1128 static void rtl_tx_performance_tweak(struct pci_device *pdev, u16 force)
1129 {
1130 struct net_device *dev = pci_get_drvdata(pdev);
1131 struct rtl8169_private *tp = netdev_priv(dev);
1132 int cap = tp->pcie_cap;
1133
1134 DBGP ( "rtl_tx_performance_tweak\n" );
1135
1136 if (cap) {
1137 u16 ctl;
1138
1139 pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
1140 ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
1141 pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
1142 }
1143 }
1144
rtl_csi_access_enable(void * ioaddr)1145 static void rtl_csi_access_enable(void *ioaddr)
1146 {
1147 u32 csi;
1148
1149 DBGP ( "rtl_csi_access_enable\n" );
1150
1151 csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
1152 rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
1153 }
1154
1155 struct ephy_info {
1156 unsigned int offset;
1157 u16 mask;
1158 u16 bits;
1159 };
1160
rtl_ephy_init(void * ioaddr,struct ephy_info * e,int len)1161 static void rtl_ephy_init(void *ioaddr, struct ephy_info *e, int len)
1162 {
1163 u16 w;
1164
1165 DBGP ( "rtl_ephy_init\n" );
1166
1167 while (len-- > 0) {
1168 w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
1169 rtl_ephy_write(ioaddr, e->offset, w);
1170 e++;
1171 }
1172 }
1173
rtl_disable_clock_request(struct pci_device * pdev)1174 static void rtl_disable_clock_request(struct pci_device *pdev)
1175 {
1176 struct net_device *dev = pci_get_drvdata(pdev);
1177 struct rtl8169_private *tp = netdev_priv(dev);
1178 int cap = tp->pcie_cap;
1179
1180 DBGP ( "rtl_disable_clock_request\n" );
1181
1182 if (cap) {
1183 u16 ctl;
1184
1185 pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
1186 ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
1187 pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
1188 }
1189 }
1190
1191 #define R8168_CPCMD_QUIRK_MASK (\
1192 EnableBist | \
1193 Mac_dbgo_oe | \
1194 Force_half_dup | \
1195 Force_rxflow_en | \
1196 Force_txflow_en | \
1197 Cxpl_dbg_sel | \
1198 ASF | \
1199 PktCntrDisable | \
1200 Mac_dbgo_sel)
1201
rtl_hw_start_8168bb(void * ioaddr,struct pci_device * pdev)1202 static void rtl_hw_start_8168bb(void *ioaddr, struct pci_device *pdev)
1203 {
1204 DBGP ( "rtl_hw_start_8168bb\n" );
1205
1206 RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
1207
1208 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
1209
1210 rtl_tx_performance_tweak(pdev,
1211 (0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
1212 }
1213
rtl_hw_start_8168bef(void * ioaddr,struct pci_device * pdev)1214 static void rtl_hw_start_8168bef(void *ioaddr, struct pci_device *pdev)
1215 {
1216 DBGP ( "rtl_hw_start_8168bef\n" );
1217
1218 rtl_hw_start_8168bb(ioaddr, pdev);
1219
1220 RTL_W8(EarlyTxThres, EarlyTxThld);
1221
1222 RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
1223 }
1224
__rtl_hw_start_8168cp(void * ioaddr,struct pci_device * pdev)1225 static void __rtl_hw_start_8168cp(void *ioaddr, struct pci_device *pdev)
1226 {
1227 DBGP ( "__rtl_hw_start_8168cp\n" );
1228
1229 RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
1230
1231 RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
1232
1233 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
1234
1235 rtl_disable_clock_request(pdev);
1236
1237 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
1238 }
1239
rtl_hw_start_8168cp_1(void * ioaddr,struct pci_device * pdev)1240 static void rtl_hw_start_8168cp_1(void *ioaddr, struct pci_device *pdev)
1241 {
1242 static struct ephy_info e_info_8168cp[] = {
1243 { 0x01, 0, 0x0001 },
1244 { 0x02, 0x0800, 0x1000 },
1245 { 0x03, 0, 0x0042 },
1246 { 0x06, 0x0080, 0x0000 },
1247 { 0x07, 0, 0x2000 }
1248 };
1249
1250 DBGP ( "rtl_hw_start_8168cp_1\n" );
1251
1252 rtl_csi_access_enable(ioaddr);
1253
1254 rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
1255
1256 __rtl_hw_start_8168cp(ioaddr, pdev);
1257 }
1258
rtl_hw_start_8168cp_2(void * ioaddr,struct pci_device * pdev)1259 static void rtl_hw_start_8168cp_2(void *ioaddr, struct pci_device *pdev)
1260 {
1261 DBGP ( "rtl_hw_start_8168cp_2\n" );
1262
1263 rtl_csi_access_enable(ioaddr);
1264
1265 RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
1266
1267 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
1268
1269 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
1270 }
1271
rtl_hw_start_8168cp_3(void * ioaddr,struct pci_device * pdev)1272 static void rtl_hw_start_8168cp_3(void *ioaddr, struct pci_device *pdev)
1273 {
1274 DBGP ( "rtl_hw_start_8168cp_3\n" );
1275
1276 rtl_csi_access_enable(ioaddr);
1277
1278 RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
1279
1280 /* Magic. */
1281 RTL_W8(DBG_REG, 0x20);
1282
1283 RTL_W8(EarlyTxThres, EarlyTxThld);
1284
1285 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
1286
1287 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
1288 }
1289
rtl_hw_start_8168c_1(void * ioaddr,struct pci_device * pdev)1290 static void rtl_hw_start_8168c_1(void *ioaddr, struct pci_device *pdev)
1291 {
1292 static struct ephy_info e_info_8168c_1[] = {
1293 { 0x02, 0x0800, 0x1000 },
1294 { 0x03, 0, 0x0002 },
1295 { 0x06, 0x0080, 0x0000 }
1296 };
1297
1298 DBGP ( "rtl_hw_start_8168c_1\n" );
1299
1300 rtl_csi_access_enable(ioaddr);
1301
1302 RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
1303
1304 rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
1305
1306 __rtl_hw_start_8168cp(ioaddr, pdev);
1307 }
1308
rtl_hw_start_8168c_2(void * ioaddr,struct pci_device * pdev)1309 static void rtl_hw_start_8168c_2(void *ioaddr, struct pci_device *pdev)
1310 {
1311 static struct ephy_info e_info_8168c_2[] = {
1312 { 0x01, 0, 0x0001 },
1313 { 0x03, 0x0400, 0x0220 }
1314 };
1315
1316 DBGP ( "rtl_hw_start_8168c_2\n" );
1317
1318 rtl_csi_access_enable(ioaddr);
1319
1320 rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
1321
1322 __rtl_hw_start_8168cp(ioaddr, pdev);
1323 }
1324
rtl_hw_start_8168c_3(void * ioaddr,struct pci_device * pdev)1325 static void rtl_hw_start_8168c_3(void *ioaddr, struct pci_device *pdev)
1326 {
1327 DBGP ( "rtl_hw_start_8168c_3\n" );
1328
1329 rtl_hw_start_8168c_2(ioaddr, pdev);
1330 }
1331
rtl_hw_start_8168c_4(void * ioaddr,struct pci_device * pdev)1332 static void rtl_hw_start_8168c_4(void *ioaddr, struct pci_device *pdev)
1333 {
1334 DBGP ( "rtl_hw_start_8168c_4\n" );
1335
1336 rtl_csi_access_enable(ioaddr);
1337
1338 __rtl_hw_start_8168cp(ioaddr, pdev);
1339 }
1340
rtl_hw_start_8168d(void * ioaddr,struct pci_device * pdev)1341 static void rtl_hw_start_8168d(void *ioaddr, struct pci_device *pdev)
1342 {
1343 DBGP ( "rtl_hw_start_8168d\n" );
1344
1345 rtl_csi_access_enable(ioaddr);
1346
1347 rtl_disable_clock_request(pdev);
1348
1349 RTL_W8(EarlyTxThres, EarlyTxThld);
1350
1351 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
1352
1353 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
1354 }
1355
rtl_hw_start_8168(struct net_device * dev)1356 static void rtl_hw_start_8168(struct net_device *dev)
1357 {
1358 struct rtl8169_private *tp = netdev_priv(dev);
1359 void *ioaddr = tp->mmio_addr;
1360 struct pci_device *pdev = tp->pci_dev;
1361
1362 DBGP ( "rtl_hw_start_8168\n" );
1363
1364 RTL_W8(Cfg9346, Cfg9346_Unlock);
1365
1366 RTL_W8(EarlyTxThres, EarlyTxThld);
1367
1368 rtl_set_rx_max_size(ioaddr);
1369
1370 tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
1371
1372 RTL_W16(CPlusCmd, tp->cp_cmd);
1373
1374 RTL_W16(IntrMitigate, 0x5151);
1375
1376 /* Work around for RxFIFO overflow. */
1377 if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
1378 tp->intr_event |= RxFIFOOver | PCSTimeout;
1379 tp->intr_event &= ~RxOverflow;
1380 }
1381
1382 rtl_set_rx_tx_desc_registers(tp, ioaddr);
1383
1384 rtl_set_rx_mode(dev);
1385
1386 RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
1387 (InterFrameGap << TxInterFrameGapShift));
1388
1389 RTL_R8(IntrMask);
1390
1391 switch (tp->mac_version) {
1392 case RTL_GIGA_MAC_VER_11:
1393 rtl_hw_start_8168bb(ioaddr, pdev);
1394 break;
1395
1396 case RTL_GIGA_MAC_VER_12:
1397 case RTL_GIGA_MAC_VER_17:
1398 rtl_hw_start_8168bef(ioaddr, pdev);
1399 break;
1400
1401 case RTL_GIGA_MAC_VER_18:
1402 rtl_hw_start_8168cp_1(ioaddr, pdev);
1403 break;
1404
1405 case RTL_GIGA_MAC_VER_19:
1406 rtl_hw_start_8168c_1(ioaddr, pdev);
1407 break;
1408
1409 case RTL_GIGA_MAC_VER_20:
1410 rtl_hw_start_8168c_2(ioaddr, pdev);
1411 break;
1412
1413 case RTL_GIGA_MAC_VER_21:
1414 rtl_hw_start_8168c_3(ioaddr, pdev);
1415 break;
1416
1417 case RTL_GIGA_MAC_VER_22:
1418 rtl_hw_start_8168c_4(ioaddr, pdev);
1419 break;
1420
1421 case RTL_GIGA_MAC_VER_23:
1422 rtl_hw_start_8168cp_2(ioaddr, pdev);
1423 break;
1424
1425 case RTL_GIGA_MAC_VER_24:
1426 rtl_hw_start_8168cp_3(ioaddr, pdev);
1427 break;
1428
1429 case RTL_GIGA_MAC_VER_25:
1430 rtl_hw_start_8168d(ioaddr, pdev);
1431 break;
1432
1433 default:
1434 DBG ( "Unknown chipset (mac_version = %d).\n",
1435 tp->mac_version );
1436 break;
1437 }
1438
1439 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
1440
1441 RTL_W8(Cfg9346, Cfg9346_Lock);
1442
1443 RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
1444
1445 // RTL_W16(IntrMask, tp->intr_event);
1446 }
1447
1448 #define R810X_CPCMD_QUIRK_MASK (\
1449 EnableBist | \
1450 Mac_dbgo_oe | \
1451 Force_half_dup | \
1452 Force_half_dup | \
1453 Force_txflow_en | \
1454 Cxpl_dbg_sel | \
1455 ASF | \
1456 PktCntrDisable | \
1457 PCIDAC | \
1458 PCIMulRW)
1459
rtl_hw_start_8102e_1(void * ioaddr,struct pci_device * pdev)1460 static void rtl_hw_start_8102e_1(void *ioaddr, struct pci_device *pdev)
1461 {
1462 static struct ephy_info e_info_8102e_1[] = {
1463 { 0x01, 0, 0x6e65 },
1464 { 0x02, 0, 0x091f },
1465 { 0x03, 0, 0xc2f9 },
1466 { 0x06, 0, 0xafb5 },
1467 { 0x07, 0, 0x0e00 },
1468 { 0x19, 0, 0xec80 },
1469 { 0x01, 0, 0x2e65 },
1470 { 0x01, 0, 0x6e65 }
1471 };
1472 u8 cfg1;
1473
1474 DBGP ( "rtl_hw_start_8102e_1\n" );
1475
1476 rtl_csi_access_enable(ioaddr);
1477
1478 RTL_W8(DBG_REG, FIX_NAK_1);
1479
1480 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
1481
1482 RTL_W8(Config1,
1483 LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
1484 RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
1485
1486 cfg1 = RTL_R8(Config1);
1487 if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
1488 RTL_W8(Config1, cfg1 & ~LEDS0);
1489
1490 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
1491
1492 rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
1493 }
1494
rtl_hw_start_8102e_2(void * ioaddr,struct pci_device * pdev)1495 static void rtl_hw_start_8102e_2(void *ioaddr, struct pci_device *pdev)
1496 {
1497 DBGP ( "rtl_hw_start_8102e_2\n" );
1498
1499 rtl_csi_access_enable(ioaddr);
1500
1501 rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
1502
1503 RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
1504 RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
1505
1506 RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
1507 }
1508
rtl_hw_start_8102e_3(void * ioaddr,struct pci_device * pdev)1509 static void rtl_hw_start_8102e_3(void *ioaddr, struct pci_device *pdev)
1510 {
1511 DBGP ( "rtl_hw_start_8102e_3\n" );
1512
1513 rtl_hw_start_8102e_2(ioaddr, pdev);
1514
1515 rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
1516 }
1517
rtl_hw_start_8101(struct net_device * dev)1518 static void rtl_hw_start_8101(struct net_device *dev)
1519 {
1520 struct rtl8169_private *tp = netdev_priv(dev);
1521 void *ioaddr = tp->mmio_addr;
1522 struct pci_device *pdev = tp->pci_dev;
1523
1524 DBGP ( "rtl_hw_start_8101\n" );
1525
1526 if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
1527 (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
1528 int cap = tp->pcie_cap;
1529
1530 if (cap) {
1531 pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
1532 PCI_EXP_DEVCTL_NOSNOOP_EN);
1533 }
1534 }
1535
1536 switch (tp->mac_version) {
1537 case RTL_GIGA_MAC_VER_07:
1538 rtl_hw_start_8102e_1(ioaddr, pdev);
1539 break;
1540
1541 case RTL_GIGA_MAC_VER_08:
1542 rtl_hw_start_8102e_3(ioaddr, pdev);
1543 break;
1544
1545 case RTL_GIGA_MAC_VER_09:
1546 rtl_hw_start_8102e_2(ioaddr, pdev);
1547 break;
1548 }
1549
1550 RTL_W8(Cfg9346, Cfg9346_Unlock);
1551
1552 RTL_W8(EarlyTxThres, EarlyTxThld);
1553
1554 rtl_set_rx_max_size(ioaddr);
1555
1556 tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
1557
1558 RTL_W16(CPlusCmd, tp->cp_cmd);
1559
1560 RTL_W16(IntrMitigate, 0x0000);
1561
1562 rtl_set_rx_tx_desc_registers(tp, ioaddr);
1563
1564 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
1565 rtl_set_rx_tx_config_registers(tp);
1566
1567 RTL_W8(Cfg9346, Cfg9346_Lock);
1568
1569 RTL_R8(IntrMask);
1570
1571 rtl_set_rx_mode(dev);
1572
1573 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
1574
1575 RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
1576
1577 // RTL_W16(IntrMask, tp->intr_event);
1578 }
1579
1580 /*** gPXE API Support Routines ***/
1581
1582 /**
1583 * setup_tx_resources - allocate tx resources (descriptors)
1584 *
1585 * @v tp Driver private storage
1586 *
1587 * @ret rc Returns 0 on success, negative on failure
1588 **/
1589 static int
rtl8169_setup_tx_resources(struct rtl8169_private * tp)1590 rtl8169_setup_tx_resources ( struct rtl8169_private *tp )
1591 {
1592 DBGP ( "rtl8169_setup_tx_resources\n" );
1593
1594 tp->tx_base = malloc_dma ( R8169_TX_RING_BYTES, TX_RING_ALIGN );
1595
1596 if ( ! tp->tx_base ) {
1597 return -ENOMEM;
1598 }
1599
1600 memset ( tp->tx_base, 0, R8169_TX_RING_BYTES );
1601
1602 DBG ( "tp->tx_base = %#08lx\n", virt_to_bus ( tp->tx_base ) );
1603
1604 tp->tx_fill_ctr = 0;
1605 tp->tx_curr = 0;
1606 tp->tx_tail = 0;
1607
1608 return 0;
1609 }
1610
1611 static void
rtl8169_process_tx_packets(struct net_device * netdev)1612 rtl8169_process_tx_packets ( struct net_device *netdev )
1613 {
1614 struct rtl8169_private *tp = netdev_priv ( netdev );
1615
1616 uint32_t tx_status;
1617 struct TxDesc *tx_curr_desc;
1618
1619 DBGP ( "rtl8169_process_tx_packets\n" );
1620
1621 while ( tp->tx_tail != tp->tx_curr ) {
1622
1623 tx_curr_desc = tp->tx_base + tp->tx_tail;
1624
1625 tx_status = tx_curr_desc->opts1;
1626
1627 DBG2 ( "Before DescOwn check tx_status: %#08x\n", tx_status );
1628
1629 /* if the packet at tx_tail is not owned by hardware it is for us */
1630 if ( tx_status & DescOwn )
1631 break;
1632
1633 DBG ( "Transmitted packet.\n" );
1634 DBG ( "tp->tx_fill_ctr = %d\n", tp->tx_fill_ctr );
1635 DBG ( "tp->tx_tail = %d\n", tp->tx_tail );
1636 DBG ( "tp->tx_curr = %d\n", tp->tx_curr );
1637 DBG ( "tx_status = %d\n", tx_status );
1638 DBG ( "tx_curr_desc = %#08lx\n", virt_to_bus ( tx_curr_desc ) );
1639
1640 /* Pass packet to core for processing */
1641 netdev_tx_complete ( netdev, tp->tx_iobuf[tp->tx_tail] );
1642
1643 memset ( tx_curr_desc, 0, sizeof ( *tx_curr_desc ) );
1644
1645 /* Decrement count of used descriptors */
1646 tp->tx_fill_ctr--;
1647
1648 /* Increment sent packets index */
1649 tp->tx_tail = ( tp->tx_tail + 1 ) % NUM_TX_DESC;
1650 }
1651 }
1652
1653 static void
rtl8169_free_tx_resources(struct rtl8169_private * tp)1654 rtl8169_free_tx_resources ( struct rtl8169_private *tp )
1655 {
1656 DBGP ( "rtl8169_free_tx_resources\n" );
1657
1658 free_dma ( tp->tx_base, R8169_TX_RING_BYTES );
1659 }
1660
1661 static void
rtl8169_populate_rx_descriptor(struct rtl8169_private * tp,struct RxDesc * rx_desc,uint32_t index)1662 rtl8169_populate_rx_descriptor ( struct rtl8169_private *tp, struct RxDesc *rx_desc, uint32_t index )
1663 {
1664 DBGP ( "rtl8169_populate_rx_descriptor\n" );
1665
1666 DBG ( "Populating rx descriptor %d\n", index );
1667
1668 memset ( rx_desc, 0, sizeof ( *rx_desc ) );
1669
1670 rx_desc->addr_hi = 0;
1671 rx_desc->addr_lo = virt_to_bus ( tp->rx_iobuf[index]->data );
1672 rx_desc->opts2 = 0;
1673 rx_desc->opts1 = ( index == ( NUM_RX_DESC - 1 ) ? RingEnd : 0 ) |
1674 RX_BUF_SIZE;
1675 rx_desc->opts1 |= DescOwn;
1676 }
1677
1678 /**
1679 * Refill descriptor ring
1680 *
1681 * @v netdev Net device
1682 */
rtl8169_refill_rx_ring(struct rtl8169_private * tp)1683 static void rtl8169_refill_rx_ring ( struct rtl8169_private *tp )
1684 {
1685 struct RxDesc *rx_curr_desc;
1686 int i;
1687
1688 DBGP ( "rtl8169_refill_rx_ring\n" );
1689
1690 for ( i = 0; i < NUM_RX_DESC; i++ ) {
1691
1692 rx_curr_desc = ( tp->rx_base ) + i;
1693
1694 /* Don't touch descriptors owned by the NIC */
1695 if ( rx_curr_desc->opts1 & DescOwn )
1696 continue;
1697
1698 /* Don't touch descriptors with iobufs, they still need to be
1699 processed by the poll routine */
1700 if ( tp->rx_iobuf[tp->rx_curr] != NULL )
1701 continue;
1702
1703 /** If we can't get an iobuf for this descriptor
1704 try again later (next poll).
1705 */
1706 if ( ! ( tp->rx_iobuf[i] = alloc_iob ( RX_BUF_SIZE ) ) ) {
1707 DBG ( "Refill rx ring failed!!\n" );
1708 break;
1709 }
1710
1711 rtl8169_populate_rx_descriptor ( tp, rx_curr_desc, i );
1712 }
1713 }
1714
1715 /**
1716 * setup_rx_resources - allocate Rx resources (Descriptors)
1717 *
1718 * @v tp: Driver private structure
1719 *
1720 * @ret rc Returns 0 on success, negative on failure
1721 *
1722 **/
1723 static int
rtl8169_setup_rx_resources(struct rtl8169_private * tp)1724 rtl8169_setup_rx_resources ( struct rtl8169_private *tp )
1725 {
1726 DBGP ( "rtl8169_setup_rx_resources\n" );
1727
1728 tp->rx_base = malloc_dma ( R8169_RX_RING_BYTES, RX_RING_ALIGN );
1729
1730 DBG ( "tp->rx_base = %#08lx\n", virt_to_bus ( tp->rx_base ) );
1731
1732 if ( ! tp->rx_base ) {
1733 return -ENOMEM;
1734 }
1735 memset ( tp->rx_base, 0, R8169_RX_RING_BYTES );
1736
1737 rtl8169_refill_rx_ring ( tp );
1738
1739 tp->rx_curr = 0;
1740
1741 return 0;
1742 }
1743
1744 static void
rtl8169_process_rx_packets(struct net_device * netdev)1745 rtl8169_process_rx_packets ( struct net_device *netdev )
1746 {
1747 struct rtl8169_private *tp = netdev_priv ( netdev );
1748 uint32_t rx_status;
1749 uint16_t rx_len;
1750 struct RxDesc *rx_curr_desc;
1751 int i;
1752
1753 DBGP ( "rtl8169_process_rx_packets\n" );
1754
1755 for ( i = 0; i < NUM_RX_DESC; i++ ) {
1756
1757 rx_curr_desc = tp->rx_base + tp->rx_curr;
1758
1759 rx_status = rx_curr_desc->opts1;
1760
1761 DBG2 ( "Before DescOwn check rx_status: %#08x\n", rx_status );
1762
1763 /* Hardware still owns the descriptor */
1764 if ( rx_status & DescOwn )
1765 break;
1766
1767 /* We own the descriptor, but it has not been refilled yet */
1768 if ( tp->rx_iobuf[tp->rx_curr] == NULL )
1769 break;
1770
1771 rx_len = rx_status & 0x3fff;
1772
1773 DBG ( "Received packet.\n" );
1774 DBG ( "tp->rx_curr = %d\n", tp->rx_curr );
1775 DBG ( "rx_len = %d\n", rx_len );
1776 DBG ( "rx_status = %#08x\n", rx_status );
1777 DBG ( "rx_curr_desc = %#08lx\n", virt_to_bus ( rx_curr_desc ) );
1778
1779 if ( rx_status & RxRES ) {
1780
1781 netdev_rx_err ( netdev, tp->rx_iobuf[tp->rx_curr], -EINVAL );
1782
1783 DBG ( "rtl8169_poll: Corrupted packet received!\n"
1784 " rx_status: %#08x\n", rx_status );
1785
1786 } else {
1787
1788 /* Adjust size of the iobuf to reflect received data */
1789 iob_put ( tp->rx_iobuf[tp->rx_curr], rx_len );
1790
1791 /* Add this packet to the receive queue. */
1792 netdev_rx ( netdev, tp->rx_iobuf[tp->rx_curr] );
1793 }
1794
1795 /* Invalidate this iobuf and descriptor */
1796 tp->rx_iobuf[tp->rx_curr] = NULL;
1797 memset ( rx_curr_desc, 0, sizeof ( *rx_curr_desc ) );
1798
1799 /* Update pointer to next available rx descriptor */
1800 tp->rx_curr = ( tp->rx_curr + 1 ) % NUM_RX_DESC;
1801 }
1802 rtl8169_refill_rx_ring ( tp );
1803 }
1804
1805 static void
rtl8169_free_rx_resources(struct rtl8169_private * tp)1806 rtl8169_free_rx_resources ( struct rtl8169_private *tp )
1807 {
1808 int i;
1809
1810 DBGP ( "rtl8169_free_rx_resources\n" );
1811
1812 free_dma ( tp->rx_base, R8169_RX_RING_BYTES );
1813
1814 for ( i = 0; i < NUM_RX_DESC; i++ ) {
1815 free_iob ( tp->rx_iobuf[i] );
1816 tp->rx_iobuf[i] = NULL;
1817 }
1818 }
1819
1820 /**
1821 FIXME: Because gPXE's pci_device_id structure does not contain a
1822 field to contain arbitrary data, we need the following table to
1823 associate PCI IDs with nic variants, because a lot of driver
1824 routines depend on knowing which kind of variant they are dealing
1825 with. --mdc
1826 **/
1827
1828 #define _R(VENDOR,DEVICE,INDEX) \
1829 { .vendor = VENDOR, .device = DEVICE, .index = INDEX }
1830
1831 static const struct {
1832 uint16_t vendor;
1833 uint16_t device;
1834 int index;
1835 } nic_variant_table[] = {
1836 _R(0x10ec, 0x8129, RTL_CFG_0),
1837 _R(0x10ec, 0x8136, RTL_CFG_2),
1838 _R(0x10ec, 0x8167, RTL_CFG_0),
1839 _R(0x10ec, 0x8168, RTL_CFG_1),
1840 _R(0x10ec, 0x8169, RTL_CFG_0),
1841 _R(0x1186, 0x4300, RTL_CFG_0),
1842 _R(0x1259, 0xc107, RTL_CFG_0),
1843 _R(0x16ec, 0x0116, RTL_CFG_0),
1844 _R(0x1737, 0x1032, RTL_CFG_0),
1845 _R(0x0001, 0x8168, RTL_CFG_2),
1846 };
1847 #undef _R
1848
1849 static int
rtl8169_get_nic_variant(uint16_t vendor,uint16_t device)1850 rtl8169_get_nic_variant ( uint16_t vendor, uint16_t device )
1851 {
1852 u32 i;
1853
1854 DBGP ( "rtl8169_get_nic_variant\n" );
1855
1856 for (i = 0; i < ARRAY_SIZE(nic_variant_table); i++) {
1857 if ( ( nic_variant_table[i].vendor == vendor ) &&
1858 ( nic_variant_table[i].device == device ) ) {
1859 return ( nic_variant_table[i].index );
1860 }
1861 }
1862 DBG ( "No matching NIC variant found!\n" );
1863 return ( RTL_CFG_0 );
1864 }
1865
rtl8169_irq_enable(struct rtl8169_private * tp)1866 static void rtl8169_irq_enable ( struct rtl8169_private *tp )
1867 {
1868 void *ioaddr = tp->mmio_addr;
1869
1870 DBGP ( "rtl8169_irq_enable\n" );
1871
1872 RTL_W16 ( IntrMask, tp->intr_event );
1873 }
1874
rtl8169_irq_disable(struct rtl8169_private * tp)1875 static void rtl8169_irq_disable ( struct rtl8169_private *tp )
1876 {
1877 void *ioaddr = tp->mmio_addr;
1878
1879 DBGP ( "rtl8169_irq_disable\n" );
1880
1881 rtl8169_irq_mask_and_ack ( ioaddr );
1882 }
1883
1884 /*** gPXE Core API Routines ***/
1885
1886 /**
1887 * open - Called when a network interface is made active
1888 *
1889 * @v netdev network interface device structure
1890 * @ret rc Return status code, 0 on success, negative value on failure
1891 *
1892 **/
1893 static int
rtl8169_open(struct net_device * netdev)1894 rtl8169_open ( struct net_device *netdev )
1895 {
1896 struct rtl8169_private *tp = netdev_priv ( netdev );
1897 void *ioaddr = tp->mmio_addr;
1898 int rc;
1899
1900 DBGP ( "rtl8169_open\n" );
1901
1902 /* allocate transmit descriptors */
1903 rc = rtl8169_setup_tx_resources ( tp );
1904 if ( rc ) {
1905 DBG ( "Error setting up TX resources!\n" );
1906 goto err_setup_tx;
1907 }
1908
1909 /* allocate receive descriptors */
1910 rc = rtl8169_setup_rx_resources ( tp );
1911 if ( rc ) {
1912 DBG ( "Error setting up RX resources!\n" );
1913 goto err_setup_rx;
1914 }
1915
1916 rtl_hw_start ( netdev );
1917
1918 DBG ( "TxDescStartAddrHigh = %#08lx\n", RTL_R32 ( TxDescStartAddrHigh ) );
1919 DBG ( "TxDescStartAddrLow = %#08lx\n", RTL_R32 ( TxDescStartAddrLow ) );
1920 DBG ( "RxDescAddrHigh = %#08lx\n", RTL_R32 ( RxDescAddrHigh ) );
1921 DBG ( "RxDescAddrLow = %#08lx\n", RTL_R32 ( RxDescAddrLow ) );
1922
1923 return 0;
1924
1925 err_setup_rx:
1926 rtl8169_free_tx_resources ( tp );
1927 err_setup_tx:
1928 rtl8169_hw_reset ( ioaddr );
1929
1930 return rc;
1931 }
1932
1933 /**
1934 * transmit - Transmit a packet
1935 *
1936 * @v netdev Network device
1937 * @v iobuf I/O buffer
1938 *
1939 * @ret rc Returns 0 on success, negative on failure
1940 */
1941 static int
rtl8169_transmit(struct net_device * netdev,struct io_buffer * iobuf)1942 rtl8169_transmit ( struct net_device *netdev, struct io_buffer *iobuf )
1943 {
1944 struct rtl8169_private *tp = netdev_priv ( netdev );
1945 void *ioaddr = tp->mmio_addr;
1946 uint32_t tx_len = iob_len ( iobuf );
1947
1948 struct TxDesc *tx_curr_desc;
1949
1950 DBGP ("rtl8169_transmit\n");
1951
1952 if ( tp->tx_fill_ctr == NUM_TX_DESC ) {
1953 DBG ("TX overflow\n");
1954 return -ENOBUFS;
1955 }
1956
1957 /**
1958 * The rtl8169 family automatically pads short packets to a
1959 * minimum size, but if it did not, like some older cards,
1960 * we could do:
1961 * iob_pad ( iobuf, ETH_ZLEN );
1962 */
1963
1964 /* Save pointer to this iobuf we have been given to transmit so
1965 we can pass it to netdev_tx_complete() later */
1966 tp->tx_iobuf[tp->tx_curr] = iobuf;
1967
1968 tx_curr_desc = tp->tx_base + tp->tx_curr;
1969
1970 DBG ( "tp->tx_fill_ctr = %d\n", tp->tx_fill_ctr );
1971 DBG ( "tp->tx_curr = %d\n", tp->tx_curr );
1972 DBG ( "tx_curr_desc = %#08lx\n", virt_to_bus ( tx_curr_desc ) );
1973 DBG ( "iobuf->data = %#08lx\n", virt_to_bus ( iobuf->data ) );
1974 DBG ( "tx_len = %d\n", tx_len );
1975
1976 /* Configure current descriptor to transmit supplied packet */
1977 tx_curr_desc->addr_hi = 0;
1978 tx_curr_desc->addr_lo = virt_to_bus ( iobuf->data );
1979 tx_curr_desc->opts2 = 0;
1980 tx_curr_desc->opts1 = FirstFrag | LastFrag |
1981 ( tp->tx_curr == ( NUM_TX_DESC - 1 ) ? RingEnd : 0 ) |
1982 tx_len;
1983
1984 /* Mark descriptor as owned by NIC */
1985 tx_curr_desc->opts1 |= DescOwn;
1986
1987 DBG ( "tx_curr_desc->opts1 = %#08x\n", tx_curr_desc->opts1 );
1988 DBG ( "tx_curr_desc->opts2 = %#08x\n", tx_curr_desc->opts2 );
1989 DBG ( "tx_curr_desc->addr_hi = %#08x\n", tx_curr_desc->addr_hi );
1990 DBG ( "tx_curr_desc->addr_lo = %#08x\n", tx_curr_desc->addr_lo );
1991
1992 RTL_W8 ( TxPoll, NPQ ); /* set polling bit */
1993
1994 /* Point to next free descriptor */
1995 tp->tx_curr = ( tp->tx_curr + 1 ) % NUM_TX_DESC;
1996
1997 /* Increment number of tx descriptors in use */
1998 tp->tx_fill_ctr++;
1999
2000 return 0;
2001 }
2002
2003 /**
2004 * poll - Poll for received packets
2005 *
2006 * @v netdev Network device
2007 */
2008 static void
rtl8169_poll(struct net_device * netdev)2009 rtl8169_poll ( struct net_device *netdev )
2010 {
2011 struct rtl8169_private *tp = netdev_priv ( netdev );
2012 void *ioaddr = tp->mmio_addr;
2013
2014 uint16_t intr_status;
2015 uint16_t intr_mask;
2016
2017 DBGP ( "rtl8169_poll\n" );
2018
2019 intr_status = RTL_R16 ( IntrStatus );
2020 intr_mask = RTL_R16 ( IntrMask );
2021
2022 DBG2 ( "rtl8169_poll (before): intr_mask = %#04x intr_status = %#04x\n",
2023 intr_mask, intr_status );
2024
2025 RTL_W16 ( IntrStatus, 0xffff );
2026
2027 /* hotplug / major error / no more work / shared irq */
2028 if ( intr_status == 0xffff )
2029 return;
2030
2031 /* Process transmitted packets */
2032 rtl8169_process_tx_packets ( netdev );
2033
2034 /* Process received packets */
2035 rtl8169_process_rx_packets ( netdev );
2036 }
2037
2038 /**
2039 * close - Disable network interface
2040 *
2041 * @v netdev network interface device structure
2042 *
2043 **/
2044 static void
rtl8169_close(struct net_device * netdev)2045 rtl8169_close ( struct net_device *netdev )
2046 {
2047 struct rtl8169_private *tp = netdev_priv ( netdev );
2048 void *ioaddr = tp->mmio_addr;
2049
2050 DBGP ( "r8169_close\n" );
2051
2052 rtl8169_hw_reset ( ioaddr );
2053
2054 rtl8169_free_tx_resources ( tp );
2055 rtl8169_free_rx_resources ( tp );
2056 }
2057
2058 /**
2059 * irq - enable or Disable interrupts
2060 *
2061 * @v netdev network adapter
2062 * @v action requested interrupt action
2063 *
2064 **/
2065 static void
rtl8169_irq(struct net_device * netdev,int action)2066 rtl8169_irq ( struct net_device *netdev, int action )
2067 {
2068 struct rtl8169_private *tp = netdev_priv ( netdev );
2069
2070 DBGP ( "rtl8169_irq\n" );
2071
2072 switch ( action ) {
2073 case 0 :
2074 rtl8169_irq_disable ( tp );
2075 break;
2076 default :
2077 rtl8169_irq_enable ( tp );
2078 break;
2079 }
2080 }
2081
2082 static struct net_device_operations rtl8169_operations = {
2083 .open = rtl8169_open,
2084 .transmit = rtl8169_transmit,
2085 .poll = rtl8169_poll,
2086 .close = rtl8169_close,
2087 .irq = rtl8169_irq,
2088 };
2089
2090 /**
2091 * probe - Initial configuration of NIC
2092 *
2093 * @v pci PCI device
2094 * @v id PCI IDs
2095 *
2096 * @ret rc Return status code
2097 **/
2098 static int
rtl8169_probe(struct pci_device * pdev,const struct pci_device_id * ent)2099 rtl8169_probe ( struct pci_device *pdev, const struct pci_device_id *ent )
2100 {
2101 int i, rc;
2102 struct net_device *netdev;
2103 struct rtl8169_private *tp;
2104 void *ioaddr;
2105
2106 /** FIXME: This lookup is necessary because gPXE does not have a "data"
2107 element in the structure pci_device_id which can pass an arbitrary
2108 piece of data to the driver. It might be useful to add it. Then we
2109 could just use ent->data instead of having to look up cfg_index.
2110 **/
2111 int cfg_index = rtl8169_get_nic_variant ( ent->vendor, ent->device );
2112 const struct rtl_cfg_info *cfg = rtl_cfg_infos + cfg_index;
2113
2114 DBGP ( "rtl8169_probe\n" );
2115
2116 DBG ( "ent->vendor = %#04x, ent->device = %#04x\n", ent->vendor, ent->device );
2117
2118 DBG ( "cfg_index = %d\n", cfg_index );
2119 DBG ( "cfg->intr_event = %#04x\n", cfg->intr_event );
2120
2121 rc = -ENOMEM;
2122
2123 /* Allocate net device ( also allocates memory for netdev->priv
2124 and makes netdev-priv point to it )
2125 */
2126 netdev = alloc_etherdev ( sizeof ( *tp ) );
2127
2128 if ( ! netdev )
2129 goto err_alloc_etherdev;
2130
2131 /* Associate driver-specific network operations with
2132 generic network device layer
2133 */
2134 netdev_init ( netdev, &rtl8169_operations );
2135
2136 /* Associate this network device with the given PCI device */
2137 pci_set_drvdata ( pdev, netdev );
2138 netdev->dev = &pdev->dev;
2139
2140 /* Initialize driver private storage */
2141 tp = netdev_priv ( netdev );
2142 memset ( tp, 0, ( sizeof ( *tp ) ) );
2143
2144 tp->pci_dev = pdev;
2145 tp->irqno = pdev->irq;
2146 tp->netdev = netdev;
2147 tp->cfg_index = cfg_index;
2148 tp->intr_event = cfg->intr_event;
2149 tp->cp_cmd = PCIMulRW;
2150
2151 tp->hw_start = cfg->hw_start;
2152
2153 rc = -EIO;
2154
2155 adjust_pci_device ( pdev );
2156
2157 /* ioremap MMIO region */
2158 ioaddr = ioremap ( pdev->membase, R8169_REGS_SIZE );
2159
2160 if ( ! ioaddr ) {
2161 DBG ( "cannot remap MMIO\n" );
2162 rc = -EIO;
2163 goto err_ioremap;
2164 }
2165
2166 tp->mmio_addr = ioaddr;
2167
2168 tp->pcie_cap = pci_find_capability ( pdev, PCI_CAP_ID_EXP );
2169 if ( tp->pcie_cap ) {
2170 DBG ( "PCI Express capability\n" );
2171 } else {
2172 DBG ( "No PCI Express capability\n" );
2173 }
2174
2175 /* Mask interrupts just in case */
2176 rtl8169_irq_mask_and_ack ( ioaddr );
2177
2178 /* Soft reset NIC */
2179 rtl_soft_reset ( netdev );
2180
2181 /* Identify chip attached to board */
2182 rtl8169_get_mac_version ( tp, ioaddr );
2183
2184 for ( i = 0; (u32) i < ARRAY_SIZE ( rtl_chip_info ); i++ ) {
2185 if ( tp->mac_version == rtl_chip_info[i].mac_version )
2186 break;
2187 }
2188 if ( i == ARRAY_SIZE(rtl_chip_info ) ) {
2189 /* Unknown chip: assume array element #0, original RTL-8169 */
2190 DBG ( "Unknown chip version, assuming %s\n", rtl_chip_info[0].name );
2191 i = 0;
2192 }
2193 tp->chipset = i;
2194
2195 if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
2196 (RTL_R8(PHYstatus) & TBI_Enable)) {
2197 tp->set_speed = rtl8169_set_speed_tbi;
2198 tp->phy_reset_enable = rtl8169_tbi_reset_enable;
2199 tp->phy_reset_pending = rtl8169_tbi_reset_pending;
2200 tp->link_ok = rtl8169_tbi_link_ok;
2201
2202 tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
2203 } else {
2204 tp->set_speed = rtl8169_set_speed_xmii;
2205 tp->phy_reset_enable = rtl8169_xmii_reset_enable;
2206 tp->phy_reset_pending = rtl8169_xmii_reset_pending;
2207 tp->link_ok = rtl8169_xmii_link_ok;
2208 }
2209
2210 /* Get MAC address */
2211 for ( i = 0; i < MAC_ADDR_LEN; i++ )
2212 netdev->hw_addr[i] = RTL_R8 ( MAC0 + i );
2213
2214 DBG ( "%s\n", eth_ntoa ( netdev->hw_addr ) );
2215
2216 rtl8169_init_phy ( netdev, tp );
2217
2218 if ( ( rc = register_netdev ( netdev ) ) != 0 )
2219 goto err_register;
2220
2221 /* Mark as link up; we don't yet handle link state */
2222 netdev_link_up ( netdev );
2223
2224 DBG ( "rtl8169_probe succeeded!\n" );
2225
2226 /* No errors, return success */
2227 return 0;
2228
2229 /* Error return paths */
2230 err_register:
2231 err_ioremap:
2232 netdev_put ( netdev );
2233 err_alloc_etherdev:
2234 return rc;
2235 }
2236
2237 /**
2238 * remove - Device Removal Routine
2239 *
2240 * @v pdev PCI device information struct
2241 *
2242 **/
2243 static void
rtl8169_remove(struct pci_device * pdev)2244 rtl8169_remove ( struct pci_device *pdev )
2245 {
2246 struct net_device *netdev = pci_get_drvdata ( pdev );
2247 struct rtl8169_private *tp = netdev_priv ( netdev );
2248 void *ioaddr = tp->mmio_addr;
2249
2250 DBGP ( "rtl8169_remove\n" );
2251
2252 rtl8169_hw_reset ( ioaddr );
2253
2254 unregister_netdev ( netdev );
2255 netdev_nullify ( netdev );
2256 netdev_put ( netdev );
2257 }
2258
2259 static struct pci_device_id rtl8169_nics[] = {
2260 PCI_ROM(0x10ec, 0x8129, "rtl8169-0x8129", "rtl8169-0x8129", 0),
2261 PCI_ROM(0x10ec, 0x8136, "rtl8169-0x8136", "rtl8169-0x8136", 0),
2262 PCI_ROM(0x10ec, 0x8167, "rtl8169-0x8167", "rtl8169-0x8167", 0),
2263 PCI_ROM(0x10ec, 0x8168, "rtl8169-0x8168", "rtl8169-0x8168", 0),
2264 PCI_ROM(0x10ec, 0x8169, "rtl8169-0x8169", "rtl8169-0x8169", 0),
2265 PCI_ROM(0x1186, 0x4300, "rtl8169-0x4300", "rtl8169-0x4300", 0),
2266 PCI_ROM(0x1259, 0xc107, "rtl8169-0xc107", "rtl8169-0xc107", 0),
2267 PCI_ROM(0x16ec, 0x0116, "rtl8169-0x0116", "rtl8169-0x0116", 0),
2268 PCI_ROM(0x1737, 0x1032, "rtl8169-0x1032", "rtl8169-0x1032", 0),
2269 PCI_ROM(0x0001, 0x8168, "rtl8169-0x8168", "rtl8169-0x8168", 0),
2270 };
2271
2272 struct pci_driver rtl8169_driver __pci_driver = {
2273 .ids = rtl8169_nics,
2274 .id_count = ( sizeof ( rtl8169_nics ) / sizeof ( rtl8169_nics[0] ) ),
2275 .probe = rtl8169_probe,
2276 .remove = rtl8169_remove,
2277 };
2278
2279 /*
2280 * Local variables:
2281 * c-basic-offset: 8
2282 * c-indent-level: 8
2283 * tab-width: 8
2284 * End:
2285 */
2286