Annotation of qemu/roms/ipxe/src/drivers/net/depca.c, revision 1.1.1.1

1.1       root        1: /* #warning "depca.c: FIXME: fix relocation" */
                      2: 
                      3: FILE_LICENCE ( GPL_ANY );
                      4: 
                      5: #if 0
                      6: /* Not fixed for relocation yet. Probably won't work relocated above 16MB */
                      7: #ifdef ALLMULTI
                      8: #error multicast support is not yet implemented
                      9: #endif
                     10: /* Etherboot: depca.h merged, comments from Linux driver retained */
                     11: /*  depca.c: A DIGITAL DEPCA  & EtherWORKS ethernet driver for linux.
                     12: 
                     13:     Written 1994, 1995 by David C. Davies.
                     14: 
                     15: 
                     16:                       Copyright 1994 David C. Davies
                     17:                                   and 
                     18:                         United States Government
                     19:         (as represented by the Director, National Security Agency).  
                     20: 
                     21:                Copyright 1995  Digital Equipment Corporation.
                     22: 
                     23: 
                     24:     This software may be used and distributed according to the terms of
                     25:     the GNU Public License, incorporated herein by reference.
                     26: 
                     27:     This driver is written for the Digital Equipment Corporation series
                     28:     of DEPCA and EtherWORKS ethernet cards:
                     29: 
                     30:         DEPCA       (the original)
                     31:        DE100
                     32:        DE101
                     33:        DE200 Turbo
                     34:        DE201 Turbo
                     35:        DE202 Turbo (TP BNC)
                     36:        DE210
                     37:        DE422       (EISA)
                     38: 
                     39:     The  driver has been tested on DE100, DE200 and DE202 cards  in  a
                     40:     relatively busy network. The DE422 has been tested a little.
                     41: 
                     42:     This  driver will NOT work   for the DE203,  DE204  and DE205 series  of
                     43:     cards,  since they have  a  new custom ASIC in   place of the AMD  LANCE
                     44:     chip.  See the 'ewrk3.c'   driver in the  Linux  source tree for running
                     45:     those cards.
                     46: 
                     47:     I have benchmarked the driver with a  DE100 at 595kB/s to (542kB/s from)
                     48:     a DECstation 5000/200.
                     49: 
                     50:     The author may be reached at [email protected]
                     51: 
                     52:     =========================================================================
                     53: 
                     54:     The  driver was originally based  on   the 'lance.c' driver from  Donald
                     55:     Becker   which  is included with  the  standard  driver distribution for
                     56:     linux.  V0.4  is  a complete  re-write  with only  the kernel  interface
                     57:     remaining from the original code.
                     58: 
                     59:     1) Lance.c code in /linux/drivers/net/
                     60:     2) "Ethernet/IEEE 802.3 Family. 1992 World Network Data Book/Handbook",
                     61:        AMD, 1992 [(800) 222-9323].
                     62:     3) "Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE)",
                     63:        AMD, Pub. #17881, May 1993.
                     64:     4) "Am79C960 PCnet-ISA(tm), Single-Chip Ethernet Controller for ISA",
                     65:        AMD, Pub. #16907, May 1992
                     66:     5) "DEC EtherWORKS LC Ethernet Controller Owners Manual",
                     67:        Digital Equipment corporation, 1990, Pub. #EK-DE100-OM.003
                     68:     6) "DEC EtherWORKS Turbo Ethernet Controller Owners Manual",
                     69:        Digital Equipment corporation, 1990, Pub. #EK-DE200-OM.003
                     70:     7) "DEPCA Hardware Reference Manual", Pub. #EK-DEPCA-PR
                     71:        Digital Equipment Corporation, 1989
                     72:     8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual",
                     73:        Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001
                     74:     
                     75: 
                     76:     Peter Bauer's depca.c (V0.5) was referred to when debugging V0.1 of this
                     77:     driver.
                     78: 
                     79:     The original DEPCA  card requires that the  ethernet ROM address counter
                     80:     be enabled to count and has an 8 bit NICSR.  The ROM counter enabling is
                     81:     only  done when a  0x08 is read as the  first address octet (to minimise
                     82:     the chances  of writing over some  other hardware's  I/O register).  The
                     83:     NICSR accesses   have been changed  to  byte accesses  for all the cards
                     84:     supported by this driver, since there is only one  useful bit in the MSB
                     85:     (remote boot timeout) and it  is not used.  Also, there  is a maximum of
                     86:     only 48kB network  RAM for this  card.  My thanks  to Torbjorn Lindh for
                     87:     help debugging all this (and holding my feet to  the fire until I got it
                     88:     right).
                     89: 
                     90:     The DE200  series  boards have  on-board 64kB  RAM for  use  as a shared
                     91:     memory network  buffer. Only the DE100  cards make use  of a  2kB buffer
                     92:     mode which has not  been implemented in  this driver (only the 32kB  and
                     93:     64kB modes are supported [16kB/48kB for the original DEPCA]).
                     94: 
                     95:     At the most only 2 DEPCA cards can  be supported on  the ISA bus because
                     96:     there is only provision  for two I/O base addresses  on each card (0x300
                     97:     and 0x200). The I/O address is detected by searching for a byte sequence
                     98:     in the Ethernet station address PROM at the expected I/O address for the
                     99:     Ethernet  PROM.   The shared memory  base   address  is 'autoprobed'  by
                    100:     looking  for the self  test PROM  and detecting the  card name.   When a
                    101:     second  DEPCA is  detected,  information  is   placed in the   base_addr
                    102:     variable of the  next device structure (which  is created if necessary),
                    103:     thus  enabling ethif_probe  initialization  for the device.  More than 2
                    104:     EISA cards can  be  supported, but  care will  be  needed assigning  the
                    105:     shared memory to ensure that each slot has the  correct IRQ, I/O address
                    106:     and shared memory address assigned.
                    107: 
                    108:     ************************************************************************
                    109: 
                    110:     NOTE: If you are using two  ISA DEPCAs, it is  important that you assign
                    111:     the base memory addresses correctly.   The  driver autoprobes I/O  0x300
                    112:     then 0x200.  The  base memory address for  the first device must be less
                    113:     than that of the second so that the auto probe will correctly assign the
                    114:     I/O and memory addresses on the same card.  I can't think of a way to do
                    115:     this unambiguously at the moment, since there is nothing on the cards to
                    116:     tie I/O and memory information together.
                    117: 
                    118:     I am unable  to  test  2 cards   together for now,    so this  code   is
                    119:     unchecked. All reports, good or bad, are welcome.
                    120: 
                    121:     ************************************************************************
                    122: 
                    123:     The board IRQ   setting must be  at an  unused IRQ which  is auto-probed
                    124:     using Donald Becker's autoprobe routines. DEPCA and DE100 board IRQs are
                    125:     {2,3,4,5,7}, whereas the  DE200 is at {5,9,10,11,15}.  Note that IRQ2 is
                    126:     really IRQ9 in machines with 16 IRQ lines.
                    127: 
                    128:     No 16MB memory  limitation should exist with this  driver as DMA is  not
                    129:     used and the common memory area is in low memory on the network card (my
                    130:     current system has 20MB and I've not had problems yet).
                    131: 
                    132:     The ability to load this driver as a loadable module has been added. To
                    133:     utilise this ability, you have to do <8 things:
                    134: 
                    135:     0) have a copy of the loadable modules code installed on your system.
                    136:     1) copy depca.c from the  /linux/drivers/net directory to your favourite
                    137:     temporary directory.
                    138:     2) if you wish, edit the  source code near  line 1530 to reflect the I/O
                    139:     address and IRQ you're using (see also 5).
                    140:     3) compile  depca.c, but include -DMODULE in  the command line to ensure
                    141:     that the correct bits are compiled (see end of source code).
                    142:     4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
                    143:     kernel with the depca configuration turned off and reboot.
                    144:     5) insmod depca.o [irq=7] [io=0x200] [mem=0xd0000] [adapter_name=DE100]
                    145:        [Alan Cox: Changed the code to allow command line irq/io assignments]
                    146:        [Dave Davies: Changed the code to allow command line mem/name
                    147:                                                                 assignments]
                    148:     6) run the net startup bits for your eth?? interface manually 
                    149:     (usually /etc/rc.inet[12] at boot time). 
                    150:     7) enjoy!
                    151: 
                    152:     Note that autoprobing is not allowed in loadable modules - the system is
                    153:     already up and running and you're messing with interrupts.
                    154: 
                    155:     To unload a module, turn off the associated interface 
                    156:     'ifconfig eth?? down' then 'rmmod depca'.
                    157: 
                    158:     To assign a base memory address for the shared memory  when running as a
                    159:     loadable module, see 5 above.  To include the adapter  name (if you have
                    160:     no PROM  but know the card name)  also see 5  above. Note that this last
                    161:     option  will not work  with kernel  built-in  depca's. 
                    162: 
                    163:     The shared memory assignment for a loadable module  makes sense to avoid
                    164:     the 'memory autoprobe' picking the wrong shared memory  (for the case of
                    165:     2 depca's in a PC).
                    166: 
                    167:     ************************************************************************
                    168:     Support for MCA EtherWORKS cards added 11-3-98.
                    169:     Verified to work with up to 2 DE212 cards in a system (although not
                    170:       fully stress-tested).  
                    171: 
                    172:     Currently known bugs/limitations:
                    173: 
                    174:     Note:  with the MCA stuff as a module, it trusts the MCA configuration,
                    175:            not the command line for IRQ and memory address.  You can
                    176:            specify them if you want, but it will throw your values out.
                    177:            You still have to pass the IO address it was configured as
                    178:            though.
                    179: 
                    180:     ************************************************************************
                    181:     TO DO:
                    182:     ------
                    183: 
                    184: 
                    185:     Revision History
                    186:     ----------------
                    187: 
                    188:     Version   Date        Description
                    189:   
                    190:       0.1     25-jan-94   Initial writing.
                    191:       0.2     27-jan-94   Added LANCE TX hardware buffer chaining.
                    192:       0.3      1-feb-94   Added multiple DEPCA support.
                    193:       0.31     4-feb-94   Added DE202 recognition.
                    194:       0.32    19-feb-94   Tidy up. Improve multi-DEPCA support.
                    195:       0.33    25-feb-94   Fix DEPCA ethernet ROM counter enable.
                    196:                           Add jabber packet fix from [email protected]
                    197:                          and [email protected]
                    198:       0.34     7-mar-94   Fix DEPCA max network memory RAM & NICSR access.
                    199:       0.35     8-mar-94   Added DE201 recognition. Tidied up.
                    200:       0.351   30-apr-94   Added EISA support. Added DE422 recognition.
                    201:       0.36    16-may-94   DE422 fix released.
                    202:       0.37    22-jul-94   Added MODULE support
                    203:       0.38    15-aug-94   Added DBR ROM switch in depca_close(). 
                    204:                           Multi DEPCA bug fix.
                    205:       0.38axp 15-sep-94   Special version for Alpha AXP Linux V1.0.
                    206:       0.381   12-dec-94   Added DE101 recognition, fix multicast bug.
                    207:       0.382    9-feb-95   Fix recognition bug reported by <[email protected]>.
                    208:       0.383   22-feb-95   Fix for conflict with VESA SCSI reported by
                    209:                           <[email protected]>
                    210:       0.384   17-mar-95   Fix a ring full bug reported by <[email protected]>
                    211:       0.385    3-apr-95   Fix a recognition bug reported by 
                    212:                                                 <[email protected]>
                    213:       0.386   21-apr-95   Fix the last fix...sorry, must be galloping senility
                    214:       0.40    25-May-95   Rewrite for portability & updated.
                    215:                           ALPHA support from <[email protected]>
                    216:       0.41    26-Jun-95   Added verify_area() calls in depca_ioctl() from
                    217:                           suggestion by <[email protected]>
                    218:       0.42    27-Dec-95   Add 'mem' shared memory assignment for loadable 
                    219:                           modules.
                    220:                           Add 'adapter_name' for loadable modules when no PROM.
                    221:                          Both above from a suggestion by 
                    222:                          <[email protected]>.
                    223:                          Add new multicasting code.
                    224:       0.421   22-Apr-96          Fix alloc_device() bug <[email protected]>
                    225:       0.422   29-Apr-96          Fix depca_hw_init() bug <[email protected]>
                    226:       0.423    7-Jun-96   Fix module load bug <[email protected]>
                    227:       0.43    16-Aug-96   Update alloc_device() to conform to de4x5.c
                    228:       0.44     1-Sep-97   Fix *_probe() to test check_region() first - bug
                    229:                            reported by <[email protected]>
                    230:       0.45     3-Nov-98   Added support for MCA EtherWORKS (DE210/DE212) cards
                    231:                            by <[email protected]> 
                    232:       0.451    5-Nov-98   Fixed mca stuff cuz I'm a dummy. <[email protected]>
                    233:       0.5     14-Nov-98   Re-spin for 2.1.x kernels.
                    234:       0.51    27-Jun-99   Correct received packet length for CRC from
                    235:                            report by <[email protected]>
                    236: 
                    237:     =========================================================================
                    238: */
                    239: 
                    240: #include "etherboot.h"
                    241: #include "nic.h"
                    242: #include <ipxe/isa.h>
                    243: #include <ipxe/console.h>
                    244: #include <ipxe/ethernet.h>
                    245: 
                    246: /*
                    247: ** I/O addresses. Note that the 2k buffer option is not supported in
                    248: ** this driver.
                    249: */
                    250: #define DEPCA_NICSR 0x00   /* Network interface CSR */
                    251: #define DEPCA_RBI   0x02   /* RAM buffer index (2k buffer mode) */
                    252: #define DEPCA_DATA  0x04   /* LANCE registers' data port */
                    253: #define DEPCA_ADDR  0x06   /* LANCE registers' address port */
                    254: #define DEPCA_HBASE 0x08   /* EISA high memory base address reg. */
                    255: #define DEPCA_PROM  0x0c   /* Ethernet address ROM data port */
                    256: #define DEPCA_CNFG  0x0c   /* EISA Configuration port */
                    257: #define DEPCA_RBSA  0x0e   /* RAM buffer starting address (2k buff.) */
                    258: 
                    259: /*
                    260: ** These are LANCE registers addressable through nic->ioaddr + DEPCA_ADDR 
                    261: */
                    262: #define CSR0       0
                    263: #define CSR1       1
                    264: #define CSR2       2
                    265: #define CSR3       3
                    266: 
                    267: /* 
                    268: ** NETWORK INTERFACE CSR (NI_CSR) bit definitions 
                    269: */
                    270:  
                    271: #define TO             0x0100  /* Time Out for remote boot */
                    272: #define SHE            0x0080  /* SHadow memory Enable */
                    273: #define BS             0x0040  /* Bank Select */
                    274: #define BUF            0x0020  /* BUFfer size (1->32k, 0->64k) */
                    275: #define RBE            0x0010  /* Remote Boot Enable (1->net boot) */
                    276: #define AAC            0x0008  /* Address ROM Address Counter (1->enable) */
                    277: #define _128KB         0x0008  /* 128kB Network RAM (1->enable) */
                    278: #define IM             0x0004  /* Interrupt Mask (1->mask) */
                    279: #define IEN            0x0002  /* Interrupt tristate ENable (1->enable) */
                    280: #define LED            0x0001  /* LED control */
                    281: 
                    282: /* 
                    283: ** Control and Status Register 0 (CSR0) bit definitions 
                    284: */
                    285: 
                    286: #define ERR            0x8000  /* Error summary */
                    287: #define BABL           0x4000  /* Babble transmitter timeout error  */
                    288: #define CERR           0x2000  /* Collision Error */
                    289: #define MISS           0x1000  /* Missed packet */
                    290: #define MERR           0x0800  /* Memory Error */
                    291: #define RINT           0x0400  /* Receiver Interrupt */
                    292: #define TINT           0x0200  /* Transmit Interrupt */
                    293: #define IDON           0x0100  /* Initialization Done */
                    294: #define INTR           0x0080  /* Interrupt Flag */
                    295: #define INEA           0x0040  /* Interrupt Enable */
                    296: #define RXON           0x0020  /* Receiver on */
                    297: #define TXON           0x0010  /* Transmitter on */
                    298: #define TDMD           0x0008  /* Transmit Demand */
                    299: #define STOP           0x0004  /* Stop */
                    300: #define STRT           0x0002  /* Start */
                    301: #define INIT           0x0001  /* Initialize */
                    302: #define INTM            0xff00  /* Interrupt Mask */
                    303: #define INTE            0xfff0  /* Interrupt Enable */
                    304: 
                    305: /*
                    306: ** CONTROL AND STATUS REGISTER 3 (CSR3)
                    307: */
                    308: 
                    309: #define BSWP           0x0004  /* Byte SWaP */
                    310: #define ACON           0x0002  /* ALE control */
                    311: #define BCON           0x0001  /* Byte CONtrol */
                    312: 
                    313: /*
                    314: ** Initialization Block Mode Register 
                    315: */
                    316: 
                    317: #define PROM           0x8000  /* Promiscuous Mode */
                    318: #define EMBA           0x0080  /* Enable Modified Back-off Algorithm */
                    319: #define INTL           0x0040  /* Internal Loopback */
                    320: #define DRTY           0x0020  /* Disable Retry */
                    321: #define COLL           0x0010  /* Force Collision */
                    322: #define DTCR           0x0008  /* Disable Transmit CRC */
                    323: #define LOOP           0x0004  /* Loopback */
                    324: #define DTX            0x0002  /* Disable the Transmitter */
                    325: #define DRX            0x0001  /* Disable the Receiver */
                    326: 
                    327: /*
                    328: ** Receive Message Descriptor 1 (RMD1) bit definitions. 
                    329: */
                    330: 
                    331: #define R_OWN       0x80000000         /* Owner bit 0 = host, 1 = lance */
                    332: #define R_ERR          0x4000  /* Error Summary */
                    333: #define R_FRAM         0x2000  /* Framing Error */
                    334: #define R_OFLO         0x1000  /* Overflow Error */
                    335: #define R_CRC          0x0800  /* CRC Error */
                    336: #define R_BUFF         0x0400  /* Buffer Error */
                    337: #define R_STP          0x0200  /* Start of Packet */
                    338: #define R_ENP          0x0100  /* End of Packet */
                    339: 
                    340: /*
                    341: ** Transmit Message Descriptor 1 (TMD1) bit definitions. 
                    342: */
                    343: 
                    344: #define T_OWN       0x80000000         /* Owner bit 0 = host, 1 = lance */
                    345: #define T_ERR          0x4000  /* Error Summary */
                    346: #define T_ADD_FCS      0x2000  /* More the 1 retry needed to Xmit */
                    347: #define T_MORE         0x1000  /* >1 retry to transmit packet */
                    348: #define T_ONE          0x0800  /* 1 try needed to transmit the packet */
                    349: #define T_DEF          0x0400  /* Deferred */
                    350: #define T_STP       0x02000000         /* Start of Packet */
                    351: #define T_ENP       0x01000000 /* End of Packet */
                    352: #define T_FLAGS     0xff000000  /* TX Flags Field */
                    353: 
                    354: /*
                    355: ** Transmit Message Descriptor 3 (TMD3) bit definitions.
                    356: */
                    357: 
                    358: #define TMD3_BUFF    0x8000    /* BUFFer error */
                    359: #define TMD3_UFLO    0x4000    /* UnderFLOw error */
                    360: #define TMD3_RES     0x2000    /* REServed */
                    361: #define TMD3_LCOL    0x1000    /* Late COLlision */
                    362: #define TMD3_LCAR    0x0800    /* Loss of CARrier */
                    363: #define TMD3_RTRY    0x0400    /* ReTRY error */
                    364: 
                    365: /*
                    366: ** Ethernet PROM defines
                    367: */
                    368: #define PROBE_LENGTH    32
                    369: 
                    370: /*
                    371: ** Set the number of Tx and Rx buffers. Ensure that the memory requested
                    372: ** here is <= to the amount of shared memory set up by the board switches.
                    373: ** The number of descriptors MUST BE A POWER OF 2.
                    374: **
                    375: ** total_memory = NUM_RX_DESC*(8+RX_BUFF_SZ) + NUM_TX_DESC*(8+TX_BUFF_SZ)
                    376: */
                    377: #define NUM_RX_DESC     2               /* Number of RX descriptors */
                    378: #define NUM_TX_DESC     2               /* Number of TX descriptors */
                    379: #define RX_BUFF_SZ     1536            /* Buffer size for each Rx buffer */
                    380: #define TX_BUFF_SZ     1536            /* Buffer size for each Tx buffer */
                    381: 
                    382: /*
                    383: ** ISA Bus defines
                    384: */
                    385: #ifndef        DEPCA_MODEL
                    386: #define        DEPCA_MODEL     DEPCA
                    387: #endif
                    388: 
                    389: static enum {
                    390:        DEPCA, DE100, DE101, DE200, DE201, DE202, DE210, DE212, DE422, unknown
                    391: } adapter = DEPCA_MODEL;
                    392: 
                    393: /*
                    394: ** Name <-> Adapter mapping
                    395: */
                    396: 
                    397: static char *adapter_name[] = {
                    398:        "DEPCA",
                    399:        "DE100","DE101",
                    400:        "DE200","DE201","DE202",
                    401:        "DE210","DE212",
                    402:        "DE422",
                    403:        ""
                    404: };
                    405: 
                    406: #ifndef        DEPCA_RAM_BASE
                    407: #define DEPCA_RAM_BASE 0xd0000
                    408: #endif
                    409: 
                    410: /*
                    411: ** Memory Alignment. Each descriptor is 4 longwords long. To force a
                    412: ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
                    413: ** DESC_ALIGN. ALIGN aligns the start address of the private memory area
                    414: ** and hence the RX descriptor ring's first entry. 
                    415: */
                    416: #define ALIGN4      ((u32)4 - 1)       /* 1 longword align */
                    417: #define ALIGN8      ((u32)8 - 1)       /* 2 longword (quadword) align */
                    418: #define ALIGN         ALIGN8              /* Keep the LANCE happy... */
                    419: 
                    420: /*
                    421: ** The DEPCA Rx and Tx ring descriptors. 
                    422: */
                    423: struct depca_rx_desc {
                    424:     volatile s32 base;
                    425:     s16 buf_length;            /* This length is negative 2's complement! */
                    426:     s16 msg_length;            /* This length is "normal". */
                    427: };
                    428: 
                    429: struct depca_tx_desc {
                    430:     volatile s32 base;
                    431:     s16 length;                        /* This length is negative 2's complement! */
                    432:     s16 misc;                   /* Errors and TDR info */
                    433: };
                    434: 
                    435: #define LA_MASK 0x0000ffff      /* LANCE address mask for mapping network RAM
                    436:                                   to LANCE memory address space */
                    437: 
                    438: /*
                    439: ** The Lance initialization block, described in databook, in common memory.
                    440: */
                    441: struct depca_init {
                    442:     u16 mode;                  /* Mode register */
                    443:     u8  phys_addr[ETH_ALEN];   /* Physical ethernet address */
                    444:     u8  mcast_table[8];                /* Multicast Hash Table. */
                    445:     u32 rx_ring;               /* Rx ring base pointer & ring length */
                    446:     u32 tx_ring;               /* Tx ring base pointer & ring length */
                    447: };
                    448: 
                    449: struct depca_private {
                    450:        struct depca_rx_desc    *rx_ring;
                    451:        struct depca_tx_desc    *tx_ring;
                    452:        struct depca_init       init_block;     /* Shadow init block */
                    453:        char                    *rx_memcpy[NUM_RX_DESC];
                    454:        char                    *tx_memcpy[NUM_TX_DESC];
                    455:        u32                     bus_offset;     /* ISA bus address offset */
                    456:        u32                     sh_mem;         /* address of shared mem */
                    457:        u32                     dma_buffs;      /* Rx & Tx buffer start */
                    458:        int                     rx_cur, tx_cur; /* Next free ring entry */
                    459:        int                     txRingMask, rxRingMask;
                    460:        s32                     rx_rlen, tx_rlen;
                    461:        /* log2([rt]xRingMask+1) for the descriptors */
                    462: };
                    463: 
                    464: static Address         mem_start = DEPCA_RAM_BASE;
                    465: static Address         mem_len, offset;
                    466: static struct depca_private    lp;
                    467: 
                    468: /*
                    469: ** Miscellaneous defines...
                    470: */
                    471: #define STOP_DEPCA(ioaddr) \
                    472:     outw(CSR0, ioaddr + DEPCA_ADDR);\
                    473:     outw(STOP, ioaddr + DEPCA_DATA)
                    474: 
                    475: /* Initialize the lance Rx and Tx descriptor rings. */
                    476: static void depca_init_ring(struct nic *nic)
                    477: {
                    478:        int     i;
                    479:        u32     p;
                    480: 
                    481:        lp.rx_cur = lp.tx_cur = 0;
                    482:        /* Initialize the base addresses and length of each buffer in the ring */
                    483:        for (i = 0; i <= lp.rxRingMask; i++) {
                    484:                writel((p = lp.dma_buffs + i * RX_BUFF_SZ) | R_OWN, &lp.rx_ring[i].base);
                    485:                writew(-RX_BUFF_SZ, &lp.rx_ring[i].buf_length);
                    486:                lp.rx_memcpy[i] = (char *) (p + lp.bus_offset);
                    487:        }
                    488:        for (i = 0; i <= lp.txRingMask; i++) {
                    489:                writel((p = lp.dma_buffs + (i + lp.txRingMask + 1) * TX_BUFF_SZ) & 0x00ffffff, &lp.tx_ring[i].base);
                    490:                lp.tx_memcpy[i] = (char *) (p + lp.bus_offset);
                    491:        }
                    492: 
                    493:        /* Set up the initialization block */
                    494:        lp.init_block.rx_ring = ((u32) ((u32) lp.rx_ring) & LA_MASK) | lp.rx_rlen;
                    495:        lp.init_block.tx_ring = ((u32) ((u32) lp.tx_ring) & LA_MASK) | lp.tx_rlen;
                    496:        for (i = 0; i < ETH_ALEN; i++)
                    497:                lp.init_block.phys_addr[i] = nic->node_addr[i];
                    498:        lp.init_block.mode = 0x0000;    /* Enable the Tx and Rx */
                    499:        memset(lp.init_block.mcast_table, 0, sizeof(lp.init_block.mcast_table));
                    500: }
                    501: 
                    502: static inline void LoadCSRs(struct nic *nic)
                    503: {
                    504:        outw(CSR1, nic->ioaddr + DEPCA_ADDR);   /* initialisation block address LSW */
                    505:        outw((u16) (lp.sh_mem & LA_MASK), nic->ioaddr + DEPCA_DATA);
                    506:        outw(CSR2, nic->ioaddr + DEPCA_ADDR);   /* initialisation block address MSW */
                    507:        outw((u16) ((lp.sh_mem & LA_MASK) >> 16), nic->ioaddr + DEPCA_DATA);
                    508:        outw(CSR3, nic->ioaddr + DEPCA_ADDR);   /* ALE control */
                    509:        outw(ACON, nic->ioaddr + DEPCA_DATA);
                    510:        outw(CSR0, nic->ioaddr + DEPCA_ADDR);   /* Point back to CSR0 */
                    511: }
                    512: 
                    513: static inline int InitRestartDepca(struct nic *nic)
                    514: {
                    515:        int             i;
                    516: 
                    517:        /* Copy the shadow init_block to shared memory */
                    518:        memcpy_toio((char *)lp.sh_mem, &lp.init_block, sizeof(struct depca_init));
                    519:        outw(CSR0, nic->ioaddr + DEPCA_ADDR);           /* point back to CSR0 */
                    520:        outw(INIT, nic->ioaddr + DEPCA_DATA);           /* initialise DEPCA */
                    521: 
                    522:        for (i = 0; i < 100 && !(inw(nic->ioaddr + DEPCA_DATA) & IDON); i++)
                    523:                ;
                    524:        if (i < 100) {
                    525:                /* clear IDON by writing a 1, and start LANCE */
                    526:                outw(IDON | STRT, nic->ioaddr + DEPCA_DATA);
                    527:        } else {
                    528:                printf("DEPCA not initialised\n");
                    529:                return (1);
                    530:        }
                    531:        return (0);
                    532: }
                    533: 
                    534: /**************************************************************************
                    535: RESET - Reset adapter
                    536: ***************************************************************************/
                    537: static void depca_reset(struct nic *nic)
                    538: {
                    539:        s16     nicsr;
                    540:        int     i, j;
                    541: 
                    542:        STOP_DEPCA(nic->ioaddr);
                    543:        nicsr = inb(nic->ioaddr + DEPCA_NICSR);
                    544:        nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
                    545:        outb(nicsr, nic->ioaddr + DEPCA_NICSR);
                    546:        if (inw(nic->ioaddr + DEPCA_DATA) != STOP)
                    547:        {
                    548:                printf("depca: Cannot stop NIC\n");
                    549:                return;
                    550:        }
                    551: 
                    552:        /* Initialisation block */
                    553:        lp.sh_mem = mem_start;
                    554:        mem_start += sizeof(struct depca_init);
                    555:        /* Tx & Rx descriptors (aligned to a quadword boundary) */
                    556:        mem_start = (mem_start + ALIGN) & ~ALIGN;
                    557:        lp.rx_ring = (struct depca_rx_desc *) mem_start;
                    558:        mem_start += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
                    559:        lp.tx_ring = (struct depca_tx_desc *) mem_start;
                    560:        mem_start += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
                    561: 
                    562:        lp.bus_offset = mem_start & 0x00ff0000;
                    563:        /* LANCE re-mapped start address */
                    564:        lp.dma_buffs = mem_start & LA_MASK;
                    565: 
                    566:        /* Finish initialising the ring information. */
                    567:        lp.rxRingMask = NUM_RX_DESC - 1;
                    568:        lp.txRingMask = NUM_TX_DESC - 1;
                    569: 
                    570:        /* Calculate Tx/Rx RLEN size for the descriptors. */
                    571:        for (i = 0, j = lp.rxRingMask; j > 0; i++) {
                    572:                j >>= 1;
                    573:        }
                    574:        lp.rx_rlen = (s32) (i << 29);
                    575:        for (i = 0, j = lp.txRingMask; j > 0; i++) {
                    576:                j >>= 1;
                    577:        }
                    578:        lp.tx_rlen = (s32) (i << 29);
                    579: 
                    580:        /* Load the initialisation block */
                    581:        depca_init_ring(nic);
                    582:        LoadCSRs(nic);
                    583:        InitRestartDepca(nic);
                    584: }
                    585: 
                    586: /**************************************************************************
                    587: POLL - Wait for a frame
                    588: ***************************************************************************/
                    589: static int depca_poll(struct nic *nic, int retrieve)
                    590: {
                    591:        int             entry;
                    592:        u32             status;
                    593: 
                    594:        entry = lp.rx_cur;
                    595:        if ((status = readl(&lp.rx_ring[entry].base) & R_OWN))
                    596:                return (0);
                    597: 
                    598:        if ( ! retrieve ) return 1;
                    599: 
                    600:        memcpy(nic->packet, lp.rx_memcpy[entry], nic->packetlen = lp.rx_ring[entry].msg_length);
                    601:        lp.rx_ring[entry].base |= R_OWN;
                    602:        lp.rx_cur = (++lp.rx_cur) & lp.rxRingMask;
                    603:        return (1);
                    604: }
                    605: 
                    606: /**************************************************************************
                    607: TRANSMIT - Transmit a frame
                    608: ***************************************************************************/
                    609: static void depca_transmit(
                    610:        struct nic *nic,
                    611:        const char *d,                  /* Destination */
                    612:        unsigned int t,                 /* Type */
                    613:        unsigned int s,                 /* size */
                    614:        const char *p)                  /* Packet */
                    615: {
                    616:        int             entry, len;
                    617:        char            *mem;
                    618: 
                    619:        /* send the packet to destination */
                    620:        /*
                    621:        ** Caution: the right order is important here... dont
                    622:        ** setup the ownership rights until all the other
                    623:        ** information is in place
                    624:        */
                    625:        mem = lp.tx_memcpy[entry = lp.tx_cur];
                    626:        memcpy_toio(mem, d, ETH_ALEN);
                    627:        memcpy_toio(mem + ETH_ALEN, nic->node_addr, ETH_ALEN);
                    628:        mem[ETH_ALEN * 2] = t >> 8;
                    629:        mem[ETH_ALEN * 2 + 1] = t;
                    630:        memcpy_toio(mem + ETH_HLEN, p, s);
                    631:        s += ETH_HLEN;
                    632:        len = (s < ETH_ZLEN ? ETH_ZLEN : s);
                    633:        /* clean out flags */
                    634:        writel(readl(&lp.tx_ring[entry].base) & ~T_FLAGS, &lp.tx_ring[entry].base);
                    635:        /* clears other error flags */
                    636:        writew(0x0000, &lp.tx_ring[entry].misc);
                    637:        /* packet length in buffer */
                    638:        writew(-len, &lp.tx_ring[entry].length);
                    639:        /* start and end of packet, ownership */
                    640:        writel(readl(&lp.tx_ring[entry].base) | (T_STP|T_ENP|T_OWN), &lp.tx_ring[entry].base);
                    641:        /* update current pointers */
                    642:        lp.tx_cur = (++lp.tx_cur) & lp.txRingMask;
                    643: }
                    644: 
                    645: /**************************************************************************
                    646: DISABLE - Turn off ethernet interface
                    647: ***************************************************************************/
                    648: static void depca_disable ( struct nic *nic ) {
                    649:        depca_reset(nic);
                    650: 
                    651:        STOP_DEPCA(nic->ioaddr);
                    652: }
                    653: 
                    654: /**************************************************************************
                    655: IRQ - Interrupt Control
                    656: ***************************************************************************/
                    657: static void depca_irq(struct nic *nic __unused, irq_action_t action __unused)
                    658: {
                    659:   switch ( action ) {
                    660:   case DISABLE :
                    661:     break;
                    662:   case ENABLE :
                    663:     break;
                    664:   case FORCE :
                    665:     break;
                    666:   }
                    667: }
                    668: 
                    669: /*
                    670: ** Look for a special sequence in the Ethernet station address PROM that
                    671: ** is common across all DEPCA products. Note that the original DEPCA needs
                    672: ** its ROM address counter to be initialized and enabled. Only enable
                    673: ** if the first address octet is a 0x08 - this minimises the chances of
                    674: ** messing around with some other hardware, but it assumes that this DEPCA
                    675: ** card initialized itself correctly.
                    676: **
                    677: ** Search the Ethernet address ROM for the signature. Since the ROM address
                    678: ** counter can start at an arbitrary point, the search must include the entire
                    679: ** probe sequence length plus the (length_of_the_signature - 1).
                    680: ** Stop the search IMMEDIATELY after the signature is found so that the
                    681: ** PROM address counter is correctly positioned at the start of the
                    682: ** ethernet address for later read out.
                    683: */
                    684: 
                    685: 
                    686: /*
                    687:  * Ugly, ugly, ugly.  I can't quite make out where the split should be
                    688:  * between probe1 and probe()...
                    689:  *
                    690:  */
                    691: static u8 nicsr;
                    692: 
                    693: 
                    694: static int depca_probe1 ( isa_probe_addr_t ioaddr ) {
                    695:        u8      data;
                    696:        /* This is only correct for little endian machines, but then
                    697:           Etherboot doesn't work on anything but a PC */
                    698:        u8      sig[] = { 0xFF, 0x00, 0x55, 0xAA, 0xFF, 0x00, 0x55, 0xAA };
                    699:        int     i, j;
                    700: 
                    701:        data = inb(ioaddr + DEPCA_PROM);                /* clear counter on DEPCA */
                    702:        data = inb(ioaddr + DEPCA_PROM);                /* read data */
                    703:        if (data == 0x8) {
                    704:                nicsr = inb(ioaddr + DEPCA_NICSR);
                    705:                nicsr |= AAC;
                    706:                outb(nicsr, ioaddr + DEPCA_NICSR);
                    707:        }
                    708:        for (i = 0, j = 0; j < (int)sizeof(sig) && i < PROBE_LENGTH+((int)sizeof(sig))-1; ++i) {
                    709:                data = inb(ioaddr + DEPCA_PROM);
                    710:                if (data == sig[j])             /* track signature */
                    711:                        ++j;
                    712:                else
                    713:                        j = (data == sig[0]) ? 1 : 0;
                    714:        }
                    715:        if (j != sizeof(sig))
                    716:                return (0);
                    717:        /* put the card in its initial state */
                    718:        STOP_DEPCA(ioaddr);
                    719:        nicsr = ((inb(ioaddr + DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
                    720:        outb(nicsr, ioaddr + DEPCA_NICSR);
                    721:        if (inw(ioaddr + DEPCA_DATA) != STOP)
                    722:                return (0);
                    723:        memcpy((char *)mem_start, sig, sizeof(sig));
                    724:        if (memcmp((char *)mem_start, sig, sizeof(sig)) != 0)
                    725:                return (0);
                    726: 
                    727:        return 1;
                    728: }
                    729: 
                    730: static struct nic_operations depca_operations = {
                    731:        .connect        = dummy_connect,
                    732:        .poll           = depca_poll,
                    733:        .transmit       = depca_transmit,
                    734:        .irq            = depca_irq,
                    735: 
                    736: };
                    737: 
                    738: /**************************************************************************
                    739: PROBE - Look for an adapter, this routine's visible to the outside
                    740: ***************************************************************************/
                    741: static int depca_probe ( struct nic *nic, struct isa_device *isa ) {
                    742: 
                    743:        int     i, j;
                    744:        long    sum, chksum;
                    745: 
                    746:        nic->irqno    = 0;
                    747:        nic->ioaddr   = isa->ioaddr;
                    748: 
                    749:        for (i = 0, j = 0, sum = 0; j < 3; j++) {
                    750:                sum <<= 1;
                    751:                if (sum > 0xFFFF)
                    752:                        sum -= 0xFFFF;
                    753:                sum += (u8)(nic->node_addr[i++] = inb(nic->ioaddr + DEPCA_PROM));
                    754:                sum += (u16)((nic->node_addr[i++] = inb(nic->ioaddr + DEPCA_PROM)) << 8);
                    755:                if (sum > 0xFFFF)
                    756:                        sum -= 0xFFFF;
                    757:        }
                    758:        if (sum == 0xFFFF)
                    759:                sum = 0;
                    760:        chksum = (u8)inb(nic->ioaddr + DEPCA_PROM);
                    761:        chksum |= (u16)(inb(nic->ioaddr + DEPCA_PROM) << 8);
                    762:        mem_len = (adapter == DEPCA) ? (48 << 10) : (64 << 10);
                    763:        offset = 0;
                    764:        if (nicsr & BUF) {
                    765:                offset = 0x8000;
                    766:                nicsr &= ~BS;
                    767:                mem_len -= (32 << 10);
                    768:        }
                    769:        if (adapter != DEPCA)   /* enable shadow RAM */
                    770:                outb(nicsr |= SHE, nic->ioaddr + DEPCA_NICSR);
                    771:        DBG ( "%s base %4.4x, memory [%4.4lx-%4.4lx] addr %s",
                    772:               adapter_name[adapter], nic->ioaddr, mem_start,
                    773:               mem_start + mem_len, eth_ntoa ( nic->node_addr ) );
                    774:        if (sum != chksum)
                    775:                printf(" (bad checksum)");
                    776:        putchar('\n');
                    777: 
                    778:        depca_reset(nic);
                    779: 
                    780:        /* point to NIC specific routines */
                    781:        nic->nic_op     = &depca_operations;
                    782:        return 1;
                    783: }
                    784: 
                    785: static isa_probe_addr_t depca_probe_addrs[] = {
                    786:        0x300, 0x200,
                    787: };
                    788: 
                    789: ISA_DRIVER ( depca_driver, depca_probe_addrs, depca_probe1,
                    790:                     GENERIC_ISAPNP_VENDOR, 0x80f7 );
                    791: 
                    792: DRIVER ( "depce", nic_driver, isa_driver, depca_driver,
                    793:         depca_probe, depca_disable );
                    794: 
                    795: ISA_ROM ( "depca", "Digital DE100 and DE200" );
                    796: 
                    797: #endif
                    798: 
                    799: /*
                    800:  * Local variables:
                    801:  *  c-basic-offset: 8
                    802:  *  c-indent-level: 8
                    803:  *  tab-width: 8
                    804:  * End:
                    805:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.