1 /**************************************************************************
2  *
3  * Copyright  2000-2006 Alacritech, Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above
12  *    copyright notice, this list of conditions and the following
13  *    disclaimer in the documentation and/or other materials provided
14  *    with the distribution.
15  *
16  * Alternatively, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") version 2 as published by the Free
18  * Software Foundation.
19  *
20  * THIS SOFTWARE IS PROVIDED BY ALACRITECH, INC. ``AS IS'' AND ANY
21  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ALACRITECH, INC. OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * The views and conclusions contained in the software and documentation
34  * are those of the authors and should not be interpreted as representing
35  * official policies, either expressed or implied, of Alacritech, Inc.
36  *
37  **************************************************************************/
38 
39 /*
40  * FILENAME: slicoss.c
41  *
42  * The SLICOSS driver for Alacritech's IS-NIC products.
43  *
44  * This driver is supposed to support:
45  *
46  *      Mojave cards (single port PCI Gigabit) both copper and fiber
47  *      Oasis cards (single and dual port PCI-x Gigabit) copper and fiber
48  *      Kalahari cards (dual and quad port PCI-e Gigabit) copper and fiber
49  *
50  * The driver was acutally tested on Oasis and Kalahari cards.
51  *
52  *
53  * NOTE: This is the standard, non-accelerated version of Alacritech's
54  *       IS-NIC driver.
55  */
56 
57 
58 #define KLUDGE_FOR_4GB_BOUNDARY         1
59 #define DEBUG_MICROCODE                 1
60 #define DBG                             1
61 #define SLIC_INTERRUPT_PROCESS_LIMIT	1
62 #define SLIC_OFFLOAD_IP_CHECKSUM		1
63 #define STATS_TIMER_INTERVAL			2
64 #define PING_TIMER_INTERVAL			    1
65 
66 #include <linux/kernel.h>
67 #include <linux/string.h>
68 #include <linux/errno.h>
69 #include <linux/ioport.h>
70 #include <linux/slab.h>
71 #include <linux/interrupt.h>
72 #include <linux/timer.h>
73 #include <linux/pci.h>
74 #include <linux/spinlock.h>
75 #include <linux/init.h>
76 #include <linux/bitops.h>
77 #include <linux/io.h>
78 #include <linux/netdevice.h>
79 #include <linux/etherdevice.h>
80 #include <linux/skbuff.h>
81 #include <linux/delay.h>
82 #include <linux/debugfs.h>
83 #include <linux/seq_file.h>
84 #include <linux/kthread.h>
85 #include <linux/module.h>
86 #include <linux/moduleparam.h>
87 
88 #include <linux/firmware.h>
89 #include <linux/types.h>
90 #include <linux/dma-mapping.h>
91 #include <linux/mii.h>
92 #include <linux/if_vlan.h>
93 #include <asm/unaligned.h>
94 
95 #include <linux/ethtool.h>
96 #include <linux/uaccess.h>
97 #include "slichw.h"
98 #include "slic.h"
99 
100 static uint slic_first_init = 1;
101 static char *slic_banner = "Alacritech SLIC Technology(tm) Server "\
102 		"and Storage Accelerator (Non-Accelerated)";
103 
104 static char *slic_proc_version = "2.0.351  2006/07/14 12:26:00";
105 static char *slic_product_name = "SLIC Technology(tm) Server "\
106 		"and Storage Accelerator (Non-Accelerated)";
107 static char *slic_vendor = "Alacritech, Inc.";
108 
109 static int slic_debug = 1;
110 static int debug = -1;
111 static struct net_device *head_netdevice;
112 
113 static struct base_driver slic_global = { {}, 0, 0, 0, 1, NULL, NULL };
114 static int intagg_delay = 100;
115 static u32 dynamic_intagg;
116 static unsigned int rcv_count;
117 static struct dentry *slic_debugfs;
118 
119 #define DRV_NAME          "slicoss"
120 #define DRV_VERSION       "2.0.1"
121 #define DRV_AUTHOR        "Alacritech, Inc. Engineering"
122 #define DRV_DESCRIPTION   "Alacritech SLIC Techonology(tm) "\
123 		"Non-Accelerated Driver"
124 #define DRV_COPYRIGHT     "Copyright  2000-2006 Alacritech, Inc. "\
125 		"All rights reserved."
126 #define PFX		   DRV_NAME " "
127 
128 MODULE_AUTHOR(DRV_AUTHOR);
129 MODULE_DESCRIPTION(DRV_DESCRIPTION);
130 MODULE_LICENSE("Dual BSD/GPL");
131 
132 module_param(dynamic_intagg, int, 0);
133 MODULE_PARM_DESC(dynamic_intagg, "Dynamic Interrupt Aggregation Setting");
134 module_param(intagg_delay, int, 0);
135 MODULE_PARM_DESC(intagg_delay, "uSec Interrupt Aggregation Delay");
136 
137 static DEFINE_PCI_DEVICE_TABLE(slic_pci_tbl) = {
138 	{ PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_1GB_DEVICE_ID) },
139 	{ PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_2GB_DEVICE_ID) },
140 	{ 0 }
141 };
142 
143 MODULE_DEVICE_TABLE(pci, slic_pci_tbl);
144 
145 #ifdef ASSERT
146 #undef ASSERT
147 #endif
148 
slic_assert_fail(void)149 static void slic_assert_fail(void)
150 {
151 	u32 cpuid;
152 	u32 curr_pid;
153 	cpuid = smp_processor_id();
154 	curr_pid = current->pid;
155 
156 	printk(KERN_ERR "%s CPU # %d ---- PID # %d\n",
157 	       __func__, cpuid, curr_pid);
158 }
159 
160 #ifndef ASSERT
161 #define ASSERT(a) do {							\
162 	if (!(a)) {							\
163 		printk(KERN_ERR "slicoss ASSERT() Failure: function %s"	\
164 			"line %d\n", __func__, __LINE__);		\
165 		slic_assert_fail();					\
166 	}								\
167 } while (0)
168 #endif
169 
170 
171 #define SLIC_GET_SLIC_HANDLE(_adapter, _pslic_handle)                   \
172 {                                                                       \
173     spin_lock_irqsave(&_adapter->handle_lock.lock,                      \
174 			_adapter->handle_lock.flags);                   \
175     _pslic_handle  =  _adapter->pfree_slic_handles;                     \
176     if (_pslic_handle) {                                                \
177 	ASSERT(_pslic_handle->type == SLIC_HANDLE_FREE);                \
178 	_adapter->pfree_slic_handles = _pslic_handle->next;             \
179     }                                                                   \
180     spin_unlock_irqrestore(&_adapter->handle_lock.lock,                 \
181 			_adapter->handle_lock.flags);                   \
182 }
183 
184 #define SLIC_FREE_SLIC_HANDLE(_adapter, _pslic_handle)                  \
185 {                                                                       \
186     _pslic_handle->type = SLIC_HANDLE_FREE;                             \
187     spin_lock_irqsave(&_adapter->handle_lock.lock,                      \
188 			_adapter->handle_lock.flags);                   \
189     _pslic_handle->next = _adapter->pfree_slic_handles;                 \
190     _adapter->pfree_slic_handles = _pslic_handle;                       \
191     spin_unlock_irqrestore(&_adapter->handle_lock.lock,                 \
192 			_adapter->handle_lock.flags);                   \
193 }
194 
slic_reg32_write(void __iomem * reg,u32 value,bool flush)195 static inline void slic_reg32_write(void __iomem *reg, u32 value, bool flush)
196 {
197 	writel(value, reg);
198 	if (flush)
199 		mb();
200 }
201 
slic_reg64_write(struct adapter * adapter,void __iomem * reg,u32 value,void __iomem * regh,u32 paddrh,bool flush)202 static inline void slic_reg64_write(struct adapter *adapter, void __iomem *reg,
203 				    u32 value, void __iomem *regh, u32 paddrh,
204 				    bool flush)
205 {
206 	spin_lock_irqsave(&adapter->bit64reglock.lock,
207 				adapter->bit64reglock.flags);
208 	if (paddrh != adapter->curaddrupper) {
209 		adapter->curaddrupper = paddrh;
210 		writel(paddrh, regh);
211 	}
212 	writel(value, reg);
213 	if (flush)
214 		mb();
215 	spin_unlock_irqrestore(&adapter->bit64reglock.lock,
216 				adapter->bit64reglock.flags);
217 }
218 
219 /*
220  * Functions to obtain the CRC corresponding to the destination mac address.
221  * This is a standard ethernet CRC in that it is a 32-bit, reflected CRC using
222  * the polynomial:
223  *   x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 +
224  *   x^4 + x^2 + x^1.
225  *
226  * After the CRC for the 6 bytes is generated (but before the value is
227  * complemented),
228  * we must then transpose the value and return bits 30-23.
229  *
230  */
231 static u32 slic_crc_table[256];	/* Table of CRCs for all possible byte values */
232 static u32 slic_crc_init;	/* Is table initialized */
233 
234 /*
235  *  Contruct the CRC32 table
236  */
slic_mcast_init_crc32(void)237 static void slic_mcast_init_crc32(void)
238 {
239 	u32 c;		/*  CRC shit reg                 */
240 	u32 e = 0;		/*  Poly X-or pattern            */
241 	int i;			/*  counter                      */
242 	int k;			/*  byte being shifted into crc  */
243 
244 	static int p[] = { 0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26 };
245 
246 	for (i = 0; i < ARRAY_SIZE(p); i++)
247 		e |= 1L << (31 - p[i]);
248 
249 	for (i = 1; i < 256; i++) {
250 		c = i;
251 		for (k = 8; k; k--)
252 			c = c & 1 ? (c >> 1) ^ e : c >> 1;
253 		slic_crc_table[i] = c;
254 	}
255 }
256 
257 /*
258  *  Return the MAC hast as described above.
259  */
slic_mcast_get_mac_hash(char * macaddr)260 static unsigned char slic_mcast_get_mac_hash(char *macaddr)
261 {
262 	u32 crc;
263 	char *p;
264 	int i;
265 	unsigned char machash = 0;
266 
267 	if (!slic_crc_init) {
268 		slic_mcast_init_crc32();
269 		slic_crc_init = 1;
270 	}
271 
272 	crc = 0xFFFFFFFF;	/* Preload shift register, per crc-32 spec */
273 	for (i = 0, p = macaddr; i < 6; ++p, ++i)
274 		crc = (crc >> 8) ^ slic_crc_table[(crc ^ *p) & 0xFF];
275 
276 	/* Return bits 1-8, transposed */
277 	for (i = 1; i < 9; i++)
278 		machash |= (((crc >> i) & 1) << (8 - i));
279 
280 	return machash;
281 }
282 
slic_mcast_set_bit(struct adapter * adapter,char * address)283 static void slic_mcast_set_bit(struct adapter *adapter, char *address)
284 {
285 	unsigned char crcpoly;
286 
287 	/* Get the CRC polynomial for the mac address */
288 	crcpoly = slic_mcast_get_mac_hash(address);
289 
290 	/* We only have space on the SLIC for 64 entries.  Lop
291 	 * off the top two bits. (2^6 = 64)
292 	 */
293 	crcpoly &= 0x3F;
294 
295 	/* OR in the new bit into our 64 bit mask. */
296 	adapter->mcastmask |= (u64) 1 << crcpoly;
297 }
298 
slic_mcast_set_mask(struct adapter * adapter)299 static void slic_mcast_set_mask(struct adapter *adapter)
300 {
301 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
302 
303 	if (adapter->macopts & (MAC_ALLMCAST | MAC_PROMISC)) {
304 		/* Turn on all multicast addresses. We have to do this for
305 		 * promiscuous mode as well as ALLMCAST mode.  It saves the
306 		 * Microcode from having to keep state about the MAC
307 		 * configuration.
308 		 */
309 		slic_reg32_write(&slic_regs->slic_mcastlow, 0xFFFFFFFF, FLUSH);
310 		slic_reg32_write(&slic_regs->slic_mcasthigh, 0xFFFFFFFF,
311 				 FLUSH);
312 	} else {
313 		/* Commit our multicast mast to the SLIC by writing to the
314 		 * multicast address mask registers
315 		 */
316 		slic_reg32_write(&slic_regs->slic_mcastlow,
317 			(u32)(adapter->mcastmask & 0xFFFFFFFF), FLUSH);
318 		slic_reg32_write(&slic_regs->slic_mcasthigh,
319 			(u32)((adapter->mcastmask >> 32) & 0xFFFFFFFF), FLUSH);
320 	}
321 }
322 
slic_timer_ping(ulong dev)323 static void slic_timer_ping(ulong dev)
324 {
325 	struct adapter *adapter;
326 	struct sliccard *card;
327 
328 	ASSERT(dev);
329 	adapter = netdev_priv((struct net_device *)dev);
330 	ASSERT(adapter);
331 	card = adapter->card;
332 	ASSERT(card);
333 
334 	adapter->pingtimer.expires = jiffies + (PING_TIMER_INTERVAL * HZ);
335 	add_timer(&adapter->pingtimer);
336 }
337 
slic_unmap_mmio_space(struct adapter * adapter)338 static void slic_unmap_mmio_space(struct adapter *adapter)
339 {
340 	if (adapter->slic_regs)
341 		iounmap(adapter->slic_regs);
342 	adapter->slic_regs = NULL;
343 }
344 
345 /*
346  *  slic_link_config
347  *
348  *  Write phy control to configure link duplex/speed
349  *
350  */
slic_link_config(struct adapter * adapter,u32 linkspeed,u32 linkduplex)351 static void slic_link_config(struct adapter *adapter,
352 		      u32 linkspeed, u32 linkduplex)
353 {
354 	u32 __iomem *wphy;
355 	u32 speed;
356 	u32 duplex;
357 	u32 phy_config;
358 	u32 phy_advreg;
359 	u32 phy_gctlreg;
360 
361 	if (adapter->state != ADAPT_UP)
362 		return;
363 
364 	ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID)
365 	       || (adapter->devid == SLIC_2GB_DEVICE_ID));
366 
367 	if (linkspeed > LINK_1000MB)
368 		linkspeed = LINK_AUTOSPEED;
369 	if (linkduplex > LINK_AUTOD)
370 		linkduplex = LINK_AUTOD;
371 
372 	wphy = &adapter->slic_regs->slic_wphy;
373 
374 	if ((linkspeed == LINK_AUTOSPEED) || (linkspeed == LINK_1000MB)) {
375 		if (adapter->flags & ADAPT_FLAGS_FIBERMEDIA) {
376 			/*  We've got a fiber gigabit interface, and register
377 			 *  4 is different in fiber mode than in copper mode
378 			 */
379 
380 			/* advertise FD only @1000 Mb */
381 			phy_advreg = (MIICR_REG_4 | (PAR_ADV1000XFD));
382 			/* enable PAUSE frames        */
383 			phy_advreg |= PAR_ASYMPAUSE_FIBER;
384 			slic_reg32_write(wphy, phy_advreg, FLUSH);
385 
386 			if (linkspeed == LINK_AUTOSPEED) {
387 				/* reset phy, enable auto-neg  */
388 				phy_config =
389 				    (MIICR_REG_PCR |
390 				     (PCR_RESET | PCR_AUTONEG |
391 				      PCR_AUTONEG_RST));
392 				slic_reg32_write(wphy, phy_config, FLUSH);
393 			} else {	/* forced 1000 Mb FD*/
394 				/* power down phy to break link
395 				   this may not work) */
396 				phy_config = (MIICR_REG_PCR | PCR_POWERDOWN);
397 				slic_reg32_write(wphy, phy_config, FLUSH);
398 				/* wait, Marvell says 1 sec,
399 				   try to get away with 10 ms  */
400 				mdelay(10);
401 
402 				/* disable auto-neg, set speed/duplex,
403 				   soft reset phy, powerup */
404 				phy_config =
405 				    (MIICR_REG_PCR |
406 				     (PCR_RESET | PCR_SPEED_1000 |
407 				      PCR_DUPLEX_FULL));
408 				slic_reg32_write(wphy, phy_config, FLUSH);
409 			}
410 		} else {	/* copper gigabit */
411 
412 			/* Auto-Negotiate or 1000 Mb must be auto negotiated
413 			 * We've got a copper gigabit interface, and
414 			 * register 4 is different in copper mode than
415 			 * in fiber mode
416 			 */
417 			if (linkspeed == LINK_AUTOSPEED) {
418 				/* advertise 10/100 Mb modes   */
419 				phy_advreg =
420 				    (MIICR_REG_4 |
421 				     (PAR_ADV100FD | PAR_ADV100HD | PAR_ADV10FD
422 				      | PAR_ADV10HD));
423 			} else {
424 			/* linkspeed == LINK_1000MB -
425 			   don't advertise 10/100 Mb modes  */
426 				phy_advreg = MIICR_REG_4;
427 			}
428 			/* enable PAUSE frames  */
429 			phy_advreg |= PAR_ASYMPAUSE;
430 			/* required by the Cicada PHY  */
431 			phy_advreg |= PAR_802_3;
432 			slic_reg32_write(wphy, phy_advreg, FLUSH);
433 			/* advertise FD only @1000 Mb  */
434 			phy_gctlreg = (MIICR_REG_9 | (PGC_ADV1000FD));
435 			slic_reg32_write(wphy, phy_gctlreg, FLUSH);
436 
437 			if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
438 				/* if a Marvell PHY
439 				   enable auto crossover */
440 				phy_config =
441 				    (MIICR_REG_16 | (MRV_REG16_XOVERON));
442 				slic_reg32_write(wphy, phy_config, FLUSH);
443 
444 				/* reset phy, enable auto-neg  */
445 				phy_config =
446 				    (MIICR_REG_PCR |
447 				     (PCR_RESET | PCR_AUTONEG |
448 				      PCR_AUTONEG_RST));
449 				slic_reg32_write(wphy, phy_config, FLUSH);
450 			} else {	/* it's a Cicada PHY  */
451 				/* enable and restart auto-neg (don't reset)  */
452 				phy_config =
453 				    (MIICR_REG_PCR |
454 				     (PCR_AUTONEG | PCR_AUTONEG_RST));
455 				slic_reg32_write(wphy, phy_config, FLUSH);
456 			}
457 		}
458 	} else {
459 		/* Forced 10/100  */
460 		if (linkspeed == LINK_10MB)
461 			speed = 0;
462 		else
463 			speed = PCR_SPEED_100;
464 		if (linkduplex == LINK_HALFD)
465 			duplex = 0;
466 		else
467 			duplex = PCR_DUPLEX_FULL;
468 
469 		if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
470 			/* if a Marvell PHY
471 			   disable auto crossover  */
472 			phy_config = (MIICR_REG_16 | (MRV_REG16_XOVEROFF));
473 			slic_reg32_write(wphy, phy_config, FLUSH);
474 		}
475 
476 		/* power down phy to break link (this may not work)  */
477 		phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN | speed | duplex));
478 		slic_reg32_write(wphy, phy_config, FLUSH);
479 
480 		/* wait, Marvell says 1 sec, try to get away with 10 ms */
481 		mdelay(10);
482 
483 		if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
484 			/* if a Marvell PHY
485 			   disable auto-neg, set speed,
486 			   soft reset phy, powerup */
487 			phy_config =
488 			    (MIICR_REG_PCR | (PCR_RESET | speed | duplex));
489 			slic_reg32_write(wphy, phy_config, FLUSH);
490 		} else {	/* it's a Cicada PHY  */
491 			/* disable auto-neg, set speed, powerup  */
492 			phy_config = (MIICR_REG_PCR | (speed | duplex));
493 			slic_reg32_write(wphy, phy_config, FLUSH);
494 		}
495 	}
496 }
497 
slic_card_download_gbrcv(struct adapter * adapter)498 static int slic_card_download_gbrcv(struct adapter *adapter)
499 {
500 	const struct firmware *fw;
501 	const char *file = "";
502 	int ret;
503 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
504 	u32 codeaddr;
505 	u32 instruction;
506 	int index = 0;
507 	u32 rcvucodelen = 0;
508 
509 	switch (adapter->devid) {
510 	case SLIC_2GB_DEVICE_ID:
511 		file = "slicoss/oasisrcvucode.sys";
512 		break;
513 	case SLIC_1GB_DEVICE_ID:
514 		file = "slicoss/gbrcvucode.sys";
515 		break;
516 	default:
517 		ASSERT(0);
518 		break;
519 	}
520 
521 	ret = request_firmware(&fw, file, &adapter->pcidev->dev);
522 	if (ret) {
523 		dev_err(&adapter->pcidev->dev,
524 			"SLICOSS: Failed to load firmware %s\n", file);
525 		return ret;
526 	}
527 
528 	rcvucodelen = *(u32 *)(fw->data + index);
529 	index += 4;
530 	switch (adapter->devid) {
531 	case SLIC_2GB_DEVICE_ID:
532 		if (rcvucodelen != OasisRcvUCodeLen)
533 			return -EINVAL;
534 		break;
535 	case SLIC_1GB_DEVICE_ID:
536 		if (rcvucodelen != GBRcvUCodeLen)
537 			return -EINVAL;
538 		break;
539 	default:
540 		ASSERT(0);
541 		break;
542 	}
543 	/* start download */
544 	slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_BEGIN, FLUSH);
545 	/* download the rcv sequencer ucode */
546 	for (codeaddr = 0; codeaddr < rcvucodelen; codeaddr++) {
547 		/* write out instruction address */
548 		slic_reg32_write(&slic_regs->slic_rcv_wcs, codeaddr, FLUSH);
549 
550 		instruction = *(u32 *)(fw->data + index);
551 		index += 4;
552 		/* write out the instruction data low addr */
553 		slic_reg32_write(&slic_regs->slic_rcv_wcs, instruction, FLUSH);
554 
555 		instruction = *(u8 *)(fw->data + index);
556 		index++;
557 		/* write out the instruction data high addr */
558 		slic_reg32_write(&slic_regs->slic_rcv_wcs, (u8)instruction,
559 				 FLUSH);
560 	}
561 
562 	/* download finished */
563 	release_firmware(fw);
564 	slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_FINISH, FLUSH);
565 	return 0;
566 }
567 
568 MODULE_FIRMWARE("slicoss/oasisrcvucode.sys");
569 MODULE_FIRMWARE("slicoss/gbrcvucode.sys");
570 
slic_card_download(struct adapter * adapter)571 static int slic_card_download(struct adapter *adapter)
572 {
573 	const struct firmware *fw;
574 	const char *file = "";
575 	int ret;
576 	u32 section;
577 	int thissectionsize;
578 	int codeaddr;
579 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
580 	u32 instruction;
581 	u32 baseaddress;
582 	u32 i;
583 	u32 numsects = 0;
584 	u32 sectsize[3];
585 	u32 sectstart[3];
586 	int ucode_start, index = 0;
587 
588 	switch (adapter->devid) {
589 	case SLIC_2GB_DEVICE_ID:
590 		file = "slicoss/oasisdownload.sys";
591 		break;
592 	case SLIC_1GB_DEVICE_ID:
593 		file = "slicoss/gbdownload.sys";
594 		break;
595 	default:
596 		ASSERT(0);
597 		break;
598 	}
599 	ret = request_firmware(&fw, file, &adapter->pcidev->dev);
600 	if (ret) {
601 		dev_err(&adapter->pcidev->dev,
602 			"SLICOSS: Failed to load firmware %s\n", file);
603 		return ret;
604 	}
605 	numsects = *(u32 *)(fw->data + index);
606 	index += 4;
607 	ASSERT(numsects <= 3);
608 	for (i = 0; i < numsects; i++) {
609 		sectsize[i] = *(u32 *)(fw->data + index);
610 		index += 4;
611 	}
612 	for (i = 0; i < numsects; i++) {
613 		sectstart[i] = *(u32 *)(fw->data + index);
614 		index += 4;
615 	}
616 	ucode_start = index;
617 	instruction = *(u32 *)(fw->data + index);
618 	index += 4;
619 	for (section = 0; section < numsects; section++) {
620 		baseaddress = sectstart[section];
621 		thissectionsize = sectsize[section] >> 3;
622 
623 		for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) {
624 			/* Write out instruction address */
625 			slic_reg32_write(&slic_regs->slic_wcs,
626 					 baseaddress + codeaddr, FLUSH);
627 			/* Write out instruction to low addr */
628 			slic_reg32_write(&slic_regs->slic_wcs, instruction, FLUSH);
629 			instruction = *(u32 *)(fw->data + index);
630 			index += 4;
631 
632 			/* Write out instruction to high addr */
633 			slic_reg32_write(&slic_regs->slic_wcs, instruction, FLUSH);
634 			instruction = *(u32 *)(fw->data + index);
635 			index += 4;
636 		}
637 	}
638 	index = ucode_start;
639 	for (section = 0; section < numsects; section++) {
640 		instruction = *(u32 *)(fw->data + index);
641 		baseaddress = sectstart[section];
642 		if (baseaddress < 0x8000)
643 			continue;
644 		thissectionsize = sectsize[section] >> 3;
645 
646 		for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) {
647 			/* Write out instruction address */
648 			slic_reg32_write(&slic_regs->slic_wcs,
649 				SLIC_WCS_COMPARE | (baseaddress + codeaddr),
650 				FLUSH);
651 			/* Write out instruction to low addr */
652 			slic_reg32_write(&slic_regs->slic_wcs, instruction,
653 					 FLUSH);
654 			instruction = *(u32 *)(fw->data + index);
655 			index += 4;
656 			/* Write out instruction to high addr */
657 			slic_reg32_write(&slic_regs->slic_wcs, instruction,
658 					 FLUSH);
659 			instruction = *(u32 *)(fw->data + index);
660 			index += 4;
661 
662 			/* Check SRAM location zero. If it is non-zero. Abort.*/
663 /*			failure = readl((u32 __iomem *)&slic_regs->slic_reset);
664 			if (failure) {
665 				release_firmware(fw);
666 				return -EIO;
667 			}*/
668 		}
669 	}
670 	release_firmware(fw);
671 	/* Everything OK, kick off the card */
672 	mdelay(10);
673 	slic_reg32_write(&slic_regs->slic_wcs, SLIC_WCS_START, FLUSH);
674 
675 	/* stall for 20 ms, long enough for ucode to init card
676 	   and reach mainloop */
677 	mdelay(20);
678 
679 	return 0;
680 }
681 
682 MODULE_FIRMWARE("slicoss/oasisdownload.sys");
683 MODULE_FIRMWARE("slicoss/gbdownload.sys");
684 
slic_adapter_set_hwaddr(struct adapter * adapter)685 static void slic_adapter_set_hwaddr(struct adapter *adapter)
686 {
687 	struct sliccard *card = adapter->card;
688 
689 	if ((adapter->card) && (card->config_set)) {
690 		memcpy(adapter->macaddr,
691 		       card->config.MacInfo[adapter->functionnumber].macaddrA,
692 		       sizeof(struct slic_config_mac));
693 		if (!(adapter->currmacaddr[0] || adapter->currmacaddr[1] ||
694 		      adapter->currmacaddr[2] || adapter->currmacaddr[3] ||
695 		      adapter->currmacaddr[4] || adapter->currmacaddr[5])) {
696 			memcpy(adapter->currmacaddr, adapter->macaddr, 6);
697 		}
698 		if (adapter->netdev) {
699 			memcpy(adapter->netdev->dev_addr, adapter->currmacaddr,
700 			       6);
701 		}
702 	}
703 }
704 
slic_intagg_set(struct adapter * adapter,u32 value)705 static void slic_intagg_set(struct adapter *adapter, u32 value)
706 {
707 	slic_reg32_write(&adapter->slic_regs->slic_intagg, value, FLUSH);
708 	adapter->card->loadlevel_current = value;
709 }
710 
slic_soft_reset(struct adapter * adapter)711 static void slic_soft_reset(struct adapter *adapter)
712 {
713 	if (adapter->card->state == CARD_UP) {
714 		slic_reg32_write(&adapter->slic_regs->slic_quiesce, 0, FLUSH);
715 		mdelay(1);
716 	}
717 
718 	slic_reg32_write(&adapter->slic_regs->slic_reset, SLIC_RESET_MAGIC,
719 			 FLUSH);
720 	mdelay(1);
721 }
722 
slic_mac_address_config(struct adapter * adapter)723 static void slic_mac_address_config(struct adapter *adapter)
724 {
725 	u32 value;
726 	u32 value2;
727 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
728 
729 	value = *(u32 *) &adapter->currmacaddr[2];
730 	value = ntohl(value);
731 	slic_reg32_write(&slic_regs->slic_wraddral, value, FLUSH);
732 	slic_reg32_write(&slic_regs->slic_wraddrbl, value, FLUSH);
733 
734 	value2 = (u32) ((adapter->currmacaddr[0] << 8 |
735 			     adapter->currmacaddr[1]) & 0xFFFF);
736 
737 	slic_reg32_write(&slic_regs->slic_wraddrah, value2, FLUSH);
738 	slic_reg32_write(&slic_regs->slic_wraddrbh, value2, FLUSH);
739 
740 	/* Write our multicast mask out to the card.  This is done */
741 	/* here in addition to the slic_mcast_addr_set routine     */
742 	/* because ALL_MCAST may have been enabled or disabled     */
743 	slic_mcast_set_mask(adapter);
744 }
745 
slic_mac_config(struct adapter * adapter)746 static void slic_mac_config(struct adapter *adapter)
747 {
748 	u32 value;
749 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
750 
751 	/* Setup GMAC gaps */
752 	if (adapter->linkspeed == LINK_1000MB) {
753 		value = ((GMCR_GAPBB_1000 << GMCR_GAPBB_SHIFT) |
754 			 (GMCR_GAPR1_1000 << GMCR_GAPR1_SHIFT) |
755 			 (GMCR_GAPR2_1000 << GMCR_GAPR2_SHIFT));
756 	} else {
757 		value = ((GMCR_GAPBB_100 << GMCR_GAPBB_SHIFT) |
758 			 (GMCR_GAPR1_100 << GMCR_GAPR1_SHIFT) |
759 			 (GMCR_GAPR2_100 << GMCR_GAPR2_SHIFT));
760 	}
761 
762 	/* enable GMII */
763 	if (adapter->linkspeed == LINK_1000MB)
764 		value |= GMCR_GBIT;
765 
766 	/* enable fullduplex */
767 	if ((adapter->linkduplex == LINK_FULLD)
768 	    || (adapter->macopts & MAC_LOOPBACK)) {
769 		value |= GMCR_FULLD;
770 	}
771 
772 	/* write mac config */
773 	slic_reg32_write(&slic_regs->slic_wmcfg, value, FLUSH);
774 
775 	/* setup mac addresses */
776 	slic_mac_address_config(adapter);
777 }
778 
slic_config_set(struct adapter * adapter,bool linkchange)779 static void slic_config_set(struct adapter *adapter, bool linkchange)
780 {
781 	u32 value;
782 	u32 RcrReset;
783 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
784 
785 	if (linkchange) {
786 		/* Setup MAC */
787 		slic_mac_config(adapter);
788 		RcrReset = GRCR_RESET;
789 	} else {
790 		slic_mac_address_config(adapter);
791 		RcrReset = 0;
792 	}
793 
794 	if (adapter->linkduplex == LINK_FULLD) {
795 		/* setup xmtcfg */
796 		value = (GXCR_RESET |	/* Always reset     */
797 			 GXCR_XMTEN |	/* Enable transmit  */
798 			 GXCR_PAUSEEN);	/* Enable pause     */
799 
800 		slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
801 
802 		/* Setup rcvcfg last */
803 		value = (RcrReset |	/* Reset, if linkchange */
804 			 GRCR_CTLEN |	/* Enable CTL frames    */
805 			 GRCR_ADDRAEN |	/* Address A enable     */
806 			 GRCR_RCVBAD |	/* Rcv bad frames       */
807 			 (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
808 	} else {
809 		/* setup xmtcfg */
810 		value = (GXCR_RESET |	/* Always reset     */
811 			 GXCR_XMTEN);	/* Enable transmit  */
812 
813 		slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
814 
815 		/* Setup rcvcfg last */
816 		value = (RcrReset |	/* Reset, if linkchange */
817 			 GRCR_ADDRAEN |	/* Address A enable     */
818 			 GRCR_RCVBAD |	/* Rcv bad frames       */
819 			 (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
820 	}
821 
822 	if (adapter->state != ADAPT_DOWN) {
823 		/* Only enable receive if we are restarting or running */
824 		value |= GRCR_RCVEN;
825 	}
826 
827 	if (adapter->macopts & MAC_PROMISC)
828 		value |= GRCR_RCVALL;
829 
830 	slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH);
831 }
832 
833 /*
834  *  Turn off RCV and XMT, power down PHY
835  */
slic_config_clear(struct adapter * adapter)836 static void slic_config_clear(struct adapter *adapter)
837 {
838 	u32 value;
839 	u32 phy_config;
840 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
841 
842 	/* Setup xmtcfg */
843 	value = (GXCR_RESET |	/* Always reset */
844 		 GXCR_PAUSEEN);	/* Enable pause */
845 
846 	slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
847 
848 	value = (GRCR_RESET |	/* Always reset      */
849 		 GRCR_CTLEN |	/* Enable CTL frames */
850 		 GRCR_ADDRAEN |	/* Address A enable  */
851 		 (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
852 
853 	slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH);
854 
855 	/* power down phy */
856 	phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN));
857 	slic_reg32_write(&slic_regs->slic_wphy, phy_config, FLUSH);
858 }
859 
slic_mac_filter(struct adapter * adapter,struct ether_header * ether_frame)860 static bool slic_mac_filter(struct adapter *adapter,
861 			struct ether_header *ether_frame)
862 {
863 	struct net_device *netdev = adapter->netdev;
864 	u32 opts = adapter->macopts;
865 	u32 *dhost4 = (u32 *)&ether_frame->ether_dhost[0];
866 	u16 *dhost2 = (u16 *)&ether_frame->ether_dhost[4];
867 
868 	if (opts & MAC_PROMISC)
869 		return true;
870 
871 	if ((*dhost4 == 0xFFFFFFFF) && (*dhost2 == 0xFFFF)) {
872 		if (opts & MAC_BCAST) {
873 			adapter->rcv_broadcasts++;
874 			return true;
875 		} else {
876 			return false;
877 		}
878 	}
879 
880 	if (ether_frame->ether_dhost[0] & 0x01) {
881 		if (opts & MAC_ALLMCAST) {
882 			adapter->rcv_multicasts++;
883 			netdev->stats.multicast++;
884 			return true;
885 		}
886 		if (opts & MAC_MCAST) {
887 			struct mcast_address *mcaddr = adapter->mcastaddrs;
888 
889 			while (mcaddr) {
890 				if (!compare_ether_addr(mcaddr->address,
891 							ether_frame->ether_dhost)) {
892 					adapter->rcv_multicasts++;
893 					netdev->stats.multicast++;
894 					return true;
895 				}
896 				mcaddr = mcaddr->next;
897 			}
898 			return false;
899 		} else {
900 			return false;
901 		}
902 	}
903 	if (opts & MAC_DIRECTED) {
904 		adapter->rcv_unicasts++;
905 		return true;
906 	}
907 	return false;
908 
909 }
910 
slic_mac_set_address(struct net_device * dev,void * ptr)911 static int slic_mac_set_address(struct net_device *dev, void *ptr)
912 {
913 	struct adapter *adapter = netdev_priv(dev);
914 	struct sockaddr *addr = ptr;
915 
916 	if (netif_running(dev))
917 		return -EBUSY;
918 	if (!adapter)
919 		return -EBUSY;
920 
921 	if (!is_valid_ether_addr(addr->sa_data))
922 		return -EINVAL;
923 
924 	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
925 	memcpy(adapter->currmacaddr, addr->sa_data, dev->addr_len);
926 
927 	slic_config_set(adapter, true);
928 	return 0;
929 }
930 
slic_timer_load_check(ulong cardaddr)931 static void slic_timer_load_check(ulong cardaddr)
932 {
933 	struct sliccard *card = (struct sliccard *)cardaddr;
934 	struct adapter *adapter = card->master;
935 	u32 __iomem *intagg;
936 	u32 load = card->events;
937 	u32 level = 0;
938 
939 	intagg = &adapter->slic_regs->slic_intagg;
940 
941 	if ((adapter) && (adapter->state == ADAPT_UP) &&
942 	    (card->state == CARD_UP) && (slic_global.dynamic_intagg)) {
943 		if (adapter->devid == SLIC_1GB_DEVICE_ID) {
944 			if (adapter->linkspeed == LINK_1000MB)
945 				level = 100;
946 			else {
947 				if (load > SLIC_LOAD_5)
948 					level = SLIC_INTAGG_5;
949 				else if (load > SLIC_LOAD_4)
950 					level = SLIC_INTAGG_4;
951 				else if (load > SLIC_LOAD_3)
952 					level = SLIC_INTAGG_3;
953 				else if (load > SLIC_LOAD_2)
954 					level = SLIC_INTAGG_2;
955 				else if (load > SLIC_LOAD_1)
956 					level = SLIC_INTAGG_1;
957 				else
958 					level = SLIC_INTAGG_0;
959 			}
960 			if (card->loadlevel_current != level) {
961 				card->loadlevel_current = level;
962 				slic_reg32_write(intagg, level, FLUSH);
963 			}
964 		} else {
965 			if (load > SLIC_LOAD_5)
966 				level = SLIC_INTAGG_5;
967 			else if (load > SLIC_LOAD_4)
968 				level = SLIC_INTAGG_4;
969 			else if (load > SLIC_LOAD_3)
970 				level = SLIC_INTAGG_3;
971 			else if (load > SLIC_LOAD_2)
972 				level = SLIC_INTAGG_2;
973 			else if (load > SLIC_LOAD_1)
974 				level = SLIC_INTAGG_1;
975 			else
976 				level = SLIC_INTAGG_0;
977 			if (card->loadlevel_current != level) {
978 				card->loadlevel_current = level;
979 				slic_reg32_write(intagg, level, FLUSH);
980 			}
981 		}
982 	}
983 	card->events = 0;
984 	card->loadtimer.expires = jiffies + (SLIC_LOADTIMER_PERIOD * HZ);
985 	add_timer(&card->loadtimer);
986 }
987 
slic_upr_queue_request(struct adapter * adapter,u32 upr_request,u32 upr_data,u32 upr_data_h,u32 upr_buffer,u32 upr_buffer_h)988 static int slic_upr_queue_request(struct adapter *adapter,
989 			   u32 upr_request,
990 			   u32 upr_data,
991 			   u32 upr_data_h,
992 			   u32 upr_buffer, u32 upr_buffer_h)
993 {
994 	struct slic_upr *upr;
995 	struct slic_upr *uprqueue;
996 
997 	upr = kmalloc(sizeof(struct slic_upr), GFP_ATOMIC);
998 	if (!upr)
999 		return -ENOMEM;
1000 
1001 	upr->adapter = adapter->port;
1002 	upr->upr_request = upr_request;
1003 	upr->upr_data = upr_data;
1004 	upr->upr_buffer = upr_buffer;
1005 	upr->upr_data_h = upr_data_h;
1006 	upr->upr_buffer_h = upr_buffer_h;
1007 	upr->next = NULL;
1008 	if (adapter->upr_list) {
1009 		uprqueue = adapter->upr_list;
1010 
1011 		while (uprqueue->next)
1012 			uprqueue = uprqueue->next;
1013 		uprqueue->next = upr;
1014 	} else {
1015 		adapter->upr_list = upr;
1016 	}
1017 	return 0;
1018 }
1019 
slic_upr_start(struct adapter * adapter)1020 static void slic_upr_start(struct adapter *adapter)
1021 {
1022 	struct slic_upr *upr;
1023 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
1024 /*
1025     char * ptr1;
1026     char * ptr2;
1027     uint cmdoffset;
1028 */
1029 	upr = adapter->upr_list;
1030 	if (!upr)
1031 		return;
1032 	if (adapter->upr_busy)
1033 		return;
1034 	adapter->upr_busy = 1;
1035 
1036 	switch (upr->upr_request) {
1037 	case SLIC_UPR_STATS:
1038 		if (upr->upr_data_h == 0) {
1039 			slic_reg32_write(&slic_regs->slic_stats, upr->upr_data,
1040 					 FLUSH);
1041 		} else {
1042 			slic_reg64_write(adapter, &slic_regs->slic_stats64,
1043 					 upr->upr_data,
1044 					 &slic_regs->slic_addr_upper,
1045 					 upr->upr_data_h, FLUSH);
1046 		}
1047 		break;
1048 
1049 	case SLIC_UPR_RLSR:
1050 		slic_reg64_write(adapter, &slic_regs->slic_rlsr, upr->upr_data,
1051 				 &slic_regs->slic_addr_upper, upr->upr_data_h,
1052 				 FLUSH);
1053 		break;
1054 
1055 	case SLIC_UPR_RCONFIG:
1056 		slic_reg64_write(adapter, &slic_regs->slic_rconfig,
1057 				 upr->upr_data, &slic_regs->slic_addr_upper,
1058 				 upr->upr_data_h, FLUSH);
1059 		break;
1060 	case SLIC_UPR_PING:
1061 		slic_reg32_write(&slic_regs->slic_ping, 1, FLUSH);
1062 		break;
1063 	default:
1064 		ASSERT(0);
1065 	}
1066 }
1067 
slic_upr_request(struct adapter * adapter,u32 upr_request,u32 upr_data,u32 upr_data_h,u32 upr_buffer,u32 upr_buffer_h)1068 static int slic_upr_request(struct adapter *adapter,
1069 		     u32 upr_request,
1070 		     u32 upr_data,
1071 		     u32 upr_data_h,
1072 		     u32 upr_buffer, u32 upr_buffer_h)
1073 {
1074 	int rc;
1075 
1076 	spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags);
1077 	rc = slic_upr_queue_request(adapter,
1078 					upr_request,
1079 					upr_data,
1080 					upr_data_h, upr_buffer, upr_buffer_h);
1081 	if (rc)
1082 		goto err_unlock_irq;
1083 
1084 	slic_upr_start(adapter);
1085 err_unlock_irq:
1086 	spin_unlock_irqrestore(&adapter->upr_lock.lock,
1087 				adapter->upr_lock.flags);
1088 	return rc;
1089 }
1090 
slic_link_upr_complete(struct adapter * adapter,u32 isr)1091 static void slic_link_upr_complete(struct adapter *adapter, u32 isr)
1092 {
1093 	u32 linkstatus = adapter->pshmem->linkstatus;
1094 	uint linkup;
1095 	unsigned char linkspeed;
1096 	unsigned char linkduplex;
1097 
1098 	if ((isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
1099 		struct slic_shmem *pshmem;
1100 
1101 		pshmem = (struct slic_shmem *)adapter->phys_shmem;
1102 #if BITS_PER_LONG == 64
1103 		slic_upr_queue_request(adapter,
1104 				       SLIC_UPR_RLSR,
1105 				       SLIC_GET_ADDR_LOW(&pshmem->linkstatus),
1106 				       SLIC_GET_ADDR_HIGH(&pshmem->linkstatus),
1107 				       0, 0);
1108 #else
1109 		slic_upr_queue_request(adapter,
1110 				       SLIC_UPR_RLSR,
1111 				       (u32) &pshmem->linkstatus,
1112 				       SLIC_GET_ADDR_HIGH(pshmem), 0, 0);
1113 #endif
1114 		return;
1115 	}
1116 	if (adapter->state != ADAPT_UP)
1117 		return;
1118 
1119 	ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID)
1120 	       || (adapter->devid == SLIC_2GB_DEVICE_ID));
1121 
1122 	linkup = linkstatus & GIG_LINKUP ? LINK_UP : LINK_DOWN;
1123 	if (linkstatus & GIG_SPEED_1000)
1124 		linkspeed = LINK_1000MB;
1125 	else if (linkstatus & GIG_SPEED_100)
1126 		linkspeed = LINK_100MB;
1127 	else
1128 		linkspeed = LINK_10MB;
1129 
1130 	if (linkstatus & GIG_FULLDUPLEX)
1131 		linkduplex = LINK_FULLD;
1132 	else
1133 		linkduplex = LINK_HALFD;
1134 
1135 	if ((adapter->linkstate == LINK_DOWN) && (linkup == LINK_DOWN))
1136 		return;
1137 
1138 	/* link up event, but nothing has changed */
1139 	if ((adapter->linkstate == LINK_UP) &&
1140 	    (linkup == LINK_UP) &&
1141 	    (adapter->linkspeed == linkspeed) &&
1142 	    (adapter->linkduplex == linkduplex))
1143 		return;
1144 
1145 	/* link has changed at this point */
1146 
1147 	/* link has gone from up to down */
1148 	if (linkup == LINK_DOWN) {
1149 		adapter->linkstate = LINK_DOWN;
1150 		return;
1151 	}
1152 
1153 	/* link has gone from down to up */
1154 	adapter->linkspeed = linkspeed;
1155 	adapter->linkduplex = linkduplex;
1156 
1157 	if (adapter->linkstate != LINK_UP) {
1158 		/* setup the mac */
1159 		slic_config_set(adapter, true);
1160 		adapter->linkstate = LINK_UP;
1161 		netif_start_queue(adapter->netdev);
1162 	}
1163 }
1164 
slic_upr_request_complete(struct adapter * adapter,u32 isr)1165 static void slic_upr_request_complete(struct adapter *adapter, u32 isr)
1166 {
1167 	struct sliccard *card = adapter->card;
1168 	struct slic_upr *upr;
1169 
1170 	spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags);
1171 	upr = adapter->upr_list;
1172 	if (!upr) {
1173 		ASSERT(0);
1174 		spin_unlock_irqrestore(&adapter->upr_lock.lock,
1175 					adapter->upr_lock.flags);
1176 		return;
1177 	}
1178 	adapter->upr_list = upr->next;
1179 	upr->next = NULL;
1180 	adapter->upr_busy = 0;
1181 	ASSERT(adapter->port == upr->adapter);
1182 	switch (upr->upr_request) {
1183 	case SLIC_UPR_STATS:
1184 		{
1185 			struct slic_stats *slicstats =
1186 			    (struct slic_stats *) &adapter->pshmem->inicstats;
1187 			struct slic_stats *newstats = slicstats;
1188 			struct slic_stats  *old = &adapter->inicstats_prev;
1189 			struct slicnet_stats *stst = &adapter->slic_stats;
1190 
1191 			if (isr & ISR_UPCERR) {
1192 				dev_err(&adapter->netdev->dev,
1193 					"SLIC_UPR_STATS command failed isr[%x]\n",
1194 					isr);
1195 
1196 				break;
1197 			}
1198 			UPDATE_STATS_GB(stst->tcp.xmit_tcp_segs,
1199 					newstats->xmit_tcp_segs_gb,
1200 					old->xmit_tcp_segs_gb);
1201 
1202 			UPDATE_STATS_GB(stst->tcp.xmit_tcp_bytes,
1203 					newstats->xmit_tcp_bytes_gb,
1204 					old->xmit_tcp_bytes_gb);
1205 
1206 			UPDATE_STATS_GB(stst->tcp.rcv_tcp_segs,
1207 					newstats->rcv_tcp_segs_gb,
1208 					old->rcv_tcp_segs_gb);
1209 
1210 			UPDATE_STATS_GB(stst->tcp.rcv_tcp_bytes,
1211 					newstats->rcv_tcp_bytes_gb,
1212 					old->rcv_tcp_bytes_gb);
1213 
1214 			UPDATE_STATS_GB(stst->iface.xmt_bytes,
1215 					newstats->xmit_bytes_gb,
1216 					old->xmit_bytes_gb);
1217 
1218 			UPDATE_STATS_GB(stst->iface.xmt_ucast,
1219 					newstats->xmit_unicasts_gb,
1220 					old->xmit_unicasts_gb);
1221 
1222 			UPDATE_STATS_GB(stst->iface.rcv_bytes,
1223 					newstats->rcv_bytes_gb,
1224 					old->rcv_bytes_gb);
1225 
1226 			UPDATE_STATS_GB(stst->iface.rcv_ucast,
1227 					newstats->rcv_unicasts_gb,
1228 					old->rcv_unicasts_gb);
1229 
1230 			UPDATE_STATS_GB(stst->iface.xmt_errors,
1231 					newstats->xmit_collisions_gb,
1232 					old->xmit_collisions_gb);
1233 
1234 			UPDATE_STATS_GB(stst->iface.xmt_errors,
1235 					newstats->xmit_excess_collisions_gb,
1236 					old->xmit_excess_collisions_gb);
1237 
1238 			UPDATE_STATS_GB(stst->iface.xmt_errors,
1239 					newstats->xmit_other_error_gb,
1240 					old->xmit_other_error_gb);
1241 
1242 			UPDATE_STATS_GB(stst->iface.rcv_errors,
1243 					newstats->rcv_other_error_gb,
1244 					old->rcv_other_error_gb);
1245 
1246 			UPDATE_STATS_GB(stst->iface.rcv_discards,
1247 					newstats->rcv_drops_gb,
1248 					old->rcv_drops_gb);
1249 
1250 			if (newstats->rcv_drops_gb > old->rcv_drops_gb) {
1251 				adapter->rcv_drops +=
1252 				    (newstats->rcv_drops_gb -
1253 				     old->rcv_drops_gb);
1254 			}
1255 			memcpy(old, newstats, sizeof(struct slic_stats));
1256 			break;
1257 		}
1258 	case SLIC_UPR_RLSR:
1259 		slic_link_upr_complete(adapter, isr);
1260 		break;
1261 	case SLIC_UPR_RCONFIG:
1262 		break;
1263 	case SLIC_UPR_RPHY:
1264 		ASSERT(0);
1265 		break;
1266 	case SLIC_UPR_ENLB:
1267 		ASSERT(0);
1268 		break;
1269 	case SLIC_UPR_ENCT:
1270 		ASSERT(0);
1271 		break;
1272 	case SLIC_UPR_PDWN:
1273 		ASSERT(0);
1274 		break;
1275 	case SLIC_UPR_PING:
1276 		card->pingstatus |= (isr & ISR_PINGDSMASK);
1277 		break;
1278 	default:
1279 		ASSERT(0);
1280 	}
1281 	kfree(upr);
1282 	slic_upr_start(adapter);
1283 	spin_unlock_irqrestore(&adapter->upr_lock.lock,
1284 				adapter->upr_lock.flags);
1285 }
1286 
slic_config_get(struct adapter * adapter,u32 config,u32 config_h)1287 static void slic_config_get(struct adapter *adapter, u32 config,
1288 							u32 config_h)
1289 {
1290 	int status;
1291 
1292 	status = slic_upr_request(adapter,
1293 				  SLIC_UPR_RCONFIG,
1294 				  (u32) config, (u32) config_h, 0, 0);
1295 	ASSERT(status == 0);
1296 }
1297 
1298 /*
1299  *  this is here to checksum the eeprom, there is some ucode bug
1300  *  which prevens us from using the ucode result.
1301  *  remove this once ucode is fixed.
1302  */
slic_eeprom_cksum(char * m,int len)1303 static ushort slic_eeprom_cksum(char *m, int len)
1304 {
1305 #define ADDCARRY(x)  (x > 65535 ? x -= 65535 : x)
1306 #define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);\
1307 		}
1308 
1309 	u16 *w;
1310 	u32 sum = 0;
1311 	u32 byte_swapped = 0;
1312 	u32 w_int;
1313 
1314 	union {
1315 		char c[2];
1316 		ushort s;
1317 	} s_util;
1318 
1319 	union {
1320 		ushort s[2];
1321 		int l;
1322 	} l_util;
1323 
1324 	l_util.l = 0;
1325 	s_util.s = 0;
1326 
1327 	w = (u16 *)m;
1328 #if BITS_PER_LONG == 64
1329 	w_int = (u32) ((ulong) w & 0x00000000FFFFFFFF);
1330 #else
1331 	w_int = (u32) (w);
1332 #endif
1333 	if ((1 & w_int) && (len > 0)) {
1334 		REDUCE;
1335 		sum <<= 8;
1336 		s_util.c[0] = *(unsigned char *)w;
1337 		w = (u16 *)((char *)w + 1);
1338 		len--;
1339 		byte_swapped = 1;
1340 	}
1341 
1342 	/* Unroll the loop to make overhead from branches &c small. */
1343 	while ((len -= 32) >= 0) {
1344 		sum += w[0];
1345 		sum += w[1];
1346 		sum += w[2];
1347 		sum += w[3];
1348 		sum += w[4];
1349 		sum += w[5];
1350 		sum += w[6];
1351 		sum += w[7];
1352 		sum += w[8];
1353 		sum += w[9];
1354 		sum += w[10];
1355 		sum += w[11];
1356 		sum += w[12];
1357 		sum += w[13];
1358 		sum += w[14];
1359 		sum += w[15];
1360 		w = (u16 *)((ulong) w + 16);	/* verify */
1361 	}
1362 	len += 32;
1363 	while ((len -= 8) >= 0) {
1364 		sum += w[0];
1365 		sum += w[1];
1366 		sum += w[2];
1367 		sum += w[3];
1368 		w = (u16 *)((ulong) w + 4);	/* verify */
1369 	}
1370 	len += 8;
1371 	if (len != 0 || byte_swapped != 0) {
1372 		REDUCE;
1373 		while ((len -= 2) >= 0)
1374 			sum += *w++;	/* verify */
1375 		if (byte_swapped) {
1376 			REDUCE;
1377 			sum <<= 8;
1378 			byte_swapped = 0;
1379 			if (len == -1) {
1380 				s_util.c[1] = *(char *) w;
1381 				sum += s_util.s;
1382 				len = 0;
1383 			} else {
1384 				len = -1;
1385 			}
1386 
1387 		} else if (len == -1) {
1388 			s_util.c[0] = *(char *) w;
1389 		}
1390 
1391 		if (len == -1) {
1392 			s_util.c[1] = 0;
1393 			sum += s_util.s;
1394 		}
1395 	}
1396 	REDUCE;
1397 	return (ushort) sum;
1398 }
1399 
slic_rspqueue_free(struct adapter * adapter)1400 static void slic_rspqueue_free(struct adapter *adapter)
1401 {
1402 	int i;
1403 	struct slic_rspqueue *rspq = &adapter->rspqueue;
1404 
1405 	for (i = 0; i < rspq->num_pages; i++) {
1406 		if (rspq->vaddr[i]) {
1407 			pci_free_consistent(adapter->pcidev, PAGE_SIZE,
1408 					    rspq->vaddr[i], rspq->paddr[i]);
1409 		}
1410 		rspq->vaddr[i] = NULL;
1411 		rspq->paddr[i] = 0;
1412 	}
1413 	rspq->offset = 0;
1414 	rspq->pageindex = 0;
1415 	rspq->rspbuf = NULL;
1416 }
1417 
slic_rspqueue_init(struct adapter * adapter)1418 static int slic_rspqueue_init(struct adapter *adapter)
1419 {
1420 	int i;
1421 	struct slic_rspqueue *rspq = &adapter->rspqueue;
1422 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
1423 	u32 paddrh = 0;
1424 
1425 	ASSERT(adapter->state == ADAPT_DOWN);
1426 	memset(rspq, 0, sizeof(struct slic_rspqueue));
1427 
1428 	rspq->num_pages = SLIC_RSPQ_PAGES_GB;
1429 
1430 	for (i = 0; i < rspq->num_pages; i++) {
1431 		rspq->vaddr[i] = pci_alloc_consistent(adapter->pcidev,
1432 						      PAGE_SIZE,
1433 						      &rspq->paddr[i]);
1434 		if (!rspq->vaddr[i]) {
1435 			dev_err(&adapter->pcidev->dev,
1436 				"pci_alloc_consistent failed\n");
1437 			slic_rspqueue_free(adapter);
1438 			return -ENOMEM;
1439 		}
1440 		/* FIXME:
1441 		 * do we really need this assertions (4K PAGE_SIZE aligned addr)? */
1442 #if 0
1443 #ifndef CONFIG_X86_64
1444 		ASSERT(((u32) rspq->vaddr[i] & 0xFFFFF000) ==
1445 		       (u32) rspq->vaddr[i]);
1446 		ASSERT(((u32) rspq->paddr[i] & 0xFFFFF000) ==
1447 		       (u32) rspq->paddr[i]);
1448 #endif
1449 #endif
1450 		memset(rspq->vaddr[i], 0, PAGE_SIZE);
1451 
1452 		if (paddrh == 0) {
1453 			slic_reg32_write(&slic_regs->slic_rbar,
1454 				(rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE),
1455 				DONT_FLUSH);
1456 		} else {
1457 			slic_reg64_write(adapter, &slic_regs->slic_rbar64,
1458 				(rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE),
1459 				&slic_regs->slic_addr_upper,
1460 				paddrh, DONT_FLUSH);
1461 		}
1462 	}
1463 	rspq->offset = 0;
1464 	rspq->pageindex = 0;
1465 	rspq->rspbuf = (struct slic_rspbuf *)rspq->vaddr[0];
1466 	return 0;
1467 }
1468 
slic_rspqueue_getnext(struct adapter * adapter)1469 static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter)
1470 {
1471 	struct slic_rspqueue *rspq = &adapter->rspqueue;
1472 	struct slic_rspbuf *buf;
1473 
1474 	if (!(rspq->rspbuf->status))
1475 		return NULL;
1476 
1477 	buf = rspq->rspbuf;
1478 #if BITS_PER_LONG == 32
1479 	ASSERT((buf->status & 0xFFFFFFE0) == 0);
1480 #endif
1481 	ASSERT(buf->hosthandle);
1482 	if (++rspq->offset < SLIC_RSPQ_BUFSINPAGE) {
1483 		rspq->rspbuf++;
1484 #if BITS_PER_LONG == 32
1485 		ASSERT(((u32) rspq->rspbuf & 0xFFFFFFE0) ==
1486 		       (u32) rspq->rspbuf);
1487 #endif
1488 	} else {
1489 		ASSERT(rspq->offset == SLIC_RSPQ_BUFSINPAGE);
1490 		slic_reg64_write(adapter, &adapter->slic_regs->slic_rbar64,
1491 			(rspq->paddr[rspq->pageindex] | SLIC_RSPQ_BUFSINPAGE),
1492 			&adapter->slic_regs->slic_addr_upper, 0, DONT_FLUSH);
1493 		rspq->pageindex = (++rspq->pageindex) % rspq->num_pages;
1494 		rspq->offset = 0;
1495 		rspq->rspbuf = (struct slic_rspbuf *)
1496 						rspq->vaddr[rspq->pageindex];
1497 #if BITS_PER_LONG == 32
1498 		ASSERT(((u32) rspq->rspbuf & 0xFFFFF000) ==
1499 		       (u32) rspq->rspbuf);
1500 #endif
1501 	}
1502 #if BITS_PER_LONG == 32
1503 	ASSERT(((u32) buf & 0xFFFFFFE0) == (u32) buf);
1504 #endif
1505 	return buf;
1506 }
1507 
slic_cmdqmem_init(struct adapter * adapter)1508 static void slic_cmdqmem_init(struct adapter *adapter)
1509 {
1510 	struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1511 
1512 	memset(cmdqmem, 0, sizeof(struct slic_cmdqmem));
1513 }
1514 
slic_cmdqmem_free(struct adapter * adapter)1515 static void slic_cmdqmem_free(struct adapter *adapter)
1516 {
1517 	struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1518 	int i;
1519 
1520 	for (i = 0; i < SLIC_CMDQ_MAXPAGES; i++) {
1521 		if (cmdqmem->pages[i]) {
1522 			pci_free_consistent(adapter->pcidev,
1523 					    PAGE_SIZE,
1524 					    (void *) cmdqmem->pages[i],
1525 					    cmdqmem->dma_pages[i]);
1526 		}
1527 	}
1528 	memset(cmdqmem, 0, sizeof(struct slic_cmdqmem));
1529 }
1530 
slic_cmdqmem_addpage(struct adapter * adapter)1531 static u32 *slic_cmdqmem_addpage(struct adapter *adapter)
1532 {
1533 	struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1534 	u32 *pageaddr;
1535 
1536 	if (cmdqmem->pagecnt >= SLIC_CMDQ_MAXPAGES)
1537 		return NULL;
1538 	pageaddr = pci_alloc_consistent(adapter->pcidev,
1539 					PAGE_SIZE,
1540 					&cmdqmem->dma_pages[cmdqmem->pagecnt]);
1541 	if (!pageaddr)
1542 		return NULL;
1543 #if BITS_PER_LONG == 32
1544 	ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr);
1545 #endif
1546 	cmdqmem->pages[cmdqmem->pagecnt] = pageaddr;
1547 	cmdqmem->pagecnt++;
1548 	return pageaddr;
1549 }
1550 
slic_cmdq_free(struct adapter * adapter)1551 static void slic_cmdq_free(struct adapter *adapter)
1552 {
1553 	struct slic_hostcmd *cmd;
1554 
1555 	cmd = adapter->cmdq_all.head;
1556 	while (cmd) {
1557 		if (cmd->busy) {
1558 			struct sk_buff *tempskb;
1559 
1560 			tempskb = cmd->skb;
1561 			if (tempskb) {
1562 				cmd->skb = NULL;
1563 				dev_kfree_skb_irq(tempskb);
1564 			}
1565 		}
1566 		cmd = cmd->next_all;
1567 	}
1568 	memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));
1569 	memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));
1570 	memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));
1571 	slic_cmdqmem_free(adapter);
1572 }
1573 
slic_cmdq_addcmdpage(struct adapter * adapter,u32 * page)1574 static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page)
1575 {
1576 	struct slic_hostcmd *cmd;
1577 	struct slic_hostcmd *prev;
1578 	struct slic_hostcmd *tail;
1579 	struct slic_cmdqueue *cmdq;
1580 	int cmdcnt;
1581 	void *cmdaddr;
1582 	ulong phys_addr;
1583 	u32 phys_addrl;
1584 	u32 phys_addrh;
1585 	struct slic_handle *pslic_handle;
1586 
1587 	cmdaddr = page;
1588 	cmd = (struct slic_hostcmd *)cmdaddr;
1589 	cmdcnt = 0;
1590 
1591 	phys_addr = virt_to_bus((void *)page);
1592 	phys_addrl = SLIC_GET_ADDR_LOW(phys_addr);
1593 	phys_addrh = SLIC_GET_ADDR_HIGH(phys_addr);
1594 
1595 	prev = NULL;
1596 	tail = cmd;
1597 	while ((cmdcnt < SLIC_CMDQ_CMDSINPAGE) &&
1598 	       (adapter->slic_handle_ix < 256)) {
1599 		/* Allocate and initialize a SLIC_HANDLE for this command */
1600 		SLIC_GET_SLIC_HANDLE(adapter, pslic_handle);
1601 		if (pslic_handle == NULL)
1602 			ASSERT(0);
1603 		ASSERT(pslic_handle ==
1604 		       &adapter->slic_handles[pslic_handle->token.
1605 					      handle_index]);
1606 		pslic_handle->type = SLIC_HANDLE_CMD;
1607 		pslic_handle->address = (void *) cmd;
1608 		pslic_handle->offset = (ushort) adapter->slic_handle_ix++;
1609 		pslic_handle->other_handle = NULL;
1610 		pslic_handle->next = NULL;
1611 
1612 		cmd->pslic_handle = pslic_handle;
1613 		cmd->cmd64.hosthandle = pslic_handle->token.handle_token;
1614 		cmd->busy = false;
1615 		cmd->paddrl = phys_addrl;
1616 		cmd->paddrh = phys_addrh;
1617 		cmd->next_all = prev;
1618 		cmd->next = prev;
1619 		prev = cmd;
1620 		phys_addrl += SLIC_HOSTCMD_SIZE;
1621 		cmdaddr += SLIC_HOSTCMD_SIZE;
1622 
1623 		cmd = (struct slic_hostcmd *)cmdaddr;
1624 		cmdcnt++;
1625 	}
1626 
1627 	cmdq = &adapter->cmdq_all;
1628 	cmdq->count += cmdcnt;	/*  SLIC_CMDQ_CMDSINPAGE;   mooktodo */
1629 	tail->next_all = cmdq->head;
1630 	cmdq->head = prev;
1631 	cmdq = &adapter->cmdq_free;
1632 	spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags);
1633 	cmdq->count += cmdcnt;	/*  SLIC_CMDQ_CMDSINPAGE;   mooktodo */
1634 	tail->next = cmdq->head;
1635 	cmdq->head = prev;
1636 	spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags);
1637 }
1638 
slic_cmdq_init(struct adapter * adapter)1639 static int slic_cmdq_init(struct adapter *adapter)
1640 {
1641 	int i;
1642 	u32 *pageaddr;
1643 
1644 	ASSERT(adapter->state == ADAPT_DOWN);
1645 	memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));
1646 	memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));
1647 	memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));
1648 	spin_lock_init(&adapter->cmdq_all.lock.lock);
1649 	spin_lock_init(&adapter->cmdq_free.lock.lock);
1650 	spin_lock_init(&adapter->cmdq_done.lock.lock);
1651 	slic_cmdqmem_init(adapter);
1652 	adapter->slic_handle_ix = 1;
1653 	for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) {
1654 		pageaddr = slic_cmdqmem_addpage(adapter);
1655 #if BITS_PER_LONG == 32
1656 		ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr);
1657 #endif
1658 		if (!pageaddr) {
1659 			slic_cmdq_free(adapter);
1660 			return -ENOMEM;
1661 		}
1662 		slic_cmdq_addcmdpage(adapter, pageaddr);
1663 	}
1664 	adapter->slic_handle_ix = 1;
1665 
1666 	return 0;
1667 }
1668 
slic_cmdq_reset(struct adapter * adapter)1669 static void slic_cmdq_reset(struct adapter *adapter)
1670 {
1671 	struct slic_hostcmd *hcmd;
1672 	struct sk_buff *skb;
1673 	u32 outstanding;
1674 
1675 	spin_lock_irqsave(&adapter->cmdq_free.lock.lock,
1676 			adapter->cmdq_free.lock.flags);
1677 	spin_lock_irqsave(&adapter->cmdq_done.lock.lock,
1678 			adapter->cmdq_done.lock.flags);
1679 	outstanding = adapter->cmdq_all.count - adapter->cmdq_done.count;
1680 	outstanding -= adapter->cmdq_free.count;
1681 	hcmd = adapter->cmdq_all.head;
1682 	while (hcmd) {
1683 		if (hcmd->busy) {
1684 			skb = hcmd->skb;
1685 			ASSERT(skb);
1686 			hcmd->busy = 0;
1687 			hcmd->skb = NULL;
1688 			dev_kfree_skb_irq(skb);
1689 		}
1690 		hcmd = hcmd->next_all;
1691 	}
1692 	adapter->cmdq_free.count = 0;
1693 	adapter->cmdq_free.head = NULL;
1694 	adapter->cmdq_free.tail = NULL;
1695 	adapter->cmdq_done.count = 0;
1696 	adapter->cmdq_done.head = NULL;
1697 	adapter->cmdq_done.tail = NULL;
1698 	adapter->cmdq_free.head = adapter->cmdq_all.head;
1699 	hcmd = adapter->cmdq_all.head;
1700 	while (hcmd) {
1701 		adapter->cmdq_free.count++;
1702 		hcmd->next = hcmd->next_all;
1703 		hcmd = hcmd->next_all;
1704 	}
1705 	if (adapter->cmdq_free.count != adapter->cmdq_all.count) {
1706 		dev_err(&adapter->netdev->dev,
1707 			"free_count %d != all count %d\n",
1708 			adapter->cmdq_free.count, adapter->cmdq_all.count);
1709 	}
1710 	spin_unlock_irqrestore(&adapter->cmdq_done.lock.lock,
1711 				adapter->cmdq_done.lock.flags);
1712 	spin_unlock_irqrestore(&adapter->cmdq_free.lock.lock,
1713 				adapter->cmdq_free.lock.flags);
1714 }
1715 
slic_cmdq_getdone(struct adapter * adapter)1716 static void slic_cmdq_getdone(struct adapter *adapter)
1717 {
1718 	struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done;
1719 	struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free;
1720 
1721 	ASSERT(free_cmdq->head == NULL);
1722 	spin_lock_irqsave(&done_cmdq->lock.lock, done_cmdq->lock.flags);
1723 
1724 	free_cmdq->head = done_cmdq->head;
1725 	free_cmdq->count = done_cmdq->count;
1726 	done_cmdq->head = NULL;
1727 	done_cmdq->tail = NULL;
1728 	done_cmdq->count = 0;
1729 	spin_unlock_irqrestore(&done_cmdq->lock.lock, done_cmdq->lock.flags);
1730 }
1731 
slic_cmdq_getfree(struct adapter * adapter)1732 static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter)
1733 {
1734 	struct slic_cmdqueue *cmdq = &adapter->cmdq_free;
1735 	struct slic_hostcmd *cmd = NULL;
1736 
1737 lock_and_retry:
1738 	spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags);
1739 retry:
1740 	cmd = cmdq->head;
1741 	if (cmd) {
1742 		cmdq->head = cmd->next;
1743 		cmdq->count--;
1744 		spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags);
1745 	} else {
1746 		slic_cmdq_getdone(adapter);
1747 		cmd = cmdq->head;
1748 		if (cmd) {
1749 			goto retry;
1750 		} else {
1751 			u32 *pageaddr;
1752 
1753 			spin_unlock_irqrestore(&cmdq->lock.lock,
1754 						cmdq->lock.flags);
1755 			pageaddr = slic_cmdqmem_addpage(adapter);
1756 			if (pageaddr) {
1757 				slic_cmdq_addcmdpage(adapter, pageaddr);
1758 				goto lock_and_retry;
1759 			}
1760 		}
1761 	}
1762 	return cmd;
1763 }
1764 
slic_cmdq_putdone_irq(struct adapter * adapter,struct slic_hostcmd * cmd)1765 static void slic_cmdq_putdone_irq(struct adapter *adapter,
1766 				struct slic_hostcmd *cmd)
1767 {
1768 	struct slic_cmdqueue *cmdq = &adapter->cmdq_done;
1769 
1770 	spin_lock(&cmdq->lock.lock);
1771 	cmd->busy = 0;
1772 	cmd->next = cmdq->head;
1773 	cmdq->head = cmd;
1774 	cmdq->count++;
1775 	if ((adapter->xmitq_full) && (cmdq->count > 10))
1776 		netif_wake_queue(adapter->netdev);
1777 	spin_unlock(&cmdq->lock.lock);
1778 }
1779 
slic_rcvqueue_fill(struct adapter * adapter)1780 static int slic_rcvqueue_fill(struct adapter *adapter)
1781 {
1782 	void *paddr;
1783 	u32 paddrl;
1784 	u32 paddrh;
1785 	struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1786 	int i = 0;
1787 	struct device *dev = &adapter->netdev->dev;
1788 
1789 	while (i < SLIC_RCVQ_FILLENTRIES) {
1790 		struct slic_rcvbuf *rcvbuf;
1791 		struct sk_buff *skb;
1792 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1793 retry_rcvqfill:
1794 #endif
1795 		skb = alloc_skb(SLIC_RCVQ_RCVBUFSIZE, GFP_ATOMIC);
1796 		if (skb) {
1797 			paddr = (void *)pci_map_single(adapter->pcidev,
1798 							  skb->data,
1799 							  SLIC_RCVQ_RCVBUFSIZE,
1800 							  PCI_DMA_FROMDEVICE);
1801 			paddrl = SLIC_GET_ADDR_LOW(paddr);
1802 			paddrh = SLIC_GET_ADDR_HIGH(paddr);
1803 
1804 			skb->len = SLIC_RCVBUF_HEADSIZE;
1805 			rcvbuf = (struct slic_rcvbuf *)skb->head;
1806 			rcvbuf->status = 0;
1807 			skb->next = NULL;
1808 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1809 			if (paddrl == 0) {
1810 				dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1811 					__func__);
1812 				dev_err(dev, "skb[%p] PROBLEM\n", skb);
1813 				dev_err(dev, "         skbdata[%p]\n", skb->data);
1814 				dev_err(dev, "         skblen[%x]\n", skb->len);
1815 				dev_err(dev, "         paddr[%p]\n", paddr);
1816 				dev_err(dev, "         paddrl[%x]\n", paddrl);
1817 				dev_err(dev, "         paddrh[%x]\n", paddrh);
1818 				dev_err(dev, "         rcvq->head[%p]\n", rcvq->head);
1819 				dev_err(dev, "         rcvq->tail[%p]\n", rcvq->tail);
1820 				dev_err(dev, "         rcvq->count[%x]\n", rcvq->count);
1821 				dev_err(dev, "SKIP THIS SKB!!!!!!!!\n");
1822 				goto retry_rcvqfill;
1823 			}
1824 #else
1825 			if (paddrl == 0) {
1826 				dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1827 					__func__);
1828 				dev_err(dev, "skb[%p] PROBLEM\n", skb);
1829 				dev_err(dev, "         skbdata[%p]\n", skb->data);
1830 				dev_err(dev, "         skblen[%x]\n", skb->len);
1831 				dev_err(dev, "         paddr[%p]\n", paddr);
1832 				dev_err(dev, "         paddrl[%x]\n", paddrl);
1833 				dev_err(dev, "         paddrh[%x]\n", paddrh);
1834 				dev_err(dev, "         rcvq->head[%p]\n", rcvq->head);
1835 				dev_err(dev, "         rcvq->tail[%p]\n", rcvq->tail);
1836 				dev_err(dev, "         rcvq->count[%x]\n", rcvq->count);
1837 				dev_err(dev, "GIVE TO CARD ANYWAY\n");
1838 			}
1839 #endif
1840 			if (paddrh == 0) {
1841 				slic_reg32_write(&adapter->slic_regs->slic_hbar,
1842 						 (u32)paddrl, DONT_FLUSH);
1843 			} else {
1844 				slic_reg64_write(adapter,
1845 					&adapter->slic_regs->slic_hbar64,
1846 					paddrl,
1847 					&adapter->slic_regs->slic_addr_upper,
1848 					paddrh, DONT_FLUSH);
1849 			}
1850 			if (rcvq->head)
1851 				rcvq->tail->next = skb;
1852 			else
1853 				rcvq->head = skb;
1854 			rcvq->tail = skb;
1855 			rcvq->count++;
1856 			i++;
1857 		} else {
1858 			dev_err(&adapter->netdev->dev,
1859 				"slic_rcvqueue_fill could only get [%d] skbuffs\n",
1860 				i);
1861 			break;
1862 		}
1863 	}
1864 	return i;
1865 }
1866 
slic_rcvqueue_free(struct adapter * adapter)1867 static void slic_rcvqueue_free(struct adapter *adapter)
1868 {
1869 	struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1870 	struct sk_buff *skb;
1871 
1872 	while (rcvq->head) {
1873 		skb = rcvq->head;
1874 		rcvq->head = rcvq->head->next;
1875 		dev_kfree_skb(skb);
1876 	}
1877 	rcvq->tail = NULL;
1878 	rcvq->head = NULL;
1879 	rcvq->count = 0;
1880 }
1881 
slic_rcvqueue_init(struct adapter * adapter)1882 static int slic_rcvqueue_init(struct adapter *adapter)
1883 {
1884 	int i, count;
1885 	struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1886 
1887 	ASSERT(adapter->state == ADAPT_DOWN);
1888 	rcvq->tail = NULL;
1889 	rcvq->head = NULL;
1890 	rcvq->size = SLIC_RCVQ_ENTRIES;
1891 	rcvq->errors = 0;
1892 	rcvq->count = 0;
1893 	i = (SLIC_RCVQ_ENTRIES / SLIC_RCVQ_FILLENTRIES);
1894 	count = 0;
1895 	while (i) {
1896 		count += slic_rcvqueue_fill(adapter);
1897 		i--;
1898 	}
1899 	if (rcvq->count < SLIC_RCVQ_MINENTRIES) {
1900 		slic_rcvqueue_free(adapter);
1901 		return -ENOMEM;
1902 	}
1903 	return 0;
1904 }
1905 
slic_rcvqueue_getnext(struct adapter * adapter)1906 static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter)
1907 {
1908 	struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1909 	struct sk_buff *skb;
1910 	struct slic_rcvbuf *rcvbuf;
1911 	int count;
1912 
1913 	if (rcvq->count) {
1914 		skb = rcvq->head;
1915 		rcvbuf = (struct slic_rcvbuf *)skb->head;
1916 		ASSERT(rcvbuf);
1917 
1918 		if (rcvbuf->status & IRHDDR_SVALID) {
1919 			rcvq->head = rcvq->head->next;
1920 			skb->next = NULL;
1921 			rcvq->count--;
1922 		} else {
1923 			skb = NULL;
1924 		}
1925 	} else {
1926 		dev_err(&adapter->netdev->dev,
1927 			"RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq, rcvq->count);
1928 		skb = NULL;
1929 	}
1930 	while (rcvq->count < SLIC_RCVQ_FILLTHRESH) {
1931 		count = slic_rcvqueue_fill(adapter);
1932 		if (!count)
1933 			break;
1934 	}
1935 	if (skb)
1936 		rcvq->errors = 0;
1937 	return skb;
1938 }
1939 
slic_rcvqueue_reinsert(struct adapter * adapter,struct sk_buff * skb)1940 static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb)
1941 {
1942 	struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1943 	void *paddr;
1944 	u32 paddrl;
1945 	u32 paddrh;
1946 	struct slic_rcvbuf *rcvbuf = (struct slic_rcvbuf *)skb->head;
1947 	struct device *dev;
1948 
1949 	ASSERT(skb->len == SLIC_RCVBUF_HEADSIZE);
1950 
1951 	paddr = (void *)pci_map_single(adapter->pcidev, skb->head,
1952 				  SLIC_RCVQ_RCVBUFSIZE, PCI_DMA_FROMDEVICE);
1953 	rcvbuf->status = 0;
1954 	skb->next = NULL;
1955 
1956 	paddrl = SLIC_GET_ADDR_LOW(paddr);
1957 	paddrh = SLIC_GET_ADDR_HIGH(paddr);
1958 
1959 	if (paddrl == 0) {
1960 		dev = &adapter->netdev->dev;
1961 		dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1962 			__func__);
1963 		dev_err(dev, "skb[%p] PROBLEM\n", skb);
1964 		dev_err(dev, "         skbdata[%p]\n", skb->data);
1965 		dev_err(dev, "         skblen[%x]\n", skb->len);
1966 		dev_err(dev, "         paddr[%p]\n", paddr);
1967 		dev_err(dev, "         paddrl[%x]\n", paddrl);
1968 		dev_err(dev, "         paddrh[%x]\n", paddrh);
1969 		dev_err(dev, "         rcvq->head[%p]\n", rcvq->head);
1970 		dev_err(dev, "         rcvq->tail[%p]\n", rcvq->tail);
1971 		dev_err(dev, "         rcvq->count[%x]\n", rcvq->count);
1972 	}
1973 	if (paddrh == 0) {
1974 		slic_reg32_write(&adapter->slic_regs->slic_hbar, (u32)paddrl,
1975 				 DONT_FLUSH);
1976 	} else {
1977 		slic_reg64_write(adapter, &adapter->slic_regs->slic_hbar64,
1978 				 paddrl, &adapter->slic_regs->slic_addr_upper,
1979 				 paddrh, DONT_FLUSH);
1980 	}
1981 	if (rcvq->head)
1982 		rcvq->tail->next = skb;
1983 	else
1984 		rcvq->head = skb;
1985 	rcvq->tail = skb;
1986 	rcvq->count++;
1987 	return rcvq->count;
1988 }
1989 
slic_debug_card_show(struct seq_file * seq,void * v)1990 static int slic_debug_card_show(struct seq_file *seq, void *v)
1991 {
1992 #ifdef MOOKTODO
1993 	int i;
1994 	struct sliccard *card = seq->private;
1995 	struct slic_config *config = &card->config;
1996 	unsigned char *fru = (unsigned char *)(&card->config.atk_fru);
1997 	unsigned char *oemfru = (unsigned char *)(&card->config.OemFru);
1998 #endif
1999 
2000 	seq_printf(seq, "driver_version           : %s\n", slic_proc_version);
2001 	seq_printf(seq, "Microcode versions:           \n");
2002 	seq_printf(seq, "    Gigabit (gb)         : %s %s\n",
2003 		    MOJAVE_UCODE_VERS_STRING, MOJAVE_UCODE_VERS_DATE);
2004 	seq_printf(seq, "    Gigabit Receiver     : %s %s\n",
2005 		    GB_RCVUCODE_VERS_STRING, GB_RCVUCODE_VERS_DATE);
2006 	seq_printf(seq, "Vendor                   : %s\n", slic_vendor);
2007 	seq_printf(seq, "Product Name             : %s\n", slic_product_name);
2008 #ifdef MOOKTODO
2009 	seq_printf(seq, "VendorId                 : %4.4X\n",
2010 		    config->VendorId);
2011 	seq_printf(seq, "DeviceId                 : %4.4X\n",
2012 		    config->DeviceId);
2013 	seq_printf(seq, "RevisionId               : %2.2x\n",
2014 		    config->RevisionId);
2015 	seq_printf(seq, "Bus    #                 : %d\n", card->busnumber);
2016 	seq_printf(seq, "Device #                 : %d\n", card->slotnumber);
2017 	seq_printf(seq, "Interfaces               : %d\n", card->card_size);
2018 	seq_printf(seq, "     Initialized         : %d\n",
2019 		    card->adapters_activated);
2020 	seq_printf(seq, "     Allocated           : %d\n",
2021 		    card->adapters_allocated);
2022 	ASSERT(card->card_size <= SLIC_NBR_MACS);
2023 	for (i = 0; i < card->card_size; i++) {
2024 		seq_printf(seq,
2025 			   "     MAC%d : %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n",
2026 			   i, config->macinfo[i].macaddrA[0],
2027 			   config->macinfo[i].macaddrA[1],
2028 			   config->macinfo[i].macaddrA[2],
2029 			   config->macinfo[i].macaddrA[3],
2030 			   config->macinfo[i].macaddrA[4],
2031 			   config->macinfo[i].macaddrA[5]);
2032 	}
2033 	seq_printf(seq, "     IF  Init State Duplex/Speed irq\n");
2034 	seq_printf(seq, "     -------------------------------\n");
2035 	for (i = 0; i < card->adapters_allocated; i++) {
2036 		struct adapter *adapter;
2037 
2038 		adapter = card->adapter[i];
2039 		if (adapter) {
2040 			seq_printf(seq,
2041 				    "     %d   %d   %s  %s  %s    0x%X\n",
2042 				    adapter->physport, adapter->state,
2043 				    SLIC_LINKSTATE(adapter->linkstate),
2044 				    SLIC_DUPLEX(adapter->linkduplex),
2045 				    SLIC_SPEED(adapter->linkspeed),
2046 				    (uint) adapter->irq);
2047 		}
2048 	}
2049 	seq_printf(seq, "Generation #             : %4.4X\n", card->gennumber);
2050 	seq_printf(seq, "RcvQ max entries         : %4.4X\n",
2051 		    SLIC_RCVQ_ENTRIES);
2052 	seq_printf(seq, "Ping Status              : %8.8X\n",
2053 		    card->pingstatus);
2054 	seq_printf(seq, "Minimum grant            : %2.2x\n",
2055 		    config->MinGrant);
2056 	seq_printf(seq, "Maximum Latency          : %2.2x\n", config->MaxLat);
2057 	seq_printf(seq, "PciStatus                : %4.4x\n",
2058 		    config->Pcistatus);
2059 	seq_printf(seq, "Debug Device Id          : %4.4x\n",
2060 		    config->DbgDevId);
2061 	seq_printf(seq, "DRAM ROM Function        : %4.4x\n",
2062 		    config->DramRomFn);
2063 	seq_printf(seq, "Network interface Pin 1  : %2.2x\n",
2064 		    config->NetIntPin1);
2065 	seq_printf(seq, "Network interface Pin 2  : %2.2x\n",
2066 		    config->NetIntPin1);
2067 	seq_printf(seq, "Network interface Pin 3  : %2.2x\n",
2068 		    config->NetIntPin1);
2069 	seq_printf(seq, "PM capabilities          : %4.4X\n",
2070 		    config->PMECapab);
2071 	seq_printf(seq, "Network Clock Controls   : %4.4X\n",
2072 		    config->NwClkCtrls);
2073 
2074 	switch (config->FruFormat) {
2075 	case ATK_FRU_FORMAT:
2076 		{
2077 			seq_printf(seq,
2078 			    "Vendor                   : Alacritech, Inc.\n");
2079 			seq_printf(seq,
2080 			    "Assembly #               : %c%c%c%c%c%c\n",
2081 				    fru[0], fru[1], fru[2], fru[3], fru[4],
2082 				    fru[5]);
2083 			seq_printf(seq,
2084 				    "Revision #               : %c%c\n",
2085 				    fru[6], fru[7]);
2086 
2087 			if (config->OEMFruFormat == VENDOR4_FRU_FORMAT) {
2088 				seq_printf(seq,
2089 					    "Serial   #               : "
2090 					    "%c%c%c%c%c%c%c%c%c%c%c%c\n",
2091 					    fru[8], fru[9], fru[10],
2092 					    fru[11], fru[12], fru[13],
2093 					    fru[16], fru[17], fru[18],
2094 					    fru[19], fru[20], fru[21]);
2095 			} else {
2096 				seq_printf(seq,
2097 					    "Serial   #               : "
2098 					    "%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
2099 					    fru[8], fru[9], fru[10],
2100 					    fru[11], fru[12], fru[13],
2101 					    fru[14], fru[15], fru[16],
2102 					    fru[17], fru[18], fru[19],
2103 					    fru[20], fru[21]);
2104 			}
2105 			break;
2106 		}
2107 
2108 	default:
2109 		{
2110 			seq_printf(seq,
2111 			    "Vendor                   : Alacritech, Inc.\n");
2112 			seq_printf(seq,
2113 			    "Serial   #               : Empty FRU\n");
2114 			break;
2115 		}
2116 	}
2117 
2118 	switch (config->OEMFruFormat) {
2119 	case VENDOR1_FRU_FORMAT:
2120 		{
2121 			seq_printf(seq, "FRU Information:\n");
2122 			seq_printf(seq, "    Commodity #          : %c\n",
2123 				    oemfru[0]);
2124 			seq_printf(seq,
2125 				    "    Assembly #           : %c%c%c%c\n",
2126 				    oemfru[1], oemfru[2], oemfru[3], oemfru[4]);
2127 			seq_printf(seq,
2128 				    "    Revision #           : %c%c\n",
2129 				    oemfru[5], oemfru[6]);
2130 			seq_printf(seq,
2131 				    "    Supplier #           : %c%c\n",
2132 				    oemfru[7], oemfru[8]);
2133 			seq_printf(seq,
2134 				    "    Date                 : %c%c\n",
2135 				    oemfru[9], oemfru[10]);
2136 			seq_sprintf(seq,
2137 				    "    Sequence #           : %c%c%c\n",
2138 				    oemfru[11], oemfru[12], oemfru[13]);
2139 			break;
2140 		}
2141 
2142 	case VENDOR2_FRU_FORMAT:
2143 		{
2144 			seq_printf(seq, "FRU Information:\n");
2145 			seq_printf(seq,
2146 				    "    Part     #           : "
2147 				    "%c%c%c%c%c%c%c%c\n",
2148 				    oemfru[0], oemfru[1], oemfru[2],
2149 				    oemfru[3], oemfru[4], oemfru[5],
2150 				    oemfru[6], oemfru[7]);
2151 			seq_printf(seq,
2152 				    "    Supplier #           : %c%c%c%c%c\n",
2153 				    oemfru[8], oemfru[9], oemfru[10],
2154 				    oemfru[11], oemfru[12]);
2155 			seq_printf(seq,
2156 				    "    Date                 : %c%c%c\n",
2157 				    oemfru[13], oemfru[14], oemfru[15]);
2158 			seq_sprintf(seq,
2159 				    "    Sequence #           : %c%c%c%c\n",
2160 				    oemfru[16], oemfru[17], oemfru[18],
2161 				    oemfru[19]);
2162 			break;
2163 		}
2164 
2165 	case VENDOR3_FRU_FORMAT:
2166 		{
2167 			seq_printf(seq, "FRU Information:\n");
2168 		}
2169 
2170 	case VENDOR4_FRU_FORMAT:
2171 		{
2172 			seq_printf(seq, "FRU Information:\n");
2173 			seq_printf(seq,
2174 				    "    FRU Number           : "
2175 				    "%c%c%c%c%c%c%c%c\n",
2176 				    oemfru[0], oemfru[1], oemfru[2],
2177 				    oemfru[3], oemfru[4], oemfru[5],
2178 				    oemfru[6], oemfru[7]);
2179 			seq_sprintf(seq,
2180 				    "    Part Number          : "
2181 				    "%c%c%c%c%c%c%c%c\n",
2182 				    oemfru[8], oemfru[9], oemfru[10],
2183 				    oemfru[11], oemfru[12], oemfru[13],
2184 				    oemfru[14], oemfru[15]);
2185 			seq_printf(seq,
2186 				    "    EC Level             : "
2187 				    "%c%c%c%c%c%c%c%c\n",
2188 				    oemfru[16], oemfru[17], oemfru[18],
2189 				    oemfru[19], oemfru[20], oemfru[21],
2190 				    oemfru[22], oemfru[23]);
2191 			break;
2192 		}
2193 
2194 	default:
2195 		break;
2196 	}
2197 #endif
2198 
2199 	return 0;
2200 }
2201 
slic_debug_adapter_show(struct seq_file * seq,void * v)2202 static int slic_debug_adapter_show(struct seq_file *seq, void *v)
2203 {
2204 	struct adapter *adapter = seq->private;
2205 	struct net_device *netdev = adapter->netdev;
2206 
2207 	seq_printf(seq, "info: interface          : %s\n",
2208 			    adapter->netdev->name);
2209 	seq_printf(seq, "info: status             : %s\n",
2210 		SLIC_LINKSTATE(adapter->linkstate));
2211 	seq_printf(seq, "info: port               : %d\n",
2212 		adapter->physport);
2213 	seq_printf(seq, "info: speed              : %s\n",
2214 		SLIC_SPEED(adapter->linkspeed));
2215 	seq_printf(seq, "info: duplex             : %s\n",
2216 		SLIC_DUPLEX(adapter->linkduplex));
2217 	seq_printf(seq, "info: irq                : 0x%X\n",
2218 		(uint) adapter->irq);
2219 	seq_printf(seq, "info: Interrupt Agg Delay: %d usec\n",
2220 		adapter->card->loadlevel_current);
2221 	seq_printf(seq, "info: RcvQ max entries   : %4.4X\n",
2222 		SLIC_RCVQ_ENTRIES);
2223 	seq_printf(seq, "info: RcvQ current       : %4.4X\n",
2224 		    adapter->rcvqueue.count);
2225 	seq_printf(seq, "rx stats: packets                  : %8.8lX\n",
2226 		    netdev->stats.rx_packets);
2227 	seq_printf(seq, "rx stats: bytes                    : %8.8lX\n",
2228 		    netdev->stats.rx_bytes);
2229 	seq_printf(seq, "rx stats: broadcasts               : %8.8X\n",
2230 		    adapter->rcv_broadcasts);
2231 	seq_printf(seq, "rx stats: multicasts               : %8.8X\n",
2232 		    adapter->rcv_multicasts);
2233 	seq_printf(seq, "rx stats: unicasts                 : %8.8X\n",
2234 		    adapter->rcv_unicasts);
2235 	seq_printf(seq, "rx stats: errors                   : %8.8X\n",
2236 		    (u32) adapter->slic_stats.iface.rcv_errors);
2237 	seq_printf(seq, "rx stats: Missed errors            : %8.8X\n",
2238 		    (u32) adapter->slic_stats.iface.rcv_discards);
2239 	seq_printf(seq, "rx stats: drops                    : %8.8X\n",
2240 			(u32) adapter->rcv_drops);
2241 	seq_printf(seq, "tx stats: packets                  : %8.8lX\n",
2242 			netdev->stats.tx_packets);
2243 	seq_printf(seq, "tx stats: bytes                    : %8.8lX\n",
2244 			netdev->stats.tx_bytes);
2245 	seq_printf(seq, "tx stats: errors                   : %8.8X\n",
2246 			(u32) adapter->slic_stats.iface.xmt_errors);
2247 	seq_printf(seq, "rx stats: multicasts               : %8.8lX\n",
2248 			netdev->stats.multicast);
2249 	seq_printf(seq, "tx stats: collision errors         : %8.8X\n",
2250 			(u32) adapter->slic_stats.iface.xmit_collisions);
2251 	seq_printf(seq, "perf: Max rcv frames/isr           : %8.8X\n",
2252 			adapter->max_isr_rcvs);
2253 	seq_printf(seq, "perf: Rcv interrupt yields         : %8.8X\n",
2254 			adapter->rcv_interrupt_yields);
2255 	seq_printf(seq, "perf: Max xmit complete/isr        : %8.8X\n",
2256 			adapter->max_isr_xmits);
2257 	seq_printf(seq, "perf: error interrupts             : %8.8X\n",
2258 			adapter->error_interrupts);
2259 	seq_printf(seq, "perf: error rmiss interrupts       : %8.8X\n",
2260 			adapter->error_rmiss_interrupts);
2261 	seq_printf(seq, "perf: rcv interrupts               : %8.8X\n",
2262 			adapter->rcv_interrupts);
2263 	seq_printf(seq, "perf: xmit interrupts              : %8.8X\n",
2264 			adapter->xmit_interrupts);
2265 	seq_printf(seq, "perf: link event interrupts        : %8.8X\n",
2266 			adapter->linkevent_interrupts);
2267 	seq_printf(seq, "perf: UPR interrupts               : %8.8X\n",
2268 			adapter->upr_interrupts);
2269 	seq_printf(seq, "perf: interrupt count              : %8.8X\n",
2270 			adapter->num_isrs);
2271 	seq_printf(seq, "perf: false interrupts             : %8.8X\n",
2272 			adapter->false_interrupts);
2273 	seq_printf(seq, "perf: All register writes          : %8.8X\n",
2274 			adapter->all_reg_writes);
2275 	seq_printf(seq, "perf: ICR register writes          : %8.8X\n",
2276 			adapter->icr_reg_writes);
2277 	seq_printf(seq, "perf: ISR register writes          : %8.8X\n",
2278 			adapter->isr_reg_writes);
2279 	seq_printf(seq, "ifevents: overflow 802 errors      : %8.8X\n",
2280 			adapter->if_events.oflow802);
2281 	seq_printf(seq, "ifevents: transport overflow errors: %8.8X\n",
2282 			adapter->if_events.Tprtoflow);
2283 	seq_printf(seq, "ifevents: underflow errors         : %8.8X\n",
2284 			adapter->if_events.uflow802);
2285 	seq_printf(seq, "ifevents: receive early            : %8.8X\n",
2286 			adapter->if_events.rcvearly);
2287 	seq_printf(seq, "ifevents: buffer overflows         : %8.8X\n",
2288 			adapter->if_events.Bufov);
2289 	seq_printf(seq, "ifevents: carrier errors           : %8.8X\n",
2290 			adapter->if_events.Carre);
2291 	seq_printf(seq, "ifevents: Long                     : %8.8X\n",
2292 			adapter->if_events.Longe);
2293 	seq_printf(seq, "ifevents: invalid preambles        : %8.8X\n",
2294 			adapter->if_events.Invp);
2295 	seq_printf(seq, "ifevents: CRC errors               : %8.8X\n",
2296 			adapter->if_events.Crc);
2297 	seq_printf(seq, "ifevents: dribble nibbles          : %8.8X\n",
2298 			adapter->if_events.Drbl);
2299 	seq_printf(seq, "ifevents: Code violations          : %8.8X\n",
2300 			adapter->if_events.Code);
2301 	seq_printf(seq, "ifevents: TCP checksum errors      : %8.8X\n",
2302 			adapter->if_events.TpCsum);
2303 	seq_printf(seq, "ifevents: TCP header short errors  : %8.8X\n",
2304 			adapter->if_events.TpHlen);
2305 	seq_printf(seq, "ifevents: IP checksum errors       : %8.8X\n",
2306 			adapter->if_events.IpCsum);
2307 	seq_printf(seq, "ifevents: IP frame incompletes     : %8.8X\n",
2308 			adapter->if_events.IpLen);
2309 	seq_printf(seq, "ifevents: IP headers shorts        : %8.8X\n",
2310 			adapter->if_events.IpHlen);
2311 
2312 	return 0;
2313 }
slic_debug_adapter_open(struct inode * inode,struct file * file)2314 static int slic_debug_adapter_open(struct inode *inode, struct file *file)
2315 {
2316 	return single_open(file, slic_debug_adapter_show, inode->i_private);
2317 }
2318 
slic_debug_card_open(struct inode * inode,struct file * file)2319 static int slic_debug_card_open(struct inode *inode, struct file *file)
2320 {
2321 	return single_open(file, slic_debug_card_show, inode->i_private);
2322 }
2323 
2324 static const struct file_operations slic_debug_adapter_fops = {
2325 	.owner		= THIS_MODULE,
2326 	.open		= slic_debug_adapter_open,
2327 	.read		= seq_read,
2328 	.llseek		= seq_lseek,
2329 	.release	= single_release,
2330 };
2331 
2332 static const struct file_operations slic_debug_card_fops = {
2333 	.owner		= THIS_MODULE,
2334 	.open		= slic_debug_card_open,
2335 	.read		= seq_read,
2336 	.llseek		= seq_lseek,
2337 	.release	= single_release,
2338 };
2339 
slic_debug_adapter_create(struct adapter * adapter)2340 static void slic_debug_adapter_create(struct adapter *adapter)
2341 {
2342 	struct dentry *d;
2343 	char    name[7];
2344 	struct sliccard *card = adapter->card;
2345 
2346 	if (!card->debugfs_dir)
2347 		return;
2348 
2349 	sprintf(name, "port%d", adapter->port);
2350 	d = debugfs_create_file(name, S_IRUGO,
2351 				card->debugfs_dir, adapter,
2352 				&slic_debug_adapter_fops);
2353 	if (!d || IS_ERR(d))
2354 		pr_info(PFX "%s: debugfs create failed\n", name);
2355 	else
2356 		adapter->debugfs_entry = d;
2357 }
2358 
slic_debug_adapter_destroy(struct adapter * adapter)2359 static void slic_debug_adapter_destroy(struct adapter *adapter)
2360 {
2361 	debugfs_remove(adapter->debugfs_entry);
2362 	adapter->debugfs_entry = NULL;
2363 }
2364 
slic_debug_card_create(struct sliccard * card)2365 static void slic_debug_card_create(struct sliccard *card)
2366 {
2367 	struct dentry *d;
2368 	char    name[IFNAMSIZ];
2369 
2370 	snprintf(name, sizeof(name), "slic%d", card->cardnum);
2371 	d = debugfs_create_dir(name, slic_debugfs);
2372 	if (!d || IS_ERR(d))
2373 		pr_info(PFX "%s: debugfs create dir failed\n",
2374 				name);
2375 	else {
2376 		card->debugfs_dir = d;
2377 		d = debugfs_create_file("cardinfo", S_IRUGO,
2378 				slic_debugfs, card,
2379 				&slic_debug_card_fops);
2380 		if (!d || IS_ERR(d))
2381 			pr_info(PFX "%s: debugfs create failed\n",
2382 					name);
2383 		else
2384 			card->debugfs_cardinfo = d;
2385 	}
2386 }
2387 
slic_debug_card_destroy(struct sliccard * card)2388 static void slic_debug_card_destroy(struct sliccard *card)
2389 {
2390 	int i;
2391 
2392 	for (i = 0; i < card->card_size; i++) {
2393 		struct adapter *adapter;
2394 
2395 		adapter = card->adapter[i];
2396 		if (adapter)
2397 			slic_debug_adapter_destroy(adapter);
2398 	}
2399 	if (card->debugfs_cardinfo) {
2400 		debugfs_remove(card->debugfs_cardinfo);
2401 		card->debugfs_cardinfo = NULL;
2402 	}
2403 	if (card->debugfs_dir) {
2404 		debugfs_remove(card->debugfs_dir);
2405 		card->debugfs_dir = NULL;
2406 	}
2407 }
2408 
slic_debug_init(void)2409 static void slic_debug_init(void)
2410 {
2411 	struct dentry *ent;
2412 
2413 	ent = debugfs_create_dir("slic", NULL);
2414 	if (!ent || IS_ERR(ent)) {
2415 		pr_info(PFX "debugfs create directory failed\n");
2416 		return;
2417 	}
2418 
2419 	slic_debugfs = ent;
2420 }
2421 
slic_debug_cleanup(void)2422 static void slic_debug_cleanup(void)
2423 {
2424 	if (slic_debugfs) {
2425 		debugfs_remove(slic_debugfs);
2426 		slic_debugfs = NULL;
2427 	}
2428 }
2429 
2430 /*
2431  * slic_link_event_handler -
2432  *
2433  * Initiate a link configuration sequence.  The link configuration begins
2434  * by issuing a READ_LINK_STATUS command to the Utility Processor on the
2435  * SLIC.  Since the command finishes asynchronously, the slic_upr_comlete
2436  * routine will follow it up witha UP configuration write command, which
2437  * will also complete asynchronously.
2438  *
2439  */
slic_link_event_handler(struct adapter * adapter)2440 static void slic_link_event_handler(struct adapter *adapter)
2441 {
2442 	int status;
2443 	struct slic_shmem *pshmem;
2444 
2445 	if (adapter->state != ADAPT_UP) {
2446 		/* Adapter is not operational.  Ignore.  */
2447 		return;
2448 	}
2449 
2450 	pshmem = (struct slic_shmem *)adapter->phys_shmem;
2451 
2452 #if BITS_PER_LONG == 64
2453 	status = slic_upr_request(adapter,
2454 				  SLIC_UPR_RLSR,
2455 				  SLIC_GET_ADDR_LOW(&pshmem->linkstatus),
2456 				  SLIC_GET_ADDR_HIGH(&pshmem->linkstatus),
2457 				  0, 0);
2458 #else
2459 	status = slic_upr_request(adapter, SLIC_UPR_RLSR,
2460 		(u32) &pshmem->linkstatus,	/* no 4GB wrap guaranteed */
2461 				  0, 0, 0);
2462 #endif
2463 	ASSERT(status == 0);
2464 }
2465 
slic_init_cleanup(struct adapter * adapter)2466 static void slic_init_cleanup(struct adapter *adapter)
2467 {
2468 	if (adapter->intrregistered) {
2469 		adapter->intrregistered = 0;
2470 		free_irq(adapter->netdev->irq, adapter->netdev);
2471 
2472 	}
2473 	if (adapter->pshmem) {
2474 		pci_free_consistent(adapter->pcidev,
2475 				    sizeof(struct slic_shmem),
2476 				    adapter->pshmem, adapter->phys_shmem);
2477 		adapter->pshmem = NULL;
2478 		adapter->phys_shmem = (dma_addr_t) NULL;
2479 	}
2480 
2481 	if (adapter->pingtimerset) {
2482 		adapter->pingtimerset = 0;
2483 		del_timer(&adapter->pingtimer);
2484 	}
2485 
2486 	slic_rspqueue_free(adapter);
2487 	slic_cmdq_free(adapter);
2488 	slic_rcvqueue_free(adapter);
2489 }
2490 
2491 /*
2492  *  Allocate a mcast_address structure to hold the multicast address.
2493  *  Link it in.
2494  */
slic_mcast_add_list(struct adapter * adapter,char * address)2495 static int slic_mcast_add_list(struct adapter *adapter, char *address)
2496 {
2497 	struct mcast_address *mcaddr, *mlist;
2498 
2499 	/* Check to see if it already exists */
2500 	mlist = adapter->mcastaddrs;
2501 	while (mlist) {
2502 		if (!compare_ether_addr(mlist->address, address))
2503 			return 0;
2504 		mlist = mlist->next;
2505 	}
2506 
2507 	/* Doesn't already exist.  Allocate a structure to hold it */
2508 	mcaddr = kmalloc(sizeof(struct mcast_address), GFP_ATOMIC);
2509 	if (mcaddr == NULL)
2510 		return 1;
2511 
2512 	memcpy(mcaddr->address, address, 6);
2513 
2514 	mcaddr->next = adapter->mcastaddrs;
2515 	adapter->mcastaddrs = mcaddr;
2516 
2517 	return 0;
2518 }
2519 
slic_mcast_set_list(struct net_device * dev)2520 static void slic_mcast_set_list(struct net_device *dev)
2521 {
2522 	struct adapter *adapter = netdev_priv(dev);
2523 	int status = 0;
2524 	char *addresses;
2525 	struct netdev_hw_addr *ha;
2526 
2527 	ASSERT(adapter);
2528 
2529 	netdev_for_each_mc_addr(ha, dev) {
2530 		addresses = (char *) &ha->addr;
2531 		status = slic_mcast_add_list(adapter, addresses);
2532 		if (status != 0)
2533 			break;
2534 		slic_mcast_set_bit(adapter, addresses);
2535 	}
2536 
2537 	if (adapter->devflags_prev != dev->flags) {
2538 		adapter->macopts = MAC_DIRECTED;
2539 		if (dev->flags) {
2540 			if (dev->flags & IFF_BROADCAST)
2541 				adapter->macopts |= MAC_BCAST;
2542 			if (dev->flags & IFF_PROMISC)
2543 				adapter->macopts |= MAC_PROMISC;
2544 			if (dev->flags & IFF_ALLMULTI)
2545 				adapter->macopts |= MAC_ALLMCAST;
2546 			if (dev->flags & IFF_MULTICAST)
2547 				adapter->macopts |= MAC_MCAST;
2548 		}
2549 		adapter->devflags_prev = dev->flags;
2550 		slic_config_set(adapter, true);
2551 	} else {
2552 		if (status == 0)
2553 			slic_mcast_set_mask(adapter);
2554 	}
2555 	return;
2556 }
2557 
2558 #define  XMIT_FAIL_LINK_STATE               1
2559 #define  XMIT_FAIL_ZERO_LENGTH              2
2560 #define  XMIT_FAIL_HOSTCMD_FAIL             3
2561 
slic_xmit_build_request(struct adapter * adapter,struct slic_hostcmd * hcmd,struct sk_buff * skb)2562 static void slic_xmit_build_request(struct adapter *adapter,
2563 			     struct slic_hostcmd *hcmd, struct sk_buff *skb)
2564 {
2565 	struct slic_host64_cmd *ihcmd;
2566 	ulong phys_addr;
2567 
2568 	ihcmd = &hcmd->cmd64;
2569 
2570 	ihcmd->flags = (adapter->port << IHFLG_IFSHFT);
2571 	ihcmd->command = IHCMD_XMT_REQ;
2572 	ihcmd->u.slic_buffers.totlen = skb->len;
2573 	phys_addr = pci_map_single(adapter->pcidev, skb->data, skb->len,
2574 			PCI_DMA_TODEVICE);
2575 	ihcmd->u.slic_buffers.bufs[0].paddrl = SLIC_GET_ADDR_LOW(phys_addr);
2576 	ihcmd->u.slic_buffers.bufs[0].paddrh = SLIC_GET_ADDR_HIGH(phys_addr);
2577 	ihcmd->u.slic_buffers.bufs[0].length = skb->len;
2578 #if BITS_PER_LONG == 64
2579 	hcmd->cmdsize = (u32) ((((u64)&ihcmd->u.slic_buffers.bufs[1] -
2580 				     (u64) hcmd) + 31) >> 5);
2581 #else
2582 	hcmd->cmdsize = ((((u32) &ihcmd->u.slic_buffers.bufs[1] -
2583 			   (u32) hcmd) + 31) >> 5);
2584 #endif
2585 }
2586 
slic_xmit_fail(struct adapter * adapter,struct sk_buff * skb,void * cmd,u32 skbtype,u32 status)2587 static void slic_xmit_fail(struct adapter *adapter,
2588 		    struct sk_buff *skb,
2589 		    void *cmd, u32 skbtype, u32 status)
2590 {
2591 	if (adapter->xmitq_full)
2592 		netif_stop_queue(adapter->netdev);
2593 	if ((cmd == NULL) && (status <= XMIT_FAIL_HOSTCMD_FAIL)) {
2594 		switch (status) {
2595 		case XMIT_FAIL_LINK_STATE:
2596 			dev_err(&adapter->netdev->dev,
2597 				"reject xmit skb[%p: %x] linkstate[%s] "
2598 				"adapter[%s:%d] card[%s:%d]\n",
2599 				skb, skb->pkt_type,
2600 				SLIC_LINKSTATE(adapter->linkstate),
2601 				SLIC_ADAPTER_STATE(adapter->state),
2602 				adapter->state,
2603 				SLIC_CARD_STATE(adapter->card->state),
2604 				adapter->card->state);
2605 			break;
2606 		case XMIT_FAIL_ZERO_LENGTH:
2607 			dev_err(&adapter->netdev->dev,
2608 				"xmit_start skb->len == 0 skb[%p] type[%x]\n",
2609 				skb, skb->pkt_type);
2610 			break;
2611 		case XMIT_FAIL_HOSTCMD_FAIL:
2612 			dev_err(&adapter->netdev->dev,
2613 				"xmit_start skb[%p] type[%x] No host commands "
2614 				"available\n", skb, skb->pkt_type);
2615 			break;
2616 		default:
2617 			ASSERT(0);
2618 		}
2619 	}
2620 	dev_kfree_skb(skb);
2621 	adapter->netdev->stats.tx_dropped++;
2622 }
2623 
slic_rcv_handle_error(struct adapter * adapter,struct slic_rcvbuf * rcvbuf)2624 static void slic_rcv_handle_error(struct adapter *adapter,
2625 					struct slic_rcvbuf *rcvbuf)
2626 {
2627 	struct slic_hddr_wds *hdr = (struct slic_hddr_wds *)rcvbuf->data;
2628 	struct net_device *netdev = adapter->netdev;
2629 
2630 	if (adapter->devid != SLIC_1GB_DEVICE_ID) {
2631 		if (hdr->frame_status14 & VRHSTAT_802OE)
2632 			adapter->if_events.oflow802++;
2633 		if (hdr->frame_status14 & VRHSTAT_TPOFLO)
2634 			adapter->if_events.Tprtoflow++;
2635 		if (hdr->frame_status_b14 & VRHSTATB_802UE)
2636 			adapter->if_events.uflow802++;
2637 		if (hdr->frame_status_b14 & VRHSTATB_RCVE) {
2638 			adapter->if_events.rcvearly++;
2639 			netdev->stats.rx_fifo_errors++;
2640 		}
2641 		if (hdr->frame_status_b14 & VRHSTATB_BUFF) {
2642 			adapter->if_events.Bufov++;
2643 			netdev->stats.rx_over_errors++;
2644 		}
2645 		if (hdr->frame_status_b14 & VRHSTATB_CARRE) {
2646 			adapter->if_events.Carre++;
2647 			netdev->stats.tx_carrier_errors++;
2648 		}
2649 		if (hdr->frame_status_b14 & VRHSTATB_LONGE)
2650 			adapter->if_events.Longe++;
2651 		if (hdr->frame_status_b14 & VRHSTATB_PREA)
2652 			adapter->if_events.Invp++;
2653 		if (hdr->frame_status_b14 & VRHSTATB_CRC) {
2654 			adapter->if_events.Crc++;
2655 			netdev->stats.rx_crc_errors++;
2656 		}
2657 		if (hdr->frame_status_b14 & VRHSTATB_DRBL)
2658 			adapter->if_events.Drbl++;
2659 		if (hdr->frame_status_b14 & VRHSTATB_CODE)
2660 			adapter->if_events.Code++;
2661 		if (hdr->frame_status_b14 & VRHSTATB_TPCSUM)
2662 			adapter->if_events.TpCsum++;
2663 		if (hdr->frame_status_b14 & VRHSTATB_TPHLEN)
2664 			adapter->if_events.TpHlen++;
2665 		if (hdr->frame_status_b14 & VRHSTATB_IPCSUM)
2666 			adapter->if_events.IpCsum++;
2667 		if (hdr->frame_status_b14 & VRHSTATB_IPLERR)
2668 			adapter->if_events.IpLen++;
2669 		if (hdr->frame_status_b14 & VRHSTATB_IPHERR)
2670 			adapter->if_events.IpHlen++;
2671 	} else {
2672 		if (hdr->frame_statusGB & VGBSTAT_XPERR) {
2673 			u32 xerr = hdr->frame_statusGB >> VGBSTAT_XERRSHFT;
2674 
2675 			if (xerr == VGBSTAT_XCSERR)
2676 				adapter->if_events.TpCsum++;
2677 			if (xerr == VGBSTAT_XUFLOW)
2678 				adapter->if_events.Tprtoflow++;
2679 			if (xerr == VGBSTAT_XHLEN)
2680 				adapter->if_events.TpHlen++;
2681 		}
2682 		if (hdr->frame_statusGB & VGBSTAT_NETERR) {
2683 			u32 nerr =
2684 			    (hdr->
2685 			     frame_statusGB >> VGBSTAT_NERRSHFT) &
2686 			    VGBSTAT_NERRMSK;
2687 			if (nerr == VGBSTAT_NCSERR)
2688 				adapter->if_events.IpCsum++;
2689 			if (nerr == VGBSTAT_NUFLOW)
2690 				adapter->if_events.IpLen++;
2691 			if (nerr == VGBSTAT_NHLEN)
2692 				adapter->if_events.IpHlen++;
2693 		}
2694 		if (hdr->frame_statusGB & VGBSTAT_LNKERR) {
2695 			u32 lerr = hdr->frame_statusGB & VGBSTAT_LERRMSK;
2696 
2697 			if (lerr == VGBSTAT_LDEARLY)
2698 				adapter->if_events.rcvearly++;
2699 			if (lerr == VGBSTAT_LBOFLO)
2700 				adapter->if_events.Bufov++;
2701 			if (lerr == VGBSTAT_LCODERR)
2702 				adapter->if_events.Code++;
2703 			if (lerr == VGBSTAT_LDBLNBL)
2704 				adapter->if_events.Drbl++;
2705 			if (lerr == VGBSTAT_LCRCERR)
2706 				adapter->if_events.Crc++;
2707 			if (lerr == VGBSTAT_LOFLO)
2708 				adapter->if_events.oflow802++;
2709 			if (lerr == VGBSTAT_LUFLO)
2710 				adapter->if_events.uflow802++;
2711 		}
2712 	}
2713 	return;
2714 }
2715 
2716 #define TCP_OFFLOAD_FRAME_PUSHFLAG  0x10000000
2717 #define M_FAST_PATH                 0x0040
2718 
slic_rcv_handler(struct adapter * adapter)2719 static void slic_rcv_handler(struct adapter *adapter)
2720 {
2721 	struct net_device *netdev = adapter->netdev;
2722 	struct sk_buff *skb;
2723 	struct slic_rcvbuf *rcvbuf;
2724 	u32 frames = 0;
2725 
2726 	while ((skb = slic_rcvqueue_getnext(adapter))) {
2727 		u32 rx_bytes;
2728 
2729 		ASSERT(skb->head);
2730 		rcvbuf = (struct slic_rcvbuf *)skb->head;
2731 		adapter->card->events++;
2732 		if (rcvbuf->status & IRHDDR_ERR) {
2733 			adapter->rx_errors++;
2734 			slic_rcv_handle_error(adapter, rcvbuf);
2735 			slic_rcvqueue_reinsert(adapter, skb);
2736 			continue;
2737 		}
2738 
2739 		if (!slic_mac_filter(adapter, (struct ether_header *)
2740 					rcvbuf->data)) {
2741 			slic_rcvqueue_reinsert(adapter, skb);
2742 			continue;
2743 		}
2744 		skb_pull(skb, SLIC_RCVBUF_HEADSIZE);
2745 		rx_bytes = (rcvbuf->length & IRHDDR_FLEN_MSK);
2746 		skb_put(skb, rx_bytes);
2747 		netdev->stats.rx_packets++;
2748 		netdev->stats.rx_bytes += rx_bytes;
2749 #if SLIC_OFFLOAD_IP_CHECKSUM
2750 		skb->ip_summed = CHECKSUM_UNNECESSARY;
2751 #endif
2752 
2753 		skb->dev = adapter->netdev;
2754 		skb->protocol = eth_type_trans(skb, skb->dev);
2755 		netif_rx(skb);
2756 
2757 		++frames;
2758 #if SLIC_INTERRUPT_PROCESS_LIMIT
2759 		if (frames >= SLIC_RCVQ_MAX_PROCESS_ISR) {
2760 			adapter->rcv_interrupt_yields++;
2761 			break;
2762 		}
2763 #endif
2764 	}
2765 	adapter->max_isr_rcvs = max(adapter->max_isr_rcvs, frames);
2766 }
2767 
slic_xmit_complete(struct adapter * adapter)2768 static void slic_xmit_complete(struct adapter *adapter)
2769 {
2770 	struct slic_hostcmd *hcmd;
2771 	struct slic_rspbuf *rspbuf;
2772 	u32 frames = 0;
2773 	struct slic_handle_word slic_handle_word;
2774 
2775 	do {
2776 		rspbuf = slic_rspqueue_getnext(adapter);
2777 		if (!rspbuf)
2778 			break;
2779 		adapter->xmit_completes++;
2780 		adapter->card->events++;
2781 		/*
2782 		 Get the complete host command buffer
2783 		*/
2784 		slic_handle_word.handle_token = rspbuf->hosthandle;
2785 		ASSERT(slic_handle_word.handle_index);
2786 		ASSERT(slic_handle_word.handle_index <= SLIC_CMDQ_MAXCMDS);
2787 		hcmd =
2788 		    (struct slic_hostcmd *)
2789 			adapter->slic_handles[slic_handle_word.handle_index].
2790 									address;
2791 /*      hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */
2792 		ASSERT(hcmd);
2793 		ASSERT(hcmd->pslic_handle ==
2794 		       &adapter->slic_handles[slic_handle_word.handle_index]);
2795 		if (hcmd->type == SLIC_CMD_DUMB) {
2796 			if (hcmd->skb)
2797 				dev_kfree_skb_irq(hcmd->skb);
2798 			slic_cmdq_putdone_irq(adapter, hcmd);
2799 		}
2800 		rspbuf->status = 0;
2801 		rspbuf->hosthandle = 0;
2802 		frames++;
2803 	} while (1);
2804 	adapter->max_isr_xmits = max(adapter->max_isr_xmits, frames);
2805 }
2806 
slic_interrupt(int irq,void * dev_id)2807 static irqreturn_t slic_interrupt(int irq, void *dev_id)
2808 {
2809 	struct net_device *dev = (struct net_device *)dev_id;
2810 	struct adapter *adapter = netdev_priv(dev);
2811 	u32 isr;
2812 
2813 	if ((adapter->pshmem) && (adapter->pshmem->isr)) {
2814 		slic_reg32_write(&adapter->slic_regs->slic_icr,
2815 				 ICR_INT_MASK, FLUSH);
2816 		isr = adapter->isrcopy = adapter->pshmem->isr;
2817 		adapter->pshmem->isr = 0;
2818 		adapter->num_isrs++;
2819 		switch (adapter->card->state) {
2820 		case CARD_UP:
2821 			if (isr & ~ISR_IO) {
2822 				if (isr & ISR_ERR) {
2823 					adapter->error_interrupts++;
2824 					if (isr & ISR_RMISS) {
2825 						int count;
2826 						int pre_count;
2827 						int errors;
2828 
2829 						struct slic_rcvqueue *rcvq =
2830 						    &adapter->rcvqueue;
2831 
2832 						adapter->
2833 						    error_rmiss_interrupts++;
2834 						if (!rcvq->errors)
2835 							rcv_count = rcvq->count;
2836 						pre_count = rcvq->count;
2837 						errors = rcvq->errors;
2838 
2839 						while (rcvq->count <
2840 						       SLIC_RCVQ_FILLTHRESH) {
2841 							count =
2842 							    slic_rcvqueue_fill
2843 							    (adapter);
2844 							if (!count)
2845 								break;
2846 						}
2847 					} else if (isr & ISR_XDROP) {
2848 						dev_err(&dev->dev,
2849 							"isr & ISR_ERR [%x] "
2850 							"ISR_XDROP \n", isr);
2851 					} else {
2852 						dev_err(&dev->dev,
2853 							"isr & ISR_ERR [%x]\n",
2854 							isr);
2855 					}
2856 				}
2857 
2858 				if (isr & ISR_LEVENT) {
2859 					adapter->linkevent_interrupts++;
2860 					slic_link_event_handler(adapter);
2861 				}
2862 
2863 				if ((isr & ISR_UPC) ||
2864 				    (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
2865 					adapter->upr_interrupts++;
2866 					slic_upr_request_complete(adapter, isr);
2867 				}
2868 			}
2869 
2870 			if (isr & ISR_RCV) {
2871 				adapter->rcv_interrupts++;
2872 				slic_rcv_handler(adapter);
2873 			}
2874 
2875 			if (isr & ISR_CMD) {
2876 				adapter->xmit_interrupts++;
2877 				slic_xmit_complete(adapter);
2878 			}
2879 			break;
2880 
2881 		case CARD_DOWN:
2882 			if ((isr & ISR_UPC) ||
2883 			    (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
2884 				adapter->upr_interrupts++;
2885 				slic_upr_request_complete(adapter, isr);
2886 			}
2887 			break;
2888 
2889 		default:
2890 			break;
2891 		}
2892 
2893 		adapter->isrcopy = 0;
2894 		adapter->all_reg_writes += 2;
2895 		adapter->isr_reg_writes++;
2896 		slic_reg32_write(&adapter->slic_regs->slic_isr, 0, FLUSH);
2897 	} else {
2898 		adapter->false_interrupts++;
2899 	}
2900 	return IRQ_HANDLED;
2901 }
2902 
2903 #define NORMAL_ETHFRAME     0
2904 
slic_xmit_start(struct sk_buff * skb,struct net_device * dev)2905 static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev)
2906 {
2907 	struct sliccard *card;
2908 	struct adapter *adapter = netdev_priv(dev);
2909 	struct slic_hostcmd *hcmd = NULL;
2910 	u32 status = 0;
2911 	u32 skbtype = NORMAL_ETHFRAME;
2912 	void *offloadcmd = NULL;
2913 
2914 	card = adapter->card;
2915 	ASSERT(card);
2916 	if ((adapter->linkstate != LINK_UP) ||
2917 	    (adapter->state != ADAPT_UP) || (card->state != CARD_UP)) {
2918 		status = XMIT_FAIL_LINK_STATE;
2919 		goto xmit_fail;
2920 
2921 	} else if (skb->len == 0) {
2922 		status = XMIT_FAIL_ZERO_LENGTH;
2923 		goto xmit_fail;
2924 	}
2925 
2926 	if (skbtype == NORMAL_ETHFRAME) {
2927 		hcmd = slic_cmdq_getfree(adapter);
2928 		if (!hcmd) {
2929 			adapter->xmitq_full = 1;
2930 			status = XMIT_FAIL_HOSTCMD_FAIL;
2931 			goto xmit_fail;
2932 		}
2933 		ASSERT(hcmd->pslic_handle);
2934 		ASSERT(hcmd->cmd64.hosthandle ==
2935 		       hcmd->pslic_handle->token.handle_token);
2936 		hcmd->skb = skb;
2937 		hcmd->busy = 1;
2938 		hcmd->type = SLIC_CMD_DUMB;
2939 		if (skbtype == NORMAL_ETHFRAME)
2940 			slic_xmit_build_request(adapter, hcmd, skb);
2941 	}
2942 	dev->stats.tx_packets++;
2943 	dev->stats.tx_bytes += skb->len;
2944 
2945 #ifdef DEBUG_DUMP
2946 	if (adapter->kill_card) {
2947 		struct slic_host64_cmd ihcmd;
2948 
2949 		ihcmd = &hcmd->cmd64;
2950 
2951 		ihcmd->flags |= 0x40;
2952 		adapter->kill_card = 0;	/* only do this once */
2953 	}
2954 #endif
2955 	if (hcmd->paddrh == 0) {
2956 		slic_reg32_write(&adapter->slic_regs->slic_cbar,
2957 				 (hcmd->paddrl | hcmd->cmdsize), DONT_FLUSH);
2958 	} else {
2959 		slic_reg64_write(adapter, &adapter->slic_regs->slic_cbar64,
2960 				 (hcmd->paddrl | hcmd->cmdsize),
2961 				 &adapter->slic_regs->slic_addr_upper,
2962 				 hcmd->paddrh, DONT_FLUSH);
2963 	}
2964 xmit_done:
2965 	return NETDEV_TX_OK;
2966 xmit_fail:
2967 	slic_xmit_fail(adapter, skb, offloadcmd, skbtype, status);
2968 	goto xmit_done;
2969 }
2970 
2971 
slic_adapter_freeresources(struct adapter * adapter)2972 static void slic_adapter_freeresources(struct adapter *adapter)
2973 {
2974 	slic_init_cleanup(adapter);
2975 	adapter->error_interrupts = 0;
2976 	adapter->rcv_interrupts = 0;
2977 	adapter->xmit_interrupts = 0;
2978 	adapter->linkevent_interrupts = 0;
2979 	adapter->upr_interrupts = 0;
2980 	adapter->num_isrs = 0;
2981 	adapter->xmit_completes = 0;
2982 	adapter->rcv_broadcasts = 0;
2983 	adapter->rcv_multicasts = 0;
2984 	adapter->rcv_unicasts = 0;
2985 }
2986 
slic_adapter_allocresources(struct adapter * adapter)2987 static int slic_adapter_allocresources(struct adapter *adapter)
2988 {
2989 	if (!adapter->intrregistered) {
2990 		int retval;
2991 
2992 		spin_unlock_irqrestore(&slic_global.driver_lock.lock,
2993 					slic_global.driver_lock.flags);
2994 
2995 		retval = request_irq(adapter->netdev->irq,
2996 				     &slic_interrupt,
2997 				     IRQF_SHARED,
2998 				     adapter->netdev->name, adapter->netdev);
2999 
3000 		spin_lock_irqsave(&slic_global.driver_lock.lock,
3001 					slic_global.driver_lock.flags);
3002 
3003 		if (retval) {
3004 			dev_err(&adapter->netdev->dev,
3005 				"request_irq (%s) FAILED [%x]\n",
3006 				adapter->netdev->name, retval);
3007 			return retval;
3008 		}
3009 		adapter->intrregistered = 1;
3010 	}
3011 	return 0;
3012 }
3013 
3014 /*
3015  *  slic_if_init
3016  *
3017  *  Perform initialization of our slic interface.
3018  *
3019  */
slic_if_init(struct adapter * adapter)3020 static int slic_if_init(struct adapter *adapter)
3021 {
3022 	struct sliccard *card = adapter->card;
3023 	struct net_device *dev = adapter->netdev;
3024 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
3025 	struct slic_shmem *pshmem;
3026 	int rc;
3027 
3028 	ASSERT(card);
3029 
3030 	/* adapter should be down at this point */
3031 	if (adapter->state != ADAPT_DOWN) {
3032 		dev_err(&dev->dev, "%s: adapter->state != ADAPT_DOWN\n",
3033 			__func__);
3034 		rc = -EIO;
3035 		goto err;
3036 	}
3037 	ASSERT(adapter->linkstate == LINK_DOWN);
3038 
3039 	adapter->devflags_prev = dev->flags;
3040 	adapter->macopts = MAC_DIRECTED;
3041 	if (dev->flags) {
3042 		if (dev->flags & IFF_BROADCAST)
3043 			adapter->macopts |= MAC_BCAST;
3044 		if (dev->flags & IFF_PROMISC)
3045 			adapter->macopts |= MAC_PROMISC;
3046 		if (dev->flags & IFF_ALLMULTI)
3047 			adapter->macopts |= MAC_ALLMCAST;
3048 		if (dev->flags & IFF_MULTICAST)
3049 			adapter->macopts |= MAC_MCAST;
3050 	}
3051 	rc = slic_adapter_allocresources(adapter);
3052 	if (rc) {
3053 		dev_err(&dev->dev,
3054 			"%s: slic_adapter_allocresources FAILED %x\n",
3055 			__func__, rc);
3056 		slic_adapter_freeresources(adapter);
3057 		goto err;
3058 	}
3059 
3060 	if (!adapter->queues_initialized) {
3061 		if ((rc = slic_rspqueue_init(adapter)))
3062 			goto err;
3063 		if ((rc = slic_cmdq_init(adapter)))
3064 			goto err;
3065 		if ((rc = slic_rcvqueue_init(adapter)))
3066 			goto err;
3067 		adapter->queues_initialized = 1;
3068 	}
3069 
3070 	slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
3071 	mdelay(1);
3072 
3073 	if (!adapter->isp_initialized) {
3074 		pshmem = (struct slic_shmem *)adapter->phys_shmem;
3075 
3076 		spin_lock_irqsave(&adapter->bit64reglock.lock,
3077 					adapter->bit64reglock.flags);
3078 
3079 #if BITS_PER_LONG == 64
3080 		slic_reg32_write(&slic_regs->slic_addr_upper,
3081 				 SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH);
3082 		slic_reg32_write(&slic_regs->slic_isp,
3083 				 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);
3084 #else
3085 		slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH);
3086 		slic_reg32_write(&slic_regs->slic_isp, (u32)&pshmem->isr, FLUSH);
3087 #endif
3088 		spin_unlock_irqrestore(&adapter->bit64reglock.lock,
3089 					adapter->bit64reglock.flags);
3090 		adapter->isp_initialized = 1;
3091 	}
3092 
3093 	adapter->state = ADAPT_UP;
3094 	if (!card->loadtimerset) {
3095 		init_timer(&card->loadtimer);
3096 		card->loadtimer.expires =
3097 		    jiffies + (SLIC_LOADTIMER_PERIOD * HZ);
3098 		card->loadtimer.data = (ulong) card;
3099 		card->loadtimer.function = &slic_timer_load_check;
3100 		add_timer(&card->loadtimer);
3101 
3102 		card->loadtimerset = 1;
3103 	}
3104 
3105 	if (!adapter->pingtimerset) {
3106 		init_timer(&adapter->pingtimer);
3107 		adapter->pingtimer.expires =
3108 		    jiffies + (PING_TIMER_INTERVAL * HZ);
3109 		adapter->pingtimer.data = (ulong) dev;
3110 		adapter->pingtimer.function = &slic_timer_ping;
3111 		add_timer(&adapter->pingtimer);
3112 		adapter->pingtimerset = 1;
3113 		adapter->card->pingstatus = ISR_PINGMASK;
3114 	}
3115 
3116 	/*
3117 	 *    clear any pending events, then enable interrupts
3118 	 */
3119 	adapter->isrcopy = 0;
3120 	adapter->pshmem->isr = 0;
3121 	slic_reg32_write(&slic_regs->slic_isr, 0, FLUSH);
3122 	slic_reg32_write(&slic_regs->slic_icr, ICR_INT_ON, FLUSH);
3123 
3124 	slic_link_config(adapter, LINK_AUTOSPEED, LINK_AUTOD);
3125 	slic_link_event_handler(adapter);
3126 
3127 err:
3128 	return rc;
3129 }
3130 
slic_entry_open(struct net_device * dev)3131 static int slic_entry_open(struct net_device *dev)
3132 {
3133 	struct adapter *adapter = netdev_priv(dev);
3134 	struct sliccard *card = adapter->card;
3135 	u32 locked = 0;
3136 	int status;
3137 
3138 	ASSERT(adapter);
3139 	ASSERT(card);
3140 
3141 	netif_stop_queue(adapter->netdev);
3142 
3143 	spin_lock_irqsave(&slic_global.driver_lock.lock,
3144 				slic_global.driver_lock.flags);
3145 	locked = 1;
3146 	if (!adapter->activated) {
3147 		card->adapters_activated++;
3148 		slic_global.num_slic_ports_active++;
3149 		adapter->activated = 1;
3150 	}
3151 	status = slic_if_init(adapter);
3152 
3153 	if (status != 0) {
3154 		if (adapter->activated) {
3155 			card->adapters_activated--;
3156 			slic_global.num_slic_ports_active--;
3157 			adapter->activated = 0;
3158 		}
3159 		if (locked) {
3160 			spin_unlock_irqrestore(&slic_global.driver_lock.lock,
3161 						slic_global.driver_lock.flags);
3162 			locked = 0;
3163 		}
3164 		return status;
3165 	}
3166 	if (!card->master)
3167 		card->master = adapter;
3168 
3169 	if (locked) {
3170 		spin_unlock_irqrestore(&slic_global.driver_lock.lock,
3171 					slic_global.driver_lock.flags);
3172 		locked = 0;
3173 	}
3174 
3175 	return 0;
3176 }
3177 
slic_card_cleanup(struct sliccard * card)3178 static void slic_card_cleanup(struct sliccard *card)
3179 {
3180 	if (card->loadtimerset) {
3181 		card->loadtimerset = 0;
3182 		del_timer(&card->loadtimer);
3183 	}
3184 
3185 	slic_debug_card_destroy(card);
3186 
3187 	kfree(card);
3188 }
3189 
slic_entry_remove(struct pci_dev * pcidev)3190 static void __devexit slic_entry_remove(struct pci_dev *pcidev)
3191 {
3192 	struct net_device *dev = pci_get_drvdata(pcidev);
3193 	u32 mmio_start = 0;
3194 	uint mmio_len = 0;
3195 	struct adapter *adapter = netdev_priv(dev);
3196 	struct sliccard *card;
3197 	struct mcast_address *mcaddr, *mlist;
3198 
3199 	ASSERT(adapter);
3200 	slic_adapter_freeresources(adapter);
3201 	slic_unmap_mmio_space(adapter);
3202 	unregister_netdev(dev);
3203 
3204 	mmio_start = pci_resource_start(pcidev, 0);
3205 	mmio_len = pci_resource_len(pcidev, 0);
3206 
3207 	release_mem_region(mmio_start, mmio_len);
3208 
3209 	iounmap((void __iomem *)dev->base_addr);
3210 	/* free multicast addresses */
3211 	mlist = adapter->mcastaddrs;
3212 	while (mlist) {
3213 		mcaddr = mlist;
3214 		mlist = mlist->next;
3215 		kfree(mcaddr);
3216 	}
3217 	ASSERT(adapter->card);
3218 	card = adapter->card;
3219 	ASSERT(card->adapters_allocated);
3220 	card->adapters_allocated--;
3221 	adapter->allocated = 0;
3222 	if (!card->adapters_allocated) {
3223 		struct sliccard *curr_card = slic_global.slic_card;
3224 		if (curr_card == card) {
3225 			slic_global.slic_card = card->next;
3226 		} else {
3227 			while (curr_card->next != card)
3228 				curr_card = curr_card->next;
3229 			ASSERT(curr_card);
3230 			curr_card->next = card->next;
3231 		}
3232 		ASSERT(slic_global.num_slic_cards);
3233 		slic_global.num_slic_cards--;
3234 		slic_card_cleanup(card);
3235 	}
3236 	free_netdev(dev);
3237 	pci_release_regions(pcidev);
3238 }
3239 
slic_entry_halt(struct net_device * dev)3240 static int slic_entry_halt(struct net_device *dev)
3241 {
3242 	struct adapter *adapter = netdev_priv(dev);
3243 	struct sliccard *card = adapter->card;
3244 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
3245 
3246 	spin_lock_irqsave(&slic_global.driver_lock.lock,
3247 				slic_global.driver_lock.flags);
3248 	ASSERT(card);
3249 	netif_stop_queue(adapter->netdev);
3250 	adapter->state = ADAPT_DOWN;
3251 	adapter->linkstate = LINK_DOWN;
3252 	adapter->upr_list = NULL;
3253 	adapter->upr_busy = 0;
3254 	adapter->devflags_prev = 0;
3255 	ASSERT(card->adapter[adapter->cardindex] == adapter);
3256 	slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
3257 	adapter->all_reg_writes++;
3258 	adapter->icr_reg_writes++;
3259 	slic_config_clear(adapter);
3260 	if (adapter->activated) {
3261 		card->adapters_activated--;
3262 		slic_global.num_slic_ports_active--;
3263 		adapter->activated = 0;
3264 	}
3265 #ifdef AUTOMATIC_RESET
3266 	slic_reg32_write(&slic_regs->slic_reset_iface, 0, FLUSH);
3267 #endif
3268 	/*
3269 	 *  Reset the adapter's cmd queues
3270 	 */
3271 	slic_cmdq_reset(adapter);
3272 
3273 #ifdef AUTOMATIC_RESET
3274 	if (!card->adapters_activated)
3275 		slic_card_init(card, adapter);
3276 #endif
3277 
3278 	spin_unlock_irqrestore(&slic_global.driver_lock.lock,
3279 				slic_global.driver_lock.flags);
3280 	return 0;
3281 }
3282 
slic_get_stats(struct net_device * dev)3283 static struct net_device_stats *slic_get_stats(struct net_device *dev)
3284 {
3285 	struct adapter *adapter = netdev_priv(dev);
3286 
3287 	ASSERT(adapter);
3288 	dev->stats.collisions = adapter->slic_stats.iface.xmit_collisions;
3289 	dev->stats.rx_errors = adapter->slic_stats.iface.rcv_errors;
3290 	dev->stats.tx_errors = adapter->slic_stats.iface.xmt_errors;
3291 	dev->stats.rx_missed_errors = adapter->slic_stats.iface.rcv_discards;
3292 	dev->stats.tx_heartbeat_errors = 0;
3293 	dev->stats.tx_aborted_errors = 0;
3294 	dev->stats.tx_window_errors = 0;
3295 	dev->stats.tx_fifo_errors = 0;
3296 	dev->stats.rx_frame_errors = 0;
3297 	dev->stats.rx_length_errors = 0;
3298 
3299 	return &dev->stats;
3300 }
3301 
slic_ioctl(struct net_device * dev,struct ifreq * rq,int cmd)3302 static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
3303 {
3304 	struct adapter *adapter = netdev_priv(dev);
3305 	struct ethtool_cmd edata;
3306 	struct ethtool_cmd ecmd;
3307 	u32 data[7];
3308 	u32 intagg;
3309 
3310 	ASSERT(rq);
3311 	switch (cmd) {
3312 	case SIOCSLICSETINTAGG:
3313 		if (copy_from_user(data, rq->ifr_data, 28))
3314 			return -EFAULT;
3315 		intagg = data[0];
3316 		dev_err(&dev->dev, "%s: set interrupt aggregation to %d\n",
3317 			__func__, intagg);
3318 		slic_intagg_set(adapter, intagg);
3319 		return 0;
3320 
3321 #ifdef SLIC_TRACE_DUMP_ENABLED
3322 	case SIOCSLICTRACEDUMP:
3323 		{
3324 			u32 value;
3325 			DBG_IOCTL("slic_ioctl  SIOCSLIC_TRACE_DUMP\n");
3326 
3327 			if (copy_from_user(data, rq->ifr_data, 28)) {
3328 				PRINT_ERROR
3329 				    ("slic: copy_from_user FAILED getting initial simba param\n");
3330 				return -EFAULT;
3331 			}
3332 
3333 			value = data[0];
3334 			if (tracemon_request == SLIC_DUMP_DONE) {
3335 				PRINT_ERROR
3336 				    ("ATK Diagnostic Trace Dump Requested\n");
3337 				tracemon_request = SLIC_DUMP_REQUESTED;
3338 				tracemon_request_type = value;
3339 				tracemon_timestamp = jiffies;
3340 			} else if ((tracemon_request == SLIC_DUMP_REQUESTED) ||
3341 				   (tracemon_request ==
3342 				    SLIC_DUMP_IN_PROGRESS)) {
3343 				PRINT_ERROR
3344 				    ("ATK Diagnostic Trace Dump Requested but already in progress... ignore\n");
3345 			} else {
3346 				PRINT_ERROR
3347 				    ("ATK Diagnostic Trace Dump Requested\n");
3348 				tracemon_request = SLIC_DUMP_REQUESTED;
3349 				tracemon_request_type = value;
3350 				tracemon_timestamp = jiffies;
3351 			}
3352 			return 0;
3353 		}
3354 #endif
3355 	case SIOCETHTOOL:
3356 		ASSERT(adapter);
3357 		if (copy_from_user(&ecmd, rq->ifr_data, sizeof(ecmd)))
3358 			return -EFAULT;
3359 
3360 		if (ecmd.cmd == ETHTOOL_GSET) {
3361 			edata.supported = (SUPPORTED_10baseT_Half |
3362 					   SUPPORTED_10baseT_Full |
3363 					   SUPPORTED_100baseT_Half |
3364 					   SUPPORTED_100baseT_Full |
3365 					   SUPPORTED_Autoneg | SUPPORTED_MII);
3366 			edata.port = PORT_MII;
3367 			edata.transceiver = XCVR_INTERNAL;
3368 			edata.phy_address = 0;
3369 			if (adapter->linkspeed == LINK_100MB)
3370 				edata.speed = SPEED_100;
3371 			else if (adapter->linkspeed == LINK_10MB)
3372 				edata.speed = SPEED_10;
3373 			else
3374 				edata.speed = 0;
3375 
3376 			if (adapter->linkduplex == LINK_FULLD)
3377 				edata.duplex = DUPLEX_FULL;
3378 			else
3379 				edata.duplex = DUPLEX_HALF;
3380 
3381 			edata.autoneg = AUTONEG_ENABLE;
3382 			edata.maxtxpkt = 1;
3383 			edata.maxrxpkt = 1;
3384 			if (copy_to_user(rq->ifr_data, &edata, sizeof(edata)))
3385 				return -EFAULT;
3386 
3387 		} else if (ecmd.cmd == ETHTOOL_SSET) {
3388 			if (!capable(CAP_NET_ADMIN))
3389 				return -EPERM;
3390 
3391 			if (adapter->linkspeed == LINK_100MB)
3392 				edata.speed = SPEED_100;
3393 			else if (adapter->linkspeed == LINK_10MB)
3394 				edata.speed = SPEED_10;
3395 			else
3396 				edata.speed = 0;
3397 
3398 			if (adapter->linkduplex == LINK_FULLD)
3399 				edata.duplex = DUPLEX_FULL;
3400 			else
3401 				edata.duplex = DUPLEX_HALF;
3402 
3403 			edata.autoneg = AUTONEG_ENABLE;
3404 			edata.maxtxpkt = 1;
3405 			edata.maxrxpkt = 1;
3406 			if ((ecmd.speed != edata.speed) ||
3407 			    (ecmd.duplex != edata.duplex)) {
3408 				u32 speed;
3409 				u32 duplex;
3410 
3411 				if (ecmd.speed == SPEED_10)
3412 					speed = 0;
3413 				else
3414 					speed = PCR_SPEED_100;
3415 				if (ecmd.duplex == DUPLEX_FULL)
3416 					duplex = PCR_DUPLEX_FULL;
3417 				else
3418 					duplex = 0;
3419 				slic_link_config(adapter, speed, duplex);
3420 				slic_link_event_handler(adapter);
3421 			}
3422 		}
3423 		return 0;
3424 	default:
3425 		return -EOPNOTSUPP;
3426 	}
3427 }
3428 
slic_config_pci(struct pci_dev * pcidev)3429 static void slic_config_pci(struct pci_dev *pcidev)
3430 {
3431 	u16 pci_command;
3432 	u16 new_command;
3433 
3434 	pci_read_config_word(pcidev, PCI_COMMAND, &pci_command);
3435 
3436 	new_command = pci_command | PCI_COMMAND_MASTER
3437 	    | PCI_COMMAND_MEMORY
3438 	    | PCI_COMMAND_INVALIDATE
3439 	    | PCI_COMMAND_PARITY | PCI_COMMAND_SERR | PCI_COMMAND_FAST_BACK;
3440 	if (pci_command != new_command)
3441 		pci_write_config_word(pcidev, PCI_COMMAND, new_command);
3442 }
3443 
slic_card_init(struct sliccard * card,struct adapter * adapter)3444 static int slic_card_init(struct sliccard *card, struct adapter *adapter)
3445 {
3446 	__iomem struct slic_regs *slic_regs = adapter->slic_regs;
3447 	struct slic_eeprom *peeprom;
3448 	struct oslic_eeprom *pOeeprom;
3449 	dma_addr_t phys_config;
3450 	u32 phys_configh;
3451 	u32 phys_configl;
3452 	u32 i = 0;
3453 	struct slic_shmem *pshmem;
3454 	int status;
3455 	uint macaddrs = card->card_size;
3456 	ushort eecodesize;
3457 	ushort dramsize;
3458 	ushort ee_chksum;
3459 	ushort calc_chksum;
3460 	struct slic_config_mac *pmac;
3461 	unsigned char fruformat;
3462 	unsigned char oemfruformat;
3463 	struct atk_fru *patkfru;
3464 	union oemfru *poemfru;
3465 
3466 	/* Reset everything except PCI configuration space */
3467 	slic_soft_reset(adapter);
3468 
3469 	/* Download the microcode */
3470 	status = slic_card_download(adapter);
3471 
3472 	if (status != 0) {
3473 		dev_err(&adapter->pcidev->dev,
3474 			"download failed bus %d slot %d\n",
3475 			adapter->busnumber, adapter->slotnumber);
3476 		return status;
3477 	}
3478 
3479 	if (!card->config_set) {
3480 		peeprom = pci_alloc_consistent(adapter->pcidev,
3481 					       sizeof(struct slic_eeprom),
3482 					       &phys_config);
3483 
3484 		phys_configl = SLIC_GET_ADDR_LOW(phys_config);
3485 		phys_configh = SLIC_GET_ADDR_HIGH(phys_config);
3486 
3487 		if (!peeprom) {
3488 			dev_err(&adapter->pcidev->dev,
3489 				"eeprom read failed to get memory "
3490 				"bus %d slot %d\n", adapter->busnumber,
3491 				adapter->slotnumber);
3492 			return -ENOMEM;
3493 		} else {
3494 			memset(peeprom, 0, sizeof(struct slic_eeprom));
3495 		}
3496 		slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
3497 		mdelay(1);
3498 		pshmem = (struct slic_shmem *)adapter->phys_shmem;
3499 
3500 		spin_lock_irqsave(&adapter->bit64reglock.lock,
3501 					adapter->bit64reglock.flags);
3502 		slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH);
3503 		slic_reg32_write(&slic_regs->slic_isp,
3504 				 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);
3505 		spin_unlock_irqrestore(&adapter->bit64reglock.lock,
3506 					adapter->bit64reglock.flags);
3507 
3508 		slic_config_get(adapter, phys_configl, phys_configh);
3509 
3510 		for (;;) {
3511 			if (adapter->pshmem->isr) {
3512 				if (adapter->pshmem->isr & ISR_UPC) {
3513 					adapter->pshmem->isr = 0;
3514 					slic_reg64_write(adapter,
3515 						&slic_regs->slic_isp, 0,
3516 						&slic_regs->slic_addr_upper,
3517 						0, FLUSH);
3518 					slic_reg32_write(&slic_regs->slic_isr,
3519 							 0, FLUSH);
3520 
3521 					slic_upr_request_complete(adapter, 0);
3522 					break;
3523 				} else {
3524 					adapter->pshmem->isr = 0;
3525 					slic_reg32_write(&slic_regs->slic_isr,
3526 							 0, FLUSH);
3527 				}
3528 			} else {
3529 				mdelay(1);
3530 				i++;
3531 				if (i > 5000) {
3532 					dev_err(&adapter->pcidev->dev,
3533 						"%d config data fetch timed out!\n",
3534 						adapter->port);
3535 					slic_reg64_write(adapter,
3536 						&slic_regs->slic_isp, 0,
3537 						&slic_regs->slic_addr_upper,
3538 						0, FLUSH);
3539 					return -EINVAL;
3540 				}
3541 			}
3542 		}
3543 
3544 		switch (adapter->devid) {
3545 		/* Oasis card */
3546 		case SLIC_2GB_DEVICE_ID:
3547 			/* extract EEPROM data and pointers to EEPROM data */
3548 			pOeeprom = (struct oslic_eeprom *) peeprom;
3549 			eecodesize = pOeeprom->EecodeSize;
3550 			dramsize = pOeeprom->DramSize;
3551 			pmac = pOeeprom->MacInfo;
3552 			fruformat = pOeeprom->FruFormat;
3553 			patkfru = &pOeeprom->AtkFru;
3554 			oemfruformat = pOeeprom->OemFruFormat;
3555 			poemfru = &pOeeprom->OemFru;
3556 			macaddrs = 2;
3557 			/* Minor kludge for Oasis card
3558 			     get 2 MAC addresses from the
3559 			     EEPROM to ensure that function 1
3560 			     gets the Port 1 MAC address */
3561 			break;
3562 		default:
3563 			/* extract EEPROM data and pointers to EEPROM data */
3564 			eecodesize = peeprom->EecodeSize;
3565 			dramsize = peeprom->DramSize;
3566 			pmac = peeprom->u2.mac.MacInfo;
3567 			fruformat = peeprom->FruFormat;
3568 			patkfru = &peeprom->AtkFru;
3569 			oemfruformat = peeprom->OemFruFormat;
3570 			poemfru = &peeprom->OemFru;
3571 			break;
3572 		}
3573 
3574 		card->config.EepromValid = false;
3575 
3576 		/*  see if the EEPROM is valid by checking it's checksum */
3577 		if ((eecodesize <= MAX_EECODE_SIZE) &&
3578 		    (eecodesize >= MIN_EECODE_SIZE)) {
3579 
3580 			ee_chksum =
3581 			    *(u16 *) ((char *) peeprom + (eecodesize - 2));
3582 			/*
3583 			    calculate the EEPROM checksum
3584 			*/
3585 			calc_chksum =
3586 			    ~slic_eeprom_cksum((char *) peeprom,
3587 					       (eecodesize - 2));
3588 			/*
3589 			    if the ucdoe chksum flag bit worked,
3590 			    we wouldn't need this shit
3591 			*/
3592 			if (ee_chksum == calc_chksum)
3593 				card->config.EepromValid = true;
3594 		}
3595 		/*  copy in the DRAM size */
3596 		card->config.DramSize = dramsize;
3597 
3598 		/*  copy in the MAC address(es) */
3599 		for (i = 0; i < macaddrs; i++) {
3600 			memcpy(&card->config.MacInfo[i],
3601 			       &pmac[i], sizeof(struct slic_config_mac));
3602 		}
3603 
3604 		/*  copy the Alacritech FRU information */
3605 		card->config.FruFormat = fruformat;
3606 		memcpy(&card->config.AtkFru, patkfru,
3607 						sizeof(struct atk_fru));
3608 
3609 		pci_free_consistent(adapter->pcidev,
3610 				    sizeof(struct slic_eeprom),
3611 				    peeprom, phys_config);
3612 
3613 		if ((!card->config.EepromValid) &&
3614 		    (adapter->reg_params.fail_on_bad_eeprom)) {
3615 			slic_reg64_write(adapter, &slic_regs->slic_isp, 0,
3616 					 &slic_regs->slic_addr_upper,
3617 					 0, FLUSH);
3618 			dev_err(&adapter->pcidev->dev,
3619 				"unsupported CONFIGURATION EEPROM invalid\n");
3620 			return -EINVAL;
3621 		}
3622 
3623 		card->config_set = 1;
3624 	}
3625 
3626 	if (slic_card_download_gbrcv(adapter)) {
3627 		dev_err(&adapter->pcidev->dev,
3628 			"unable to download GB receive microcode\n");
3629 		return -EINVAL;
3630 	}
3631 
3632 	if (slic_global.dynamic_intagg)
3633 		slic_intagg_set(adapter, 0);
3634 	else
3635 		slic_intagg_set(adapter, intagg_delay);
3636 
3637 	/*
3638 	 *  Initialize ping status to "ok"
3639 	 */
3640 	card->pingstatus = ISR_PINGMASK;
3641 
3642 	/*
3643 	 * Lastly, mark our card state as up and return success
3644 	 */
3645 	card->state = CARD_UP;
3646 	card->reset_in_progress = 0;
3647 
3648 	return 0;
3649 }
3650 
slic_init_driver(void)3651 static void slic_init_driver(void)
3652 {
3653 	if (slic_first_init) {
3654 		slic_first_init = 0;
3655 		spin_lock_init(&slic_global.driver_lock.lock);
3656 		slic_debug_init();
3657 	}
3658 }
3659 
slic_init_adapter(struct net_device * netdev,struct pci_dev * pcidev,const struct pci_device_id * pci_tbl_entry,void __iomem * memaddr,int chip_idx)3660 static void slic_init_adapter(struct net_device *netdev,
3661 			      struct pci_dev *pcidev,
3662 			      const struct pci_device_id *pci_tbl_entry,
3663 			      void __iomem *memaddr, int chip_idx)
3664 {
3665 	ushort index;
3666 	struct slic_handle *pslic_handle;
3667 	struct adapter *adapter = netdev_priv(netdev);
3668 
3669 /*	adapter->pcidev = pcidev;*/
3670 	adapter->vendid = pci_tbl_entry->vendor;
3671 	adapter->devid = pci_tbl_entry->device;
3672 	adapter->subsysid = pci_tbl_entry->subdevice;
3673 	adapter->busnumber = pcidev->bus->number;
3674 	adapter->slotnumber = ((pcidev->devfn >> 3) & 0x1F);
3675 	adapter->functionnumber = (pcidev->devfn & 0x7);
3676 	adapter->memorylength = pci_resource_len(pcidev, 0);
3677 	adapter->slic_regs = (__iomem struct slic_regs *)memaddr;
3678 	adapter->irq = pcidev->irq;
3679 /*	adapter->netdev = netdev;*/
3680 	adapter->next_netdevice = head_netdevice;
3681 	head_netdevice = netdev;
3682 	adapter->chipid = chip_idx;
3683 	adapter->port = 0;	/*adapter->functionnumber;*/
3684 	adapter->cardindex = adapter->port;
3685 	adapter->memorybase = memaddr;
3686 	spin_lock_init(&adapter->upr_lock.lock);
3687 	spin_lock_init(&adapter->bit64reglock.lock);
3688 	spin_lock_init(&adapter->adapter_lock.lock);
3689 	spin_lock_init(&adapter->reset_lock.lock);
3690 	spin_lock_init(&adapter->handle_lock.lock);
3691 
3692 	adapter->card_size = 1;
3693 	/*
3694 	  Initialize slic_handle array
3695 	*/
3696 	ASSERT(SLIC_CMDQ_MAXCMDS <= 0xFFFF);
3697 	/*
3698 	 Start with 1.  0 is an invalid host handle.
3699 	*/
3700 	for (index = 1, pslic_handle = &adapter->slic_handles[1];
3701 	     index < SLIC_CMDQ_MAXCMDS; index++, pslic_handle++) {
3702 
3703 		pslic_handle->token.handle_index = index;
3704 		pslic_handle->type = SLIC_HANDLE_FREE;
3705 		pslic_handle->next = adapter->pfree_slic_handles;
3706 		adapter->pfree_slic_handles = pslic_handle;
3707 	}
3708 	adapter->pshmem = (struct slic_shmem *)
3709 					pci_alloc_consistent(adapter->pcidev,
3710 					sizeof(struct slic_shmem),
3711 					&adapter->
3712 					phys_shmem);
3713 	ASSERT(adapter->pshmem);
3714 
3715 	memset(adapter->pshmem, 0, sizeof(struct slic_shmem));
3716 
3717 	return;
3718 }
3719 
3720 static const struct net_device_ops slic_netdev_ops = {
3721 	.ndo_open		= slic_entry_open,
3722 	.ndo_stop		= slic_entry_halt,
3723 	.ndo_start_xmit		= slic_xmit_start,
3724 	.ndo_do_ioctl		= slic_ioctl,
3725 	.ndo_set_mac_address	= slic_mac_set_address,
3726 	.ndo_get_stats		= slic_get_stats,
3727 	.ndo_set_rx_mode	= slic_mcast_set_list,
3728 	.ndo_validate_addr	= eth_validate_addr,
3729 	.ndo_change_mtu		= eth_change_mtu,
3730 };
3731 
slic_card_locate(struct adapter * adapter)3732 static u32 slic_card_locate(struct adapter *adapter)
3733 {
3734 	struct sliccard *card = slic_global.slic_card;
3735 	struct physcard *physcard = slic_global.phys_card;
3736 	ushort card_hostid;
3737 	u16 __iomem *hostid_reg;
3738 	uint i;
3739 	uint rdhostid_offset = 0;
3740 
3741 	switch (adapter->devid) {
3742 	case SLIC_2GB_DEVICE_ID:
3743 		rdhostid_offset = SLIC_RDHOSTID_2GB;
3744 		break;
3745 	case SLIC_1GB_DEVICE_ID:
3746 		rdhostid_offset = SLIC_RDHOSTID_1GB;
3747 		break;
3748 	default:
3749 		ASSERT(0);
3750 		break;
3751 	}
3752 
3753 	hostid_reg =
3754 	    (u16 __iomem *) (((u8 __iomem *) (adapter->slic_regs)) +
3755 	    rdhostid_offset);
3756 
3757 	/* read the 16 bit hostid from SRAM */
3758 	card_hostid = (ushort) readw(hostid_reg);
3759 
3760 	/* Initialize a new card structure if need be */
3761 	if (card_hostid == SLIC_HOSTID_DEFAULT) {
3762 		card = kzalloc(sizeof(struct sliccard), GFP_KERNEL);
3763 		if (card == NULL)
3764 			return -ENOMEM;
3765 
3766 		card->next = slic_global.slic_card;
3767 		slic_global.slic_card = card;
3768 		card->busnumber = adapter->busnumber;
3769 		card->slotnumber = adapter->slotnumber;
3770 
3771 		/* Find an available cardnum */
3772 		for (i = 0; i < SLIC_MAX_CARDS; i++) {
3773 			if (slic_global.cardnuminuse[i] == 0) {
3774 				slic_global.cardnuminuse[i] = 1;
3775 				card->cardnum = i;
3776 				break;
3777 			}
3778 		}
3779 		slic_global.num_slic_cards++;
3780 
3781 		slic_debug_card_create(card);
3782 	} else {
3783 		/* Card exists, find the card this adapter belongs to */
3784 		while (card) {
3785 			if (card->cardnum == card_hostid)
3786 				break;
3787 			card = card->next;
3788 		}
3789 	}
3790 
3791 	ASSERT(card);
3792 	if (!card)
3793 		return -ENXIO;
3794 	/* Put the adapter in the card's adapter list */
3795 	ASSERT(card->adapter[adapter->port] == NULL);
3796 	if (!card->adapter[adapter->port]) {
3797 		card->adapter[adapter->port] = adapter;
3798 		adapter->card = card;
3799 	}
3800 
3801 	card->card_size = 1;	/* one port per *logical* card */
3802 
3803 	while (physcard) {
3804 		for (i = 0; i < SLIC_MAX_PORTS; i++) {
3805 			if (!physcard->adapter[i])
3806 				continue;
3807 			else
3808 				break;
3809 		}
3810 		ASSERT(i != SLIC_MAX_PORTS);
3811 		if (physcard->adapter[i]->slotnumber == adapter->slotnumber)
3812 			break;
3813 		physcard = physcard->next;
3814 	}
3815 	if (!physcard) {
3816 		/* no structure allocated for this physical card yet */
3817 		physcard = kzalloc(sizeof(struct physcard), GFP_ATOMIC);
3818 		ASSERT(physcard);
3819 
3820 		physcard->next = slic_global.phys_card;
3821 		slic_global.phys_card = physcard;
3822 		physcard->adapters_allocd = 1;
3823 	} else {
3824 		physcard->adapters_allocd++;
3825 	}
3826 	/* Note - this is ZERO relative */
3827 	adapter->physport = physcard->adapters_allocd - 1;
3828 
3829 	ASSERT(physcard->adapter[adapter->physport] == NULL);
3830 	physcard->adapter[adapter->physport] = adapter;
3831 	adapter->physcard = physcard;
3832 
3833 	return 0;
3834 }
3835 
slic_entry_probe(struct pci_dev * pcidev,const struct pci_device_id * pci_tbl_entry)3836 static int __devinit slic_entry_probe(struct pci_dev *pcidev,
3837 			       const struct pci_device_id *pci_tbl_entry)
3838 {
3839 	static int cards_found;
3840 	static int did_version;
3841 	int err = -ENODEV;
3842 	struct net_device *netdev;
3843 	struct adapter *adapter;
3844 	void __iomem *memmapped_ioaddr = NULL;
3845 	u32 status = 0;
3846 	ulong mmio_start = 0;
3847 	ulong mmio_len = 0;
3848 	struct sliccard *card = NULL;
3849 	int pci_using_dac = 0;
3850 
3851 	slic_global.dynamic_intagg = dynamic_intagg;
3852 
3853 	err = pci_enable_device(pcidev);
3854 
3855 	if (err)
3856 		return err;
3857 
3858 	if (slic_debug > 0 && did_version++ == 0) {
3859 		printk(KERN_DEBUG "%s\n", slic_banner);
3860 		printk(KERN_DEBUG "%s\n", slic_proc_version);
3861 	}
3862 
3863 	if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) {
3864 		pci_using_dac = 1;
3865 		if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) {
3866 			dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for "
3867 					"consistent allocations\n");
3868 			goto err_out_disable_pci;
3869 		}
3870 	} else if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) {
3871 		pci_using_dac = 0;
3872 		pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32));
3873 	} else {
3874 		dev_err(&pcidev->dev, "no usable DMA configuration\n");
3875 		goto err_out_disable_pci;
3876 	}
3877 
3878 	err = pci_request_regions(pcidev, DRV_NAME);
3879 	if (err) {
3880 		dev_err(&pcidev->dev, "can't obtain PCI resources\n");
3881 		goto err_out_disable_pci;
3882 	}
3883 
3884 	pci_set_master(pcidev);
3885 
3886 	netdev = alloc_etherdev(sizeof(struct adapter));
3887 	if (!netdev) {
3888 		err = -ENOMEM;
3889 		goto err_out_exit_slic_probe;
3890 	}
3891 
3892 	SET_NETDEV_DEV(netdev, &pcidev->dev);
3893 
3894 	pci_set_drvdata(pcidev, netdev);
3895 	adapter = netdev_priv(netdev);
3896 	adapter->netdev = netdev;
3897 	adapter->pcidev = pcidev;
3898 	if (pci_using_dac)
3899 		netdev->features |= NETIF_F_HIGHDMA;
3900 
3901 	mmio_start = pci_resource_start(pcidev, 0);
3902 	mmio_len = pci_resource_len(pcidev, 0);
3903 
3904 
3905 /*	memmapped_ioaddr =  (u32)ioremap_nocache(mmio_start, mmio_len);*/
3906 	memmapped_ioaddr = ioremap(mmio_start, mmio_len);
3907 	if (!memmapped_ioaddr) {
3908 		dev_err(&pcidev->dev, "cannot remap MMIO region %lx @ %lx\n",
3909 			mmio_len, mmio_start);
3910 		goto err_out_free_netdev;
3911 	}
3912 
3913 	slic_config_pci(pcidev);
3914 
3915 	slic_init_driver();
3916 
3917 	slic_init_adapter(netdev,
3918 			  pcidev, pci_tbl_entry, memmapped_ioaddr, cards_found);
3919 
3920 	status = slic_card_locate(adapter);
3921 	if (status) {
3922 		dev_err(&pcidev->dev, "cannot locate card\n");
3923 		goto err_out_free_mmio_region;
3924 	}
3925 
3926 	card = adapter->card;
3927 
3928 	if (!adapter->allocated) {
3929 		card->adapters_allocated++;
3930 		adapter->allocated = 1;
3931 	}
3932 
3933 	status = slic_card_init(card, adapter);
3934 
3935 	if (status != 0) {
3936 		card->state = CARD_FAIL;
3937 		adapter->state = ADAPT_FAIL;
3938 		adapter->linkstate = LINK_DOWN;
3939 		dev_err(&pcidev->dev, "FAILED status[%x]\n", status);
3940 	} else {
3941 		slic_adapter_set_hwaddr(adapter);
3942 	}
3943 
3944 	netdev->base_addr = (unsigned long)adapter->memorybase;
3945 	netdev->irq = adapter->irq;
3946 	netdev->netdev_ops = &slic_netdev_ops;
3947 
3948 	slic_debug_adapter_create(adapter);
3949 
3950 	strcpy(netdev->name, "eth%d");
3951 	err = register_netdev(netdev);
3952 	if (err) {
3953 		dev_err(&pcidev->dev, "Cannot register net device, aborting.\n");
3954 		goto err_out_unmap;
3955 	}
3956 
3957 	cards_found++;
3958 
3959 	return status;
3960 
3961 err_out_unmap:
3962 	iounmap(memmapped_ioaddr);
3963 err_out_free_mmio_region:
3964 	release_mem_region(mmio_start, mmio_len);
3965 err_out_free_netdev:
3966 	free_netdev(netdev);
3967 err_out_exit_slic_probe:
3968 	pci_release_regions(pcidev);
3969 err_out_disable_pci:
3970 	pci_disable_device(pcidev);
3971 	return err;
3972 }
3973 
3974 static struct pci_driver slic_driver = {
3975 	.name = DRV_NAME,
3976 	.id_table = slic_pci_tbl,
3977 	.probe = slic_entry_probe,
3978 	.remove = __devexit_p(slic_entry_remove),
3979 };
3980 
slic_module_init(void)3981 static int __init slic_module_init(void)
3982 {
3983 	slic_init_driver();
3984 
3985 	if (debug >= 0 && slic_debug != debug)
3986 		printk(KERN_DEBUG KBUILD_MODNAME ": debug level is %d.\n",
3987 		       debug);
3988 	if (debug >= 0)
3989 		slic_debug = debug;
3990 
3991 	return pci_register_driver(&slic_driver);
3992 }
3993 
slic_module_cleanup(void)3994 static void __exit slic_module_cleanup(void)
3995 {
3996 	pci_unregister_driver(&slic_driver);
3997 	slic_debug_cleanup();
3998 }
3999 
4000 module_init(slic_module_init);
4001 module_exit(slic_module_cleanup);
4002