1
2
3
4
5
6
7#ifndef _8390_h
8#define _8390_h
9
10#include <linux/config.h>
11#include <linux/if_ether.h>
12#include <linux/ioport.h>
13#include <linux/skbuff.h>
14
15#define TX_2X_PAGES 12
16#define TX_1X_PAGES 6
17
18
19#define EI_PINGPONG
20
21#ifdef EI_PINGPONG
22#define TX_PAGES TX_2X_PAGES
23#else
24#define TX_PAGES TX_1X_PAGES
25#endif
26
27#define ETHER_ADDR_LEN 6
28
29
30struct e8390_pkt_hdr {
31 unsigned char status;
32 unsigned char next;
33 unsigned short count;
34};
35
36#ifdef notdef
37extern int ei_debug;
38#else
39#define ei_debug 1
40#endif
41
42extern int ethdev_init(struct net_device *dev);
43extern void NS8390_init(struct net_device *dev, int startp);
44extern int ei_open(struct net_device *dev);
45extern int ei_close(struct net_device *dev);
46extern void ei_interrupt(int irq, void *dev_id, struct pt_regs *regs);
47
48
49struct ei_device {
50 const char *name;
51 void (*reset_8390)(struct net_device *);
52 void (*get_8390_hdr)(struct net_device *, struct e8390_pkt_hdr *, int);
53 void (*block_output)(struct net_device *, int, const unsigned char *, int);
54 void (*block_input)(struct net_device *, int, struct sk_buff *, int);
55 unsigned long rmem_start;
56 unsigned long rmem_end;
57 unsigned char mcfilter[8];
58 unsigned open:1;
59 unsigned word16:1;
60 unsigned bigendian:1;
61
62 unsigned txing:1;
63 unsigned irqlock:1;
64 unsigned dmaing:1;
65 unsigned char tx_start_page, rx_start_page, stop_page;
66 unsigned char current_page;
67 unsigned char interface_num;
68 unsigned char txqueue;
69 short tx1, tx2;
70 short lasttx;
71 unsigned char reg0;
72 unsigned char reg5;
73 unsigned char saved_irq;
74 struct net_device_stats stat;
75 u32 *reg_offset;
76 spinlock_t page_lock;
77 unsigned long priv;
78};
79
80
81#define MAX_SERVICE 12
82
83
84#define TX_TIMEOUT (20*HZ/100)
85
86#define ei_status (*(struct ei_device *)(dev->priv))
87
88
89#define E8390_TX_IRQ_MASK 0xa
90#define E8390_RX_IRQ_MASK 0x5
91#define E8390_RXCONFIG 0x4
92#define E8390_RXOFF 0x20
93#define E8390_TXCONFIG 0x00
94#define E8390_TXOFF 0x02
95
96
97#define E8390_STOP 0x01
98#define E8390_START 0x02
99#define E8390_TRANS 0x04
100#define E8390_RREAD 0x08
101#define E8390_RWRITE 0x10
102#define E8390_NODMA 0x20
103#define E8390_PAGE0 0x00
104#define E8390_PAGE1 0x40
105#define E8390_PAGE2 0x80
106
107
108
109
110
111
112#if defined(CONFIG_MAC) || \
113 defined(CONFIG_ARIADNE2) || defined(CONFIG_ARIADNE2_MODULE) || \
114 defined(CONFIG_HYDRA) || defined(CONFIG_HYDRA_MODULE)
115#define EI_SHIFT(x) (ei_local->reg_offset[x])
116#undef inb
117#undef inb_p
118#undef outb
119#undef outb_p
120
121#define inb(port) in_8(port)
122#define outb(val,port) out_8(port,val)
123#define inb_p(port) in_8(port)
124#define outb_p(val,port) out_8(port,val)
125
126#elif defined(CONFIG_ARM_ETHERH) || defined(CONFIG_ARM_ETHERH_MODULE)
127#define EI_SHIFT(x) (ei_local->reg_offset[x])
128#else
129#define EI_SHIFT(x) (x)
130#endif
131
132#define E8390_CMD EI_SHIFT(0x00)
133
134#define EN0_CLDALO EI_SHIFT(0x01)
135#define EN0_STARTPG EI_SHIFT(0x01)
136#define EN0_CLDAHI EI_SHIFT(0x02)
137#define EN0_STOPPG EI_SHIFT(0x02)
138#define EN0_BOUNDARY EI_SHIFT(0x03)
139#define EN0_TSR EI_SHIFT(0x04)
140#define EN0_TPSR EI_SHIFT(0x04)
141#define EN0_NCR EI_SHIFT(0x05)
142#define EN0_TCNTLO EI_SHIFT(0x05)
143#define EN0_FIFO EI_SHIFT(0x06)
144#define EN0_TCNTHI EI_SHIFT(0x06)
145#define EN0_ISR EI_SHIFT(0x07)
146#define EN0_CRDALO EI_SHIFT(0x08)
147#define EN0_RSARLO EI_SHIFT(0x08)
148#define EN0_CRDAHI EI_SHIFT(0x09)
149#define EN0_RSARHI EI_SHIFT(0x09)
150#define EN0_RCNTLO EI_SHIFT(0x0a)
151#define EN0_RCNTHI EI_SHIFT(0x0b)
152#define EN0_RSR EI_SHIFT(0x0c)
153#define EN0_RXCR EI_SHIFT(0x0c)
154#define EN0_TXCR EI_SHIFT(0x0d)
155#define EN0_COUNTER0 EI_SHIFT(0x0d)
156#define EN0_DCFG EI_SHIFT(0x0e)
157#define EN0_COUNTER1 EI_SHIFT(0x0e)
158#define EN0_IMR EI_SHIFT(0x0f)
159#define EN0_COUNTER2 EI_SHIFT(0x0f)
160
161
162#define ENISR_RX 0x01
163#define ENISR_TX 0x02
164#define ENISR_RX_ERR 0x04
165#define ENISR_TX_ERR 0x08
166#define ENISR_OVER 0x10
167#define ENISR_COUNTERS 0x20
168#define ENISR_RDC 0x40
169#define ENISR_RESET 0x80
170#define ENISR_ALL 0x3f
171
172
173#define ENDCFG_WTS 0x01
174#define ENDCFG_BOS 0x02
175
176
177#define EN1_PHYS EI_SHIFT(0x01)
178#define EN1_PHYS_SHIFT(i) EI_SHIFT(i+1)
179#define EN1_CURPAG EI_SHIFT(0x07)
180#define EN1_MULT EI_SHIFT(0x08)
181#define EN1_MULT_SHIFT(i) EI_SHIFT(8+i)
182
183
184#define ENRSR_RXOK 0x01
185#define ENRSR_CRC 0x02
186#define ENRSR_FAE 0x04
187#define ENRSR_FO 0x08
188#define ENRSR_MPA 0x10
189#define ENRSR_PHY 0x20
190#define ENRSR_DIS 0x40
191#define ENRSR_DEF 0x80
192
193
194#define ENTSR_PTX 0x01
195#define ENTSR_ND 0x02
196#define ENTSR_COL 0x04
197#define ENTSR_ABT 0x08
198#define ENTSR_CRS 0x10
199#define ENTSR_FU 0x20
200#define ENTSR_CDH 0x40
201#define ENTSR_OWC 0x80
202
203#endif
204