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
330#define R_OWN 0x80000000
343#define T_OWN 0x80000000
345#define T_ADD_FCS 0x2000
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
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;
396static 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)
422struct depca_rx_desc {
428struct depca_tx_desc {
434#define LA_MASK 0x0000ffff
448struct depca_private {
451 struct depca_init init_block;
458 int txRingMask, rxRingMask;
459 s32 rx_rlen, tx_rlen;
465static struct depca_private lp;
470#define STOP_DEPCA(ioaddr) \
471 outw(CSR0, ioaddr + DEPCA_ADDR);\
472 outw(STOP, ioaddr + DEPCA_DATA)
475static 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));
501static inline void LoadCSRs(
struct nic *
nic)
512static 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");
536static 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);
588static 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;
608static 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;
647static void depca_disable (
struct nic *
nic,
void *hwdev
__unused ) {
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)");
788ISA_DRIVER ( depca_driver, depca_probe_addrs, depca_probe1,
794ISA_ROM (
"depca",
"Digital DE100 and DE200" );
uint16_t offset
Offset to command line.
int putchar(int character)
Write a single character to each console device.
static unsigned long ioaddr
static unsigned int mem_start
uint8_t data[48]
Additional event data.
uint16_t mode
Acceleration mode.
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
#define __unused
Declare a variable or data structure as unused.
#define DBG(...)
Print a debugging message.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define outb(data, io_addr)
#define outw(data, io_addr)
uint16_t isa_probe_addr_t
#define ISA_ROM(IMAGE, DESCRIPTION)
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
#define GENERIC_ISAPNP_VENDOR
int dummy_connect(struct nic *nic __unused)
#define DRIVER(_name_text, _unused2, _unused3, _name, _probe, _disable, _fake_bss)
#define ISA_DRIVER(_name, _probe_addrs, _probe_addr, _vendor_id, _prod_id)
struct @002057171240057303273132130141036221271355330106 no_fake_bss
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
uint16_t ioaddr
I/O address.
unsigned char * node_addr
struct nic_operations * nic_op
int printf(const char *fmt,...)
Write a formatted string to the console.