Netboot Mailing List (by thread)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 3C905B-TX Boot Prom Mapping?



>What comment do you expect? I know that there are problems with certain
>versions of the 3C905B, but I haven't be able to check for these myself
>since I don't have such a card myself. All problems (including your
>"hanging" problem) seem to be related to the fact that the 3C905B doesn't
>activate the full ROM range for some reason. For all users of a 3C905B
>I can only recommend to use a FlashCard at present.

The author of the Etherboot driver for the 905B was informed by 3com
that there is an engineering fault in some versions of the ASIC that
constricts the mapping to the lowest 8KB of the ROM. How he worked
around this is explained in the documentation accompanying his driver,
which is included in etherboot-4.1pre8 at www.slug.org.au/etherboot


           Instructions for use of the 3C905B driver for EtherBoot

                  By Greg Beeley (Greg.Beeley@LightSys.org),
                      LightSys Technology Services, Inc.
                              February 11, 1999

-------------------------------------------------------------------------------

I   OVERVIEW

    The 3c905B series ethernet cards are a group of high-performance busmaster
    DMA cards from 3Com.  This particular driver supports only the 3C905B
    series cards, although support for the 3C905 (not 'B') series could likely
    be added by someone who has such a card and access to the technical
    documentation from 3Com.

    Here's the licensing information:

    This program Copyright (C) 1999 LightSys Technology Services, Inc.
    
    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
    "3c905b.txt" before compiling and using this driver.

    
II  FLASH PROMS
    
    The 3c905B cards, according to the 3Com documentation, only accept the 
    following flash memory chips:

        Atmel AT29C512 (64 kilobyte)
	Atmel AT29C010 (128 kilobyte)

    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, 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.

    Better yet, for those using Linux it might be even better if the programming
    could be done while Linux is running, either via a modification to the 3c59x
    driver or via some other program/driver.  That way, a system administrator 
    on a private network could update all the NC flash images from a centrally
    managed location.


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 3c905b.fd0 floppy image with possibly the value
	    CFG_3C905B_XCVR defined to the transceiver type that you want
	    to use (i.e., 10/100 rj45, AUI, coax, MII, etc.)
	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 3c905b.rom or 3c905b.lzrom PROM image and program
	    it into the AT29Cxxx flash 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.  A picky BIOS that may work better with NO_PNP_PCI_HEADER 
	    defined to boot the prom image.
	2.  The possible need to manually set the CFG_3C905B_XCVR value to
	    configure the transceiver type.  Values are listed below.
	3.  The possible need to define CFG_3C905B_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.  Write a DOS- or Linux- based flash programmer for the 3c905b
	    card, so PROM users don't have to buy a $200 programmer....
	2.  Extend the driver to fully implement the auto-select 
	    algorithm if the card has multiple media ports.
	3.  Fix any bugs in the code <grin>....
	4.  Extend the driver to support the 3c905 card, not just the
	    3c905b card (they have some differences in register layout
	    and in capabilities).

    Now for the details....

    This driver was tested on a motherboard (VA-503+) with an Award BIOS.
    Other BIOSes might not be so content with the etherboot framework, and
    you may have to build the driver with -DNO_PNP_PCI_HEADER.

    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.  

    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.

    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_3C905B_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_3C905B_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_3C905B_XCVR is not set in a particular build, it just uses the 
    current configuration (either its 'best guess' or whatever the stored
    CFG_3C905B_XCVR value was from the last time it was set).

    [[ Note for the more technically inclined:  The CFG_3C905B_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.
    I haven't tested anything else.  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_3C905B_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

        a3c905b_probe is the main entry point for this driver.  It is referred
	to in an array in 'config.c'.  

    B.  Other Exported Functions

        The functions a3c905b_transmit, a3c905b_poll, a3c905b_reset, and 
	a3c905b_disable are exported functions that EtherBoot finds out about
	as a  result of a3c905b_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:

	a3c905b_internal_IssueCommand - sends a command to the 3c905b card.
	a3c905b_internal_SetWindow - shifts between one of eight register
	  windows onboard the 3c905b.  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.
	a3c905b_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.
	a3c905b_internal_WriteEeprom - writes a word (16 bits) to the
	  card's nvram, and recomputes the eeprom checksum.
	a3c905b_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_3C905B.
	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 'a3c905b' 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.

===========================================================================
This Mail was sent to netboot mailing list by:
Ken Yap <ken@nlc.net.au>
To get help about this list, send a mail with 'help' as the only string in
it's body to majordomo@baghira.han.de. If you have problems with this list,
send a mail to netboot-owner@baghira.han.de.



For requests or suggestions regarding this mailing list archive please write to netboot@gkminix.han.de.