8 #error multicast support is not yet implemented 249 #define DEPCA_NICSR 0x00 250 #define DEPCA_RBI 0x02 251 #define DEPCA_DATA 0x04 252 #define DEPCA_ADDR 0x06 253 #define DEPCA_HBASE 0x08 254 #define DEPCA_PROM 0x0c 255 #define DEPCA_CNFG 0x0c 256 #define DEPCA_RBSA 0x0e 276 #define _128KB 0x0008 330 #define R_OWN 0x80000000 332 #define R_FRAM 0x2000 333 #define R_OFLO 0x1000 335 #define R_BUFF 0x0400 343 #define T_OWN 0x80000000 345 #define T_ADD_FCS 0x2000 346 #define T_MORE 0x1000 349 #define T_STP 0x02000000 350 #define T_ENP 0x01000000 351 #define T_FLAGS 0xff000000 357 #define TMD3_BUFF 0x8000 358 #define TMD3_UFLO 0x4000 359 #define TMD3_RES 0x2000 360 #define TMD3_LCOL 0x1000 361 #define TMD3_LCAR 0x0800 362 #define TMD3_RTRY 0x0400 367 #define PROBE_LENGTH 32 376 #define NUM_RX_DESC 2 377 #define NUM_TX_DESC 2 378 #define RX_BUFF_SZ 1536 379 #define TX_BUFF_SZ 1536 385 #define DEPCA_MODEL DEPCA 389 DEPCA, DE100, DE101, DE200, DE201, DE202, DE210, DE212, DE422, unknown
390 } adapter = DEPCA_MODEL;
396 static char *adapter_name[] = {
399 "DE200",
"DE201",
"DE202",
405 #ifndef DEPCA_RAM_BASE 406 #define DEPCA_RAM_BASE 0xd0000 415 #define ALIGN4 ((u32)4 - 1) 416 #define ALIGN8 ((u32)8 - 1) 422 struct depca_rx_desc {
428 struct depca_tx_desc {
434 #define LA_MASK 0x0000ffff 448 struct depca_private {
451 struct depca_init init_block;
458 int txRingMask, rxRingMask;
459 s32 rx_rlen, tx_rlen;
465 static struct depca_private lp;
470 #define STOP_DEPCA(ioaddr) \ 471 outw(CSR0, ioaddr + DEPCA_ADDR);\ 472 outw(STOP, ioaddr + DEPCA_DATA) 475 static void depca_init_ring(
struct nic *
nic)
480 lp.rx_cur = lp.tx_cur = 0;
482 for (i = 0; i <= lp.rxRingMask; i++) {
483 writel((p = lp.dma_buffs + i * RX_BUFF_SZ) | R_OWN, &lp.rx_ring[i].base);
484 writew(-RX_BUFF_SZ, &lp.rx_ring[i].buf_length);
485 lp.rx_memcpy[i] = (
char *) (p + lp.bus_offset);
487 for (i = 0; i <= lp.txRingMask; i++) {
488 writel((p = lp.dma_buffs + (i + lp.txRingMask + 1) * TX_BUFF_SZ) & 0x00ffffff, &lp.tx_ring[i].base);
489 lp.tx_memcpy[i] = (
char *) (p + lp.bus_offset);
493 lp.init_block.rx_ring = ((
u32) ((
u32) lp.rx_ring) & LA_MASK) | lp.rx_rlen;
494 lp.init_block.tx_ring = ((
u32) ((
u32) lp.tx_ring) & LA_MASK) | lp.tx_rlen;
497 lp.init_block.mode = 0x0000;
498 memset(lp.init_block.mcast_table, 0,
sizeof(lp.init_block.mcast_table));
501 static inline void LoadCSRs(
struct nic *
nic)
512 static inline int InitRestartDepca(
struct nic *
nic)
517 memcpy_toio((
char *)lp.sh_mem, &lp.init_block,
sizeof(
struct depca_init));
521 for (i = 0; i < 100 && !(
inw(
nic->
ioaddr + DEPCA_DATA) & IDON); i++)
527 printf(
"DEPCA not initialised\n");
536 static void depca_reset(
struct nic *
nic)
543 nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
547 printf(
"depca: Cannot stop NIC\n");
556 lp.rx_ring = (
struct depca_rx_desc *)
mem_start;
558 lp.tx_ring = (
struct depca_tx_desc *)
mem_start;
570 for (i = 0, j = lp.rxRingMask; j > 0; i++) {
573 lp.rx_rlen = (
s32) (i << 29);
574 for (i = 0, j = lp.txRingMask; j > 0; i++) {
577 lp.tx_rlen = (
s32) (i << 29);
580 depca_init_ring(
nic);
582 InitRestartDepca(
nic);
588 static int depca_poll(
struct nic *
nic,
int retrieve)
594 if ((
status =
readl(&lp.rx_ring[entry].base) & R_OWN))
597 if ( ! retrieve )
return 1;
600 lp.rx_ring[entry].base |= R_OWN;
601 lp.rx_cur = (++lp.rx_cur) & lp.rxRingMask;
608 static void depca_transmit(
624 mem = lp.tx_memcpy[entry = lp.tx_cur];
633 writel(
readl(&lp.tx_ring[entry].base) & ~T_FLAGS, &lp.tx_ring[entry].base);
635 writew(0x0000, &lp.tx_ring[entry].misc);
639 writel(
readl(&lp.tx_ring[entry].base) | (T_STP|T_ENP|T_OWN), &lp.tx_ring[entry].base);
641 lp.tx_cur = (++lp.tx_cur) & lp.txRingMask;
647 static void depca_disable (
struct nic *
nic ) {
697 u8 sig[] = { 0xFF, 0x00, 0x55, 0xAA, 0xFF, 0x00, 0x55, 0xAA };
707 for (i = 0, j = 0; j < (int)
sizeof(
sig) && i < PROBE_LENGTH+((int)
sizeof(
sig))-1; ++i) {
714 if (j !=
sizeof(
sig))
718 nicsr = ((
inb(
ioaddr + DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
732 .transmit = depca_transmit,
748 for (i = 0, j = 0, sum = 0; j < 3; j++) {
761 mem_len = (adapter == DEPCA) ? (48 << 10) : (64 << 10);
766 mem_len -= (32 << 10);
768 if (adapter != DEPCA)
770 DBG (
"%s base %4.4x, memory [%4.4lx-%4.4lx] addr %s",
774 printf(
" (bad checksum)");
788 ISA_DRIVER ( depca_driver, depca_probe_addrs, depca_probe1,
792 depca_probe, depca_disable );
794 ISA_ROM (
"depca",
"Digital DE100 and DE200" );
#define DRIVER(_name_text, _unused2, _unused3, _name, _probe, _disable)
uint16_t ioaddr
I/O address.
int printf(const char *fmt,...)
Write a formatted string to the console.
uint16_t inw(volatile uint16_t *io_addr)
Read 16-bit word from I/O-mapped device.
#define outw(data, io_addr)
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
int dummy_connect(struct nic *nic __unused)
static unsigned int mem_start
static unsigned long ioaddr
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define __unused
Declare a variable or data structure as unused.
uint16_t isa_probe_addr_t
#define GENERIC_ISAPNP_VENDOR
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
uint8_t inb(volatile uint8_t *io_addr)
Read byte from I/O-mapped device.
#define ISA_ROM(IMAGE, DESCRIPTION)
unsigned char * node_addr
#define outb(data, io_addr)
uint8_t data[48]
Additional event data.
uint16_t offset
Offset to command line.
#define ISA_DRIVER(_name, _probe_addrs, _probe_addr, _vendor_id, _prod_id)
#define DBG(...)
Print a debugging message.
struct nic_operations * nic_op
int(* connect)(struct nic *)
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
int putchar(int character)
Write a single character to each console device.
void * memset(void *dest, int character, size_t len) __nonnull