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