1 /*
2 	drivers/net/ethernet/dec/tulip/tulip.h
3 
4 	Copyright 2000,2001  The Linux Kernel Team
5 	Written/copyright 1994-2001 by Donald Becker.
6 
7 	This software may be used and distributed according to the terms
8 	of the GNU General Public License, incorporated herein by reference.
9 
10 	Please submit bugs to http://bugzilla.kernel.org/ .
11 */
12 
13 #ifndef __NET_TULIP_H__
14 #define __NET_TULIP_H__
15 
16 #include <linux/kernel.h>
17 #include <linux/types.h>
18 #include <linux/spinlock.h>
19 #include <linux/netdevice.h>
20 #include <linux/ethtool.h>
21 #include <linux/timer.h>
22 #include <linux/delay.h>
23 #include <linux/pci.h>
24 #include <asm/io.h>
25 #include <asm/irq.h>
26 #include <asm/unaligned.h>
27 
28 
29 
30 /* undefine, or define to various debugging levels (>4 == obscene levels) */
31 #define TULIP_DEBUG 1
32 
33 #ifdef CONFIG_TULIP_MMIO
34 #define TULIP_BAR	1	/* CBMA */
35 #else
36 #define TULIP_BAR	0	/* CBIO */
37 #endif
38 
39 
40 
41 struct tulip_chip_table {
42 	char *chip_name;
43 	int io_size;
44 	int valid_intrs;	/* CSR7 interrupt enable settings */
45 	int flags;
46 	void (*media_timer) (unsigned long);
47 	work_func_t media_task;
48 };
49 
50 
51 enum tbl_flag {
52 	HAS_MII			= 0x00001,
53 	HAS_MEDIA_TABLE		= 0x00002,
54 	CSR12_IN_SROM		= 0x00004,
55 	ALWAYS_CHECK_MII	= 0x00008,
56 	HAS_ACPI		= 0x00010,
57 	MC_HASH_ONLY		= 0x00020, /* Hash-only multicast filter. */
58 	HAS_PNICNWAY		= 0x00080,
59 	HAS_NWAY		= 0x00040, /* Uses internal NWay xcvr. */
60 	HAS_INTR_MITIGATION	= 0x00100,
61 	IS_ASIX			= 0x00200,
62 	HAS_8023X		= 0x00400,
63 	COMET_MAC_ADDR		= 0x00800,
64 	HAS_PCI_MWI		= 0x01000,
65 	HAS_PHY_IRQ		= 0x02000,
66 	HAS_SWAPPED_SEEPROM	= 0x04000,
67 	NEEDS_FAKE_MEDIA_TABLE	= 0x08000,
68 	COMET_PM		= 0x10000,
69 };
70 
71 
72 /* chip types.  careful!  order is VERY IMPORTANT here, as these
73  * are used throughout the driver as indices into arrays */
74 /* Note 21142 == 21143. */
75 enum chips {
76 	DC21040 = 0,
77 	DC21041 = 1,
78 	DC21140 = 2,
79 	DC21142 = 3, DC21143 = 3,
80 	LC82C168,
81 	MX98713,
82 	MX98715,
83 	MX98725,
84 	AX88140,
85 	PNIC2,
86 	COMET,
87 	COMPEX9881,
88 	I21145,
89 	DM910X,
90 	CONEXANT,
91 };
92 
93 
94 enum MediaIs {
95 	MediaIsFD = 1,
96 	MediaAlwaysFD = 2,
97 	MediaIsMII = 4,
98 	MediaIsFx = 8,
99 	MediaIs100 = 16
100 };
101 
102 
103 /* Offsets to the Command and Status Registers, "CSRs".  All accesses
104    must be longword instructions and quadword aligned. */
105 enum tulip_offsets {
106 	CSR0 = 0,
107 	CSR1 = 0x08,
108 	CSR2 = 0x10,
109 	CSR3 = 0x18,
110 	CSR4 = 0x20,
111 	CSR5 = 0x28,
112 	CSR6 = 0x30,
113 	CSR7 = 0x38,
114 	CSR8 = 0x40,
115 	CSR9 = 0x48,
116 	CSR10 = 0x50,
117 	CSR11 = 0x58,
118 	CSR12 = 0x60,
119 	CSR13 = 0x68,
120 	CSR14 = 0x70,
121 	CSR15 = 0x78,
122 	CSR18 = 0x88,
123 	CSR19 = 0x8c,
124 	CSR20 = 0x90,
125 	CSR27 = 0xAC,
126 	CSR28 = 0xB0,
127 };
128 
129 /* register offset and bits for CFDD PCI config reg */
130 enum pci_cfg_driver_reg {
131 	CFDD = 0x40,
132 	CFDD_Sleep = (1 << 31),
133 	CFDD_Snooze = (1 << 30),
134 };
135 
136 #define RxPollInt (RxIntr|RxNoBuf|RxDied|RxJabber)
137 
138 /* The bits in the CSR5 status registers, mostly interrupt sources. */
139 enum status_bits {
140 	TimerInt = 0x800,
141 	SystemError = 0x2000,
142 	TPLnkFail = 0x1000,
143 	TPLnkPass = 0x10,
144 	NormalIntr = 0x10000,
145 	AbnormalIntr = 0x8000,
146 	RxJabber = 0x200,
147 	RxDied = 0x100,
148 	RxNoBuf = 0x80,
149 	RxIntr = 0x40,
150 	TxFIFOUnderflow = 0x20,
151 	RxErrIntr = 0x10,
152 	TxJabber = 0x08,
153 	TxNoBuf = 0x04,
154 	TxDied = 0x02,
155 	TxIntr = 0x01,
156 };
157 
158 /* bit mask for CSR5 TX/RX process state */
159 #define CSR5_TS	0x00700000
160 #define CSR5_RS	0x000e0000
161 
162 enum tulip_mode_bits {
163 	TxThreshold		= (1 << 22),
164 	FullDuplex		= (1 << 9),
165 	TxOn			= 0x2000,
166 	AcceptBroadcast		= 0x0100,
167 	AcceptAllMulticast	= 0x0080,
168 	AcceptAllPhys		= 0x0040,
169 	AcceptRunt		= 0x0008,
170 	RxOn			= 0x0002,
171 	RxTx			= (TxOn | RxOn),
172 };
173 
174 
175 enum tulip_busconfig_bits {
176 	MWI			= (1 << 24),
177 	MRL			= (1 << 23),
178 	MRM			= (1 << 21),
179 	CALShift		= 14,
180 	BurstLenShift		= 8,
181 };
182 
183 
184 /* The Tulip Rx and Tx buffer descriptors. */
185 struct tulip_rx_desc {
186 	__le32 status;
187 	__le32 length;
188 	__le32 buffer1;
189 	__le32 buffer2;
190 };
191 
192 
193 struct tulip_tx_desc {
194 	__le32 status;
195 	__le32 length;
196 	__le32 buffer1;
197 	__le32 buffer2;		/* We use only buffer 1.  */
198 };
199 
200 
201 enum desc_status_bits {
202 	DescOwned    = 0x80000000,
203 	DescWholePkt = 0x60000000,
204 	DescEndPkt   = 0x40000000,
205 	DescStartPkt = 0x20000000,
206 	DescEndRing  = 0x02000000,
207 	DescUseLink  = 0x01000000,
208 
209 	/*
210 	 * Error summary flag is logical or of 'CRC Error', 'Collision Seen',
211 	 * 'Frame Too Long', 'Runt' and 'Descriptor Error' flags generated
212 	 * within tulip chip.
213 	 */
214 	RxDescErrorSummary = 0x8000,
215 	RxDescCRCError = 0x0002,
216 	RxDescCollisionSeen = 0x0040,
217 
218 	/*
219 	 * 'Frame Too Long' flag is set if packet length including CRC exceeds
220 	 * 1518.  However, a full sized VLAN tagged frame is 1522 bytes
221 	 * including CRC.
222 	 *
223 	 * The tulip chip does not block oversized frames, and if this flag is
224 	 * set on a receive descriptor it does not indicate the frame has been
225 	 * truncated.  The receive descriptor also includes the actual length.
226 	 * Therefore we can safety ignore this flag and check the length
227 	 * ourselves.
228 	 */
229 	RxDescFrameTooLong = 0x0080,
230 	RxDescRunt = 0x0800,
231 	RxDescDescErr = 0x4000,
232 	RxWholePkt   = 0x00000300,
233 	/*
234 	 * Top three bits of 14 bit frame length (status bits 27-29) should
235 	 * never be set as that would make frame over 2047 bytes. The Receive
236 	 * Watchdog flag (bit 4) may indicate the length is over 2048 and the
237 	 * length field is invalid.
238 	 */
239 	RxLengthOver2047 = 0x38000010
240 };
241 
242 
243 enum t21143_csr6_bits {
244 	csr6_sc = (1<<31),
245 	csr6_ra = (1<<30),
246 	csr6_ign_dest_msb = (1<<26),
247 	csr6_mbo = (1<<25),
248 	csr6_scr = (1<<24),  /* scramble mode flag: can't be set */
249 	csr6_pcs = (1<<23),  /* Enables PCS functions (symbol mode requires csr6_ps be set) default is set */
250 	csr6_ttm = (1<<22),  /* Transmit Threshold Mode, set for 10baseT, 0 for 100BaseTX */
251 	csr6_sf = (1<<21),   /* Store and forward. If set ignores TR bits */
252 	csr6_hbd = (1<<19),  /* Heart beat disable. Disables SQE function in 10baseT */
253 	csr6_ps = (1<<18),   /* Port Select. 0 (defualt) = 10baseT, 1 = 100baseTX: can't be set */
254 	csr6_ca = (1<<17),   /* Collision Offset Enable. If set uses special algorithm in low collision situations */
255 	csr6_trh = (1<<15),  /* Transmit Threshold high bit */
256 	csr6_trl = (1<<14),  /* Transmit Threshold low bit */
257 
258 	/***************************************************************
259 	 * This table shows transmit threshold values based on media   *
260 	 * and these two registers (from PNIC1 & 2 docs) Note: this is *
261 	 * all meaningless if sf is set.                               *
262 	 ***************************************************************/
263 
264 	/***********************************
265 	 * (trh,trl) * 100BaseTX * 10BaseT *
266 	 ***********************************
267 	 *   (0,0)   *     128   *    72   *
268 	 *   (0,1)   *     256   *    96   *
269 	 *   (1,0)   *     512   *   128   *
270 	 *   (1,1)   *    1024   *   160   *
271 	 ***********************************/
272 
273 	csr6_fc = (1<<12),   /* Forces a collision in next transmission (for testing in loopback mode) */
274 	csr6_om_int_loop = (1<<10), /* internal (FIFO) loopback flag */
275 	csr6_om_ext_loop = (1<<11), /* external (PMD) loopback flag */
276 	/* set both and you get (PHY) loopback */
277 	csr6_fd = (1<<9),    /* Full duplex mode, disables hearbeat, no loopback */
278 	csr6_pm = (1<<7),    /* Pass All Multicast */
279 	csr6_pr = (1<<6),    /* Promiscuous mode */
280 	csr6_sb = (1<<5),    /* Start(1)/Stop(0) backoff counter */
281 	csr6_if = (1<<4),    /* Inverse Filtering, rejects only addresses in address table: can't be set */
282 	csr6_pb = (1<<3),    /* Pass Bad Frames, (1) causes even bad frames to be passed on */
283 	csr6_ho = (1<<2),    /* Hash-only filtering mode: can't be set */
284 	csr6_hp = (1<<0),    /* Hash/Perfect Receive Filtering Mode: can't be set */
285 
286 	csr6_mask_capture = (csr6_sc | csr6_ca),
287 	csr6_mask_defstate = (csr6_mask_capture | csr6_mbo),
288 	csr6_mask_hdcap = (csr6_mask_defstate | csr6_hbd | csr6_ps),
289 	csr6_mask_hdcaptt = (csr6_mask_hdcap  | csr6_trh | csr6_trl),
290 	csr6_mask_fullcap = (csr6_mask_hdcaptt | csr6_fd),
291 	csr6_mask_fullpromisc = (csr6_pr | csr6_pm),
292 	csr6_mask_filters = (csr6_hp | csr6_ho | csr6_if),
293 	csr6_mask_100bt = (csr6_scr | csr6_pcs | csr6_hbd),
294 };
295 
296 enum tulip_comet_csr13_bits {
297 /* The LINKOFFE and LINKONE work in conjunction with LSCE, i.e. they
298  * determine which link status transition wakes up if LSCE is
299  * enabled */
300         comet_csr13_linkoffe = (1 << 17),
301         comet_csr13_linkone = (1 << 16),
302         comet_csr13_wfre = (1 << 10),
303         comet_csr13_mpre = (1 << 9),
304         comet_csr13_lsce = (1 << 8),
305         comet_csr13_wfr = (1 << 2),
306         comet_csr13_mpr = (1 << 1),
307         comet_csr13_lsc = (1 << 0),
308 };
309 
310 enum tulip_comet_csr18_bits {
311         comet_csr18_pmes_sticky = (1 << 24),
312         comet_csr18_pm_mode = (1 << 19),
313         comet_csr18_apm_mode = (1 << 18),
314         comet_csr18_d3a = (1 << 7)
315 };
316 
317 enum tulip_comet_csr20_bits {
318         comet_csr20_pmes = (1 << 15),
319 };
320 
321 /* Keep the ring sizes a power of two for efficiency.
322    Making the Tx ring too large decreases the effectiveness of channel
323    bonding and packet priority.
324    There are no ill effects from too-large receive rings. */
325 
326 #define TX_RING_SIZE	32
327 #define RX_RING_SIZE	128
328 #define MEDIA_MASK     31
329 
330 /* The receiver on the DC21143 rev 65 can fail to close the last
331  * receive descriptor in certain circumstances (see errata) when
332  * using MWI. This can only occur if the receive buffer ends on
333  * a cache line boundary, so the "+ 4" below ensures it doesn't.
334  */
335 #define PKT_BUF_SZ	(1536 + 4)	/* Size of each temporary Rx buffer. */
336 
337 #define TULIP_MIN_CACHE_LINE	8	/* in units of 32-bit words */
338 
339 #if defined(__sparc__) || defined(__hppa__)
340 /* The UltraSparc PCI controllers will disconnect at every 64-byte
341  * crossing anyways so it makes no sense to tell Tulip to burst
342  * any more than that.
343  */
344 #define TULIP_MAX_CACHE_LINE	16	/* in units of 32-bit words */
345 #else
346 #define TULIP_MAX_CACHE_LINE	32	/* in units of 32-bit words */
347 #endif
348 
349 
350 /* Ring-wrap flag in length field, use for last ring entry.
351 	0x01000000 means chain on buffer2 address,
352 	0x02000000 means use the ring start address in CSR2/3.
353    Note: Some work-alike chips do not function correctly in chained mode.
354    The ASIX chip works only in chained mode.
355    Thus we indicates ring mode, but always write the 'next' field for
356    chained mode as well.
357 */
358 #define DESC_RING_WRAP 0x02000000
359 
360 
361 #define EEPROM_SIZE 512 	/* 2 << EEPROM_ADDRLEN */
362 
363 
364 #define RUN_AT(x) (jiffies + (x))
365 
366 #define get_u16(ptr) get_unaligned_le16((ptr))
367 
368 struct medialeaf {
369 	u8 type;
370 	u8 media;
371 	unsigned char *leafdata;
372 };
373 
374 
375 struct mediatable {
376 	u16 defaultmedia;
377 	u8 leafcount;
378 	u8 csr12dir;		/* General purpose pin directions. */
379 	unsigned has_mii:1;
380 	unsigned has_nonmii:1;
381 	unsigned has_reset:6;
382 	u32 csr15dir;
383 	u32 csr15val;		/* 21143 NWay setting. */
384 	struct medialeaf mleaf[0];
385 };
386 
387 
388 struct mediainfo {
389 	struct mediainfo *next;
390 	int info_type;
391 	int index;
392 	unsigned char *info;
393 };
394 
395 struct ring_info {
396 	struct sk_buff	*skb;
397 	dma_addr_t	mapping;
398 };
399 
400 
401 struct tulip_private {
402 	const char *product_name;
403 	struct net_device *next_module;
404 	struct tulip_rx_desc *rx_ring;
405 	struct tulip_tx_desc *tx_ring;
406 	dma_addr_t rx_ring_dma;
407 	dma_addr_t tx_ring_dma;
408 	/* The saved address of a sent-in-place packet/buffer, for skfree(). */
409 	struct ring_info tx_buffers[TX_RING_SIZE];
410 	/* The addresses of receive-in-place skbuffs. */
411 	struct ring_info rx_buffers[RX_RING_SIZE];
412 	u16 setup_frame[96];	/* Pseudo-Tx frame to init address table. */
413 	int chip_id;
414 	int revision;
415 	int flags;
416 	struct napi_struct napi;
417 	struct timer_list timer;	/* Media selection timer. */
418 	struct timer_list oom_timer;    /* Out of memory timer. */
419 	u32 mc_filter[2];
420 	spinlock_t lock;
421 	spinlock_t mii_lock;
422 	unsigned int cur_rx, cur_tx;	/* The next free ring entry */
423 	unsigned int dirty_rx, dirty_tx;	/* The ring entries to be free()ed. */
424 
425 #ifdef 	CONFIG_TULIP_NAPI_HW_MITIGATION
426         int mit_on;
427 #endif
428 	unsigned int full_duplex:1;	/* Full-duplex operation requested. */
429 	unsigned int full_duplex_lock:1;
430 	unsigned int fake_addr:1;	/* Multiport board faked address. */
431 	unsigned int default_port:4;	/* Last dev->if_port value. */
432 	unsigned int media2:4;	/* Secondary monitored media port. */
433 	unsigned int medialock:1;	/* Don't sense media type. */
434 	unsigned int mediasense:1;	/* Media sensing in progress. */
435 	unsigned int nway:1, nwayset:1;		/* 21143 internal NWay. */
436 	unsigned int timeout_recovery:1;
437 	unsigned int csr0;	/* CSR0 setting. */
438 	unsigned int csr6;	/* Current CSR6 control settings. */
439 	unsigned char eeprom[EEPROM_SIZE];	/* Serial EEPROM contents. */
440 	void (*link_change) (struct net_device * dev, int csr5);
441         struct ethtool_wolinfo wolinfo;        /* WOL settings */
442 	u16 sym_advertise, mii_advertise; /* NWay capabilities advertised.  */
443 	u16 lpar;		/* 21143 Link partner ability. */
444 	u16 advertising[4];
445 	signed char phys[4], mii_cnt;	/* MII device addresses. */
446 	struct mediatable *mtable;
447 	int cur_index;		/* Current media index. */
448 	int saved_if_port;
449 	struct pci_dev *pdev;
450 	int ttimer;
451 	int susp_rx;
452 	unsigned long nir;
453 	void __iomem *base_addr;
454 	int csr12_shadow;
455 	int pad0;		/* Used for 8-byte alignment */
456 	struct work_struct media_work;
457 	struct net_device *dev;
458 };
459 
460 
461 struct eeprom_fixup {
462 	char *name;
463 	unsigned char addr0;
464 	unsigned char addr1;
465 	unsigned char addr2;
466 	u16 newtable[32];	/* Max length below. */
467 };
468 
469 
470 /* 21142.c */
471 extern u16 t21142_csr14[];
472 void t21142_media_task(struct work_struct *work);
473 void t21142_start_nway(struct net_device *dev);
474 void t21142_lnk_change(struct net_device *dev, int csr5);
475 
476 
477 /* PNIC2.c */
478 void pnic2_lnk_change(struct net_device *dev, int csr5);
479 void pnic2_timer(unsigned long data);
480 void pnic2_start_nway(struct net_device *dev);
481 void pnic2_lnk_change(struct net_device *dev, int csr5);
482 
483 /* eeprom.c */
484 void tulip_parse_eeprom(struct net_device *dev);
485 int tulip_read_eeprom(struct net_device *dev, int location, int addr_len);
486 
487 /* interrupt.c */
488 extern unsigned int tulip_max_interrupt_work;
489 extern int tulip_rx_copybreak;
490 irqreturn_t tulip_interrupt(int irq, void *dev_instance);
491 int tulip_refill_rx(struct net_device *dev);
492 #ifdef CONFIG_TULIP_NAPI
493 int tulip_poll(struct napi_struct *napi, int budget);
494 #endif
495 
496 
497 /* media.c */
498 int tulip_mdio_read(struct net_device *dev, int phy_id, int location);
499 void tulip_mdio_write(struct net_device *dev, int phy_id, int location, int value);
500 void tulip_select_media(struct net_device *dev, int startup);
501 int tulip_check_duplex(struct net_device *dev);
502 void tulip_find_mii (struct net_device *dev, int board_idx);
503 
504 /* pnic.c */
505 void pnic_do_nway(struct net_device *dev);
506 void pnic_lnk_change(struct net_device *dev, int csr5);
507 void pnic_timer(unsigned long data);
508 
509 /* timer.c */
510 void tulip_media_task(struct work_struct *work);
511 void mxic_timer(unsigned long data);
512 void comet_timer(unsigned long data);
513 
514 /* tulip_core.c */
515 extern int tulip_debug;
516 extern const char * const medianame[];
517 extern const char tulip_media_cap[];
518 extern struct tulip_chip_table tulip_tbl[];
519 void oom_timer(unsigned long data);
520 extern u8 t21040_csr13[];
521 
tulip_start_rxtx(struct tulip_private * tp)522 static inline void tulip_start_rxtx(struct tulip_private *tp)
523 {
524 	void __iomem *ioaddr = tp->base_addr;
525 	iowrite32(tp->csr6 | RxTx, ioaddr + CSR6);
526 	barrier();
527 	(void) ioread32(ioaddr + CSR6); /* mmio sync */
528 }
529 
tulip_stop_rxtx(struct tulip_private * tp)530 static inline void tulip_stop_rxtx(struct tulip_private *tp)
531 {
532 	void __iomem *ioaddr = tp->base_addr;
533 	u32 csr6 = ioread32(ioaddr + CSR6);
534 
535 	if (csr6 & RxTx) {
536 		unsigned i=1300/10;
537 		iowrite32(csr6 & ~RxTx, ioaddr + CSR6);
538 		barrier();
539 		/* wait until in-flight frame completes.
540 		 * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin)
541 		 * Typically expect this loop to end in < 50 us on 100BT.
542 		 */
543 		while (--i && (ioread32(ioaddr + CSR5) & (CSR5_TS|CSR5_RS)))
544 			udelay(10);
545 
546 		if (!i)
547 			netdev_dbg(tp->dev, "tulip_stop_rxtx() failed (CSR5 0x%x CSR6 0x%x)\n",
548 				   ioread32(ioaddr + CSR5),
549 				   ioread32(ioaddr + CSR6));
550 	}
551 }
552 
tulip_restart_rxtx(struct tulip_private * tp)553 static inline void tulip_restart_rxtx(struct tulip_private *tp)
554 {
555 	tulip_stop_rxtx(tp);
556 	udelay(5);
557 	tulip_start_rxtx(tp);
558 }
559 
tulip_tx_timeout_complete(struct tulip_private * tp,void __iomem * ioaddr)560 static inline void tulip_tx_timeout_complete(struct tulip_private *tp, void __iomem *ioaddr)
561 {
562 	/* Stop and restart the chip's Tx processes. */
563 	tulip_restart_rxtx(tp);
564 	/* Trigger an immediate transmit demand. */
565 	iowrite32(0, ioaddr + CSR1);
566 
567 	tp->dev->stats.tx_errors++;
568 }
569 
570 #endif /* __NET_TULIP_H__ */
571