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
57 #define KLUDGE_FOR_4GB_BOUNDARY 1
58 #define DEBUG_MICROCODE 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
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>
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>
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>
94 #include <linux/ethtool.h>
95 #include <linux/uaccess.h>
99 static uint slic_first_init
= 1;
100 static char *slic_banner
= "Alacritech SLIC Technology(tm) Server and Storage Accelerator (Non-Accelerated)";
102 static char *slic_proc_version
= "2.0.351 2006/07/14 12:26:00";
104 static struct base_driver slic_global
= { {}, 0, 0, 0, 1, NULL
, NULL
};
105 #define DEFAULT_INTAGG_DELAY 100
106 static unsigned int rcv_count
;
108 #define DRV_NAME "slicoss"
109 #define DRV_VERSION "2.0.1"
110 #define DRV_AUTHOR "Alacritech, Inc. Engineering"
111 #define DRV_DESCRIPTION "Alacritech SLIC Techonology(tm) "\
112 "Non-Accelerated Driver"
113 #define DRV_COPYRIGHT "Copyright 2000-2006 Alacritech, Inc. "\
114 "All rights reserved."
115 #define PFX DRV_NAME " "
117 MODULE_AUTHOR(DRV_AUTHOR
);
118 MODULE_DESCRIPTION(DRV_DESCRIPTION
);
119 MODULE_LICENSE("Dual BSD/GPL");
121 static const struct pci_device_id slic_pci_tbl
[] = {
122 { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH
, SLIC_1GB_DEVICE_ID
) },
123 { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH
, SLIC_2GB_DEVICE_ID
) },
127 static struct ethtool_ops slic_ethtool_ops
;
129 MODULE_DEVICE_TABLE(pci
, slic_pci_tbl
);
131 static inline void slic_reg32_write(void __iomem
*reg
, u32 value
, bool flush
)
138 static inline void slic_reg64_write(struct adapter
*adapter
, void __iomem
*reg
,
139 u32 value
, void __iomem
*regh
, u32 paddrh
,
144 spin_lock_irqsave(&adapter
->bit64reglock
, flags
);
145 writel(paddrh
, regh
);
149 spin_unlock_irqrestore(&adapter
->bit64reglock
, flags
);
152 static void slic_mcast_set_bit(struct adapter
*adapter
, char *address
)
154 unsigned char crcpoly
;
156 /* Get the CRC polynomial for the mac address */
158 * we use bits 1-8 (lsb), bitwise reversed,
159 * msb (= lsb bit 0 before bitrev) is automatically discarded
161 crcpoly
= ether_crc(ETH_ALEN
, address
) >> 23;
164 * We only have space on the SLIC for 64 entries. Lop
165 * off the top two bits. (2^6 = 64)
169 /* OR in the new bit into our 64 bit mask. */
170 adapter
->mcastmask
|= (u64
)1 << crcpoly
;
173 static void slic_mcast_set_mask(struct adapter
*adapter
)
175 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
177 if (adapter
->macopts
& (MAC_ALLMCAST
| MAC_PROMISC
)) {
179 * Turn on all multicast addresses. We have to do this for
180 * promiscuous mode as well as ALLMCAST mode. It saves the
181 * Microcode from having to keep state about the MAC
184 slic_reg32_write(&slic_regs
->slic_mcastlow
, 0xFFFFFFFF, FLUSH
);
185 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
) {
247 * We've got a fiber gigabit interface, and register
248 * 4 is different in fiber mode than in copper mode
251 /* advertise FD only @1000 Mb */
252 phy_advreg
= (MIICR_REG_4
| (PAR_ADV1000XFD
));
253 /* enable PAUSE frames */
254 phy_advreg
|= PAR_ASYMPAUSE_FIBER
;
255 slic_reg32_write(wphy
, phy_advreg
, FLUSH
);
257 if (linkspeed
== LINK_AUTOSPEED
) {
258 /* reset phy, enable auto-neg */
261 (PCR_RESET
| PCR_AUTONEG
|
263 slic_reg32_write(wphy
, phy_config
, FLUSH
);
264 } else { /* forced 1000 Mb FD*/
266 * power down phy to break link
269 phy_config
= (MIICR_REG_PCR
| PCR_POWERDOWN
);
270 slic_reg32_write(wphy
, phy_config
, FLUSH
);
272 * wait, Marvell says 1 sec,
273 * try to get away with 10 ms
278 * disable auto-neg, set speed/duplex,
279 * soft reset phy, powerup
283 (PCR_RESET
| PCR_SPEED_1000
|
285 slic_reg32_write(wphy
, phy_config
, FLUSH
);
287 } else { /* copper gigabit */
290 * Auto-Negotiate or 1000 Mb must be auto negotiated
291 * We've got a copper gigabit interface, and
292 * register 4 is different in copper mode than
295 if (linkspeed
== LINK_AUTOSPEED
) {
296 /* advertise 10/100 Mb modes */
299 (PAR_ADV100FD
| PAR_ADV100HD
| PAR_ADV10FD
303 * linkspeed == LINK_1000MB -
304 * don't advertise 10/100 Mb modes
306 phy_advreg
= MIICR_REG_4
;
308 /* enable PAUSE frames */
309 phy_advreg
|= PAR_ASYMPAUSE
;
310 /* required by the Cicada PHY */
311 phy_advreg
|= PAR_802_3
;
312 slic_reg32_write(wphy
, phy_advreg
, FLUSH
);
313 /* advertise FD only @1000 Mb */
314 phy_gctlreg
= (MIICR_REG_9
| (PGC_ADV1000FD
));
315 slic_reg32_write(wphy
, phy_gctlreg
, FLUSH
);
317 if (adapter
->subsysid
!= SLIC_1GB_CICADA_SUBSYS_ID
) {
320 * enable auto crossover
323 (MIICR_REG_16
| (MRV_REG16_XOVERON
));
324 slic_reg32_write(wphy
, phy_config
, FLUSH
);
326 /* reset phy, enable auto-neg */
329 (PCR_RESET
| PCR_AUTONEG
|
331 slic_reg32_write(wphy
, phy_config
, FLUSH
);
332 } else { /* it's a Cicada PHY */
333 /* enable and restart auto-neg (don't reset) */
336 (PCR_AUTONEG
| PCR_AUTONEG_RST
));
337 slic_reg32_write(wphy
, phy_config
, FLUSH
);
342 if (linkspeed
== LINK_10MB
)
345 speed
= PCR_SPEED_100
;
346 if (linkduplex
== LINK_HALFD
)
349 duplex
= PCR_DUPLEX_FULL
;
351 if (adapter
->subsysid
!= SLIC_1GB_CICADA_SUBSYS_ID
) {
354 * disable auto crossover
356 phy_config
= (MIICR_REG_16
| (MRV_REG16_XOVEROFF
));
357 slic_reg32_write(wphy
, phy_config
, FLUSH
);
360 /* power down phy to break link (this may not work) */
361 phy_config
= (MIICR_REG_PCR
| (PCR_POWERDOWN
| speed
| duplex
));
362 slic_reg32_write(wphy
, phy_config
, FLUSH
);
364 /* wait, Marvell says 1 sec, try to get away with 10 ms */
367 if (adapter
->subsysid
!= SLIC_1GB_CICADA_SUBSYS_ID
) {
370 * disable auto-neg, set speed,
371 * soft reset phy, powerup
374 (MIICR_REG_PCR
| (PCR_RESET
| speed
| duplex
));
375 slic_reg32_write(wphy
, phy_config
, FLUSH
);
376 } else { /* it's a Cicada PHY */
377 /* disable auto-neg, set speed, powerup */
378 phy_config
= (MIICR_REG_PCR
| (speed
| duplex
));
379 slic_reg32_write(wphy
, phy_config
, FLUSH
);
384 static int slic_card_download_gbrcv(struct adapter
*adapter
)
386 const struct firmware
*fw
;
387 const char *file
= "";
389 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
395 switch (adapter
->devid
) {
396 case SLIC_2GB_DEVICE_ID
:
397 file
= "slicoss/oasisrcvucode.sys";
399 case SLIC_1GB_DEVICE_ID
:
400 file
= "slicoss/gbrcvucode.sys";
406 ret
= request_firmware(&fw
, file
, &adapter
->pcidev
->dev
);
408 dev_err(&adapter
->pcidev
->dev
,
409 "Failed to load firmware %s\n", file
);
413 rcvucodelen
= *(u32
*)(fw
->data
+ index
);
415 switch (adapter
->devid
) {
416 case SLIC_2GB_DEVICE_ID
:
417 if (rcvucodelen
!= OasisRcvUCodeLen
) {
418 release_firmware(fw
);
422 case SLIC_1GB_DEVICE_ID
:
423 if (rcvucodelen
!= GBRcvUCodeLen
) {
424 release_firmware(fw
);
430 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, SLIC_RCVWCS_BEGIN
, FLUSH
);
431 /* download the rcv sequencer ucode */
432 for (codeaddr
= 0; codeaddr
< rcvucodelen
; codeaddr
++) {
433 /* write out instruction address */
434 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, codeaddr
, FLUSH
);
436 instruction
= *(u32
*)(fw
->data
+ index
);
438 /* write out the instruction data low addr */
439 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, instruction
, FLUSH
);
441 instruction
= *(u8
*)(fw
->data
+ index
);
443 /* write out the instruction data high addr */
444 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, (u8
)instruction
,
448 /* download finished */
449 release_firmware(fw
);
450 slic_reg32_write(&slic_regs
->slic_rcv_wcs
, SLIC_RCVWCS_FINISH
, FLUSH
);
454 MODULE_FIRMWARE("slicoss/oasisrcvucode.sys");
455 MODULE_FIRMWARE("slicoss/gbrcvucode.sys");
457 static int slic_card_download(struct adapter
*adapter
)
459 const struct firmware
*fw
;
460 const char *file
= "";
465 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
472 int ucode_start
, index
= 0;
474 switch (adapter
->devid
) {
475 case SLIC_2GB_DEVICE_ID
:
476 file
= "slicoss/oasisdownload.sys";
478 case SLIC_1GB_DEVICE_ID
:
479 file
= "slicoss/gbdownload.sys";
484 ret
= request_firmware(&fw
, file
, &adapter
->pcidev
->dev
);
486 dev_err(&adapter
->pcidev
->dev
,
487 "Failed to load firmware %s\n", file
);
490 numsects
= *(u32
*)(fw
->data
+ index
);
492 for (i
= 0; i
< numsects
; i
++) {
493 sectsize
[i
] = *(u32
*)(fw
->data
+ index
);
496 for (i
= 0; i
< numsects
; i
++) {
497 sectstart
[i
] = *(u32
*)(fw
->data
+ index
);
501 instruction
= *(u32
*)(fw
->data
+ index
);
503 for (section
= 0; section
< numsects
; section
++) {
504 baseaddress
= sectstart
[section
];
505 thissectionsize
= sectsize
[section
] >> 3;
507 for (codeaddr
= 0; codeaddr
< thissectionsize
; codeaddr
++) {
508 /* Write out instruction address */
509 slic_reg32_write(&slic_regs
->slic_wcs
,
510 baseaddress
+ codeaddr
, FLUSH
);
511 /* Write out instruction to low addr */
512 slic_reg32_write(&slic_regs
->slic_wcs
,
514 instruction
= *(u32
*)(fw
->data
+ index
);
517 /* Write out instruction to high addr */
518 slic_reg32_write(&slic_regs
->slic_wcs
,
520 instruction
= *(u32
*)(fw
->data
+ index
);
525 for (section
= 0; section
< numsects
; section
++) {
526 instruction
= *(u32
*)(fw
->data
+ index
);
527 baseaddress
= sectstart
[section
];
528 if (baseaddress
< 0x8000)
530 thissectionsize
= sectsize
[section
] >> 3;
532 for (codeaddr
= 0; codeaddr
< thissectionsize
; codeaddr
++) {
533 /* Write out instruction address */
534 slic_reg32_write(&slic_regs
->slic_wcs
,
535 SLIC_WCS_COMPARE
| (baseaddress
+ codeaddr
),
537 /* Write out instruction to low addr */
538 slic_reg32_write(&slic_regs
->slic_wcs
, instruction
,
540 instruction
= *(u32
*)(fw
->data
+ index
);
542 /* Write out instruction to high addr */
543 slic_reg32_write(&slic_regs
->slic_wcs
, instruction
,
545 instruction
= *(u32
*)(fw
->data
+ index
);
550 release_firmware(fw
);
551 /* Everything OK, kick off the card */
553 slic_reg32_write(&slic_regs
->slic_wcs
, SLIC_WCS_START
, FLUSH
);
556 * stall for 20 ms, long enough for ucode to init card
564 MODULE_FIRMWARE("slicoss/oasisdownload.sys");
565 MODULE_FIRMWARE("slicoss/gbdownload.sys");
567 static void slic_adapter_set_hwaddr(struct adapter
*adapter
)
569 struct sliccard
*card
= adapter
->card
;
571 if ((adapter
->card
) && (card
->config_set
)) {
572 memcpy(adapter
->macaddr
,
573 card
->config
.MacInfo
[adapter
->functionnumber
].macaddrA
,
574 sizeof(struct slic_config_mac
));
575 if (is_zero_ether_addr(adapter
->currmacaddr
))
576 memcpy(adapter
->currmacaddr
, adapter
->macaddr
,
579 memcpy(adapter
->netdev
->dev_addr
, adapter
->currmacaddr
,
584 static void slic_intagg_set(struct adapter
*adapter
, u32 value
)
586 slic_reg32_write(&adapter
->slic_regs
->slic_intagg
, value
, FLUSH
);
587 adapter
->card
->loadlevel_current
= value
;
590 static void slic_soft_reset(struct adapter
*adapter
)
592 if (adapter
->card
->state
== CARD_UP
) {
593 slic_reg32_write(&adapter
->slic_regs
->slic_quiesce
, 0, FLUSH
);
597 slic_reg32_write(&adapter
->slic_regs
->slic_reset
, SLIC_RESET_MAGIC
,
602 static void slic_mac_address_config(struct adapter
*adapter
)
606 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
608 value
= ntohl(*(__be32
*)&adapter
->currmacaddr
[2]);
609 slic_reg32_write(&slic_regs
->slic_wraddral
, value
, FLUSH
);
610 slic_reg32_write(&slic_regs
->slic_wraddrbl
, value
, FLUSH
);
612 value2
= (u32
)((adapter
->currmacaddr
[0] << 8 |
613 adapter
->currmacaddr
[1]) & 0xFFFF);
615 slic_reg32_write(&slic_regs
->slic_wraddrah
, value2
, FLUSH
);
616 slic_reg32_write(&slic_regs
->slic_wraddrbh
, value2
, FLUSH
);
619 * Write our multicast mask out to the card. This is done
620 * here in addition to the slic_mcast_addr_set routine
621 * because ALL_MCAST may have been enabled or disabled
623 slic_mcast_set_mask(adapter
);
626 static void slic_mac_config(struct adapter
*adapter
)
629 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
631 /* Setup GMAC gaps */
632 if (adapter
->linkspeed
== LINK_1000MB
) {
633 value
= ((GMCR_GAPBB_1000
<< GMCR_GAPBB_SHIFT
) |
634 (GMCR_GAPR1_1000
<< GMCR_GAPR1_SHIFT
) |
635 (GMCR_GAPR2_1000
<< GMCR_GAPR2_SHIFT
));
637 value
= ((GMCR_GAPBB_100
<< GMCR_GAPBB_SHIFT
) |
638 (GMCR_GAPR1_100
<< GMCR_GAPR1_SHIFT
) |
639 (GMCR_GAPR2_100
<< GMCR_GAPR2_SHIFT
));
643 if (adapter
->linkspeed
== LINK_1000MB
)
646 /* enable fullduplex */
647 if ((adapter
->linkduplex
== LINK_FULLD
)
648 || (adapter
->macopts
& MAC_LOOPBACK
)) {
652 /* write mac config */
653 slic_reg32_write(&slic_regs
->slic_wmcfg
, value
, FLUSH
);
655 /* setup mac addresses */
656 slic_mac_address_config(adapter
);
659 static void slic_config_set(struct adapter
*adapter
, bool linkchange
)
663 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
667 slic_mac_config(adapter
);
668 RcrReset
= GRCR_RESET
;
670 slic_mac_address_config(adapter
);
674 if (adapter
->linkduplex
== LINK_FULLD
) {
676 value
= (GXCR_RESET
| /* Always reset */
677 GXCR_XMTEN
| /* Enable transmit */
678 GXCR_PAUSEEN
); /* Enable pause */
680 slic_reg32_write(&slic_regs
->slic_wxcfg
, value
, FLUSH
);
682 /* Setup rcvcfg last */
683 value
= (RcrReset
| /* Reset, if linkchange */
684 GRCR_CTLEN
| /* Enable CTL frames */
685 GRCR_ADDRAEN
| /* Address A enable */
686 GRCR_RCVBAD
| /* Rcv bad frames */
687 (GRCR_HASHSIZE
<< GRCR_HASHSIZE_SHIFT
));
690 value
= (GXCR_RESET
| /* Always reset */
691 GXCR_XMTEN
); /* Enable transmit */
693 slic_reg32_write(&slic_regs
->slic_wxcfg
, value
, FLUSH
);
695 /* Setup rcvcfg last */
696 value
= (RcrReset
| /* Reset, if linkchange */
697 GRCR_ADDRAEN
| /* Address A enable */
698 GRCR_RCVBAD
| /* Rcv bad frames */
699 (GRCR_HASHSIZE
<< GRCR_HASHSIZE_SHIFT
));
702 if (adapter
->state
!= ADAPT_DOWN
) {
703 /* Only enable receive if we are restarting or running */
707 if (adapter
->macopts
& MAC_PROMISC
)
708 value
|= GRCR_RCVALL
;
710 slic_reg32_write(&slic_regs
->slic_wrcfg
, value
, FLUSH
);
714 * Turn off RCV and XMT, power down PHY
716 static void slic_config_clear(struct adapter
*adapter
)
720 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
723 value
= (GXCR_RESET
| /* Always reset */
724 GXCR_PAUSEEN
); /* Enable pause */
726 slic_reg32_write(&slic_regs
->slic_wxcfg
, value
, FLUSH
);
728 value
= (GRCR_RESET
| /* Always reset */
729 GRCR_CTLEN
| /* Enable CTL frames */
730 GRCR_ADDRAEN
| /* Address A enable */
731 (GRCR_HASHSIZE
<< GRCR_HASHSIZE_SHIFT
));
733 slic_reg32_write(&slic_regs
->slic_wrcfg
, value
, FLUSH
);
736 phy_config
= (MIICR_REG_PCR
| (PCR_POWERDOWN
));
737 slic_reg32_write(&slic_regs
->slic_wphy
, phy_config
, FLUSH
);
740 static bool slic_mac_filter(struct adapter
*adapter
,
741 struct ether_header
*ether_frame
)
743 struct net_device
*netdev
= adapter
->netdev
;
744 u32 opts
= adapter
->macopts
;
746 if (opts
& MAC_PROMISC
)
749 if (is_broadcast_ether_addr(ether_frame
->ether_dhost
)) {
750 if (opts
& MAC_BCAST
) {
751 adapter
->rcv_broadcasts
++;
758 if (is_multicast_ether_addr(ether_frame
->ether_dhost
)) {
759 if (opts
& MAC_ALLMCAST
) {
760 adapter
->rcv_multicasts
++;
761 netdev
->stats
.multicast
++;
764 if (opts
& MAC_MCAST
) {
765 struct mcast_address
*mcaddr
= adapter
->mcastaddrs
;
768 if (ether_addr_equal(mcaddr
->address
,
769 ether_frame
->ether_dhost
)) {
770 adapter
->rcv_multicasts
++;
771 netdev
->stats
.multicast
++;
774 mcaddr
= mcaddr
->next
;
782 if (opts
& MAC_DIRECTED
) {
783 adapter
->rcv_unicasts
++;
789 static int slic_mac_set_address(struct net_device
*dev
, void *ptr
)
791 struct adapter
*adapter
= netdev_priv(dev
);
792 struct sockaddr
*addr
= ptr
;
794 if (netif_running(dev
))
799 if (!is_valid_ether_addr(addr
->sa_data
))
802 memcpy(dev
->dev_addr
, addr
->sa_data
, dev
->addr_len
);
803 memcpy(adapter
->currmacaddr
, addr
->sa_data
, dev
->addr_len
);
805 slic_config_set(adapter
, true);
809 static void slic_timer_load_check(ulong cardaddr
)
811 struct sliccard
*card
= (struct sliccard
*)cardaddr
;
812 struct adapter
*adapter
= card
->master
;
814 u32 load
= card
->events
;
817 if ((adapter
) && (adapter
->state
== ADAPT_UP
) &&
818 (card
->state
== CARD_UP
) && (slic_global
.dynamic_intagg
)) {
819 intagg
= &adapter
->slic_regs
->slic_intagg
;
820 if (adapter
->devid
== SLIC_1GB_DEVICE_ID
) {
821 if (adapter
->linkspeed
== LINK_1000MB
)
824 if (load
> SLIC_LOAD_5
)
825 level
= SLIC_INTAGG_5
;
826 else if (load
> SLIC_LOAD_4
)
827 level
= SLIC_INTAGG_4
;
828 else if (load
> SLIC_LOAD_3
)
829 level
= SLIC_INTAGG_3
;
830 else if (load
> SLIC_LOAD_2
)
831 level
= SLIC_INTAGG_2
;
832 else if (load
> SLIC_LOAD_1
)
833 level
= SLIC_INTAGG_1
;
835 level
= SLIC_INTAGG_0
;
837 if (card
->loadlevel_current
!= level
) {
838 card
->loadlevel_current
= level
;
839 slic_reg32_write(intagg
, level
, FLUSH
);
842 if (load
> SLIC_LOAD_5
)
843 level
= SLIC_INTAGG_5
;
844 else if (load
> SLIC_LOAD_4
)
845 level
= SLIC_INTAGG_4
;
846 else if (load
> SLIC_LOAD_3
)
847 level
= SLIC_INTAGG_3
;
848 else if (load
> SLIC_LOAD_2
)
849 level
= SLIC_INTAGG_2
;
850 else if (load
> SLIC_LOAD_1
)
851 level
= SLIC_INTAGG_1
;
853 level
= SLIC_INTAGG_0
;
854 if (card
->loadlevel_current
!= level
) {
855 card
->loadlevel_current
= level
;
856 slic_reg32_write(intagg
, level
, FLUSH
);
861 card
->loadtimer
.expires
= jiffies
+ (SLIC_LOADTIMER_PERIOD
* HZ
);
862 add_timer(&card
->loadtimer
);
865 static int slic_upr_queue_request(struct adapter
*adapter
,
869 u32 upr_buffer
, u32 upr_buffer_h
)
871 struct slic_upr
*upr
;
872 struct slic_upr
*uprqueue
;
874 upr
= kmalloc(sizeof(*upr
), GFP_ATOMIC
);
878 upr
->adapter
= adapter
->port
;
879 upr
->upr_request
= upr_request
;
880 upr
->upr_data
= upr_data
;
881 upr
->upr_buffer
= upr_buffer
;
882 upr
->upr_data_h
= upr_data_h
;
883 upr
->upr_buffer_h
= upr_buffer_h
;
885 if (adapter
->upr_list
) {
886 uprqueue
= adapter
->upr_list
;
888 while (uprqueue
->next
)
889 uprqueue
= uprqueue
->next
;
890 uprqueue
->next
= upr
;
892 adapter
->upr_list
= upr
;
897 static void slic_upr_start(struct adapter
*adapter
)
899 struct slic_upr
*upr
;
900 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
902 upr
= adapter
->upr_list
;
905 if (adapter
->upr_busy
)
907 adapter
->upr_busy
= 1;
909 switch (upr
->upr_request
) {
911 if (upr
->upr_data_h
== 0) {
912 slic_reg32_write(&slic_regs
->slic_stats
, upr
->upr_data
,
915 slic_reg64_write(adapter
, &slic_regs
->slic_stats64
,
917 &slic_regs
->slic_addr_upper
,
918 upr
->upr_data_h
, FLUSH
);
923 slic_reg64_write(adapter
, &slic_regs
->slic_rlsr
, upr
->upr_data
,
924 &slic_regs
->slic_addr_upper
, upr
->upr_data_h
,
928 case SLIC_UPR_RCONFIG
:
929 slic_reg64_write(adapter
, &slic_regs
->slic_rconfig
,
930 upr
->upr_data
, &slic_regs
->slic_addr_upper
,
931 upr
->upr_data_h
, FLUSH
);
934 slic_reg32_write(&slic_regs
->slic_ping
, 1, FLUSH
);
939 static int slic_upr_request(struct adapter
*adapter
,
943 u32 upr_buffer
, u32 upr_buffer_h
)
948 spin_lock_irqsave(&adapter
->upr_lock
, flags
);
949 rc
= slic_upr_queue_request(adapter
,
952 upr_data_h
, upr_buffer
, upr_buffer_h
);
956 slic_upr_start(adapter
);
958 spin_unlock_irqrestore(&adapter
->upr_lock
, flags
);
962 static void slic_link_upr_complete(struct adapter
*adapter
, u32 isr
)
964 u32 linkstatus
= adapter
->pshmem
->linkstatus
;
966 unsigned char linkspeed
;
967 unsigned char linkduplex
;
969 if ((isr
& ISR_UPCERR
) || (isr
& ISR_UPCBSY
)) {
970 struct slic_shmem
*pshmem
;
972 pshmem
= (struct slic_shmem
*)(unsigned long)
974 #if BITS_PER_LONG == 64
975 slic_upr_queue_request(adapter
,
977 SLIC_GET_ADDR_LOW(&pshmem
->linkstatus
),
978 SLIC_GET_ADDR_HIGH(&pshmem
->linkstatus
),
981 slic_upr_queue_request(adapter
,
983 (u32
)&pshmem
->linkstatus
,
984 SLIC_GET_ADDR_HIGH(pshmem
), 0, 0);
988 if (adapter
->state
!= ADAPT_UP
)
991 linkup
= linkstatus
& GIG_LINKUP
? LINK_UP
: LINK_DOWN
;
992 if (linkstatus
& GIG_SPEED_1000
)
993 linkspeed
= LINK_1000MB
;
994 else if (linkstatus
& GIG_SPEED_100
)
995 linkspeed
= LINK_100MB
;
997 linkspeed
= LINK_10MB
;
999 if (linkstatus
& GIG_FULLDUPLEX
)
1000 linkduplex
= LINK_FULLD
;
1002 linkduplex
= LINK_HALFD
;
1004 if ((adapter
->linkstate
== LINK_DOWN
) && (linkup
== LINK_DOWN
))
1007 /* link up event, but nothing has changed */
1008 if ((adapter
->linkstate
== LINK_UP
) &&
1009 (linkup
== LINK_UP
) &&
1010 (adapter
->linkspeed
== linkspeed
) &&
1011 (adapter
->linkduplex
== linkduplex
))
1014 /* link has changed at this point */
1016 /* link has gone from up to down */
1017 if (linkup
== LINK_DOWN
) {
1018 adapter
->linkstate
= LINK_DOWN
;
1022 /* link has gone from down to up */
1023 adapter
->linkspeed
= linkspeed
;
1024 adapter
->linkduplex
= linkduplex
;
1026 if (adapter
->linkstate
!= LINK_UP
) {
1028 slic_config_set(adapter
, true);
1029 adapter
->linkstate
= LINK_UP
;
1030 netif_start_queue(adapter
->netdev
);
1034 static void slic_upr_request_complete(struct adapter
*adapter
, u32 isr
)
1036 struct sliccard
*card
= adapter
->card
;
1037 struct slic_upr
*upr
;
1038 unsigned long flags
;
1040 spin_lock_irqsave(&adapter
->upr_lock
, flags
);
1041 upr
= adapter
->upr_list
;
1043 spin_unlock_irqrestore(&adapter
->upr_lock
, flags
);
1046 adapter
->upr_list
= upr
->next
;
1048 adapter
->upr_busy
= 0;
1049 switch (upr
->upr_request
) {
1050 case SLIC_UPR_STATS
:
1052 struct slic_stats
*slicstats
=
1053 (struct slic_stats
*)&adapter
->pshmem
->inicstats
;
1054 struct slic_stats
*newstats
= slicstats
;
1055 struct slic_stats
*old
= &adapter
->inicstats_prev
;
1056 struct slicnet_stats
*stst
= &adapter
->slic_stats
;
1058 if (isr
& ISR_UPCERR
) {
1059 dev_err(&adapter
->netdev
->dev
,
1060 "SLIC_UPR_STATS command failed isr[%x]\n",
1065 UPDATE_STATS_GB(stst
->tcp
.xmit_tcp_segs
,
1066 newstats
->xmit_tcp_segs_gb
,
1067 old
->xmit_tcp_segs_gb
);
1069 UPDATE_STATS_GB(stst
->tcp
.xmit_tcp_bytes
,
1070 newstats
->xmit_tcp_bytes_gb
,
1071 old
->xmit_tcp_bytes_gb
);
1073 UPDATE_STATS_GB(stst
->tcp
.rcv_tcp_segs
,
1074 newstats
->rcv_tcp_segs_gb
,
1075 old
->rcv_tcp_segs_gb
);
1077 UPDATE_STATS_GB(stst
->tcp
.rcv_tcp_bytes
,
1078 newstats
->rcv_tcp_bytes_gb
,
1079 old
->rcv_tcp_bytes_gb
);
1081 UPDATE_STATS_GB(stst
->iface
.xmt_bytes
,
1082 newstats
->xmit_bytes_gb
,
1083 old
->xmit_bytes_gb
);
1085 UPDATE_STATS_GB(stst
->iface
.xmt_ucast
,
1086 newstats
->xmit_unicasts_gb
,
1087 old
->xmit_unicasts_gb
);
1089 UPDATE_STATS_GB(stst
->iface
.rcv_bytes
,
1090 newstats
->rcv_bytes_gb
,
1093 UPDATE_STATS_GB(stst
->iface
.rcv_ucast
,
1094 newstats
->rcv_unicasts_gb
,
1095 old
->rcv_unicasts_gb
);
1097 UPDATE_STATS_GB(stst
->iface
.xmt_errors
,
1098 newstats
->xmit_collisions_gb
,
1099 old
->xmit_collisions_gb
);
1101 UPDATE_STATS_GB(stst
->iface
.xmt_errors
,
1102 newstats
->xmit_excess_collisions_gb
,
1103 old
->xmit_excess_collisions_gb
);
1105 UPDATE_STATS_GB(stst
->iface
.xmt_errors
,
1106 newstats
->xmit_other_error_gb
,
1107 old
->xmit_other_error_gb
);
1109 UPDATE_STATS_GB(stst
->iface
.rcv_errors
,
1110 newstats
->rcv_other_error_gb
,
1111 old
->rcv_other_error_gb
);
1113 UPDATE_STATS_GB(stst
->iface
.rcv_discards
,
1114 newstats
->rcv_drops_gb
,
1117 if (newstats
->rcv_drops_gb
> old
->rcv_drops_gb
) {
1118 adapter
->rcv_drops
+=
1119 (newstats
->rcv_drops_gb
-
1122 memcpy(old
, newstats
, sizeof(struct slic_stats
));
1126 slic_link_upr_complete(adapter
, isr
);
1128 case SLIC_UPR_RCONFIG
:
1131 card
->pingstatus
|= (isr
& ISR_PINGDSMASK
);
1135 slic_upr_start(adapter
);
1136 spin_unlock_irqrestore(&adapter
->upr_lock
, flags
);
1139 static int slic_config_get(struct adapter
*adapter
, u32 config
, u32 config_h
)
1141 return slic_upr_request(adapter
, SLIC_UPR_RCONFIG
, config
, config_h
,
1146 * Compute a checksum of the EEPROM according to RFC 1071.
1148 static u16
slic_eeprom_cksum(void *eeprom
, unsigned int len
)
1154 checksum
+= *(wp
++);
1159 checksum
+= *(u8
*)wp
;
1161 while (checksum
>> 16)
1162 checksum
= (checksum
& 0xFFFF) + ((checksum
>> 16) & 0xFFFF);
1167 static void slic_rspqueue_free(struct adapter
*adapter
)
1170 struct slic_rspqueue
*rspq
= &adapter
->rspqueue
;
1172 for (i
= 0; i
< rspq
->num_pages
; i
++) {
1173 if (rspq
->vaddr
[i
]) {
1174 pci_free_consistent(adapter
->pcidev
, PAGE_SIZE
,
1175 rspq
->vaddr
[i
], rspq
->paddr
[i
]);
1177 rspq
->vaddr
[i
] = NULL
;
1181 rspq
->pageindex
= 0;
1182 rspq
->rspbuf
= NULL
;
1185 static int slic_rspqueue_init(struct adapter
*adapter
)
1188 struct slic_rspqueue
*rspq
= &adapter
->rspqueue
;
1189 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
1192 memset(rspq
, 0, sizeof(struct slic_rspqueue
));
1194 rspq
->num_pages
= SLIC_RSPQ_PAGES_GB
;
1196 for (i
= 0; i
< rspq
->num_pages
; i
++) {
1197 rspq
->vaddr
[i
] = pci_zalloc_consistent(adapter
->pcidev
,
1200 if (!rspq
->vaddr
[i
]) {
1201 dev_err(&adapter
->pcidev
->dev
,
1202 "pci_alloc_consistent failed\n");
1203 slic_rspqueue_free(adapter
);
1208 slic_reg32_write(&slic_regs
->slic_rbar
,
1209 (rspq
->paddr
[i
] | SLIC_RSPQ_BUFSINPAGE
),
1212 slic_reg64_write(adapter
, &slic_regs
->slic_rbar64
,
1213 (rspq
->paddr
[i
] | SLIC_RSPQ_BUFSINPAGE
),
1214 &slic_regs
->slic_addr_upper
,
1215 paddrh
, DONT_FLUSH
);
1219 rspq
->pageindex
= 0;
1220 rspq
->rspbuf
= (struct slic_rspbuf
*)rspq
->vaddr
[0];
1224 static struct slic_rspbuf
*slic_rspqueue_getnext(struct adapter
*adapter
)
1226 struct slic_rspqueue
*rspq
= &adapter
->rspqueue
;
1227 struct slic_rspbuf
*buf
;
1229 if (!(rspq
->rspbuf
->status
))
1233 if (++rspq
->offset
< SLIC_RSPQ_BUFSINPAGE
) {
1236 slic_reg64_write(adapter
, &adapter
->slic_regs
->slic_rbar64
,
1237 (rspq
->paddr
[rspq
->pageindex
] | SLIC_RSPQ_BUFSINPAGE
),
1238 &adapter
->slic_regs
->slic_addr_upper
, 0, DONT_FLUSH
);
1239 rspq
->pageindex
= (rspq
->pageindex
+ 1) % rspq
->num_pages
;
1241 rspq
->rspbuf
= (struct slic_rspbuf
*)
1242 rspq
->vaddr
[rspq
->pageindex
];
1248 static void slic_cmdqmem_free(struct adapter
*adapter
)
1250 struct slic_cmdqmem
*cmdqmem
= &adapter
->cmdqmem
;
1253 for (i
= 0; i
< SLIC_CMDQ_MAXPAGES
; i
++) {
1254 if (cmdqmem
->pages
[i
]) {
1255 pci_free_consistent(adapter
->pcidev
,
1257 (void *)cmdqmem
->pages
[i
],
1258 cmdqmem
->dma_pages
[i
]);
1261 memset(cmdqmem
, 0, sizeof(struct slic_cmdqmem
));
1264 static u32
*slic_cmdqmem_addpage(struct adapter
*adapter
)
1266 struct slic_cmdqmem
*cmdqmem
= &adapter
->cmdqmem
;
1269 if (cmdqmem
->pagecnt
>= SLIC_CMDQ_MAXPAGES
)
1271 pageaddr
= pci_alloc_consistent(adapter
->pcidev
,
1273 &cmdqmem
->dma_pages
[cmdqmem
->pagecnt
]);
1277 cmdqmem
->pages
[cmdqmem
->pagecnt
] = pageaddr
;
1282 static void slic_cmdq_free(struct adapter
*adapter
)
1284 struct slic_hostcmd
*cmd
;
1286 cmd
= adapter
->cmdq_all
.head
;
1289 struct sk_buff
*tempskb
;
1294 dev_kfree_skb_irq(tempskb
);
1297 cmd
= cmd
->next_all
;
1299 memset(&adapter
->cmdq_all
, 0, sizeof(struct slic_cmdqueue
));
1300 memset(&adapter
->cmdq_free
, 0, sizeof(struct slic_cmdqueue
));
1301 memset(&adapter
->cmdq_done
, 0, sizeof(struct slic_cmdqueue
));
1302 slic_cmdqmem_free(adapter
);
1305 static void slic_cmdq_addcmdpage(struct adapter
*adapter
, u32
*page
)
1307 struct slic_hostcmd
*cmd
;
1308 struct slic_hostcmd
*prev
;
1309 struct slic_hostcmd
*tail
;
1310 struct slic_cmdqueue
*cmdq
;
1316 struct slic_handle
*pslic_handle
;
1317 unsigned long flags
;
1323 phys_addr
= virt_to_bus((void *)page
);
1324 phys_addrl
= SLIC_GET_ADDR_LOW(phys_addr
);
1325 phys_addrh
= SLIC_GET_ADDR_HIGH(phys_addr
);
1329 while ((cmdcnt
< SLIC_CMDQ_CMDSINPAGE
) &&
1330 (adapter
->slic_handle_ix
< 256)) {
1331 /* Allocate and initialize a SLIC_HANDLE for this command */
1332 spin_lock_irqsave(&adapter
->handle_lock
, flags
);
1333 pslic_handle
= adapter
->pfree_slic_handles
;
1334 adapter
->pfree_slic_handles
= pslic_handle
->next
;
1335 spin_unlock_irqrestore(&adapter
->handle_lock
, flags
);
1336 pslic_handle
->type
= SLIC_HANDLE_CMD
;
1337 pslic_handle
->address
= (void *)cmd
;
1338 pslic_handle
->offset
= (ushort
)adapter
->slic_handle_ix
++;
1339 pslic_handle
->other_handle
= NULL
;
1340 pslic_handle
->next
= NULL
;
1342 cmd
->pslic_handle
= pslic_handle
;
1343 cmd
->cmd64
.hosthandle
= pslic_handle
->token
.handle_token
;
1345 cmd
->paddrl
= phys_addrl
;
1346 cmd
->paddrh
= phys_addrh
;
1347 cmd
->next_all
= prev
;
1350 phys_addrl
+= SLIC_HOSTCMD_SIZE
;
1351 cmdaddr
+= SLIC_HOSTCMD_SIZE
;
1357 cmdq
= &adapter
->cmdq_all
;
1358 cmdq
->count
+= cmdcnt
; /* SLIC_CMDQ_CMDSINPAGE; mooktodo */
1359 tail
->next_all
= cmdq
->head
;
1361 cmdq
= &adapter
->cmdq_free
;
1362 spin_lock_irqsave(&cmdq
->lock
, flags
);
1363 cmdq
->count
+= cmdcnt
; /* SLIC_CMDQ_CMDSINPAGE; mooktodo */
1364 tail
->next
= cmdq
->head
;
1366 spin_unlock_irqrestore(&cmdq
->lock
, flags
);
1369 static int slic_cmdq_init(struct adapter
*adapter
)
1374 memset(&adapter
->cmdq_all
, 0, sizeof(struct slic_cmdqueue
));
1375 memset(&adapter
->cmdq_free
, 0, sizeof(struct slic_cmdqueue
));
1376 memset(&adapter
->cmdq_done
, 0, sizeof(struct slic_cmdqueue
));
1377 spin_lock_init(&adapter
->cmdq_all
.lock
);
1378 spin_lock_init(&adapter
->cmdq_free
.lock
);
1379 spin_lock_init(&adapter
->cmdq_done
.lock
);
1380 memset(&adapter
->cmdqmem
, 0, sizeof(struct slic_cmdqmem
));
1381 adapter
->slic_handle_ix
= 1;
1382 for (i
= 0; i
< SLIC_CMDQ_INITPAGES
; i
++) {
1383 pageaddr
= slic_cmdqmem_addpage(adapter
);
1385 slic_cmdq_free(adapter
);
1388 slic_cmdq_addcmdpage(adapter
, pageaddr
);
1390 adapter
->slic_handle_ix
= 1;
1395 static void slic_cmdq_reset(struct adapter
*adapter
)
1397 struct slic_hostcmd
*hcmd
;
1398 struct sk_buff
*skb
;
1400 unsigned long flags
;
1402 spin_lock_irqsave(&adapter
->cmdq_free
.lock
, flags
);
1403 spin_lock(&adapter
->cmdq_done
.lock
);
1404 outstanding
= adapter
->cmdq_all
.count
- adapter
->cmdq_done
.count
;
1405 outstanding
-= adapter
->cmdq_free
.count
;
1406 hcmd
= adapter
->cmdq_all
.head
;
1412 dev_kfree_skb_irq(skb
);
1414 hcmd
= hcmd
->next_all
;
1416 adapter
->cmdq_free
.count
= 0;
1417 adapter
->cmdq_free
.head
= NULL
;
1418 adapter
->cmdq_free
.tail
= NULL
;
1419 adapter
->cmdq_done
.count
= 0;
1420 adapter
->cmdq_done
.head
= NULL
;
1421 adapter
->cmdq_done
.tail
= NULL
;
1422 adapter
->cmdq_free
.head
= adapter
->cmdq_all
.head
;
1423 hcmd
= adapter
->cmdq_all
.head
;
1425 adapter
->cmdq_free
.count
++;
1426 hcmd
->next
= hcmd
->next_all
;
1427 hcmd
= hcmd
->next_all
;
1429 if (adapter
->cmdq_free
.count
!= adapter
->cmdq_all
.count
) {
1430 dev_err(&adapter
->netdev
->dev
,
1431 "free_count %d != all count %d\n",
1432 adapter
->cmdq_free
.count
, adapter
->cmdq_all
.count
);
1434 spin_unlock(&adapter
->cmdq_done
.lock
);
1435 spin_unlock_irqrestore(&adapter
->cmdq_free
.lock
, flags
);
1438 static void slic_cmdq_getdone(struct adapter
*adapter
)
1440 struct slic_cmdqueue
*done_cmdq
= &adapter
->cmdq_done
;
1441 struct slic_cmdqueue
*free_cmdq
= &adapter
->cmdq_free
;
1442 unsigned long flags
;
1444 spin_lock_irqsave(&done_cmdq
->lock
, flags
);
1446 free_cmdq
->head
= done_cmdq
->head
;
1447 free_cmdq
->count
= done_cmdq
->count
;
1448 done_cmdq
->head
= NULL
;
1449 done_cmdq
->tail
= NULL
;
1450 done_cmdq
->count
= 0;
1451 spin_unlock_irqrestore(&done_cmdq
->lock
, flags
);
1454 static struct slic_hostcmd
*slic_cmdq_getfree(struct adapter
*adapter
)
1456 struct slic_cmdqueue
*cmdq
= &adapter
->cmdq_free
;
1457 struct slic_hostcmd
*cmd
= NULL
;
1458 unsigned long flags
;
1461 spin_lock_irqsave(&cmdq
->lock
, flags
);
1465 cmdq
->head
= cmd
->next
;
1467 spin_unlock_irqrestore(&cmdq
->lock
, flags
);
1469 slic_cmdq_getdone(adapter
);
1476 spin_unlock_irqrestore(&cmdq
->lock
, flags
);
1477 pageaddr
= slic_cmdqmem_addpage(adapter
);
1479 slic_cmdq_addcmdpage(adapter
, pageaddr
);
1480 goto lock_and_retry
;
1487 static void slic_cmdq_putdone_irq(struct adapter
*adapter
,
1488 struct slic_hostcmd
*cmd
)
1490 struct slic_cmdqueue
*cmdq
= &adapter
->cmdq_done
;
1492 spin_lock(&cmdq
->lock
);
1494 cmd
->next
= cmdq
->head
;
1497 if ((adapter
->xmitq_full
) && (cmdq
->count
> 10))
1498 netif_wake_queue(adapter
->netdev
);
1499 spin_unlock(&cmdq
->lock
);
1502 static int slic_rcvqueue_fill(struct adapter
*adapter
)
1507 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1509 struct device
*dev
= &adapter
->netdev
->dev
;
1511 while (i
< SLIC_RCVQ_FILLENTRIES
) {
1512 struct slic_rcvbuf
*rcvbuf
;
1513 struct sk_buff
*skb
;
1514 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1517 skb
= alloc_skb(SLIC_RCVQ_RCVBUFSIZE
, GFP_ATOMIC
);
1519 paddr
= (void *)(unsigned long)
1520 pci_map_single(adapter
->pcidev
,
1522 SLIC_RCVQ_RCVBUFSIZE
,
1523 PCI_DMA_FROMDEVICE
);
1524 paddrl
= SLIC_GET_ADDR_LOW(paddr
);
1525 paddrh
= SLIC_GET_ADDR_HIGH(paddr
);
1527 skb
->len
= SLIC_RCVBUF_HEADSIZE
;
1528 rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
1531 #ifdef KLUDGE_FOR_4GB_BOUNDARY
1533 dev_err(dev
, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1535 dev_err(dev
, "skb[%p] PROBLEM\n", skb
);
1536 dev_err(dev
, " skbdata[%p]\n",
1538 dev_err(dev
, " skblen[%x]\n", skb
->len
);
1539 dev_err(dev
, " paddr[%p]\n", paddr
);
1540 dev_err(dev
, " paddrl[%x]\n", paddrl
);
1541 dev_err(dev
, " paddrh[%x]\n", paddrh
);
1542 dev_err(dev
, " rcvq->head[%p]\n",
1544 dev_err(dev
, " rcvq->tail[%p]\n",
1546 dev_err(dev
, " rcvq->count[%x]\n",
1548 dev_err(dev
, "SKIP THIS SKB!!!!!!!!\n");
1549 goto retry_rcvqfill
;
1553 dev_err(dev
, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1555 dev_err(dev
, "skb[%p] PROBLEM\n", skb
);
1556 dev_err(dev
, " skbdata[%p]\n",
1558 dev_err(dev
, " skblen[%x]\n", skb
->len
);
1559 dev_err(dev
, " paddr[%p]\n", paddr
);
1560 dev_err(dev
, " paddrl[%x]\n", paddrl
);
1561 dev_err(dev
, " paddrh[%x]\n", paddrh
);
1562 dev_err(dev
, " rcvq->head[%p]\n",
1564 dev_err(dev
, " rcvq->tail[%p]\n",
1566 dev_err(dev
, " rcvq->count[%x]\n",
1568 dev_err(dev
, "GIVE TO CARD ANYWAY\n");
1572 slic_reg32_write(&adapter
->slic_regs
->slic_hbar
,
1573 (u32
)paddrl
, DONT_FLUSH
);
1575 slic_reg64_write(adapter
,
1576 &adapter
->slic_regs
->slic_hbar64
,
1578 &adapter
->slic_regs
->slic_addr_upper
,
1579 paddrh
, DONT_FLUSH
);
1582 rcvq
->tail
->next
= skb
;
1589 dev_err(&adapter
->netdev
->dev
,
1590 "slic_rcvqueue_fill could only get [%d] skbuffs\n",
1598 static void slic_rcvqueue_free(struct adapter
*adapter
)
1600 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1601 struct sk_buff
*skb
;
1603 while (rcvq
->head
) {
1605 rcvq
->head
= rcvq
->head
->next
;
1613 static int slic_rcvqueue_init(struct adapter
*adapter
)
1616 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1620 rcvq
->size
= SLIC_RCVQ_ENTRIES
;
1623 i
= SLIC_RCVQ_ENTRIES
/ SLIC_RCVQ_FILLENTRIES
;
1626 count
+= slic_rcvqueue_fill(adapter
);
1629 if (rcvq
->count
< SLIC_RCVQ_MINENTRIES
) {
1630 slic_rcvqueue_free(adapter
);
1636 static struct sk_buff
*slic_rcvqueue_getnext(struct adapter
*adapter
)
1638 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1639 struct sk_buff
*skb
;
1640 struct slic_rcvbuf
*rcvbuf
;
1645 rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
1647 if (rcvbuf
->status
& IRHDDR_SVALID
) {
1648 rcvq
->head
= rcvq
->head
->next
;
1655 dev_err(&adapter
->netdev
->dev
,
1656 "RcvQ Empty!! rcvq[%p] count[%x]\n", rcvq
, rcvq
->count
);
1659 while (rcvq
->count
< SLIC_RCVQ_FILLTHRESH
) {
1660 count
= slic_rcvqueue_fill(adapter
);
1669 static u32
slic_rcvqueue_reinsert(struct adapter
*adapter
, struct sk_buff
*skb
)
1671 struct slic_rcvqueue
*rcvq
= &adapter
->rcvqueue
;
1675 struct slic_rcvbuf
*rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
1678 paddr
= (void *)(unsigned long)
1679 pci_map_single(adapter
->pcidev
, skb
->head
,
1680 SLIC_RCVQ_RCVBUFSIZE
, PCI_DMA_FROMDEVICE
);
1684 paddrl
= SLIC_GET_ADDR_LOW(paddr
);
1685 paddrh
= SLIC_GET_ADDR_HIGH(paddr
);
1688 dev
= &adapter
->netdev
->dev
;
1689 dev_err(dev
, "%s: LOW 32bits PHYSICAL ADDRESS == 0\n",
1691 dev_err(dev
, "skb[%p] PROBLEM\n", skb
);
1692 dev_err(dev
, " skbdata[%p]\n", skb
->data
);
1693 dev_err(dev
, " skblen[%x]\n", skb
->len
);
1694 dev_err(dev
, " paddr[%p]\n", paddr
);
1695 dev_err(dev
, " paddrl[%x]\n", paddrl
);
1696 dev_err(dev
, " paddrh[%x]\n", paddrh
);
1697 dev_err(dev
, " rcvq->head[%p]\n", rcvq
->head
);
1698 dev_err(dev
, " rcvq->tail[%p]\n", rcvq
->tail
);
1699 dev_err(dev
, " rcvq->count[%x]\n", rcvq
->count
);
1702 slic_reg32_write(&adapter
->slic_regs
->slic_hbar
, (u32
)paddrl
,
1705 slic_reg64_write(adapter
, &adapter
->slic_regs
->slic_hbar64
,
1706 paddrl
, &adapter
->slic_regs
->slic_addr_upper
,
1707 paddrh
, DONT_FLUSH
);
1710 rcvq
->tail
->next
= skb
;
1719 * slic_link_event_handler -
1721 * Initiate a link configuration sequence. The link configuration begins
1722 * by issuing a READ_LINK_STATUS command to the Utility Processor on the
1723 * SLIC. Since the command finishes asynchronously, the slic_upr_comlete
1724 * routine will follow it up witha UP configuration write command, which
1725 * will also complete asynchronously.
1728 static int slic_link_event_handler(struct adapter
*adapter
)
1731 struct slic_shmem
*pshmem
;
1733 if (adapter
->state
!= ADAPT_UP
) {
1734 /* Adapter is not operational. Ignore. */
1738 pshmem
= (struct slic_shmem
*)(unsigned long)adapter
->phys_shmem
;
1740 #if BITS_PER_LONG == 64
1741 status
= slic_upr_request(adapter
,
1743 SLIC_GET_ADDR_LOW(&pshmem
->linkstatus
),
1744 SLIC_GET_ADDR_HIGH(&pshmem
->linkstatus
),
1747 status
= slic_upr_request(adapter
, SLIC_UPR_RLSR
,
1748 (u32
)&pshmem
->linkstatus
, /* no 4GB wrap guaranteed */
1754 static void slic_init_cleanup(struct adapter
*adapter
)
1756 if (adapter
->intrregistered
) {
1757 adapter
->intrregistered
= 0;
1758 free_irq(adapter
->netdev
->irq
, adapter
->netdev
);
1760 if (adapter
->pshmem
) {
1761 pci_free_consistent(adapter
->pcidev
,
1762 sizeof(struct slic_shmem
),
1763 adapter
->pshmem
, adapter
->phys_shmem
);
1764 adapter
->pshmem
= NULL
;
1765 adapter
->phys_shmem
= (dma_addr_t
)(unsigned long)NULL
;
1768 if (adapter
->pingtimerset
) {
1769 adapter
->pingtimerset
= 0;
1770 del_timer(&adapter
->pingtimer
);
1773 slic_rspqueue_free(adapter
);
1774 slic_cmdq_free(adapter
);
1775 slic_rcvqueue_free(adapter
);
1779 * Allocate a mcast_address structure to hold the multicast address.
1782 static int slic_mcast_add_list(struct adapter
*adapter
, char *address
)
1784 struct mcast_address
*mcaddr
, *mlist
;
1786 /* Check to see if it already exists */
1787 mlist
= adapter
->mcastaddrs
;
1789 if (ether_addr_equal(mlist
->address
, address
))
1791 mlist
= mlist
->next
;
1794 /* Doesn't already exist. Allocate a structure to hold it */
1795 mcaddr
= kmalloc(sizeof(*mcaddr
), GFP_ATOMIC
);
1799 ether_addr_copy(mcaddr
->address
, address
);
1801 mcaddr
->next
= adapter
->mcastaddrs
;
1802 adapter
->mcastaddrs
= mcaddr
;
1807 static void slic_mcast_set_list(struct net_device
*dev
)
1809 struct adapter
*adapter
= netdev_priv(dev
);
1812 struct netdev_hw_addr
*ha
;
1814 netdev_for_each_mc_addr(ha
, dev
) {
1815 addresses
= (char *)&ha
->addr
;
1816 status
= slic_mcast_add_list(adapter
, addresses
);
1819 slic_mcast_set_bit(adapter
, addresses
);
1822 if (adapter
->devflags_prev
!= dev
->flags
) {
1823 adapter
->macopts
= MAC_DIRECTED
;
1825 if (dev
->flags
& IFF_BROADCAST
)
1826 adapter
->macopts
|= MAC_BCAST
;
1827 if (dev
->flags
& IFF_PROMISC
)
1828 adapter
->macopts
|= MAC_PROMISC
;
1829 if (dev
->flags
& IFF_ALLMULTI
)
1830 adapter
->macopts
|= MAC_ALLMCAST
;
1831 if (dev
->flags
& IFF_MULTICAST
)
1832 adapter
->macopts
|= MAC_MCAST
;
1834 adapter
->devflags_prev
= dev
->flags
;
1835 slic_config_set(adapter
, true);
1838 slic_mcast_set_mask(adapter
);
1842 #define XMIT_FAIL_LINK_STATE 1
1843 #define XMIT_FAIL_ZERO_LENGTH 2
1844 #define XMIT_FAIL_HOSTCMD_FAIL 3
1846 static void slic_xmit_build_request(struct adapter
*adapter
,
1847 struct slic_hostcmd
*hcmd
, struct sk_buff
*skb
)
1849 struct slic_host64_cmd
*ihcmd
;
1852 ihcmd
= &hcmd
->cmd64
;
1854 ihcmd
->flags
= adapter
->port
<< IHFLG_IFSHFT
;
1855 ihcmd
->command
= IHCMD_XMT_REQ
;
1856 ihcmd
->u
.slic_buffers
.totlen
= skb
->len
;
1857 phys_addr
= pci_map_single(adapter
->pcidev
, skb
->data
, skb
->len
,
1859 if (pci_dma_mapping_error(adapter
->pcidev
, phys_addr
)) {
1861 dev_err(&adapter
->pcidev
->dev
, "DMA mapping error\n");
1864 ihcmd
->u
.slic_buffers
.bufs
[0].paddrl
= SLIC_GET_ADDR_LOW(phys_addr
);
1865 ihcmd
->u
.slic_buffers
.bufs
[0].paddrh
= SLIC_GET_ADDR_HIGH(phys_addr
);
1866 ihcmd
->u
.slic_buffers
.bufs
[0].length
= skb
->len
;
1867 #if BITS_PER_LONG == 64
1868 hcmd
->cmdsize
= (u32
)((((u64
)&ihcmd
->u
.slic_buffers
.bufs
[1] -
1869 (u64
)hcmd
) + 31) >> 5);
1871 hcmd
->cmdsize
= (((u32
)&ihcmd
->u
.slic_buffers
.bufs
[1] -
1872 (u32
)hcmd
) + 31) >> 5;
1876 static void slic_xmit_fail(struct adapter
*adapter
,
1877 struct sk_buff
*skb
,
1878 void *cmd
, u32 skbtype
, u32 status
)
1880 if (adapter
->xmitq_full
)
1881 netif_stop_queue(adapter
->netdev
);
1882 if ((!cmd
) && (status
<= XMIT_FAIL_HOSTCMD_FAIL
)) {
1884 case XMIT_FAIL_LINK_STATE
:
1885 dev_err(&adapter
->netdev
->dev
,
1886 "reject xmit skb[%p: %x] linkstate[%s] adapter[%s:%d] card[%s:%d]\n",
1888 SLIC_LINKSTATE(adapter
->linkstate
),
1889 SLIC_ADAPTER_STATE(adapter
->state
),
1891 SLIC_CARD_STATE(adapter
->card
->state
),
1892 adapter
->card
->state
);
1894 case XMIT_FAIL_ZERO_LENGTH
:
1895 dev_err(&adapter
->netdev
->dev
,
1896 "xmit_start skb->len == 0 skb[%p] type[%x]\n",
1897 skb
, skb
->pkt_type
);
1899 case XMIT_FAIL_HOSTCMD_FAIL
:
1900 dev_err(&adapter
->netdev
->dev
,
1901 "xmit_start skb[%p] type[%x] No host commands available\n",
1902 skb
, skb
->pkt_type
);
1907 adapter
->netdev
->stats
.tx_dropped
++;
1910 static void slic_rcv_handle_error(struct adapter
*adapter
,
1911 struct slic_rcvbuf
*rcvbuf
)
1913 struct slic_hddr_wds
*hdr
= (struct slic_hddr_wds
*)rcvbuf
->data
;
1914 struct net_device
*netdev
= adapter
->netdev
;
1916 if (adapter
->devid
!= SLIC_1GB_DEVICE_ID
) {
1917 if (hdr
->frame_status14
& VRHSTAT_802OE
)
1918 adapter
->if_events
.oflow802
++;
1919 if (hdr
->frame_status14
& VRHSTAT_TPOFLO
)
1920 adapter
->if_events
.Tprtoflow
++;
1921 if (hdr
->frame_status_b14
& VRHSTATB_802UE
)
1922 adapter
->if_events
.uflow802
++;
1923 if (hdr
->frame_status_b14
& VRHSTATB_RCVE
) {
1924 adapter
->if_events
.rcvearly
++;
1925 netdev
->stats
.rx_fifo_errors
++;
1927 if (hdr
->frame_status_b14
& VRHSTATB_BUFF
) {
1928 adapter
->if_events
.Bufov
++;
1929 netdev
->stats
.rx_over_errors
++;
1931 if (hdr
->frame_status_b14
& VRHSTATB_CARRE
) {
1932 adapter
->if_events
.Carre
++;
1933 netdev
->stats
.tx_carrier_errors
++;
1935 if (hdr
->frame_status_b14
& VRHSTATB_LONGE
)
1936 adapter
->if_events
.Longe
++;
1937 if (hdr
->frame_status_b14
& VRHSTATB_PREA
)
1938 adapter
->if_events
.Invp
++;
1939 if (hdr
->frame_status_b14
& VRHSTATB_CRC
) {
1940 adapter
->if_events
.Crc
++;
1941 netdev
->stats
.rx_crc_errors
++;
1943 if (hdr
->frame_status_b14
& VRHSTATB_DRBL
)
1944 adapter
->if_events
.Drbl
++;
1945 if (hdr
->frame_status_b14
& VRHSTATB_CODE
)
1946 adapter
->if_events
.Code
++;
1947 if (hdr
->frame_status_b14
& VRHSTATB_TPCSUM
)
1948 adapter
->if_events
.TpCsum
++;
1949 if (hdr
->frame_status_b14
& VRHSTATB_TPHLEN
)
1950 adapter
->if_events
.TpHlen
++;
1951 if (hdr
->frame_status_b14
& VRHSTATB_IPCSUM
)
1952 adapter
->if_events
.IpCsum
++;
1953 if (hdr
->frame_status_b14
& VRHSTATB_IPLERR
)
1954 adapter
->if_events
.IpLen
++;
1955 if (hdr
->frame_status_b14
& VRHSTATB_IPHERR
)
1956 adapter
->if_events
.IpHlen
++;
1958 if (hdr
->frame_statusGB
& VGBSTAT_XPERR
) {
1959 u32 xerr
= hdr
->frame_statusGB
>> VGBSTAT_XERRSHFT
;
1961 if (xerr
== VGBSTAT_XCSERR
)
1962 adapter
->if_events
.TpCsum
++;
1963 if (xerr
== VGBSTAT_XUFLOW
)
1964 adapter
->if_events
.Tprtoflow
++;
1965 if (xerr
== VGBSTAT_XHLEN
)
1966 adapter
->if_events
.TpHlen
++;
1968 if (hdr
->frame_statusGB
& VGBSTAT_NETERR
) {
1971 frame_statusGB
>> VGBSTAT_NERRSHFT
) &
1973 if (nerr
== VGBSTAT_NCSERR
)
1974 adapter
->if_events
.IpCsum
++;
1975 if (nerr
== VGBSTAT_NUFLOW
)
1976 adapter
->if_events
.IpLen
++;
1977 if (nerr
== VGBSTAT_NHLEN
)
1978 adapter
->if_events
.IpHlen
++;
1980 if (hdr
->frame_statusGB
& VGBSTAT_LNKERR
) {
1981 u32 lerr
= hdr
->frame_statusGB
& VGBSTAT_LERRMSK
;
1983 if (lerr
== VGBSTAT_LDEARLY
)
1984 adapter
->if_events
.rcvearly
++;
1985 if (lerr
== VGBSTAT_LBOFLO
)
1986 adapter
->if_events
.Bufov
++;
1987 if (lerr
== VGBSTAT_LCODERR
)
1988 adapter
->if_events
.Code
++;
1989 if (lerr
== VGBSTAT_LDBLNBL
)
1990 adapter
->if_events
.Drbl
++;
1991 if (lerr
== VGBSTAT_LCRCERR
)
1992 adapter
->if_events
.Crc
++;
1993 if (lerr
== VGBSTAT_LOFLO
)
1994 adapter
->if_events
.oflow802
++;
1995 if (lerr
== VGBSTAT_LUFLO
)
1996 adapter
->if_events
.uflow802
++;
2001 #define TCP_OFFLOAD_FRAME_PUSHFLAG 0x10000000
2002 #define M_FAST_PATH 0x0040
2004 static void slic_rcv_handler(struct adapter
*adapter
)
2006 struct net_device
*netdev
= adapter
->netdev
;
2007 struct sk_buff
*skb
;
2008 struct slic_rcvbuf
*rcvbuf
;
2011 while ((skb
= slic_rcvqueue_getnext(adapter
))) {
2014 rcvbuf
= (struct slic_rcvbuf
*)skb
->head
;
2015 adapter
->card
->events
++;
2016 if (rcvbuf
->status
& IRHDDR_ERR
) {
2017 adapter
->rx_errors
++;
2018 slic_rcv_handle_error(adapter
, rcvbuf
);
2019 slic_rcvqueue_reinsert(adapter
, skb
);
2023 if (!slic_mac_filter(adapter
, (struct ether_header
*)
2025 slic_rcvqueue_reinsert(adapter
, skb
);
2028 skb_pull(skb
, SLIC_RCVBUF_HEADSIZE
);
2029 rx_bytes
= (rcvbuf
->length
& IRHDDR_FLEN_MSK
);
2030 skb_put(skb
, rx_bytes
);
2031 netdev
->stats
.rx_packets
++;
2032 netdev
->stats
.rx_bytes
+= rx_bytes
;
2033 #if SLIC_OFFLOAD_IP_CHECKSUM
2034 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
2037 skb
->dev
= adapter
->netdev
;
2038 skb
->protocol
= eth_type_trans(skb
, skb
->dev
);
2042 #if SLIC_INTERRUPT_PROCESS_LIMIT
2043 if (frames
>= SLIC_RCVQ_MAX_PROCESS_ISR
) {
2044 adapter
->rcv_interrupt_yields
++;
2049 adapter
->max_isr_rcvs
= max(adapter
->max_isr_rcvs
, frames
);
2052 static void slic_xmit_complete(struct adapter
*adapter
)
2054 struct slic_hostcmd
*hcmd
;
2055 struct slic_rspbuf
*rspbuf
;
2057 struct slic_handle_word slic_handle_word
;
2060 rspbuf
= slic_rspqueue_getnext(adapter
);
2063 adapter
->xmit_completes
++;
2064 adapter
->card
->events
++;
2066 * Get the complete host command buffer
2068 slic_handle_word
.handle_token
= rspbuf
->hosthandle
;
2070 adapter
->slic_handles
[slic_handle_word
.handle_index
].
2072 /* hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */
2073 if (hcmd
->type
== SLIC_CMD_DUMB
) {
2075 dev_kfree_skb_irq(hcmd
->skb
);
2076 slic_cmdq_putdone_irq(adapter
, hcmd
);
2079 rspbuf
->hosthandle
= 0;
2082 adapter
->max_isr_xmits
= max(adapter
->max_isr_xmits
, frames
);
2085 static void slic_interrupt_card_up(u32 isr
, struct adapter
*adapter
,
2086 struct net_device
*dev
)
2088 if (isr
& ~ISR_IO
) {
2089 if (isr
& ISR_ERR
) {
2090 adapter
->error_interrupts
++;
2091 if (isr
& ISR_RMISS
) {
2096 struct slic_rcvqueue
*rcvq
=
2099 adapter
->error_rmiss_interrupts
++;
2102 rcv_count
= rcvq
->count
;
2103 pre_count
= rcvq
->count
;
2104 errors
= rcvq
->errors
;
2106 while (rcvq
->count
< SLIC_RCVQ_FILLTHRESH
) {
2107 count
= slic_rcvqueue_fill(adapter
);
2111 } else if (isr
& ISR_XDROP
) {
2113 "isr & ISR_ERR [%x] ISR_XDROP\n",
2117 "isr & ISR_ERR [%x]\n",
2122 if (isr
& ISR_LEVENT
) {
2123 adapter
->linkevent_interrupts
++;
2124 if (slic_link_event_handler(adapter
))
2125 adapter
->linkevent_interrupts
--;
2128 if ((isr
& ISR_UPC
) || (isr
& ISR_UPCERR
) ||
2129 (isr
& ISR_UPCBSY
)) {
2130 adapter
->upr_interrupts
++;
2131 slic_upr_request_complete(adapter
, isr
);
2135 if (isr
& ISR_RCV
) {
2136 adapter
->rcv_interrupts
++;
2137 slic_rcv_handler(adapter
);
2140 if (isr
& ISR_CMD
) {
2141 adapter
->xmit_interrupts
++;
2142 slic_xmit_complete(adapter
);
2146 static irqreturn_t
slic_interrupt(int irq
, void *dev_id
)
2148 struct net_device
*dev
= dev_id
;
2149 struct adapter
*adapter
= netdev_priv(dev
);
2152 if ((adapter
->pshmem
) && (adapter
->pshmem
->isr
)) {
2153 slic_reg32_write(&adapter
->slic_regs
->slic_icr
,
2154 ICR_INT_MASK
, FLUSH
);
2155 isr
= adapter
->isrcopy
= adapter
->pshmem
->isr
;
2156 adapter
->pshmem
->isr
= 0;
2157 adapter
->num_isrs
++;
2158 switch (adapter
->card
->state
) {
2160 slic_interrupt_card_up(isr
, adapter
, dev
);
2164 if ((isr
& ISR_UPC
) ||
2165 (isr
& ISR_UPCERR
) || (isr
& ISR_UPCBSY
)) {
2166 adapter
->upr_interrupts
++;
2167 slic_upr_request_complete(adapter
, isr
);
2172 adapter
->isrcopy
= 0;
2173 adapter
->all_reg_writes
+= 2;
2174 adapter
->isr_reg_writes
++;
2175 slic_reg32_write(&adapter
->slic_regs
->slic_isr
, 0, FLUSH
);
2177 adapter
->false_interrupts
++;
2182 #define NORMAL_ETHFRAME 0
2184 static netdev_tx_t
slic_xmit_start(struct sk_buff
*skb
, struct net_device
*dev
)
2186 struct sliccard
*card
;
2187 struct adapter
*adapter
= netdev_priv(dev
);
2188 struct slic_hostcmd
*hcmd
= NULL
;
2190 void *offloadcmd
= NULL
;
2192 card
= adapter
->card
;
2193 if ((adapter
->linkstate
!= LINK_UP
) ||
2194 (adapter
->state
!= ADAPT_UP
) || (card
->state
!= CARD_UP
)) {
2195 status
= XMIT_FAIL_LINK_STATE
;
2198 } else if (skb
->len
== 0) {
2199 status
= XMIT_FAIL_ZERO_LENGTH
;
2203 hcmd
= slic_cmdq_getfree(adapter
);
2205 adapter
->xmitq_full
= 1;
2206 status
= XMIT_FAIL_HOSTCMD_FAIL
;
2211 hcmd
->type
= SLIC_CMD_DUMB
;
2212 slic_xmit_build_request(adapter
, hcmd
, skb
);
2213 dev
->stats
.tx_packets
++;
2214 dev
->stats
.tx_bytes
+= skb
->len
;
2217 if (adapter
->kill_card
) {
2218 struct slic_host64_cmd ihcmd
;
2220 ihcmd
= &hcmd
->cmd64
;
2222 ihcmd
->flags
|= 0x40;
2223 adapter
->kill_card
= 0; /* only do this once */
2226 if (hcmd
->paddrh
== 0) {
2227 slic_reg32_write(&adapter
->slic_regs
->slic_cbar
,
2228 (hcmd
->paddrl
| hcmd
->cmdsize
), DONT_FLUSH
);
2230 slic_reg64_write(adapter
, &adapter
->slic_regs
->slic_cbar64
,
2231 (hcmd
->paddrl
| hcmd
->cmdsize
),
2232 &adapter
->slic_regs
->slic_addr_upper
,
2233 hcmd
->paddrh
, DONT_FLUSH
);
2236 return NETDEV_TX_OK
;
2238 slic_xmit_fail(adapter
, skb
, offloadcmd
, NORMAL_ETHFRAME
, status
);
2242 static void slic_adapter_freeresources(struct adapter
*adapter
)
2244 slic_init_cleanup(adapter
);
2245 adapter
->error_interrupts
= 0;
2246 adapter
->rcv_interrupts
= 0;
2247 adapter
->xmit_interrupts
= 0;
2248 adapter
->linkevent_interrupts
= 0;
2249 adapter
->upr_interrupts
= 0;
2250 adapter
->num_isrs
= 0;
2251 adapter
->xmit_completes
= 0;
2252 adapter
->rcv_broadcasts
= 0;
2253 adapter
->rcv_multicasts
= 0;
2254 adapter
->rcv_unicasts
= 0;
2257 static int slic_adapter_allocresources(struct adapter
*adapter
,
2258 unsigned long *flags
)
2260 if (!adapter
->intrregistered
) {
2263 spin_unlock_irqrestore(&slic_global
.driver_lock
, *flags
);
2265 retval
= request_irq(adapter
->netdev
->irq
,
2268 adapter
->netdev
->name
, adapter
->netdev
);
2270 spin_lock_irqsave(&slic_global
.driver_lock
, *flags
);
2273 dev_err(&adapter
->netdev
->dev
,
2274 "request_irq (%s) FAILED [%x]\n",
2275 adapter
->netdev
->name
, retval
);
2278 adapter
->intrregistered
= 1;
2286 * Perform initialization of our slic interface.
2289 static int slic_if_init(struct adapter
*adapter
, unsigned long *flags
)
2291 struct sliccard
*card
= adapter
->card
;
2292 struct net_device
*dev
= adapter
->netdev
;
2293 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
2294 struct slic_shmem
*pshmem
;
2297 /* adapter should be down at this point */
2298 if (adapter
->state
!= ADAPT_DOWN
) {
2299 dev_err(&dev
->dev
, "%s: adapter->state != ADAPT_DOWN\n",
2305 adapter
->devflags_prev
= dev
->flags
;
2306 adapter
->macopts
= MAC_DIRECTED
;
2308 if (dev
->flags
& IFF_BROADCAST
)
2309 adapter
->macopts
|= MAC_BCAST
;
2310 if (dev
->flags
& IFF_PROMISC
)
2311 adapter
->macopts
|= MAC_PROMISC
;
2312 if (dev
->flags
& IFF_ALLMULTI
)
2313 adapter
->macopts
|= MAC_ALLMCAST
;
2314 if (dev
->flags
& IFF_MULTICAST
)
2315 adapter
->macopts
|= MAC_MCAST
;
2317 rc
= slic_adapter_allocresources(adapter
, flags
);
2319 dev_err(&dev
->dev
, "slic_adapter_allocresources FAILED %x\n",
2321 slic_adapter_freeresources(adapter
);
2325 if (!adapter
->queues_initialized
) {
2326 rc
= slic_rspqueue_init(adapter
);
2329 rc
= slic_cmdq_init(adapter
);
2332 rc
= slic_rcvqueue_init(adapter
);
2335 adapter
->queues_initialized
= 1;
2338 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_OFF
, FLUSH
);
2341 if (!adapter
->isp_initialized
) {
2342 unsigned long flags
;
2344 pshmem
= (struct slic_shmem
*)(unsigned long)
2345 adapter
->phys_shmem
;
2347 spin_lock_irqsave(&adapter
->bit64reglock
, flags
);
2349 #if BITS_PER_LONG == 64
2350 slic_reg32_write(&slic_regs
->slic_addr_upper
,
2351 SLIC_GET_ADDR_HIGH(&pshmem
->isr
), DONT_FLUSH
);
2352 slic_reg32_write(&slic_regs
->slic_isp
,
2353 SLIC_GET_ADDR_LOW(&pshmem
->isr
), FLUSH
);
2355 slic_reg32_write(&slic_regs
->slic_addr_upper
, 0, DONT_FLUSH
);
2356 slic_reg32_write(&slic_regs
->slic_isp
, (u32
)&pshmem
->isr
,
2359 spin_unlock_irqrestore(&adapter
->bit64reglock
, flags
);
2360 adapter
->isp_initialized
= 1;
2363 adapter
->state
= ADAPT_UP
;
2364 if (!card
->loadtimerset
) {
2365 setup_timer(&card
->loadtimer
, &slic_timer_load_check
,
2367 card
->loadtimer
.expires
=
2368 jiffies
+ (SLIC_LOADTIMER_PERIOD
* HZ
);
2369 add_timer(&card
->loadtimer
);
2371 card
->loadtimerset
= 1;
2374 if (!adapter
->pingtimerset
) {
2375 setup_timer(&adapter
->pingtimer
, &slic_timer_ping
, (ulong
)dev
);
2376 adapter
->pingtimer
.expires
=
2377 jiffies
+ (PING_TIMER_INTERVAL
* HZ
);
2378 add_timer(&adapter
->pingtimer
);
2379 adapter
->pingtimerset
= 1;
2380 adapter
->card
->pingstatus
= ISR_PINGMASK
;
2384 * clear any pending events, then enable interrupts
2386 adapter
->isrcopy
= 0;
2387 adapter
->pshmem
->isr
= 0;
2388 slic_reg32_write(&slic_regs
->slic_isr
, 0, FLUSH
);
2389 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_ON
, FLUSH
);
2391 slic_link_config(adapter
, LINK_AUTOSPEED
, LINK_AUTOD
);
2392 rc
= slic_link_event_handler(adapter
);
2394 /* disable interrupts then clear pending events */
2395 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_OFF
, FLUSH
);
2396 slic_reg32_write(&slic_regs
->slic_isr
, 0, FLUSH
);
2397 if (adapter
->pingtimerset
) {
2398 del_timer(&adapter
->pingtimer
);
2399 adapter
->pingtimerset
= 0;
2401 if (card
->loadtimerset
) {
2402 del_timer(&card
->loadtimer
);
2403 card
->loadtimerset
= 0;
2405 adapter
->state
= ADAPT_DOWN
;
2406 slic_adapter_freeresources(adapter
);
2413 static int slic_entry_open(struct net_device
*dev
)
2415 struct adapter
*adapter
= netdev_priv(dev
);
2416 struct sliccard
*card
= adapter
->card
;
2417 unsigned long flags
;
2420 netif_stop_queue(adapter
->netdev
);
2422 spin_lock_irqsave(&slic_global
.driver_lock
, flags
);
2423 if (!adapter
->activated
) {
2424 card
->adapters_activated
++;
2425 slic_global
.num_slic_ports_active
++;
2426 adapter
->activated
= 1;
2428 status
= slic_if_init(adapter
, &flags
);
2431 if (adapter
->activated
) {
2432 card
->adapters_activated
--;
2433 slic_global
.num_slic_ports_active
--;
2434 adapter
->activated
= 0;
2439 card
->master
= adapter
;
2442 spin_unlock_irqrestore(&slic_global
.driver_lock
, flags
);
2446 static void slic_card_cleanup(struct sliccard
*card
)
2448 if (card
->loadtimerset
) {
2449 card
->loadtimerset
= 0;
2450 del_timer_sync(&card
->loadtimer
);
2456 static void slic_entry_remove(struct pci_dev
*pcidev
)
2458 struct net_device
*dev
= pci_get_drvdata(pcidev
);
2459 struct adapter
*adapter
= netdev_priv(dev
);
2460 struct sliccard
*card
;
2461 struct mcast_address
*mcaddr
, *mlist
;
2463 unregister_netdev(dev
);
2465 slic_adapter_freeresources(adapter
);
2466 slic_unmap_mmio_space(adapter
);
2468 /* free multicast addresses */
2469 mlist
= adapter
->mcastaddrs
;
2472 mlist
= mlist
->next
;
2475 card
= adapter
->card
;
2476 card
->adapters_allocated
--;
2477 adapter
->allocated
= 0;
2478 if (!card
->adapters_allocated
) {
2479 struct sliccard
*curr_card
= slic_global
.slic_card
;
2481 if (curr_card
== card
) {
2482 slic_global
.slic_card
= card
->next
;
2484 while (curr_card
->next
!= card
)
2485 curr_card
= curr_card
->next
;
2486 curr_card
->next
= card
->next
;
2488 slic_global
.num_slic_cards
--;
2489 slic_card_cleanup(card
);
2492 pci_release_regions(pcidev
);
2493 pci_disable_device(pcidev
);
2496 static int slic_entry_halt(struct net_device
*dev
)
2498 struct adapter
*adapter
= netdev_priv(dev
);
2499 struct sliccard
*card
= adapter
->card
;
2500 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
2501 unsigned long flags
;
2503 spin_lock_irqsave(&slic_global
.driver_lock
, flags
);
2504 netif_stop_queue(adapter
->netdev
);
2505 adapter
->state
= ADAPT_DOWN
;
2506 adapter
->linkstate
= LINK_DOWN
;
2507 adapter
->upr_list
= NULL
;
2508 adapter
->upr_busy
= 0;
2509 adapter
->devflags_prev
= 0;
2510 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_OFF
, FLUSH
);
2511 adapter
->all_reg_writes
++;
2512 adapter
->icr_reg_writes
++;
2513 slic_config_clear(adapter
);
2514 if (adapter
->activated
) {
2515 card
->adapters_activated
--;
2516 slic_global
.num_slic_ports_active
--;
2517 adapter
->activated
= 0;
2519 #ifdef AUTOMATIC_RESET
2520 slic_reg32_write(&slic_regs
->slic_reset_iface
, 0, FLUSH
);
2523 * Reset the adapter's cmd queues
2525 slic_cmdq_reset(adapter
);
2527 #ifdef AUTOMATIC_RESET
2528 if (!card
->adapters_activated
)
2529 slic_card_init(card
, adapter
);
2532 spin_unlock_irqrestore(&slic_global
.driver_lock
, flags
);
2536 static struct net_device_stats
*slic_get_stats(struct net_device
*dev
)
2538 struct adapter
*adapter
= netdev_priv(dev
);
2540 dev
->stats
.collisions
= adapter
->slic_stats
.iface
.xmit_collisions
;
2541 dev
->stats
.rx_errors
= adapter
->slic_stats
.iface
.rcv_errors
;
2542 dev
->stats
.tx_errors
= adapter
->slic_stats
.iface
.xmt_errors
;
2543 dev
->stats
.rx_missed_errors
= adapter
->slic_stats
.iface
.rcv_discards
;
2544 dev
->stats
.tx_heartbeat_errors
= 0;
2545 dev
->stats
.tx_aborted_errors
= 0;
2546 dev
->stats
.tx_window_errors
= 0;
2547 dev
->stats
.tx_fifo_errors
= 0;
2548 dev
->stats
.rx_frame_errors
= 0;
2549 dev
->stats
.rx_length_errors
= 0;
2554 static int slic_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
)
2556 struct adapter
*adapter
= netdev_priv(dev
);
2557 struct ethtool_cmd edata
;
2558 struct ethtool_cmd ecmd
;
2563 case SIOCSLICSETINTAGG
:
2564 if (copy_from_user(data
, rq
->ifr_data
, 28))
2567 dev_err(&dev
->dev
, "set interrupt aggregation to %d\n",
2569 slic_intagg_set(adapter
, intagg
);
2573 if (copy_from_user(&ecmd
, rq
->ifr_data
, sizeof(ecmd
)))
2576 if (ecmd
.cmd
== ETHTOOL_GSET
) {
2577 memset(&edata
, 0, sizeof(edata
));
2578 edata
.supported
= (SUPPORTED_10baseT_Half
|
2579 SUPPORTED_10baseT_Full
|
2580 SUPPORTED_100baseT_Half
|
2581 SUPPORTED_100baseT_Full
|
2582 SUPPORTED_Autoneg
| SUPPORTED_MII
);
2583 edata
.port
= PORT_MII
;
2584 edata
.transceiver
= XCVR_INTERNAL
;
2585 edata
.phy_address
= 0;
2586 if (adapter
->linkspeed
== LINK_100MB
)
2587 edata
.speed
= SPEED_100
;
2588 else if (adapter
->linkspeed
== LINK_10MB
)
2589 edata
.speed
= SPEED_10
;
2593 if (adapter
->linkduplex
== LINK_FULLD
)
2594 edata
.duplex
= DUPLEX_FULL
;
2596 edata
.duplex
= DUPLEX_HALF
;
2598 edata
.autoneg
= AUTONEG_ENABLE
;
2601 if (copy_to_user(rq
->ifr_data
, &edata
, sizeof(edata
)))
2604 } else if (ecmd
.cmd
== ETHTOOL_SSET
) {
2605 if (!capable(CAP_NET_ADMIN
))
2608 if (adapter
->linkspeed
== LINK_100MB
)
2609 edata
.speed
= SPEED_100
;
2610 else if (adapter
->linkspeed
== LINK_10MB
)
2611 edata
.speed
= SPEED_10
;
2615 if (adapter
->linkduplex
== LINK_FULLD
)
2616 edata
.duplex
= DUPLEX_FULL
;
2618 edata
.duplex
= DUPLEX_HALF
;
2620 edata
.autoneg
= AUTONEG_ENABLE
;
2623 if ((ecmd
.speed
!= edata
.speed
) ||
2624 (ecmd
.duplex
!= edata
.duplex
)) {
2628 if (ecmd
.speed
== SPEED_10
)
2631 speed
= PCR_SPEED_100
;
2632 if (ecmd
.duplex
== DUPLEX_FULL
)
2633 duplex
= PCR_DUPLEX_FULL
;
2636 slic_link_config(adapter
, speed
, duplex
);
2637 if (slic_link_event_handler(adapter
))
2647 static void slic_config_pci(struct pci_dev
*pcidev
)
2652 pci_read_config_word(pcidev
, PCI_COMMAND
, &pci_command
);
2654 new_command
= pci_command
| PCI_COMMAND_MASTER
2655 | PCI_COMMAND_MEMORY
2656 | PCI_COMMAND_INVALIDATE
2657 | PCI_COMMAND_PARITY
| PCI_COMMAND_SERR
| PCI_COMMAND_FAST_BACK
;
2658 if (pci_command
!= new_command
)
2659 pci_write_config_word(pcidev
, PCI_COMMAND
, new_command
);
2662 static int slic_card_init(struct sliccard
*card
, struct adapter
*adapter
)
2664 __iomem
struct slic_regs
*slic_regs
= adapter
->slic_regs
;
2665 struct slic_eeprom
*peeprom
;
2666 struct oslic_eeprom
*pOeeprom
;
2667 dma_addr_t phys_config
;
2671 struct slic_shmem
*pshmem
;
2673 uint macaddrs
= card
->card_size
;
2678 struct slic_config_mac
*pmac
;
2679 unsigned char fruformat
;
2680 unsigned char oemfruformat
;
2681 struct atk_fru
*patkfru
;
2682 union oemfru
*poemfru
;
2683 unsigned long flags
;
2685 /* Reset everything except PCI configuration space */
2686 slic_soft_reset(adapter
);
2688 /* Download the microcode */
2689 status
= slic_card_download(adapter
);
2693 if (!card
->config_set
) {
2694 peeprom
= pci_alloc_consistent(adapter
->pcidev
,
2695 sizeof(struct slic_eeprom
),
2698 phys_configl
= SLIC_GET_ADDR_LOW(phys_config
);
2699 phys_configh
= SLIC_GET_ADDR_HIGH(phys_config
);
2702 dev_err(&adapter
->pcidev
->dev
,
2703 "Failed to allocate DMA memory for EEPROM.\n");
2707 memset(peeprom
, 0, sizeof(struct slic_eeprom
));
2709 slic_reg32_write(&slic_regs
->slic_icr
, ICR_INT_OFF
, FLUSH
);
2711 pshmem
= (struct slic_shmem
*)(unsigned long)
2712 adapter
->phys_shmem
;
2714 spin_lock_irqsave(&adapter
->bit64reglock
, flags
);
2715 slic_reg32_write(&slic_regs
->slic_addr_upper
,
2716 SLIC_GET_ADDR_HIGH(&pshmem
->isr
), DONT_FLUSH
);
2717 slic_reg32_write(&slic_regs
->slic_isp
,
2718 SLIC_GET_ADDR_LOW(&pshmem
->isr
), FLUSH
);
2719 spin_unlock_irqrestore(&adapter
->bit64reglock
, flags
);
2721 status
= slic_config_get(adapter
, phys_configl
, phys_configh
);
2723 dev_err(&adapter
->pcidev
->dev
,
2724 "Failed to fetch config data from device.\n");
2729 if (adapter
->pshmem
->isr
) {
2730 if (adapter
->pshmem
->isr
& ISR_UPC
) {
2731 adapter
->pshmem
->isr
= 0;
2732 slic_reg64_write(adapter
,
2733 &slic_regs
->slic_isp
, 0,
2734 &slic_regs
->slic_addr_upper
,
2736 slic_reg32_write(&slic_regs
->slic_isr
,
2739 slic_upr_request_complete(adapter
, 0);
2743 adapter
->pshmem
->isr
= 0;
2744 slic_reg32_write(&slic_regs
->slic_isr
,
2750 dev_err(&adapter
->pcidev
->dev
,
2751 "Fetch of config data timed out.\n");
2752 slic_reg64_write(adapter
,
2753 &slic_regs
->slic_isp
, 0,
2754 &slic_regs
->slic_addr_upper
,
2762 switch (adapter
->devid
) {
2764 case SLIC_2GB_DEVICE_ID
:
2765 /* extract EEPROM data and pointers to EEPROM data */
2766 pOeeprom
= (struct oslic_eeprom
*)peeprom
;
2767 eecodesize
= pOeeprom
->EecodeSize
;
2768 dramsize
= pOeeprom
->DramSize
;
2769 pmac
= pOeeprom
->MacInfo
;
2770 fruformat
= pOeeprom
->FruFormat
;
2771 patkfru
= &pOeeprom
->AtkFru
;
2772 oemfruformat
= pOeeprom
->OemFruFormat
;
2773 poemfru
= &pOeeprom
->OemFru
;
2776 * Minor kludge for Oasis card
2777 * get 2 MAC addresses from the
2778 * EEPROM to ensure that function 1
2779 * gets the Port 1 MAC address
2783 /* extract EEPROM data and pointers to EEPROM data */
2784 eecodesize
= peeprom
->EecodeSize
;
2785 dramsize
= peeprom
->DramSize
;
2786 pmac
= peeprom
->u2
.mac
.MacInfo
;
2787 fruformat
= peeprom
->FruFormat
;
2788 patkfru
= &peeprom
->AtkFru
;
2789 oemfruformat
= peeprom
->OemFruFormat
;
2790 poemfru
= &peeprom
->OemFru
;
2794 card
->config
.EepromValid
= false;
2796 /* see if the EEPROM is valid by checking it's checksum */
2797 if ((eecodesize
<= MAX_EECODE_SIZE
) &&
2798 (eecodesize
>= MIN_EECODE_SIZE
)) {
2801 *(u16
*)((char *)peeprom
+ (eecodesize
- 2));
2803 * calculate the EEPROM checksum
2805 calc_chksum
= slic_eeprom_cksum(peeprom
,
2808 * if the ucdoe chksum flag bit worked,
2809 * we wouldn't need this
2811 if (ee_chksum
== calc_chksum
)
2812 card
->config
.EepromValid
= true;
2814 /* copy in the DRAM size */
2815 card
->config
.DramSize
= dramsize
;
2817 /* copy in the MAC address(es) */
2818 for (i
= 0; i
< macaddrs
; i
++) {
2819 memcpy(&card
->config
.MacInfo
[i
],
2820 &pmac
[i
], sizeof(struct slic_config_mac
));
2823 /* copy the Alacritech FRU information */
2824 card
->config
.FruFormat
= fruformat
;
2825 memcpy(&card
->config
.AtkFru
, patkfru
,
2826 sizeof(struct atk_fru
));
2828 pci_free_consistent(adapter
->pcidev
,
2829 sizeof(struct slic_eeprom
),
2830 peeprom
, phys_config
);
2832 if (!card
->config
.EepromValid
) {
2833 slic_reg64_write(adapter
, &slic_regs
->slic_isp
, 0,
2834 &slic_regs
->slic_addr_upper
,
2836 dev_err(&adapter
->pcidev
->dev
, "EEPROM invalid.\n");
2840 card
->config_set
= 1;
2843 status
= slic_card_download_gbrcv(adapter
);
2847 if (slic_global
.dynamic_intagg
)
2848 slic_intagg_set(adapter
, 0);
2850 slic_intagg_set(adapter
, adapter
->intagg_delay
);
2853 * Initialize ping status to "ok"
2855 card
->pingstatus
= ISR_PINGMASK
;
2858 * Lastly, mark our card state as up and return success
2860 card
->state
= CARD_UP
;
2861 card
->reset_in_progress
= 0;
2866 pci_free_consistent(adapter
->pcidev
, sizeof(struct slic_eeprom
),
2867 peeprom
, phys_config
);
2871 static int slic_get_coalesce(struct net_device
*dev
,
2872 struct ethtool_coalesce
*coalesce
)
2874 struct adapter
*adapter
= netdev_priv(dev
);
2876 adapter
->intagg_delay
= coalesce
->rx_coalesce_usecs
;
2877 adapter
->dynamic_intagg
= coalesce
->use_adaptive_rx_coalesce
;
2881 static int slic_set_coalesce(struct net_device
*dev
,
2882 struct ethtool_coalesce
*coalesce
)
2884 struct adapter
*adapter
= netdev_priv(dev
);
2886 coalesce
->rx_coalesce_usecs
= adapter
->intagg_delay
;
2887 coalesce
->use_adaptive_rx_coalesce
= adapter
->dynamic_intagg
;
2891 static void slic_init_driver(void)
2893 if (slic_first_init
) {
2894 slic_first_init
= 0;
2895 spin_lock_init(&slic_global
.driver_lock
);
2899 static void slic_init_adapter(struct net_device
*netdev
,
2900 struct pci_dev
*pcidev
,
2901 const struct pci_device_id
*pci_tbl_entry
,
2902 void __iomem
*memaddr
, int chip_idx
)
2905 struct slic_handle
*pslic_handle
;
2906 struct adapter
*adapter
= netdev_priv(netdev
);
2908 /* adapter->pcidev = pcidev;*/
2909 adapter
->vendid
= pci_tbl_entry
->vendor
;
2910 adapter
->devid
= pci_tbl_entry
->device
;
2911 adapter
->subsysid
= pci_tbl_entry
->subdevice
;
2912 adapter
->busnumber
= pcidev
->bus
->number
;
2913 adapter
->slotnumber
= ((pcidev
->devfn
>> 3) & 0x1F);
2914 adapter
->functionnumber
= (pcidev
->devfn
& 0x7);
2915 adapter
->slic_regs
= memaddr
;
2916 adapter
->irq
= pcidev
->irq
;
2917 adapter
->chipid
= chip_idx
;
2919 adapter
->cardindex
= adapter
->port
;
2920 spin_lock_init(&adapter
->upr_lock
);
2921 spin_lock_init(&adapter
->bit64reglock
);
2922 spin_lock_init(&adapter
->adapter_lock
);
2923 spin_lock_init(&adapter
->reset_lock
);
2924 spin_lock_init(&adapter
->handle_lock
);
2926 adapter
->card_size
= 1;
2928 * Initialize slic_handle array
2931 * Start with 1. 0 is an invalid host handle.
2933 for (index
= 1, pslic_handle
= &adapter
->slic_handles
[1];
2934 index
< SLIC_CMDQ_MAXCMDS
; index
++, pslic_handle
++) {
2936 pslic_handle
->token
.handle_index
= index
;
2937 pslic_handle
->type
= SLIC_HANDLE_FREE
;
2938 pslic_handle
->next
= adapter
->pfree_slic_handles
;
2939 adapter
->pfree_slic_handles
= pslic_handle
;
2941 adapter
->pshmem
= (struct slic_shmem
*)
2942 pci_alloc_consistent(adapter
->pcidev
,
2943 sizeof(struct slic_shmem
),
2946 if (adapter
->pshmem
)
2947 memset(adapter
->pshmem
, 0, sizeof(struct slic_shmem
));
2950 static const struct net_device_ops slic_netdev_ops
= {
2951 .ndo_open
= slic_entry_open
,
2952 .ndo_stop
= slic_entry_halt
,
2953 .ndo_start_xmit
= slic_xmit_start
,
2954 .ndo_do_ioctl
= slic_ioctl
,
2955 .ndo_set_mac_address
= slic_mac_set_address
,
2956 .ndo_get_stats
= slic_get_stats
,
2957 .ndo_set_rx_mode
= slic_mcast_set_list
,
2958 .ndo_validate_addr
= eth_validate_addr
,
2959 .ndo_change_mtu
= eth_change_mtu
,
2962 static u32
slic_card_locate(struct adapter
*adapter
)
2964 struct sliccard
*card
= slic_global
.slic_card
;
2965 struct physcard
*physcard
= slic_global
.phys_card
;
2967 u16 __iomem
*hostid_reg
;
2969 uint rdhostid_offset
= 0;
2971 switch (adapter
->devid
) {
2972 case SLIC_2GB_DEVICE_ID
:
2973 rdhostid_offset
= SLIC_RDHOSTID_2GB
;
2975 case SLIC_1GB_DEVICE_ID
:
2976 rdhostid_offset
= SLIC_RDHOSTID_1GB
;
2983 (u16 __iomem
*)(((u8 __iomem
*)(adapter
->slic_regs
)) +
2986 /* read the 16 bit hostid from SRAM */
2987 card_hostid
= (ushort
)readw(hostid_reg
);
2989 /* Initialize a new card structure if need be */
2990 if (card_hostid
== SLIC_HOSTID_DEFAULT
) {
2991 card
= kzalloc(sizeof(*card
), GFP_KERNEL
);
2995 card
->next
= slic_global
.slic_card
;
2996 slic_global
.slic_card
= card
;
2997 card
->busnumber
= adapter
->busnumber
;
2998 card
->slotnumber
= adapter
->slotnumber
;
3000 /* Find an available cardnum */
3001 for (i
= 0; i
< SLIC_MAX_CARDS
; i
++) {
3002 if (slic_global
.cardnuminuse
[i
] == 0) {
3003 slic_global
.cardnuminuse
[i
] = 1;
3008 slic_global
.num_slic_cards
++;
3010 /* Card exists, find the card this adapter belongs to */
3012 if (card
->cardnum
== card_hostid
)
3020 /* Put the adapter in the card's adapter list */
3021 if (!card
->adapter
[adapter
->port
]) {
3022 card
->adapter
[adapter
->port
] = adapter
;
3023 adapter
->card
= card
;
3026 card
->card_size
= 1; /* one port per *logical* card */
3029 for (i
= 0; i
< SLIC_MAX_PORTS
; i
++) {
3030 if (physcard
->adapter
[i
])
3033 if (i
== SLIC_MAX_PORTS
)
3036 if (physcard
->adapter
[i
]->slotnumber
== adapter
->slotnumber
)
3038 physcard
= physcard
->next
;
3041 /* no structure allocated for this physical card yet */
3042 physcard
= kzalloc(sizeof(*physcard
), GFP_ATOMIC
);
3044 if (card_hostid
== SLIC_HOSTID_DEFAULT
)
3049 physcard
->next
= slic_global
.phys_card
;
3050 slic_global
.phys_card
= physcard
;
3051 physcard
->adapters_allocd
= 1;
3053 physcard
->adapters_allocd
++;
3055 /* Note - this is ZERO relative */
3056 adapter
->physport
= physcard
->adapters_allocd
- 1;
3058 physcard
->adapter
[adapter
->physport
] = adapter
;
3059 adapter
->physcard
= physcard
;
3064 static int slic_entry_probe(struct pci_dev
*pcidev
,
3065 const struct pci_device_id
*pci_tbl_entry
)
3067 static int cards_found
;
3068 static int did_version
;
3070 struct net_device
*netdev
;
3071 struct adapter
*adapter
;
3072 void __iomem
*memmapped_ioaddr
= NULL
;
3073 ulong mmio_start
= 0;
3075 struct sliccard
*card
= NULL
;
3076 int pci_using_dac
= 0;
3078 err
= pci_enable_device(pcidev
);
3083 if (did_version
++ == 0) {
3084 dev_info(&pcidev
->dev
, "%s\n", slic_banner
);
3085 dev_info(&pcidev
->dev
, "%s\n", slic_proc_version
);
3088 if (!pci_set_dma_mask(pcidev
, DMA_BIT_MASK(64))) {
3090 err
= pci_set_consistent_dma_mask(pcidev
, DMA_BIT_MASK(64));
3092 dev_err(&pcidev
->dev
, "unable to obtain 64-bit DMA for consistent allocations\n");
3093 goto err_out_disable_pci
;
3096 err
= pci_set_dma_mask(pcidev
, DMA_BIT_MASK(32));
3098 dev_err(&pcidev
->dev
, "no usable DMA configuration\n");
3099 goto err_out_disable_pci
;
3102 pci_set_consistent_dma_mask(pcidev
, DMA_BIT_MASK(32));
3105 err
= pci_request_regions(pcidev
, DRV_NAME
);
3107 dev_err(&pcidev
->dev
, "can't obtain PCI resources\n");
3108 goto err_out_disable_pci
;
3111 pci_set_master(pcidev
);
3113 netdev
= alloc_etherdev(sizeof(struct adapter
));
3116 goto err_out_exit_slic_probe
;
3119 netdev
->ethtool_ops
= &slic_ethtool_ops
;
3120 SET_NETDEV_DEV(netdev
, &pcidev
->dev
);
3122 pci_set_drvdata(pcidev
, netdev
);
3123 adapter
= netdev_priv(netdev
);
3124 adapter
->netdev
= netdev
;
3125 adapter
->pcidev
= pcidev
;
3126 slic_global
.dynamic_intagg
= adapter
->dynamic_intagg
;
3128 netdev
->features
|= NETIF_F_HIGHDMA
;
3130 mmio_start
= pci_resource_start(pcidev
, 0);
3131 mmio_len
= pci_resource_len(pcidev
, 0);
3133 memmapped_ioaddr
= ioremap(mmio_start
, mmio_len
);
3134 if (!memmapped_ioaddr
) {
3135 dev_err(&pcidev
->dev
, "cannot remap MMIO region %lx @ %lx\n",
3136 mmio_len
, mmio_start
);
3138 goto err_out_free_netdev
;
3141 slic_config_pci(pcidev
);
3145 slic_init_adapter(netdev
,
3146 pcidev
, pci_tbl_entry
, memmapped_ioaddr
, cards_found
);
3148 err
= slic_card_locate(adapter
);
3150 dev_err(&pcidev
->dev
, "cannot locate card\n");
3154 card
= adapter
->card
;
3156 if (!adapter
->allocated
) {
3157 card
->adapters_allocated
++;
3158 adapter
->allocated
= 1;
3161 err
= slic_card_init(card
, adapter
);
3165 slic_adapter_set_hwaddr(adapter
);
3167 netdev
->base_addr
= (unsigned long)memmapped_ioaddr
;
3168 netdev
->irq
= adapter
->irq
;
3169 netdev
->netdev_ops
= &slic_netdev_ops
;
3171 strcpy(netdev
->name
, "eth%d");
3172 err
= register_netdev(netdev
);
3174 dev_err(&pcidev
->dev
, "Cannot register net device, aborting.\n");
3183 iounmap(memmapped_ioaddr
);
3184 err_out_free_netdev
:
3185 free_netdev(netdev
);
3186 err_out_exit_slic_probe
:
3187 pci_release_regions(pcidev
);
3188 err_out_disable_pci
:
3189 pci_disable_device(pcidev
);
3193 static struct pci_driver slic_driver
= {
3195 .id_table
= slic_pci_tbl
,
3196 .probe
= slic_entry_probe
,
3197 .remove
= slic_entry_remove
,
3200 static int __init
slic_module_init(void)
3204 return pci_register_driver(&slic_driver
);
3207 static void __exit
slic_module_cleanup(void)
3209 pci_unregister_driver(&slic_driver
);
3212 static struct ethtool_ops slic_ethtool_ops
= {
3213 .get_coalesce
= slic_get_coalesce
,
3214 .set_coalesce
= slic_set_coalesce
3217 module_init(slic_module_init
);
3218 module_exit(slic_module_cleanup
);