1 /**************************************************************************
3 * Copyright 2000-2006 Alacritech, Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
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
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.
37 **************************************************************************/
42 * The SLICOSS driver for Alacritech's IS-NIC products.
44 * This driver is supposed to support:
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
50 * The driver was actually tested on Oasis and Kalahari cards.
53 * NOTE: This is the standard, non-accelerated version of Alacritech's
58 #define KLUDGE_FOR_4GB_BOUNDARY 1
59 #define DEBUG_MICROCODE 1
61 #define SLIC_INTERRUPT_PROCESS_LIMIT 1
62 #define SLIC_OFFLOAD_IP_CHECKSUM 1
63 #define STATS_TIMER_INTERVAL 2
64 #define PING_TIMER_INTERVAL 1
65 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
67 #include <linux/kernel.h>
68 #include <linux/string.h>
69 #include <linux/errno.h>
70 #include <linux/ioport.h>
71 #include <linux/slab.h>
72 #include <linux/interrupt.h>
73 #include <linux/timer.h>
74 #include <linux/pci.h>
75 #include <linux/spinlock.h>
76 #include <linux/init.h>
77 #include <linux/bitops.h>
79 #include <linux/netdevice.h>
80 #include <linux/crc32.h>
81 #include <linux/etherdevice.h>
82 #include <linux/skbuff.h>
83 #include <linux/delay.h>
84 #include <linux/seq_file.h>
85 #include <linux/kthread.h>
86 #include <linux/module.h>
88 #include <linux/firmware.h>
89 #include <linux/types.h>
90 #include <linux/dma-mapping.h>
91 #include <linux/mii.h>
92 #include <linux/if_vlan.h>
93 #include <asm/unaligned.h>
95 #include <linux/ethtool.h>
96 #include <linux/uaccess.h>
100 static uint slic_first_init
= 1;
101 static char *slic_banner
= "Alacritech SLIC Technology(tm) Server and Storage Accelerator (Non-Accelerated)";
103 static char *slic_proc_version
= "2.0.351 2006/07/14 12:26:00";
105 static struct base_driver slic_global
= { {}, 0, 0, 0, 1, NULL
, NULL
};
106 static int intagg_delay
= 100;
107 static u32 dynamic_intagg
;
108 static unsigned int rcv_count
;
110 #define DRV_NAME "slicoss"
111 #define DRV_VERSION "2.0.1"
112 #define DRV_AUTHOR "Alacritech, Inc. Engineering"
113 #define DRV_DESCRIPTION "Alacritech SLIC Techonology(tm) "\
114 "Non-Accelerated Driver"
115 #define DRV_COPYRIGHT "Copyright 2000-2006 Alacritech, Inc. "\
116 "All rights reserved."
117 #define PFX DRV_NAME " "
119 MODULE_AUTHOR(DRV_AUTHOR
);
120 MODULE_DESCRIPTION(DRV_DESCRIPTION
);
121 MODULE_LICENSE("Dual BSD/GPL");
123 module_param(dynamic_intagg
, int, 0);
124 MODULE_PARM_DESC(dynamic_intagg
, "Dynamic Interrupt Aggregation Setting");
125 module_param(intagg_delay
, int, 0);
126 MODULE_PARM_DESC(intagg_delay
, "uSec Interrupt Aggregation Delay");
128 static const struct pci_device_id slic_pci_tbl
[] = {
129 { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH
, SLIC_1GB_DEVICE_ID
) },
130 { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH
, SLIC_2GB_DEVICE_ID
) },
134 MODULE_DEVICE_TABLE(pci
, slic_pci_tbl
);
136 static inline void slic_reg32_write(void __iomem
*reg
, u32 value
, bool flush
)
143 static inline void slic_reg64_write(struct adapter
*adapter
, void __iomem
*reg
,
144 u32 value
, void __iomem
*regh
, u32 paddrh
,
149 spin_lock_irqsave(&adapter
->bit64reglock
, flags
);
150 writel(paddrh
, regh
);
154 spin_unlock_irqrestore(&adapter
->bit64reglock
, flags
);
157 static void slic_mcast_set_bit(struct adapter
*adapter
, char *address
)
159 unsigned char crcpoly
;
161 /* Get the CRC polynomial for the mac address */
162 /* we use bits 1-8 (lsb), bitwise reversed,
163 * msb (= lsb bit 0 before bitrev) is automatically discarded */
164 crcpoly
= ether_crc(ETH_ALEN
, address
)>>23;
166 /* We only have space on the SLIC for 64 entries. Lop
167 * off the top two bits. (2^6 = 64)
171 /* OR in the new bit into our 64 bit mask. */
172 adapter
->mcastmask
|= (u64
) 1 << crcpoly
;
175 static void slic_mcast_set_mask(struct adapter
*adapter
)
177 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
179 if (adapter
->macopts
& (MAC_ALLMCAST
| MAC_PROMISC
)) {
180 /* Turn on all multicast addresses. We have to do this for
181 * promiscuous mode as well as ALLMCAST mode. It saves the
182 * Microcode from having to keep state about the MAC
185 slic_reg32_write(&slic_regs
->slic_mcastlow
, 0xFFFFFFFF, FLUSH
);
186 slic_reg32_write(&slic_regs
->slic_mcasthigh
, 0xFFFFFFFF,
189 /* Commit our multicast mast to the SLIC by writing to the
190 * multicast address mask registers
192 slic_reg32_write(&slic_regs
->slic_mcastlow
,
193 (u32
)(adapter
->mcastmask
& 0xFFFFFFFF), FLUSH
);
194 slic_reg32_write(&slic_regs
->slic_mcasthigh
,
195 (u32
)((adapter
->mcastmask
>> 32) & 0xFFFFFFFF), FLUSH
);
199 static void slic_timer_ping(ulong dev
)
201 struct adapter
*adapter
;
202 struct sliccard
*card
;
204 adapter
= netdev_priv((struct net_device
*)dev
);
205 card
= adapter
->card
;
207 adapter
->pingtimer
.expires
= jiffies
+ (PING_TIMER_INTERVAL
* HZ
);
208 add_timer(&adapter
->pingtimer
);
211 static void slic_unmap_mmio_space(struct adapter
*adapter
)
213 if (adapter
->slic_regs
)
214 iounmap(adapter
->slic_regs
);
215 adapter
->slic_regs
= NULL
;
221 * Write phy control to configure link duplex/speed
224 static void slic_link_config(struct adapter
*adapter
,
225 u32 linkspeed
, u32 linkduplex
)
234 if (adapter
->state
!= ADAPT_UP
)
237 if (linkspeed
> LINK_1000MB
)
238 linkspeed
= LINK_AUTOSPEED
;
239 if (linkduplex
> LINK_AUTOD
)
240 linkduplex
= LINK_AUTOD
;
242 wphy
= &adapter
->slic_regs
->slic_wphy
;
244 if ((linkspeed
== LINK_AUTOSPEED
) || (linkspeed
== LINK_1000MB
)) {
245 if (adapter
->flags
& ADAPT_FLAGS_FIBERMEDIA
) {
246 /* We've got a fiber gigabit interface, and register
247 * 4 is different in fiber mode than in copper mode
250 /* advertise FD only @1000 Mb */
251 phy_advreg
= (MIICR_REG_4
| (PAR_ADV1000XFD
));
252 /* enable PAUSE frames */
253 phy_advreg
|= PAR_ASYMPAUSE_FIBER
;
254 slic_reg32_write(wphy
, phy_advreg
, FLUSH
);
256 if (linkspeed
== LINK_AUTOSPEED
) {
257 /* reset phy, enable auto-neg */
260 (PCR_RESET
| PCR_AUTONEG
|
262 slic_reg32_write(wphy
, phy_config
, FLUSH
);
263 } else { /* forced 1000 Mb FD*/
264 /* power down phy to break link
265 this may not work) */
266 phy_config
= (MIICR_REG_PCR
| PCR_POWERDOWN
);
267 slic_reg32_write(wphy
, phy_config
, FLUSH
);
268 /* wait, Marvell says 1 sec,
269 try to get away with 10 ms */
272 /* disable auto-neg, set speed/duplex,
273 soft reset phy, powerup */
276 (PCR_RESET
| PCR_SPEED_1000
|
278 slic_reg32_write(wphy
, phy_config
, FLUSH
);
280 } else { /* copper gigabit */
282 /* Auto-Negotiate or 1000 Mb must be auto negotiated
283 * We've got a copper gigabit interface, and
284 * register 4 is different in copper mode than
287 if (linkspeed
== LINK_AUTOSPEED
) {
288 /* advertise 10/100 Mb modes */
291 (PAR_ADV100FD
| PAR_ADV100HD
| PAR_ADV10FD
294 /* linkspeed == LINK_1000MB -
295 don't advertise 10/100 Mb modes */
296 phy_advreg
= MIICR_REG_4
;
298 /* enable PAUSE frames */
299 phy_advreg
|= PAR_ASYMPAUSE
;
300 /* required by the Cicada PHY */
301 phy_advreg
|= PAR_802_3
;
302 slic_reg32_write(wphy
, phy_advreg
, FLUSH
);
303 /* advertise FD only @1000 Mb */
304 phy_gctlreg
= (MIICR_REG_9
| (PGC_ADV1000FD
));
305 slic_reg32_write(wphy
, phy_gctlreg
, FLUSH
);
307 if (adapter
->subsysid
!= SLIC_1GB_CICADA_SUBSYS_ID
) {
309 enable auto crossover */
311 (MIICR_REG_16
| (MRV_REG16_XOVERON
));
312 slic_reg32_write(wphy
, phy_config
, FLUSH
);
314 /* reset phy, enable auto-neg */
317 (PCR_RESET
| PCR_AUTONEG
|
319 slic_reg32_write(wphy
, phy_config
, FLUSH
);
320 } else { /* it's a Cicada PHY */
321 /* enable and restart auto-neg (don't reset) */
324 (PCR_AUTONEG
| PCR_AUTONEG_RST
));
325 slic_reg32_write(wphy
, phy_config
, FLUSH
);
330 if (linkspeed
== LINK_10MB
)
333 speed
= PCR_SPEED_100
;
334 if (linkduplex
== LINK_HALFD
)
337 duplex
= PCR_DUPLEX_FULL
;
339 if (adapter
->subsysid
!= SLIC_1GB_CICADA_SUBSYS_ID
) {
341 disable auto crossover */
342 phy_config
= (MIICR_REG_16
| (MRV_REG16_XOVEROFF
));
343 slic_reg32_write(wphy
, phy_config
, FLUSH
);
346 /* power down phy to break link (this may not work) */
347 phy_config
= (MIICR_REG_PCR
| (PCR_POWERDOWN
| speed
| duplex
));
348 slic_reg32_write(wphy
, phy_config
, FLUSH
);
350 /* wait, Marvell says 1 sec, try to get away with 10 ms */
353 if (adapter
->subsysid
!= SLIC_1GB_CICADA_SUBSYS_ID
) {
355 disable auto-neg, set speed,
356 soft reset phy, powerup */
358 (MIICR_REG_PCR
| (PCR_RESET
| speed
| duplex
));
359 slic_reg32_write(wphy
, phy_config
, FLUSH
);
360 } else { /* it's a Cicada PHY */
361 /* disable auto-neg, set speed, powerup */
362 phy_config
= (MIICR_REG_PCR
| (speed
| duplex
));
363 slic_reg32_write(wphy
, phy_config
, FLUSH
);
368 static int slic_card_download_gbrcv(struct adapter
*adapter
)
370 const struct firmware
*fw
;
371 const char *file
= "";
373 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
379 switch (adapter
->devid
) {
380 case SLIC_2GB_DEVICE_ID
:
381 file
= "slicoss/oasisrcvucode.sys";
383 case SLIC_1GB_DEVICE_ID
:
384 file
= "slicoss/gbrcvucode.sys";
390 ret
= request_firmware(&fw
, file
, &adapter
->pcidev
->dev
);
392 dev_err(&adapter
->pcidev
->dev
,
393 "Failed to load firmware %s\n", file
);
397 rcvucodelen
= *(u32
*)(fw
->data
+ index
);
399 switch (adapter
->devid
) {
400 case SLIC_2GB_DEVICE_ID
:
401 if (rcvucodelen
!= OasisRcvUCodeLen
) {
402 release_firmware(fw
);
406 case SLIC_1GB_DEVICE_ID
:
407 if (rcvucodelen
!= GBRcvUCodeLen
) {
408 release_firmware(fw
);
414 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, SLIC_RCVWCS_BEGIN
, FLUSH
);
415 /* download the rcv sequencer ucode */
416 for (codeaddr
= 0; codeaddr
< rcvucodelen
; codeaddr
++) {
417 /* write out instruction address */
418 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, codeaddr
, FLUSH
);
420 instruction
= *(u32
*)(fw
->data
+ index
);
422 /* write out the instruction data low addr */
423 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, instruction
, FLUSH
);
425 instruction
= *(u8
*)(fw
->data
+ index
);
427 /* write out the instruction data high addr */
428 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, (u8
)instruction
,
432 /* download finished */
433 release_firmware(fw
);
434 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, SLIC_RCVWCS_FINISH
, FLUSH
);
438 MODULE_FIRMWARE("slicoss/oasisrcvucode.sys");
439 MODULE_FIRMWARE("slicoss/gbrcvucode.sys");
441 static int slic_card_download(struct adapter
*adapter
)
443 const struct firmware
*fw
;
444 const char *file
= "";
449 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
456 int ucode_start
, index
= 0;
458 switch (adapter
->devid
) {
459 case SLIC_2GB_DEVICE_ID
:
460 file
= "slicoss/oasisdownload.sys";
462 case SLIC_1GB_DEVICE_ID
:
463 file
= "slicoss/gbdownload.sys";
468 ret
= request_firmware(&fw
, file
, &adapter
->pcidev
->dev
);
470 dev_err(&adapter
->pcidev
->dev
,
471 "Failed to load firmware %s\n", file
);
474 numsects
= *(u32
*)(fw
->data
+ index
);
476 for (i
= 0; i
< numsects
; i
++) {
477 sectsize
[i
] = *(u32
*)(fw
->data
+ index
);
480 for (i
= 0; i
< numsects
; i
++) {
481 sectstart
[i
] = *(u32
*)(fw
->data
+ index
);
485 instruction
= *(u32
*)(fw
->data
+ index
);
487 for (section
= 0; section
< numsects
; section
++) {
488 baseaddress
= sectstart
[section
];
489 thissectionsize
= sectsize
[section
] >> 3;
491 for (codeaddr
= 0; codeaddr
< thissectionsize
; codeaddr
++) {
492 /* Write out instruction address */
493 slic_reg32_write(&slic_regs
->slic_wcs
,
494 baseaddress
+ codeaddr
, FLUSH
);
495 /* Write out instruction to low addr */
496 slic_reg32_write(&slic_regs
->slic_wcs
,
498 instruction
= *(u32
*)(fw
->data
+ index
);
501 /* Write out instruction to high addr */
502 slic_reg32_write(&slic_regs
->slic_wcs
,
504 instruction
= *(u32
*)(fw
->data
+ index
);
509 for (section
= 0; section
< numsects
; section
++) {
510 instruction
= *(u32
*)(fw
->data
+ index
);
511 baseaddress
= sectstart
[section
];
512 if (baseaddress
< 0x8000)
514 thissectionsize
= sectsize
[section
] >> 3;
516 for (codeaddr
= 0; codeaddr
< thissectionsize
; codeaddr
++) {
517 /* Write out instruction address */
518 slic_reg32_write(&slic_regs
->slic_wcs
,
519 SLIC_WCS_COMPARE
| (baseaddress
+ codeaddr
),
521 /* Write out instruction to low addr */
522 slic_reg32_write(&slic_regs
->slic_wcs
, instruction
,
524 instruction
= *(u32
*)(fw
->data
+ index
);
526 /* Write out instruction to high addr */
527 slic_reg32_write(&slic_regs
->slic_wcs
, instruction
,
529 instruction
= *(u32
*)(fw
->data
+ index
);
532 /* Check SRAM location zero. If it is non-zero. Abort.*/
533 /* failure = readl((u32 __iomem *)&slic_regs->slic_reset);
535 release_firmware(fw);
540 release_firmware(fw
);
541 /* Everything OK, kick off the card */
543 slic_reg32_write(&slic_regs
->slic_wcs
, SLIC_WCS_START
, FLUSH
);
545 /* stall for 20 ms, long enough for ucode to init card
546 and reach mainloop */
552 MODULE_FIRMWARE("slicoss/oasisdownload.sys");
553 MODULE_FIRMWARE("slicoss/gbdownload.sys");
555 static void slic_adapter_set_hwaddr(struct adapter
*adapter
)
557 struct sliccard
*card
= adapter
->card
;
559 if ((adapter
->card
) && (card
->config_set
)) {
560 memcpy(adapter
->macaddr
,
561 card
->config
.MacInfo
[adapter
->functionnumber
].macaddrA
,
562 sizeof(struct slic_config_mac
));
563 if (is_zero_ether_addr(adapter
->currmacaddr
))
564 memcpy(adapter
->currmacaddr
, adapter
->macaddr
,
567 memcpy(adapter
->netdev
->dev_addr
, adapter
->currmacaddr
,
572 static void slic_intagg_set(struct adapter
*adapter
, u32 value
)
574 slic_reg32_write(&adapter
->slic_regs
->slic_intagg
, value
, FLUSH
);
575 adapter
->card
->loadlevel_current
= value
;
578 static void slic_soft_reset(struct adapter
*adapter
)
580 if (adapter
->card
->state
== CARD_UP
) {
581 slic_reg32_write(&adapter
->slic_regs
->slic_quiesce
, 0, FLUSH
);
585 slic_reg32_write(&adapter
->slic_regs
->slic_reset
, SLIC_RESET_MAGIC
,
590 static void slic_mac_address_config(struct adapter
*adapter
)
594 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
596 value
= ntohl(*(__be32
*) &adapter
->currmacaddr
[2]);
597 slic_reg32_write(&slic_regs
->slic_wraddral
, value
, FLUSH
);
598 slic_reg32_write(&slic_regs
->slic_wraddrbl
, value
, FLUSH
);
600 value2
= (u32
) ((adapter
->currmacaddr
[0] << 8 |
601 adapter
->currmacaddr
[1]) & 0xFFFF);
603 slic_reg32_write(&slic_regs
->slic_wraddrah
, value2
, FLUSH
);
604 slic_reg32_write(&slic_regs
->slic_wraddrbh
, value2
, FLUSH
);
606 /* Write our multicast mask out to the card. This is done */
607 /* here in addition to the slic_mcast_addr_set routine */
608 /* because ALL_MCAST may have been enabled or disabled */
609 slic_mcast_set_mask(adapter
);
612 static void slic_mac_config(struct adapter
*adapter
)
615 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
617 /* Setup GMAC gaps */
618 if (adapter
->linkspeed
== LINK_1000MB
) {
619 value
= ((GMCR_GAPBB_1000
<< GMCR_GAPBB_SHIFT
) |
620 (GMCR_GAPR1_1000
<< GMCR_GAPR1_SHIFT
) |
621 (GMCR_GAPR2_1000
<< GMCR_GAPR2_SHIFT
));
623 value
= ((GMCR_GAPBB_100
<< GMCR_GAPBB_SHIFT
) |
624 (GMCR_GAPR1_100
<< GMCR_GAPR1_SHIFT
) |
625 (GMCR_GAPR2_100
<< GMCR_GAPR2_SHIFT
));
629 if (adapter
->linkspeed
== LINK_1000MB
)
632 /* enable fullduplex */
633 if ((adapter
->linkduplex
== LINK_FULLD
)
634 || (adapter
->macopts
& MAC_LOOPBACK
)) {
638 /* write mac config */
639 slic_reg32_write(&slic_regs
->slic_wmcfg
, value
, FLUSH
);
641 /* setup mac addresses */
642 slic_mac_address_config(adapter
);
645 static void slic_config_set(struct adapter
*adapter
, bool linkchange
)
649 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
653 slic_mac_config(adapter
);
654 RcrReset
= GRCR_RESET
;
656 slic_mac_address_config(adapter
);
660 if (adapter
->linkduplex
== LINK_FULLD
) {
662 value
= (GXCR_RESET
| /* Always reset */
663 GXCR_XMTEN
| /* Enable transmit */
664 GXCR_PAUSEEN
); /* Enable pause */
666 slic_reg32_write(&slic_regs
->slic_wxcfg
, value
, FLUSH
);
668 /* Setup rcvcfg last */
669 value
= (RcrReset
| /* Reset, if linkchange */
670 GRCR_CTLEN
| /* Enable CTL frames */
671 GRCR_ADDRAEN
| /* Address A enable */
672 GRCR_RCVBAD
| /* Rcv bad frames */
673 (GRCR_HASHSIZE
<< GRCR_HASHSIZE_SHIFT
));
676 value
= (GXCR_RESET
| /* Always reset */
677 GXCR_XMTEN
); /* Enable transmit */
679 slic_reg32_write(&slic_regs
->slic_wxcfg
, value
, FLUSH
);
681 /* Setup rcvcfg last */
682 value
= (RcrReset
| /* Reset, if linkchange */
683 GRCR_ADDRAEN
| /* Address A enable */
684 GRCR_RCVBAD
| /* Rcv bad frames */
685 (GRCR_HASHSIZE
<< GRCR_HASHSIZE_SHIFT
));
688 if (adapter
->state
!= ADAPT_DOWN
) {
689 /* Only enable receive if we are restarting or running */
693 if (adapter
->macopts
& MAC_PROMISC
)
694 value
|= GRCR_RCVALL
;
696 slic_reg32_write(&slic_regs
->slic_wrcfg
, value
, FLUSH
);
700 * Turn off RCV and XMT, power down PHY
702 static void slic_config_clear(struct adapter
*adapter
)
706 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
709 value
= (GXCR_RESET
| /* Always reset */
710 GXCR_PAUSEEN
); /* Enable pause */
712 slic_reg32_write(&slic_regs
->slic_wxcfg
, value
, FLUSH
);
714 value
= (GRCR_RESET
| /* Always reset */
715 GRCR_CTLEN
| /* Enable CTL frames */
716 GRCR_ADDRAEN
| /* Address A enable */
717 (GRCR_HASHSIZE
<< GRCR_HASHSIZE_SHIFT
));
719 slic_reg32_write(&slic_regs
->slic_wrcfg
, value
, FLUSH
);
722 phy_config
= (MIICR_REG_PCR
| (PCR_POWERDOWN
));
723 slic_reg32_write(&slic_regs
->slic_wphy
, phy_config
, FLUSH
);
726 static bool slic_mac_filter(struct adapter
*adapter
,
727 struct ether_header
*ether_frame
)
729 struct net_device
*netdev
= adapter
->netdev
;
730 u32 opts
= adapter
->macopts
;
732 if (opts
& MAC_PROMISC
)
735 if (is_broadcast_ether_addr(ether_frame
->ether_dhost
)) {
736 if (opts
& MAC_BCAST
) {
737 adapter
->rcv_broadcasts
++;
744 if (is_multicast_ether_addr(ether_frame
->ether_dhost
)) {
745 if (opts
& MAC_ALLMCAST
) {
746 adapter
->rcv_multicasts
++;
747 netdev
->stats
.multicast
++;
750 if (opts
& MAC_MCAST
) {
751 struct mcast_address
*mcaddr
= adapter
->mcastaddrs
;
754 if (ether_addr_equal(mcaddr
->address
,
755 ether_frame
->ether_dhost
)) {
756 adapter
->rcv_multicasts
++;
757 netdev
->stats
.multicast
++;
760 mcaddr
= mcaddr
->next
;
768 if (opts
& MAC_DIRECTED
) {
769 adapter
->rcv_unicasts
++;
776 static int slic_mac_set_address(struct net_device
*dev
, void *ptr
)
778 struct adapter
*adapter
= netdev_priv(dev
);
779 struct sockaddr
*addr
= ptr
;
781 if (netif_running(dev
))
786 if (!is_valid_ether_addr(addr
->sa_data
))
789 memcpy(dev
->dev_addr
, addr
->sa_data
, dev
->addr_len
);
790 memcpy(adapter
->currmacaddr
, addr
->sa_data
, dev
->addr_len
);
792 slic_config_set(adapter
, true);
796 static void slic_timer_load_check(ulong cardaddr
)
798 struct sliccard
*card
= (struct sliccard
*)cardaddr
;
799 struct adapter
*adapter
= card
->master
;
801 u32 load
= card
->events
;
804 if ((adapter
) && (adapter
->state
== ADAPT_UP
) &&
805 (card
->state
== CARD_UP
) && (slic_global
.dynamic_intagg
)) {
806 intagg
= &adapter
->slic_regs
->slic_intagg
;
807 if (adapter
->devid
== SLIC_1GB_DEVICE_ID
) {
808 if (adapter
->linkspeed
== LINK_1000MB
)
811 if (load
> SLIC_LOAD_5
)
812 level
= SLIC_INTAGG_5
;
813 else if (load
> SLIC_LOAD_4
)
814 level
= SLIC_INTAGG_4
;
815 else if (load
> SLIC_LOAD_3
)
816 level
= SLIC_INTAGG_3
;
817 else if (load
> SLIC_LOAD_2
)
818 level
= SLIC_INTAGG_2
;
819 else if (load
> SLIC_LOAD_1
)
820 level
= SLIC_INTAGG_1
;
822 level
= SLIC_INTAGG_0
;
824 if (card
->loadlevel_current
!= level
) {
825 card
->loadlevel_current
= level
;
826 slic_reg32_write(intagg
, level
, FLUSH
);
829 if (load
> SLIC_LOAD_5
)
830 level
= SLIC_INTAGG_5
;
831 else if (load
> SLIC_LOAD_4
)
832 level
= SLIC_INTAGG_4
;
833 else if (load
> SLIC_LOAD_3
)
834 level
= SLIC_INTAGG_3
;
835 else if (load
> SLIC_LOAD_2
)
836 level
= SLIC_INTAGG_2
;
837 else if (load
> SLIC_LOAD_1
)
838 level
= SLIC_INTAGG_1
;
840 level
= SLIC_INTAGG_0
;
841 if (card
->loadlevel_current
!= level
) {
842 card
->loadlevel_current
= level
;
843 slic_reg32_write(intagg
, level
, FLUSH
);
848 card
->loadtimer
.expires
= jiffies
+ (SLIC_LOADTIMER_PERIOD
* HZ
);
849 add_timer(&card
->loadtimer
);
852 static int slic_upr_queue_request(struct adapter
*adapter
,
856 u32 upr_buffer
, u32 upr_buffer_h
)
858 struct slic_upr
*upr
;
859 struct slic_upr
*uprqueue
;
861 upr
= kmalloc(sizeof(struct slic_upr
), GFP_ATOMIC
);
865 upr
->adapter
= adapter
->port
;
866 upr
->upr_request
= upr_request
;
867 upr
->upr_data
= upr_data
;
868 upr
->upr_buffer
= upr_buffer
;
869 upr
->upr_data_h
= upr_data_h
;
870 upr
->upr_buffer_h
= upr_buffer_h
;
872 if (adapter
->upr_list
) {
873 uprqueue
= adapter
->upr_list
;
875 while (uprqueue
->next
)
876 uprqueue
= uprqueue
->next
;
877 uprqueue
->next
= upr
;
879 adapter
->upr_list
= upr
;
884 static void slic_upr_start(struct adapter
*adapter
)
886 struct slic_upr
*upr
;
887 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
893 upr
= adapter
->upr_list
;
896 if (adapter
->upr_busy
)
898 adapter
->upr_busy
= 1;
900 switch (upr
->upr_request
) {
902 if (upr
->upr_data_h
== 0) {
903 slic_reg32_write(&slic_regs
->slic_stats
, upr
->upr_data
,
906 slic_reg64_write(adapter
, &slic_regs
->slic_stats64
,
908 &slic_regs
->slic_addr_upper
,
909 upr
->upr_data_h
, FLUSH
);
914 slic_reg64_write(adapter
, &slic_regs
->slic_rlsr
, upr
->upr_data
,
915 &slic_regs
->slic_addr_upper
, upr
->upr_data_h
,
919 case SLIC_UPR_RCONFIG
:
920 slic_reg64_write(adapter
, &slic_regs
->slic_rconfig
,
921 upr
->upr_data
, &slic_regs
->slic_addr_upper
,
922 upr
->upr_data_h
, FLUSH
);
925 slic_reg32_write(&slic_regs
->slic_ping
, 1, FLUSH
);
930 static int slic_upr_request(struct adapter
*adapter
,
934 u32 upr_buffer
, u32 upr_buffer_h
)
939 spin_lock_irqsave(&adapter
->upr_lock
, flags
);
940 rc
= slic_upr_queue_request(adapter
,
943 upr_data_h
, upr_buffer
, upr_buffer_h
);
947 slic_upr_start(adapter
);
949 spin_unlock_irqrestore(&adapter
->upr_lock
, flags
);
953 static void slic_link_upr_complete(struct adapter
*adapter
, u32 isr
)
955 u32 linkstatus
= adapter
->pshmem
->linkstatus
;
957 unsigned char linkspeed
;
958 unsigned char linkduplex
;
960 if ((isr
& ISR_UPCERR
) || (isr
& ISR_UPCBSY
)) {
961 struct slic_shmem
*pshmem
;
963 pshmem
= (struct slic_shmem
*)(unsigned long)
965 #if BITS_PER_LONG == 64
966 slic_upr_queue_request(adapter
,
968 SLIC_GET_ADDR_LOW(&pshmem
->linkstatus
),
969 SLIC_GET_ADDR_HIGH(&pshmem
->linkstatus
),
972 slic_upr_queue_request(adapter
,
974 (u32
) &pshmem
->linkstatus
,
975 SLIC_GET_ADDR_HIGH(pshmem
), 0, 0);
979 if (adapter
->state
!= ADAPT_UP
)
982 linkup
= linkstatus
& GIG_LINKUP
? LINK_UP
: LINK_DOWN
;
983 if (linkstatus
& GIG_SPEED_1000
)
984 linkspeed
= LINK_1000MB
;
985 else if (linkstatus
& GIG_SPEED_100
)
986 linkspeed
= LINK_100MB
;
988 linkspeed
= LINK_10MB
;
990 if (linkstatus
& GIG_FULLDUPLEX
)
991 linkduplex
= LINK_FULLD
;
993 linkduplex
= LINK_HALFD
;
995 if ((adapter
->linkstate
== LINK_DOWN
) && (linkup
== LINK_DOWN
))
998 /* link up event, but nothing has changed */
999 if ((adapter
->linkstate
== LINK_UP
) &&
1000 (linkup
== LINK_UP
) &&
1001 (adapter
->linkspeed
== linkspeed
) &&
1002 (adapter
->linkduplex
== linkduplex
))
1005 /* link has changed at this point */
1007 /* link has gone from up to down */
1008 if (linkup
== LINK_DOWN
) {
1009 adapter
->linkstate
= LINK_DOWN
;
1013 /* link has gone from down to up */
1014 adapter
->linkspeed
= linkspeed
;
1015 adapter
->linkduplex
= linkduplex
;
1017 if (adapter
->linkstate
!= LINK_UP
) {
1019 slic_config_set(adapter
, true);
1020 adapter
->linkstate
= LINK_UP
;
1021 netif_start_queue(adapter
->netdev
);
1025 static void slic_upr_request_complete(struct adapter
*adapter
, u32 isr
)
1027 struct sliccard
*card
= adapter
->card
;
1028 struct slic_upr
*upr
;
1029 unsigned long flags
;
1031 spin_lock_irqsave(&adapter
->upr_lock
, flags
);
1032 upr
= adapter
->upr_list
;
1034 spin_unlock_irqrestore(&adapter
->upr_lock
, flags
);
1037 adapter
->upr_list
= upr
->next
;
1039 adapter
->upr_busy
= 0;
1040 switch (upr
->upr_request
) {
1041 case SLIC_UPR_STATS
:
1043 struct slic_stats
*slicstats
=
1044 (struct slic_stats
*) &adapter
->pshmem
->inicstats
;
1045 struct slic_stats
*newstats
= slicstats
;
1046 struct slic_stats
*old
= &adapter
->inicstats_prev
;
1047 struct slicnet_stats
*stst
= &adapter
->slic_stats
;
1049 if (isr
& ISR_UPCERR
) {
1050 dev_err(&adapter
->netdev
->dev
,
1051 "SLIC_UPR_STATS command failed isr[%x]\n",
1056 UPDATE_STATS_GB(stst
->tcp
.xmit_tcp_segs
,
1057 newstats
->xmit_tcp_segs_gb
,
1058 old
->xmit_tcp_segs_gb
);
1060 UPDATE_STATS_GB(stst
->tcp
.xmit_tcp_bytes
,
1061 newstats
->xmit_tcp_bytes_gb
,
1062 old
->xmit_tcp_bytes_gb
);
1064 UPDATE_STATS_GB(stst
->tcp
.rcv_tcp_segs
,
1065 newstats
->rcv_tcp_segs_gb
,
1066 old
->rcv_tcp_segs_gb
);
1068 UPDATE_STATS_GB(stst
->tcp
.rcv_tcp_bytes
,
1069 newstats
->rcv_tcp_bytes_gb
,
1070 old
->rcv_tcp_bytes_gb
);
1072 UPDATE_STATS_GB(stst
->iface
.xmt_bytes
,
1073 newstats
->xmit_bytes_gb
,
1074 old
->xmit_bytes_gb
);
1076 UPDATE_STATS_GB(stst
->iface
.xmt_ucast
,
1077 newstats
->xmit_unicasts_gb
,
1078 old
->xmit_unicasts_gb
);
1080 UPDATE_STATS_GB(stst
->iface
.rcv_bytes
,
1081 newstats
->rcv_bytes_gb
,
1084 UPDATE_STATS_GB(stst
->iface
.rcv_ucast
,
1085 newstats
->rcv_unicasts_gb
,
1086 old
->rcv_unicasts_gb
);
1088 UPDATE_STATS_GB(stst
->iface
.xmt_errors
,
1089 newstats
->xmit_collisions_gb
,
1090 old
->xmit_collisions_gb
);
1092 UPDATE_STATS_GB(stst
->iface
.xmt_errors
,
1093 newstats
->xmit_excess_collisions_gb
,
1094 old
->xmit_excess_collisions_gb
);
1096 UPDATE_STATS_GB(stst
->iface
.xmt_errors
,
1097 newstats
->xmit_other_error_gb
,
1098 old
->xmit_other_error_gb
);
1100 UPDATE_STATS_GB(stst
->iface
.rcv_errors
,
1101 newstats
->rcv_other_error_gb
,
1102 old
->rcv_other_error_gb
);
1104 UPDATE_STATS_GB(stst
->iface
.rcv_discards
,
1105 newstats
->rcv_drops_gb
,
1108 if (newstats
->rcv_drops_gb
> old
->rcv_drops_gb
) {
1109 adapter
->rcv_drops
+=
1110 (newstats
->rcv_drops_gb
-
1113 memcpy(old
, newstats
, sizeof(struct slic_stats
));
1117 slic_link_upr_complete(adapter
, isr
);
1119 case SLIC_UPR_RCONFIG
:
1122 card
->pingstatus
|= (isr
& ISR_PINGDSMASK
);
1126 slic_upr_start(adapter
);
1127 spin_unlock_irqrestore(&adapter
->upr_lock
, flags
);
1130 static int slic_config_get(struct adapter
*adapter
, u32 config
, u32 config_h
)
1132 return slic_upr_request(adapter
, SLIC_UPR_RCONFIG
, config
, config_h
,
1137 * Compute a checksum of the EEPROM according to RFC 1071.
1139 static u16
slic_eeprom_cksum(void *eeprom
, unsigned len
)
1145 checksum
+= *(wp
++);
1150 checksum
+= *(u8
*) wp
;
1153 while (checksum
>> 16)
1154 checksum
= (checksum
& 0xFFFF) + ((checksum
>> 16) & 0xFFFF);
1159 static void slic_rspqueue_free(struct adapter
*adapter
)
1162 struct slic_rspqueue
*rspq
= &adapter
->rspqueue
;
1164 for (i
= 0; i
< rspq
->num_pages
; i
++) {
1165 if (rspq
->vaddr
[i
]) {
1166 pci_free_consistent(adapter
->pcidev
, PAGE_SIZE
,
1167 rspq
->vaddr
[i
], rspq
->paddr
[i
]);
1169 rspq
->vaddr
[i
] = NULL
;
1173 rspq
->pageindex
= 0;
1174 rspq
->rspbuf
= NULL
;
1177 static int slic_rspqueue_init(struct adapter
*adapter
)
1180 struct slic_rspqueue
*rspq
= &adapter
->rspqueue
;
1181 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
1184 memset(rspq
, 0, sizeof(struct slic_rspqueue
));
1186 rspq
->num_pages
= SLIC_RSPQ_PAGES_GB
;
1188 for (i
= 0; i
< rspq
->num_pages
; i
++) {
1189 rspq
->vaddr
[i
] = pci_zalloc_consistent(adapter
->pcidev
,
1192 if (!rspq
->vaddr
[i
]) {
1193 dev_err(&adapter
->pcidev
->dev
,
1194 "pci_alloc_consistent failed\n");
1195 slic_rspqueue_free(adapter
);
1200 slic_reg32_write(&slic_regs
->slic_rbar
,
1201 (rspq
->paddr
[i
] | SLIC_RSPQ_BUFSINPAGE
),
1204 slic_reg64_write(adapter
, &slic_regs
->slic_rbar64
,
1205 (rspq
->paddr
[i
] | SLIC_RSPQ_BUFSINPAGE
),
1206 &slic_regs
->slic_addr_upper
,
1207 paddrh
, DONT_FLUSH
);
1211 rspq
->pageindex
= 0;
1212 rspq
->rspbuf
= (struct slic_rspbuf
*)rspq
->vaddr
[0];
1216 static struct slic_rspbuf
*slic_rspqueue_getnext(struct adapter
*adapter
)
1218 struct slic_rspqueue
*rspq
= &adapter
->rspqueue
;
1219 struct slic_rspbuf
*buf
;
1221 if (!(rspq
->rspbuf
->status
))
1225 if (++rspq
->offset
< SLIC_RSPQ_BUFSINPAGE
) {
1228 slic_reg64_write(adapter
, &adapter
->slic_regs
->slic_rbar64
,
1229 (rspq
->paddr
[rspq
->pageindex
] | SLIC_RSPQ_BUFSINPAGE
),
1230 &adapter
->slic_regs
->slic_addr_upper
, 0, DONT_FLUSH
);
1231 rspq
->pageindex
= (rspq
->pageindex
+ 1) % rspq
->num_pages
;
1233 rspq
->rspbuf
= (struct slic_rspbuf
*)
1234 rspq
->vaddr
[rspq
->pageindex
];
1240 static void slic_cmdqmem_free(struct adapter
*adapter
)
1242 struct slic_cmdqmem
*cmdqmem
= &adapter
->cmdqmem
;
1245 for (i
= 0; i
< SLIC_CMDQ_MAXPAGES
; i
++) {
1246 if (cmdqmem
->pages
[i
]) {
1247 pci_free_consistent(adapter
->pcidev
,
1249 (void *) cmdqmem
->pages
[i
],
1250 cmdqmem
->dma_pages
[i
]);
1253 memset(cmdqmem
, 0, sizeof(struct slic_cmdqmem
));
1256 static u32
*slic_cmdqmem_addpage(struct adapter
*adapter
)
1258 struct slic_cmdqmem
*cmdqmem
= &adapter
->cmdqmem
;
1261 if (cmdqmem
->pagecnt
>= SLIC_CMDQ_MAXPAGES
)
1263 pageaddr
= pci_alloc_consistent(adapter
->pcidev
,
1265 &cmdqmem
->dma_pages
[cmdqmem
->pagecnt
]);
1269 cmdqmem
->pages
[cmdqmem
->pagecnt
] = pageaddr
;
1274 static void slic_cmdq_free(struct adapter
*adapter
)
1276 struct slic_hostcmd
*cmd
;
1278 cmd
= adapter
->cmdq_all
.head
;
1281 struct sk_buff
*tempskb
;
1286 dev_kfree_skb_irq(tempskb
);
1289 cmd
= cmd
->next_all
;
1291 memset(&adapter
->cmdq_all
, 0, sizeof(struct slic_cmdqueue
));
1292 memset(&adapter
->cmdq_free
, 0, sizeof(struct slic_cmdqueue
));
1293 memset(&adapter
->cmdq_done
, 0, sizeof(struct slic_cmdqueue
));
1294 slic_cmdqmem_free(adapter
);
1297 static void slic_cmdq_addcmdpage(struct adapter
*adapter
, u32
*page
)
1299 struct slic_hostcmd
*cmd
;
1300 struct slic_hostcmd
*prev
;
1301 struct slic_hostcmd
*tail
;
1302 struct slic_cmdqueue
*cmdq
;
1308 struct slic_handle
*pslic_handle
;
1309 unsigned long flags
;
1312 cmd
= (struct slic_hostcmd
*)cmdaddr
;
1315 phys_addr
= virt_to_bus((void *)page
);
1316 phys_addrl
= SLIC_GET_ADDR_LOW(phys_addr
);
1317 phys_addrh
= SLIC_GET_ADDR_HIGH(phys_addr
);
1321 while ((cmdcnt
< SLIC_CMDQ_CMDSINPAGE
) &&
1322 (adapter
->slic_handle_ix
< 256)) {
1323 /* Allocate and initialize a SLIC_HANDLE for this command */
1324 spin_lock_irqsave(&adapter
->handle_lock
, flags
);
1325 pslic_handle
= adapter
->pfree_slic_handles
;
1326 adapter
->pfree_slic_handles
= pslic_handle
->next
;
1327 spin_unlock_irqrestore(&adapter
->handle_lock
, flags
);
1328 pslic_handle
->type
= SLIC_HANDLE_CMD
;
1329 pslic_handle
->address
= (void *) cmd
;
1330 pslic_handle
->offset
= (ushort
) adapter
->slic_handle_ix
++;
1331 pslic_handle
->other_handle
= NULL
;
1332 pslic_handle
->next
= NULL
;
1334 cmd
->pslic_handle
= pslic_handle
;
1335 cmd
->cmd64
.hosthandle
= pslic_handle
->token
.handle_token
;
1337 cmd
->paddrl
= phys_addrl
;
1338 cmd
->paddrh
= phys_addrh
;
1339 cmd
->next_all
= prev
;
1342 phys_addrl
+= SLIC_HOSTCMD_SIZE
;
1343 cmdaddr
+= SLIC_HOSTCMD_SIZE
;
1345 cmd
= (struct slic_hostcmd
*)cmdaddr
;
1349 cmdq
= &adapter
->cmdq_all
;
1350 cmdq
->count
+= cmdcnt
; /* SLIC_CMDQ_CMDSINPAGE; mooktodo */
1351 tail
->next_all
= cmdq
->head
;
1353 cmdq
= &adapter
->cmdq_free
;
1354 spin_lock_irqsave(&cmdq
->lock
, flags
);
1355 cmdq
->count
+= cmdcnt
; /* SLIC_CMDQ_CMDSINPAGE; mooktodo */
1356 tail
->next
= cmdq
->head
;
1358 spin_unlock_irqrestore(&cmdq
->lock
, flags
);
1361 static int slic_cmdq_init(struct adapter
*adapter
)
1366 memset(&adapter
->cmdq_all
, 0, sizeof(struct slic_cmdqueue
));
1367 memset(&adapter
->cmdq_free
, 0, sizeof(struct slic_cmdqueue
));
1368 memset(&adapter
->cmdq_done
, 0, sizeof(struct slic_cmdqueue
));
1369 spin_lock_init(&adapter
->cmdq_all
.lock
);
1370 spin_lock_init(&adapter
->cmdq_free
.lock
);
1371 spin_lock_init(&adapter
->cmdq_done
.lock
);
1372 memset(&adapter
->cmdqmem
, 0, sizeof(struct slic_cmdqmem
));
1373 adapter
->slic_handle_ix
= 1;
1374 for (i
= 0; i
< SLIC_CMDQ_INITPAGES
; i
++) {
1375 pageaddr
= slic_cmdqmem_addpage(adapter
);
1377 slic_cmdq_free(adapter
);
1380 slic_cmdq_addcmdpage(adapter
, pageaddr
);
1382 adapter
->slic_handle_ix
= 1;
1387 static void slic_cmdq_reset(struct adapter
*adapter
)
1389 struct slic_hostcmd
*hcmd
;
1390 struct sk_buff
*skb
;
1392 unsigned long flags
;
1394 spin_lock_irqsave(&adapter
->cmdq_free
.lock
, flags
);
1395 spin_lock(&adapter
->cmdq_done
.lock
);
1396 outstanding
= adapter
->cmdq_all
.count
- adapter
->cmdq_done
.count
;
1397 outstanding
-= adapter
->cmdq_free
.count
;
1398 hcmd
= adapter
->cmdq_all
.head
;
1404 dev_kfree_skb_irq(skb
);
1406 hcmd
= hcmd
->next_all
;
1408 adapter
->cmdq_free
.count
= 0;
1409 adapter
->cmdq_free
.head
= NULL
;
1410 adapter
->cmdq_free
.tail
= NULL
;
1411 adapter
->cmdq_done
.count
= 0;
1412 adapter
->cmdq_done
.head
= NULL
;
1413 adapter
->cmdq_done
.tail
= NULL
;
1414 adapter
->cmdq_free
.head
= adapter
->cmdq_all
.head
;
1415 hcmd
= adapter
->cmdq_all
.head
;
1417 adapter
->cmdq_free
.count
++;
1418 hcmd
->next
= hcmd
->next_all
;
1419 hcmd
= hcmd
->next_all
;
1421 if (adapter
->cmdq_free
.count
!= adapter
->cmdq_all
.count
) {
1422 dev_err(&adapter
->netdev
->dev
,
1423 "free_count %d != all count %d\n",
1424 adapter
->cmdq_free
.count
, adapter
->cmdq_all
.count
);
1426 spin_unlock(&adapter
->cmdq_done
.lock
);
1427 spin_unlock_irqrestore(&adapter
->cmdq_free
.lock
, flags
);
1430 static void slic_cmdq_getdone(struct adapter
*adapter
)
1432 struct slic_cmdqueue
*done_cmdq
= &adapter
->cmdq_done
;
1433 struct slic_cmdqueue
*free_cmdq
= &adapter
->cmdq_free
;
1434 unsigned long flags
;
1436 spin_lock_irqsave(&done_cmdq
->lock
, flags
);
1438 free_cmdq
->head
= done_cmdq
->head
;
1439 free_cmdq
->count
= done_cmdq
->count
;
1440 done_cmdq
->head
= NULL
;
1441 done_cmdq
->tail
= NULL
;
1442 done_cmdq
->count
= 0;
1443 spin_unlock_irqrestore(&done_cmdq
->lock
, flags
);
1446 static struct slic_hostcmd
*slic_cmdq_getfree(struct adapter
*adapter
)
1448 struct slic_cmdqueue
*cmdq
= &adapter
->cmdq_free
;
1449 struct slic_hostcmd
*cmd
= NULL
;
1450 unsigned long flags
;
1453 spin_lock_irqsave(&cmdq
->lock
, flags
);
1457 cmdq
->head
= cmd
->next
;
1459 spin_unlock_irqrestore(&cmdq
->lock
, flags
);
1461 slic_cmdq_getdone(adapter
);
1468 spin_unlock_irqrestore(&cmdq
->lock
, flags
);
1469 pageaddr
= slic_cmdqmem_addpage(adapter
);
1471 slic_cmdq_addcmdpage(adapter
, pageaddr
);
1472 goto lock_and_retry
;
1479 static void slic_cmdq_putdone_irq(struct adapter
*adapter
,
1480 struct slic_hostcmd
*cmd
)
1482 struct slic_cmdqueue
*cmdq
= &adapter
->cmdq_done
;
1484 spin_lock(&cmdq
->lock
);
1486 cmd
->next
= cmdq
->head
;
1489 if ((adapter
->xmitq_full
) && (cmdq
->count
> 10))
1490 netif_wake_queue(adapter
->netdev
);
1491 spin_unlock(&cmdq
->lock
);
1494 static int slic_rcvqueue_fill(struct adapter
*adapter
)
1499 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1501 struct device
*dev
= &adapter
->netdev
->dev
;
1503 while (i
< SLIC_RCVQ_FILLENTRIES
) {
1504 struct slic_rcvbuf
*rcvbuf
;
1505 struct sk_buff
*skb
;
1506 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1509 skb
= alloc_skb(SLIC_RCVQ_RCVBUFSIZE
, GFP_ATOMIC
);
1511 paddr
= (void *)(unsigned long)
1512 pci_map_single(adapter
->pcidev
,
1514 SLIC_RCVQ_RCVBUFSIZE
,
1515 PCI_DMA_FROMDEVICE
);
1516 paddrl
= SLIC_GET_ADDR_LOW(paddr
);
1517 paddrh
= SLIC_GET_ADDR_HIGH(paddr
);
1519 skb
->len
= SLIC_RCVBUF_HEADSIZE
;
1520 rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
1523 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1525 dev_err(dev
, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1527 dev_err(dev
, "skb[%p] PROBLEM\n", skb
);
1528 dev_err(dev
, " skbdata[%p]\n",
1530 dev_err(dev
, " skblen[%x]\n", skb
->len
);
1531 dev_err(dev
, " paddr[%p]\n", paddr
);
1532 dev_err(dev
, " paddrl[%x]\n", paddrl
);
1533 dev_err(dev
, " paddrh[%x]\n", paddrh
);
1534 dev_err(dev
, " rcvq->head[%p]\n",
1536 dev_err(dev
, " rcvq->tail[%p]\n",
1538 dev_err(dev
, " rcvq->count[%x]\n",
1540 dev_err(dev
, "SKIP THIS SKB!!!!!!!!\n");
1541 goto retry_rcvqfill
;
1545 dev_err(dev
, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1547 dev_err(dev
, "skb[%p] PROBLEM\n", skb
);
1548 dev_err(dev
, " skbdata[%p]\n",
1550 dev_err(dev
, " skblen[%x]\n", skb
->len
);
1551 dev_err(dev
, " paddr[%p]\n", paddr
);
1552 dev_err(dev
, " paddrl[%x]\n", paddrl
);
1553 dev_err(dev
, " paddrh[%x]\n", paddrh
);
1554 dev_err(dev
, " rcvq->head[%p]\n",
1556 dev_err(dev
, " rcvq->tail[%p]\n",
1558 dev_err(dev
, " rcvq->count[%x]\n",
1560 dev_err(dev
, "GIVE TO CARD ANYWAY\n");
1564 slic_reg32_write(&adapter
->slic_regs
->slic_hbar
,
1565 (u32
)paddrl
, DONT_FLUSH
);
1567 slic_reg64_write(adapter
,
1568 &adapter
->slic_regs
->slic_hbar64
,
1570 &adapter
->slic_regs
->slic_addr_upper
,
1571 paddrh
, DONT_FLUSH
);
1574 rcvq
->tail
->next
= skb
;
1581 dev_err(&adapter
->netdev
->dev
,
1582 "slic_rcvqueue_fill could only get [%d] skbuffs\n",
1590 static void slic_rcvqueue_free(struct adapter
*adapter
)
1592 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1593 struct sk_buff
*skb
;
1595 while (rcvq
->head
) {
1597 rcvq
->head
= rcvq
->head
->next
;
1605 static int slic_rcvqueue_init(struct adapter
*adapter
)
1608 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1612 rcvq
->size
= SLIC_RCVQ_ENTRIES
;
1615 i
= SLIC_RCVQ_ENTRIES
/ SLIC_RCVQ_FILLENTRIES
;
1618 count
+= slic_rcvqueue_fill(adapter
);
1621 if (rcvq
->count
< SLIC_RCVQ_MINENTRIES
) {
1622 slic_rcvqueue_free(adapter
);
1628 static struct sk_buff
*slic_rcvqueue_getnext(struct adapter
*adapter
)
1630 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1631 struct sk_buff
*skb
;
1632 struct slic_rcvbuf
*rcvbuf
;
1637 rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
1639 if (rcvbuf
->status
& IRHDDR_SVALID
) {
1640 rcvq
->head
= rcvq
->head
->next
;
1647 dev_err(&adapter
->netdev
->dev
,
1648 "RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq
, rcvq
->count
);
1651 while (rcvq
->count
< SLIC_RCVQ_FILLTHRESH
) {
1652 count
= slic_rcvqueue_fill(adapter
);
1661 static u32
slic_rcvqueue_reinsert(struct adapter
*adapter
, struct sk_buff
*skb
)
1663 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1667 struct slic_rcvbuf
*rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
1670 paddr
= (void *)(unsigned long)
1671 pci_map_single(adapter
->pcidev
, skb
->head
,
1672 SLIC_RCVQ_RCVBUFSIZE
, PCI_DMA_FROMDEVICE
);
1676 paddrl
= SLIC_GET_ADDR_LOW(paddr
);
1677 paddrh
= SLIC_GET_ADDR_HIGH(paddr
);
1680 dev
= &adapter
->netdev
->dev
;
1681 dev_err(dev
, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1683 dev_err(dev
, "skb[%p] PROBLEM\n", skb
);
1684 dev_err(dev
, " skbdata[%p]\n", skb
->data
);
1685 dev_err(dev
, " skblen[%x]\n", skb
->len
);
1686 dev_err(dev
, " paddr[%p]\n", paddr
);
1687 dev_err(dev
, " paddrl[%x]\n", paddrl
);
1688 dev_err(dev
, " paddrh[%x]\n", paddrh
);
1689 dev_err(dev
, " rcvq->head[%p]\n", rcvq
->head
);
1690 dev_err(dev
, " rcvq->tail[%p]\n", rcvq
->tail
);
1691 dev_err(dev
, " rcvq->count[%x]\n", rcvq
->count
);
1694 slic_reg32_write(&adapter
->slic_regs
->slic_hbar
, (u32
)paddrl
,
1697 slic_reg64_write(adapter
, &adapter
->slic_regs
->slic_hbar64
,
1698 paddrl
, &adapter
->slic_regs
->slic_addr_upper
,
1699 paddrh
, DONT_FLUSH
);
1702 rcvq
->tail
->next
= skb
;
1711 * slic_link_event_handler -
1713 * Initiate a link configuration sequence. The link configuration begins
1714 * by issuing a READ_LINK_STATUS command to the Utility Processor on the
1715 * SLIC. Since the command finishes asynchronously, the slic_upr_comlete
1716 * routine will follow it up witha UP configuration write command, which
1717 * will also complete asynchronously.
1720 static void slic_link_event_handler(struct adapter
*adapter
)
1723 struct slic_shmem
*pshmem
;
1725 if (adapter
->state
!= ADAPT_UP
) {
1726 /* Adapter is not operational. Ignore. */
1730 pshmem
= (struct slic_shmem
*)(unsigned long)adapter
->phys_shmem
;
1732 #if BITS_PER_LONG == 64
1733 status
= slic_upr_request(adapter
,
1735 SLIC_GET_ADDR_LOW(&pshmem
->linkstatus
),
1736 SLIC_GET_ADDR_HIGH(&pshmem
->linkstatus
),
1739 status
= slic_upr_request(adapter
, SLIC_UPR_RLSR
,
1740 (u32
) &pshmem
->linkstatus
, /* no 4GB wrap guaranteed */
1745 static void slic_init_cleanup(struct adapter
*adapter
)
1747 if (adapter
->intrregistered
) {
1748 adapter
->intrregistered
= 0;
1749 free_irq(adapter
->netdev
->irq
, adapter
->netdev
);
1752 if (adapter
->pshmem
) {
1753 pci_free_consistent(adapter
->pcidev
,
1754 sizeof(struct slic_shmem
),
1755 adapter
->pshmem
, adapter
->phys_shmem
);
1756 adapter
->pshmem
= NULL
;
1757 adapter
->phys_shmem
= (dma_addr_t
)(unsigned long)NULL
;
1760 if (adapter
->pingtimerset
) {
1761 adapter
->pingtimerset
= 0;
1762 del_timer(&adapter
->pingtimer
);
1765 slic_rspqueue_free(adapter
);
1766 slic_cmdq_free(adapter
);
1767 slic_rcvqueue_free(adapter
);
1771 * Allocate a mcast_address structure to hold the multicast address.
1774 static int slic_mcast_add_list(struct adapter
*adapter
, char *address
)
1776 struct mcast_address
*mcaddr
, *mlist
;
1778 /* Check to see if it already exists */
1779 mlist
= adapter
->mcastaddrs
;
1781 if (ether_addr_equal(mlist
->address
, address
))
1783 mlist
= mlist
->next
;
1786 /* Doesn't already exist. Allocate a structure to hold it */
1787 mcaddr
= kmalloc(sizeof(struct mcast_address
), GFP_ATOMIC
);
1791 ether_addr_copy(mcaddr
->address
, address
);
1793 mcaddr
->next
= adapter
->mcastaddrs
;
1794 adapter
->mcastaddrs
= mcaddr
;
1799 static void slic_mcast_set_list(struct net_device
*dev
)
1801 struct adapter
*adapter
= netdev_priv(dev
);
1804 struct netdev_hw_addr
*ha
;
1806 netdev_for_each_mc_addr(ha
, dev
) {
1807 addresses
= (char *) &ha
->addr
;
1808 status
= slic_mcast_add_list(adapter
, addresses
);
1811 slic_mcast_set_bit(adapter
, addresses
);
1814 if (adapter
->devflags_prev
!= dev
->flags
) {
1815 adapter
->macopts
= MAC_DIRECTED
;
1817 if (dev
->flags
& IFF_BROADCAST
)
1818 adapter
->macopts
|= MAC_BCAST
;
1819 if (dev
->flags
& IFF_PROMISC
)
1820 adapter
->macopts
|= MAC_PROMISC
;
1821 if (dev
->flags
& IFF_ALLMULTI
)
1822 adapter
->macopts
|= MAC_ALLMCAST
;
1823 if (dev
->flags
& IFF_MULTICAST
)
1824 adapter
->macopts
|= MAC_MCAST
;
1826 adapter
->devflags_prev
= dev
->flags
;
1827 slic_config_set(adapter
, true);
1830 slic_mcast_set_mask(adapter
);
1834 #define XMIT_FAIL_LINK_STATE 1
1835 #define XMIT_FAIL_ZERO_LENGTH 2
1836 #define XMIT_FAIL_HOSTCMD_FAIL 3
1838 static void slic_xmit_build_request(struct adapter
*adapter
,
1839 struct slic_hostcmd
*hcmd
, struct sk_buff
*skb
)
1841 struct slic_host64_cmd
*ihcmd
;
1844 ihcmd
= &hcmd
->cmd64
;
1846 ihcmd
->flags
= adapter
->port
<< IHFLG_IFSHFT
;
1847 ihcmd
->command
= IHCMD_XMT_REQ
;
1848 ihcmd
->u
.slic_buffers
.totlen
= skb
->len
;
1849 phys_addr
= pci_map_single(adapter
->pcidev
, skb
->data
, skb
->len
,
1851 ihcmd
->u
.slic_buffers
.bufs
[0].paddrl
= SLIC_GET_ADDR_LOW(phys_addr
);
1852 ihcmd
->u
.slic_buffers
.bufs
[0].paddrh
= SLIC_GET_ADDR_HIGH(phys_addr
);
1853 ihcmd
->u
.slic_buffers
.bufs
[0].length
= skb
->len
;
1854 #if BITS_PER_LONG == 64
1855 hcmd
->cmdsize
= (u32
) ((((u64
)&ihcmd
->u
.slic_buffers
.bufs
[1] -
1856 (u64
) hcmd
) + 31) >> 5);
1858 hcmd
->cmdsize
= (((u32
)&ihcmd
->u
.slic_buffers
.bufs
[1] -
1859 (u32
)hcmd
) + 31) >> 5;
1863 static void slic_xmit_fail(struct adapter
*adapter
,
1864 struct sk_buff
*skb
,
1865 void *cmd
, u32 skbtype
, u32 status
)
1867 if (adapter
->xmitq_full
)
1868 netif_stop_queue(adapter
->netdev
);
1869 if ((cmd
== NULL
) && (status
<= XMIT_FAIL_HOSTCMD_FAIL
)) {
1871 case XMIT_FAIL_LINK_STATE
:
1872 dev_err(&adapter
->netdev
->dev
,
1873 "reject xmit skb[%p: %x] linkstate[%s] adapter[%s:%d] card[%s:%d]\n",
1875 SLIC_LINKSTATE(adapter
->linkstate
),
1876 SLIC_ADAPTER_STATE(adapter
->state
),
1878 SLIC_CARD_STATE(adapter
->card
->state
),
1879 adapter
->card
->state
);
1881 case XMIT_FAIL_ZERO_LENGTH
:
1882 dev_err(&adapter
->netdev
->dev
,
1883 "xmit_start skb->len == 0 skb[%p] type[%x]\n",
1884 skb
, skb
->pkt_type
);
1886 case XMIT_FAIL_HOSTCMD_FAIL
:
1887 dev_err(&adapter
->netdev
->dev
,
1888 "xmit_start skb[%p] type[%x] No host commands available\n",
1889 skb
, skb
->pkt_type
);
1894 adapter
->netdev
->stats
.tx_dropped
++;
1897 static void slic_rcv_handle_error(struct adapter
*adapter
,
1898 struct slic_rcvbuf
*rcvbuf
)
1900 struct slic_hddr_wds
*hdr
= (struct slic_hddr_wds
*)rcvbuf
->data
;
1901 struct net_device
*netdev
= adapter
->netdev
;
1903 if (adapter
->devid
!= SLIC_1GB_DEVICE_ID
) {
1904 if (hdr
->frame_status14
& VRHSTAT_802OE
)
1905 adapter
->if_events
.oflow802
++;
1906 if (hdr
->frame_status14
& VRHSTAT_TPOFLO
)
1907 adapter
->if_events
.Tprtoflow
++;
1908 if (hdr
->frame_status_b14
& VRHSTATB_802UE
)
1909 adapter
->if_events
.uflow802
++;
1910 if (hdr
->frame_status_b14
& VRHSTATB_RCVE
) {
1911 adapter
->if_events
.rcvearly
++;
1912 netdev
->stats
.rx_fifo_errors
++;
1914 if (hdr
->frame_status_b14
& VRHSTATB_BUFF
) {
1915 adapter
->if_events
.Bufov
++;
1916 netdev
->stats
.rx_over_errors
++;
1918 if (hdr
->frame_status_b14
& VRHSTATB_CARRE
) {
1919 adapter
->if_events
.Carre
++;
1920 netdev
->stats
.tx_carrier_errors
++;
1922 if (hdr
->frame_status_b14
& VRHSTATB_LONGE
)
1923 adapter
->if_events
.Longe
++;
1924 if (hdr
->frame_status_b14
& VRHSTATB_PREA
)
1925 adapter
->if_events
.Invp
++;
1926 if (hdr
->frame_status_b14
& VRHSTATB_CRC
) {
1927 adapter
->if_events
.Crc
++;
1928 netdev
->stats
.rx_crc_errors
++;
1930 if (hdr
->frame_status_b14
& VRHSTATB_DRBL
)
1931 adapter
->if_events
.Drbl
++;
1932 if (hdr
->frame_status_b14
& VRHSTATB_CODE
)
1933 adapter
->if_events
.Code
++;
1934 if (hdr
->frame_status_b14
& VRHSTATB_TPCSUM
)
1935 adapter
->if_events
.TpCsum
++;
1936 if (hdr
->frame_status_b14
& VRHSTATB_TPHLEN
)
1937 adapter
->if_events
.TpHlen
++;
1938 if (hdr
->frame_status_b14
& VRHSTATB_IPCSUM
)
1939 adapter
->if_events
.IpCsum
++;
1940 if (hdr
->frame_status_b14
& VRHSTATB_IPLERR
)
1941 adapter
->if_events
.IpLen
++;
1942 if (hdr
->frame_status_b14
& VRHSTATB_IPHERR
)
1943 adapter
->if_events
.IpHlen
++;
1945 if (hdr
->frame_statusGB
& VGBSTAT_XPERR
) {
1946 u32 xerr
= hdr
->frame_statusGB
>> VGBSTAT_XERRSHFT
;
1948 if (xerr
== VGBSTAT_XCSERR
)
1949 adapter
->if_events
.TpCsum
++;
1950 if (xerr
== VGBSTAT_XUFLOW
)
1951 adapter
->if_events
.Tprtoflow
++;
1952 if (xerr
== VGBSTAT_XHLEN
)
1953 adapter
->if_events
.TpHlen
++;
1955 if (hdr
->frame_statusGB
& VGBSTAT_NETERR
) {
1958 frame_statusGB
>> VGBSTAT_NERRSHFT
) &
1960 if (nerr
== VGBSTAT_NCSERR
)
1961 adapter
->if_events
.IpCsum
++;
1962 if (nerr
== VGBSTAT_NUFLOW
)
1963 adapter
->if_events
.IpLen
++;
1964 if (nerr
== VGBSTAT_NHLEN
)
1965 adapter
->if_events
.IpHlen
++;
1967 if (hdr
->frame_statusGB
& VGBSTAT_LNKERR
) {
1968 u32 lerr
= hdr
->frame_statusGB
& VGBSTAT_LERRMSK
;
1970 if (lerr
== VGBSTAT_LDEARLY
)
1971 adapter
->if_events
.rcvearly
++;
1972 if (lerr
== VGBSTAT_LBOFLO
)
1973 adapter
->if_events
.Bufov
++;
1974 if (lerr
== VGBSTAT_LCODERR
)
1975 adapter
->if_events
.Code
++;
1976 if (lerr
== VGBSTAT_LDBLNBL
)
1977 adapter
->if_events
.Drbl
++;
1978 if (lerr
== VGBSTAT_LCRCERR
)
1979 adapter
->if_events
.Crc
++;
1980 if (lerr
== VGBSTAT_LOFLO
)
1981 adapter
->if_events
.oflow802
++;
1982 if (lerr
== VGBSTAT_LUFLO
)
1983 adapter
->if_events
.uflow802
++;
1988 #define TCP_OFFLOAD_FRAME_PUSHFLAG 0x10000000
1989 #define M_FAST_PATH 0x0040
1991 static void slic_rcv_handler(struct adapter
*adapter
)
1993 struct net_device
*netdev
= adapter
->netdev
;
1994 struct sk_buff
*skb
;
1995 struct slic_rcvbuf
*rcvbuf
;
1998 while ((skb
= slic_rcvqueue_getnext(adapter
))) {
2001 rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
2002 adapter
->card
->events
++;
2003 if (rcvbuf
->status
& IRHDDR_ERR
) {
2004 adapter
->rx_errors
++;
2005 slic_rcv_handle_error(adapter
, rcvbuf
);
2006 slic_rcvqueue_reinsert(adapter
, skb
);
2010 if (!slic_mac_filter(adapter
, (struct ether_header
*)
2012 slic_rcvqueue_reinsert(adapter
, skb
);
2015 skb_pull(skb
, SLIC_RCVBUF_HEADSIZE
);
2016 rx_bytes
= (rcvbuf
->length
& IRHDDR_FLEN_MSK
);
2017 skb_put(skb
, rx_bytes
);
2018 netdev
->stats
.rx_packets
++;
2019 netdev
->stats
.rx_bytes
+= rx_bytes
;
2020 #if SLIC_OFFLOAD_IP_CHECKSUM
2021 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
2024 skb
->dev
= adapter
->netdev
;
2025 skb
->protocol
= eth_type_trans(skb
, skb
->dev
);
2029 #if SLIC_INTERRUPT_PROCESS_LIMIT
2030 if (frames
>= SLIC_RCVQ_MAX_PROCESS_ISR
) {
2031 adapter
->rcv_interrupt_yields
++;
2036 adapter
->max_isr_rcvs
= max(adapter
->max_isr_rcvs
, frames
);
2039 static void slic_xmit_complete(struct adapter
*adapter
)
2041 struct slic_hostcmd
*hcmd
;
2042 struct slic_rspbuf
*rspbuf
;
2044 struct slic_handle_word slic_handle_word
;
2047 rspbuf
= slic_rspqueue_getnext(adapter
);
2050 adapter
->xmit_completes
++;
2051 adapter
->card
->events
++;
2053 Get the complete host command buffer
2055 slic_handle_word
.handle_token
= rspbuf
->hosthandle
;
2057 (struct slic_hostcmd
*)
2058 adapter
->slic_handles
[slic_handle_word
.handle_index
].
2060 /* hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */
2061 if (hcmd
->type
== SLIC_CMD_DUMB
) {
2063 dev_kfree_skb_irq(hcmd
->skb
);
2064 slic_cmdq_putdone_irq(adapter
, hcmd
);
2067 rspbuf
->hosthandle
= 0;
2070 adapter
->max_isr_xmits
= max(adapter
->max_isr_xmits
, frames
);
2073 static void slic_interrupt_card_up(u32 isr
, struct adapter
*adapter
,
2074 struct net_device
*dev
)
2076 if (isr
& ~ISR_IO
) {
2077 if (isr
& ISR_ERR
) {
2078 adapter
->error_interrupts
++;
2079 if (isr
& ISR_RMISS
) {
2084 struct slic_rcvqueue
*rcvq
=
2087 adapter
->error_rmiss_interrupts
++;
2090 rcv_count
= rcvq
->count
;
2091 pre_count
= rcvq
->count
;
2092 errors
= rcvq
->errors
;
2094 while (rcvq
->count
< SLIC_RCVQ_FILLTHRESH
) {
2095 count
= slic_rcvqueue_fill(adapter
);
2099 } else if (isr
& ISR_XDROP
) {
2101 "isr & ISR_ERR [%x] ISR_XDROP\n",
2105 "isr & ISR_ERR [%x]\n",
2110 if (isr
& ISR_LEVENT
) {
2111 adapter
->linkevent_interrupts
++;
2112 slic_link_event_handler(adapter
);
2115 if ((isr
& ISR_UPC
) || (isr
& ISR_UPCERR
) ||
2116 (isr
& ISR_UPCBSY
)) {
2117 adapter
->upr_interrupts
++;
2118 slic_upr_request_complete(adapter
, isr
);
2122 if (isr
& ISR_RCV
) {
2123 adapter
->rcv_interrupts
++;
2124 slic_rcv_handler(adapter
);
2127 if (isr
& ISR_CMD
) {
2128 adapter
->xmit_interrupts
++;
2129 slic_xmit_complete(adapter
);
2134 static irqreturn_t
slic_interrupt(int irq
, void *dev_id
)
2136 struct net_device
*dev
= (struct net_device
*)dev_id
;
2137 struct adapter
*adapter
= netdev_priv(dev
);
2140 if ((adapter
->pshmem
) && (adapter
->pshmem
->isr
)) {
2141 slic_reg32_write(&adapter
->slic_regs
->slic_icr
,
2142 ICR_INT_MASK
, FLUSH
);
2143 isr
= adapter
->isrcopy
= adapter
->pshmem
->isr
;
2144 adapter
->pshmem
->isr
= 0;
2145 adapter
->num_isrs
++;
2146 switch (adapter
->card
->state
) {
2148 slic_interrupt_card_up(isr
, adapter
, dev
);
2152 if ((isr
& ISR_UPC
) ||
2153 (isr
& ISR_UPCERR
) || (isr
& ISR_UPCBSY
)) {
2154 adapter
->upr_interrupts
++;
2155 slic_upr_request_complete(adapter
, isr
);
2160 adapter
->isrcopy
= 0;
2161 adapter
->all_reg_writes
+= 2;
2162 adapter
->isr_reg_writes
++;
2163 slic_reg32_write(&adapter
->slic_regs
->slic_isr
, 0, FLUSH
);
2165 adapter
->false_interrupts
++;
2170 #define NORMAL_ETHFRAME 0
2172 static netdev_tx_t
slic_xmit_start(struct sk_buff
*skb
, struct net_device
*dev
)
2174 struct sliccard
*card
;
2175 struct adapter
*adapter
= netdev_priv(dev
);
2176 struct slic_hostcmd
*hcmd
= NULL
;
2178 void *offloadcmd
= NULL
;
2180 card
= adapter
->card
;
2181 if ((adapter
->linkstate
!= LINK_UP
) ||
2182 (adapter
->state
!= ADAPT_UP
) || (card
->state
!= CARD_UP
)) {
2183 status
= XMIT_FAIL_LINK_STATE
;
2186 } else if (skb
->len
== 0) {
2187 status
= XMIT_FAIL_ZERO_LENGTH
;
2191 hcmd
= slic_cmdq_getfree(adapter
);
2193 adapter
->xmitq_full
= 1;
2194 status
= XMIT_FAIL_HOSTCMD_FAIL
;
2199 hcmd
->type
= SLIC_CMD_DUMB
;
2200 slic_xmit_build_request(adapter
, hcmd
, skb
);
2201 dev
->stats
.tx_packets
++;
2202 dev
->stats
.tx_bytes
+= skb
->len
;
2205 if (adapter
->kill_card
) {
2206 struct slic_host64_cmd ihcmd
;
2208 ihcmd
= &hcmd
->cmd64
;
2210 ihcmd
->flags
|= 0x40;
2211 adapter
->kill_card
= 0; /* only do this once */
2214 if (hcmd
->paddrh
== 0) {
2215 slic_reg32_write(&adapter
->slic_regs
->slic_cbar
,
2216 (hcmd
->paddrl
| hcmd
->cmdsize
), DONT_FLUSH
);
2218 slic_reg64_write(adapter
, &adapter
->slic_regs
->slic_cbar64
,
2219 (hcmd
->paddrl
| hcmd
->cmdsize
),
2220 &adapter
->slic_regs
->slic_addr_upper
,
2221 hcmd
->paddrh
, DONT_FLUSH
);
2224 return NETDEV_TX_OK
;
2226 slic_xmit_fail(adapter
, skb
, offloadcmd
, NORMAL_ETHFRAME
, status
);
2231 static void slic_adapter_freeresources(struct adapter
*adapter
)
2233 slic_init_cleanup(adapter
);
2234 adapter
->error_interrupts
= 0;
2235 adapter
->rcv_interrupts
= 0;
2236 adapter
->xmit_interrupts
= 0;
2237 adapter
->linkevent_interrupts
= 0;
2238 adapter
->upr_interrupts
= 0;
2239 adapter
->num_isrs
= 0;
2240 adapter
->xmit_completes
= 0;
2241 adapter
->rcv_broadcasts
= 0;
2242 adapter
->rcv_multicasts
= 0;
2243 adapter
->rcv_unicasts
= 0;
2246 static int slic_adapter_allocresources(struct adapter
*adapter
,
2247 unsigned long *flags
)
2249 if (!adapter
->intrregistered
) {
2252 spin_unlock_irqrestore(&slic_global
.driver_lock
, *flags
);
2254 retval
= request_irq(adapter
->netdev
->irq
,
2257 adapter
->netdev
->name
, adapter
->netdev
);
2259 spin_lock_irqsave(&slic_global
.driver_lock
, *flags
);
2262 dev_err(&adapter
->netdev
->dev
,
2263 "request_irq (%s) FAILED [%x]\n",
2264 adapter
->netdev
->name
, retval
);
2267 adapter
->intrregistered
= 1;
2275 * Perform initialization of our slic interface.
2278 static int slic_if_init(struct adapter
*adapter
, unsigned long *flags
)
2280 struct sliccard
*card
= adapter
->card
;
2281 struct net_device
*dev
= adapter
->netdev
;
2282 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
2283 struct slic_shmem
*pshmem
;
2286 /* adapter should be down at this point */
2287 if (adapter
->state
!= ADAPT_DOWN
) {
2288 dev_err(&dev
->dev
, "%s: adapter->state != ADAPT_DOWN\n",
2294 adapter
->devflags_prev
= dev
->flags
;
2295 adapter
->macopts
= MAC_DIRECTED
;
2297 if (dev
->flags
& IFF_BROADCAST
)
2298 adapter
->macopts
|= MAC_BCAST
;
2299 if (dev
->flags
& IFF_PROMISC
)
2300 adapter
->macopts
|= MAC_PROMISC
;
2301 if (dev
->flags
& IFF_ALLMULTI
)
2302 adapter
->macopts
|= MAC_ALLMCAST
;
2303 if (dev
->flags
& IFF_MULTICAST
)
2304 adapter
->macopts
|= MAC_MCAST
;
2306 rc
= slic_adapter_allocresources(adapter
, flags
);
2308 dev_err(&dev
->dev
, "slic_adapter_allocresources FAILED %x\n",
2310 slic_adapter_freeresources(adapter
);
2314 if (!adapter
->queues_initialized
) {
2315 rc
= slic_rspqueue_init(adapter
);
2318 rc
= slic_cmdq_init(adapter
);
2321 rc
= slic_rcvqueue_init(adapter
);
2324 adapter
->queues_initialized
= 1;
2327 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_OFF
, FLUSH
);
2330 if (!adapter
->isp_initialized
) {
2331 unsigned long flags
;
2333 pshmem
= (struct slic_shmem
*)(unsigned long)
2334 adapter
->phys_shmem
;
2336 spin_lock_irqsave(&adapter
->bit64reglock
, flags
);
2338 #if BITS_PER_LONG == 64
2339 slic_reg32_write(&slic_regs
->slic_addr_upper
,
2340 SLIC_GET_ADDR_HIGH(&pshmem
->isr
), DONT_FLUSH
);
2341 slic_reg32_write(&slic_regs
->slic_isp
,
2342 SLIC_GET_ADDR_LOW(&pshmem
->isr
), FLUSH
);
2344 slic_reg32_write(&slic_regs
->slic_addr_upper
, 0, DONT_FLUSH
);
2345 slic_reg32_write(&slic_regs
->slic_isp
, (u32
)&pshmem
->isr
,
2348 spin_unlock_irqrestore(&adapter
->bit64reglock
, flags
);
2349 adapter
->isp_initialized
= 1;
2352 adapter
->state
= ADAPT_UP
;
2353 if (!card
->loadtimerset
) {
2354 setup_timer(&card
->loadtimer
, &slic_timer_load_check
,
2356 card
->loadtimer
.expires
=
2357 jiffies
+ (SLIC_LOADTIMER_PERIOD
* HZ
);
2358 add_timer(&card
->loadtimer
);
2360 card
->loadtimerset
= 1;
2363 if (!adapter
->pingtimerset
) {
2364 setup_timer(&adapter
->pingtimer
, &slic_timer_ping
, (ulong
)dev
);
2365 adapter
->pingtimer
.expires
=
2366 jiffies
+ (PING_TIMER_INTERVAL
* HZ
);
2367 add_timer(&adapter
->pingtimer
);
2368 adapter
->pingtimerset
= 1;
2369 adapter
->card
->pingstatus
= ISR_PINGMASK
;
2373 * clear any pending events, then enable interrupts
2375 adapter
->isrcopy
= 0;
2376 adapter
->pshmem
->isr
= 0;
2377 slic_reg32_write(&slic_regs
->slic_isr
, 0, FLUSH
);
2378 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_ON
, FLUSH
);
2380 slic_link_config(adapter
, LINK_AUTOSPEED
, LINK_AUTOD
);
2381 slic_link_event_handler(adapter
);
2387 static int slic_entry_open(struct net_device
*dev
)
2389 struct adapter
*adapter
= netdev_priv(dev
);
2390 struct sliccard
*card
= adapter
->card
;
2391 unsigned long flags
;
2394 netif_stop_queue(adapter
->netdev
);
2396 spin_lock_irqsave(&slic_global
.driver_lock
, flags
);
2397 if (!adapter
->activated
) {
2398 card
->adapters_activated
++;
2399 slic_global
.num_slic_ports_active
++;
2400 adapter
->activated
= 1;
2402 status
= slic_if_init(adapter
, &flags
);
2405 if (adapter
->activated
) {
2406 card
->adapters_activated
--;
2407 slic_global
.num_slic_ports_active
--;
2408 adapter
->activated
= 0;
2413 card
->master
= adapter
;
2416 spin_unlock_irqrestore(&slic_global
.driver_lock
, flags
);
2420 static void slic_card_cleanup(struct sliccard
*card
)
2422 if (card
->loadtimerset
) {
2423 card
->loadtimerset
= 0;
2424 del_timer_sync(&card
->loadtimer
);
2430 static void slic_entry_remove(struct pci_dev
*pcidev
)
2432 struct net_device
*dev
= pci_get_drvdata(pcidev
);
2433 struct adapter
*adapter
= netdev_priv(dev
);
2434 struct sliccard
*card
;
2435 struct mcast_address
*mcaddr
, *mlist
;
2437 unregister_netdev(dev
);
2439 slic_adapter_freeresources(adapter
);
2440 slic_unmap_mmio_space(adapter
);
2442 /* free multicast addresses */
2443 mlist
= adapter
->mcastaddrs
;
2446 mlist
= mlist
->next
;
2449 card
= adapter
->card
;
2450 card
->adapters_allocated
--;
2451 adapter
->allocated
= 0;
2452 if (!card
->adapters_allocated
) {
2453 struct sliccard
*curr_card
= slic_global
.slic_card
;
2455 if (curr_card
== card
) {
2456 slic_global
.slic_card
= card
->next
;
2458 while (curr_card
->next
!= card
)
2459 curr_card
= curr_card
->next
;
2460 curr_card
->next
= card
->next
;
2462 slic_global
.num_slic_cards
--;
2463 slic_card_cleanup(card
);
2466 pci_release_regions(pcidev
);
2467 pci_disable_device(pcidev
);
2470 static int slic_entry_halt(struct net_device
*dev
)
2472 struct adapter
*adapter
= netdev_priv(dev
);
2473 struct sliccard
*card
= adapter
->card
;
2474 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
2475 unsigned long flags
;
2477 spin_lock_irqsave(&slic_global
.driver_lock
, flags
);
2478 netif_stop_queue(adapter
->netdev
);
2479 adapter
->state
= ADAPT_DOWN
;
2480 adapter
->linkstate
= LINK_DOWN
;
2481 adapter
->upr_list
= NULL
;
2482 adapter
->upr_busy
= 0;
2483 adapter
->devflags_prev
= 0;
2484 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_OFF
, FLUSH
);
2485 adapter
->all_reg_writes
++;
2486 adapter
->icr_reg_writes
++;
2487 slic_config_clear(adapter
);
2488 if (adapter
->activated
) {
2489 card
->adapters_activated
--;
2490 slic_global
.num_slic_ports_active
--;
2491 adapter
->activated
= 0;
2493 #ifdef AUTOMATIC_RESET
2494 slic_reg32_write(&slic_regs
->slic_reset_iface
, 0, FLUSH
);
2497 * Reset the adapter's cmd queues
2499 slic_cmdq_reset(adapter
);
2501 #ifdef AUTOMATIC_RESET
2502 if (!card
->adapters_activated
)
2503 slic_card_init(card
, adapter
);
2506 spin_unlock_irqrestore(&slic_global
.driver_lock
, flags
);
2510 static struct net_device_stats
*slic_get_stats(struct net_device
*dev
)
2512 struct adapter
*adapter
= netdev_priv(dev
);
2514 dev
->stats
.collisions
= adapter
->slic_stats
.iface
.xmit_collisions
;
2515 dev
->stats
.rx_errors
= adapter
->slic_stats
.iface
.rcv_errors
;
2516 dev
->stats
.tx_errors
= adapter
->slic_stats
.iface
.xmt_errors
;
2517 dev
->stats
.rx_missed_errors
= adapter
->slic_stats
.iface
.rcv_discards
;
2518 dev
->stats
.tx_heartbeat_errors
= 0;
2519 dev
->stats
.tx_aborted_errors
= 0;
2520 dev
->stats
.tx_window_errors
= 0;
2521 dev
->stats
.tx_fifo_errors
= 0;
2522 dev
->stats
.rx_frame_errors
= 0;
2523 dev
->stats
.rx_length_errors
= 0;
2528 static int slic_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
)
2530 struct adapter
*adapter
= netdev_priv(dev
);
2531 struct ethtool_cmd edata
;
2532 struct ethtool_cmd ecmd
;
2537 case SIOCSLICSETINTAGG
:
2538 if (copy_from_user(data
, rq
->ifr_data
, 28))
2541 dev_err(&dev
->dev
, "set interrupt aggregation to %d\n",
2543 slic_intagg_set(adapter
, intagg
);
2547 if (copy_from_user(&ecmd
, rq
->ifr_data
, sizeof(ecmd
)))
2550 if (ecmd
.cmd
== ETHTOOL_GSET
) {
2551 memset(&edata
, 0, sizeof(edata
));
2552 edata
.supported
= (SUPPORTED_10baseT_Half
|
2553 SUPPORTED_10baseT_Full
|
2554 SUPPORTED_100baseT_Half
|
2555 SUPPORTED_100baseT_Full
|
2556 SUPPORTED_Autoneg
| SUPPORTED_MII
);
2557 edata
.port
= PORT_MII
;
2558 edata
.transceiver
= XCVR_INTERNAL
;
2559 edata
.phy_address
= 0;
2560 if (adapter
->linkspeed
== LINK_100MB
)
2561 edata
.speed
= SPEED_100
;
2562 else if (adapter
->linkspeed
== LINK_10MB
)
2563 edata
.speed
= SPEED_10
;
2567 if (adapter
->linkduplex
== LINK_FULLD
)
2568 edata
.duplex
= DUPLEX_FULL
;
2570 edata
.duplex
= DUPLEX_HALF
;
2572 edata
.autoneg
= AUTONEG_ENABLE
;
2575 if (copy_to_user(rq
->ifr_data
, &edata
, sizeof(edata
)))
2578 } else if (ecmd
.cmd
== ETHTOOL_SSET
) {
2579 if (!capable(CAP_NET_ADMIN
))
2582 if (adapter
->linkspeed
== LINK_100MB
)
2583 edata
.speed
= SPEED_100
;
2584 else if (adapter
->linkspeed
== LINK_10MB
)
2585 edata
.speed
= SPEED_10
;
2589 if (adapter
->linkduplex
== LINK_FULLD
)
2590 edata
.duplex
= DUPLEX_FULL
;
2592 edata
.duplex
= DUPLEX_HALF
;
2594 edata
.autoneg
= AUTONEG_ENABLE
;
2597 if ((ecmd
.speed
!= edata
.speed
) ||
2598 (ecmd
.duplex
!= edata
.duplex
)) {
2602 if (ecmd
.speed
== SPEED_10
)
2605 speed
= PCR_SPEED_100
;
2606 if (ecmd
.duplex
== DUPLEX_FULL
)
2607 duplex
= PCR_DUPLEX_FULL
;
2610 slic_link_config(adapter
, speed
, duplex
);
2611 slic_link_event_handler(adapter
);
2620 static void slic_config_pci(struct pci_dev
*pcidev
)
2625 pci_read_config_word(pcidev
, PCI_COMMAND
, &pci_command
);
2627 new_command
= pci_command
| PCI_COMMAND_MASTER
2628 | PCI_COMMAND_MEMORY
2629 | PCI_COMMAND_INVALIDATE
2630 | PCI_COMMAND_PARITY
| PCI_COMMAND_SERR
| PCI_COMMAND_FAST_BACK
;
2631 if (pci_command
!= new_command
)
2632 pci_write_config_word(pcidev
, PCI_COMMAND
, new_command
);
2635 static int slic_card_init(struct sliccard
*card
, struct adapter
*adapter
)
2637 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
2638 struct slic_eeprom
*peeprom
;
2639 struct oslic_eeprom
*pOeeprom
;
2640 dma_addr_t phys_config
;
2644 struct slic_shmem
*pshmem
;
2646 uint macaddrs
= card
->card_size
;
2651 struct slic_config_mac
*pmac
;
2652 unsigned char fruformat
;
2653 unsigned char oemfruformat
;
2654 struct atk_fru
*patkfru
;
2655 union oemfru
*poemfru
;
2656 unsigned long flags
;
2658 /* Reset everything except PCI configuration space */
2659 slic_soft_reset(adapter
);
2661 /* Download the microcode */
2662 status
= slic_card_download(adapter
);
2666 if (!card
->config_set
) {
2667 peeprom
= pci_alloc_consistent(adapter
->pcidev
,
2668 sizeof(struct slic_eeprom
),
2671 phys_configl
= SLIC_GET_ADDR_LOW(phys_config
);
2672 phys_configh
= SLIC_GET_ADDR_HIGH(phys_config
);
2675 dev_err(&adapter
->pcidev
->dev
,
2676 "Failed to allocate DMA memory for EEPROM.\n");
2680 memset(peeprom
, 0, sizeof(struct slic_eeprom
));
2682 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_OFF
, FLUSH
);
2684 pshmem
= (struct slic_shmem
*)(unsigned long)
2685 adapter
->phys_shmem
;
2687 spin_lock_irqsave(&adapter
->bit64reglock
, flags
);
2688 slic_reg32_write(&slic_regs
->slic_addr_upper
,
2689 SLIC_GET_ADDR_HIGH(&pshmem
->isr
), DONT_FLUSH
);
2690 slic_reg32_write(&slic_regs
->slic_isp
,
2691 SLIC_GET_ADDR_LOW(&pshmem
->isr
), FLUSH
);
2692 spin_unlock_irqrestore(&adapter
->bit64reglock
, flags
);
2694 status
= slic_config_get(adapter
, phys_configl
, phys_configh
);
2696 dev_err(&adapter
->pcidev
->dev
,
2697 "Failed to fetch config data from device.\n");
2702 if (adapter
->pshmem
->isr
) {
2703 if (adapter
->pshmem
->isr
& ISR_UPC
) {
2704 adapter
->pshmem
->isr
= 0;
2705 slic_reg64_write(adapter
,
2706 &slic_regs
->slic_isp
, 0,
2707 &slic_regs
->slic_addr_upper
,
2709 slic_reg32_write(&slic_regs
->slic_isr
,
2712 slic_upr_request_complete(adapter
, 0);
2716 adapter
->pshmem
->isr
= 0;
2717 slic_reg32_write(&slic_regs
->slic_isr
,
2723 dev_err(&adapter
->pcidev
->dev
,
2724 "Fetch of config data timed out.\n");
2725 slic_reg64_write(adapter
,
2726 &slic_regs
->slic_isp
, 0,
2727 &slic_regs
->slic_addr_upper
,
2735 switch (adapter
->devid
) {
2737 case SLIC_2GB_DEVICE_ID
:
2738 /* extract EEPROM data and pointers to EEPROM data */
2739 pOeeprom
= (struct oslic_eeprom
*) peeprom
;
2740 eecodesize
= pOeeprom
->EecodeSize
;
2741 dramsize
= pOeeprom
->DramSize
;
2742 pmac
= pOeeprom
->MacInfo
;
2743 fruformat
= pOeeprom
->FruFormat
;
2744 patkfru
= &pOeeprom
->AtkFru
;
2745 oemfruformat
= pOeeprom
->OemFruFormat
;
2746 poemfru
= &pOeeprom
->OemFru
;
2748 /* Minor kludge for Oasis card
2749 get 2 MAC addresses from the
2750 EEPROM to ensure that function 1
2751 gets the Port 1 MAC address */
2754 /* extract EEPROM data and pointers to EEPROM data */
2755 eecodesize
= peeprom
->EecodeSize
;
2756 dramsize
= peeprom
->DramSize
;
2757 pmac
= peeprom
->u2
.mac
.MacInfo
;
2758 fruformat
= peeprom
->FruFormat
;
2759 patkfru
= &peeprom
->AtkFru
;
2760 oemfruformat
= peeprom
->OemFruFormat
;
2761 poemfru
= &peeprom
->OemFru
;
2765 card
->config
.EepromValid
= false;
2767 /* see if the EEPROM is valid by checking it's checksum */
2768 if ((eecodesize
<= MAX_EECODE_SIZE
) &&
2769 (eecodesize
>= MIN_EECODE_SIZE
)) {
2772 *(u16
*) ((char *) peeprom
+ (eecodesize
- 2));
2774 calculate the EEPROM checksum
2776 calc_chksum
= slic_eeprom_cksum(peeprom
,
2779 if the ucdoe chksum flag bit worked,
2780 we wouldn't need this
2782 if (ee_chksum
== calc_chksum
)
2783 card
->config
.EepromValid
= true;
2785 /* copy in the DRAM size */
2786 card
->config
.DramSize
= dramsize
;
2788 /* copy in the MAC address(es) */
2789 for (i
= 0; i
< macaddrs
; i
++) {
2790 memcpy(&card
->config
.MacInfo
[i
],
2791 &pmac
[i
], sizeof(struct slic_config_mac
));
2794 /* copy the Alacritech FRU information */
2795 card
->config
.FruFormat
= fruformat
;
2796 memcpy(&card
->config
.AtkFru
, patkfru
,
2797 sizeof(struct atk_fru
));
2799 pci_free_consistent(adapter
->pcidev
,
2800 sizeof(struct slic_eeprom
),
2801 peeprom
, phys_config
);
2803 if (!card
->config
.EepromValid
) {
2804 slic_reg64_write(adapter
, &slic_regs
->slic_isp
, 0,
2805 &slic_regs
->slic_addr_upper
,
2807 dev_err(&adapter
->pcidev
->dev
, "EEPROM invalid.\n");
2811 card
->config_set
= 1;
2814 status
= slic_card_download_gbrcv(adapter
);
2818 if (slic_global
.dynamic_intagg
)
2819 slic_intagg_set(adapter
, 0);
2821 slic_intagg_set(adapter
, intagg_delay
);
2824 * Initialize ping status to "ok"
2826 card
->pingstatus
= ISR_PINGMASK
;
2829 * Lastly, mark our card state as up and return success
2831 card
->state
= CARD_UP
;
2832 card
->reset_in_progress
= 0;
2837 pci_free_consistent(adapter
->pcidev
, sizeof(struct slic_eeprom
),
2838 peeprom
, phys_config
);
2842 static void slic_init_driver(void)
2844 if (slic_first_init
) {
2845 slic_first_init
= 0;
2846 spin_lock_init(&slic_global
.driver_lock
);
2850 static void slic_init_adapter(struct net_device
*netdev
,
2851 struct pci_dev
*pcidev
,
2852 const struct pci_device_id
*pci_tbl_entry
,
2853 void __iomem
*memaddr
, int chip_idx
)
2856 struct slic_handle
*pslic_handle
;
2857 struct adapter
*adapter
= netdev_priv(netdev
);
2859 /* adapter->pcidev = pcidev;*/
2860 adapter
->vendid
= pci_tbl_entry
->vendor
;
2861 adapter
->devid
= pci_tbl_entry
->device
;
2862 adapter
->subsysid
= pci_tbl_entry
->subdevice
;
2863 adapter
->busnumber
= pcidev
->bus
->number
;
2864 adapter
->slotnumber
= ((pcidev
->devfn
>> 3) & 0x1F);
2865 adapter
->functionnumber
= (pcidev
->devfn
& 0x7);
2866 adapter
->slic_regs
= (__iomem
struct slic_regs
*)memaddr
;
2867 adapter
->irq
= pcidev
->irq
;
2868 /* adapter->netdev = netdev;*/
2869 adapter
->chipid
= chip_idx
;
2870 adapter
->port
= 0; /*adapter->functionnumber;*/
2871 adapter
->cardindex
= adapter
->port
;
2872 spin_lock_init(&adapter
->upr_lock
);
2873 spin_lock_init(&adapter
->bit64reglock
);
2874 spin_lock_init(&adapter
->adapter_lock
);
2875 spin_lock_init(&adapter
->reset_lock
);
2876 spin_lock_init(&adapter
->handle_lock
);
2878 adapter
->card_size
= 1;
2880 Initialize slic_handle array
2883 Start with 1. 0 is an invalid host handle.
2885 for (index
= 1, pslic_handle
= &adapter
->slic_handles
[1];
2886 index
< SLIC_CMDQ_MAXCMDS
; index
++, pslic_handle
++) {
2888 pslic_handle
->token
.handle_index
= index
;
2889 pslic_handle
->type
= SLIC_HANDLE_FREE
;
2890 pslic_handle
->next
= adapter
->pfree_slic_handles
;
2891 adapter
->pfree_slic_handles
= pslic_handle
;
2893 adapter
->pshmem
= (struct slic_shmem
*)
2894 pci_alloc_consistent(adapter
->pcidev
,
2895 sizeof(struct slic_shmem
),
2898 if (adapter
->pshmem
)
2899 memset(adapter
->pshmem
, 0, sizeof(struct slic_shmem
));
2902 static const struct net_device_ops slic_netdev_ops
= {
2903 .ndo_open
= slic_entry_open
,
2904 .ndo_stop
= slic_entry_halt
,
2905 .ndo_start_xmit
= slic_xmit_start
,
2906 .ndo_do_ioctl
= slic_ioctl
,
2907 .ndo_set_mac_address
= slic_mac_set_address
,
2908 .ndo_get_stats
= slic_get_stats
,
2909 .ndo_set_rx_mode
= slic_mcast_set_list
,
2910 .ndo_validate_addr
= eth_validate_addr
,
2911 .ndo_change_mtu
= eth_change_mtu
,
2914 static u32
slic_card_locate(struct adapter
*adapter
)
2916 struct sliccard
*card
= slic_global
.slic_card
;
2917 struct physcard
*physcard
= slic_global
.phys_card
;
2919 u16 __iomem
*hostid_reg
;
2921 uint rdhostid_offset
= 0;
2923 switch (adapter
->devid
) {
2924 case SLIC_2GB_DEVICE_ID
:
2925 rdhostid_offset
= SLIC_RDHOSTID_2GB
;
2927 case SLIC_1GB_DEVICE_ID
:
2928 rdhostid_offset
= SLIC_RDHOSTID_1GB
;
2935 (u16 __iomem
*) (((u8 __iomem
*) (adapter
->slic_regs
)) +
2938 /* read the 16 bit hostid from SRAM */
2939 card_hostid
= (ushort
) readw(hostid_reg
);
2941 /* Initialize a new card structure if need be */
2942 if (card_hostid
== SLIC_HOSTID_DEFAULT
) {
2943 card
= kzalloc(sizeof(struct sliccard
), GFP_KERNEL
);
2947 card
->next
= slic_global
.slic_card
;
2948 slic_global
.slic_card
= card
;
2949 card
->busnumber
= adapter
->busnumber
;
2950 card
->slotnumber
= adapter
->slotnumber
;
2952 /* Find an available cardnum */
2953 for (i
= 0; i
< SLIC_MAX_CARDS
; i
++) {
2954 if (slic_global
.cardnuminuse
[i
] == 0) {
2955 slic_global
.cardnuminuse
[i
] = 1;
2960 slic_global
.num_slic_cards
++;
2962 /* Card exists, find the card this adapter belongs to */
2964 if (card
->cardnum
== card_hostid
)
2972 /* Put the adapter in the card's adapter list */
2973 if (!card
->adapter
[adapter
->port
]) {
2974 card
->adapter
[adapter
->port
] = adapter
;
2975 adapter
->card
= card
;
2978 card
->card_size
= 1; /* one port per *logical* card */
2981 for (i
= 0; i
< SLIC_MAX_PORTS
; i
++) {
2982 if (physcard
->adapter
[i
])
2985 if (i
== SLIC_MAX_PORTS
)
2988 if (physcard
->adapter
[i
]->slotnumber
== adapter
->slotnumber
)
2990 physcard
= physcard
->next
;
2993 /* no structure allocated for this physical card yet */
2994 physcard
= kzalloc(sizeof(struct physcard
), GFP_ATOMIC
);
2996 if (card_hostid
== SLIC_HOSTID_DEFAULT
)
3001 physcard
->next
= slic_global
.phys_card
;
3002 slic_global
.phys_card
= physcard
;
3003 physcard
->adapters_allocd
= 1;
3005 physcard
->adapters_allocd
++;
3007 /* Note - this is ZERO relative */
3008 adapter
->physport
= physcard
->adapters_allocd
- 1;
3010 physcard
->adapter
[adapter
->physport
] = adapter
;
3011 adapter
->physcard
= physcard
;
3016 static int slic_entry_probe(struct pci_dev
*pcidev
,
3017 const struct pci_device_id
*pci_tbl_entry
)
3019 static int cards_found
;
3020 static int did_version
;
3022 struct net_device
*netdev
;
3023 struct adapter
*adapter
;
3024 void __iomem
*memmapped_ioaddr
= NULL
;
3025 ulong mmio_start
= 0;
3027 struct sliccard
*card
= NULL
;
3028 int pci_using_dac
= 0;
3030 slic_global
.dynamic_intagg
= dynamic_intagg
;
3032 err
= pci_enable_device(pcidev
);
3037 if (did_version
++ == 0) {
3038 dev_info(&pcidev
->dev
, "%s\n", slic_banner
);
3039 dev_info(&pcidev
->dev
, "%s\n", slic_proc_version
);
3042 if (!pci_set_dma_mask(pcidev
, DMA_BIT_MASK(64))) {
3044 err
= pci_set_consistent_dma_mask(pcidev
, DMA_BIT_MASK(64));
3046 dev_err(&pcidev
->dev
, "unable to obtain 64-bit DMA for consistent allocations\n");
3047 goto err_out_disable_pci
;
3050 err
= pci_set_dma_mask(pcidev
, DMA_BIT_MASK(32));
3052 dev_err(&pcidev
->dev
, "no usable DMA configuration\n");
3053 goto err_out_disable_pci
;
3056 pci_set_consistent_dma_mask(pcidev
, DMA_BIT_MASK(32));
3059 err
= pci_request_regions(pcidev
, DRV_NAME
);
3061 dev_err(&pcidev
->dev
, "can't obtain PCI resources\n");
3062 goto err_out_disable_pci
;
3065 pci_set_master(pcidev
);
3067 netdev
= alloc_etherdev(sizeof(struct adapter
));
3070 goto err_out_exit_slic_probe
;
3073 SET_NETDEV_DEV(netdev
, &pcidev
->dev
);
3075 pci_set_drvdata(pcidev
, netdev
);
3076 adapter
= netdev_priv(netdev
);
3077 adapter
->netdev
= netdev
;
3078 adapter
->pcidev
= pcidev
;
3080 netdev
->features
|= NETIF_F_HIGHDMA
;
3082 mmio_start
= pci_resource_start(pcidev
, 0);
3083 mmio_len
= pci_resource_len(pcidev
, 0);
3086 /* memmapped_ioaddr = (u32)ioremap_nocache(mmio_start, mmio_len);*/
3087 memmapped_ioaddr
= ioremap(mmio_start
, mmio_len
);
3088 if (!memmapped_ioaddr
) {
3089 dev_err(&pcidev
->dev
, "cannot remap MMIO region %lx @ %lx\n",
3090 mmio_len
, mmio_start
);
3092 goto err_out_free_netdev
;
3095 slic_config_pci(pcidev
);
3099 slic_init_adapter(netdev
,
3100 pcidev
, pci_tbl_entry
, memmapped_ioaddr
, cards_found
);
3102 err
= slic_card_locate(adapter
);
3104 dev_err(&pcidev
->dev
, "cannot locate card\n");
3108 card
= adapter
->card
;
3110 if (!adapter
->allocated
) {
3111 card
->adapters_allocated
++;
3112 adapter
->allocated
= 1;
3115 err
= slic_card_init(card
, adapter
);
3119 slic_adapter_set_hwaddr(adapter
);
3121 netdev
->base_addr
= (unsigned long) memmapped_ioaddr
;
3122 netdev
->irq
= adapter
->irq
;
3123 netdev
->netdev_ops
= &slic_netdev_ops
;
3125 strcpy(netdev
->name
, "eth%d");
3126 err
= register_netdev(netdev
);
3128 dev_err(&pcidev
->dev
, "Cannot register net device, aborting.\n");
3137 iounmap(memmapped_ioaddr
);
3138 err_out_free_netdev
:
3139 free_netdev(netdev
);
3140 err_out_exit_slic_probe
:
3141 pci_release_regions(pcidev
);
3142 err_out_disable_pci
:
3143 pci_disable_device(pcidev
);
3147 static struct pci_driver slic_driver
= {
3149 .id_table
= slic_pci_tbl
,
3150 .probe
= slic_entry_probe
,
3151 .remove
= slic_entry_remove
,
3154 static int __init
slic_module_init(void)
3158 return pci_register_driver(&slic_driver
);
3161 static void __exit
slic_module_cleanup(void)
3163 pci_unregister_driver(&slic_driver
);
3166 module_init(slic_module_init
);
3167 module_exit(slic_module_cleanup
);