GNU Linux-libre 4.4.288-gnu1
[releases.git] / drivers / staging / slicoss / slicoss.c
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 actually 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 #define KLUDGE_FOR_4GB_BOUNDARY         1
58 #define DEBUG_MICROCODE                 1
59 #define DBG                             1
60 #define SLIC_INTERRUPT_PROCESS_LIMIT    1
61 #define SLIC_OFFLOAD_IP_CHECKSUM                1
62 #define STATS_TIMER_INTERVAL                    2
63 #define PING_TIMER_INTERVAL                         1
64 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
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/crc32.h>
80 #include <linux/etherdevice.h>
81 #include <linux/skbuff.h>
82 #include <linux/delay.h>
83 #include <linux/seq_file.h>
84 #include <linux/kthread.h>
85 #include <linux/module.h>
86
87 #include <linux/firmware.h>
88 #include <linux/types.h>
89 #include <linux/dma-mapping.h>
90 #include <linux/mii.h>
91 #include <linux/if_vlan.h>
92 #include <asm/unaligned.h>
93
94 #include <linux/ethtool.h>
95 #include <linux/uaccess.h>
96 #include "slichw.h"
97 #include "slic.h"
98
99 static uint slic_first_init = 1;
100 static char *slic_banner = "Alacritech SLIC Technology(tm) Server and Storage Accelerator (Non-Accelerated)";
101
102 static char *slic_proc_version = "2.0.351  2006/07/14 12:26:00";
103
104 static struct base_driver slic_global = { {}, 0, 0, 0, 1, NULL, NULL };
105 static int intagg_delay = 100;
106 static u32 dynamic_intagg;
107 static unsigned int rcv_count;
108
109 #define DRV_NAME          "slicoss"
110 #define DRV_VERSION       "2.0.1"
111 #define DRV_AUTHOR        "Alacritech, Inc. Engineering"
112 #define DRV_DESCRIPTION   "Alacritech SLIC Techonology(tm) "\
113                 "Non-Accelerated Driver"
114 #define DRV_COPYRIGHT     "Copyright  2000-2006 Alacritech, Inc. "\
115                 "All rights reserved."
116 #define PFX                DRV_NAME " "
117
118 MODULE_AUTHOR(DRV_AUTHOR);
119 MODULE_DESCRIPTION(DRV_DESCRIPTION);
120 MODULE_LICENSE("Dual BSD/GPL");
121
122 module_param(dynamic_intagg, int, 0);
123 MODULE_PARM_DESC(dynamic_intagg, "Dynamic Interrupt Aggregation Setting");
124 module_param(intagg_delay, int, 0);
125 MODULE_PARM_DESC(intagg_delay, "uSec Interrupt Aggregation Delay");
126
127 static const struct pci_device_id slic_pci_tbl[] = {
128         { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_1GB_DEVICE_ID) },
129         { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_2GB_DEVICE_ID) },
130         { 0 }
131 };
132
133 MODULE_DEVICE_TABLE(pci, slic_pci_tbl);
134
135 static inline void slic_reg32_write(void __iomem *reg, u32 value, bool flush)
136 {
137         writel(value, reg);
138         if (flush)
139                 mb();
140 }
141
142 static inline void slic_reg64_write(struct adapter *adapter, void __iomem *reg,
143                                     u32 value, void __iomem *regh, u32 paddrh,
144                                     bool flush)
145 {
146         unsigned long flags;
147
148         spin_lock_irqsave(&adapter->bit64reglock, flags);
149         writel(paddrh, regh);
150         writel(value, reg);
151         if (flush)
152                 mb();
153         spin_unlock_irqrestore(&adapter->bit64reglock, flags);
154 }
155
156 static void slic_mcast_set_bit(struct adapter *adapter, char *address)
157 {
158         unsigned char crcpoly;
159
160         /* Get the CRC polynomial for the mac address */
161         /*
162          * we use bits 1-8 (lsb), bitwise reversed,
163          * msb (= lsb bit 0 before bitrev) is automatically discarded
164          */
165         crcpoly = ether_crc(ETH_ALEN, address) >> 23;
166
167         /*
168          * We only have space on the SLIC for 64 entries.  Lop
169          * off the top two bits. (2^6 = 64)
170          */
171         crcpoly &= 0x3F;
172
173         /* OR in the new bit into our 64 bit mask. */
174         adapter->mcastmask |= (u64)1 << crcpoly;
175 }
176
177 static void slic_mcast_set_mask(struct adapter *adapter)
178 {
179         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
180
181         if (adapter->macopts & (MAC_ALLMCAST | MAC_PROMISC)) {
182                 /*
183                  * Turn on all multicast addresses. We have to do this for
184                  * promiscuous mode as well as ALLMCAST mode.  It saves the
185                  * Microcode from having to keep state about the MAC
186                  * configuration.
187                  */
188                 slic_reg32_write(&slic_regs->slic_mcastlow, 0xFFFFFFFF, FLUSH);
189                 slic_reg32_write(&slic_regs->slic_mcasthigh, 0xFFFFFFFF,
190                                  FLUSH);
191         } else {
192                 /*
193                  * Commit our multicast mast to the SLIC by writing to the
194                  * multicast address mask registers
195                  */
196                 slic_reg32_write(&slic_regs->slic_mcastlow,
197                         (u32)(adapter->mcastmask & 0xFFFFFFFF), FLUSH);
198                 slic_reg32_write(&slic_regs->slic_mcasthigh,
199                         (u32)((adapter->mcastmask >> 32) & 0xFFFFFFFF), FLUSH);
200         }
201 }
202
203 static void slic_timer_ping(ulong dev)
204 {
205         struct adapter *adapter;
206         struct sliccard *card;
207
208         adapter = netdev_priv((struct net_device *)dev);
209         card = adapter->card;
210
211         adapter->pingtimer.expires = jiffies + (PING_TIMER_INTERVAL * HZ);
212         add_timer(&adapter->pingtimer);
213 }
214
215 static void slic_unmap_mmio_space(struct adapter *adapter)
216 {
217         if (adapter->slic_regs)
218                 iounmap(adapter->slic_regs);
219         adapter->slic_regs = NULL;
220 }
221
222 /*
223  *  slic_link_config
224  *
225  *  Write phy control to configure link duplex/speed
226  *
227  */
228 static void slic_link_config(struct adapter *adapter,
229                       u32 linkspeed, u32 linkduplex)
230 {
231         u32 __iomem *wphy;
232         u32 speed;
233         u32 duplex;
234         u32 phy_config;
235         u32 phy_advreg;
236         u32 phy_gctlreg;
237
238         if (adapter->state != ADAPT_UP)
239                 return;
240
241         if (linkspeed > LINK_1000MB)
242                 linkspeed = LINK_AUTOSPEED;
243         if (linkduplex > LINK_AUTOD)
244                 linkduplex = LINK_AUTOD;
245
246         wphy = &adapter->slic_regs->slic_wphy;
247
248         if ((linkspeed == LINK_AUTOSPEED) || (linkspeed == LINK_1000MB)) {
249                 if (adapter->flags & ADAPT_FLAGS_FIBERMEDIA) {
250                         /*
251                          * We've got a fiber gigabit interface, and register
252                          *  4 is different in fiber mode than in copper mode
253                          */
254
255                         /* advertise FD only @1000 Mb */
256                         phy_advreg = (MIICR_REG_4 | (PAR_ADV1000XFD));
257                         /* enable PAUSE frames        */
258                         phy_advreg |= PAR_ASYMPAUSE_FIBER;
259                         slic_reg32_write(wphy, phy_advreg, FLUSH);
260
261                         if (linkspeed == LINK_AUTOSPEED) {
262                                 /* reset phy, enable auto-neg  */
263                                 phy_config =
264                                     (MIICR_REG_PCR |
265                                      (PCR_RESET | PCR_AUTONEG |
266                                       PCR_AUTONEG_RST));
267                                 slic_reg32_write(wphy, phy_config, FLUSH);
268                         } else {        /* forced 1000 Mb FD*/
269                                 /*
270                                  * power down phy to break link
271                                  * this may not work)
272                                  */
273                                 phy_config = (MIICR_REG_PCR | PCR_POWERDOWN);
274                                 slic_reg32_write(wphy, phy_config, FLUSH);
275                                 /*
276                                  * wait, Marvell says 1 sec,
277                                  * try to get away with 10 ms
278                                  */
279                                 mdelay(10);
280
281                                 /*
282                                  * disable auto-neg, set speed/duplex,
283                                  * soft reset phy, powerup
284                                  */
285                                 phy_config =
286                                     (MIICR_REG_PCR |
287                                      (PCR_RESET | PCR_SPEED_1000 |
288                                       PCR_DUPLEX_FULL));
289                                 slic_reg32_write(wphy, phy_config, FLUSH);
290                         }
291                 } else {        /* copper gigabit */
292
293                         /*
294                          * Auto-Negotiate or 1000 Mb must be auto negotiated
295                          * We've got a copper gigabit interface, and
296                          * register 4 is different in copper mode than
297                          * in fiber mode
298                          */
299                         if (linkspeed == LINK_AUTOSPEED) {
300                                 /* advertise 10/100 Mb modes   */
301                                 phy_advreg =
302                                     (MIICR_REG_4 |
303                                      (PAR_ADV100FD | PAR_ADV100HD | PAR_ADV10FD
304                                       | PAR_ADV10HD));
305                         } else {
306                         /*
307                          * linkspeed == LINK_1000MB -
308                          * don't advertise 10/100 Mb modes
309                          */
310                                 phy_advreg = MIICR_REG_4;
311                         }
312                         /* enable PAUSE frames  */
313                         phy_advreg |= PAR_ASYMPAUSE;
314                         /* required by the Cicada PHY  */
315                         phy_advreg |= PAR_802_3;
316                         slic_reg32_write(wphy, phy_advreg, FLUSH);
317                         /* advertise FD only @1000 Mb  */
318                         phy_gctlreg = (MIICR_REG_9 | (PGC_ADV1000FD));
319                         slic_reg32_write(wphy, phy_gctlreg, FLUSH);
320
321                         if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
322                                 /*
323                                  * if a Marvell PHY
324                                  * enable auto crossover
325                                  */
326                                 phy_config =
327                                     (MIICR_REG_16 | (MRV_REG16_XOVERON));
328                                 slic_reg32_write(wphy, phy_config, FLUSH);
329
330                                 /* reset phy, enable auto-neg  */
331                                 phy_config =
332                                     (MIICR_REG_PCR |
333                                      (PCR_RESET | PCR_AUTONEG |
334                                       PCR_AUTONEG_RST));
335                                 slic_reg32_write(wphy, phy_config, FLUSH);
336                         } else {        /* it's a Cicada PHY  */
337                                 /* enable and restart auto-neg (don't reset)  */
338                                 phy_config =
339                                     (MIICR_REG_PCR |
340                                      (PCR_AUTONEG | PCR_AUTONEG_RST));
341                                 slic_reg32_write(wphy, phy_config, FLUSH);
342                         }
343                 }
344         } else {
345                 /* Forced 10/100  */
346                 if (linkspeed == LINK_10MB)
347                         speed = 0;
348                 else
349                         speed = PCR_SPEED_100;
350                 if (linkduplex == LINK_HALFD)
351                         duplex = 0;
352                 else
353                         duplex = PCR_DUPLEX_FULL;
354
355                 if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
356                         /*
357                          * if a Marvell PHY
358                          * disable auto crossover
359                          */
360                         phy_config = (MIICR_REG_16 | (MRV_REG16_XOVEROFF));
361                         slic_reg32_write(wphy, phy_config, FLUSH);
362                 }
363
364                 /* power down phy to break link (this may not work)  */
365                 phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN | speed | duplex));
366                 slic_reg32_write(wphy, phy_config, FLUSH);
367
368                 /* wait, Marvell says 1 sec, try to get away with 10 ms */
369                 mdelay(10);
370
371                 if (adapter->subsysid != SLIC_1GB_CICADA_SUBSYS_ID) {
372                         /*
373                          * if a Marvell PHY
374                          * disable auto-neg, set speed,
375                          * soft reset phy, powerup
376                          */
377                         phy_config =
378                             (MIICR_REG_PCR | (PCR_RESET | speed | duplex));
379                         slic_reg32_write(wphy, phy_config, FLUSH);
380                 } else {        /* it's a Cicada PHY  */
381                         /* disable auto-neg, set speed, powerup  */
382                         phy_config = (MIICR_REG_PCR | (speed | duplex));
383                         slic_reg32_write(wphy, phy_config, FLUSH);
384                 }
385         }
386 }
387
388 static int slic_card_download_gbrcv(struct adapter *adapter)
389 {
390         const struct firmware *fw;
391         const char *file = "";
392         int ret;
393         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
394         u32 codeaddr;
395         u32 instruction;
396         int index = 0;
397         u32 rcvucodelen = 0;
398
399         switch (adapter->devid) {
400         case SLIC_2GB_DEVICE_ID:
401                 file = "/*(DEBLOBBED)*/";
402                 break;
403         case SLIC_1GB_DEVICE_ID:
404                 file = "/*(DEBLOBBED)*/";
405                 break;
406         default:
407                 return -ENOENT;
408         }
409
410         ret = reject_firmware(&fw, file, &adapter->pcidev->dev);
411         if (ret) {
412                 dev_err(&adapter->pcidev->dev,
413                         "Failed to load firmware %s\n", file);
414                 return ret;
415         }
416
417         rcvucodelen = *(u32 *)(fw->data + index);
418         index += 4;
419         switch (adapter->devid) {
420         case SLIC_2GB_DEVICE_ID:
421                 if (rcvucodelen != OasisRcvUCodeLen) {
422                         release_firmware(fw);
423                         return -EINVAL;
424                 }
425                 break;
426         case SLIC_1GB_DEVICE_ID:
427                 if (rcvucodelen != GBRcvUCodeLen) {
428                         release_firmware(fw);
429                         return -EINVAL;
430                 }
431                 break;
432         }
433         /* start download */
434         slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_BEGIN, FLUSH);
435         /* download the rcv sequencer ucode */
436         for (codeaddr = 0; codeaddr < rcvucodelen; codeaddr++) {
437                 /* write out instruction address */
438                 slic_reg32_write(&slic_regs->slic_rcv_wcs, codeaddr, FLUSH);
439
440                 instruction = *(u32 *)(fw->data + index);
441                 index += 4;
442                 /* write out the instruction data low addr */
443                 slic_reg32_write(&slic_regs->slic_rcv_wcs, instruction, FLUSH);
444
445                 instruction = *(u8 *)(fw->data + index);
446                 index++;
447                 /* write out the instruction data high addr */
448                 slic_reg32_write(&slic_regs->slic_rcv_wcs, (u8)instruction,
449                                  FLUSH);
450         }
451
452         /* download finished */
453         release_firmware(fw);
454         slic_reg32_write(&slic_regs->slic_rcv_wcs, SLIC_RCVWCS_FINISH, FLUSH);
455         return 0;
456 }
457
458 /*(DEBLOBBED)*/
459
460 static int slic_card_download(struct adapter *adapter)
461 {
462         const struct firmware *fw;
463         const char *file = "";
464         int ret;
465         u32 section;
466         int thissectionsize;
467         int codeaddr;
468         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
469         u32 instruction;
470         u32 baseaddress;
471         u32 i;
472         u32 numsects = 0;
473         u32 sectsize[3];
474         u32 sectstart[3];
475         int ucode_start, index = 0;
476
477         switch (adapter->devid) {
478         case SLIC_2GB_DEVICE_ID:
479                 file = "/*(DEBLOBBED)*/";
480                 break;
481         case SLIC_1GB_DEVICE_ID:
482                 file = "/*(DEBLOBBED)*/";
483                 break;
484         default:
485                 return -ENOENT;
486         }
487         ret = reject_firmware(&fw, file, &adapter->pcidev->dev);
488         if (ret) {
489                 dev_err(&adapter->pcidev->dev,
490                         "Failed to load firmware %s\n", file);
491                 return ret;
492         }
493         numsects = *(u32 *)(fw->data + index);
494         index += 4;
495         for (i = 0; i < numsects; i++) {
496                 sectsize[i] = *(u32 *)(fw->data + index);
497                 index += 4;
498         }
499         for (i = 0; i < numsects; i++) {
500                 sectstart[i] = *(u32 *)(fw->data + index);
501                 index += 4;
502         }
503         ucode_start = index;
504         instruction = *(u32 *)(fw->data + index);
505         index += 4;
506         for (section = 0; section < numsects; section++) {
507                 baseaddress = sectstart[section];
508                 thissectionsize = sectsize[section] >> 3;
509
510                 for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) {
511                         /* Write out instruction address */
512                         slic_reg32_write(&slic_regs->slic_wcs,
513                                          baseaddress + codeaddr, FLUSH);
514                         /* Write out instruction to low addr */
515                         slic_reg32_write(&slic_regs->slic_wcs,
516                                         instruction, FLUSH);
517                         instruction = *(u32 *)(fw->data + index);
518                         index += 4;
519
520                         /* Write out instruction to high addr */
521                         slic_reg32_write(&slic_regs->slic_wcs,
522                                         instruction, FLUSH);
523                         instruction = *(u32 *)(fw->data + index);
524                         index += 4;
525                 }
526         }
527         index = ucode_start;
528         for (section = 0; section < numsects; section++) {
529                 instruction = *(u32 *)(fw->data + index);
530                 baseaddress = sectstart[section];
531                 if (baseaddress < 0x8000)
532                         continue;
533                 thissectionsize = sectsize[section] >> 3;
534
535                 for (codeaddr = 0; codeaddr < thissectionsize; codeaddr++) {
536                         /* Write out instruction address */
537                         slic_reg32_write(&slic_regs->slic_wcs,
538                                 SLIC_WCS_COMPARE | (baseaddress + codeaddr),
539                                 FLUSH);
540                         /* Write out instruction to low addr */
541                         slic_reg32_write(&slic_regs->slic_wcs, instruction,
542                                          FLUSH);
543                         instruction = *(u32 *)(fw->data + index);
544                         index += 4;
545                         /* Write out instruction to high addr */
546                         slic_reg32_write(&slic_regs->slic_wcs, instruction,
547                                          FLUSH);
548                         instruction = *(u32 *)(fw->data + index);
549                         index += 4;
550
551                         /* Check SRAM location zero. If it is non-zero. Abort.*/
552                      /*
553                       * failure = readl((u32 __iomem *)&slic_regs->slic_reset);
554                       * if (failure) {
555                       * release_firmware(fw);
556                       * return -EIO;
557                       * }
558                       */
559                 }
560         }
561         release_firmware(fw);
562         /* Everything OK, kick off the card */
563         mdelay(10);
564         slic_reg32_write(&slic_regs->slic_wcs, SLIC_WCS_START, FLUSH);
565
566         /*
567          * stall for 20 ms, long enough for ucode to init card
568          * and reach mainloop
569          */
570         mdelay(20);
571
572         return 0;
573 }
574
575 /*(DEBLOBBED)*/
576
577 static void slic_adapter_set_hwaddr(struct adapter *adapter)
578 {
579         struct sliccard *card = adapter->card;
580
581         if ((adapter->card) && (card->config_set)) {
582                 memcpy(adapter->macaddr,
583                        card->config.MacInfo[adapter->functionnumber].macaddrA,
584                        sizeof(struct slic_config_mac));
585                 if (is_zero_ether_addr(adapter->currmacaddr))
586                         memcpy(adapter->currmacaddr, adapter->macaddr,
587                                ETH_ALEN);
588                 if (adapter->netdev)
589                         memcpy(adapter->netdev->dev_addr, adapter->currmacaddr,
590                                ETH_ALEN);
591         }
592 }
593
594 static void slic_intagg_set(struct adapter *adapter, u32 value)
595 {
596         slic_reg32_write(&adapter->slic_regs->slic_intagg, value, FLUSH);
597         adapter->card->loadlevel_current = value;
598 }
599
600 static void slic_soft_reset(struct adapter *adapter)
601 {
602         if (adapter->card->state == CARD_UP) {
603                 slic_reg32_write(&adapter->slic_regs->slic_quiesce, 0, FLUSH);
604                 mdelay(1);
605         }
606
607         slic_reg32_write(&adapter->slic_regs->slic_reset, SLIC_RESET_MAGIC,
608                          FLUSH);
609         mdelay(1);
610 }
611
612 static void slic_mac_address_config(struct adapter *adapter)
613 {
614         u32 value;
615         u32 value2;
616         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
617
618         value = ntohl(*(__be32 *)&adapter->currmacaddr[2]);
619         slic_reg32_write(&slic_regs->slic_wraddral, value, FLUSH);
620         slic_reg32_write(&slic_regs->slic_wraddrbl, value, FLUSH);
621
622         value2 = (u32)((adapter->currmacaddr[0] << 8 |
623                              adapter->currmacaddr[1]) & 0xFFFF);
624
625         slic_reg32_write(&slic_regs->slic_wraddrah, value2, FLUSH);
626         slic_reg32_write(&slic_regs->slic_wraddrbh, value2, FLUSH);
627
628         /*
629          * Write our multicast mask out to the card.  This is done
630          * here in addition to the slic_mcast_addr_set routine
631          * because ALL_MCAST may have been enabled or disabled
632          */
633         slic_mcast_set_mask(adapter);
634 }
635
636 static void slic_mac_config(struct adapter *adapter)
637 {
638         u32 value;
639         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
640
641         /* Setup GMAC gaps */
642         if (adapter->linkspeed == LINK_1000MB) {
643                 value = ((GMCR_GAPBB_1000 << GMCR_GAPBB_SHIFT) |
644                          (GMCR_GAPR1_1000 << GMCR_GAPR1_SHIFT) |
645                          (GMCR_GAPR2_1000 << GMCR_GAPR2_SHIFT));
646         } else {
647                 value = ((GMCR_GAPBB_100 << GMCR_GAPBB_SHIFT) |
648                          (GMCR_GAPR1_100 << GMCR_GAPR1_SHIFT) |
649                          (GMCR_GAPR2_100 << GMCR_GAPR2_SHIFT));
650         }
651
652         /* enable GMII */
653         if (adapter->linkspeed == LINK_1000MB)
654                 value |= GMCR_GBIT;
655
656         /* enable fullduplex */
657         if ((adapter->linkduplex == LINK_FULLD)
658             || (adapter->macopts & MAC_LOOPBACK)) {
659                 value |= GMCR_FULLD;
660         }
661
662         /* write mac config */
663         slic_reg32_write(&slic_regs->slic_wmcfg, value, FLUSH);
664
665         /* setup mac addresses */
666         slic_mac_address_config(adapter);
667 }
668
669 static void slic_config_set(struct adapter *adapter, bool linkchange)
670 {
671         u32 value;
672         u32 RcrReset;
673         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
674
675         if (linkchange) {
676                 /* Setup MAC */
677                 slic_mac_config(adapter);
678                 RcrReset = GRCR_RESET;
679         } else {
680                 slic_mac_address_config(adapter);
681                 RcrReset = 0;
682         }
683
684         if (adapter->linkduplex == LINK_FULLD) {
685                 /* setup xmtcfg */
686                 value = (GXCR_RESET |   /* Always reset     */
687                          GXCR_XMTEN |   /* Enable transmit  */
688                          GXCR_PAUSEEN); /* Enable pause     */
689
690                 slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
691
692                 /* Setup rcvcfg last */
693                 value = (RcrReset |     /* Reset, if linkchange */
694                          GRCR_CTLEN |   /* Enable CTL frames    */
695                          GRCR_ADDRAEN | /* Address A enable     */
696                          GRCR_RCVBAD |  /* Rcv bad frames       */
697                          (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
698         } else {
699                 /* setup xmtcfg */
700                 value = (GXCR_RESET |   /* Always reset     */
701                          GXCR_XMTEN);   /* Enable transmit  */
702
703                 slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
704
705                 /* Setup rcvcfg last */
706                 value = (RcrReset |     /* Reset, if linkchange */
707                          GRCR_ADDRAEN | /* Address A enable     */
708                          GRCR_RCVBAD |  /* Rcv bad frames       */
709                          (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
710         }
711
712         if (adapter->state != ADAPT_DOWN) {
713                 /* Only enable receive if we are restarting or running */
714                 value |= GRCR_RCVEN;
715         }
716
717         if (adapter->macopts & MAC_PROMISC)
718                 value |= GRCR_RCVALL;
719
720         slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH);
721 }
722
723 /*
724  *  Turn off RCV and XMT, power down PHY
725  */
726 static void slic_config_clear(struct adapter *adapter)
727 {
728         u32 value;
729         u32 phy_config;
730         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
731
732         /* Setup xmtcfg */
733         value = (GXCR_RESET |   /* Always reset */
734                  GXCR_PAUSEEN); /* Enable pause */
735
736         slic_reg32_write(&slic_regs->slic_wxcfg, value, FLUSH);
737
738         value = (GRCR_RESET |   /* Always reset      */
739                  GRCR_CTLEN |   /* Enable CTL frames */
740                  GRCR_ADDRAEN | /* Address A enable  */
741                  (GRCR_HASHSIZE << GRCR_HASHSIZE_SHIFT));
742
743         slic_reg32_write(&slic_regs->slic_wrcfg, value, FLUSH);
744
745         /* power down phy */
746         phy_config = (MIICR_REG_PCR | (PCR_POWERDOWN));
747         slic_reg32_write(&slic_regs->slic_wphy, phy_config, FLUSH);
748 }
749
750 static bool slic_mac_filter(struct adapter *adapter,
751                         struct ether_header *ether_frame)
752 {
753         struct net_device *netdev = adapter->netdev;
754         u32 opts = adapter->macopts;
755
756         if (opts & MAC_PROMISC)
757                 return true;
758
759         if (is_broadcast_ether_addr(ether_frame->ether_dhost)) {
760                 if (opts & MAC_BCAST) {
761                         adapter->rcv_broadcasts++;
762                         return true;
763                 }
764
765                 return false;
766         }
767
768         if (is_multicast_ether_addr(ether_frame->ether_dhost)) {
769                 if (opts & MAC_ALLMCAST) {
770                         adapter->rcv_multicasts++;
771                         netdev->stats.multicast++;
772                         return true;
773                 }
774                 if (opts & MAC_MCAST) {
775                         struct mcast_address *mcaddr = adapter->mcastaddrs;
776
777                         while (mcaddr) {
778                                 if (ether_addr_equal(mcaddr->address,
779                                                      ether_frame->ether_dhost)) {
780                                         adapter->rcv_multicasts++;
781                                         netdev->stats.multicast++;
782                                         return true;
783                                 }
784                                 mcaddr = mcaddr->next;
785                         }
786
787                         return false;
788                 }
789
790                 return false;
791         }
792         if (opts & MAC_DIRECTED) {
793                 adapter->rcv_unicasts++;
794                 return true;
795         }
796         return false;
797
798 }
799
800 static int slic_mac_set_address(struct net_device *dev, void *ptr)
801 {
802         struct adapter *adapter = netdev_priv(dev);
803         struct sockaddr *addr = ptr;
804
805         if (netif_running(dev))
806                 return -EBUSY;
807         if (!adapter)
808                 return -EBUSY;
809
810         if (!is_valid_ether_addr(addr->sa_data))
811                 return -EINVAL;
812
813         memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
814         memcpy(adapter->currmacaddr, addr->sa_data, dev->addr_len);
815
816         slic_config_set(adapter, true);
817         return 0;
818 }
819
820 static void slic_timer_load_check(ulong cardaddr)
821 {
822         struct sliccard *card = (struct sliccard *)cardaddr;
823         struct adapter *adapter = card->master;
824         u32 __iomem *intagg;
825         u32 load = card->events;
826         u32 level = 0;
827
828         if ((adapter) && (adapter->state == ADAPT_UP) &&
829             (card->state == CARD_UP) && (slic_global.dynamic_intagg)) {
830                 intagg = &adapter->slic_regs->slic_intagg;
831                 if (adapter->devid == SLIC_1GB_DEVICE_ID) {
832                         if (adapter->linkspeed == LINK_1000MB)
833                                 level = 100;
834                         else {
835                                 if (load > SLIC_LOAD_5)
836                                         level = SLIC_INTAGG_5;
837                                 else if (load > SLIC_LOAD_4)
838                                         level = SLIC_INTAGG_4;
839                                 else if (load > SLIC_LOAD_3)
840                                         level = SLIC_INTAGG_3;
841                                 else if (load > SLIC_LOAD_2)
842                                         level = SLIC_INTAGG_2;
843                                 else if (load > SLIC_LOAD_1)
844                                         level = SLIC_INTAGG_1;
845                                 else
846                                         level = SLIC_INTAGG_0;
847                         }
848                         if (card->loadlevel_current != level) {
849                                 card->loadlevel_current = level;
850                                 slic_reg32_write(intagg, level, FLUSH);
851                         }
852                 } else {
853                         if (load > SLIC_LOAD_5)
854                                 level = SLIC_INTAGG_5;
855                         else if (load > SLIC_LOAD_4)
856                                 level = SLIC_INTAGG_4;
857                         else if (load > SLIC_LOAD_3)
858                                 level = SLIC_INTAGG_3;
859                         else if (load > SLIC_LOAD_2)
860                                 level = SLIC_INTAGG_2;
861                         else if (load > SLIC_LOAD_1)
862                                 level = SLIC_INTAGG_1;
863                         else
864                                 level = SLIC_INTAGG_0;
865                         if (card->loadlevel_current != level) {
866                                 card->loadlevel_current = level;
867                                 slic_reg32_write(intagg, level, FLUSH);
868                         }
869                 }
870         }
871         card->events = 0;
872         card->loadtimer.expires = jiffies + (SLIC_LOADTIMER_PERIOD * HZ);
873         add_timer(&card->loadtimer);
874 }
875
876 static int slic_upr_queue_request(struct adapter *adapter,
877                            u32 upr_request,
878                            u32 upr_data,
879                            u32 upr_data_h,
880                            u32 upr_buffer, u32 upr_buffer_h)
881 {
882         struct slic_upr *upr;
883         struct slic_upr *uprqueue;
884
885         upr = kmalloc(sizeof(struct slic_upr), GFP_ATOMIC);
886         if (!upr)
887                 return -ENOMEM;
888
889         upr->adapter = adapter->port;
890         upr->upr_request = upr_request;
891         upr->upr_data = upr_data;
892         upr->upr_buffer = upr_buffer;
893         upr->upr_data_h = upr_data_h;
894         upr->upr_buffer_h = upr_buffer_h;
895         upr->next = NULL;
896         if (adapter->upr_list) {
897                 uprqueue = adapter->upr_list;
898
899                 while (uprqueue->next)
900                         uprqueue = uprqueue->next;
901                 uprqueue->next = upr;
902         } else {
903                 adapter->upr_list = upr;
904         }
905         return 0;
906 }
907
908 static void slic_upr_start(struct adapter *adapter)
909 {
910         struct slic_upr *upr;
911         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
912 /*
913  *  char * ptr1;
914  *  char * ptr2;
915  *  uint cmdoffset;
916  */
917         upr = adapter->upr_list;
918         if (!upr)
919                 return;
920         if (adapter->upr_busy)
921                 return;
922         adapter->upr_busy = 1;
923
924         switch (upr->upr_request) {
925         case SLIC_UPR_STATS:
926                 if (upr->upr_data_h == 0) {
927                         slic_reg32_write(&slic_regs->slic_stats, upr->upr_data,
928                                          FLUSH);
929                 } else {
930                         slic_reg64_write(adapter, &slic_regs->slic_stats64,
931                                          upr->upr_data,
932                                          &slic_regs->slic_addr_upper,
933                                          upr->upr_data_h, FLUSH);
934                 }
935                 break;
936
937         case SLIC_UPR_RLSR:
938                 slic_reg64_write(adapter, &slic_regs->slic_rlsr, upr->upr_data,
939                                  &slic_regs->slic_addr_upper, upr->upr_data_h,
940                                  FLUSH);
941                 break;
942
943         case SLIC_UPR_RCONFIG:
944                 slic_reg64_write(adapter, &slic_regs->slic_rconfig,
945                                  upr->upr_data, &slic_regs->slic_addr_upper,
946                                  upr->upr_data_h, FLUSH);
947                 break;
948         case SLIC_UPR_PING:
949                 slic_reg32_write(&slic_regs->slic_ping, 1, FLUSH);
950                 break;
951         }
952 }
953
954 static int slic_upr_request(struct adapter *adapter,
955                      u32 upr_request,
956                      u32 upr_data,
957                      u32 upr_data_h,
958                      u32 upr_buffer, u32 upr_buffer_h)
959 {
960         unsigned long flags;
961         int rc;
962
963         spin_lock_irqsave(&adapter->upr_lock, flags);
964         rc = slic_upr_queue_request(adapter,
965                                         upr_request,
966                                         upr_data,
967                                         upr_data_h, upr_buffer, upr_buffer_h);
968         if (rc)
969                 goto err_unlock_irq;
970
971         slic_upr_start(adapter);
972 err_unlock_irq:
973         spin_unlock_irqrestore(&adapter->upr_lock, flags);
974         return rc;
975 }
976
977 static void slic_link_upr_complete(struct adapter *adapter, u32 isr)
978 {
979         u32 linkstatus = adapter->pshmem->linkstatus;
980         uint linkup;
981         unsigned char linkspeed;
982         unsigned char linkduplex;
983
984         if ((isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
985                 struct slic_shmem *pshmem;
986
987                 pshmem = (struct slic_shmem *)(unsigned long)
988                          adapter->phys_shmem;
989 #if BITS_PER_LONG == 64
990                 slic_upr_queue_request(adapter,
991                                        SLIC_UPR_RLSR,
992                                        SLIC_GET_ADDR_LOW(&pshmem->linkstatus),
993                                        SLIC_GET_ADDR_HIGH(&pshmem->linkstatus),
994                                        0, 0);
995 #else
996                 slic_upr_queue_request(adapter,
997                                        SLIC_UPR_RLSR,
998                                        (u32)&pshmem->linkstatus,
999                                        SLIC_GET_ADDR_HIGH(pshmem), 0, 0);
1000 #endif
1001                 return;
1002         }
1003         if (adapter->state != ADAPT_UP)
1004                 return;
1005
1006         linkup = linkstatus & GIG_LINKUP ? LINK_UP : LINK_DOWN;
1007         if (linkstatus & GIG_SPEED_1000)
1008                 linkspeed = LINK_1000MB;
1009         else if (linkstatus & GIG_SPEED_100)
1010                 linkspeed = LINK_100MB;
1011         else
1012                 linkspeed = LINK_10MB;
1013
1014         if (linkstatus & GIG_FULLDUPLEX)
1015                 linkduplex = LINK_FULLD;
1016         else
1017                 linkduplex = LINK_HALFD;
1018
1019         if ((adapter->linkstate == LINK_DOWN) && (linkup == LINK_DOWN))
1020                 return;
1021
1022         /* link up event, but nothing has changed */
1023         if ((adapter->linkstate == LINK_UP) &&
1024             (linkup == LINK_UP) &&
1025             (adapter->linkspeed == linkspeed) &&
1026             (adapter->linkduplex == linkduplex))
1027                 return;
1028
1029         /* link has changed at this point */
1030
1031         /* link has gone from up to down */
1032         if (linkup == LINK_DOWN) {
1033                 adapter->linkstate = LINK_DOWN;
1034                 return;
1035         }
1036
1037         /* link has gone from down to up */
1038         adapter->linkspeed = linkspeed;
1039         adapter->linkduplex = linkduplex;
1040
1041         if (adapter->linkstate != LINK_UP) {
1042                 /* setup the mac */
1043                 slic_config_set(adapter, true);
1044                 adapter->linkstate = LINK_UP;
1045                 netif_start_queue(adapter->netdev);
1046         }
1047 }
1048
1049 static void slic_upr_request_complete(struct adapter *adapter, u32 isr)
1050 {
1051         struct sliccard *card = adapter->card;
1052         struct slic_upr *upr;
1053         unsigned long flags;
1054
1055         spin_lock_irqsave(&adapter->upr_lock, flags);
1056         upr = adapter->upr_list;
1057         if (!upr) {
1058                 spin_unlock_irqrestore(&adapter->upr_lock, flags);
1059                 return;
1060         }
1061         adapter->upr_list = upr->next;
1062         upr->next = NULL;
1063         adapter->upr_busy = 0;
1064         switch (upr->upr_request) {
1065         case SLIC_UPR_STATS:
1066                 {
1067                         struct slic_stats *slicstats =
1068                             (struct slic_stats *)&adapter->pshmem->inicstats;
1069                         struct slic_stats *newstats = slicstats;
1070                         struct slic_stats  *old = &adapter->inicstats_prev;
1071                         struct slicnet_stats *stst = &adapter->slic_stats;
1072
1073                         if (isr & ISR_UPCERR) {
1074                                 dev_err(&adapter->netdev->dev,
1075                                         "SLIC_UPR_STATS command failed isr[%x]\n",
1076                                         isr);
1077
1078                                 break;
1079                         }
1080                         UPDATE_STATS_GB(stst->tcp.xmit_tcp_segs,
1081                                         newstats->xmit_tcp_segs_gb,
1082                                         old->xmit_tcp_segs_gb);
1083
1084                         UPDATE_STATS_GB(stst->tcp.xmit_tcp_bytes,
1085                                         newstats->xmit_tcp_bytes_gb,
1086                                         old->xmit_tcp_bytes_gb);
1087
1088                         UPDATE_STATS_GB(stst->tcp.rcv_tcp_segs,
1089                                         newstats->rcv_tcp_segs_gb,
1090                                         old->rcv_tcp_segs_gb);
1091
1092                         UPDATE_STATS_GB(stst->tcp.rcv_tcp_bytes,
1093                                         newstats->rcv_tcp_bytes_gb,
1094                                         old->rcv_tcp_bytes_gb);
1095
1096                         UPDATE_STATS_GB(stst->iface.xmt_bytes,
1097                                         newstats->xmit_bytes_gb,
1098                                         old->xmit_bytes_gb);
1099
1100                         UPDATE_STATS_GB(stst->iface.xmt_ucast,
1101                                         newstats->xmit_unicasts_gb,
1102                                         old->xmit_unicasts_gb);
1103
1104                         UPDATE_STATS_GB(stst->iface.rcv_bytes,
1105                                         newstats->rcv_bytes_gb,
1106                                         old->rcv_bytes_gb);
1107
1108                         UPDATE_STATS_GB(stst->iface.rcv_ucast,
1109                                         newstats->rcv_unicasts_gb,
1110                                         old->rcv_unicasts_gb);
1111
1112                         UPDATE_STATS_GB(stst->iface.xmt_errors,
1113                                         newstats->xmit_collisions_gb,
1114                                         old->xmit_collisions_gb);
1115
1116                         UPDATE_STATS_GB(stst->iface.xmt_errors,
1117                                         newstats->xmit_excess_collisions_gb,
1118                                         old->xmit_excess_collisions_gb);
1119
1120                         UPDATE_STATS_GB(stst->iface.xmt_errors,
1121                                         newstats->xmit_other_error_gb,
1122                                         old->xmit_other_error_gb);
1123
1124                         UPDATE_STATS_GB(stst->iface.rcv_errors,
1125                                         newstats->rcv_other_error_gb,
1126                                         old->rcv_other_error_gb);
1127
1128                         UPDATE_STATS_GB(stst->iface.rcv_discards,
1129                                         newstats->rcv_drops_gb,
1130                                         old->rcv_drops_gb);
1131
1132                         if (newstats->rcv_drops_gb > old->rcv_drops_gb) {
1133                                 adapter->rcv_drops +=
1134                                     (newstats->rcv_drops_gb -
1135                                      old->rcv_drops_gb);
1136                         }
1137                         memcpy(old, newstats, sizeof(struct slic_stats));
1138                         break;
1139                 }
1140         case SLIC_UPR_RLSR:
1141                 slic_link_upr_complete(adapter, isr);
1142                 break;
1143         case SLIC_UPR_RCONFIG:
1144                 break;
1145         case SLIC_UPR_PING:
1146                 card->pingstatus |= (isr & ISR_PINGDSMASK);
1147                 break;
1148         }
1149         kfree(upr);
1150         slic_upr_start(adapter);
1151         spin_unlock_irqrestore(&adapter->upr_lock, flags);
1152 }
1153
1154 static int slic_config_get(struct adapter *adapter, u32 config, u32 config_h)
1155 {
1156         return slic_upr_request(adapter, SLIC_UPR_RCONFIG, config, config_h,
1157                                 0, 0);
1158 }
1159
1160 /*
1161  * Compute a checksum of the EEPROM according to RFC 1071.
1162  */
1163 static u16 slic_eeprom_cksum(void *eeprom, unsigned len)
1164 {
1165         u16 *wp = eeprom;
1166         u32 checksum = 0;
1167
1168         while (len > 1) {
1169                 checksum += *(wp++);
1170                 len -= 2;
1171         }
1172
1173         if (len > 0)
1174                 checksum += *(u8 *)wp;
1175
1176         while (checksum >> 16)
1177                 checksum = (checksum & 0xFFFF) + ((checksum >> 16) & 0xFFFF);
1178
1179         return ~checksum;
1180 }
1181
1182 static void slic_rspqueue_free(struct adapter *adapter)
1183 {
1184         int i;
1185         struct slic_rspqueue *rspq = &adapter->rspqueue;
1186
1187         for (i = 0; i < rspq->num_pages; i++) {
1188                 if (rspq->vaddr[i]) {
1189                         pci_free_consistent(adapter->pcidev, PAGE_SIZE,
1190                                             rspq->vaddr[i], rspq->paddr[i]);
1191                 }
1192                 rspq->vaddr[i] = NULL;
1193                 rspq->paddr[i] = 0;
1194         }
1195         rspq->offset = 0;
1196         rspq->pageindex = 0;
1197         rspq->rspbuf = NULL;
1198 }
1199
1200 static int slic_rspqueue_init(struct adapter *adapter)
1201 {
1202         int i;
1203         struct slic_rspqueue *rspq = &adapter->rspqueue;
1204         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
1205         u32 paddrh = 0;
1206
1207         memset(rspq, 0, sizeof(struct slic_rspqueue));
1208
1209         rspq->num_pages = SLIC_RSPQ_PAGES_GB;
1210
1211         for (i = 0; i < rspq->num_pages; i++) {
1212                 rspq->vaddr[i] = pci_zalloc_consistent(adapter->pcidev,
1213                                                        PAGE_SIZE,
1214                                                        &rspq->paddr[i]);
1215                 if (!rspq->vaddr[i]) {
1216                         dev_err(&adapter->pcidev->dev,
1217                                 "pci_alloc_consistent failed\n");
1218                         slic_rspqueue_free(adapter);
1219                         return -ENOMEM;
1220                 }
1221
1222                 if (paddrh == 0) {
1223                         slic_reg32_write(&slic_regs->slic_rbar,
1224                                 (rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE),
1225                                 DONT_FLUSH);
1226                 } else {
1227                         slic_reg64_write(adapter, &slic_regs->slic_rbar64,
1228                                 (rspq->paddr[i] | SLIC_RSPQ_BUFSINPAGE),
1229                                 &slic_regs->slic_addr_upper,
1230                                 paddrh, DONT_FLUSH);
1231                 }
1232         }
1233         rspq->offset = 0;
1234         rspq->pageindex = 0;
1235         rspq->rspbuf = (struct slic_rspbuf *)rspq->vaddr[0];
1236         return 0;
1237 }
1238
1239 static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter)
1240 {
1241         struct slic_rspqueue *rspq = &adapter->rspqueue;
1242         struct slic_rspbuf *buf;
1243
1244         if (!(rspq->rspbuf->status))
1245                 return NULL;
1246
1247         buf = rspq->rspbuf;
1248         if (++rspq->offset < SLIC_RSPQ_BUFSINPAGE) {
1249                 rspq->rspbuf++;
1250         } else {
1251                 slic_reg64_write(adapter, &adapter->slic_regs->slic_rbar64,
1252                         (rspq->paddr[rspq->pageindex] | SLIC_RSPQ_BUFSINPAGE),
1253                         &adapter->slic_regs->slic_addr_upper, 0, DONT_FLUSH);
1254                 rspq->pageindex = (rspq->pageindex + 1) % rspq->num_pages;
1255                 rspq->offset = 0;
1256                 rspq->rspbuf = (struct slic_rspbuf *)
1257                                                 rspq->vaddr[rspq->pageindex];
1258         }
1259
1260         return buf;
1261 }
1262
1263 static void slic_cmdqmem_free(struct adapter *adapter)
1264 {
1265         struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1266         int i;
1267
1268         for (i = 0; i < SLIC_CMDQ_MAXPAGES; i++) {
1269                 if (cmdqmem->pages[i]) {
1270                         pci_free_consistent(adapter->pcidev,
1271                                             PAGE_SIZE,
1272                                             (void *)cmdqmem->pages[i],
1273                                             cmdqmem->dma_pages[i]);
1274                 }
1275         }
1276         memset(cmdqmem, 0, sizeof(struct slic_cmdqmem));
1277 }
1278
1279 static u32 *slic_cmdqmem_addpage(struct adapter *adapter)
1280 {
1281         struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem;
1282         u32 *pageaddr;
1283
1284         if (cmdqmem->pagecnt >= SLIC_CMDQ_MAXPAGES)
1285                 return NULL;
1286         pageaddr = pci_alloc_consistent(adapter->pcidev,
1287                                         PAGE_SIZE,
1288                                         &cmdqmem->dma_pages[cmdqmem->pagecnt]);
1289         if (!pageaddr)
1290                 return NULL;
1291
1292         cmdqmem->pages[cmdqmem->pagecnt] = pageaddr;
1293         cmdqmem->pagecnt++;
1294         return pageaddr;
1295 }
1296
1297 static void slic_cmdq_free(struct adapter *adapter)
1298 {
1299         struct slic_hostcmd *cmd;
1300
1301         cmd = adapter->cmdq_all.head;
1302         while (cmd) {
1303                 if (cmd->busy) {
1304                         struct sk_buff *tempskb;
1305
1306                         tempskb = cmd->skb;
1307                         if (tempskb) {
1308                                 cmd->skb = NULL;
1309                                 dev_kfree_skb_irq(tempskb);
1310                         }
1311                 }
1312                 cmd = cmd->next_all;
1313         }
1314         memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));
1315         memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));
1316         memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));
1317         slic_cmdqmem_free(adapter);
1318 }
1319
1320 static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page)
1321 {
1322         struct slic_hostcmd *cmd;
1323         struct slic_hostcmd *prev;
1324         struct slic_hostcmd *tail;
1325         struct slic_cmdqueue *cmdq;
1326         int cmdcnt;
1327         void *cmdaddr;
1328         ulong phys_addr;
1329         u32 phys_addrl;
1330         u32 phys_addrh;
1331         struct slic_handle *pslic_handle;
1332         unsigned long flags;
1333
1334         cmdaddr = page;
1335         cmd = cmdaddr;
1336         cmdcnt = 0;
1337
1338         phys_addr = virt_to_bus((void *)page);
1339         phys_addrl = SLIC_GET_ADDR_LOW(phys_addr);
1340         phys_addrh = SLIC_GET_ADDR_HIGH(phys_addr);
1341
1342         prev = NULL;
1343         tail = cmd;
1344         while ((cmdcnt < SLIC_CMDQ_CMDSINPAGE) &&
1345                (adapter->slic_handle_ix < 256)) {
1346                 /* Allocate and initialize a SLIC_HANDLE for this command */
1347                 spin_lock_irqsave(&adapter->handle_lock, flags);
1348                 pslic_handle  =  adapter->pfree_slic_handles;
1349                 adapter->pfree_slic_handles = pslic_handle->next;
1350                 spin_unlock_irqrestore(&adapter->handle_lock, flags);
1351                 pslic_handle->type = SLIC_HANDLE_CMD;
1352                 pslic_handle->address = (void *)cmd;
1353                 pslic_handle->offset = (ushort)adapter->slic_handle_ix++;
1354                 pslic_handle->other_handle = NULL;
1355                 pslic_handle->next = NULL;
1356
1357                 cmd->pslic_handle = pslic_handle;
1358                 cmd->cmd64.hosthandle = pslic_handle->token.handle_token;
1359                 cmd->busy = false;
1360                 cmd->paddrl = phys_addrl;
1361                 cmd->paddrh = phys_addrh;
1362                 cmd->next_all = prev;
1363                 cmd->next = prev;
1364                 prev = cmd;
1365                 phys_addrl += SLIC_HOSTCMD_SIZE;
1366                 cmdaddr += SLIC_HOSTCMD_SIZE;
1367
1368                 cmd = cmdaddr;
1369                 cmdcnt++;
1370         }
1371
1372         cmdq = &adapter->cmdq_all;
1373         cmdq->count += cmdcnt;  /*  SLIC_CMDQ_CMDSINPAGE;   mooktodo */
1374         tail->next_all = cmdq->head;
1375         cmdq->head = prev;
1376         cmdq = &adapter->cmdq_free;
1377         spin_lock_irqsave(&cmdq->lock, flags);
1378         cmdq->count += cmdcnt;  /*  SLIC_CMDQ_CMDSINPAGE;   mooktodo */
1379         tail->next = cmdq->head;
1380         cmdq->head = prev;
1381         spin_unlock_irqrestore(&cmdq->lock, flags);
1382 }
1383
1384 static int slic_cmdq_init(struct adapter *adapter)
1385 {
1386         int i;
1387         u32 *pageaddr;
1388
1389         memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));
1390         memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));
1391         memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));
1392         spin_lock_init(&adapter->cmdq_all.lock);
1393         spin_lock_init(&adapter->cmdq_free.lock);
1394         spin_lock_init(&adapter->cmdq_done.lock);
1395         memset(&adapter->cmdqmem, 0, sizeof(struct slic_cmdqmem));
1396         adapter->slic_handle_ix = 1;
1397         for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) {
1398                 pageaddr = slic_cmdqmem_addpage(adapter);
1399                 if (!pageaddr) {
1400                         slic_cmdq_free(adapter);
1401                         return -ENOMEM;
1402                 }
1403                 slic_cmdq_addcmdpage(adapter, pageaddr);
1404         }
1405         adapter->slic_handle_ix = 1;
1406
1407         return 0;
1408 }
1409
1410 static void slic_cmdq_reset(struct adapter *adapter)
1411 {
1412         struct slic_hostcmd *hcmd;
1413         struct sk_buff *skb;
1414         u32 outstanding;
1415         unsigned long flags;
1416
1417         spin_lock_irqsave(&adapter->cmdq_free.lock, flags);
1418         spin_lock(&adapter->cmdq_done.lock);
1419         outstanding = adapter->cmdq_all.count - adapter->cmdq_done.count;
1420         outstanding -= adapter->cmdq_free.count;
1421         hcmd = adapter->cmdq_all.head;
1422         while (hcmd) {
1423                 if (hcmd->busy) {
1424                         skb = hcmd->skb;
1425                         hcmd->busy = 0;
1426                         hcmd->skb = NULL;
1427                         dev_kfree_skb_irq(skb);
1428                 }
1429                 hcmd = hcmd->next_all;
1430         }
1431         adapter->cmdq_free.count = 0;
1432         adapter->cmdq_free.head = NULL;
1433         adapter->cmdq_free.tail = NULL;
1434         adapter->cmdq_done.count = 0;
1435         adapter->cmdq_done.head = NULL;
1436         adapter->cmdq_done.tail = NULL;
1437         adapter->cmdq_free.head = adapter->cmdq_all.head;
1438         hcmd = adapter->cmdq_all.head;
1439         while (hcmd) {
1440                 adapter->cmdq_free.count++;
1441                 hcmd->next = hcmd->next_all;
1442                 hcmd = hcmd->next_all;
1443         }
1444         if (adapter->cmdq_free.count != adapter->cmdq_all.count) {
1445                 dev_err(&adapter->netdev->dev,
1446                         "free_count %d != all count %d\n",
1447                         adapter->cmdq_free.count, adapter->cmdq_all.count);
1448         }
1449         spin_unlock(&adapter->cmdq_done.lock);
1450         spin_unlock_irqrestore(&adapter->cmdq_free.lock, flags);
1451 }
1452
1453 static void slic_cmdq_getdone(struct adapter *adapter)
1454 {
1455         struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done;
1456         struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free;
1457         unsigned long flags;
1458
1459         spin_lock_irqsave(&done_cmdq->lock, flags);
1460
1461         free_cmdq->head = done_cmdq->head;
1462         free_cmdq->count = done_cmdq->count;
1463         done_cmdq->head = NULL;
1464         done_cmdq->tail = NULL;
1465         done_cmdq->count = 0;
1466         spin_unlock_irqrestore(&done_cmdq->lock, flags);
1467 }
1468
1469 static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter)
1470 {
1471         struct slic_cmdqueue *cmdq = &adapter->cmdq_free;
1472         struct slic_hostcmd *cmd = NULL;
1473         unsigned long flags;
1474
1475 lock_and_retry:
1476         spin_lock_irqsave(&cmdq->lock, flags);
1477 retry:
1478         cmd = cmdq->head;
1479         if (cmd) {
1480                 cmdq->head = cmd->next;
1481                 cmdq->count--;
1482                 spin_unlock_irqrestore(&cmdq->lock, flags);
1483         } else {
1484                 slic_cmdq_getdone(adapter);
1485                 cmd = cmdq->head;
1486                 if (cmd) {
1487                         goto retry;
1488                 } else {
1489                         u32 *pageaddr;
1490
1491                         spin_unlock_irqrestore(&cmdq->lock, flags);
1492                         pageaddr = slic_cmdqmem_addpage(adapter);
1493                         if (pageaddr) {
1494                                 slic_cmdq_addcmdpage(adapter, pageaddr);
1495                                 goto lock_and_retry;
1496                         }
1497                 }
1498         }
1499         return cmd;
1500 }
1501
1502 static void slic_cmdq_putdone_irq(struct adapter *adapter,
1503                                 struct slic_hostcmd *cmd)
1504 {
1505         struct slic_cmdqueue *cmdq = &adapter->cmdq_done;
1506
1507         spin_lock(&cmdq->lock);
1508         cmd->busy = 0;
1509         cmd->next = cmdq->head;
1510         cmdq->head = cmd;
1511         cmdq->count++;
1512         if ((adapter->xmitq_full) && (cmdq->count > 10))
1513                 netif_wake_queue(adapter->netdev);
1514         spin_unlock(&cmdq->lock);
1515 }
1516
1517 static int slic_rcvqueue_fill(struct adapter *adapter)
1518 {
1519         void *paddr;
1520         u32 paddrl;
1521         u32 paddrh;
1522         struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1523         int i = 0;
1524         struct device *dev = &adapter->netdev->dev;
1525
1526         while (i < SLIC_RCVQ_FILLENTRIES) {
1527                 struct slic_rcvbuf *rcvbuf;
1528                 struct sk_buff *skb;
1529 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1530 retry_rcvqfill:
1531 #endif
1532                 skb = alloc_skb(SLIC_RCVQ_RCVBUFSIZE, GFP_ATOMIC);
1533                 if (skb) {
1534                         paddr = (void *)(unsigned long)
1535                                 pci_map_single(adapter->pcidev,
1536                                                skb->data,
1537                                                SLIC_RCVQ_RCVBUFSIZE,
1538                                                PCI_DMA_FROMDEVICE);
1539                         paddrl = SLIC_GET_ADDR_LOW(paddr);
1540                         paddrh = SLIC_GET_ADDR_HIGH(paddr);
1541
1542                         skb->len = SLIC_RCVBUF_HEADSIZE;
1543                         rcvbuf = (struct slic_rcvbuf *)skb->head;
1544                         rcvbuf->status = 0;
1545                         skb->next = NULL;
1546 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1547                         if (paddrl == 0) {
1548                                 dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1549                                         __func__);
1550                                 dev_err(dev, "skb[%p] PROBLEM\n", skb);
1551                                 dev_err(dev, "         skbdata[%p]\n",
1552                                                 skb->data);
1553                                 dev_err(dev, "         skblen[%x]\n", skb->len);
1554                                 dev_err(dev, "         paddr[%p]\n", paddr);
1555                                 dev_err(dev, "         paddrl[%x]\n", paddrl);
1556                                 dev_err(dev, "         paddrh[%x]\n", paddrh);
1557                                 dev_err(dev, "         rcvq->head[%p]\n",
1558                                                 rcvq->head);
1559                                 dev_err(dev, "         rcvq->tail[%p]\n",
1560                                                 rcvq->tail);
1561                                 dev_err(dev, "         rcvq->count[%x]\n",
1562                                                 rcvq->count);
1563                                 dev_err(dev, "SKIP THIS SKB!!!!!!!!\n");
1564                                 goto retry_rcvqfill;
1565                         }
1566 #else
1567                         if (paddrl == 0) {
1568                                 dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1569                                         __func__);
1570                                 dev_err(dev, "skb[%p] PROBLEM\n", skb);
1571                                 dev_err(dev, "         skbdata[%p]\n",
1572                                                 skb->data);
1573                                 dev_err(dev, "         skblen[%x]\n", skb->len);
1574                                 dev_err(dev, "         paddr[%p]\n", paddr);
1575                                 dev_err(dev, "         paddrl[%x]\n", paddrl);
1576                                 dev_err(dev, "         paddrh[%x]\n", paddrh);
1577                                 dev_err(dev, "         rcvq->head[%p]\n",
1578                                                 rcvq->head);
1579                                 dev_err(dev, "         rcvq->tail[%p]\n",
1580                                                 rcvq->tail);
1581                                 dev_err(dev, "         rcvq->count[%x]\n",
1582                                                 rcvq->count);
1583                                 dev_err(dev, "GIVE TO CARD ANYWAY\n");
1584                         }
1585 #endif
1586                         if (paddrh == 0) {
1587                                 slic_reg32_write(&adapter->slic_regs->slic_hbar,
1588                                                  (u32)paddrl, DONT_FLUSH);
1589                         } else {
1590                                 slic_reg64_write(adapter,
1591                                         &adapter->slic_regs->slic_hbar64,
1592                                         paddrl,
1593                                         &adapter->slic_regs->slic_addr_upper,
1594                                         paddrh, DONT_FLUSH);
1595                         }
1596                         if (rcvq->head)
1597                                 rcvq->tail->next = skb;
1598                         else
1599                                 rcvq->head = skb;
1600                         rcvq->tail = skb;
1601                         rcvq->count++;
1602                         i++;
1603                 } else {
1604                         dev_err(&adapter->netdev->dev,
1605                                 "slic_rcvqueue_fill could only get [%d] skbuffs\n",
1606                                 i);
1607                         break;
1608                 }
1609         }
1610         return i;
1611 }
1612
1613 static void slic_rcvqueue_free(struct adapter *adapter)
1614 {
1615         struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1616         struct sk_buff *skb;
1617
1618         while (rcvq->head) {
1619                 skb = rcvq->head;
1620                 rcvq->head = rcvq->head->next;
1621                 dev_kfree_skb(skb);
1622         }
1623         rcvq->tail = NULL;
1624         rcvq->head = NULL;
1625         rcvq->count = 0;
1626 }
1627
1628 static int slic_rcvqueue_init(struct adapter *adapter)
1629 {
1630         int i, count;
1631         struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1632
1633         rcvq->tail = NULL;
1634         rcvq->head = NULL;
1635         rcvq->size = SLIC_RCVQ_ENTRIES;
1636         rcvq->errors = 0;
1637         rcvq->count = 0;
1638         i = SLIC_RCVQ_ENTRIES / SLIC_RCVQ_FILLENTRIES;
1639         count = 0;
1640         while (i) {
1641                 count += slic_rcvqueue_fill(adapter);
1642                 i--;
1643         }
1644         if (rcvq->count < SLIC_RCVQ_MINENTRIES) {
1645                 slic_rcvqueue_free(adapter);
1646                 return -ENOMEM;
1647         }
1648         return 0;
1649 }
1650
1651 static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter)
1652 {
1653         struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1654         struct sk_buff *skb;
1655         struct slic_rcvbuf *rcvbuf;
1656         int count;
1657
1658         if (rcvq->count) {
1659                 skb = rcvq->head;
1660                 rcvbuf = (struct slic_rcvbuf *)skb->head;
1661
1662                 if (rcvbuf->status & IRHDDR_SVALID) {
1663                         rcvq->head = rcvq->head->next;
1664                         skb->next = NULL;
1665                         rcvq->count--;
1666                 } else {
1667                         skb = NULL;
1668                 }
1669         } else {
1670                 dev_err(&adapter->netdev->dev,
1671                         "RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq, rcvq->count);
1672                 skb = NULL;
1673         }
1674         while (rcvq->count < SLIC_RCVQ_FILLTHRESH) {
1675                 count = slic_rcvqueue_fill(adapter);
1676                 if (!count)
1677                         break;
1678         }
1679         if (skb)
1680                 rcvq->errors = 0;
1681         return skb;
1682 }
1683
1684 static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb)
1685 {
1686         struct slic_rcvqueue *rcvq = &adapter->rcvqueue;
1687         void *paddr;
1688         u32 paddrl;
1689         u32 paddrh;
1690         struct slic_rcvbuf *rcvbuf = (struct slic_rcvbuf *)skb->head;
1691         struct device *dev;
1692
1693         paddr = (void *)(unsigned long)
1694                 pci_map_single(adapter->pcidev, skb->head,
1695                                SLIC_RCVQ_RCVBUFSIZE, PCI_DMA_FROMDEVICE);
1696         rcvbuf->status = 0;
1697         skb->next = NULL;
1698
1699         paddrl = SLIC_GET_ADDR_LOW(paddr);
1700         paddrh = SLIC_GET_ADDR_HIGH(paddr);
1701
1702         if (paddrl == 0) {
1703                 dev = &adapter->netdev->dev;
1704                 dev_err(dev, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1705                         __func__);
1706                 dev_err(dev, "skb[%p] PROBLEM\n", skb);
1707                 dev_err(dev, "         skbdata[%p]\n", skb->data);
1708                 dev_err(dev, "         skblen[%x]\n", skb->len);
1709                 dev_err(dev, "         paddr[%p]\n", paddr);
1710                 dev_err(dev, "         paddrl[%x]\n", paddrl);
1711                 dev_err(dev, "         paddrh[%x]\n", paddrh);
1712                 dev_err(dev, "         rcvq->head[%p]\n", rcvq->head);
1713                 dev_err(dev, "         rcvq->tail[%p]\n", rcvq->tail);
1714                 dev_err(dev, "         rcvq->count[%x]\n", rcvq->count);
1715         }
1716         if (paddrh == 0) {
1717                 slic_reg32_write(&adapter->slic_regs->slic_hbar, (u32)paddrl,
1718                                  DONT_FLUSH);
1719         } else {
1720                 slic_reg64_write(adapter, &adapter->slic_regs->slic_hbar64,
1721                                  paddrl, &adapter->slic_regs->slic_addr_upper,
1722                                  paddrh, DONT_FLUSH);
1723         }
1724         if (rcvq->head)
1725                 rcvq->tail->next = skb;
1726         else
1727                 rcvq->head = skb;
1728         rcvq->tail = skb;
1729         rcvq->count++;
1730         return rcvq->count;
1731 }
1732
1733 /*
1734  * slic_link_event_handler -
1735  *
1736  * Initiate a link configuration sequence.  The link configuration begins
1737  * by issuing a READ_LINK_STATUS command to the Utility Processor on the
1738  * SLIC.  Since the command finishes asynchronously, the slic_upr_comlete
1739  * routine will follow it up witha UP configuration write command, which
1740  * will also complete asynchronously.
1741  *
1742  */
1743 static int slic_link_event_handler(struct adapter *adapter)
1744 {
1745         int status;
1746         struct slic_shmem *pshmem;
1747
1748         if (adapter->state != ADAPT_UP) {
1749                 /* Adapter is not operational.  Ignore.  */
1750                 return -ENODEV;
1751         }
1752
1753         pshmem = (struct slic_shmem *)(unsigned long)adapter->phys_shmem;
1754
1755 #if BITS_PER_LONG == 64
1756         status = slic_upr_request(adapter,
1757                                   SLIC_UPR_RLSR,
1758                                   SLIC_GET_ADDR_LOW(&pshmem->linkstatus),
1759                                   SLIC_GET_ADDR_HIGH(&pshmem->linkstatus),
1760                                   0, 0);
1761 #else
1762         status = slic_upr_request(adapter, SLIC_UPR_RLSR,
1763                 (u32)&pshmem->linkstatus,       /* no 4GB wrap guaranteed */
1764                                   0, 0, 0);
1765 #endif
1766         return status;
1767 }
1768
1769 static void slic_init_cleanup(struct adapter *adapter)
1770 {
1771         if (adapter->intrregistered) {
1772                 adapter->intrregistered = 0;
1773                 free_irq(adapter->netdev->irq, adapter->netdev);
1774
1775         }
1776         if (adapter->pshmem) {
1777                 pci_free_consistent(adapter->pcidev,
1778                                     sizeof(struct slic_shmem),
1779                                     adapter->pshmem, adapter->phys_shmem);
1780                 adapter->pshmem = NULL;
1781                 adapter->phys_shmem = (dma_addr_t)(unsigned long)NULL;
1782         }
1783
1784         if (adapter->pingtimerset) {
1785                 adapter->pingtimerset = 0;
1786                 del_timer(&adapter->pingtimer);
1787         }
1788
1789         slic_rspqueue_free(adapter);
1790         slic_cmdq_free(adapter);
1791         slic_rcvqueue_free(adapter);
1792 }
1793
1794 /*
1795  *  Allocate a mcast_address structure to hold the multicast address.
1796  *  Link it in.
1797  */
1798 static int slic_mcast_add_list(struct adapter *adapter, char *address)
1799 {
1800         struct mcast_address *mcaddr, *mlist;
1801
1802         /* Check to see if it already exists */
1803         mlist = adapter->mcastaddrs;
1804         while (mlist) {
1805                 if (ether_addr_equal(mlist->address, address))
1806                         return 0;
1807                 mlist = mlist->next;
1808         }
1809
1810         /* Doesn't already exist.  Allocate a structure to hold it */
1811         mcaddr = kmalloc(sizeof(struct mcast_address), GFP_ATOMIC);
1812         if (mcaddr == NULL)
1813                 return 1;
1814
1815         ether_addr_copy(mcaddr->address, address);
1816
1817         mcaddr->next = adapter->mcastaddrs;
1818         adapter->mcastaddrs = mcaddr;
1819
1820         return 0;
1821 }
1822
1823 static void slic_mcast_set_list(struct net_device *dev)
1824 {
1825         struct adapter *adapter = netdev_priv(dev);
1826         int status = 0;
1827         char *addresses;
1828         struct netdev_hw_addr *ha;
1829
1830         netdev_for_each_mc_addr(ha, dev) {
1831                 addresses = (char *)&ha->addr;
1832                 status = slic_mcast_add_list(adapter, addresses);
1833                 if (status != 0)
1834                         break;
1835                 slic_mcast_set_bit(adapter, addresses);
1836         }
1837
1838         if (adapter->devflags_prev != dev->flags) {
1839                 adapter->macopts = MAC_DIRECTED;
1840                 if (dev->flags) {
1841                         if (dev->flags & IFF_BROADCAST)
1842                                 adapter->macopts |= MAC_BCAST;
1843                         if (dev->flags & IFF_PROMISC)
1844                                 adapter->macopts |= MAC_PROMISC;
1845                         if (dev->flags & IFF_ALLMULTI)
1846                                 adapter->macopts |= MAC_ALLMCAST;
1847                         if (dev->flags & IFF_MULTICAST)
1848                                 adapter->macopts |= MAC_MCAST;
1849                 }
1850                 adapter->devflags_prev = dev->flags;
1851                 slic_config_set(adapter, true);
1852         } else {
1853                 if (status == 0)
1854                         slic_mcast_set_mask(adapter);
1855         }
1856 }
1857
1858 #define  XMIT_FAIL_LINK_STATE               1
1859 #define  XMIT_FAIL_ZERO_LENGTH              2
1860 #define  XMIT_FAIL_HOSTCMD_FAIL             3
1861
1862 static void slic_xmit_build_request(struct adapter *adapter,
1863                              struct slic_hostcmd *hcmd, struct sk_buff *skb)
1864 {
1865         struct slic_host64_cmd *ihcmd;
1866         ulong phys_addr;
1867
1868         ihcmd = &hcmd->cmd64;
1869
1870         ihcmd->flags = adapter->port << IHFLG_IFSHFT;
1871         ihcmd->command = IHCMD_XMT_REQ;
1872         ihcmd->u.slic_buffers.totlen = skb->len;
1873         phys_addr = pci_map_single(adapter->pcidev, skb->data, skb->len,
1874                         PCI_DMA_TODEVICE);
1875         ihcmd->u.slic_buffers.bufs[0].paddrl = SLIC_GET_ADDR_LOW(phys_addr);
1876         ihcmd->u.slic_buffers.bufs[0].paddrh = SLIC_GET_ADDR_HIGH(phys_addr);
1877         ihcmd->u.slic_buffers.bufs[0].length = skb->len;
1878 #if BITS_PER_LONG == 64
1879         hcmd->cmdsize = (u32)((((u64)&ihcmd->u.slic_buffers.bufs[1] -
1880                                      (u64)hcmd) + 31) >> 5);
1881 #else
1882         hcmd->cmdsize = (((u32)&ihcmd->u.slic_buffers.bufs[1] -
1883                                        (u32)hcmd) + 31) >> 5;
1884 #endif
1885 }
1886
1887 static void slic_xmit_fail(struct adapter *adapter,
1888                     struct sk_buff *skb,
1889                     void *cmd, u32 skbtype, u32 status)
1890 {
1891         if (adapter->xmitq_full)
1892                 netif_stop_queue(adapter->netdev);
1893         if ((cmd == NULL) && (status <= XMIT_FAIL_HOSTCMD_FAIL)) {
1894                 switch (status) {
1895                 case XMIT_FAIL_LINK_STATE:
1896                         dev_err(&adapter->netdev->dev,
1897                                 "reject xmit skb[%p: %x] linkstate[%s] adapter[%s:%d] card[%s:%d]\n",
1898                                 skb, skb->pkt_type,
1899                                 SLIC_LINKSTATE(adapter->linkstate),
1900                                 SLIC_ADAPTER_STATE(adapter->state),
1901                                 adapter->state,
1902                                 SLIC_CARD_STATE(adapter->card->state),
1903                                 adapter->card->state);
1904                         break;
1905                 case XMIT_FAIL_ZERO_LENGTH:
1906                         dev_err(&adapter->netdev->dev,
1907                                 "xmit_start skb->len == 0 skb[%p] type[%x]\n",
1908                                 skb, skb->pkt_type);
1909                         break;
1910                 case XMIT_FAIL_HOSTCMD_FAIL:
1911                         dev_err(&adapter->netdev->dev,
1912                                 "xmit_start skb[%p] type[%x] No host commands available\n",
1913                                 skb, skb->pkt_type);
1914                         break;
1915                 }
1916         }
1917         dev_kfree_skb(skb);
1918         adapter->netdev->stats.tx_dropped++;
1919 }
1920
1921 static void slic_rcv_handle_error(struct adapter *adapter,
1922                                         struct slic_rcvbuf *rcvbuf)
1923 {
1924         struct slic_hddr_wds *hdr = (struct slic_hddr_wds *)rcvbuf->data;
1925         struct net_device *netdev = adapter->netdev;
1926
1927         if (adapter->devid != SLIC_1GB_DEVICE_ID) {
1928                 if (hdr->frame_status14 & VRHSTAT_802OE)
1929                         adapter->if_events.oflow802++;
1930                 if (hdr->frame_status14 & VRHSTAT_TPOFLO)
1931                         adapter->if_events.Tprtoflow++;
1932                 if (hdr->frame_status_b14 & VRHSTATB_802UE)
1933                         adapter->if_events.uflow802++;
1934                 if (hdr->frame_status_b14 & VRHSTATB_RCVE) {
1935                         adapter->if_events.rcvearly++;
1936                         netdev->stats.rx_fifo_errors++;
1937                 }
1938                 if (hdr->frame_status_b14 & VRHSTATB_BUFF) {
1939                         adapter->if_events.Bufov++;
1940                         netdev->stats.rx_over_errors++;
1941                 }
1942                 if (hdr->frame_status_b14 & VRHSTATB_CARRE) {
1943                         adapter->if_events.Carre++;
1944                         netdev->stats.tx_carrier_errors++;
1945                 }
1946                 if (hdr->frame_status_b14 & VRHSTATB_LONGE)
1947                         adapter->if_events.Longe++;
1948                 if (hdr->frame_status_b14 & VRHSTATB_PREA)
1949                         adapter->if_events.Invp++;
1950                 if (hdr->frame_status_b14 & VRHSTATB_CRC) {
1951                         adapter->if_events.Crc++;
1952                         netdev->stats.rx_crc_errors++;
1953                 }
1954                 if (hdr->frame_status_b14 & VRHSTATB_DRBL)
1955                         adapter->if_events.Drbl++;
1956                 if (hdr->frame_status_b14 & VRHSTATB_CODE)
1957                         adapter->if_events.Code++;
1958                 if (hdr->frame_status_b14 & VRHSTATB_TPCSUM)
1959                         adapter->if_events.TpCsum++;
1960                 if (hdr->frame_status_b14 & VRHSTATB_TPHLEN)
1961                         adapter->if_events.TpHlen++;
1962                 if (hdr->frame_status_b14 & VRHSTATB_IPCSUM)
1963                         adapter->if_events.IpCsum++;
1964                 if (hdr->frame_status_b14 & VRHSTATB_IPLERR)
1965                         adapter->if_events.IpLen++;
1966                 if (hdr->frame_status_b14 & VRHSTATB_IPHERR)
1967                         adapter->if_events.IpHlen++;
1968         } else {
1969                 if (hdr->frame_statusGB & VGBSTAT_XPERR) {
1970                         u32 xerr = hdr->frame_statusGB >> VGBSTAT_XERRSHFT;
1971
1972                         if (xerr == VGBSTAT_XCSERR)
1973                                 adapter->if_events.TpCsum++;
1974                         if (xerr == VGBSTAT_XUFLOW)
1975                                 adapter->if_events.Tprtoflow++;
1976                         if (xerr == VGBSTAT_XHLEN)
1977                                 adapter->if_events.TpHlen++;
1978                 }
1979                 if (hdr->frame_statusGB & VGBSTAT_NETERR) {
1980                         u32 nerr =
1981                             (hdr->
1982                              frame_statusGB >> VGBSTAT_NERRSHFT) &
1983                             VGBSTAT_NERRMSK;
1984                         if (nerr == VGBSTAT_NCSERR)
1985                                 adapter->if_events.IpCsum++;
1986                         if (nerr == VGBSTAT_NUFLOW)
1987                                 adapter->if_events.IpLen++;
1988                         if (nerr == VGBSTAT_NHLEN)
1989                                 adapter->if_events.IpHlen++;
1990                 }
1991                 if (hdr->frame_statusGB & VGBSTAT_LNKERR) {
1992                         u32 lerr = hdr->frame_statusGB & VGBSTAT_LERRMSK;
1993
1994                         if (lerr == VGBSTAT_LDEARLY)
1995                                 adapter->if_events.rcvearly++;
1996                         if (lerr == VGBSTAT_LBOFLO)
1997                                 adapter->if_events.Bufov++;
1998                         if (lerr == VGBSTAT_LCODERR)
1999                                 adapter->if_events.Code++;
2000                         if (lerr == VGBSTAT_LDBLNBL)
2001                                 adapter->if_events.Drbl++;
2002                         if (lerr == VGBSTAT_LCRCERR)
2003                                 adapter->if_events.Crc++;
2004                         if (lerr == VGBSTAT_LOFLO)
2005                                 adapter->if_events.oflow802++;
2006                         if (lerr == VGBSTAT_LUFLO)
2007                                 adapter->if_events.uflow802++;
2008                 }
2009         }
2010 }
2011
2012 #define TCP_OFFLOAD_FRAME_PUSHFLAG  0x10000000
2013 #define M_FAST_PATH                 0x0040
2014
2015 static void slic_rcv_handler(struct adapter *adapter)
2016 {
2017         struct net_device *netdev = adapter->netdev;
2018         struct sk_buff *skb;
2019         struct slic_rcvbuf *rcvbuf;
2020         u32 frames = 0;
2021
2022         while ((skb = slic_rcvqueue_getnext(adapter))) {
2023                 u32 rx_bytes;
2024
2025                 rcvbuf = (struct slic_rcvbuf *)skb->head;
2026                 adapter->card->events++;
2027                 if (rcvbuf->status & IRHDDR_ERR) {
2028                         adapter->rx_errors++;
2029                         slic_rcv_handle_error(adapter, rcvbuf);
2030                         slic_rcvqueue_reinsert(adapter, skb);
2031                         continue;
2032                 }
2033
2034                 if (!slic_mac_filter(adapter, (struct ether_header *)
2035                                         rcvbuf->data)) {
2036                         slic_rcvqueue_reinsert(adapter, skb);
2037                         continue;
2038                 }
2039                 skb_pull(skb, SLIC_RCVBUF_HEADSIZE);
2040                 rx_bytes = (rcvbuf->length & IRHDDR_FLEN_MSK);
2041                 skb_put(skb, rx_bytes);
2042                 netdev->stats.rx_packets++;
2043                 netdev->stats.rx_bytes += rx_bytes;
2044 #if SLIC_OFFLOAD_IP_CHECKSUM
2045                 skb->ip_summed = CHECKSUM_UNNECESSARY;
2046 #endif
2047
2048                 skb->dev = adapter->netdev;
2049                 skb->protocol = eth_type_trans(skb, skb->dev);
2050                 netif_rx(skb);
2051
2052                 ++frames;
2053 #if SLIC_INTERRUPT_PROCESS_LIMIT
2054                 if (frames >= SLIC_RCVQ_MAX_PROCESS_ISR) {
2055                         adapter->rcv_interrupt_yields++;
2056                         break;
2057                 }
2058 #endif
2059         }
2060         adapter->max_isr_rcvs = max(adapter->max_isr_rcvs, frames);
2061 }
2062
2063 static void slic_xmit_complete(struct adapter *adapter)
2064 {
2065         struct slic_hostcmd *hcmd;
2066         struct slic_rspbuf *rspbuf;
2067         u32 frames = 0;
2068         struct slic_handle_word slic_handle_word;
2069
2070         do {
2071                 rspbuf = slic_rspqueue_getnext(adapter);
2072                 if (!rspbuf)
2073                         break;
2074                 adapter->xmit_completes++;
2075                 adapter->card->events++;
2076                 /*
2077                  * Get the complete host command buffer
2078                  */
2079                 slic_handle_word.handle_token = rspbuf->hosthandle;
2080                 hcmd =
2081                         adapter->slic_handles[slic_handle_word.handle_index].
2082                                                                         address;
2083 /*      hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */
2084                 if (hcmd->type == SLIC_CMD_DUMB) {
2085                         if (hcmd->skb)
2086                                 dev_kfree_skb_irq(hcmd->skb);
2087                         slic_cmdq_putdone_irq(adapter, hcmd);
2088                 }
2089                 rspbuf->status = 0;
2090                 rspbuf->hosthandle = 0;
2091                 frames++;
2092         } while (1);
2093         adapter->max_isr_xmits = max(adapter->max_isr_xmits, frames);
2094 }
2095
2096 static void slic_interrupt_card_up(u32 isr, struct adapter *adapter,
2097                         struct net_device *dev)
2098 {
2099         if (isr & ~ISR_IO) {
2100                 if (isr & ISR_ERR) {
2101                         adapter->error_interrupts++;
2102                         if (isr & ISR_RMISS) {
2103                                 int count;
2104                                 int pre_count;
2105                                 int errors;
2106
2107                                 struct slic_rcvqueue *rcvq =
2108                                         &adapter->rcvqueue;
2109
2110                                 adapter->error_rmiss_interrupts++;
2111
2112                                 if (!rcvq->errors)
2113                                         rcv_count = rcvq->count;
2114                                 pre_count = rcvq->count;
2115                                 errors = rcvq->errors;
2116
2117                                 while (rcvq->count < SLIC_RCVQ_FILLTHRESH) {
2118                                         count = slic_rcvqueue_fill(adapter);
2119                                         if (!count)
2120                                                 break;
2121                                 }
2122                         } else if (isr & ISR_XDROP) {
2123                                 dev_err(&dev->dev,
2124                                                 "isr & ISR_ERR [%x] ISR_XDROP\n",
2125                                                 isr);
2126                         } else {
2127                                 dev_err(&dev->dev,
2128                                                 "isr & ISR_ERR [%x]\n",
2129                                                 isr);
2130                         }
2131                 }
2132
2133                 if (isr & ISR_LEVENT) {
2134                         adapter->linkevent_interrupts++;
2135                         if (slic_link_event_handler(adapter))
2136                                 adapter->linkevent_interrupts--;
2137                 }
2138
2139                 if ((isr & ISR_UPC) || (isr & ISR_UPCERR) ||
2140                     (isr & ISR_UPCBSY)) {
2141                         adapter->upr_interrupts++;
2142                         slic_upr_request_complete(adapter, isr);
2143                 }
2144         }
2145
2146         if (isr & ISR_RCV) {
2147                 adapter->rcv_interrupts++;
2148                 slic_rcv_handler(adapter);
2149         }
2150
2151         if (isr & ISR_CMD) {
2152                 adapter->xmit_interrupts++;
2153                 slic_xmit_complete(adapter);
2154         }
2155 }
2156
2157 static irqreturn_t slic_interrupt(int irq, void *dev_id)
2158 {
2159         struct net_device *dev = dev_id;
2160         struct adapter *adapter = netdev_priv(dev);
2161         u32 isr;
2162
2163         if ((adapter->pshmem) && (adapter->pshmem->isr)) {
2164                 slic_reg32_write(&adapter->slic_regs->slic_icr,
2165                                  ICR_INT_MASK, FLUSH);
2166                 isr = adapter->isrcopy = adapter->pshmem->isr;
2167                 adapter->pshmem->isr = 0;
2168                 adapter->num_isrs++;
2169                 switch (adapter->card->state) {
2170                 case CARD_UP:
2171                         slic_interrupt_card_up(isr, adapter, dev);
2172                         break;
2173
2174                 case CARD_DOWN:
2175                         if ((isr & ISR_UPC) ||
2176                             (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {
2177                                 adapter->upr_interrupts++;
2178                                 slic_upr_request_complete(adapter, isr);
2179                         }
2180                         break;
2181                 }
2182
2183                 adapter->isrcopy = 0;
2184                 adapter->all_reg_writes += 2;
2185                 adapter->isr_reg_writes++;
2186                 slic_reg32_write(&adapter->slic_regs->slic_isr, 0, FLUSH);
2187         } else {
2188                 adapter->false_interrupts++;
2189         }
2190         return IRQ_HANDLED;
2191 }
2192
2193 #define NORMAL_ETHFRAME     0
2194
2195 static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev)
2196 {
2197         struct sliccard *card;
2198         struct adapter *adapter = netdev_priv(dev);
2199         struct slic_hostcmd *hcmd = NULL;
2200         u32 status = 0;
2201         void *offloadcmd = NULL;
2202
2203         card = adapter->card;
2204         if ((adapter->linkstate != LINK_UP) ||
2205             (adapter->state != ADAPT_UP) || (card->state != CARD_UP)) {
2206                 status = XMIT_FAIL_LINK_STATE;
2207                 goto xmit_fail;
2208
2209         } else if (skb->len == 0) {
2210                 status = XMIT_FAIL_ZERO_LENGTH;
2211                 goto xmit_fail;
2212         }
2213
2214         hcmd = slic_cmdq_getfree(adapter);
2215         if (!hcmd) {
2216                 adapter->xmitq_full = 1;
2217                 status = XMIT_FAIL_HOSTCMD_FAIL;
2218                 goto xmit_fail;
2219         }
2220         hcmd->skb = skb;
2221         hcmd->busy = 1;
2222         hcmd->type = SLIC_CMD_DUMB;
2223         slic_xmit_build_request(adapter, hcmd, skb);
2224         dev->stats.tx_packets++;
2225         dev->stats.tx_bytes += skb->len;
2226
2227 #ifdef DEBUG_DUMP
2228         if (adapter->kill_card) {
2229                 struct slic_host64_cmd ihcmd;
2230
2231                 ihcmd = &hcmd->cmd64;
2232
2233                 ihcmd->flags |= 0x40;
2234                 adapter->kill_card = 0; /* only do this once */
2235         }
2236 #endif
2237         if (hcmd->paddrh == 0) {
2238                 slic_reg32_write(&adapter->slic_regs->slic_cbar,
2239                                  (hcmd->paddrl | hcmd->cmdsize), DONT_FLUSH);
2240         } else {
2241                 slic_reg64_write(adapter, &adapter->slic_regs->slic_cbar64,
2242                                  (hcmd->paddrl | hcmd->cmdsize),
2243                                  &adapter->slic_regs->slic_addr_upper,
2244                                  hcmd->paddrh, DONT_FLUSH);
2245         }
2246 xmit_done:
2247         return NETDEV_TX_OK;
2248 xmit_fail:
2249         slic_xmit_fail(adapter, skb, offloadcmd, NORMAL_ETHFRAME, status);
2250         goto xmit_done;
2251 }
2252
2253 static void slic_adapter_freeresources(struct adapter *adapter)
2254 {
2255         slic_init_cleanup(adapter);
2256         adapter->error_interrupts = 0;
2257         adapter->rcv_interrupts = 0;
2258         adapter->xmit_interrupts = 0;
2259         adapter->linkevent_interrupts = 0;
2260         adapter->upr_interrupts = 0;
2261         adapter->num_isrs = 0;
2262         adapter->xmit_completes = 0;
2263         adapter->rcv_broadcasts = 0;
2264         adapter->rcv_multicasts = 0;
2265         adapter->rcv_unicasts = 0;
2266 }
2267
2268 static int slic_adapter_allocresources(struct adapter *adapter,
2269                                        unsigned long *flags)
2270 {
2271         if (!adapter->intrregistered) {
2272                 int retval;
2273
2274                 spin_unlock_irqrestore(&slic_global.driver_lock, *flags);
2275
2276                 retval = request_irq(adapter->netdev->irq,
2277                                      &slic_interrupt,
2278                                      IRQF_SHARED,
2279                                      adapter->netdev->name, adapter->netdev);
2280
2281                 spin_lock_irqsave(&slic_global.driver_lock, *flags);
2282
2283                 if (retval) {
2284                         dev_err(&adapter->netdev->dev,
2285                                 "request_irq (%s) FAILED [%x]\n",
2286                                 adapter->netdev->name, retval);
2287                         return retval;
2288                 }
2289                 adapter->intrregistered = 1;
2290         }
2291         return 0;
2292 }
2293
2294 /*
2295  *  slic_if_init
2296  *
2297  *  Perform initialization of our slic interface.
2298  *
2299  */
2300 static int slic_if_init(struct adapter *adapter, unsigned long *flags)
2301 {
2302         struct sliccard *card = adapter->card;
2303         struct net_device *dev = adapter->netdev;
2304         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
2305         struct slic_shmem *pshmem;
2306         int rc;
2307
2308         /* adapter should be down at this point */
2309         if (adapter->state != ADAPT_DOWN) {
2310                 dev_err(&dev->dev, "%s: adapter->state != ADAPT_DOWN\n",
2311                         __func__);
2312                 rc = -EIO;
2313                 goto err;
2314         }
2315
2316         adapter->devflags_prev = dev->flags;
2317         adapter->macopts = MAC_DIRECTED;
2318         if (dev->flags) {
2319                 if (dev->flags & IFF_BROADCAST)
2320                         adapter->macopts |= MAC_BCAST;
2321                 if (dev->flags & IFF_PROMISC)
2322                         adapter->macopts |= MAC_PROMISC;
2323                 if (dev->flags & IFF_ALLMULTI)
2324                         adapter->macopts |= MAC_ALLMCAST;
2325                 if (dev->flags & IFF_MULTICAST)
2326                         adapter->macopts |= MAC_MCAST;
2327         }
2328         rc = slic_adapter_allocresources(adapter, flags);
2329         if (rc) {
2330                 dev_err(&dev->dev, "slic_adapter_allocresources FAILED %x\n",
2331                         rc);
2332                 slic_adapter_freeresources(adapter);
2333                 goto err;
2334         }
2335
2336         if (!adapter->queues_initialized) {
2337                 rc = slic_rspqueue_init(adapter);
2338                 if (rc)
2339                         goto err;
2340                 rc = slic_cmdq_init(adapter);
2341                 if (rc)
2342                         goto err;
2343                 rc = slic_rcvqueue_init(adapter);
2344                 if (rc)
2345                         goto err;
2346                 adapter->queues_initialized = 1;
2347         }
2348
2349         slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
2350         mdelay(1);
2351
2352         if (!adapter->isp_initialized) {
2353                 unsigned long flags;
2354
2355                 pshmem = (struct slic_shmem *)(unsigned long)
2356                          adapter->phys_shmem;
2357
2358                 spin_lock_irqsave(&adapter->bit64reglock, flags);
2359
2360 #if BITS_PER_LONG == 64
2361                 slic_reg32_write(&slic_regs->slic_addr_upper,
2362                                  SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH);
2363                 slic_reg32_write(&slic_regs->slic_isp,
2364                                  SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);
2365 #else
2366                 slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH);
2367                 slic_reg32_write(&slic_regs->slic_isp, (u32)&pshmem->isr,
2368                                 FLUSH);
2369 #endif
2370                 spin_unlock_irqrestore(&adapter->bit64reglock, flags);
2371                 adapter->isp_initialized = 1;
2372         }
2373
2374         adapter->state = ADAPT_UP;
2375         if (!card->loadtimerset) {
2376                 setup_timer(&card->loadtimer, &slic_timer_load_check,
2377                             (ulong)card);
2378                 card->loadtimer.expires =
2379                     jiffies + (SLIC_LOADTIMER_PERIOD * HZ);
2380                 add_timer(&card->loadtimer);
2381
2382                 card->loadtimerset = 1;
2383         }
2384
2385         if (!adapter->pingtimerset) {
2386                 setup_timer(&adapter->pingtimer, &slic_timer_ping, (ulong)dev);
2387                 adapter->pingtimer.expires =
2388                     jiffies + (PING_TIMER_INTERVAL * HZ);
2389                 add_timer(&adapter->pingtimer);
2390                 adapter->pingtimerset = 1;
2391                 adapter->card->pingstatus = ISR_PINGMASK;
2392         }
2393
2394         /*
2395          *    clear any pending events, then enable interrupts
2396          */
2397         adapter->isrcopy = 0;
2398         adapter->pshmem->isr = 0;
2399         slic_reg32_write(&slic_regs->slic_isr, 0, FLUSH);
2400         slic_reg32_write(&slic_regs->slic_icr, ICR_INT_ON, FLUSH);
2401
2402         slic_link_config(adapter, LINK_AUTOSPEED, LINK_AUTOD);
2403         rc = slic_link_event_handler(adapter);
2404         if (rc) {
2405                 /* disable interrupts then clear pending events */
2406                 slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
2407                 slic_reg32_write(&slic_regs->slic_isr, 0, FLUSH);
2408                 if (adapter->pingtimerset) {
2409                         del_timer(&adapter->pingtimer);
2410                         adapter->pingtimerset = 0;
2411                 }
2412                 if (card->loadtimerset) {
2413                         del_timer(&card->loadtimer);
2414                         card->loadtimerset = 0;
2415                 }
2416                 adapter->state = ADAPT_DOWN;
2417                 slic_adapter_freeresources(adapter);
2418         }
2419
2420 err:
2421         return rc;
2422 }
2423
2424 static int slic_entry_open(struct net_device *dev)
2425 {
2426         struct adapter *adapter = netdev_priv(dev);
2427         struct sliccard *card = adapter->card;
2428         unsigned long flags;
2429         int status;
2430
2431         netif_stop_queue(adapter->netdev);
2432
2433         spin_lock_irqsave(&slic_global.driver_lock, flags);
2434         if (!adapter->activated) {
2435                 card->adapters_activated++;
2436                 slic_global.num_slic_ports_active++;
2437                 adapter->activated = 1;
2438         }
2439         status = slic_if_init(adapter, &flags);
2440
2441         if (status != 0) {
2442                 if (adapter->activated) {
2443                         card->adapters_activated--;
2444                         slic_global.num_slic_ports_active--;
2445                         adapter->activated = 0;
2446                 }
2447                 goto spin_unlock;
2448         }
2449         if (!card->master)
2450                 card->master = adapter;
2451
2452 spin_unlock:
2453         spin_unlock_irqrestore(&slic_global.driver_lock, flags);
2454         return status;
2455 }
2456
2457 static void slic_card_cleanup(struct sliccard *card)
2458 {
2459         if (card->loadtimerset) {
2460                 card->loadtimerset = 0;
2461                 del_timer_sync(&card->loadtimer);
2462         }
2463
2464         kfree(card);
2465 }
2466
2467 static void slic_entry_remove(struct pci_dev *pcidev)
2468 {
2469         struct net_device *dev = pci_get_drvdata(pcidev);
2470         struct adapter *adapter = netdev_priv(dev);
2471         struct sliccard *card;
2472         struct mcast_address *mcaddr, *mlist;
2473
2474         unregister_netdev(dev);
2475
2476         slic_adapter_freeresources(adapter);
2477         slic_unmap_mmio_space(adapter);
2478
2479         /* free multicast addresses */
2480         mlist = adapter->mcastaddrs;
2481         while (mlist) {
2482                 mcaddr = mlist;
2483                 mlist = mlist->next;
2484                 kfree(mcaddr);
2485         }
2486         card = adapter->card;
2487         card->adapters_allocated--;
2488         adapter->allocated = 0;
2489         if (!card->adapters_allocated) {
2490                 struct sliccard *curr_card = slic_global.slic_card;
2491
2492                 if (curr_card == card) {
2493                         slic_global.slic_card = card->next;
2494                 } else {
2495                         while (curr_card->next != card)
2496                                 curr_card = curr_card->next;
2497                         curr_card->next = card->next;
2498                 }
2499                 slic_global.num_slic_cards--;
2500                 slic_card_cleanup(card);
2501         }
2502         free_netdev(dev);
2503         pci_release_regions(pcidev);
2504         pci_disable_device(pcidev);
2505 }
2506
2507 static int slic_entry_halt(struct net_device *dev)
2508 {
2509         struct adapter *adapter = netdev_priv(dev);
2510         struct sliccard *card = adapter->card;
2511         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
2512         unsigned long flags;
2513
2514         spin_lock_irqsave(&slic_global.driver_lock, flags);
2515         netif_stop_queue(adapter->netdev);
2516         adapter->state = ADAPT_DOWN;
2517         adapter->linkstate = LINK_DOWN;
2518         adapter->upr_list = NULL;
2519         adapter->upr_busy = 0;
2520         adapter->devflags_prev = 0;
2521         slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
2522         adapter->all_reg_writes++;
2523         adapter->icr_reg_writes++;
2524         slic_config_clear(adapter);
2525         if (adapter->activated) {
2526                 card->adapters_activated--;
2527                 slic_global.num_slic_ports_active--;
2528                 adapter->activated = 0;
2529         }
2530 #ifdef AUTOMATIC_RESET
2531         slic_reg32_write(&slic_regs->slic_reset_iface, 0, FLUSH);
2532 #endif
2533         /*
2534          *  Reset the adapter's cmd queues
2535          */
2536         slic_cmdq_reset(adapter);
2537
2538 #ifdef AUTOMATIC_RESET
2539         if (!card->adapters_activated)
2540                 slic_card_init(card, adapter);
2541 #endif
2542
2543         spin_unlock_irqrestore(&slic_global.driver_lock, flags);
2544         return 0;
2545 }
2546
2547 static struct net_device_stats *slic_get_stats(struct net_device *dev)
2548 {
2549         struct adapter *adapter = netdev_priv(dev);
2550
2551         dev->stats.collisions = adapter->slic_stats.iface.xmit_collisions;
2552         dev->stats.rx_errors = adapter->slic_stats.iface.rcv_errors;
2553         dev->stats.tx_errors = adapter->slic_stats.iface.xmt_errors;
2554         dev->stats.rx_missed_errors = adapter->slic_stats.iface.rcv_discards;
2555         dev->stats.tx_heartbeat_errors = 0;
2556         dev->stats.tx_aborted_errors = 0;
2557         dev->stats.tx_window_errors = 0;
2558         dev->stats.tx_fifo_errors = 0;
2559         dev->stats.rx_frame_errors = 0;
2560         dev->stats.rx_length_errors = 0;
2561
2562         return &dev->stats;
2563 }
2564
2565 static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
2566 {
2567         struct adapter *adapter = netdev_priv(dev);
2568         struct ethtool_cmd edata;
2569         struct ethtool_cmd ecmd;
2570         u32 data[7];
2571         u32 intagg;
2572
2573         switch (cmd) {
2574         case SIOCSLICSETINTAGG:
2575                 if (copy_from_user(data, rq->ifr_data, 28))
2576                         return -EFAULT;
2577                 intagg = data[0];
2578                 dev_err(&dev->dev, "set interrupt aggregation to %d\n",
2579                         intagg);
2580                 slic_intagg_set(adapter, intagg);
2581                 return 0;
2582
2583         case SIOCETHTOOL:
2584                 if (copy_from_user(&ecmd, rq->ifr_data, sizeof(ecmd)))
2585                         return -EFAULT;
2586
2587                 if (ecmd.cmd == ETHTOOL_GSET) {
2588                         memset(&edata, 0, sizeof(edata));
2589                         edata.supported = (SUPPORTED_10baseT_Half |
2590                                            SUPPORTED_10baseT_Full |
2591                                            SUPPORTED_100baseT_Half |
2592                                            SUPPORTED_100baseT_Full |
2593                                            SUPPORTED_Autoneg | SUPPORTED_MII);
2594                         edata.port = PORT_MII;
2595                         edata.transceiver = XCVR_INTERNAL;
2596                         edata.phy_address = 0;
2597                         if (adapter->linkspeed == LINK_100MB)
2598                                 edata.speed = SPEED_100;
2599                         else if (adapter->linkspeed == LINK_10MB)
2600                                 edata.speed = SPEED_10;
2601                         else
2602                                 edata.speed = 0;
2603
2604                         if (adapter->linkduplex == LINK_FULLD)
2605                                 edata.duplex = DUPLEX_FULL;
2606                         else
2607                                 edata.duplex = DUPLEX_HALF;
2608
2609                         edata.autoneg = AUTONEG_ENABLE;
2610                         edata.maxtxpkt = 1;
2611                         edata.maxrxpkt = 1;
2612                         if (copy_to_user(rq->ifr_data, &edata, sizeof(edata)))
2613                                 return -EFAULT;
2614
2615                 } else if (ecmd.cmd == ETHTOOL_SSET) {
2616                         if (!capable(CAP_NET_ADMIN))
2617                                 return -EPERM;
2618
2619                         if (adapter->linkspeed == LINK_100MB)
2620                                 edata.speed = SPEED_100;
2621                         else if (adapter->linkspeed == LINK_10MB)
2622                                 edata.speed = SPEED_10;
2623                         else
2624                                 edata.speed = 0;
2625
2626                         if (adapter->linkduplex == LINK_FULLD)
2627                                 edata.duplex = DUPLEX_FULL;
2628                         else
2629                                 edata.duplex = DUPLEX_HALF;
2630
2631                         edata.autoneg = AUTONEG_ENABLE;
2632                         edata.maxtxpkt = 1;
2633                         edata.maxrxpkt = 1;
2634                         if ((ecmd.speed != edata.speed) ||
2635                             (ecmd.duplex != edata.duplex)) {
2636                                 u32 speed;
2637                                 u32 duplex;
2638
2639                                 if (ecmd.speed == SPEED_10)
2640                                         speed = 0;
2641                                 else
2642                                         speed = PCR_SPEED_100;
2643                                 if (ecmd.duplex == DUPLEX_FULL)
2644                                         duplex = PCR_DUPLEX_FULL;
2645                                 else
2646                                         duplex = 0;
2647                                 slic_link_config(adapter, speed, duplex);
2648                                 if (slic_link_event_handler(adapter))
2649                                         return -EFAULT;
2650                         }
2651                 }
2652                 return 0;
2653         default:
2654                 return -EOPNOTSUPP;
2655         }
2656 }
2657
2658 static void slic_config_pci(struct pci_dev *pcidev)
2659 {
2660         u16 pci_command;
2661         u16 new_command;
2662
2663         pci_read_config_word(pcidev, PCI_COMMAND, &pci_command);
2664
2665         new_command = pci_command | PCI_COMMAND_MASTER
2666             | PCI_COMMAND_MEMORY
2667             | PCI_COMMAND_INVALIDATE
2668             | PCI_COMMAND_PARITY | PCI_COMMAND_SERR | PCI_COMMAND_FAST_BACK;
2669         if (pci_command != new_command)
2670                 pci_write_config_word(pcidev, PCI_COMMAND, new_command);
2671 }
2672
2673 static int slic_card_init(struct sliccard *card, struct adapter *adapter)
2674 {
2675         __iomem struct slic_regs *slic_regs = adapter->slic_regs;
2676         struct slic_eeprom *peeprom;
2677         struct oslic_eeprom *pOeeprom;
2678         dma_addr_t phys_config;
2679         u32 phys_configh;
2680         u32 phys_configl;
2681         u32 i = 0;
2682         struct slic_shmem *pshmem;
2683         int status;
2684         uint macaddrs = card->card_size;
2685         ushort eecodesize;
2686         ushort dramsize;
2687         ushort ee_chksum;
2688         ushort calc_chksum;
2689         struct slic_config_mac *pmac;
2690         unsigned char fruformat;
2691         unsigned char oemfruformat;
2692         struct atk_fru *patkfru;
2693         union oemfru *poemfru;
2694         unsigned long flags;
2695
2696         /* Reset everything except PCI configuration space */
2697         slic_soft_reset(adapter);
2698
2699         /* Download the microcode */
2700         status = slic_card_download(adapter);
2701         if (status)
2702                 return status;
2703
2704         if (!card->config_set) {
2705                 peeprom = pci_alloc_consistent(adapter->pcidev,
2706                                                sizeof(struct slic_eeprom),
2707                                                &phys_config);
2708
2709                 phys_configl = SLIC_GET_ADDR_LOW(phys_config);
2710                 phys_configh = SLIC_GET_ADDR_HIGH(phys_config);
2711
2712                 if (!peeprom) {
2713                         dev_err(&adapter->pcidev->dev,
2714                                 "Failed to allocate DMA memory for EEPROM.\n");
2715                         return -ENOMEM;
2716                 }
2717
2718                 memset(peeprom, 0, sizeof(struct slic_eeprom));
2719
2720                 slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);
2721                 mdelay(1);
2722                 pshmem = (struct slic_shmem *)(unsigned long)
2723                          adapter->phys_shmem;
2724
2725                 spin_lock_irqsave(&adapter->bit64reglock, flags);
2726                 slic_reg32_write(&slic_regs->slic_addr_upper,
2727                                  SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH);
2728                 slic_reg32_write(&slic_regs->slic_isp,
2729                                  SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);
2730                 spin_unlock_irqrestore(&adapter->bit64reglock, flags);
2731
2732                 status = slic_config_get(adapter, phys_configl, phys_configh);
2733                 if (status) {
2734                         dev_err(&adapter->pcidev->dev,
2735                                 "Failed to fetch config data from device.\n");
2736                         goto card_init_err;
2737                 }
2738
2739                 for (;;) {
2740                         if (adapter->pshmem->isr) {
2741                                 if (adapter->pshmem->isr & ISR_UPC) {
2742                                         adapter->pshmem->isr = 0;
2743                                         slic_reg64_write(adapter,
2744                                                 &slic_regs->slic_isp, 0,
2745                                                 &slic_regs->slic_addr_upper,
2746                                                 0, FLUSH);
2747                                         slic_reg32_write(&slic_regs->slic_isr,
2748                                                          0, FLUSH);
2749
2750                                         slic_upr_request_complete(adapter, 0);
2751                                         break;
2752                                 }
2753
2754                                 adapter->pshmem->isr = 0;
2755                                 slic_reg32_write(&slic_regs->slic_isr,
2756                                                  0, FLUSH);
2757                         } else {
2758                                 mdelay(1);
2759                                 i++;
2760                                 if (i > 5000) {
2761                                         dev_err(&adapter->pcidev->dev,
2762                                                 "Fetch of config data timed out.\n");
2763                                         slic_reg64_write(adapter,
2764                                                 &slic_regs->slic_isp, 0,
2765                                                 &slic_regs->slic_addr_upper,
2766                                                 0, FLUSH);
2767                                         status = -EINVAL;
2768                                         goto card_init_err;
2769                                 }
2770                         }
2771                 }
2772
2773                 switch (adapter->devid) {
2774                 /* Oasis card */
2775                 case SLIC_2GB_DEVICE_ID:
2776                         /* extract EEPROM data and pointers to EEPROM data */
2777                         pOeeprom = (struct oslic_eeprom *)peeprom;
2778                         eecodesize = pOeeprom->EecodeSize;
2779                         dramsize = pOeeprom->DramSize;
2780                         pmac = pOeeprom->MacInfo;
2781                         fruformat = pOeeprom->FruFormat;
2782                         patkfru = &pOeeprom->AtkFru;
2783                         oemfruformat = pOeeprom->OemFruFormat;
2784                         poemfru = &pOeeprom->OemFru;
2785                         macaddrs = 2;
2786                         /*
2787                          * Minor kludge for Oasis card
2788                          * get 2 MAC addresses from the
2789                          * EEPROM to ensure that function 1
2790                          * gets the Port 1 MAC address
2791                          */
2792                         break;
2793                 default:
2794                         /* extract EEPROM data and pointers to EEPROM data */
2795                         eecodesize = peeprom->EecodeSize;
2796                         dramsize = peeprom->DramSize;
2797                         pmac = peeprom->u2.mac.MacInfo;
2798                         fruformat = peeprom->FruFormat;
2799                         patkfru = &peeprom->AtkFru;
2800                         oemfruformat = peeprom->OemFruFormat;
2801                         poemfru = &peeprom->OemFru;
2802                         break;
2803                 }
2804
2805                 card->config.EepromValid = false;
2806
2807                 /*  see if the EEPROM is valid by checking it's checksum */
2808                 if ((eecodesize <= MAX_EECODE_SIZE) &&
2809                     (eecodesize >= MIN_EECODE_SIZE)) {
2810
2811                         ee_chksum =
2812                             *(u16 *)((char *)peeprom + (eecodesize - 2));
2813                         /*
2814                          *  calculate the EEPROM checksum
2815                          */
2816                         calc_chksum = slic_eeprom_cksum(peeprom,
2817                                                         eecodesize - 2);
2818                         /*
2819                          *  if the ucdoe chksum flag bit worked,
2820                          *  we wouldn't need this
2821                          */
2822                         if (ee_chksum == calc_chksum)
2823                                 card->config.EepromValid = true;
2824                 }
2825                 /*  copy in the DRAM size */
2826                 card->config.DramSize = dramsize;
2827
2828                 /*  copy in the MAC address(es) */
2829                 for (i = 0; i < macaddrs; i++) {
2830                         memcpy(&card->config.MacInfo[i],
2831                                &pmac[i], sizeof(struct slic_config_mac));
2832                 }
2833
2834                 /*  copy the Alacritech FRU information */
2835                 card->config.FruFormat = fruformat;
2836                 memcpy(&card->config.AtkFru, patkfru,
2837                                                 sizeof(struct atk_fru));
2838
2839                 pci_free_consistent(adapter->pcidev,
2840                                     sizeof(struct slic_eeprom),
2841                                     peeprom, phys_config);
2842
2843                 if (!card->config.EepromValid) {
2844                         slic_reg64_write(adapter, &slic_regs->slic_isp, 0,
2845                                          &slic_regs->slic_addr_upper,
2846                                          0, FLUSH);
2847                         dev_err(&adapter->pcidev->dev, "EEPROM invalid.\n");
2848                         return -EINVAL;
2849                 }
2850
2851                 card->config_set = 1;
2852         }
2853
2854         status = slic_card_download_gbrcv(adapter);
2855         if (status)
2856                 return status;
2857
2858         if (slic_global.dynamic_intagg)
2859                 slic_intagg_set(adapter, 0);
2860         else
2861                 slic_intagg_set(adapter, intagg_delay);
2862
2863         /*
2864          *  Initialize ping status to "ok"
2865          */
2866         card->pingstatus = ISR_PINGMASK;
2867
2868         /*
2869          * Lastly, mark our card state as up and return success
2870          */
2871         card->state = CARD_UP;
2872         card->reset_in_progress = 0;
2873
2874         return 0;
2875
2876 card_init_err:
2877         pci_free_consistent(adapter->pcidev, sizeof(struct slic_eeprom),
2878                             peeprom, phys_config);
2879         return status;
2880 }
2881
2882 static void slic_init_driver(void)
2883 {
2884         if (slic_first_init) {
2885                 slic_first_init = 0;
2886                 spin_lock_init(&slic_global.driver_lock);
2887         }
2888 }
2889
2890 static void slic_init_adapter(struct net_device *netdev,
2891                               struct pci_dev *pcidev,
2892                               const struct pci_device_id *pci_tbl_entry,
2893                               void __iomem *memaddr, int chip_idx)
2894 {
2895         ushort index;
2896         struct slic_handle *pslic_handle;
2897         struct adapter *adapter = netdev_priv(netdev);
2898
2899 /*      adapter->pcidev = pcidev;*/
2900         adapter->vendid = pci_tbl_entry->vendor;
2901         adapter->devid = pci_tbl_entry->device;
2902         adapter->subsysid = pci_tbl_entry->subdevice;
2903         adapter->busnumber = pcidev->bus->number;
2904         adapter->slotnumber = ((pcidev->devfn >> 3) & 0x1F);
2905         adapter->functionnumber = (pcidev->devfn & 0x7);
2906         adapter->slic_regs = memaddr;
2907         adapter->irq = pcidev->irq;
2908 /*      adapter->netdev = netdev;*/
2909         adapter->chipid = chip_idx;
2910         adapter->port = 0;      /*adapter->functionnumber;*/
2911         adapter->cardindex = adapter->port;
2912         spin_lock_init(&adapter->upr_lock);
2913         spin_lock_init(&adapter->bit64reglock);
2914         spin_lock_init(&adapter->adapter_lock);
2915         spin_lock_init(&adapter->reset_lock);
2916         spin_lock_init(&adapter->handle_lock);
2917
2918         adapter->card_size = 1;
2919         /*
2920          * Initialize slic_handle array
2921          */
2922         /*
2923          * Start with 1.  0 is an invalid host handle.
2924          */
2925         for (index = 1, pslic_handle = &adapter->slic_handles[1];
2926              index < SLIC_CMDQ_MAXCMDS; index++, pslic_handle++) {
2927
2928                 pslic_handle->token.handle_index = index;
2929                 pslic_handle->type = SLIC_HANDLE_FREE;
2930                 pslic_handle->next = adapter->pfree_slic_handles;
2931                 adapter->pfree_slic_handles = pslic_handle;
2932         }
2933         adapter->pshmem = (struct slic_shmem *)
2934                                         pci_alloc_consistent(adapter->pcidev,
2935                                         sizeof(struct slic_shmem),
2936                                         &adapter->
2937                                         phys_shmem);
2938         if (adapter->pshmem)
2939                 memset(adapter->pshmem, 0, sizeof(struct slic_shmem));
2940 }
2941
2942 static const struct net_device_ops slic_netdev_ops = {
2943         .ndo_open               = slic_entry_open,
2944         .ndo_stop               = slic_entry_halt,
2945         .ndo_start_xmit         = slic_xmit_start,
2946         .ndo_do_ioctl           = slic_ioctl,
2947         .ndo_set_mac_address    = slic_mac_set_address,
2948         .ndo_get_stats          = slic_get_stats,
2949         .ndo_set_rx_mode        = slic_mcast_set_list,
2950         .ndo_validate_addr      = eth_validate_addr,
2951         .ndo_change_mtu         = eth_change_mtu,
2952 };
2953
2954 static u32 slic_card_locate(struct adapter *adapter)
2955 {
2956         struct sliccard *card = slic_global.slic_card;
2957         struct physcard *physcard = slic_global.phys_card;
2958         ushort card_hostid;
2959         u16 __iomem *hostid_reg;
2960         uint i;
2961         uint rdhostid_offset = 0;
2962
2963         switch (adapter->devid) {
2964         case SLIC_2GB_DEVICE_ID:
2965                 rdhostid_offset = SLIC_RDHOSTID_2GB;
2966                 break;
2967         case SLIC_1GB_DEVICE_ID:
2968                 rdhostid_offset = SLIC_RDHOSTID_1GB;
2969                 break;
2970         default:
2971                 return -ENODEV;
2972         }
2973
2974         hostid_reg =
2975             (u16 __iomem *)(((u8 __iomem *)(adapter->slic_regs)) +
2976             rdhostid_offset);
2977
2978         /* read the 16 bit hostid from SRAM */
2979         card_hostid = (ushort)readw(hostid_reg);
2980
2981         /* Initialize a new card structure if need be */
2982         if (card_hostid == SLIC_HOSTID_DEFAULT) {
2983                 card = kzalloc(sizeof(struct sliccard), GFP_KERNEL);
2984                 if (card == NULL)
2985                         return -ENOMEM;
2986
2987                 card->next = slic_global.slic_card;
2988                 slic_global.slic_card = card;
2989                 card->busnumber = adapter->busnumber;
2990                 card->slotnumber = adapter->slotnumber;
2991
2992                 /* Find an available cardnum */
2993                 for (i = 0; i < SLIC_MAX_CARDS; i++) {
2994                         if (slic_global.cardnuminuse[i] == 0) {
2995                                 slic_global.cardnuminuse[i] = 1;
2996                                 card->cardnum = i;
2997                                 break;
2998                         }
2999                 }
3000                 slic_global.num_slic_cards++;
3001         } else {
3002                 /* Card exists, find the card this adapter belongs to */
3003                 while (card) {
3004                         if (card->cardnum == card_hostid)
3005                                 break;
3006                         card = card->next;
3007                 }
3008         }
3009
3010         if (!card)
3011                 return -ENXIO;
3012         /* Put the adapter in the card's adapter list */
3013         if (!card->adapter[adapter->port]) {
3014                 card->adapter[adapter->port] = adapter;
3015                 adapter->card = card;
3016         }
3017
3018         card->card_size = 1;    /* one port per *logical* card */
3019
3020         while (physcard) {
3021                 for (i = 0; i < SLIC_MAX_PORTS; i++) {
3022                         if (physcard->adapter[i])
3023                                 break;
3024                 }
3025                 if (i == SLIC_MAX_PORTS)
3026                         break;
3027
3028                 if (physcard->adapter[i]->slotnumber == adapter->slotnumber)
3029                         break;
3030                 physcard = physcard->next;
3031         }
3032         if (!physcard) {
3033                 /* no structure allocated for this physical card yet */
3034                 physcard = kzalloc(sizeof(struct physcard), GFP_ATOMIC);
3035                 if (!physcard) {
3036                         if (card_hostid == SLIC_HOSTID_DEFAULT)
3037                                 kfree(card);
3038                         return -ENOMEM;
3039                 }
3040
3041                 physcard->next = slic_global.phys_card;
3042                 slic_global.phys_card = physcard;
3043                 physcard->adapters_allocd = 1;
3044         } else {
3045                 physcard->adapters_allocd++;
3046         }
3047         /* Note - this is ZERO relative */
3048         adapter->physport = physcard->adapters_allocd - 1;
3049
3050         physcard->adapter[adapter->physport] = adapter;
3051         adapter->physcard = physcard;
3052
3053         return 0;
3054 }
3055
3056 static int slic_entry_probe(struct pci_dev *pcidev,
3057                                const struct pci_device_id *pci_tbl_entry)
3058 {
3059         static int cards_found;
3060         static int did_version;
3061         int err = -ENODEV;
3062         struct net_device *netdev;
3063         struct adapter *adapter;
3064         void __iomem *memmapped_ioaddr = NULL;
3065         ulong mmio_start = 0;
3066         ulong mmio_len = 0;
3067         struct sliccard *card = NULL;
3068         int pci_using_dac = 0;
3069
3070         slic_global.dynamic_intagg = dynamic_intagg;
3071
3072         err = pci_enable_device(pcidev);
3073
3074         if (err)
3075                 return err;
3076
3077         if (did_version++ == 0) {
3078                 dev_info(&pcidev->dev, "%s\n", slic_banner);
3079                 dev_info(&pcidev->dev, "%s\n", slic_proc_version);
3080         }
3081
3082         if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) {
3083                 pci_using_dac = 1;
3084                 err = pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64));
3085                 if (err) {
3086                         dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for consistent allocations\n");
3087                         goto err_out_disable_pci;
3088                 }
3089         } else {
3090                 err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32));
3091                 if (err) {
3092                         dev_err(&pcidev->dev, "no usable DMA configuration\n");
3093                         goto err_out_disable_pci;
3094                 }
3095                 pci_using_dac = 0;
3096                 pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32));
3097         }
3098
3099         err = pci_request_regions(pcidev, DRV_NAME);
3100         if (err) {
3101                 dev_err(&pcidev->dev, "can't obtain PCI resources\n");
3102                 goto err_out_disable_pci;
3103         }
3104
3105         pci_set_master(pcidev);
3106
3107         netdev = alloc_etherdev(sizeof(struct adapter));
3108         if (!netdev) {
3109                 err = -ENOMEM;
3110                 goto err_out_exit_slic_probe;
3111         }
3112
3113         SET_NETDEV_DEV(netdev, &pcidev->dev);
3114
3115         pci_set_drvdata(pcidev, netdev);
3116         adapter = netdev_priv(netdev);
3117         adapter->netdev = netdev;
3118         adapter->pcidev = pcidev;
3119         if (pci_using_dac)
3120                 netdev->features |= NETIF_F_HIGHDMA;
3121
3122         mmio_start = pci_resource_start(pcidev, 0);
3123         mmio_len = pci_resource_len(pcidev, 0);
3124
3125 /*      memmapped_ioaddr =  (u32)ioremap_nocache(mmio_start, mmio_len);*/
3126         memmapped_ioaddr = ioremap(mmio_start, mmio_len);
3127         if (!memmapped_ioaddr) {
3128                 dev_err(&pcidev->dev, "cannot remap MMIO region %lx @ %lx\n",
3129                         mmio_len, mmio_start);
3130                 err = -ENOMEM;
3131                 goto err_out_free_netdev;
3132         }
3133
3134         slic_config_pci(pcidev);
3135
3136         slic_init_driver();
3137
3138         slic_init_adapter(netdev,
3139                           pcidev, pci_tbl_entry, memmapped_ioaddr, cards_found);
3140
3141         err = slic_card_locate(adapter);
3142         if (err) {
3143                 dev_err(&pcidev->dev, "cannot locate card\n");
3144                 goto err_out_unmap;
3145         }
3146
3147         card = adapter->card;
3148
3149         if (!adapter->allocated) {
3150                 card->adapters_allocated++;
3151                 adapter->allocated = 1;
3152         }
3153
3154         err = slic_card_init(card, adapter);
3155         if (err)
3156                 goto err_out_unmap;
3157
3158         slic_adapter_set_hwaddr(adapter);
3159
3160         netdev->base_addr = (unsigned long)memmapped_ioaddr;
3161         netdev->irq = adapter->irq;
3162         netdev->netdev_ops = &slic_netdev_ops;
3163
3164         strcpy(netdev->name, "eth%d");
3165         err = register_netdev(netdev);
3166         if (err) {
3167                 dev_err(&pcidev->dev, "Cannot register net device, aborting.\n");
3168                 goto err_out_unmap;
3169         }
3170
3171         cards_found++;
3172
3173         return 0;
3174
3175 err_out_unmap:
3176         iounmap(memmapped_ioaddr);
3177 err_out_free_netdev:
3178         free_netdev(netdev);
3179 err_out_exit_slic_probe:
3180         pci_release_regions(pcidev);
3181 err_out_disable_pci:
3182         pci_disable_device(pcidev);
3183         return err;
3184 }
3185
3186 static struct pci_driver slic_driver = {
3187         .name = DRV_NAME,
3188         .id_table = slic_pci_tbl,
3189         .probe = slic_entry_probe,
3190         .remove = slic_entry_remove,
3191 };
3192
3193 static int __init slic_module_init(void)
3194 {
3195         slic_init_driver();
3196
3197         return pci_register_driver(&slic_driver);
3198 }
3199
3200 static void __exit slic_module_cleanup(void)
3201 {
3202         pci_unregister_driver(&slic_driver);
3203 }
3204
3205 module_init(slic_module_init);
3206 module_exit(slic_module_cleanup);