|  |  | 
|  | Instructions for use of the 3C90X driver for EtherBoot | 
|  |  | 
|  | Original 3C905B support by: | 
|  | Greg Beeley (Greg.Beeley@LightSys.org), | 
|  | LightSys Technology Services, Inc. | 
|  | February 11, 1999 | 
|  |  | 
|  | Updates for 3C90X family by: | 
|  | Steve Smith (steve.smith@juno.com) | 
|  | October 1, 1999 | 
|  |  | 
|  | Minor documentation updates by | 
|  | Greg Beeley (Greg.Beeley@LightSys.org) | 
|  | March 29, 2000 | 
|  |  | 
|  | ------------------------------------------------------------------------------- | 
|  |  | 
|  | I   OVERVIEW | 
|  |  | 
|  | The 3c90X series ethernet cards are a group of high-performance busmaster | 
|  | DMA cards from 3Com.  This particular driver supports both the 3c90x and | 
|  | the 3c90xB revision cards.  3C90xC family support has been tested to some | 
|  | degree but not extensively. | 
|  |  | 
|  | Here's the licensing information: | 
|  |  | 
|  | This program Copyright (C) 1999 LightSys Technology Services, Inc. | 
|  | Portions Copyright (C) 1999 Steve Smith. | 
|  |  | 
|  | This program may be re-distributed in source or binary form, modified, | 
|  | sold, or copied for any purpose, provided that the above copyright message | 
|  | and this text are included with all source copies or derivative works, and | 
|  | provided that the above copyright message and this text are included in the | 
|  | documentation of any binary-only distributions.  This program is | 
|  | distributed WITHOUT ANY WARRANTY, without even the warranty of FITNESS FOR | 
|  | A PARTICULAR PURPOSE or MERCHANTABILITY.  Please read the associated | 
|  | documentation "3c90x.txt" before compiling and using this driver. | 
|  |  | 
|  |  | 
|  | II  FLASH PROMS | 
|  |  | 
|  | The 3c90xB cards, according to the 3Com documentation, only accept the | 
|  | following flash memory chips: | 
|  |  | 
|  | Atmel AT29C512 (64 kilobyte) | 
|  | Atmel AT29C010 (128 kilobyte) | 
|  |  | 
|  | The 3c90x cards, according to the 3Com documentation, accept the | 
|  | following flash memory chips capacities: | 
|  |  | 
|  | 64  kb (8 kB) | 
|  | 128 kb (16 kB) | 
|  | 256 kb (32 kB) and | 
|  | 512 kb (64 kB) | 
|  |  | 
|  | Atmel AT29C512 (64 kilobyte) chips are specifically listed for both | 
|  | adapters, but flashing on the 3c905b cards would only be supported | 
|  | through the Atmel parts.  Any device, of the supported size, should | 
|  | be supported when programmed by a dedicated PROM programmer (e.g. | 
|  | not the card). | 
|  |  | 
|  | To use this driver in such a PROM, visit Atmel's web site and download | 
|  | their .PDF file containing a list of their distributors.  Contact the | 
|  | distributors for pricing information.  The prices are quite reasonable | 
|  | (about $3 US each for the 64 kB part), and are comparable to what one would | 
|  | expect for similarly sized standard EPROMs.  And, the flash chips are much | 
|  | easier to work with, as they don't need to be UV-erased to be reprogrammed. | 
|  | The 3C905B card actually provides a method to program the flash memory | 
|  | while it is resident on board the card itself; if someone would like to | 
|  | write a small DOS program to do the programming, I can provide the | 
|  | information about the registers and so forth. | 
|  |  | 
|  | A utility program, 3c90xutil, is provided with Etherboot in the 'contrib' | 
|  | directory that allows for the on-board flashing of the ROM while Linux | 
|  | is running.  The program has been successfully used under Linux, but I | 
|  | have heard problem reports of its use under FreeBSD.  Anyone willing to | 
|  | make it work under FreeBSD is more than welcome to do so! | 
|  |  | 
|  | You also have the option of using EPROM chips - the 3C905B-TX-NM has been | 
|  | successfully tested with 27C256 (32kB) and 27C512 (64kB) chips with a | 
|  | specified access time of 100ns and faster. | 
|  |  | 
|  |  | 
|  | III GENERAL USE | 
|  |  | 
|  | Normally, the basic procedure for using this driver is as follows: | 
|  |  | 
|  | 1.  Run the 3c90xcfg program on the driver diskette to enable the | 
|  | boot PROM and set it to 64k or 128k, as appropriate. | 
|  | 2.  Build the appropriate 3c90x.fd0 or 3c90x.fd0 floppy image with | 
|  | possibly the value CFG_3C90X_XCVR defined to the transceiver type that | 
|  | you want to use (i.e., 10/100 rj45, AUI, coax, MII). | 
|  | 3.  Run the floppy image on the PC to be network booted, to get | 
|  | it configured, and to verify that it will boot properly. | 
|  | 4.  Build the 3c90x.rom or 3c90x.lzrom PROM image and program | 
|  | it into the flash or EPROM memory chip. | 
|  | 5.  Put the PROM in the ethernet card, boot and enable 'boot from | 
|  | network first' in the system BIOS, save and reboot. | 
|  |  | 
|  | Here are some issues to be aware of: | 
|  |  | 
|  | 1.  If you experience crashes or different behaviour when using the | 
|  | boot PROM, add the setting CFG_3C90X_BOOTROM_FIX and go through the | 
|  | steps 2-5 above.  This works around a bug in some 3c905B cards (see | 
|  | below), but has some side-effects which may not be desirable. | 
|  | Please note that you have to boot off a floppy (not PROM!) once for | 
|  | this fix to take effect. | 
|  | 2.  The possible need to manually set the CFG_3C90X_XCVR value to | 
|  | configure the transceiver type.  Values are listed below. | 
|  | 3.  The possible need to define CFG_3C90X_PRESERVE_XCVR for use in | 
|  | operating systems that don't intelligently determine the | 
|  | transceiver type. | 
|  |  | 
|  | Some things that are on the 'To-Do' list, perhaps for me, but perhaps | 
|  | for any other volunteers out there: | 
|  |  | 
|  | 1.  Extend the driver to fully implement the auto-select | 
|  | algorithm if the card has multiple media ports. | 
|  | 2.  Fix any bugs in the code <grin>.... | 
|  | 3.  Extend the driver to support the 3c905c revision cards | 
|  | "officially".  Right now, the support has been primarily empirical | 
|  | and not based on 3c905C documentation. | 
|  |  | 
|  | Now for the details.... | 
|  |  | 
|  | This driver has been tested on roughly 300 systems.  The main two | 
|  | configuration issues to contend with are: | 
|  |  | 
|  | 1.  Ensure that PCI Busmastering is enabled for the adapter (configured | 
|  | in the CMOS setup) | 
|  | 2.  Some systems don't work properly with the adapter when plug and | 
|  | play OS is enabled; I always set it to "No" or "Disabled" -- this makes | 
|  | it easier and really doesn't adversely affect anything. | 
|  |  | 
|  | Roughly 95% of the systems worked when configured properly.  A few | 
|  | have issues with booting locally once the boot PROM has been installed | 
|  | (this number has been less than 2%).  Other configuration issues that | 
|  | to check: | 
|  |  | 
|  | 1.  Newer BIOS's actually work correctly with the network boot order. | 
|  | Set the network adapter first.  Most older BIOS's automatically go to | 
|  | the network boot PROM first. | 
|  | 2.  For systems where the adapter was already installed and is just | 
|  | having the PROM installed, try setting the "reset configuration data" | 
|  | to yes in the CMOS setup if the BIOS isn't seen at first.  If your BIOS | 
|  | doesn't have this option, remove the card, start the system, shut down, | 
|  | install the card and restart (or switch to a different PCI slot). | 
|  | 3.  Make sure the CMOS security settings aren't preventing a boot. | 
|  |  | 
|  | The 3c905B cards have a significant 'bug' that relates to the flash prom: | 
|  | unless the card is set internally to the MII transceiver, it will only | 
|  | read the first 8k of the PROM image.  Don't ask why -- it seems really | 
|  | obscure, but it has to do with the way they mux'd the address lines | 
|  | from the PCI bus to the ROM.  Unfortunately, most of us are not using | 
|  | MII transceivers, and even the .lzrom image ends up being just a little | 
|  | bit larger than 8k.  Note that the workaround for this is disabled by | 
|  | default, because the Windows NT 4.0 driver does not like it (no packets | 
|  | are transmitted). | 
|  |  | 
|  | So, the solution that I've used is to internally set the card's nvram | 
|  | configuration to use MII when it boots.  The 3c905b driver does this | 
|  | automatically.  This way, the 16k prom image can be loaded into memory, | 
|  | and then the 3c905b driver can set the temporary configuration of the | 
|  | card to an appropriate value, either configurable by the user or chosen | 
|  | by the driver. | 
|  |  | 
|  | To enable the 3c905B bugfix, which is necessary for these cards when | 
|  | booting from the Flash ROM, define -DCFG_3C90X_BOOTROM_FIX when building, | 
|  | create a floppy image and boot it once. | 
|  | Thereafter, the card should accept the larger prom image. | 
|  |  | 
|  | The driver should choose an appropriate transceiver on the card.  However, | 
|  | if it doesn't on your card or if you need to, for instance, set your | 
|  | card to 10mbps when connected to an unmanaged 10/100 hub, you can specify | 
|  | which transceiver you want to use.  To do this, build the 3c905b.fd0 | 
|  | image with -DCFG_3C90X_XCVR=x, where 'x' is one of the following | 
|  | values: | 
|  |  | 
|  | 0	10Base-T | 
|  | 1	10mbps AUI | 
|  | 3	10Base-2 (thinnet/coax) | 
|  | 4	100Base-TX | 
|  | 5	100Base-FX | 
|  | 6	MII | 
|  | 8	Auto-negotiation 10Base-T / 100Base-TX (usually the default) | 
|  | 9	MII External MAC Mode | 
|  | 255	Allow driver to choose an 'appropriate' media port. | 
|  |  | 
|  | Then proceed from step 2 in the above 'general use' instructions.  The | 
|  | .rom image can be built with CFG_3C90X_XCVR set to a value, but you | 
|  | normally don't want to do this, since it is easier to change the | 
|  | transceiver type by rebuilding a new floppy, changing the BIOS to floppy | 
|  | boot, booting, and then changing the BIOS back to network boot.  If | 
|  | CFG_3C90X_XCVR is not set in a particular build, it just uses the | 
|  | current configuration (either its 'best guess' or whatever the stored | 
|  | CFG_3C90X_XCVR value was from the last time it was set). | 
|  |  | 
|  | [[ Note for the more technically inclined:  The CFG_3C90X_XCVR value is | 
|  | programmed into a register in the card's NVRAM that was reserved for | 
|  | LanWorks PROM images to use.  When the driver boots, the card comes | 
|  | up in MII mode, and the driver checks the LanWorks register to find | 
|  | out if the user specified a transceiver type.  If it finds that | 
|  | information, it uses that, otherwise it picks a transceiver that the | 
|  | card has based on the 3c905b's MediaOptions register.  This driver isn't | 
|  | quite smart enough to always determine which media port is actually | 
|  | _connected_; maybe someone else would like to take on that task (it | 
|  | actually involves sending a self-directed packet and seeing if it | 
|  | comes back.  IF it does, that port is connected). ]] | 
|  |  | 
|  | Another issue to keep in mind is that it is possible that some OS'es | 
|  | might not be happy with the way I've handled the PROM-image hack with | 
|  | setting MII mode on bootup.  Linux 2.0.35 does not have this problem. | 
|  | Behavior of other systems may vary.  The 3com documentation specifically | 
|  | says that, at least with the card that I have, the device driver in the | 
|  | OS should auto-select the media port, so other drivers should work fine | 
|  | with this 'hack'.  However, if yours doesn't seem to, you can try defining | 
|  | CFG_3C90X_PRESERVE_XCVR when building to cause Etherboot to keep the | 
|  | working setting (that allowed the bootp/tftp process) across the eth_reset | 
|  | operation. | 
|  |  | 
|  |  | 
|  | IV  FOR DEVELOPERS.... | 
|  |  | 
|  | If you would like to fix/extend/etc. this driver, feel free to do so; just | 
|  | be sure you can test the modified version on the 3c905B-TX cards that the | 
|  | driver was originally designed for.  This section of this document gives | 
|  | some information that might be relevant to a programmer. | 
|  |  | 
|  | A.  Main Entry Point | 
|  |  | 
|  | a3c90x_probe is the main entry point for this driver.  It is referred | 
|  | to in an array in 'config.c'. | 
|  |  | 
|  | B.  Other Important Functions | 
|  |  | 
|  | The functions a3c90x_transmit, a3c90x_poll, a3c90x_reset, and | 
|  | a3c90x_disable are static functions that EtherBoot finds out about | 
|  | as a  result of a3c90x_probe setting entries in the nic structure | 
|  | for them.  The EtherBoot framework does not use interrupts.  It is | 
|  | polled.  All transmit and receive operations are initiated by the | 
|  | etherboot framework, not by an interrupt or by the driver. | 
|  |  | 
|  | C.  Internal Functions | 
|  |  | 
|  | The following functions are internal to the driver: | 
|  |  | 
|  | a3c90x_internal_IssueCommand - sends a command to the 3c905b card. | 
|  | a3c90x_internal_SetWindow - shifts between one of eight register | 
|  | windows onboard the 3c90x.  The bottom 16 bytes of the card's | 
|  | I/O space are multiplexed among 128 bytes, only 16 of which are | 
|  | visible at any one time.  This SetWindow function selects one of | 
|  | the eight sets. | 
|  | a3c90x_internal_ReadEeprom - reads a word (16 bits) from the | 
|  | card's onboard nvram.  This is NOT the BIOS boot rom.  This is | 
|  | where the card stores such things as its hardware address. | 
|  | a3c90x_internal_WriteEeprom - writes a word (16 bits) to the | 
|  | card's nvram, and recomputes the eeprom checksum. | 
|  | a3c90x_internal_WriteEepromWord - writes a word (16 bits) to the | 
|  | card's nvram.  Used by the above routine. | 
|  | a3c90x_internal_WriteEepromWord - writes a word (16 bits) to the | 
|  | card's nvram.  Used by the above routine. | 
|  |  | 
|  | D.  Globals | 
|  |  | 
|  | All global variables are inside a global structure named INF_3C90X. | 
|  | So, wherever you see that structure referenced, you know the variable | 
|  | is a global.  Just keeps things a little neater. | 
|  |  | 
|  | E.  Enumerations | 
|  |  | 
|  | There are quite a few enumerated type definitions for registers and | 
|  | so forth, many for registers that I didn't even touch in the driver. | 
|  | Register types start with 'reg', window numbers (for SetWindow) | 
|  | start with 'win', and commands (for IssueCommand) start with 'cmd'. | 
|  | Register offsets also include an indication in the name as to the | 
|  | size of the register (_b = byte, _w = word, _l = long), and which | 
|  | window the register is in, if it is windowed (0-7). | 
|  |  | 
|  | F.  Why the 'a3c90x' name? | 
|  |  | 
|  | I had to come up with a letter at the beginning of all of the | 
|  | identifiers, since 3com so conveniently had their name start with a | 
|  | number.  Another driver used 't' (for 'three'?); I chose 'a' for | 
|  | no reason at all. | 
|  |  | 
|  | Addendum by Jorge L. deLyra <delyra@latt.if.usp.br>, 22Nov2000 re | 
|  | working around the 3C905 hardware bug mentioned above: | 
|  |  | 
|  | Use this floppy to fix any 3COM model 3C905B PCI 10/100 Ethernet cards | 
|  | that fail to load and run the boot program the first time around. If | 
|  | they have a "Lucent" rather than a "Broadcom" chipset these cards have | 
|  | a configuration bug that causes a hang when trying to load the boot | 
|  | program from the PROM, if you try to use them right out of the box. | 
|  |  | 
|  | The boot program in this floppy is the file named 3c905b-tpo100.rom | 
|  | from Etherboot version 4.6.10, compiled with the bugfix parameter | 
|  |  | 
|  | CFG_3C90X_BOOTROM_FIX | 
|  |  | 
|  | You have to take the chip off the card and boot the system once using | 
|  | this floppy. Once loaded from the floppy, the boot program will access | 
|  | the card and change some setting in it, correcting the problem. After | 
|  | that you may use either this boot program or the normal one, compiled | 
|  | without this bugfix parameter, to boot the machine from the PROM chip. | 
|  |  | 
|  | [Any recent Etherboot version should do, not just 4.6.10 - Ed.] |