2 * forcedeth.c -- Driver for NVIDIA nForce media access controllers for gPXE
3 * Copyright (c) 2010 Andrei Faur <da3drus@gmail.com>
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.
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.
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.
19 * Portions of this code are taken from the Linux forcedeth driver that was
20 * based on a cleanroom reimplementation which was based on reverse engineered
21 * documentation written by Carl-Daniel Hailfinger and Andrew de Quincey:
22 * Copyright (C) 2003,4,5 Manfred Spraul
23 * Copyright (C) 2004 Andrew de Quincey (wol support)
24 * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane
25 * IRQ rate fixes, bigendian fixes, cleanups, verification)
26 * Copyright (c) 2004,2005,2006,2007,2008,2009 NVIDIA Corporation
28 * The probe, remove, open and close functions, along with the functions they
29 * call, are direct copies of the above mentioned driver, modified where
30 * necessary to make them work for gPXE.
32 * The poll and transmit functions were completely rewritten to make use of
33 * the gPXE API. This process was aided by constant referencing of the above
34 * mentioned Linux driver. This driver would not have been possible without this
39 FILE_LICENCE ( GPL2_OR_LATER
);
49 #include <gpxe/ethernet.h>
50 #include <gpxe/if_ether.h>
52 #include <gpxe/iobuf.h>
53 #include <gpxe/malloc.h>
54 #include <gpxe/netdevice.h>
55 #include <gpxe/crypto.h>
57 #include <gpxe/timer.h>
59 #include "forcedeth.h"
61 static inline void pci_push ( void *ioaddr
)
63 /* force out pending posted writes */
68 reg_delay ( struct forcedeth_private
*priv
, int offset
, u32 mask
,
69 u32 target
, int delay
, int delaymax
, const char *msg
)
71 void *ioaddr
= priv
->mmio_addr
;
82 } while ( ( readl ( ioaddr
+ offset
) & mask
) != target
);
87 /* read/write a register on the PHY */
89 mii_rw ( struct forcedeth_private
*priv
, int addr
, int miireg
, int value
)
91 void *ioaddr
= priv
->mmio_addr
;
95 writel ( NVREG_MIISTAT_MASK_RW
, ioaddr
+ NvRegMIIStatus
);
97 reg
= readl ( ioaddr
+ NvRegMIIControl
);
98 if ( reg
& NVREG_MIICTL_INUSE
) {
99 writel ( NVREG_MIICTL_INUSE
, ioaddr
+ NvRegMIIControl
);
100 udelay ( NV_MIIBUSY_DELAY
);
103 reg
= ( addr
<< NVREG_MIICTL_ADDRSHIFT
) | miireg
;
104 if ( value
!= MII_READ
) {
105 writel ( value
, ioaddr
+ NvRegMIIData
);
106 reg
|= NVREG_MIICTL_WRITE
;
108 writel ( reg
, ioaddr
+ NvRegMIIControl
);
110 if ( reg_delay ( priv
, NvRegMIIControl
, NVREG_MIICTL_INUSE
, 0,
111 NV_MIIPHY_DELAY
, NV_MIIPHY_DELAYMAX
, NULL
) ) {
112 DBG ( "mii_rw of reg %d at PHY %d timed out.\n",
115 } else if ( value
!= MII_READ
) {
116 /* it was a write operation - fewer failures are detectable */
117 DBG ( "mii_rw wrote 0x%x to reg %d at PHY %d\n",
118 value
, miireg
, addr
);
120 } else if ( readl ( ioaddr
+ NvRegMIIStatus
) & NVREG_MIISTAT_ERROR
) {
121 DBG ( "mii_rw of reg %d at PHY %d failed.\n",
125 retval
= readl ( ioaddr
+ NvRegMIIData
);
126 DBG ( "mii_rw read from reg %d at PHY %d: 0x%x.\n",
127 miireg
, addr
, retval
);
134 nv_txrx_gate ( struct forcedeth_private
*priv
, int gate
)
136 void *ioaddr
= priv
->mmio_addr
;
139 if ( ! priv
->mac_in_use
&&
140 ( priv
->driver_data
& DEV_HAS_POWER_CNTRL
) ) {
141 powerstate
= readl ( ioaddr
+ NvRegPowerState2
);
143 powerstate
|= NVREG_POWERSTATE2_GATE_CLOCKS
;
145 powerstate
&= ~NVREG_POWERSTATE2_GATE_CLOCKS
;
146 writel ( powerstate
, ioaddr
+ NvRegPowerState2
);
151 nv_mac_reset ( struct forcedeth_private
* priv
)
153 void *ioaddr
= priv
->mmio_addr
;
154 u32 temp1
, temp2
, temp3
;
156 writel ( NVREG_TXRXCTL_BIT2
| NVREG_TXRXCTL_RESET
| NVREG_TXRXCTL_DESC_1
,
157 ioaddr
+ NvRegTxRxControl
);
160 /* save registers since they will be cleared on reset */
161 temp1
= readl ( ioaddr
+ NvRegMacAddrA
);
162 temp2
= readl ( ioaddr
+ NvRegMacAddrB
);
163 temp3
= readl ( ioaddr
+ NvRegTransmitPoll
);
165 writel ( NVREG_MAC_RESET_ASSERT
, ioaddr
+ NvRegMacReset
);
167 udelay ( NV_MAC_RESET_DELAY
);
168 writel ( 0, ioaddr
+ NvRegMacReset
);
170 udelay ( NV_MAC_RESET_DELAY
);
172 /* restore saved registers */
173 writel ( temp1
, ioaddr
+ NvRegMacAddrA
);
174 writel ( temp2
, ioaddr
+ NvRegMacAddrB
);
175 writel ( temp3
, ioaddr
+ NvRegTransmitPoll
);
177 writel ( NVREG_TXRXCTL_BIT2
| NVREG_TXRXCTL_DESC_1
,
178 ioaddr
+ NvRegTxRxControl
);
183 nv_init_tx_ring ( struct forcedeth_private
*priv
)
187 for ( i
= 0; i
< TX_RING_SIZE
; i
++ ) {
188 priv
->tx_ring
[i
].flaglen
= 0;
189 priv
->tx_ring
[i
].buf
= 0;
190 priv
->tx_iobuf
[i
] = NULL
;
193 priv
->tx_fill_ctr
= 0;
199 * nv_alloc_rx - Allocates iobufs for every Rx descriptor
200 * that doesn't have one and isn't in use by the hardware
202 * @v priv Driver private structure
205 nv_alloc_rx ( struct forcedeth_private
*priv
)
207 struct ring_desc
*rx_curr_desc
;
211 DBGP ( "nv_alloc_rx\n" );
213 for ( i
= 0; i
< RX_RING_SIZE
; i
++ ) {
214 rx_curr_desc
= priv
->rx_ring
+ i
;
215 status
= le32_to_cpu ( rx_curr_desc
->flaglen
);
217 /* Don't touch the descriptors owned by the hardware */
218 if ( status
& NV_RX_AVAIL
)
221 /* Descriptors with iobufs still need to be processed */
222 if ( priv
->rx_iobuf
[i
] != NULL
)
225 /* If alloc_iob fails, try again later (next poll) */
226 if ( ! ( priv
->rx_iobuf
[i
] = alloc_iob ( RX_BUF_SZ
) ) ) {
227 DBG ( "Refill rx_ring failed, size %d\n", RX_BUF_SZ
);
232 cpu_to_le32 ( virt_to_bus ( priv
->rx_iobuf
[i
]->data
) );
234 rx_curr_desc
->flaglen
=
235 cpu_to_le32 ( RX_BUF_SZ
| NV_RX_AVAIL
);
240 nv_init_rx_ring ( struct forcedeth_private
*priv
)
244 for ( i
= 0; i
< RX_RING_SIZE
; i
++ ) {
245 priv
->rx_ring
[i
].flaglen
= 0;
246 priv
->rx_ring
[i
].buf
= 0;
247 priv
->rx_iobuf
[i
] = NULL
;
254 * nv_init_rings - Allocate and intialize descriptor rings
256 * @v priv Driver private structure
258 * @ret rc Return status code
261 nv_init_rings ( struct forcedeth_private
*priv
)
263 void *ioaddr
= priv
->mmio_addr
;
266 /* Allocate ring for both TX and RX */
268 malloc_dma ( sizeof(struct ring_desc
) * RXTX_RING_SIZE
, 32 );
269 if ( ! priv
->rx_ring
)
271 priv
->tx_ring
= &priv
->rx_ring
[RX_RING_SIZE
];
273 /* Initialize rings */
274 nv_init_tx_ring ( priv
);
275 nv_init_rx_ring ( priv
);
277 /* Allocate iobufs for RX */
278 nv_alloc_rx ( priv
);
281 writel ( cpu_to_le32 ( virt_to_bus ( priv
->rx_ring
) ),
282 ioaddr
+ NvRegRxRingPhysAddr
);
283 writel ( cpu_to_le32 ( virt_to_bus ( priv
->tx_ring
) ),
284 ioaddr
+ NvRegTxRingPhysAddr
);
286 DBG ( "RX ring at phys addr: %#08lx\n",
287 virt_to_bus ( priv
->rx_ring
) );
288 DBG ( "TX ring at phys addr: %#08lx\n",
289 virt_to_bus ( priv
->tx_ring
) );
291 writel ( ( ( RX_RING_SIZE
- 1 ) << NVREG_RINGSZ_RXSHIFT
) +
292 ( ( TX_RING_SIZE
- 1 ) << NVREG_RINGSZ_TXSHIFT
),
293 ioaddr
+ NvRegRingSizes
);
298 DBG ( "Could not allocate descriptor rings\n");
303 nv_free_rxtx_resources ( struct forcedeth_private
*priv
)
307 DBGP ( "nv_free_rxtx_resources\n" );
309 free_dma ( priv
->rx_ring
, sizeof(struct ring_desc
) * RXTX_RING_SIZE
);
311 for ( i
= 0; i
< RX_RING_SIZE
; i
++ ) {
312 free_iob ( priv
->rx_iobuf
[i
] );
313 priv
->rx_iobuf
[i
] = NULL
;
318 nv_txrx_reset ( struct forcedeth_private
*priv
)
320 void *ioaddr
= priv
->mmio_addr
;
322 writel ( NVREG_TXRXCTL_BIT2
| NVREG_TXRXCTL_RESET
| NVREG_TXRXCTL_DESC_1
,
323 ioaddr
+ NvRegTxRxControl
);
325 udelay ( NV_TXRX_RESET_DELAY
);
326 writel ( NVREG_TXRXCTL_BIT2
| NVREG_TXRXCTL_DESC_1
,
327 ioaddr
+ NvRegTxRxControl
);
332 nv_disable_hw_interrupts ( struct forcedeth_private
*priv
)
334 void *ioaddr
= priv
->mmio_addr
;
336 writel ( 0, ioaddr
+ NvRegIrqMask
);
340 nv_enable_hw_interrupts ( struct forcedeth_private
*priv
)
342 void *ioaddr
= priv
->mmio_addr
;
344 writel ( NVREG_IRQMASK_THROUGHPUT
, ioaddr
+ NvRegIrqMask
);
348 nv_start_rx ( struct forcedeth_private
*priv
)
350 void *ioaddr
= priv
->mmio_addr
;
351 u32 rx_ctrl
= readl ( ioaddr
+ NvRegReceiverControl
);
353 DBGP ( "nv_start_rx\n" );
354 /* Already running? Stop it. */
355 if ( ( readl ( ioaddr
+ NvRegReceiverControl
) & NVREG_RCVCTL_START
) && !priv
->mac_in_use
) {
356 rx_ctrl
&= ~NVREG_RCVCTL_START
;
357 writel ( rx_ctrl
, ioaddr
+ NvRegReceiverControl
);
360 writel ( priv
->linkspeed
, ioaddr
+ NvRegLinkSpeed
);
362 rx_ctrl
|= NVREG_RCVCTL_START
;
363 if ( priv
->mac_in_use
)
364 rx_ctrl
&= ~NVREG_RCVCTL_RX_PATH_EN
;
365 writel ( rx_ctrl
, ioaddr
+ NvRegReceiverControl
);
366 DBG ( "nv_start_rx to duplex %d, speed 0x%08x.\n",
367 priv
->duplex
, priv
->linkspeed
);
372 nv_stop_rx ( struct forcedeth_private
*priv
)
374 void *ioaddr
= priv
->mmio_addr
;
375 u32 rx_ctrl
= readl ( ioaddr
+ NvRegReceiverControl
);
377 DBGP ( "nv_stop_rx\n" );
378 if ( ! priv
->mac_in_use
)
379 rx_ctrl
&= ~NVREG_RCVCTL_START
;
381 rx_ctrl
|= NVREG_RCVCTL_RX_PATH_EN
;
382 writel ( rx_ctrl
, ioaddr
+ NvRegReceiverControl
);
383 reg_delay ( priv
, NvRegReceiverStatus
, NVREG_RCVSTAT_BUSY
, 0,
384 NV_RXSTOP_DELAY1
, NV_RXSTOP_DELAY1MAX
,
385 "nv_stop_rx: ReceiverStatus remained busy");
387 udelay ( NV_RXSTOP_DELAY2
);
388 if ( ! priv
->mac_in_use
)
389 writel ( 0, priv
+ NvRegLinkSpeed
);
393 nv_start_tx ( struct forcedeth_private
*priv
)
395 void *ioaddr
= priv
->mmio_addr
;
396 u32 tx_ctrl
= readl ( ioaddr
+ NvRegTransmitterControl
);
398 DBGP ( "nv_start_tx\n" );
399 tx_ctrl
|= NVREG_XMITCTL_START
;
400 if ( priv
->mac_in_use
)
401 tx_ctrl
&= ~NVREG_XMITCTL_TX_PATH_EN
;
402 writel ( tx_ctrl
, ioaddr
+ NvRegTransmitterControl
);
407 nv_stop_tx ( struct forcedeth_private
*priv
)
409 void *ioaddr
= priv
->mmio_addr
;
410 u32 tx_ctrl
= readl ( ioaddr
+ NvRegTransmitterControl
);
412 DBGP ( "nv_stop_tx");
414 if ( ! priv
->mac_in_use
)
415 tx_ctrl
&= ~NVREG_XMITCTL_START
;
417 tx_ctrl
|= NVREG_XMITCTL_TX_PATH_EN
;
418 writel ( tx_ctrl
, ioaddr
+ NvRegTransmitterControl
);
419 reg_delay ( priv
, NvRegTransmitterStatus
, NVREG_XMITSTAT_BUSY
, 0,
420 NV_TXSTOP_DELAY1
, NV_TXSTOP_DELAY1MAX
,
421 "nv_stop_tx: TransmitterStatus remained busy");
423 udelay ( NV_TXSTOP_DELAY2
);
424 if ( ! priv
->mac_in_use
)
425 writel( readl ( ioaddr
+ NvRegTransmitPoll
) &
426 NVREG_TRANSMITPOLL_MAC_ADDR_REV
,
427 ioaddr
+ NvRegTransmitPoll
);
432 nv_update_pause ( struct forcedeth_private
*priv
, u32 pause_flags
)
434 void *ioaddr
= priv
->mmio_addr
;
436 priv
->pause_flags
&= ~ ( NV_PAUSEFRAME_TX_ENABLE
|
437 NV_PAUSEFRAME_RX_ENABLE
);
439 if ( priv
->pause_flags
& NV_PAUSEFRAME_RX_CAPABLE
) {
440 u32 pff
= readl ( ioaddr
+ NvRegPacketFilterFlags
) & ~NVREG_PFF_PAUSE_RX
;
441 if ( pause_flags
& NV_PAUSEFRAME_RX_ENABLE
) {
442 writel ( pff
| NVREG_PFF_PAUSE_RX
, ioaddr
+ NvRegPacketFilterFlags
);
443 priv
->pause_flags
|= NV_PAUSEFRAME_RX_ENABLE
;
445 writel ( pff
, ioaddr
+ NvRegPacketFilterFlags
);
448 if ( priv
->pause_flags
& NV_PAUSEFRAME_TX_CAPABLE
) {
449 u32 regmisc
= readl ( ioaddr
+ NvRegMisc1
) & ~NVREG_MISC1_PAUSE_TX
;
450 if ( pause_flags
& NV_PAUSEFRAME_TX_ENABLE
) {
451 u32 pause_enable
= NVREG_TX_PAUSEFRAME_ENABLE_V1
;
452 if ( priv
->driver_data
& DEV_HAS_PAUSEFRAME_TX_V2
)
453 pause_enable
= NVREG_TX_PAUSEFRAME_ENABLE_V2
;
454 if ( priv
->driver_data
& DEV_HAS_PAUSEFRAME_TX_V3
) {
455 pause_enable
= NVREG_TX_PAUSEFRAME_ENABLE_V3
;
456 /* limit the number of tx pause frames to a default of 8 */
457 writel ( readl ( ioaddr
+ NvRegTxPauseFrameLimit
) |
458 NVREG_TX_PAUSEFRAMELIMIT_ENABLE
,
459 ioaddr
+ NvRegTxPauseFrameLimit
);
461 writel ( pause_enable
, ioaddr
+ NvRegTxPauseFrame
);
462 writel ( regmisc
| NVREG_MISC1_PAUSE_TX
, ioaddr
+ NvRegMisc1
);
463 priv
->pause_flags
|= NV_PAUSEFRAME_TX_ENABLE
;
465 writel ( NVREG_TX_PAUSEFRAME_DISABLE
, ioaddr
+ NvRegTxPauseFrame
);
466 writel ( regmisc
, ioaddr
+ NvRegMisc1
);
472 nv_update_linkspeed ( struct forcedeth_private
*priv
)
474 void *ioaddr
= priv
->mmio_addr
;
477 int adv_lpa
, adv_pause
, lpa_pause
;
478 u32 newls
= priv
->linkspeed
;
479 int newdup
= priv
->duplex
;
482 u32 control_1000
, status_1000
, phyreg
, pause_flags
, txreg
;
486 /* BMSR_LSTATUS is latched, read it twice:
487 * we want the current value.
489 mii_rw ( priv
, priv
->phyaddr
, MII_BMSR
, MII_READ
);
490 mii_status
= mii_rw ( priv
, priv
->phyaddr
, MII_BMSR
, MII_READ
);
492 if ( ! ( mii_status
& BMSR_LSTATUS
) ) {
493 DBG ( "No link detected by phy - falling back to 10HD.\n" );
494 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_10
;
500 /* check auto negotiation is complete */
501 if ( ! ( mii_status
& BMSR_ANEGCOMPLETE
) ) {
502 /* still in autonegotiation - configure nic for 10 MBit HD and wait. */
503 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_10
;
506 DBG ( "autoneg not completed - falling back to 10HD.\n" );
510 adv
= mii_rw ( priv
, priv
->phyaddr
, MII_ADVERTISE
, MII_READ
);
511 lpa
= mii_rw ( priv
, priv
->phyaddr
, MII_LPA
, MII_READ
);
512 DBG ( "nv_update_linkspeed: PHY advertises 0x%04x, lpa 0x%04x.\n", adv
, lpa
);
515 if ( priv
->gigabit
== PHY_GIGABIT
) {
516 control_1000
= mii_rw ( priv
, priv
->phyaddr
, MII_CTRL1000
, MII_READ
);
517 status_1000
= mii_rw ( priv
, priv
->phyaddr
, MII_STAT1000
, MII_READ
);
519 if ( ( control_1000
& ADVERTISE_1000FULL
) &&
520 ( status_1000
& LPA_1000FULL
) ) {
521 DBG ( "nv_update_linkspeed: GBit ethernet detected.\n" );
522 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_1000
;
528 /* FIXME: handle parallel detection properly */
530 if ( adv_lpa
& LPA_100FULL
) {
531 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_100
;
533 } else if ( adv_lpa
& LPA_100HALF
) {
534 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_100
;
536 } else if ( adv_lpa
& LPA_10FULL
) {
537 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_10
;
539 } else if ( adv_lpa
& LPA_10HALF
) {
540 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_10
;
543 DBG ( "bad ability %04x - falling back to 10HD.\n", adv_lpa
);
544 newls
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_10
;
549 if ( priv
->duplex
== newdup
&& priv
->linkspeed
== newls
)
552 DBG ( "changing link setting from %d/%d to %d/%d.\n",
553 priv
->linkspeed
, priv
->duplex
, newls
, newdup
);
555 priv
->duplex
= newdup
;
556 priv
->linkspeed
= newls
;
558 /* The transmitter and receiver must be restarted for safe update */
559 if ( readl ( ioaddr
+ NvRegTransmitterControl
) & NVREG_XMITCTL_START
) {
560 txrxFlags
|= NV_RESTART_TX
;
563 if ( readl ( ioaddr
+ NvRegReceiverControl
) & NVREG_RCVCTL_START
) {
564 txrxFlags
|= NV_RESTART_RX
;
568 if ( priv
->gigabit
== PHY_GIGABIT
) {
569 phyreg
= readl ( ioaddr
+ NvRegSlotTime
);
570 phyreg
&= ~(0x3FF00);
571 if ( ( ( priv
->linkspeed
& 0xFFF ) == NVREG_LINKSPEED_10
) ||
572 ( ( priv
->linkspeed
& 0xFFF ) == NVREG_LINKSPEED_100
) )
573 phyreg
|= NVREG_SLOTTIME_10_100_FULL
;
574 else if ( ( priv
->linkspeed
& 0xFFF ) == NVREG_LINKSPEED_1000
)
575 phyreg
|= NVREG_SLOTTIME_1000_FULL
;
576 writel( phyreg
, priv
+ NvRegSlotTime
);
579 phyreg
= readl ( ioaddr
+ NvRegPhyInterface
);
580 phyreg
&= ~( PHY_HALF
| PHY_100
| PHY_1000
);
581 if ( priv
->duplex
== 0 )
583 if ( ( priv
->linkspeed
& NVREG_LINKSPEED_MASK
) == NVREG_LINKSPEED_100
)
585 else if ( ( priv
->linkspeed
& NVREG_LINKSPEED_MASK
) == NVREG_LINKSPEED_1000
)
587 writel ( phyreg
, ioaddr
+ NvRegPhyInterface
);
589 phy_exp
= mii_rw ( priv
, priv
->phyaddr
, MII_EXPANSION
, MII_READ
) & EXPANSION_NWAY
; /* autoneg capable */
590 if ( phyreg
& PHY_RGMII
) {
591 if ( ( priv
->linkspeed
& NVREG_LINKSPEED_MASK
) == NVREG_LINKSPEED_1000
) {
592 txreg
= NVREG_TX_DEFERRAL_RGMII_1000
;
594 if ( !phy_exp
&& !priv
->duplex
&& ( priv
->driver_data
& DEV_HAS_COLLISION_FIX
) ) {
595 if ( ( priv
->linkspeed
& NVREG_LINKSPEED_MASK
) == NVREG_LINKSPEED_10
)
596 txreg
= NVREG_TX_DEFERRAL_RGMII_STRETCH_10
;
598 txreg
= NVREG_TX_DEFERRAL_RGMII_STRETCH_100
;
600 txreg
= NVREG_TX_DEFERRAL_RGMII_10_100
;
604 if ( !phy_exp
&& !priv
->duplex
&& ( priv
->driver_data
& DEV_HAS_COLLISION_FIX
) )
605 txreg
= NVREG_TX_DEFERRAL_MII_STRETCH
;
607 txreg
= NVREG_TX_DEFERRAL_DEFAULT
;
609 writel ( txreg
, ioaddr
+ NvRegTxDeferral
);
611 txreg
= NVREG_TX_WM_DESC1_DEFAULT
;
612 writel ( txreg
, ioaddr
+ NvRegTxWatermark
);
614 writel ( NVREG_MISC1_FORCE
| ( priv
->duplex
? 0 : NVREG_MISC1_HD
), ioaddr
+ NvRegMisc1
);
616 writel ( priv
->linkspeed
, priv
+ NvRegLinkSpeed
);
620 /* setup pause frame */
621 if ( priv
->duplex
!= 0 ) {
622 if ( priv
->pause_flags
& NV_PAUSEFRAME_AUTONEG
) {
623 adv_pause
= adv
& ( ADVERTISE_PAUSE_CAP
| ADVERTISE_PAUSE_ASYM
);
624 lpa_pause
= lpa
& ( LPA_PAUSE_CAP
| LPA_PAUSE_ASYM
);
626 switch ( adv_pause
) {
627 case ADVERTISE_PAUSE_CAP
:
628 if ( lpa_pause
& LPA_PAUSE_CAP
) {
629 pause_flags
|= NV_PAUSEFRAME_RX_ENABLE
;
630 if ( priv
->pause_flags
& NV_PAUSEFRAME_TX_REQ
)
631 pause_flags
|= NV_PAUSEFRAME_TX_ENABLE
;
634 case ADVERTISE_PAUSE_ASYM
:
635 if ( lpa_pause
== ( LPA_PAUSE_CAP
| LPA_PAUSE_ASYM
) )
637 pause_flags
|= NV_PAUSEFRAME_TX_ENABLE
;
640 case ADVERTISE_PAUSE_CAP
| ADVERTISE_PAUSE_ASYM
:
641 if ( lpa_pause
& LPA_PAUSE_CAP
)
643 pause_flags
|= NV_PAUSEFRAME_RX_ENABLE
;
644 if ( priv
->pause_flags
& NV_PAUSEFRAME_TX_REQ
)
645 pause_flags
|= NV_PAUSEFRAME_TX_ENABLE
;
647 if ( lpa_pause
== LPA_PAUSE_ASYM
)
649 pause_flags
|= NV_PAUSEFRAME_RX_ENABLE
;
654 pause_flags
= priv
->pause_flags
;
657 nv_update_pause ( priv
, pause_flags
);
659 if ( txrxFlags
& NV_RESTART_TX
)
660 nv_start_tx ( priv
);
661 if ( txrxFlags
& NV_RESTART_RX
)
662 nv_start_rx ( priv
);
669 * open - Called when a network interface is made active
671 * @v netdev Network device
672 * @ret rc Return status code, 0 on success, negative value on failure
675 forcedeth_open ( struct net_device
*netdev
)
677 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
678 void *ioaddr
= priv
->mmio_addr
;
683 DBGP ( "forcedeth_open\n" );
686 mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
,
687 mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, MII_READ
) & ~BMCR_PDOWN
);
689 nv_txrx_gate ( priv
, 0 );
691 /* Erase previous misconfiguration */
692 if ( priv
->driver_data
& DEV_HAS_POWER_CNTRL
)
693 nv_mac_reset ( priv
);
695 /* Clear multicast masks and addresses, enter promiscuous mode */
696 writel ( 0, ioaddr
+ NvRegMulticastAddrA
);
697 writel ( 0, ioaddr
+ NvRegMulticastAddrB
);
698 writel ( NVREG_MCASTMASKA_NONE
, ioaddr
+ NvRegMulticastMaskA
);
699 writel ( NVREG_MCASTMASKB_NONE
, ioaddr
+ NvRegMulticastMaskB
);
700 writel ( NVREG_PFF_PROMISC
, ioaddr
+ NvRegPacketFilterFlags
);
702 writel ( 0, ioaddr
+ NvRegTransmitterControl
);
703 writel ( 0, ioaddr
+ NvRegReceiverControl
);
705 writel ( 0, ioaddr
+ NvRegAdapterControl
);
707 writel ( 0, ioaddr
+ NvRegLinkSpeed
);
708 writel ( readl ( ioaddr
+ NvRegTransmitPoll
) & NVREG_TRANSMITPOLL_MAC_ADDR_REV
,
709 ioaddr
+ NvRegTransmitPoll
);
710 nv_txrx_reset ( priv
);
711 writel ( 0, ioaddr
+ NvRegUnknownSetupReg6
);
713 /* Initialize descriptor rings */
714 if ( ( rc
= nv_init_rings ( priv
) ) != 0 )
717 writel ( priv
->linkspeed
, ioaddr
+ NvRegLinkSpeed
);
718 writel ( NVREG_TX_WM_DESC1_DEFAULT
, ioaddr
+ NvRegTxWatermark
);
719 writel ( NVREG_TXRXCTL_DESC_1
, ioaddr
+ NvRegTxRxControl
);
720 writel ( 0 , ioaddr
+ NvRegVlanControl
);
722 writel ( NVREG_TXRXCTL_BIT1
| NVREG_TXRXCTL_DESC_1
,
723 ioaddr
+ NvRegTxRxControl
);
724 reg_delay ( priv
, NvRegUnknownSetupReg5
, NVREG_UNKSETUP5_BIT31
,
725 NVREG_UNKSETUP5_BIT31
, NV_SETUP5_DELAY
, NV_SETUP5_DELAYMAX
,
726 "open: SetupReg5, Bit 31 remained off\n" );
728 writel ( 0, ioaddr
+ NvRegMIIMask
);
729 writel ( NVREG_IRQSTAT_MASK
, ioaddr
+ NvRegIrqStatus
);
730 writel ( NVREG_MIISTAT_MASK_ALL
, ioaddr
+ NvRegMIIStatus
);
732 writel ( NVREG_MISC1_FORCE
| NVREG_MISC1_HD
, ioaddr
+ NvRegMisc1
);
733 writel ( readl ( ioaddr
+ NvRegTransmitterStatus
),
734 ioaddr
+ NvRegTransmitterStatus
);
735 writel ( RX_BUF_SZ
, ioaddr
+ NvRegOffloadConfig
);
737 writel ( readl ( ioaddr
+ NvRegReceiverStatus
),
738 ioaddr
+ NvRegReceiverStatus
);
740 /* Set up slot time */
741 get_random_bytes ( &low
, sizeof(low
) );
742 low
&= NVREG_SLOTTIME_MASK
;
743 writel ( low
| NVREG_SLOTTIME_DEFAULT
, ioaddr
+ NvRegSlotTime
);
745 writel ( NVREG_TX_DEFERRAL_DEFAULT
, ioaddr
+ NvRegTxDeferral
);
746 writel ( NVREG_RX_DEFERRAL_DEFAULT
, ioaddr
+ NvRegRxDeferral
);
748 writel ( NVREG_POLL_DEFAULT_THROUGHPUT
, ioaddr
+ NvRegPollingInterval
);
750 writel ( NVREG_UNKSETUP6_VAL
, ioaddr
+ NvRegUnknownSetupReg6
);
751 writel ( ( priv
->phyaddr
<< NVREG_ADAPTCTL_PHYSHIFT
) |
752 NVREG_ADAPTCTL_PHYVALID
| NVREG_ADAPTCTL_RUNNING
,
753 ioaddr
+ NvRegAdapterControl
);
754 writel ( NVREG_MIISPEED_BIT8
| NVREG_MIIDELAY
, ioaddr
+ NvRegMIISpeed
);
755 writel ( NVREG_MII_LINKCHANGE
, ioaddr
+ NvRegMIIMask
);
757 i
= readl ( ioaddr
+ NvRegPowerState
);
758 if ( ( i
& NVREG_POWERSTATE_POWEREDUP
) == 0 )
759 writel ( NVREG_POWERSTATE_POWEREDUP
| i
, ioaddr
+ NvRegPowerState
);
763 writel ( readl ( ioaddr
+ NvRegPowerState
) | NVREG_POWERSTATE_VALID
,
764 ioaddr
+ NvRegPowerState
);
766 nv_disable_hw_interrupts ( priv
);
768 writel ( NVREG_MIISTAT_MASK_ALL
, ioaddr
+ NvRegMIIStatus
);
769 writel ( NVREG_IRQSTAT_MASK
, ioaddr
+ NvRegIrqStatus
);
772 readl ( ioaddr
+ NvRegMIIStatus
);
773 writel ( NVREG_MIISTAT_MASK_ALL
, ioaddr
+ NvRegMIIStatus
);
775 ret
= nv_update_linkspeed ( priv
);
776 nv_start_rx ( priv
);
777 nv_start_tx ( priv
);
786 * transmit - Transmit a packet
788 * @v netdev Network device
789 * @v iobuf I/O buffer
791 * @ret rc Returns 0 on success, negative on failure
794 forcedeth_transmit ( struct net_device
*netdev
, struct io_buffer
*iobuf
)
796 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
797 void *ioaddr
= priv
->mmio_addr
;
798 struct ring_desc
*tx_curr_desc
;
799 u32 size
= iob_len ( iobuf
);
801 DBGP ( "forcedeth_transmit\n" );
803 /* NOTE: Some NICs have a hw bug that causes them to malfunction
804 * when there are more than 16 outstanding TXs. Increasing the TX
805 * ring size might trigger this bug */
806 if ( priv
->tx_fill_ctr
== TX_RING_SIZE
) {
807 DBG ( "Tx overflow\n" );
811 /* Pad small packets to minimum length */
812 iob_pad ( iobuf
, ETH_ZLEN
);
814 priv
->tx_iobuf
[priv
->tx_curr
] = iobuf
;
816 tx_curr_desc
= priv
->tx_ring
+ priv
->tx_curr
;
818 /* Configure current descriptor to transmit packet
819 * ( NV_TX_VALID sets the ownership bit ) */
821 cpu_to_le32 ( virt_to_bus ( iobuf
->data
) );
823 /* Since we don't do fragmentation offloading, we always have
824 * the last packet bit set */
825 tx_curr_desc
->flaglen
=
826 cpu_to_le32 ( ( size
- 1 ) | NV_TX_VALID
| NV_TX_LASTPACKET
);
828 DBG ( "forcedeth_transmit: flaglen = %#04x\n",
829 ( size
- 1 ) | NV_TX_VALID
| NV_TX_LASTPACKET
);
830 DBG ( "forcedeth_transmit: tx_fill_ctr = %d\n",
833 writel ( NVREG_TXRXCTL_KICK
| NVREG_TXRXCTL_DESC_1
,
834 ioaddr
+ NvRegTxRxControl
);
837 /* Point to the next free descriptor */
838 priv
->tx_curr
= ( priv
->tx_curr
+ 1 ) % TX_RING_SIZE
;
840 /* Increment number of descriptors in use */
847 * nv_process_tx_packets - Checks for successfully sent packets,
848 * reports them to gPXE with netdev_tx_complete()
850 * @v netdev Network device
853 nv_process_tx_packets ( struct net_device
*netdev
)
855 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
856 struct ring_desc
*tx_curr_desc
;
859 DBGP ( "nv_process_tx_packets\n" );
861 while ( priv
->tx_tail
!= priv
->tx_curr
) {
863 tx_curr_desc
= priv
->tx_ring
+ priv
->tx_tail
;
864 flaglen
= le32_to_cpu ( tx_curr_desc
->flaglen
);
867 /* Skip this descriptor if hardware still owns it */
868 if ( flaglen
& NV_TX_VALID
)
871 DBG ( "Transmitted packet.\n" );
872 DBG ( "priv->tx_fill_ctr= %d\n", priv
->tx_fill_ctr
);
873 DBG ( "priv->tx_tail = %d\n", priv
->tx_tail
);
874 DBG ( "priv->tx_curr = %d\n", priv
->tx_curr
);
875 DBG ( "flaglen = %#04x\n", flaglen
);
877 /* This packet is ready for completion */
878 netdev_tx_complete ( netdev
, priv
->tx_iobuf
[priv
->tx_tail
] );
880 /* Clear the descriptor */
881 memset ( tx_curr_desc
, 0, sizeof(*tx_curr_desc
) );
883 /* Reduce the number of tx descriptors in use */
886 /* Go to next available descriptor */
887 priv
->tx_tail
= ( priv
->tx_tail
+ 1 ) % TX_RING_SIZE
;
892 * nv_process_rx_packets - Checks for received packets, reports them
893 * to gPXE with netdev_rx() or netdev_rx_err() if there was an error receiving
896 * @v netdev Network device
899 nv_process_rx_packets ( struct net_device
*netdev
)
901 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
902 struct io_buffer
*curr_iob
;
903 struct ring_desc
*rx_curr_desc
;
907 DBGP ( "nv_process_rx_packets\n" );
909 for ( i
= 0; i
< RX_RING_SIZE
; i
++ ) {
911 rx_curr_desc
= priv
->rx_ring
+ priv
->rx_curr
;
912 flags
= le32_to_cpu ( rx_curr_desc
->flaglen
);
915 /* Skip this descriptor if hardware still owns it */
916 if ( flags
& NV_RX_AVAIL
)
919 /* We own the descriptor, but it has not been refilled yet */
920 curr_iob
= priv
->rx_iobuf
[priv
->rx_curr
];
921 DBG ( "%p %p\n", curr_iob
, priv
->rx_iobuf
[priv
->rx_curr
] );
922 if ( curr_iob
== NULL
)
925 DBG ( "Received packet.\n" );
926 DBG ( "priv->rx_curr = %d\n", priv
->rx_curr
);
927 DBG ( "flags = %#04x\n", flags
);
929 /* Check for errors */
930 if ( ( flags
& NV_RX_DESCRIPTORVALID
) &&
931 ( flags
& NV_RX_ERROR
) ) {
932 netdev_rx_err ( netdev
, curr_iob
, -EINVAL
);
933 DBG ( " Corrupted packet received!\n" );
935 len
= flags
& LEN_MASK_V1
;
937 /* Filter any frames that have as destination address a
938 * local MAC address but are not meant for this NIC */
939 if ( is_local_ether_addr ( curr_iob
->data
) &&
940 memcmp ( curr_iob
->data
, netdev
->hw_addr
, ETH_ALEN
) ) {
941 free_iob ( curr_iob
);
943 iob_put ( curr_iob
, len
);
944 netdev_rx ( netdev
, curr_iob
);
948 /* Invalidate iobuf */
949 priv
->rx_iobuf
[priv
->rx_curr
] = NULL
;
951 /* Invalidate descriptor */
952 memset ( rx_curr_desc
, 0, sizeof(*rx_curr_desc
) );
954 /* Point to the next free descriptor */
955 priv
->rx_curr
= ( priv
->rx_curr
+ 1 ) % RX_RING_SIZE
;
958 nv_alloc_rx ( priv
);
962 * check_link - Check for link status change
964 * @v netdev Network device
967 forcedeth_link_status ( struct net_device
*netdev
)
969 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
971 if ( nv_update_linkspeed ( priv
) == 1 )
972 netdev_link_up ( netdev
);
974 netdev_link_down ( netdev
);
978 * poll - Poll for received packets
980 * @v netdev Network device
983 forcedeth_poll ( struct net_device
*netdev
)
985 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
986 void *ioaddr
= priv
->mmio_addr
;
989 DBGP ( "forcedeth_poll\n" );
991 status
= readl ( ioaddr
+ NvRegIrqStatus
) & NVREG_IRQSTAT_MASK
;
993 /* Clear interrupts */
994 writel ( NVREG_IRQSTAT_MASK
, ioaddr
+ NvRegIrqStatus
);
996 DBG ( "forcedeth_poll: status = %#04x\n", status
);
998 /* Link change interrupt occured. Call always if link is down,
999 * to give auto-neg a chance to finish */
1000 if ( ( status
& NVREG_IRQ_LINK
) || ! ( netdev_link_ok ( netdev
) ) )
1001 forcedeth_link_status ( netdev
);
1003 /* Return when no interrupts have been triggered */
1007 /* Process transmitted packets */
1008 nv_process_tx_packets ( netdev
);
1010 /* Process received packets */
1011 nv_process_rx_packets ( netdev
);
1015 * close - Disable network interface
1017 * @v netdev network interface device structure
1020 forcedeth_close ( struct net_device
*netdev
)
1022 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
1023 void *ioaddr
= priv
->mmio_addr
;
1025 DBGP ( "forcedeth_close\n" );
1027 nv_stop_rx ( priv
);
1028 nv_stop_tx ( priv
);
1029 nv_txrx_reset ( priv
);
1031 /* Disable interrupts on the nic or we will lock up */
1032 nv_disable_hw_interrupts ( priv
);
1033 pci_push ( ioaddr
);
1035 nv_free_rxtx_resources ( priv
);
1037 nv_txrx_gate ( priv
, 0 );
1039 /* FIXME: power down nic */
1043 * irq - enable or disable interrupts
1045 * @v netdev network adapter
1046 * @v action requested interrupt action
1049 forcedeth_irq ( struct net_device
*netdev
, int action
)
1051 struct forcedeth_private
*priv
= netdev_priv ( netdev
);
1053 DBGP ( "forcedeth_irq\n" );
1057 nv_disable_hw_interrupts ( priv
);
1060 nv_enable_hw_interrupts ( priv
);
1065 static struct net_device_operations forcedeth_operations
= {
1066 .open
= forcedeth_open
,
1067 .transmit
= forcedeth_transmit
,
1068 .poll
= forcedeth_poll
,
1069 .close
= forcedeth_close
,
1070 .irq
= forcedeth_irq
,
1074 nv_setup_mac_addr ( struct forcedeth_private
*priv
)
1076 struct net_device
*dev
= priv
->netdev
;
1077 void *ioaddr
= priv
->mmio_addr
;
1081 orig_mac
[0] = readl ( ioaddr
+ NvRegMacAddrA
);
1082 orig_mac
[1] = readl ( ioaddr
+ NvRegMacAddrB
);
1084 txreg
= readl ( ioaddr
+ NvRegTransmitPoll
);
1086 if ( ( priv
->driver_data
& DEV_HAS_CORRECT_MACADDR
) ||
1087 ( txreg
& NVREG_TRANSMITPOLL_MAC_ADDR_REV
) ) {
1088 /* mac address is already in correct order */
1089 dev
->hw_addr
[0] = ( orig_mac
[0] >> 0 ) & 0xff;
1090 dev
->hw_addr
[1] = ( orig_mac
[0] >> 8 ) & 0xff;
1091 dev
->hw_addr
[2] = ( orig_mac
[0] >> 16 ) & 0xff;
1092 dev
->hw_addr
[3] = ( orig_mac
[0] >> 24 ) & 0xff;
1093 dev
->hw_addr
[4] = ( orig_mac
[1] >> 0 ) & 0xff;
1094 dev
->hw_addr
[5] = ( orig_mac
[1] >> 8 ) & 0xff;
1096 /* need to reverse mac address to correct order */
1097 dev
->hw_addr
[0] = ( orig_mac
[1] >> 8 ) & 0xff;
1098 dev
->hw_addr
[1] = ( orig_mac
[1] >> 0 ) & 0xff;
1099 dev
->hw_addr
[2] = ( orig_mac
[0] >> 24 ) & 0xff;
1100 dev
->hw_addr
[3] = ( orig_mac
[0] >> 16 ) & 0xff;
1101 dev
->hw_addr
[4] = ( orig_mac
[0] >> 8 ) & 0xff;
1102 dev
->hw_addr
[5] = ( orig_mac
[0] >> 0 ) & 0xff;
1104 writel ( txreg
| NVREG_TRANSMITPOLL_MAC_ADDR_REV
,
1105 ioaddr
+ NvRegTransmitPoll
);
1107 DBG ( "set workaround bit for reversed mac addr\n" );
1110 if ( ! is_valid_ether_addr ( dev
->hw_addr
) )
1111 return -EADDRNOTAVAIL
;
1113 DBG ( "MAC address is: %s\n", eth_ntoa ( dev
->hw_addr
) );
1119 nv_mgmt_acquire_sema ( struct forcedeth_private
*priv
)
1121 void *ioaddr
= priv
->mmio_addr
;
1123 u32 tx_ctrl
, mgmt_sema
;
1125 for ( i
= 0; i
< 10; i
++ ) {
1126 mgmt_sema
= readl ( ioaddr
+ NvRegTransmitterControl
) &
1127 NVREG_XMITCTL_MGMT_SEMA_MASK
;
1128 if ( mgmt_sema
== NVREG_XMITCTL_MGMT_SEMA_FREE
)
1133 if ( mgmt_sema
!= NVREG_XMITCTL_MGMT_SEMA_FREE
)
1136 for ( i
= 0; i
< 2; i
++ ) {
1137 tx_ctrl
= readl ( ioaddr
+ NvRegTransmitterControl
);
1138 tx_ctrl
|= NVREG_XMITCTL_HOST_SEMA_ACQ
;
1139 writel ( tx_ctrl
, ioaddr
+ NvRegTransmitterControl
);
1141 /* verify that the semaphore was acquired */
1142 tx_ctrl
= readl ( ioaddr
+ NvRegTransmitterControl
);
1143 if ( ( ( tx_ctrl
& NVREG_XMITCTL_HOST_SEMA_MASK
) ==
1144 NVREG_XMITCTL_HOST_SEMA_ACQ
) &&
1145 ( ( tx_ctrl
& NVREG_XMITCTL_MGMT_SEMA_MASK
) ==
1146 NVREG_XMITCTL_MGMT_SEMA_FREE
) ) {
1147 priv
->mgmt_sema
= 1;
1158 nv_mgmt_release_sema ( struct forcedeth_private
*priv
)
1160 void *ioaddr
= priv
->mmio_addr
;
1163 if ( priv
->driver_data
& DEV_HAS_MGMT_UNIT
) {
1164 if ( priv
->mgmt_sema
) {
1165 tx_ctrl
= readl (ioaddr
+ NvRegTransmitterControl
);
1166 tx_ctrl
&= ~NVREG_XMITCTL_HOST_SEMA_ACQ
;
1167 writel ( tx_ctrl
, ioaddr
+ NvRegTransmitterControl
);
1173 nv_mgmt_get_version ( struct forcedeth_private
*priv
)
1175 void *ioaddr
= priv
->mmio_addr
;
1176 u32 data_ready
= readl ( ioaddr
+ NvRegTransmitterControl
);
1177 u32 data_ready2
= 0;
1178 unsigned long start
;
1181 writel ( NVREG_MGMTUNITGETVERSION
,
1182 ioaddr
+ NvRegMgmtUnitGetVersion
);
1183 writel ( data_ready
^ NVREG_XMITCTL_DATA_START
,
1184 ioaddr
+ NvRegTransmitterControl
);
1185 start
= currticks();
1187 while ( currticks() > start
+ 5 * ticks_per_sec() ) {
1188 data_ready2
= readl ( ioaddr
+ NvRegTransmitterControl
);
1189 if ( ( data_ready
& NVREG_XMITCTL_DATA_READY
) !=
1190 ( data_ready2
& NVREG_XMITCTL_DATA_READY
) ) {
1197 if ( ! ready
|| ( data_ready2
& NVREG_XMITCTL_DATA_ERROR
) )
1200 priv
->mgmt_version
=
1201 readl ( ioaddr
+ NvRegMgmtUnitVersion
) & NVREG_MGMTUNITVERSION
;
1209 phy_reset ( struct forcedeth_private
*priv
, u32 bmcr_setup
)
1212 unsigned int tries
= 0;
1214 miicontrol
= BMCR_RESET
| bmcr_setup
;
1215 if ( mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, miicontrol
) ) {
1221 /* must wait till reset is deasserted */
1222 while ( miicontrol
& BMCR_RESET
) {
1224 miicontrol
= mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, MII_READ
);
1225 if ( tries
++ > 100 )
1232 phy_init ( struct forcedeth_private
*priv
)
1234 void *ioaddr
= priv
->mmio_addr
;
1235 u32 phyinterface
, phy_reserved
, mii_status
;
1236 u32 mii_control
, mii_control_1000
, reg
;
1238 /* phy errata for E3016 phy */
1239 if ( priv
->phy_model
== PHY_MODEL_MARVELL_E3016
) {
1240 reg
= mii_rw ( priv
, priv
->phyaddr
, MII_NCONFIG
, MII_READ
);
1241 reg
&= ~PHY_MARVELL_E3016_INITMASK
;
1242 if ( mii_rw ( priv
, priv
->phyaddr
, MII_NCONFIG
, reg
) ) {
1243 DBG ( "PHY write to errata reg failed.\n" );
1248 if ( priv
->phy_oui
== PHY_OUI_REALTEK
) {
1249 if ( priv
->phy_model
== PHY_MODEL_REALTEK_8211
&&
1250 priv
->phy_rev
== PHY_REV_REALTEK_8211B
) {
1251 if ( mii_rw ( priv
, priv
->phyaddr
,
1252 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT1
) ) {
1253 DBG ( "PHY init failed.\n" );
1256 if ( mii_rw ( priv
, priv
->phyaddr
,
1257 PHY_REALTEK_INIT_REG2
, PHY_REALTEK_INIT2
) ) {
1258 DBG ( "PHY init failed.\n" );
1261 if ( mii_rw ( priv
, priv
->phyaddr
,
1262 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT3
) ) {
1263 DBG ( "PHY init failed.\n" );
1266 if ( mii_rw ( priv
, priv
->phyaddr
,
1267 PHY_REALTEK_INIT_REG3
, PHY_REALTEK_INIT4
) ) {
1268 DBG ( "PHY init failed.\n" );
1271 if ( mii_rw ( priv
, priv
->phyaddr
,
1272 PHY_REALTEK_INIT_REG4
, PHY_REALTEK_INIT5
) ) {
1273 DBG ( "PHY init failed.\n" );
1276 if ( mii_rw ( priv
, priv
->phyaddr
,
1277 PHY_REALTEK_INIT_REG5
, PHY_REALTEK_INIT6
) ) {
1278 DBG ( "PHY init failed.\n" );
1281 if ( mii_rw ( priv
, priv
->phyaddr
,
1282 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT1
) ) {
1283 DBG ( "PHY init failed.\n" );
1288 if ( priv
->phy_model
== PHY_MODEL_REALTEK_8211
&&
1289 priv
->phy_rev
== PHY_REV_REALTEK_8211C
) {
1290 u32 powerstate
= readl ( ioaddr
+ NvRegPowerState2
);
1292 /* need to perform hw phy reset */
1293 powerstate
|= NVREG_POWERSTATE2_PHY_RESET
;
1294 writel ( powerstate
, ioaddr
+ NvRegPowerState2
);
1297 powerstate
&= ~NVREG_POWERSTATE2_PHY_RESET
;
1298 writel ( powerstate
, ioaddr
+ NvRegPowerState2
);
1301 reg
= mii_rw ( priv
, priv
->phyaddr
,
1302 PHY_REALTEK_INIT_REG6
, MII_READ
);
1303 reg
|= PHY_REALTEK_INIT9
;
1304 if ( mii_rw ( priv
, priv
->phyaddr
,
1305 PHY_REALTEK_INIT_REG6
, reg
) ) {
1306 DBG ( "PHY init failed.\n" );
1309 if ( mii_rw ( priv
, priv
->phyaddr
,
1310 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT10
) ) {
1311 DBG ( "PHY init failed.\n" );
1315 reg
= mii_rw ( priv
, priv
->phyaddr
,
1316 PHY_REALTEK_INIT_REG7
, MII_READ
);
1317 if ( ! ( reg
& PHY_REALTEK_INIT11
) ) {
1318 reg
|= PHY_REALTEK_INIT11
;
1319 if ( mii_rw ( priv
, priv
->phyaddr
,
1320 PHY_REALTEK_INIT_REG7
, reg
) ) {
1321 DBG ( "PHY init failed.\n" );
1325 if ( mii_rw ( priv
, priv
->phyaddr
,
1326 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT1
) ) {
1327 DBG ( "PHY init failed.\n" );
1331 if ( priv
->phy_model
== PHY_MODEL_REALTEK_8201
) {
1332 if ( priv
->driver_data
& DEV_NEED_PHY_INIT_FIX
) {
1333 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1334 PHY_REALTEK_INIT_REG6
,
1336 phy_reserved
|= PHY_REALTEK_INIT7
;
1337 if ( mii_rw ( priv
, priv
->phyaddr
,
1338 PHY_REALTEK_INIT_REG6
,
1340 DBG ( "PHY init failed.\n" );
1347 /* set advertise register */
1348 reg
= mii_rw ( priv
, priv
->phyaddr
, MII_ADVERTISE
, MII_READ
);
1349 reg
|= ( ADVERTISE_10HALF
| ADVERTISE_10FULL
| ADVERTISE_100HALF
|
1350 ADVERTISE_100FULL
| ADVERTISE_PAUSE_ASYM
| ADVERTISE_PAUSE_CAP
);
1351 if ( mii_rw ( priv
, priv
->phyaddr
, MII_ADVERTISE
, reg
) ) {
1352 DBG ( "PHY init failed.\n" );
1356 /* get phy interface type */
1357 phyinterface
= readl ( ioaddr
+ NvRegPhyInterface
);
1359 /* see if gigabit phy */
1360 mii_status
= mii_rw ( priv
, priv
->phyaddr
, MII_BMSR
, MII_READ
);
1361 if ( mii_status
& PHY_GIGABIT
) {
1362 priv
->gigabit
= PHY_GIGABIT
;
1364 mii_rw ( priv
, priv
->phyaddr
, MII_CTRL1000
, MII_READ
);
1365 mii_control_1000
&= ~ADVERTISE_1000HALF
;
1366 if ( phyinterface
& PHY_RGMII
)
1367 mii_control_1000
|= ADVERTISE_1000FULL
;
1369 mii_control_1000
&= ~ADVERTISE_1000FULL
;
1371 if ( mii_rw ( priv
, priv
->phyaddr
, MII_CTRL1000
, mii_control_1000
)) {
1372 DBG ( "PHY init failed.\n" );
1379 mii_control
= mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, MII_READ
);
1380 mii_control
|= BMCR_ANENABLE
;
1382 if ( priv
->phy_oui
== PHY_OUI_REALTEK
&&
1383 priv
->phy_model
== PHY_MODEL_REALTEK_8211
&&
1384 priv
->phy_rev
== PHY_REV_REALTEK_8211C
) {
1385 /* start autoneg since we already performed hw reset above */
1386 mii_control
|= BMCR_ANRESTART
;
1387 if ( mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, mii_control
) ) {
1388 DBG ( "PHY init failed.\n" );
1393 * (certain phys need bmcr to be setup with reset )
1395 if ( phy_reset ( priv
, mii_control
) ) {
1396 DBG ( "PHY reset failed\n" );
1401 /* phy vendor specific configuration */
1402 if ( ( priv
->phy_oui
== PHY_OUI_CICADA
) && ( phyinterface
& PHY_RGMII
) ) {
1403 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
, MII_RESV1
, MII_READ
);
1404 phy_reserved
&= ~( PHY_CICADA_INIT1
| PHY_CICADA_INIT2
);
1405 phy_reserved
|= ( PHY_CICADA_INIT3
| PHY_CICADA_INIT4
);
1406 if ( mii_rw ( priv
, priv
->phyaddr
, MII_RESV1
, phy_reserved
) ) {
1407 DBG ( "PHY init failed.\n" );
1410 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
, MII_NCONFIG
, MII_READ
);
1411 phy_reserved
|= PHY_CICADA_INIT5
;
1412 if ( mii_rw ( priv
, priv
->phyaddr
, MII_NCONFIG
, phy_reserved
) ) {
1413 DBG ( "PHY init failed.\n" );
1417 if ( priv
->phy_oui
== PHY_OUI_CICADA
) {
1418 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
, MII_SREVISION
, MII_READ
);
1419 phy_reserved
|= PHY_CICADA_INIT6
;
1420 if ( mii_rw ( priv
, priv
->phyaddr
, MII_SREVISION
, phy_reserved
) ) {
1421 DBG ( "PHY init failed.\n" );
1425 if ( priv
->phy_oui
== PHY_OUI_VITESSE
) {
1426 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG1
,
1427 PHY_VITESSE_INIT1
)) {
1428 DBG ( "PHY init failed.\n" );
1431 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG2
,
1432 PHY_VITESSE_INIT2
)) {
1433 DBG ( "PHY init failed.\n" );
1436 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1437 PHY_VITESSE_INIT_REG4
, MII_READ
);
1438 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG4
,
1440 DBG ( "PHY init failed.\n" );
1443 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1444 PHY_VITESSE_INIT_REG3
, MII_READ
);
1445 phy_reserved
&= ~PHY_VITESSE_INIT_MSK1
;
1446 phy_reserved
|= PHY_VITESSE_INIT3
;
1447 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG3
,
1449 DBG ( "PHY init failed.\n" );
1452 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG2
,
1453 PHY_VITESSE_INIT4
) ) {
1454 DBG ( "PHY init failed.\n" );
1457 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG2
,
1458 PHY_VITESSE_INIT5
) ) {
1459 DBG ( "PHY init failed.\n" );
1462 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1463 PHY_VITESSE_INIT_REG4
, MII_READ
);
1464 phy_reserved
&= ~PHY_VITESSE_INIT_MSK1
;
1465 phy_reserved
|= PHY_VITESSE_INIT3
;
1466 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG4
,
1468 DBG ( "PHY init failed.\n" );
1471 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1472 PHY_VITESSE_INIT_REG3
, MII_READ
);
1473 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG3
,
1475 DBG ( "PHY init failed.\n" );
1478 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG2
,
1479 PHY_VITESSE_INIT6
) ) {
1480 DBG ( "PHY init failed.\n" );
1483 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG2
,
1484 PHY_VITESSE_INIT7
) ) {
1485 DBG ( "PHY init failed.\n" );
1488 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1489 PHY_VITESSE_INIT_REG4
, MII_READ
);
1490 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG4
,
1492 DBG ( "PHY init failed.\n" );
1495 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1496 PHY_VITESSE_INIT_REG3
, MII_READ
);
1497 phy_reserved
&= ~PHY_VITESSE_INIT_MSK2
;
1498 phy_reserved
|= PHY_VITESSE_INIT8
;
1499 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG3
,
1501 DBG ( "PHY init failed.\n" );
1504 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG2
,
1505 PHY_VITESSE_INIT9
) ) {
1506 DBG ( "PHY init failed.\n" );
1509 if ( mii_rw ( priv
, priv
->phyaddr
, PHY_VITESSE_INIT_REG1
,
1510 PHY_VITESSE_INIT10
) ) {
1511 DBG ( "PHY init failed.\n" );
1516 if ( priv
->phy_oui
== PHY_OUI_REALTEK
) {
1517 if ( priv
->phy_model
== PHY_MODEL_REALTEK_8211
&&
1518 priv
->phy_rev
== PHY_REV_REALTEK_8211B
) {
1519 /* reset could have cleared these out, set them back */
1520 if ( mii_rw ( priv
, priv
->phyaddr
,
1521 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT1
) ) {
1522 DBG ( "PHY init failed.\n" );
1525 if ( mii_rw ( priv
, priv
->phyaddr
,
1526 PHY_REALTEK_INIT_REG2
, PHY_REALTEK_INIT2
) ) {
1527 DBG ( "PHY init failed.\n" );
1530 if ( mii_rw ( priv
, priv
->phyaddr
,
1531 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT3
) ) {
1532 DBG ( "PHY init failed.\n" );
1535 if ( mii_rw ( priv
, priv
->phyaddr
,
1536 PHY_REALTEK_INIT_REG3
, PHY_REALTEK_INIT4
) ) {
1537 DBG ( "PHY init failed.\n" );
1540 if ( mii_rw ( priv
, priv
->phyaddr
,
1541 PHY_REALTEK_INIT_REG4
, PHY_REALTEK_INIT5
) ) {
1542 DBG ( "PHY init failed.\n" );
1545 if ( mii_rw ( priv
, priv
->phyaddr
,
1546 PHY_REALTEK_INIT_REG5
, PHY_REALTEK_INIT6
) ) {
1547 DBG ( "PHY init failed.\n" );
1550 if ( mii_rw ( priv
, priv
->phyaddr
,
1551 PHY_REALTEK_INIT_REG1
, PHY_REALTEK_INIT1
) ) {
1552 DBG ( "PHY init failed.\n" );
1556 if ( priv
->phy_model
== PHY_MODEL_REALTEK_8201
) {
1557 if ( priv
->driver_data
& DEV_NEED_PHY_INIT_FIX
) {
1558 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1559 PHY_REALTEK_INIT_REG6
,
1561 phy_reserved
|= PHY_REALTEK_INIT7
;
1562 if ( mii_rw ( priv
, priv
->phyaddr
,
1563 PHY_REALTEK_INIT_REG6
,
1565 DBG ( "PHY init failed.\n" );
1570 if ( mii_rw ( priv
, priv
->phyaddr
,
1571 PHY_REALTEK_INIT_REG1
,
1572 PHY_REALTEK_INIT3
) ) {
1573 DBG ( "PHY init failed.\n" );
1576 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1577 PHY_REALTEK_INIT_REG2
,
1579 phy_reserved
&= ~PHY_REALTEK_INIT_MSK1
;
1580 phy_reserved
|= PHY_REALTEK_INIT3
;
1581 if ( mii_rw ( priv
, priv
->phyaddr
,
1582 PHY_REALTEK_INIT_REG2
,
1584 DBG ( "PHY init failed.\n" );
1587 if ( mii_rw ( priv
, priv
->phyaddr
,
1588 PHY_REALTEK_INIT_REG1
,
1589 PHY_REALTEK_INIT1
) ) {
1590 DBG ( "PHY init failed.\n" );
1596 /* some phys clear out pause advertisement on reset, set it back */
1597 mii_rw ( priv
, priv
->phyaddr
, MII_ADVERTISE
, reg
);
1599 /* restart auto negotiation, power down phy */
1600 mii_control
= mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, MII_READ
);
1601 mii_control
|= ( BMCR_ANRESTART
| BMCR_ANENABLE
);
1602 if ( mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, mii_control
) ) {
1610 * nv_setup_phy - Find PHY and initialize it
1612 * @v priv Driver private structure
1614 * @ret rc Return status code
1617 nv_setup_phy ( struct forcedeth_private
*priv
)
1619 void *ioaddr
= priv
->mmio_addr
;
1620 u32 phystate_orig
= 0, phystate
;
1621 int phyinitialised
= 0;
1626 if ( priv
->driver_data
& DEV_HAS_POWER_CNTRL
) {
1627 /* take phy and nic out of low power mode */
1628 powerstate
= readl ( ioaddr
+ NvRegPowerState2
);
1629 powerstate
&= ~NVREG_POWERSTATE2_POWERUP_MASK
;
1630 if ( ( priv
->driver_data
& DEV_NEED_LOW_POWER_FIX
) &&
1631 ( ( priv
->pci_dev
->class & 0xff ) >= 0xA3 ) )
1632 powerstate
|= NVREG_POWERSTATE2_POWERUP_REV_A3
;
1633 writel ( powerstate
, ioaddr
+ NvRegPowerState2
);
1637 /* clear phy state and temporarily halt phy interrupts */
1638 writel ( 0, ioaddr
+ NvRegMIIMask
);
1639 phystate
= readl ( ioaddr
+ NvRegAdapterControl
);
1640 if ( phystate
& NVREG_ADAPTCTL_RUNNING
) {
1642 phystate
&= ~NVREG_ADAPTCTL_RUNNING
;
1643 writel ( phystate
, ioaddr
+ NvRegAdapterControl
);
1645 writel ( NVREG_MIISTAT_MASK_ALL
, ioaddr
+ NvRegMIIStatus
);
1647 if ( priv
->driver_data
& DEV_HAS_MGMT_UNIT
) {
1648 /* management unit running on the mac? */
1649 if ( ( readl ( ioaddr
+ NvRegTransmitterControl
) & NVREG_XMITCTL_MGMT_ST
) &&
1650 ( readl ( ioaddr
+ NvRegTransmitterControl
) & NVREG_XMITCTL_SYNC_PHY_INIT
) &&
1651 nv_mgmt_acquire_sema ( priv
) &&
1652 nv_mgmt_get_version ( priv
) ) {
1653 priv
->mac_in_use
= 1;
1654 if ( priv
->mgmt_version
> 0 ) {
1655 priv
->mac_in_use
= readl ( ioaddr
+ NvRegMgmtUnitControl
) & NVREG_MGMTUNITCONTROL_INUSE
;
1658 DBG ( "mgmt unit is running. mac in use\n" );
1660 /* management unit setup the phy already? */
1661 if ( priv
->mac_in_use
&&
1662 ( ( readl ( ioaddr
+ NvRegTransmitterControl
) & NVREG_XMITCTL_SYNC_MASK
) ==
1663 NVREG_XMITCTL_SYNC_PHY_INIT
) ) {
1664 /* phy is inited by mgmt unit */
1666 DBG ( "Phy already initialized by mgmt unit" );
1671 /* find a suitable phy */
1672 for ( i
= 1; i
<= 32; i
++ ) {
1674 int phyaddr
= i
& 0x1f;
1676 id1
= mii_rw ( priv
, phyaddr
, MII_PHYSID1
, MII_READ
);
1677 if ( id1
< 0 || id1
== 0xffff )
1679 id2
= mii_rw ( priv
, phyaddr
, MII_PHYSID2
, MII_READ
);
1680 if ( id2
< 0 || id2
== 0xffff )
1683 priv
->phy_model
= id2
& PHYID2_MODEL_MASK
;
1684 id1
= ( id1
& PHYID1_OUI_MASK
) << PHYID1_OUI_SHFT
;
1685 id2
= ( id2
& PHYID2_OUI_MASK
) >> PHYID2_OUI_SHFT
;
1686 DBG ( "Found PHY: %04x:%04x at address %d\n", id1
, id2
, phyaddr
);
1687 priv
->phyaddr
= phyaddr
;
1688 priv
->phy_oui
= id1
| id2
;
1690 /* Realtek hardcoded phy id1 to all zeros on certain phys */
1691 if ( priv
->phy_oui
== PHY_OUI_REALTEK2
)
1692 priv
->phy_oui
= PHY_OUI_REALTEK
;
1693 /* Setup phy revision for Realtek */
1694 if ( priv
->phy_oui
== PHY_OUI_REALTEK
&&
1695 priv
->phy_model
== PHY_MODEL_REALTEK_8211
)
1696 priv
->phy_rev
= mii_rw ( priv
, phyaddr
, MII_RESV1
,
1697 MII_READ
) & PHY_REV_MASK
;
1701 DBG ( "Could not find a valid PHY.\n" );
1706 if ( ! phyinitialised
) {
1710 u32 mii_status
= mii_rw ( priv
, priv
->phyaddr
, MII_BMSR
, MII_READ
);
1711 if ( mii_status
& PHY_GIGABIT
) {
1712 priv
->gigabit
= PHY_GIGABIT
;
1719 if ( phystate_orig
)
1720 writel ( phystate
| NVREG_ADAPTCTL_RUNNING
,
1721 ioaddr
+ NvRegAdapterControl
);
1726 * forcedeth_map_regs - Find a suitable BAR for the NIC and
1727 * map the registers in memory
1729 * @v priv Driver private structure
1731 * @ret rc Return status code
1734 forcedeth_map_regs ( struct forcedeth_private
*priv
)
1743 /* Set register size based on NIC */
1744 if ( priv
->driver_data
& ( DEV_HAS_VLAN
| DEV_HAS_MSI_X
|
1745 DEV_HAS_POWER_CNTRL
| DEV_HAS_STATISTICS_V2
|
1746 DEV_HAS_STATISTICS_V3
) ) {
1747 register_size
= NV_PCI_REGSZ_VER3
;
1748 } else if ( priv
->driver_data
& DEV_HAS_STATISTICS_V1
) {
1749 register_size
= NV_PCI_REGSZ_VER2
;
1751 register_size
= NV_PCI_REGSZ_VER1
;
1754 /* Find an appropriate region for all the registers */
1757 for ( reg
= PCI_BASE_ADDRESS_0
; reg
<= PCI_BASE_ADDRESS_5
; reg
+= 4 ) {
1758 pci_read_config_dword ( priv
->pci_dev
, reg
, &bar
);
1760 if ( ( ( bar
& PCI_BASE_ADDRESS_SPACE
) ==
1761 PCI_BASE_ADDRESS_SPACE_MEMORY
) &&
1762 ( pci_bar_size ( priv
->pci_dev
, reg
) >=
1764 addr
= pci_bar_start ( priv
->pci_dev
, reg
);
1769 if ( reg
> PCI_BASE_ADDRESS_5
) {
1770 DBG ( "Couldn't find register window\n" );
1775 ioaddr
= ioremap ( addr
, register_size
);
1777 DBG ( "Cannot remap MMIO\n" );
1781 priv
->mmio_addr
= ioaddr
;
1791 * probe - Initial configuration of NIC
1793 * @v pdev PCI device
1796 * @ret rc Return status code
1799 forcedeth_probe ( struct pci_device
*pdev
, const struct pci_device_id
*ent
)
1801 struct net_device
*netdev
;
1802 struct forcedeth_private
*priv
;
1806 DBGP ( "forcedeth_probe\n" );
1808 DBG ( "Found %s, vendor = %#04x, device = %#04x\n",
1809 pdev
->driver_name
, ent
->vendor
, ent
->device
);
1811 /* Allocate our private data */
1812 netdev
= alloc_etherdev ( sizeof ( *priv
) );
1815 DBG ( "Failed to allocate net device\n" );
1816 goto err_alloc_etherdev
;
1819 /* Link our operations to the netdev struct */
1820 netdev_init ( netdev
, &forcedeth_operations
);
1822 /* Link the PCI device to the netdev struct */
1823 pci_set_drvdata ( pdev
, netdev
);
1824 netdev
->dev
= &pdev
->dev
;
1826 /* Get a reference to our private data */
1827 priv
= netdev_priv ( netdev
);
1829 /* We'll need these set up for the rest of the routines */
1830 priv
->pci_dev
= pdev
;
1831 priv
->netdev
= netdev
;
1832 priv
->driver_data
= ent
->driver_data
;
1834 adjust_pci_device ( pdev
);
1836 /* Use memory mapped I/O */
1837 if ( ( rc
= forcedeth_map_regs ( priv
) ) != 0 )
1839 ioaddr
= priv
->mmio_addr
;
1841 /* Verify and get MAC address */
1842 if ( ( rc
= nv_setup_mac_addr ( priv
) ) != 0 ) {
1843 DBG ( "Invalid MAC address detected\n" );
1848 writel ( 0, ioaddr
+ NvRegWakeUpFlags
);
1850 if ( ( rc
= nv_setup_phy ( priv
) ) != 0 )
1853 /* Set Pause Frame parameters */
1854 priv
->pause_flags
= NV_PAUSEFRAME_RX_CAPABLE
|
1855 NV_PAUSEFRAME_RX_REQ
|
1856 NV_PAUSEFRAME_AUTONEG
;
1857 if ( ( priv
->driver_data
& DEV_HAS_PAUSEFRAME_TX_V1
) ||
1858 ( priv
->driver_data
& DEV_HAS_PAUSEFRAME_TX_V2
) ||
1859 ( priv
->driver_data
& DEV_HAS_PAUSEFRAME_TX_V3
) ) {
1860 priv
->pause_flags
|= NV_PAUSEFRAME_TX_CAPABLE
| NV_PAUSEFRAME_TX_REQ
;
1863 if ( priv
->pause_flags
& NV_PAUSEFRAME_TX_CAPABLE
)
1864 writel ( NVREG_TX_PAUSEFRAME_DISABLE
, ioaddr
+ NvRegTxPauseFrame
);
1866 /* Set default link speed settings */
1867 priv
->linkspeed
= NVREG_LINKSPEED_FORCE
| NVREG_LINKSPEED_10
;
1870 if ( ( rc
= register_netdev ( netdev
) ) != 0 ) {
1871 DBG ( "Error registering netdev\n" );
1872 goto err_register_netdev
;
1875 forcedeth_link_status ( netdev
);
1879 err_register_netdev
:
1882 iounmap ( priv
->mmio_addr
);
1884 netdev_nullify ( netdev
);
1885 netdev_put ( netdev
);
1891 nv_restore_phy ( struct forcedeth_private
*priv
)
1893 u16 phy_reserved
, mii_control
;
1895 if ( priv
->phy_oui
== PHY_OUI_REALTEK
&&
1896 priv
->phy_model
== PHY_MODEL_REALTEK_8201
) {
1897 mii_rw ( priv
, priv
->phyaddr
, PHY_REALTEK_INIT_REG1
,
1898 PHY_REALTEK_INIT3
);
1899 phy_reserved
= mii_rw ( priv
, priv
->phyaddr
,
1900 PHY_REALTEK_INIT_REG2
, MII_READ
);
1901 phy_reserved
&= ~PHY_REALTEK_INIT_MSK1
;
1902 phy_reserved
|= PHY_REALTEK_INIT8
;
1903 mii_rw ( priv
, priv
->phyaddr
, PHY_REALTEK_INIT_REG2
,
1905 mii_rw ( priv
, priv
->phyaddr
, PHY_REALTEK_INIT_REG1
,
1906 PHY_REALTEK_INIT1
);
1908 /* restart auto negotiation */
1909 mii_control
= mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, MII_READ
);
1910 mii_control
|= ( BMCR_ANRESTART
| BMCR_ANENABLE
);
1911 mii_rw ( priv
, priv
->phyaddr
, MII_BMCR
, mii_control
);
1916 * remove - Device Removal Routine
1918 * @v pdev PCI device information struct
1921 forcedeth_remove ( struct pci_device
*pdev
)
1923 struct net_device
*netdev
= pci_get_drvdata ( pdev
);
1924 struct forcedeth_private
*priv
= netdev
->priv
;
1926 DBGP ( "forcedeth_remove\n" );
1928 unregister_netdev ( netdev
);
1930 nv_restore_phy ( priv
);
1932 nv_mgmt_release_sema ( priv
);
1934 iounmap ( priv
->mmio_addr
);
1936 netdev_nullify ( netdev
);
1937 netdev_put ( netdev
);
1940 static struct pci_device_id forcedeth_nics
[] = {
1941 PCI_ROM(0x10DE, 0x01C3, "nForce", "nForce Ethernet Controller", DEV_NEED_TIMERIRQ
|DEV_NEED_LINKTIMER
),
1942 PCI_ROM(0x10DE, 0x0066, "nForce2", "nForce2 Ethernet Controller", DEV_NEED_TIMERIRQ
|DEV_NEED_LINKTIMER
),
1943 PCI_ROM(0x10DE, 0x00D6, "nForce3", "nForce3 Ethernet Controller", DEV_NEED_TIMERIRQ
|DEV_NEED_LINKTIMER
),
1944 PCI_ROM(0x10DE, 0x0086, "nForce3", "nForce3 Ethernet Controller", DEV_NEED_TIMERIRQ
|DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
| DEV_HAS_CHECKSUM
),
1945 PCI_ROM(0x10DE, 0x008C, "nForce3", "nForce3 Ethernet Controller", DEV_NEED_TIMERIRQ
|DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
| DEV_HAS_CHECKSUM
),
1946 PCI_ROM(0x10DE, 0x00E6, "nForce3", "nForce3 Ethernet Controller", DEV_NEED_TIMERIRQ
|DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
| DEV_HAS_CHECKSUM
),
1947 PCI_ROM(0x10DE, 0x00DF, "nForce3", "nForce3 Ethernet Controller", DEV_NEED_TIMERIRQ
|DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
| DEV_HAS_CHECKSUM
),
1948 PCI_ROM(0x10DE, 0x0056, "CK804", "CK804 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_STATISTICS_V1
|DEV_NEED_TX_LIMIT
),
1949 PCI_ROM(0x10DE, 0x0057, "CK804", "CK804 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_STATISTICS_V1
|DEV_NEED_TX_LIMIT
),
1950 PCI_ROM(0x10DE, 0x0037, "MCP04", "MCP04 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_STATISTICS_V1
|DEV_NEED_TX_LIMIT
),
1951 PCI_ROM(0x10DE, 0x0038, "MCP04", "MCP04 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_STATISTICS_V1
|DEV_NEED_TX_LIMIT
),
1952 PCI_ROM(0x10DE, 0x0268, "MCP51", "MCP51 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_STATISTICS_V1
|DEV_NEED_LOW_POWER_FIX
),
1953 PCI_ROM(0x10DE, 0x0269, "MCP51", "MCP51 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_STATISTICS_V1
|DEV_NEED_LOW_POWER_FIX
),
1954 PCI_ROM(0x10DE, 0x0372, "MCP55", "MCP55 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_VLAN
|DEV_HAS_MSI
|DEV_HAS_MSI_X
| DEV_HAS_POWER_CNTRL
|DEV_HAS_PAUSEFRAME_TX_V1
| DEV_HAS_STATISTICS_V2
|DEV_HAS_TEST_EXTENDED
| DEV_HAS_MGMT_UNIT
|DEV_NEED_TX_LIMIT
|DEV_NEED_MSI_FIX
),
1955 PCI_ROM(0x10DE, 0x0373, "MCP55", "MCP55 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_VLAN
|DEV_HAS_MSI
|DEV_HAS_MSI_X
| DEV_HAS_POWER_CNTRL
|DEV_HAS_PAUSEFRAME_TX_V1
| DEV_HAS_STATISTICS_V2
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_NEED_TX_LIMIT
|DEV_NEED_MSI_FIX
),
1956 PCI_ROM(0x10DE, 0x03E5, "MCP61", "MCP61 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_NEED_MSI_FIX
),
1957 PCI_ROM(0x10DE, 0x03E6, "MCP61", "MCP61 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_NEED_MSI_FIX
),
1958 PCI_ROM(0x10DE, 0x03EE, "MCP61", "MCP61 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_NEED_MSI_FIX
),
1959 PCI_ROM(0x10DE, 0x03EF, "MCP61", "MCP61 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_NEED_MSI_FIX
),
1960 PCI_ROM(0x10DE, 0x0450, "MCP65", "MCP65 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_HIGH_DMA
| DEV_HAS_POWER_CNTRL
|DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
| DEV_HAS_STATISTICS_V2
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_NEED_TX_LIMIT
|DEV_HAS_GEAR_MODE
| DEV_NEED_MSI_FIX
),
1961 PCI_ROM(0x10DE, 0x0451, "MCP65", "MCP65 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_HIGH_DMA
| DEV_HAS_POWER_CNTRL
|DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
| DEV_HAS_STATISTICS_V2
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_NEED_TX_LIMIT
|DEV_HAS_GEAR_MODE
| DEV_NEED_MSI_FIX
),
1962 PCI_ROM(0x10DE, 0x0452, "MCP65", "MCP65 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_HIGH_DMA
| DEV_HAS_POWER_CNTRL
|DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
| DEV_HAS_STATISTICS_V2
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_NEED_TX_LIMIT
|DEV_HAS_GEAR_MODE
| DEV_NEED_MSI_FIX
),
1963 PCI_ROM(0x10DE, 0x0453, "MCP65", "MCP65 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_HIGH_DMA
| DEV_HAS_POWER_CNTRL
|DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
| DEV_HAS_STATISTICS_V2
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_NEED_TX_LIMIT
|DEV_HAS_GEAR_MODE
| DEV_NEED_MSI_FIX
),
1964 PCI_ROM(0x10DE, 0x054C, "MCP67", "MCP67 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1965 PCI_ROM(0x10DE, 0x054D, "MCP67", "MCP67 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1966 PCI_ROM(0x10DE, 0x054E, "MCP67", "MCP67 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1967 PCI_ROM(0x10DE, 0x054F, "MCP67", "MCP67 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1968 PCI_ROM(0x10DE, 0x07DC, "MCP73", "MCP73 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1969 PCI_ROM(0x10DE, 0x07DD, "MCP73", "MCP73 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1970 PCI_ROM(0x10DE, 0x07DE, "MCP73", "MCP73 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1971 PCI_ROM(0x10DE, 0x07DF, "MCP73", "MCP73 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_HIGH_DMA
|DEV_HAS_POWER_CNTRL
| DEV_HAS_MSI
|DEV_HAS_PAUSEFRAME_TX_V1
|DEV_HAS_STATISTICS_V2
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_HAS_GEAR_MODE
|DEV_NEED_MSI_FIX
),
1972 PCI_ROM(0x10DE, 0x0760, "MCP77", "MCP77 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_CHECKSUM
|DEV_HAS_HIGH_DMA
| DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
|DEV_HAS_PAUSEFRAME_TX_V2
| DEV_HAS_STATISTICS_V3
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_HAS_COLLISION_FIX
| DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
|DEV_NEED_PHY_INIT_FIX
| DEV_NEED_MSI_FIX
),
1973 PCI_ROM(0x10DE, 0x0761, "MCP77", "MCP77 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_CHECKSUM
|DEV_HAS_HIGH_DMA
| DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
|DEV_HAS_PAUSEFRAME_TX_V2
| DEV_HAS_STATISTICS_V3
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_HAS_COLLISION_FIX
| DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
|DEV_NEED_PHY_INIT_FIX
| DEV_NEED_MSI_FIX
),
1974 PCI_ROM(0x10DE, 0x0762, "MCP77", "MCP77 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_CHECKSUM
|DEV_HAS_HIGH_DMA
| DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
|DEV_HAS_PAUSEFRAME_TX_V2
| DEV_HAS_STATISTICS_V3
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_HAS_COLLISION_FIX
| DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
|DEV_NEED_PHY_INIT_FIX
| DEV_NEED_MSI_FIX
),
1975 PCI_ROM(0x10DE, 0x0763, "MCP77", "MCP77 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_CHECKSUM
|DEV_HAS_HIGH_DMA
| DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
|DEV_HAS_PAUSEFRAME_TX_V2
| DEV_HAS_STATISTICS_V3
|DEV_HAS_TEST_EXTENDED
|DEV_HAS_MGMT_UNIT
| DEV_HAS_CORRECT_MACADDR
|DEV_HAS_COLLISION_FIX
| DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
|DEV_NEED_PHY_INIT_FIX
| DEV_NEED_MSI_FIX
),
1976 PCI_ROM(0x10DE, 0x0AB0, "MCP79", "MCP79 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
| DEV_HAS_PAUSEFRAME_TX_V3
|DEV_HAS_STATISTICS_V3
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
| DEV_NEED_PHY_INIT_FIX
|DEV_NEED_MSI_FIX
),
1977 PCI_ROM(0x10DE, 0x0AB1, "MCP79", "MCP79 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
| DEV_HAS_PAUSEFRAME_TX_V3
|DEV_HAS_STATISTICS_V3
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
| DEV_NEED_PHY_INIT_FIX
|DEV_NEED_MSI_FIX
),
1978 PCI_ROM(0x10DE, 0x0AB2, "MCP79", "MCP79 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
| DEV_HAS_PAUSEFRAME_TX_V3
|DEV_HAS_STATISTICS_V3
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
| DEV_NEED_PHY_INIT_FIX
|DEV_NEED_MSI_FIX
),
1979 PCI_ROM(0x10DE, 0x0AB3, "MCP79", "MCP79 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
| DEV_HAS_PAUSEFRAME_TX_V3
|DEV_HAS_STATISTICS_V3
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_NEED_TX_LIMIT2
|DEV_HAS_GEAR_MODE
| DEV_NEED_PHY_INIT_FIX
|DEV_NEED_MSI_FIX
),
1980 PCI_ROM(0x10DE, 0x0D7D, "MCP89", "MCP89 Ethernet Controller", DEV_NEED_LINKTIMER
|DEV_HAS_LARGEDESC
|DEV_HAS_CHECKSUM
| DEV_HAS_HIGH_DMA
|DEV_HAS_MSI
|DEV_HAS_POWER_CNTRL
| DEV_HAS_PAUSEFRAME_TX_V3
|DEV_HAS_STATISTICS_V3
| DEV_HAS_TEST_EXTENDED
|DEV_HAS_CORRECT_MACADDR
| DEV_HAS_COLLISION_FIX
|DEV_HAS_GEAR_MODE
|DEV_NEED_PHY_INIT_FIX
),
1983 struct pci_driver forcedeth_driver __pci_driver
= {
1984 .ids
= forcedeth_nics
,
1985 .id_count
= ARRAY_SIZE(forcedeth_nics
),
1986 .probe
= forcedeth_probe
,
1987 .remove
= forcedeth_remove
,