2 * eepro100.c -- This is a driver for Intel Fast Ethernet Controllers
5 * Originally written for Etherboot by:
7 * Copyright (C) AW Computer Systems.
8 * written by R.E.Wolff -- R.E.Wolff@BitWizard.nl
10 * AW Computer Systems is contributing to the free software community
11 * by paying for this driver and then putting the result under GPL.
13 * If you need a Linux device driver, please contact BitWizard for a
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License as
18 * published by the Free Software Foundation; either version 2, or (at
19 * your option) any later version.
21 * This program is distributed in the hope that it will be useful, but
22 * WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 * General Public License for more details.
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 * date version by what
32 * Written: May 29 1997 V0.10 REW Initial revision.
33 * changes: May 31 1997 V0.90 REW Works!
34 * Jun 1 1997 V0.91 REW Cleanup
35 * Jun 2 1997 V0.92 REW Add some code documentation
36 * Jul 25 1997 V1.00 REW Tested by AW to work in a PROM
37 * Cleanup for publication
38 * Dez 11 2004 V1.10 Kiszka Add RX ring buffer support
39 * Jun 2008 v2.0 mdeck Updated to gPXE. Changed much.
41 * Cleanups and fixes by Thomas Miletich<thomas.miletich@gmail.com>
43 * This is the etherboot intel etherexpress Pro/100B driver.
45 * It was written from scratch, with Donald Beckers eepro100.c kernel
46 * driver as a guideline. Mostly the 82557 related definitions and the
47 * lower level routines have been cut-and-pasted into this source.
49 * The driver was finished before Intel got the NDA out of the closet.
51 * Datasheet is now published and available from
52 * ftp://download.intel.com/design/network/manuals/8255X_OpenSDM.pdf
56 FILE_LICENCE ( GPL2_OR_LATER
);
59 * General Theory of Operation
63 * ifec_pci_probe() is called by gPXE during initialization. Typical NIC
64 * initialization is performed. EEPROM data is read.
68 * ifec_net_open() is called by gPXE before attempting to network boot from the
69 * card. Here, the Command Unit & Receive Unit are initialized. The tx & rx
70 * rings are setup. The MAC address is programmed and the card is configured.
74 * ifec_net_transmit() enqueues a packet in the tx ring - active::tcbs[] The tx
75 * ring is composed of TCBs linked to each other into a ring. A tx request
76 * fills out the next available TCB with a pointer to the packet data.
77 * The last enqueued tx is always at active::tcb_head. Thus, a tx request fills
78 * out the TCB following tcb_head.
79 * active::tcb_tail points to the TCB we're awaiting completion of.
80 * ifec_tx_process() checks tcb_tail, and once complete,
81 * blindly increments tcb_tail to the next ring TCB.
85 * priv::rfds[] is an array of Receive Frame Descriptors. The RFDs are linked
86 * together to form a ring.
87 * ifec_net_poll() calls ifec_rx_process(), which checks the next RFD for
88 * data. If we received a packet, we allocate a new io_buffer and copy the
89 * packet data into it. If alloc_iob() fails, we don't touch the RFD and try
90 * again on the next poll.
95 * - DBG() is for any errors, i.e. failed alloc_iob(), malloc_dma(),
96 * TX overflow, corrupted packets, ...
97 * - DBG2() is for successful events, like packet received,
98 * packet transmitted, and other general notifications.
99 * - DBGP() prints the name of each called function on entry
103 #include <byteswap.h>
107 #include <gpxe/ethernet.h>
108 #include <gpxe/if_ether.h>
109 #include <gpxe/iobuf.h>
110 #include <gpxe/malloc.h>
111 #include <gpxe/pci.h>
112 #include <gpxe/spi_bit.h>
113 #include <gpxe/timer.h>
114 #include <gpxe/nvs.h>
115 #include <gpxe/threewire.h>
116 #include <gpxe/netdevice.h>
117 #include "eepro100.h"
119 /****************************** Global data **********************************/
122 * This is the default configuration command data. The values were copied from
123 * the Linux kernel initialization for the eepro100.
125 static struct ifec_cfg ifec_cfg
= {
127 .command
= CmdConfigure
| CmdSuspend
,
128 .link
= 0, /* Filled in later */
129 .byte
= { 22, /* How many bytes in this array */
130 ( TX_FIFO
<< 4 ) | RX_FIFO
, /* Rx & Tx FIFO limits */
131 0, 0, /* Adaptive Interframe Spacing */
132 RX_DMA_COUNT
, /* Rx DMA max byte count */
133 TX_DMA_COUNT
+ 0x80, /* Tx DMA max byte count */
134 0x32, /* Many bits. */
135 0x03, /* Discard short receive & Underrun retries */
136 1, /* 1=Use MII 0=Use AUI */
138 0x2E, /* NSAI, Preamble length, & Loopback*/
139 0, /* Linear priority */
140 0x60, /* L PRI MODE & Interframe spacing */
142 0x48, /* Promiscuous, Broadcast disable, CRS & CDT */
144 0xf2, /* Stripping, Padding, Receive CRC Transfer */
145 0x80, /* 0x40=Force full-duplex, 0x80=Allowfull-duplex*/
146 0x3f, /* Multiple IA */
147 0x0D } /* Multicast all */
150 static struct net_device_operations ifec_operations
= {
151 .open
= ifec_net_open
,
152 .close
= ifec_net_close
,
153 .transmit
= ifec_net_transmit
,
154 .poll
= ifec_net_poll
,
158 /******************* gPXE PCI Device Driver API functions ********************/
161 * Initialize the PCI device.
163 * @v pci The device's associated pci_device structure.
164 * @v id The PCI device + vendor id.
165 * @ret rc Returns zero if successfully initialized.
167 * This function is called very early on, while gPXE is initializing.
168 * This is a gPXE PCI Device Driver API function.
170 static int ifec_pci_probe ( struct pci_device
*pci
,
171 const struct pci_device_id
*id __unused
)
173 struct net_device
*netdev
;
174 struct ifec_private
*priv
;
177 DBGP ( "ifec_pci_probe: " );
179 if ( pci
->ioaddr
== 0 )
182 netdev
= alloc_etherdev ( sizeof(*priv
) );
186 netdev_init ( netdev
, &ifec_operations
);
189 pci_set_drvdata ( pci
, netdev
);
190 netdev
->dev
= &pci
->dev
;
192 /* enable bus master, etc */
193 adjust_pci_device( pci
);
197 memset ( priv
, 0, sizeof(*priv
) );
198 priv
->ioaddr
= pci
->ioaddr
;
200 ifec_reset ( netdev
);
203 ifec_init_eeprom ( netdev
);
205 /* read MAC address */
206 nvs_read ( &priv
->eeprom
.nvs
, EEPROM_ADDR_MAC_0
, netdev
->hw_addr
,
208 /* read mdio_register */
209 nvs_read ( &priv
->eeprom
.nvs
, EEPROM_ADDR_MDIO_REGISTER
,
210 &priv
->mdio_register
, 2 );
212 ifec_link_update ( netdev
); /* Update link state */
214 if ( ( rc
= register_netdev ( netdev
) ) != 0 )
222 ifec_reset ( netdev
);
223 netdev_nullify ( netdev
);
224 netdev_put ( netdev
);
230 * Remove a device from the PCI device list.
232 * @v pci PCI device to remove.
234 * This is a PCI Device Driver API function.
236 static void ifec_pci_remove ( struct pci_device
*pci
)
238 struct net_device
*netdev
= pci_get_drvdata ( pci
);
240 DBGP ( "ifec_pci_remove\n" );
242 unregister_netdev ( netdev
);
243 ifec_reset ( netdev
);
244 netdev_nullify ( netdev
);
245 netdev_put ( netdev
);
248 /****************** gPXE Network Device Driver API functions *****************/
251 * Close a network device.
253 * @v netdev Device to close.
255 * This is a gPXE Network Device Driver API function.
257 static void ifec_net_close ( struct net_device
*netdev
)
259 struct ifec_private
*priv
= netdev
->priv
;
260 unsigned long ioaddr
= priv
->ioaddr
;
261 unsigned short intr_status
;
263 DBGP ( "ifec_net_close\n" );
265 /* disable interrupts */
266 ifec_net_irq ( netdev
, 0 );
268 /* Ack & clear ints */
269 intr_status
= inw ( ioaddr
+ SCBStatus
);
270 outw ( intr_status
, ioaddr
+ SCBStatus
);
271 inw ( ioaddr
+ SCBStatus
);
273 ifec_reset ( netdev
);
275 /* Free any resources */
276 ifec_free ( netdev
);
279 /* Interrupts to be masked */
280 #define INTERRUPT_MASK ( SCBMaskEarlyRx | SCBMaskFlowCtl )
283 * Enable or disable IRQ masking.
285 * @v netdev Device to control.
286 * @v enable Zero to mask off IRQ, non-zero to enable IRQ.
288 * This is a gPXE Network Driver API function.
290 static void ifec_net_irq ( struct net_device
*netdev
, int enable
)
292 struct ifec_private
*priv
= netdev
->priv
;
293 unsigned long ioaddr
= priv
->ioaddr
;
295 DBGP ( "ifec_net_irq\n" );
297 outw ( enable
? INTERRUPT_MASK
: SCBMaskAll
, ioaddr
+ SCBCmd
);
301 * Opens a network device.
303 * @v netdev Device to be opened.
304 * @ret rc Non-zero if failed to open.
306 * This enables tx and rx on the device.
307 * This is a gPXE Network Device Driver API function.
309 static int ifec_net_open ( struct net_device
*netdev
)
311 struct ifec_private
*priv
= netdev
->priv
;
312 struct ifec_ias
*ias
= NULL
;
313 struct ifec_cfg
*cfg
= NULL
;
317 DBGP ( "ifec_net_open: " );
319 /* Ensure interrupts are disabled. */
320 ifec_net_irq ( netdev
, 0 );
322 /* Initialize Command Unit and Receive Unit base addresses. */
323 ifec_scb_cmd ( netdev
, 0, RUAddrLoad
);
324 ifec_scb_cmd ( netdev
, virt_to_bus ( &priv
->stats
), CUStatsAddr
);
325 ifec_scb_cmd ( netdev
, 0, CUCmdBase
);
327 /* Initialize both rings */
328 if ( ( rc
= ifec_rx_setup ( netdev
) ) != 0 )
330 if ( ( rc
= ifec_tx_setup ( netdev
) ) != 0 )
333 /* Initialize MDIO */
334 options
= 0x00; /* 0x40 = 10mbps half duplex, 0x00 = Autosense */
335 ifec_mdio_setup ( netdev
, options
);
337 /* Prepare MAC address w/ Individual Address Setup (ias) command.*/
338 ias
= malloc_dma ( sizeof ( *ias
), CB_ALIGN
);
343 ias
->command
= CmdIASetup
;
345 memcpy ( ias
->ia
, netdev
->ll_addr
, ETH_ALEN
);
347 /* Prepare operating parameters w/ a configure command. */
348 cfg
= malloc_dma ( sizeof ( *cfg
), CB_ALIGN
);
353 memcpy ( cfg
, &ifec_cfg
, sizeof ( *cfg
) );
354 cfg
->link
= virt_to_bus ( priv
->tcbs
);
355 cfg
->byte
[19] = ( options
& 0x10 ) ? 0xC0 : 0x80;
356 ias
->link
= virt_to_bus ( cfg
);
358 /* Issue the ias and configure commands. */
359 ifec_scb_cmd ( netdev
, virt_to_bus ( ias
), CUStart
);
360 ifec_scb_cmd_wait ( netdev
);
361 priv
->configured
= 1;
363 /* Wait up to 10 ms for configuration to initiate */
364 for ( i
= 10; i
&& !cfg
->status
; i
-- )
366 if ( ! cfg
->status
) {
367 DBG ( "Failed to initiate!\n" );
370 free_dma ( ias
, sizeof ( *ias
) );
371 free_dma ( cfg
, sizeof ( *cfg
) );
374 /* Enable rx by sending ring address to card */
375 if ( priv
->rfds
[0] != NULL
) {
376 ifec_scb_cmd ( netdev
, virt_to_bus( priv
->rfds
[0] ), RUStart
);
377 ifec_scb_cmd_wait ( netdev
);
379 DBG2 ( "rx_start\n" );
384 free_dma ( cfg
, sizeof ( *cfg
) );
385 free_dma ( ias
, sizeof ( *ias
) );
386 ifec_free ( netdev
);
387 ifec_reset ( netdev
);
392 * This function allows a driver to process events during operation.
394 * @v netdev Device being polled.
396 * This is called periodically by gPXE to let the driver check the status of
397 * transmitted packets and to allow the driver to check for received packets.
398 * This is a gPXE Network Device Driver API function.
400 static void ifec_net_poll ( struct net_device
*netdev
)
402 struct ifec_private
*priv
= netdev
->priv
;
403 static int linkpoll
= 0;
404 unsigned short intr_status
;
406 DBGP ( "ifec_net_poll\n" );
408 /* acknowledge interrupts ASAP */
409 intr_status
= inw ( priv
->ioaddr
+ SCBStatus
);
410 outw ( intr_status
, priv
->ioaddr
+ SCBStatus
);
411 inw ( priv
->ioaddr
+ SCBStatus
);
413 DBG2 ( "poll - status: 0x%04X\n", intr_status
);
415 if ( ++linkpoll
> LINK_CHECK_PERIOD
) {
417 ifec_link_update ( netdev
); /* Update link state */
420 /* anything to do here? */
421 if ( ( intr_status
& ( ~INTERRUPT_MASK
) ) == 0 )
424 /* process received and transmitted packets */
425 ifec_tx_process ( netdev
);
426 ifec_rx_process ( netdev
);
428 ifec_check_ru_status ( netdev
, intr_status
);
434 * This transmits a packet.
436 * @v netdev Device to transmit from.
437 * @v iobuf Data to transmit.
438 * @ret rc Non-zero if failed to transmit.
440 * This is a gPXE Network Driver API function.
442 static int ifec_net_transmit ( struct net_device
*netdev
,
443 struct io_buffer
*iobuf
)
445 struct ifec_private
*priv
= netdev
->priv
;
446 struct ifec_tcb
*tcb
= priv
->tcb_head
->next
;
447 unsigned long ioaddr
= priv
->ioaddr
;
449 DBGP ( "ifec_net_transmit\n" );
451 /* Wait for TCB to become available. */
452 if ( tcb
->status
|| tcb
->iob
) {
453 DBG ( "TX overflow\n" );
457 DBG2 ( "transmitting packet (%d bytes). status = %hX, cmd=%hX\n",
458 iob_len ( iobuf
), tcb
->status
, inw ( ioaddr
+ SCBCmd
) );
460 tcb
->command
= CmdSuspend
| CmdTx
| CmdTxFlex
;
461 tcb
->count
= 0x01208000;
462 tcb
->tbd_addr0
= virt_to_bus ( iobuf
->data
);
463 tcb
->tbd_size0
= 0x3FFF & iob_len ( iobuf
);
466 ifec_tx_wake ( netdev
);
468 /* Append to end of ring. */
469 priv
->tcb_head
= tcb
;
474 /*************************** Local support functions *************************/
476 /* Define what each GPIO Pin does */
477 static const uint16_t ifec_ee_bits
[] = {
478 [SPI_BIT_SCLK
] = EE_SHIFT_CLK
,
479 [SPI_BIT_MOSI
] = EE_DATA_WRITE
,
480 [SPI_BIT_MISO
] = EE_DATA_READ
,
481 [SPI_BIT_SS(0)] = EE_ENB
,
485 * Read a single bit from the GPIO pins used for SPI.
486 * should be called by SPI bitbash functions only
488 * @v basher Bitbash device
489 * @v bit_id Line to be read
491 static int ifec_spi_read_bit ( struct bit_basher
*basher
,
492 unsigned int bit_id
)
494 struct ifec_private
*priv
=
495 container_of ( basher
, struct ifec_private
, spi
.basher
);
496 unsigned long ee_addr
= priv
->ioaddr
+ CSREeprom
;
497 unsigned int ret
= 0;
500 DBGP ( "ifec_spi_read_bit\n" );
502 mask
= ifec_ee_bits
[bit_id
];
505 return ( ret
& mask
) ? 1 : 0;
509 * Write a single bit to the GPIO pins used for SPI.
510 * should be called by SPI bitbash functions only
512 * @v basher Bitbash device
513 * @v bit_id Line to write to
514 * @v data Value to write
516 static void ifec_spi_write_bit ( struct bit_basher
*basher
,
520 struct ifec_private
*priv
=
521 container_of ( basher
, struct ifec_private
, spi
.basher
);
522 unsigned long ee_addr
= priv
->ioaddr
+ CSREeprom
;
524 uint16_t mask
= ifec_ee_bits
[bit_id
];
526 DBGP ( "ifec_spi_write_bit\n" );
528 val
= inw ( ee_addr
);
532 outw ( val
, ee_addr
);
535 /* set function pointer to SPI read- and write-bit functions */
536 static struct bit_basher_operations ifec_basher_ops
= {
537 .read
= ifec_spi_read_bit
,
538 .write
= ifec_spi_write_bit
,
542 * Initialize the eeprom stuff
544 * @v netdev Network device
546 static void ifec_init_eeprom ( struct net_device
*netdev
)
548 struct ifec_private
*priv
= netdev
->priv
;
550 DBGP ( "ifec_init_eeprom\n" );
552 priv
->spi
.basher
.op
= &ifec_basher_ops
;
553 priv
->spi
.bus
.mode
= SPI_MODE_THREEWIRE
;
554 init_spi_bit_basher ( &priv
->spi
);
556 priv
->eeprom
.bus
= &priv
->spi
.bus
;
558 /* init as 93c46(93c14 compatible) first, to set the command len,
559 * block size and word len. Needs to be set for address len detection.
561 init_at93c46 ( &priv
->eeprom
, 16 );
563 /* detect address length, */
564 threewire_detect_address_len ( &priv
->eeprom
);
566 /* address len == 8 means 93c66 instead of 93c46 */
567 if ( priv
->eeprom
.address_len
== 8 )
568 init_at93c66 ( &priv
->eeprom
, 16 );
572 * Check if the network cable is plugged in.
574 * @v netdev Network device to check.
575 * @ret retval greater 0 if linkup.
577 static int ifec_link_check ( struct net_device
*netdev
)
579 struct ifec_private
*priv
= netdev
->priv
;
580 unsigned short mdio_register
= priv
->mdio_register
;
582 DBGP ( "ifec_link_check\n" );
584 /* Read the status register once to discard stale data */
585 ifec_mdio_read ( netdev
, mdio_register
& 0x1f, 1 );
586 /* Check to see if network cable is plugged in. */
587 if ( ! ( ifec_mdio_read ( netdev
, mdio_register
& 0x1f, 1 )
595 * Check network cable link, inform gPXE as appropriate.
597 * @v netdev Network device to check.
599 static void ifec_link_update ( struct net_device
*netdev
)
601 DBGP ( "ifec_link_update\n" );
603 /* Update link state */
604 if ( ifec_link_check ( netdev
) )
605 netdev_link_up ( netdev
);
607 netdev_link_down ( netdev
);
611 * Support function: ifec_mdio_read
613 * This probably reads a register in the "physical media interface chip".
616 static int ifec_mdio_read ( struct net_device
*netdev
, int phy_id
,
619 struct ifec_private
*priv
= netdev
->priv
;
620 unsigned long ioaddr
= priv
->ioaddr
;
622 int boguscnt
= 64*4; /* <64 usec. to complete, typ 27 ticks */
624 DBGP ( "ifec_mdio_read\n" );
626 outl ( 0x08000000 | ( location
<< 16 ) | ( phy_id
<< 21 ),
627 ioaddr
+ CSRCtrlMDI
);
631 val
= inl ( ioaddr
+ CSRCtrlMDI
);
633 if ( --boguscnt
< 0 ) {
634 DBG ( " ifec_mdio_read() time out with val = %X.\n",
638 } while (! ( val
& 0x10000000 ) );
645 * @v netdev Network device
646 * @v options MDIO options
648 static void ifec_mdio_setup ( struct net_device
*netdev
, int options
)
650 struct ifec_private
*priv
= netdev
->priv
;
651 unsigned short mdio_register
= priv
->mdio_register
;
653 DBGP ( "ifec_mdio_setup\n" );
655 if ( ( (mdio_register
>>8) & 0x3f ) == DP83840
656 || ( (mdio_register
>>8) & 0x3f ) == DP83840A
) {
657 int mdi_reg23
= ifec_mdio_read ( netdev
, mdio_register
658 & 0x1f, 23 ) | 0x0422;
661 DBG2 ( "DP83840 specific setup, setting register 23 to "
662 "%hX.\n", mdi_reg23
);
663 ifec_mdio_write ( netdev
, mdio_register
& 0x1f, 23, mdi_reg23
);
666 if ( options
!= 0 ) {
667 ifec_mdio_write ( netdev
, mdio_register
& 0x1f, 0,
668 ( (options
& 0x20) ? 0x2000 : 0 ) |
669 ( (options
& 0x10) ? 0x0100 : 0 ) );
670 DBG2 ( "set mdio_register. " );
675 * Support function: ifec_mdio_write
677 * This probably writes to the "physical media interface chip".
680 static int ifec_mdio_write ( struct net_device
*netdev
,
681 int phy_id
, int location
, int value
)
683 struct ifec_private
*priv
= netdev
->priv
;
684 unsigned long ioaddr
= priv
->ioaddr
;
686 int boguscnt
= 64*4; /* <64 usec. to complete, typ 27 ticks */
688 DBGP ( "ifec_mdio_write\n" );
690 outl ( 0x04000000 | ( location
<< 16 ) | ( phy_id
<< 21 ) | value
,
691 ioaddr
+ CSRCtrlMDI
);
695 val
= inl ( ioaddr
+ CSRCtrlMDI
);
696 if ( --boguscnt
< 0 ) {
697 DBG ( " ifec_mdio_write() time out with val = %X.\n",
701 } while (! ( val
& 0x10000000 ) );
706 * Resets the hardware.
708 * @v netdev Network device
710 static void ifec_reset ( struct net_device
*netdev
)
712 struct ifec_private
*priv
= netdev
->priv
;
713 unsigned long ioaddr
= priv
->ioaddr
;
715 DBGP ( "ifec_reset\n" );
717 /* do partial reset first */
718 outl ( PortPartialReset
, ioaddr
+ CSRPort
);
719 inw ( ioaddr
+ SCBStatus
);
723 outl ( PortReset
, ioaddr
+ CSRPort
);
724 inw ( ioaddr
+ SCBStatus
);
727 /* disable interrupts again */
728 ifec_net_irq ( netdev
, 0 );
732 * free()s the tx/rx rings.
734 * @v netdev Network device
736 static void ifec_free ( struct net_device
*netdev
)
738 struct ifec_private
*priv
= netdev_priv ( netdev
);
741 DBGP ( "ifec_free\n" );
743 /* free all allocated receive io_buffers */
744 for ( i
= 0; i
< RFD_COUNT
; i
++ ) {
745 free_iob ( priv
->rx_iobs
[i
] );
746 priv
->rx_iobs
[i
] = NULL
;
747 priv
->rfds
[i
] = NULL
;
750 /* free TX ring buffer */
751 free_dma ( priv
->tcbs
, TX_RING_BYTES
);
757 * Initializes an RFD.
759 * @v rfd RFD struct to initialize
760 * @v command Command word
763 static void ifec_rfd_init ( struct ifec_rfd
*rfd
, s16 command
, u32 link
)
765 DBGP ( "ifec_rfd_init\n" );
768 rfd
->command
= command
;
769 rfd
->rx_buf_addr
= 0xFFFFFFFF;
771 rfd
->size
= RFD_PACKET_LEN
;
776 * Send address of new RFD to card
778 * @v netdev Network device
780 static void ifec_reprime_ru ( struct net_device
*netdev
)
782 struct ifec_private
*priv
= netdev
->priv
;
783 int cur_rx
= priv
->cur_rx
;
785 DBGP ( "ifec_reprime_ru\n" );
787 if ( priv
->rfds
[cur_rx
] != NULL
) {
788 ifec_scb_cmd ( netdev
, virt_to_bus ( priv
->rfds
[cur_rx
] ),
790 ifec_scb_cmd_wait ( netdev
);
795 * Check if reprime of RU needed
797 * @v netdev Network device
799 static void ifec_check_ru_status ( struct net_device
*netdev
,
800 unsigned short intr_status
)
802 struct ifec_private
*priv
= netdev
->priv
;
804 DBGP ( "ifec_check_ru_status\n" );
807 * The chip may have suspended reception for various reasons.
808 * Check for that, and re-prime it should this be the case.
810 switch ( ( intr_status
>> 2 ) & 0xf ) {
814 case 1: /* Suspended */
815 case 2: /* No resources (RFDs) */
816 case 9: /* Suspended with no more RBDs */
817 case 10: /* No resources due to no RBDs */
818 case 12: /* Ready with no RBDs */
819 DBG ( "ifec_net_poll: RU reprimed.\n" );
820 ifec_reprime_ru ( netdev
);
823 /* reserved values */
824 DBG ( "ifec_net_poll: RU state anomaly: %i\n",
825 ( inw ( priv
->ioaddr
+ SCBStatus
) >> 2 ) & 0xf );
830 #define RFD_STATUS ( RFD_OK | RFDRxCol | RFDRxErr | RFDShort | \
831 RFDDMAOverrun | RFDNoBufs | RFDCRCError )
833 * Looks for received packets in the rx ring, reports success or error to
834 * the core accordingly. Starts reallocation of rx ring.
836 * @v netdev Network device
838 static void ifec_rx_process ( struct net_device
*netdev
)
840 struct ifec_private
*priv
= netdev
->priv
;
841 int cur_rx
= priv
->cur_rx
;
842 struct io_buffer
*iob
= priv
->rx_iobs
[cur_rx
];
843 struct ifec_rfd
*rfd
= priv
->rfds
[cur_rx
];
847 DBGP ( "ifec_rx_process\n" );
849 /* Process any received packets */
850 while ( iob
&& rfd
&& ( status
= rfd
->status
) ) {
851 rx_len
= rfd
->count
& RFDMaskCount
;
853 DBG2 ( "Got a packet: Len = %d, cur_rx = %d.\n", rx_len
,
855 DBGIO_HD ( (void*)rfd
->packet
, 0x30 );
857 if ( ( status
& RFD_STATUS
) != RFD_OK
) {
858 DBG ( "Corrupted packet received. "
859 "Status = %#08hx\n", status
);
860 netdev_rx_err ( netdev
, iob
, -EINVAL
);
862 /* Hand off the packet to the network subsystem */
863 iob_put ( iob
, rx_len
);
864 DBG2 ( "Received packet: %p, len: %d\n", iob
, rx_len
);
865 netdev_rx ( netdev
, iob
);
868 /* make sure we don't reuse this RFD */
869 priv
->rx_iobs
[cur_rx
] = NULL
;
870 priv
->rfds
[cur_rx
] = NULL
;
873 priv
->cur_rx
= ( cur_rx
+ 1 ) % RFD_COUNT
;
874 cur_rx
= priv
->cur_rx
;
875 iob
= priv
->rx_iobs
[cur_rx
];
876 rfd
= priv
->rfds
[cur_rx
];
879 ifec_refill_rx_ring ( netdev
);
883 * Allocates io_buffer, set pointers in ifec_private structure accordingly,
884 * reserves space for RFD header in io_buffer.
886 * @v netdev Network device
887 * @v cur Descriptor number to work on
888 * @v cmd Value to set cmd field in RFD to
889 * @v link Pointer to ned RFD
890 * @ret rc 0 on success, negative on failure
892 static int ifec_get_rx_desc ( struct net_device
*netdev
, int cur
, int cmd
,
895 struct ifec_private
*priv
= netdev
->priv
;
896 struct ifec_rfd
*rfd
= priv
->rfds
[cur
];
898 DBGP ( "ifec_get_rx_desc\n" );
900 priv
->rx_iobs
[cur
] = alloc_iob ( sizeof ( *rfd
) );
901 if ( ! priv
->rx_iobs
[cur
] ) {
902 DBG ( "alloc_iob failed. desc. nr: %d\n", cur
);
903 priv
->rfds
[cur
] = NULL
;
907 /* Initialize new tail. */
908 priv
->rfds
[cur
] = priv
->rx_iobs
[cur
]->data
;
909 ifec_rfd_init ( priv
->rfds
[cur
], cmd
, link
);
910 iob_reserve ( priv
->rx_iobs
[cur
], RFD_HEADER_LEN
);
916 * Allocate new descriptor entries and initialize them if needed
918 * @v netdev Network device
920 static void ifec_refill_rx_ring ( struct net_device
*netdev
)
922 struct ifec_private
*priv
= netdev
->priv
;
924 unsigned short intr_status
;
926 DBGP ( "ifec_refill_rx_ring\n" );
928 for ( i
= 0; i
< RFD_COUNT
; i
++ ) {
929 cur_rx
= ( priv
->cur_rx
+ i
) % RFD_COUNT
;
930 /* only refill if empty */
931 if ( priv
->rfds
[cur_rx
] != NULL
||
932 priv
->rx_iobs
[cur_rx
] != NULL
)
935 DBG2 ( "refilling RFD %d\n", cur_rx
);
937 if ( ifec_get_rx_desc ( netdev
, cur_rx
,
938 CmdSuspend
| CmdEndOfList
, 0 ) == 0 ) {
940 int prev_rx
= ( ( ( cur_rx
+ RFD_COUNT
) - 1 )
942 struct ifec_rfd
*rfd
= priv
->rfds
[prev_rx
];
945 rfd
->link
= virt_to_bus ( priv
->rfds
[cur_rx
] );
950 intr_status
= inw ( priv
->ioaddr
+ SCBStatus
);
951 ifec_check_ru_status ( netdev
, intr_status
);
955 * Initial allocation & initialization of the rx ring.
957 * @v netdev Device of rx ring.
958 * @ret rc Non-zero if error occured
960 static int ifec_rx_setup ( struct net_device
*netdev
)
962 struct ifec_private
*priv
= netdev
->priv
;
965 DBGP ( "ifec_rx_setup\n" );
969 /* init values for ifec_refill_rx_ring() */
970 for ( i
= 0; i
< RFD_COUNT
; i
++ ) {
971 priv
->rfds
[i
] = NULL
;
972 priv
->rx_iobs
[i
] = NULL
;
974 ifec_refill_rx_ring ( netdev
);
980 * Initiates a SCB command.
982 * @v netdev Network device
983 * @v ptr General pointer value for command.
984 * @v cmd Command to issue.
985 * @ret rc Non-zero if command not issued.
987 static int ifec_scb_cmd ( struct net_device
*netdev
, u32 ptr
, u8 cmd
)
989 struct ifec_private
*priv
= netdev
->priv
;
990 unsigned long ioaddr
= priv
->ioaddr
;
993 DBGP ( "ifec_scb_cmd\n" );
995 rc
= ifec_scb_cmd_wait ( netdev
); /* Wait until ready */
997 outl ( ptr
, ioaddr
+ SCBPointer
);
998 outb ( cmd
, ioaddr
+ SCBCmd
); /* Issue command */
1004 * Wait for command unit to accept a command.
1006 * @v cmd_ioaddr I/O address of command register.
1007 * @ret rc Non-zero if command timed out.
1009 static int ifec_scb_cmd_wait ( struct net_device
*netdev
)
1011 struct ifec_private
*priv
= netdev
->priv
;
1012 unsigned long cmd_ioaddr
= priv
->ioaddr
+ SCBCmd
;
1013 int rc
, wait
= CU_CMD_TIMEOUT
;
1015 DBGP ( "ifec_scb_cmd_wait\n" );
1017 for ( ; wait
&& ( rc
= inb ( cmd_ioaddr
) ); wait
-- )
1021 DBG ( "ifec_scb_cmd_wait timeout!\n" );
1026 * Check status of transmitted packets & perform tx completions.
1028 * @v netdev Network device.
1030 static void ifec_tx_process ( struct net_device
*netdev
)
1032 struct ifec_private
*priv
= netdev
->priv
;
1033 struct ifec_tcb
*tcb
= priv
->tcb_tail
;
1036 DBGP ( "ifec_tx_process\n" );
1038 /* Check status of transmitted packets */
1039 while ( ( status
= tcb
->status
) && tcb
->iob
) {
1040 if ( status
& TCB_U
) {
1041 /* report error to gPXE */
1042 DBG ( "ifec_tx_process : tx error!\n " );
1043 netdev_tx_complete_err ( netdev
, tcb
->iob
, -EINVAL
);
1045 /* report successful transmit */
1046 netdev_tx_complete ( netdev
, tcb
->iob
);
1048 DBG2 ( "tx completion\n" );
1053 priv
->tcb_tail
= tcb
->next
; /* Next TCB */
1059 * Allocates & initialize tx resources.
1061 * @v netdev Network device.
1062 * @ret rc Non-zero if error occurred.
1064 static int ifec_tx_setup ( struct net_device
*netdev
)
1066 struct ifec_private
*priv
= netdev
->priv
;
1067 struct ifec_tcb
*tcb
;
1070 DBGP ( "ifec_tx_setup\n" );
1072 /* allocate tx ring */
1073 priv
->tcbs
= malloc_dma ( TX_RING_BYTES
, CB_ALIGN
);
1074 if ( !priv
->tcbs
) {
1075 DBG ( "TX-ring allocation failed\n" );
1079 tcb
= priv
->tcb_tail
= priv
->tcbs
;
1080 priv
->tx_curr
= priv
->tx_tail
= 0;
1083 for ( i
= 0; i
< TCB_COUNT
; i
++, tcb
++ ) {
1085 tcb
->count
= 0x01208000;
1087 tcb
->tbda_addr
= virt_to_bus ( &tcb
->tbd_addr0
);
1088 tcb
->link
= virt_to_bus ( tcb
+ 1 );
1089 tcb
->next
= tcb
+ 1;
1091 /* We point tcb_head at the last TCB, so the first ifec_net_transmit()
1092 * will use the first (head->next) TCB to transmit. */
1093 priv
->tcb_head
= --tcb
;
1094 tcb
->link
= virt_to_bus ( priv
->tcbs
);
1095 tcb
->next
= priv
->tcbs
;
1101 * Wake up the Command Unit and issue a Resume/Start.
1103 * @v netdev Network device containing Command Unit
1105 * The time between clearing the S bit and issuing Resume must be as short as
1106 * possible to prevent a race condition. As noted in linux eepro100.c :
1107 * Note: Watch out for the potential race condition here: imagine
1108 * erasing the previous suspend
1109 * the chip processes the previous command
1110 * the chip processes the final command, and suspends
1111 * doing the CU_RESUME
1112 * the chip processes the next-yet-valid post-final-command.
1113 * So blindly sending a CU_RESUME is only safe if we do it immediately after
1114 * erasing the previous CmdSuspend, without the possibility of an intervening
1117 void ifec_tx_wake ( struct net_device
*netdev
)
1119 struct ifec_private
*priv
= netdev
->priv
;
1120 unsigned long ioaddr
= priv
->ioaddr
;
1121 struct ifec_tcb
*tcb
= priv
->tcb_head
->next
;
1123 DBGP ( "ifec_tx_wake\n" );
1125 /* For the special case of the first transmit, we issue a START. The
1126 * card won't RESUME after the configure command. */
1127 if ( priv
->configured
) {
1128 priv
->configured
= 0;
1129 ifec_scb_cmd ( netdev
, virt_to_bus ( tcb
), CUStart
);
1130 ifec_scb_cmd_wait ( netdev
);
1134 /* Resume if suspended. */
1135 switch ( ( inw ( ioaddr
+ SCBStatus
) >> 6 ) & 0x3 ) {
1136 case 0: /* Idle - We should not reach this state. */
1137 DBG2 ( "ifec_tx_wake: tx idle!\n" );
1138 ifec_scb_cmd ( netdev
, virt_to_bus ( tcb
), CUStart
);
1139 ifec_scb_cmd_wait ( netdev
);
1141 case 1: /* Suspended */
1144 default: /* Active */
1147 ifec_scb_cmd_wait ( netdev
);
1148 outl ( 0, ioaddr
+ SCBPointer
);
1149 priv
->tcb_head
->command
&= ~CmdSuspend
;
1150 /* Immediately issue Resume command */
1151 outb ( CUResume
, ioaddr
+ SCBCmd
);
1152 ifec_scb_cmd_wait ( netdev
);
1155 /*********************************************************************/
1157 static struct pci_device_id ifec_nics
[] = {
1158 PCI_ROM(0x8086, 0x1029, "id1029", "Intel EtherExpressPro100 ID1029", 0),
1159 PCI_ROM(0x8086, 0x1030, "id1030", "Intel EtherExpressPro100 ID1030", 0),
1160 PCI_ROM(0x8086, 0x1031, "82801cam", "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
1161 PCI_ROM(0x8086, 0x1032, "eepro100-1032", "Intel PRO/100 VE Network Connection", 0),
1162 PCI_ROM(0x8086, 0x1033, "eepro100-1033", "Intel PRO/100 VM Network Connection", 0),
1163 PCI_ROM(0x8086, 0x1034, "eepro100-1034", "Intel PRO/100 VM Network Connection", 0),
1164 PCI_ROM(0x8086, 0x1035, "eepro100-1035", "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
1165 PCI_ROM(0x8086, 0x1036, "eepro100-1036", "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
1166 PCI_ROM(0x8086, 0x1037, "eepro100-1037", "Intel 82801CAM (ICH3) Chipset Ethernet Controller", 0),
1167 PCI_ROM(0x8086, 0x1038, "id1038", "Intel PRO/100 VM Network Connection", 0),
1168 PCI_ROM(0x8086, 0x1039, "82562et", "Intel PRO100 VE 82562ET", 0),
1169 PCI_ROM(0x8086, 0x103a, "id103a", "Intel Corporation 82559 InBusiness 10/100", 0),
1170 PCI_ROM(0x8086, 0x103b, "82562etb", "Intel PRO100 VE 82562ETB", 0),
1171 PCI_ROM(0x8086, 0x103c, "eepro100-103c", "Intel PRO/100 VM Network Connection", 0),
1172 PCI_ROM(0x8086, 0x103d, "eepro100-103d", "Intel PRO/100 VE Network Connection", 0),
1173 PCI_ROM(0x8086, 0x103e, "eepro100-103e", "Intel PRO/100 VM Network Connection", 0),
1174 PCI_ROM(0x8086, 0x1051, "prove", "Intel PRO/100 VE Network Connection", 0),
1175 PCI_ROM(0x8086, 0x1059, "82551qm", "Intel PRO/100 M Mobile Connection", 0),
1176 PCI_ROM(0x8086, 0x1209, "82559er", "Intel EtherExpressPro100 82559ER", 0),
1177 PCI_ROM(0x8086, 0x1227, "82865", "Intel 82865 EtherExpress PRO/100A", 0),
1178 PCI_ROM(0x8086, 0x1228, "82556", "Intel 82556 EtherExpress PRO/100 Smart", 0),
1179 PCI_ROM(0x8086, 0x1229, "eepro100", "Intel EtherExpressPro100", 0),
1180 PCI_ROM(0x8086, 0x2449, "82562em", "Intel EtherExpressPro100 82562EM", 0),
1181 PCI_ROM(0x8086, 0x2459, "82562-1", "Intel 82562 based Fast Ethernet Connection", 0),
1182 PCI_ROM(0x8086, 0x245d, "82562-2", "Intel 82562 based Fast Ethernet Connection", 0),
1183 PCI_ROM(0x8086, 0x1050, "82562ez", "Intel 82562EZ Network Connection", 0),
1184 PCI_ROM(0x8086, 0x1051, "eepro100-1051", "Intel 82801EB/ER (ICH5/ICH5R) Chipset Ethernet Controller", 0),
1185 PCI_ROM(0x8086, 0x1065, "82562-3", "Intel 82562 based Fast Ethernet Connection", 0),
1186 PCI_ROM(0x8086, 0x5200, "eepro100-5200", "Intel EtherExpress PRO/100 Intelligent Server", 0),
1187 PCI_ROM(0x8086, 0x5201, "eepro100-5201", "Intel EtherExpress PRO/100 Intelligent Server", 0),
1190 /* Cards with device ids 0x1030 to 0x103F, 0x2449, 0x2459 or 0x245D might need
1191 * a workaround for hardware bug on 10 mbit half duplex (see linux driver eepro100.c)
1192 * 2003/03/17 gbaum */
1194 struct pci_driver ifec_driver __pci_driver
= {
1196 .id_count
= ( sizeof (ifec_nics
) / sizeof (ifec_nics
[0]) ),
1197 .probe
= ifec_pci_probe
,
1198 .remove
= ifec_pci_remove