diff options
Diffstat (limited to 'openvz-sources/022.077/5107_linux-2.6.8.1-sk98lin-8.31.2.3.patch')
-rw-r--r-- | openvz-sources/022.077/5107_linux-2.6.8.1-sk98lin-8.31.2.3.patch | 42430 |
1 files changed, 0 insertions, 42430 deletions
diff --git a/openvz-sources/022.077/5107_linux-2.6.8.1-sk98lin-8.31.2.3.patch b/openvz-sources/022.077/5107_linux-2.6.8.1-sk98lin-8.31.2.3.patch deleted file mode 100644 index 36eabf2..0000000 --- a/openvz-sources/022.077/5107_linux-2.6.8.1-sk98lin-8.31.2.3.patch +++ /dev/null @@ -1,42430 +0,0 @@ ---- ./Documentation/networking/sk98lin.txt.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./Documentation/networking/sk98lin.txt 2006-04-04 13:11:36.000000000 +0400 -@@ -1,38 +1,56 @@ --(C)Copyright 1999-2004 Marvell(R). --All rights reserved --=========================================================================== -+(C)Copyright 1999-2006 Marvell(R). -+All rights reserved. -+================================================================================ - --sk98lin.txt created 13-Feb-2004 -+sk98lin.txt created 18-Jan-2006 - --Readme File for sk98lin v6.23 --Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX -+Readme File for sk98lin v8.31.2.3 -+Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter driver for LINUX - - This file contains - 1 Overview -- 2 Required Files -- 3 Installation -- 3.1 Driver Installation -- 3.2 Inclusion of adapter at system start -- 4 Driver Parameters -- 4.1 Per-Port Parameters -- 4.2 Adapter Parameters -- 5 Large Frame Support -- 6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) -- 7 Troubleshooting -+ 2 Supported Functions -+ 3 Required Files -+ 4 Installation -+ 4.1 Driver Installation -+ 4.2 Inclusion of adapter at system start -+ 5 Driver Parameters -+ 5.1 Per-Port Parameters -+ 5.2 Adapter Parameters -+ 6 Ethtool Support -+ 7 Large Frame Support -+ 8 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) -+ 9 Wake on Lan support -+10 Troubleshooting - --=========================================================================== -+================================================================================ - - - 1 Overview - =========== - --The sk98lin driver supports the Marvell Yukon and SysKonnect --SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux. It has --been tested with Linux on Intel/x86 machines. -+The sk98lin driver supports the Marvell Yukon, Yukon EC/FE, Yukon 2 -+and SysKonnect SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux. -+It has been tested with Linux on Intel/x86, x86_64 and IA64 machines. - *** - -+2 Supported Functions -+====================== -+ -+The following functions are supported by the driver: - --2 Required Files -+ NOTE 1: The hardware support depends on the used card -+ -+ - RX/TX HW Checksum -+ - Hardware interrupt moderation (static/dynamic) -+ - Transmit poll -+ - Zerocopy/Scatter-Gather -+ - Ethtool support -+ - Wake on Lan (Magic Packet only) (From suspend and APM only) -+ - DualNet -+ -+ -+3 Required Files - ================= - - The linux kernel source. -@@ -40,16 +58,14 @@ No additional files required. - *** - - --3 Installation -+4 Installation - =============== - - It is recommended to download the latest version of the driver from the --SysKonnect web site www.syskonnect.com. If you have downloaded the latest --driver, the Linux kernel has to be patched before the driver can be --installed. For details on how to patch a Linux kernel, refer to the --patch.txt file. -+SysKonnect web site www.syskonnect.com. For details on Installation -+Instructions for sk98lin Driver, please refer to the README.txt file. - --3.1 Driver Installation -+4.1 Driver Installation - ------------------------ - - The following steps describe the actions that are required to install -@@ -110,13 +126,13 @@ To load the module manually, proceed as - - NOTE 1: If you have more than one Marvell Yukon or SysKonnect SK-98xx - adapter installed, the adapters will be listed as 'eth0', -- 'eth1', 'eth2', etc. -- For each adapter, repeat steps 3 and 4 below. -+ 'eth1', 'eth2', etc. -+ For each adapter, repeat steps 3 and 4 below. - - NOTE 2: If you have other Ethernet adapters installed, your Marvell - Yukon or SysKonnect SK-98xx adapter will be mapped to the -- next available number, e.g. 'eth1'. The mapping is executed -- automatically. -+ next available number, e.g. 'eth1'. The mapping is executed -+ automatically. - The module installation message (displayed either in a system - log file or on the console) prints a line for each adapter - found containing the corresponding 'ethX'. -@@ -153,7 +169,7 @@ To stop and unload the driver modules, p - 1. Execute the command "ifconfig eth0 down". - 2. Execute the command "rmmod sk98lin". - --3.2 Inclusion of adapter at system start -+4.2 Inclusion of adapter at system start - ----------------------------------------- - - Since a large number of different Linux distributions are -@@ -165,7 +181,8 @@ Refer to the distribution's manual for i - - *** - --4 Driver Parameters -+ -+5 Driver Parameters - ==================== - - Parameters can be set at the command line after the module has been -@@ -174,7 +191,7 @@ In some distributions, the configuration - to the driver module. - - If you use the kernel module loader, you can set driver parameters --in the file /etc/modprobe.conf (or /etc/modules.conf in 2.4 or earlier). -+in the file /etc/modules.conf (or old name: /etc/conf.modules). - To set the driver parameters in this file, proceed as follows: - - 1. Insert a line of the form : -@@ -208,7 +225,7 @@ NOTE: The number of adapters that can be - more adapters, adjust this and recompile. - - --4.1 Per-Port Parameters -+5.1 Per-Port Parameters - ------------------------ - - These settings are available for each port on the adapter. -@@ -282,7 +299,7 @@ establishment. If this fails, a port can - with this parameter. - - --4.2 Adapter Parameters -+5.2 Adapter Parameters - ----------------------- - - Connection Type (SK-98xx V2.0 copper adapters only) -@@ -379,7 +396,6 @@ second) seems to be meaningful, but the - is tremendous. On the other hand, selecting a very short moderation time might - compensate the use of any moderation being applied. - -- - Preferred Port - -------------- - Parameter: PrefPort -@@ -394,7 +410,7 @@ RLMT Mode (Redundant Link Management Tec - ------------------------------------------------ - Parameter: RlmtMode - Values: CheckLinkState,CheckLocalPort, CheckSeg, DualNet --Default: CheckLinkState -+Default: CheckLinkState (DualNet on dual port adapters) - - RLMT monitors the status of the port. If the link of the active port - fails, RLMT switches immediately to the standby link. The virtual link is -@@ -429,10 +445,94 @@ NOTE: RLMT modes CLP and CLPSS are desig - where a network path between the ports on one adapter exists. - Moreover, they are not designed to work where adapters are connected - back-to-back. -+ -+LowLatency -+---------- -+Parameter: LowLatency -+Values: On, Off -+Default: Off -+ -+This is used to reduce the packet latency time of the adapter. Setting the -+LowLatency parameter to 'On' forces the adapter to pass any received packet -+immediately to upper network layers and to send out any transmit packet as -+fast as possible. -+ -+NOTE 1: The system load increases if LowLatency is set to 'On' and a lot -+ of data packets are transmitted and received. -+ -+NOTE 2: This parameter is only used on adapters which are based on -+ PCI Express compatible chipsets. - *** - - --5 Large Frame Support -+6 Ethtool Support -+================== -+ -+The sk98lin driver provides built-in ethtool support. The ethtool -+can be used to display or modify interface specific configurations. -+ -+Ethtool commands are invoked using a single parameter which reflects -+the requested ethtool command plus an optional number of parameters -+which belong to the desired command. -+ -+It is not the intention of this section to explain the ethtool command -+line tool and all its options. For further information refer to the -+manpage of the ethtool. This sections describes only the sk98lin -+driver supported ethtool commands. -+ -+Pause Parameters -+---------------- -+Query command: -a -+Set command: -A [autoneg on|off] [rx on|off] [tx on|off] -+Sample: ethtool -A eth0 rx off tx off -+ -+Coalescing Parameters -+--------------------- -+Query command: -c -+Set command: -C [sample-interval I] -+ [rx-usecs N] [tx-usecs N] -+ [rx-usecs-low N] [tx-usecs-low N] -+ [rx-usecs-high N] [tx-usecs-high N] -+Parameter: I = Length of sample interval, in seconds -+ (supported values range from 1...10) -+ N = Length of coalescing interval, in microseconds -+ (supported values range from 25...33,333) -+Sample: ethtool -C eth2 rx-usecs 500 tx-usecs 500 -+ -+NOTE: The sk98lin driver does not support different settings -+ for the rx and tx interrupt coalescing parameters. -+ -+Driver Information -+------------------ -+Query command: -i -+Sample: ethtool -i eth1 -+ -+Checksumming Parameters -+----------------------- -+Query command: -k -+Set command: -K [rx on|off] [tx on|off] [sg on|off] -+Sample: ethtool -K eth0 sg off -+ -+Locate NIC Command -+------------------ -+Query command: -p [N] -+Parameter: N = Amount of time to perform locate NIC command, in seconds -+Sample: ethtool -p 10 eth1 -+ -+Driver-specific Statistics -+-------------------------- -+Query command: -S -+Sample: ethtool -S eth0 -+ -+Setting Parameters -+------------------ -+Set command: -s [speed 10|100|1000] [duplex half|full] -+ [autoneg on|off] [wol gd] -+Sample: ethtool -s eth2 wol d -+*** -+ -+ -+7 Large Frame Support - ====================== - - The driver supports large frames (also called jumbo frames). Using large -@@ -444,10 +544,10 @@ command: - ifconfig eth0 mtu 9000 - This will only work if you have two adapters connected back-to-back - or if you use a switch that supports large frames. When using a switch, --it should be configured to allow large frames and auto-negotiation should --be set to OFF. The setting must be configured on all adapters that can be --reached by the large frames. If one adapter is not set to receive large --frames, it will simply drop them. -+it should be configured to allow large frames. The setting must be -+configured on all adapters that can be reached by the large frames. -+If one adapter is not set to receive large frames, it will simply drop -+them. - - You can switch back to the standard ethernet frame size by executing the - following command: -@@ -459,7 +559,7 @@ in /etc/rc.d/rc2.d). - *** - - --6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) -+8 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) - ================================================================== - - The Marvell Yukon/SysKonnect Linux drivers are able to support VLAN and -@@ -477,8 +577,21 @@ NOTE: Configuring Link Aggregation on a - cause problems when unloading the driver. - - --7 Troubleshooting --================== -+9 Wake on Lan support -+====================== -+ -+The sk98lin driver supports wake up from suspend mode with MagicPacket -+on APM systems. Wake on Lan support is enabled by default. To disable it -+please use the ethtool. -+ -+NOTE 1: APM support has to be enabled in BIOS and in the kernel. -+ -+NOTE 2: Refer to the kernel documentation for additional requirements -+ regarding APM support. -+ -+ -+10 Troubleshooting -+=================== - - If any problems occur during the installation process, check the - following list: ---- ./drivers/net/Kconfig.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/Kconfig 2006-04-04 13:11:36.000000000 +0400 -@@ -2052,6 +2052,22 @@ config SK98LIN - by this driver: - - 3Com 3C940 Gigabit LOM Ethernet Adapter - - 3Com 3C941 Gigabit LOM Ethernet Adapter -+ - 88E8021 Marvell 1000 Mbit PCI-X, single Port Copper -+ - 88E8021 Marvell 1000 Mbit PCI-X, single Port Fiber LX -+ - 88E8021 Marvell 1000 Mbit PCI-X, single Port Fiber SX -+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Copper -+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Copper (Gateway) -+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Fiber LX -+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Fiber SX -+ - 88E8061 Marvell 1000 Mbit PCI-E, single Port Copper -+ - 88E8061 Marvell 1000 Mbit PCI-E, single Port Fiber LX -+ - 88E8061 Marvell 1000 Mbit PCI-E, single Port Fiber SX -+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Copper -+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Copper (Gateway) -+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Fiber LX -+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Fiber SX -+ - Abocom EFE3K - 10/100 Ethernet Expresscard -+ - Abocom EGE5K - Giga Ethernet Expresscard - - Allied Telesyn AT-2970LX Gigabit Ethernet Adapter - - Allied Telesyn AT-2970LX/2SC Gigabit Ethernet Adapter - - Allied Telesyn AT-2970SX Gigabit Ethernet Adapter -@@ -2062,31 +2078,81 @@ config SK98LIN - - Allied Telesyn AT-2971T Gigabit Ethernet Adapter - - Belkin Gigabit Desktop Card 10/100/1000Base-T Adapter, Copper RJ-45 - - DGE-530T Gigabit Ethernet Adapter -+ - DGE-560T Gigabit Ethernet Adapter - - EG1032 v2 Instant Gigabit Network Adapter - - EG1064 v2 Instant Gigabit Network Adapter -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Abit) -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Albatron) -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Asus) -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (ECS) -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Epox) -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Foxconn) -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Gigabyte) -- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Iwill) -- - Marvell 88E8050 Gigabit LOM Ethernet Adapter (Intel) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Abit) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Albatron) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Asus) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Chaintech) -+ - Marvell 88E8001 Gigabit Ethernet Controller (ECS) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Epox) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Foxconn) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte) -+ - Marvell 88E8001 Gigabit Ethernet Controller (Iwill) -+ - Marvell 88E8035 Fast Ethernet Controller (LGE) -+ - Marvell 88E8035 Fast Ethernet Controller (Toshiba) -+ - Marvell 88E8036 Fast Ethernet Controller (Arima) -+ - Marvell 88E8036 Fast Ethernet Controller (Compal) -+ - Marvell 88E8036 Fast Ethernet Controller (Inventec) -+ - Marvell 88E8036 Fast Ethernet Controller (LGE) -+ - Marvell 88E8036 Fast Ethernet Controller (Mitac) -+ - Marvell 88E8036 Fast Ethernet Controller (Panasonic) -+ - Marvell 88E8036 Fast Ethernet Controller (Quanta) -+ - Marvell 88E8036 Fast Ethernet Controller (Toshiba) -+ - Marvell 88E8036 Fast Ethernet Controller (Wistron) -+ - Marvell 88E8050 Gigabit Ethernet Controller (Gateway) -+ - Marvell 88E8050 Gigabit Ethernet Controller (Intel) -+ - Marvell 88E8052 Gigabit Ethernet Controller (ASRock) -+ - Marvell 88E8052 Gigabit Ethernet Controller (Aopen) -+ - Marvell 88E8052 Gigabit Ethernet Controller (Asus) -+ - Marvell 88E8052 Gigabit Ethernet Controller (Gateway) -+ - Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte) -+ - Marvell 88E8052 Gigabit Ethernet Controller (MSI) -+ - Marvell 88E8052 Gigabit Ethernet Controller (Wistron) -+ - Marvell 88E8053 Gigabit Ethernet Controller (ASRock) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Albatron) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Aopen) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Arima) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Asus) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Chaintech) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Clevo) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Compal) -+ - Marvell 88E8053 Gigabit Ethernet Controller (DFI) -+ - Marvell 88E8053 Gigabit Ethernet Controller (ECS) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Epox) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Inventec) -+ - Marvell 88E8053 Gigabit Ethernet Controller (LGE) -+ - Marvell 88E8053 Gigabit Ethernet Controller (MSI) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Mitac) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Panasonic) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Quanta) -+ - Marvell 88E8053 Gigabit Ethernet Controller (SOYO) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Toshiba) -+ - Marvell 88E8053 Gigabit Ethernet Controller (Trigem) -+ - Marvell RDK-8001 - - Marvell RDK-8001 Adapter - - Marvell RDK-8002 Adapter -+ - Marvell RDK-8003 - - Marvell RDK-8003 Adapter - - Marvell RDK-8004 Adapter - - Marvell RDK-8006 Adapter - - Marvell RDK-8007 Adapter - - Marvell RDK-8008 Adapter - - Marvell RDK-8009 Adapter -- - Marvell RDK-8010 Adapter -+ - Marvell RDK-8010 - - Marvell RDK-8011 Adapter - - Marvell RDK-8012 Adapter -- - Marvell RDK-8052 Adapter -- - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (32 bit) -- - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (64 bit) -+ - Marvell RDK-8035 -+ - Marvell RDK-8036 -+ - Marvell RDK-8052 -+ - Marvell RDK-8053 -+ - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit) -+ - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit) -+ - Marvell Yukon-EC Ultra, no ASF (Battery Power Service Support) -+ - Marvell Yukon-FE Fast Ethernet, Reduced Battery Power Service Support) - - N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) - - SK-9521 10/100/1000Base-T Adapter - - SK-9521 V2.0 10/100/1000Base-T Adapter -@@ -2106,6 +2172,14 @@ config SK98LIN - - SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) - - SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter - - SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) -+ - SK-9S21 Server Adapter -+ - SK-9S22 Server Adapter -+ - SK-9S24 Server Adapter -+ - SK-9S34 Server Adapter -+ - SK-9S81 Server Adapter -+ - SK-9S82 Server Adapter -+ - SK-9S91 Server Adapter -+ - SK-9S92 Server Adapter - - SMC EZ Card 1000 (SMC9452TXV.2) - - The adapters support Jumbo Frames. -@@ -2119,8 +2193,15 @@ config SK98LIN - - If you want to compile this driver as a module ( = code which can be - inserted in and removed from the running kernel whenever you want), -- say M here and read Documentation/kbuild/modules.txt. The module will -- be called sk98lin. This is recommended. -+ say M here and read Documentation/modules.txt. This is recommended. -+ The module will be called sk98lin. This is recommended. -+ -+config SK98LIN_NAPI -+ bool "Use Rx polling (NAPI)" -+ depends on SK98LIN -+ help -+ NAPI is a new driver API designed to reduce CPU and interrupt load -+ when the driver is receiving lots of packets from the card. - - config TIGON3 - tristate "Broadcom Tigon3 support" ---- ./drivers/net/sk98lin/h/lm80.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/lm80.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: lm80.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.6 $ -- * Date: $Date: 2003/05/13 17:26:52 $ -+ * Version: $Revision: 2.2 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: Contains all defines for the LM80 Chip - * (National Semiconductor). - * -@@ -11,6 +11,7 @@ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. - * (C)Copyright 2002-2003 Marvell. - * -@@ -20,6 +21,7 @@ - * (at your option) any later version. - * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - ---- ./drivers/net/sk98lin/h/skaddr.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skaddr.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skaddr.h - * Project: Gigabit Ethernet Adapters, ADDR-Modul -- * Version: $Revision: 1.29 $ -- * Date: $Date: 2003/05/13 16:57:24 $ -+ * Version: $Revision: 2.1 $ -+ * Date: $Date: 2003/10/27 14:16:07 $ - * Purpose: Header file for Address Management (MC, UC, Prom). - * - ******************************************************************************/ ---- ./drivers/net/sk98lin/h/skcsum.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skcsum.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skcsum.h - * Project: GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx) -- * Version: $Revision: 1.10 $ -- * Date: $Date: 2003/08/20 13:59:57 $ -+ * Version: $Revision: 2.2 $ -+ * Date: $Date: 2003/12/29 15:37:26 $ - * Purpose: Store/verify Internet checksum in send/receive packets. - * - ******************************************************************************/ -@@ -157,9 +157,7 @@ typedef struct s_CsProtocolStatistics { - typedef struct s_Csum { - /* Enabled receive SK_PROTO_XXX bit flags. */ - unsigned ReceiveFlags[SK_MAX_NETS]; --#ifdef TX_CSUM - unsigned TransmitFlags[SK_MAX_NETS]; --#endif /* TX_CSUM */ - - /* The protocol statistics structure; one per supported protocol. */ - SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS]; ---- ./drivers/net/sk98lin/h/skdebug.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skdebug.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skdebug.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.14 $ -- * Date: $Date: 2003/05/13 17:26:00 $ -+ * Version: $Revision: 2.4 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: SK specific DEBUG support - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -28,9 +29,9 @@ - #ifdef DEBUG - #ifndef SK_DBG_MSG - #define SK_DBG_MSG(pAC,comp,cat,arg) \ -- if ( ((comp) & SK_DBG_CHKMOD(pAC)) && \ -- ((cat) & SK_DBG_CHKCAT(pAC)) ) { \ -- SK_DBG_PRINTF arg ; \ -+ if ( ((comp) & SK_DBG_CHKMOD(pAC)) && \ -+ ((cat) & SK_DBG_CHKCAT(pAC)) ) { \ -+ SK_DBG_PRINTF arg; \ - } - #endif - #else -@@ -58,6 +59,13 @@ - #define SK_DBGMOD_ADDR 0x00000080L /* ADDR module */ - #define SK_DBGMOD_PECP 0x00000100L /* PECP module */ - #define SK_DBGMOD_POWM 0x00000200L /* Power Management module */ -+#ifdef SK_ASF -+#define SK_DBGMOD_ASF 0x00000400L /* ASF module */ -+#endif -+#ifdef SK_LBFO -+#define SK_DBGMOD_LACP 0x00000800L /* link aggregation control protocol */ -+#define SK_DBGMOD_FD 0x00001000L /* frame distributor (link aggregation) */ -+#endif /* SK_LBFO */ - - /* Debug events */ - ---- ./drivers/net/sk98lin/h/skdrv1st.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skdrv1st.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skdrv1st.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.4 $ -- * Date: $Date: 2003/11/12 14:28:14 $ -+ * Version: $Revision: 1.5.2.6 $ -+ * Date: $Date: 2005/08/09 07:14:29 $ - * Purpose: First header file for driver and all other modules - * - ******************************************************************************/ -@@ -11,7 +11,7 @@ - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -22,20 +22,6 @@ - * - ******************************************************************************/ - --/****************************************************************************** -- * -- * Description: -- * -- * This is the first include file of the driver, which includes all -- * neccessary system header files and some of the GEnesis header files. -- * It also defines some basic items. -- * -- * Include File Hierarchy: -- * -- * see skge.c -- * -- ******************************************************************************/ -- - #ifndef __INC_SKDRV1ST_H - #define __INC_SKDRV1ST_H - -@@ -58,6 +44,9 @@ typedef struct s_AC SK_AC; - - #define SK_ADDR_EQUAL(a1,a2) (!memcmp(a1,a2,6)) - -+#define SK_STRNCMP(s1,s2,len) strncmp(s1,s2,len) -+#define SK_STRCPY(dest,src) strcpy(dest,src) -+ - #include <linux/types.h> - #include <linux/kernel.h> - #include <linux/string.h> -@@ -78,11 +67,7 @@ typedef struct s_AC SK_AC; - #include <net/checksum.h> - - #define SK_CS_CALCULATE_CHECKSUM --#ifndef CONFIG_X86_64 --#define SkCsCalculateChecksum(p,l) ((~ip_compute_csum(p, l)) & 0xffff) --#else --#define SkCsCalculateChecksum(p,l) ((~ip_fast_csum(p, l)) & 0xffff) --#endif -+#define SkCsCalculateChecksum(p,l) (~csum_fold(csum_partial(p, l, 0))) - - #include "h/sktypes.h" - #include "h/skerror.h" -@@ -90,10 +75,15 @@ typedef struct s_AC SK_AC; - #include "h/lm80.h" - #include "h/xmac_ii.h" - -+#ifndef SK_BMU_RX_WM_PEX -+#define SK_BMU_RX_WM_PEX 0x80 -+#endif -+ - #ifdef __LITTLE_ENDIAN - #define SK_LITTLE_ENDIAN - #else - #define SK_BIG_ENDIAN -+#define SK_USE_REV_DESC - #endif - - #define SK_NET_DEVICE net_device -@@ -188,3 +178,8 @@ extern void SkErrorLog(SK_AC*, int, int, - - #endif - -+/******************************************************************************* -+ * -+ * End of file -+ * -+ ******************************************************************************/ ---- ./drivers/net/sk98lin/h/skdrv2nd.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skdrv2nd.h 2006-04-04 13:13:34.000000000 +0400 -@@ -1,17 +1,17 @@ - /****************************************************************************** - * -- * Name: skdrv2nd.h -- * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.10 $ -- * Date: $Date: 2003/12/11 16:04:45 $ -- * Purpose: Second header file for driver and all other modules -+ * Name: skdrv2nd.h -+ * Project: GEnesis, PCI Gigabit Ethernet Adapter -+ * Version: $Revision: 1.29.2.28 $ -+ * Date: $Date: 2005/11/14 15:22:08 $ -+ * Purpose: Second header file for driver and all other modules - * - ******************************************************************************/ - - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -42,10 +42,11 @@ - #include "h/skqueue.h" - #include "h/skgehwt.h" - #include "h/sktimer.h" --#include "h/ski2c.h" -+#include "h/sktwsi.h" - #include "h/skgepnmi.h" - #include "h/skvpd.h" - #include "h/skgehw.h" -+#include "h/sky2le.h" - #include "h/skgeinit.h" - #include "h/skaddr.h" - #include "h/skgesirq.h" -@@ -53,158 +54,191 @@ - #include "h/skrlmt.h" - #include "h/skgedrv.h" - --#define SK_PCI_ISCOMPLIANT(result, pdev) { \ -- result = SK_FALSE; /* default */ \ -- /* 3Com (0x10b7) */ \ -- if (pdev->vendor == 0x10b7) { \ -- /* Gigabit Ethernet Adapter (0x1700) */ \ -- if ((pdev->device == 0x1700) || \ -- (pdev->device == 0x80eb)) { \ -- result = SK_TRUE; \ -- } \ -- /* SysKonnect (0x1148) */ \ -- } else if (pdev->vendor == 0x1148) { \ -- /* SK-98xx Gigabit Ethernet Server Adapter (0x4300) */ \ -- /* SK-98xx V2.0 Gigabit Ethernet Adapter (0x4320) */ \ -- if ((pdev->device == 0x4300) || \ -- (pdev->device == 0x4320)) { \ -- result = SK_TRUE; \ -- } \ -- /* D-Link (0x1186) */ \ -- } else if (pdev->vendor == 0x1186) { \ -- /* Gigabit Ethernet Adapter (0x4c00) */ \ -- if ((pdev->device == 0x4c00)) { \ -- result = SK_TRUE; \ -- } \ -- /* Marvell (0x11ab) */ \ -- } else if (pdev->vendor == 0x11ab) { \ -- /* Gigabit Ethernet Adapter (0x4320) */ \ -- /* Gigabit Ethernet Adapter (0x4360) */ \ -- /* Gigabit Ethernet Adapter (0x4361) */ \ -- /* Belkin (0x5005) */ \ -- if ((pdev->device == 0x4320) || \ -- (pdev->device == 0x4360) || \ -- (pdev->device == 0x4361) || \ -- (pdev->device == 0x5005)) { \ -- result = SK_TRUE; \ -- } \ -- /* CNet (0x1371) */ \ -- } else if (pdev->vendor == 0x1371) { \ -- /* GigaCard Network Adapter (0x434e) */ \ -- if ((pdev->device == 0x434e)) { \ -- result = SK_TRUE; \ -- } \ -- /* Linksys (0x1737) */ \ -- } else if (pdev->vendor == 0x1737) { \ -- /* Gigabit Network Adapter (0x1032) */ \ -- /* Gigabit Network Adapter (0x1064) */ \ -- if ((pdev->device == 0x1032) || \ -- (pdev->device == 0x1064)) { \ -- result = SK_TRUE; \ -- } \ -- } else { \ -- result = SK_FALSE; \ -- } \ --} -+/* Defines for the poll cotroller */ -+#define SK_NETDUMP_POLL -+ -+#ifdef SK_NETDUMP_POLL -+#ifdef HAVE_POLL_CONTROLLER -+#define SK_POLL_CONTROLLER -+#define CONFIG_SK98LIN_NAPI -+#elif CONFIG_NET_POLL_CONTROLLER -+#define SK_POLL_CONTROLLER -+#define CONFIG_SK98LIN_NAPI -+#endif -+#endif - - --extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned); --extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*); --extern SK_U64 SkOsGetTime(SK_AC*); --extern int SkPciReadCfgDWord(SK_AC*, int, SK_U32*); --extern int SkPciReadCfgWord(SK_AC*, int, SK_U16*); --extern int SkPciReadCfgByte(SK_AC*, int, SK_U8*); --extern int SkPciWriteCfgDWord(SK_AC*, int, SK_U32); --extern int SkPciWriteCfgWord(SK_AC*, int, SK_U16); --extern int SkPciWriteCfgByte(SK_AC*, int, SK_U8); --extern int SkDrvEvent(SK_AC*, SK_IOC IoC, SK_U32, SK_EVPARA); -- --#ifdef SK_DIAG_SUPPORT --extern int SkDrvEnterDiagMode(SK_AC *pAc); --extern int SkDrvLeaveDiagMode(SK_AC *pAc); -+/****************************************************************************** -+ * -+ * Generic driver defines -+ * -+ ******************************************************************************/ -+ -+#define USE_TIST_FOR_RESET /* Use timestamp for reset */ -+#define Y2_RECOVERY /* use specific recovery yukon2 functions */ -+#define Y2_LE_CHECK /* activate check for LE order */ -+#define Y2_SYNC_CHECK /* activate check for receiver in sync */ -+#define SK_YUKON2 /* Enable Yukon2 dual net support */ -+#define USE_SK_TX_CHECKSUM /* use the tx hw checksum driver functionality */ -+#define USE_SK_RX_CHECKSUM /* use the rx hw checksum driver functionality */ -+#define USE_SK_TSO_FEATURE /* use TCP segmentation offload if possible */ -+#define SK_COPY_THRESHOLD 50 /* threshold for copying small RX frames; -+ * 0 avoids copying, 9001 copies all */ -+#define SK_MAX_CARD_PARAM 16 /* number of adapters that can be configured via -+ * command line params */ -+//#define USE_TX_COMPLETE /* use of a transmit complete interrupt */ -+#define Y2_RX_CHECK /* RX Check timestamp */ -+ -+/* -+ * use those defines for a compile-in version of the driver instead -+ * of command line parameters -+ */ -+// #define LINK_SPEED_A {"Auto",} -+// #define LINK_SPEED_B {"Auto",} -+// #define AUTO_NEG_A {"Sense",} -+// #define AUTO_NEG_B {"Sense"} -+// #define DUP_CAP_A {"Both",} -+// #define DUP_CAP_B {"Both",} -+// #define FLOW_CTRL_A {"SymOrRem",} -+// #define FLOW_CTRL_B {"SymOrRem",} -+// #define ROLE_A {"Auto",} -+// #define ROLE_B {"Auto",} -+// #define PREF_PORT {"A",} -+// #define CON_TYPE {"Auto",} -+// #define RLMT_MODE {"CheckLinkState",} -+ -+#ifdef Y2_RECOVERY -+#define CHECK_TRANSMIT_TIMEOUT -+#define Y2_RESYNC_WATERMARK 1000000L - #endif - -+ -+/****************************************************************************** -+ * -+ * Generic ISR defines -+ * -+ ******************************************************************************/ -+ -+#define SkIsrRetVar irqreturn_t -+#define SkIsrRetNone IRQ_NONE -+#define SkIsrRetHandled IRQ_HANDLED -+ -+#define DEV_KFREE_SKB(skb) dev_kfree_skb(skb) -+#define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb) -+#define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb) -+ -+/****************************************************************************** -+ * -+ * Global function prototypes -+ * -+ ******************************************************************************/ -+ -+extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned); -+extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*); -+extern SK_U64 SkOsGetTime(SK_AC*); -+extern int SkPciReadCfgDWord(SK_AC*, int, SK_U32*); -+extern int SkPciReadCfgWord(SK_AC*, int, SK_U16*); -+extern int SkPciReadCfgByte(SK_AC*, int, SK_U8*); -+extern int SkPciWriteCfgDWord(SK_AC*, int, SK_U32); -+extern int SkPciWriteCfgWord(SK_AC*, int, SK_U16); -+extern int SkPciWriteCfgByte(SK_AC*, int, SK_U8); -+extern int SkDrvEvent(SK_AC*, SK_IOC IoC, SK_U32, SK_EVPARA); -+extern int SkDrvEnterDiagMode(SK_AC *pAc); -+extern int SkDrvLeaveDiagMode(SK_AC *pAc); -+ -+/****************************************************************************** -+ * -+ * Linux specific RLMT buffer structure (SK_MBUF typedef in skdrv1st)! -+ * -+ ******************************************************************************/ -+ - struct s_DrvRlmtMbuf { -- SK_MBUF *pNext; /* Pointer to next RLMT Mbuf. */ -- SK_U8 *pData; /* Data buffer (virtually contig.). */ -- unsigned Size; /* Data buffer size. */ -- unsigned Length; /* Length of packet (<= Size). */ -- SK_U32 PortIdx; /* Receiving/transmitting port. */ -+ SK_MBUF *pNext; /* Pointer to next RLMT Mbuf. */ -+ SK_U8 *pData; /* Data buffer (virtually contig.). */ -+ unsigned Size; /* Data buffer size. */ -+ unsigned Length; /* Length of packet (<= Size). */ -+ SK_U32 PortIdx; /* Receiving/transmitting port. */ - #ifdef SK_RLMT_MBUF_PRIVATE -- SK_RLMT_MBUF Rlmt; /* Private part for RLMT. */ --#endif /* SK_RLMT_MBUF_PRIVATE */ -- struct sk_buff *pOs; /* Pointer to message block */ -+ SK_RLMT_MBUF Rlmt; /* Private part for RLMT. */ -+#endif -+ struct sk_buff *pOs; /* Pointer to message block */ - }; - -+/****************************************************************************** -+ * -+ * Linux specific TIME defines -+ * -+ ******************************************************************************/ - --/* -- * Time macros -- */ - #if SK_TICKS_PER_SEC == 100 - #define SK_PNMI_HUNDREDS_SEC(t) (t) - #else --#define SK_PNMI_HUNDREDS_SEC(t) ((((unsigned long)t) * 100) / \ -- (SK_TICKS_PER_SEC)) -+#define SK_PNMI_HUNDREDS_SEC(t) ((((unsigned long)t)*100)/(SK_TICKS_PER_SEC)) - #endif - --/* -- * New SkOsGetTime -- */ - #define SkOsGetTimeCurrent(pAC, pUsec) {\ -+ static struct timeval prev_t; \ - struct timeval t;\ - do_gettimeofday(&t);\ -- *pUsec = ((((t.tv_sec) * 1000000L)+t.tv_usec)/10000);\ -+ if (prev_t.tv_sec == t.tv_sec) { \ -+ if (prev_t.tv_usec > t.tv_usec) { \ -+ t.tv_usec = prev_t.tv_usec; \ -+ } else { \ -+ prev_t.tv_usec = t.tv_usec; \ -+ } \ -+ } else { \ -+ prev_t = t; \ -+ } \ -+ *pUsec = ((t.tv_sec*100L)+(t.tv_usec/10000));\ - } - -+/****************************************************************************** -+ * -+ * Linux specific IOCTL defines and typedefs -+ * -+ ******************************************************************************/ - --/* -- * ioctl definitions -- */ --#define SK_IOCTL_BASE (SIOCDEVPRIVATE) --#define SK_IOCTL_GETMIB (SK_IOCTL_BASE + 0) --#define SK_IOCTL_SETMIB (SK_IOCTL_BASE + 1) --#define SK_IOCTL_PRESETMIB (SK_IOCTL_BASE + 2) --#define SK_IOCTL_GEN (SK_IOCTL_BASE + 3) --#define SK_IOCTL_DIAG (SK_IOCTL_BASE + 4) -- --typedef struct s_IOCTL SK_GE_IOCTL; -+#define SK_IOCTL_BASE (SIOCDEVPRIVATE) -+#define SK_IOCTL_GETMIB (SK_IOCTL_BASE + 0) -+#define SK_IOCTL_SETMIB (SK_IOCTL_BASE + 1) -+#define SK_IOCTL_PRESETMIB (SK_IOCTL_BASE + 2) -+#define SK_IOCTL_GEN (SK_IOCTL_BASE + 3) -+#define SK_IOCTL_DIAG (SK_IOCTL_BASE + 4) - -+typedef struct s_IOCTL SK_GE_IOCTL; - struct s_IOCTL { - char __user * pData; - unsigned int Len; - }; - -+/****************************************************************************** -+ * -+ * Generic sizes and length definitions -+ * -+ ******************************************************************************/ - --/* -- * define sizes of descriptor rings in bytes -- */ -- --#define TX_RING_SIZE (8*1024) --#define RX_RING_SIZE (24*1024) -- --/* -- * Buffer size for ethernet packets -- */ --#define ETH_BUF_SIZE 1540 --#define ETH_MAX_MTU 1514 --#define ETH_MIN_MTU 60 --#define ETH_MULTICAST_BIT 0x01 --#define SK_JUMBO_MTU 9000 -- --/* -- * transmit priority selects the queue: LOW=asynchron, HIGH=synchron -- */ --#define TX_PRIO_LOW 0 --#define TX_PRIO_HIGH 1 -+#define TX_RING_SIZE (24*1024) /* GEnesis/Yukon */ -+#define RX_RING_SIZE (24*1024) /* GEnesis/Yukon */ -+#define RX_MAX_NBR_BUFFERS 128 /* Yukon-EC/-II */ -+#define TX_MAX_NBR_BUFFERS 128 /* Yukon-EC/-II */ -+#define MAXIMUM_LOW_ADDRESS 0xFFFFFFFF /* Max. low address */ -+ -+#define ETH_BUF_SIZE 1560 /* multiples of 8 bytes */ -+#define ETH_MAX_MTU 1514 -+#define ETH_MIN_MTU 60 -+#define ETH_MULTICAST_BIT 0x01 -+#define SK_JUMBO_MTU 9000 -+ -+#define TX_PRIO_LOW 0 /* asynchronous queue */ -+#define TX_PRIO_HIGH 1 /* synchronous queue */ -+#define DESCR_ALIGN 64 /* alignment of Rx/Tx descriptors */ - --/* -- * alignment of rx/tx descriptors -- */ --#define DESCR_ALIGN 64 -+/****************************************************************************** -+ * -+ * PNMI related definitions -+ * -+ ******************************************************************************/ - --/* -- * definitions for pnmi. TODO -- */ - #define SK_DRIVER_RESET(pAC, IoC) 0 - #define SK_DRIVER_SENDEVENT(pAC, IoC) 0 - #define SK_DRIVER_SELFTEST(pAC, IoC) 0 -@@ -213,20 +247,16 @@ struct s_IOCTL { - #define SK_DRIVER_SET_MTU(pAc,IoC,i,v) 0 - #define SK_DRIVER_PRESET_MTU(pAc,IoC,i,v) 0 - --/* --** Interim definition of SK_DRV_TIMER placed in this file until --** common modules have boon finallized --*/ --#define SK_DRV_TIMER 11 --#define SK_DRV_MODERATION_TIMER 1 --#define SK_DRV_MODERATION_TIMER_LENGTH 1000000 /* 1 second */ --#define SK_DRV_RX_CLEANUP_TIMER 2 --#define SK_DRV_RX_CLEANUP_TIMER_LENGTH 1000000 /* 100 millisecs */ - --/* --** Definitions regarding transmitting frames --** any calculating any checksum. --*/ -+/****************************************************************************** -+ * -+ * Various offsets and sizes -+ * -+ ******************************************************************************/ -+ -+#define SK_DRV_MODERATION_TIMER 1 /* id */ -+#define SK_DRV_MODERATION_TIMER_LENGTH 1 /* 1 second */ -+ - #define C_LEN_ETHERMAC_HEADER_DEST_ADDR 6 - #define C_LEN_ETHERMAC_HEADER_SRC_ADDR 6 - #define C_LEN_ETHERMAC_HEADER_LENTYPE 2 -@@ -252,114 +282,445 @@ struct s_IOCTL { - #define C_PROTO_ID_UDP 17 /* refer to RFC 790 or Stevens' */ - #define C_PROTO_ID_TCP 6 /* TCP/IP illustrated for details */ - --/* TX and RX descriptors *****************************************************/ -+/****************************************************************************** -+ * -+ * Tx and Rx descriptor definitions -+ * -+ ******************************************************************************/ - - typedef struct s_RxD RXD; /* the receive descriptor */ -- - struct s_RxD { -- volatile SK_U32 RBControl; /* Receive Buffer Control */ -- SK_U32 VNextRxd; /* Next receive descriptor,low dword */ -- SK_U32 VDataLow; /* Receive buffer Addr, low dword */ -- SK_U32 VDataHigh; /* Receive buffer Addr, high dword */ -- SK_U32 FrameStat; /* Receive Frame Status word */ -- SK_U32 TimeStamp; /* Time stamp from XMAC */ -- SK_U32 TcpSums; /* TCP Sum 2 / TCP Sum 1 */ -- SK_U32 TcpSumStarts; /* TCP Sum Start 2 / TCP Sum Start 1 */ -- RXD *pNextRxd; /* Pointer to next Rxd */ -- struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */ -+ volatile SK_U32 RBControl; /* Receive Buffer Control */ -+ SK_U32 VNextRxd; /* Next receive descriptor,low dword */ -+ SK_U32 VDataLow; /* Receive buffer Addr, low dword */ -+ SK_U32 VDataHigh; /* Receive buffer Addr, high dword */ -+ SK_U32 FrameStat; /* Receive Frame Status word */ -+ SK_U32 TimeStamp; /* Time stamp from XMAC */ -+ SK_U32 TcpSums; /* TCP Sum 2 / TCP Sum 1 */ -+ SK_U32 TcpSumStarts; /* TCP Sum Start 2 / TCP Sum Start 1 */ -+ RXD *pNextRxd; /* Pointer to next Rxd */ -+ struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */ - }; - - typedef struct s_TxD TXD; /* the transmit descriptor */ -- - struct s_TxD { -- volatile SK_U32 TBControl; /* Transmit Buffer Control */ -- SK_U32 VNextTxd; /* Next transmit descriptor,low dword */ -- SK_U32 VDataLow; /* Transmit Buffer Addr, low dword */ -- SK_U32 VDataHigh; /* Transmit Buffer Addr, high dword */ -- SK_U32 FrameStat; /* Transmit Frame Status Word */ -- SK_U32 TcpSumOfs; /* Reserved / TCP Sum Offset */ -- SK_U16 TcpSumSt; /* TCP Sum Start */ -- SK_U16 TcpSumWr; /* TCP Sum Write */ -- SK_U32 TcpReserved; /* not used */ -- TXD *pNextTxd; /* Pointer to next Txd */ -- struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */ -+ volatile SK_U32 TBControl; /* Transmit Buffer Control */ -+ SK_U32 VNextTxd; /* Next transmit descriptor,low dword */ -+ SK_U32 VDataLow; /* Transmit Buffer Addr, low dword */ -+ SK_U32 VDataHigh; /* Transmit Buffer Addr, high dword */ -+ SK_U32 FrameStat; /* Transmit Frame Status Word */ -+ SK_U32 TcpSumOfs; /* Reserved / TCP Sum Offset */ -+ SK_U16 TcpSumSt; /* TCP Sum Start */ -+ SK_U16 TcpSumWr; /* TCP Sum Write */ -+ SK_U32 TcpReserved; /* not used */ -+ TXD *pNextTxd; /* Pointer to next Txd */ -+ struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */ -+}; -+ -+/****************************************************************************** -+ * -+ * Generic Yukon-II defines -+ * -+ ******************************************************************************/ -+ -+#define LE_SIZE sizeof(SK_HWLE) -+#define MAX_NUM_FRAGS (MAX_SKB_FRAGS + 1) -+#define MIN_LEN_OF_LE_TAB 128 -+#define MAX_LEN_OF_LE_TAB 4096 -+#define MAX_UNUSED_RX_LE_WORKING 8 -+#ifdef MAX_FRAG_OVERHEAD -+#undef MAX_FRAG_OVERHEAD -+#define MAX_FRAG_OVERHEAD 4 -+#endif -+// as we have a maximum of 16 physical fragments, -+// maximum 1 ADDR64 per physical fragment -+// maximum 4 LEs for VLAN, Csum, LargeSend, Packet -+#define MIN_LE_FREE_REQUIRED ((16*2) + 4) -+#define IS_GMAC(pAc) (!pAc->GIni.GIGenesis) -+#ifdef USE_SYNC_TX_QUEUE -+#define TXS_MAX_LE 256 -+#else /* !USE_SYNC_TX_QUEUE */ -+#define TXS_MAX_LE 0 -+#endif -+ -+#define ETHER_MAC_HDR_LEN (6+6+2) // MAC SRC ADDR, MAC DST ADDR, TYPE -+#define IP_HDR_LEN 20 -+#define TCP_CSUM_OFFS 0x10 -+#define UDP_CSUM_OFFS 0x06 -+#define TXA_MAX_LE 256 -+#define RX_MAX_LE 256 -+#define ST_MAX_LE (SK_MAX_MACS)*((3*RX_MAX_LE)+(TXA_MAX_LE)+(TXS_MAX_LE)) -+ -+#if (defined (Y2_RECOVERY) || defined (Y2_LE_CHECK)) -+/* event for recovery from tx hang or rx out of sync */ -+#define SK_DRV_RECOVER 17 -+#endif -+/****************************************************************************** -+ * -+ * Structures specific for Yukon-II -+ * -+ ******************************************************************************/ -+ -+typedef struct s_frag SK_FRAG; -+struct s_frag { -+ SK_FRAG *pNext; -+ char *pVirt; -+ SK_U64 pPhys; -+ unsigned int FragLen; - }; - --/* Used interrupt bits in the interrupts source register *********************/ -+typedef struct s_packet SK_PACKET; -+struct s_packet { -+ /* Common infos: */ -+ SK_PACKET *pNext; /* pointer for packet queues */ -+ unsigned int PacketLen; /* length of packet */ -+ unsigned int NumFrags; /* nbr of fragments (for Rx always 1) */ -+ SK_FRAG *pFrag; /* fragment list */ -+ SK_FRAG FragArray[MAX_NUM_FRAGS]; /* TX fragment array */ -+ unsigned int NextLE; /* next LE to use for the next packet */ -+ -+ /* Private infos: */ -+ struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */ -+}; -+ -+typedef struct s_queue SK_PKT_QUEUE; -+struct s_queue { -+ SK_PACKET *pHead; -+ SK_PACKET *pTail; -+ spinlock_t QueueLock; /* serialize packet accesses */ -+}; -+ -+/******************************************************************************* -+ * -+ * Macros specific for Yukon-II queues -+ * -+ ******************************************************************************/ -+ -+#define IS_Q_EMPTY(pQueue) ((pQueue)->pHead != NULL) ? SK_FALSE : SK_TRUE -+#define IS_Q_LOCKED(pQueue) spin_is_locked(&((pQueue)->QueueLock)) -+ -+#define PLAIN_POP_FIRST_PKT_FROM_QUEUE(pQueue, pPacket) { \ -+ if ((pQueue)->pHead != NULL) { \ -+ (pPacket) = (pQueue)->pHead; \ -+ (pQueue)->pHead = (pPacket)->pNext; \ -+ if ((pQueue)->pHead == NULL) { \ -+ (pQueue)->pTail = NULL; \ -+ } \ -+ (pPacket)->pNext = NULL; \ -+ } else { \ -+ (pPacket) = NULL; \ -+ } \ -+} -+ -+#define PLAIN_PUSH_PKT_AS_FIRST_IN_QUEUE(pQueue, pPacket) { \ -+ if ((pQueue)->pHead != NULL) { \ -+ (pPacket)->pNext = (pQueue)->pHead; \ -+ } else { \ -+ (pPacket)->pNext = NULL; \ -+ (pQueue)->pTail = (pPacket); \ -+ } \ -+ (pQueue)->pHead = (pPacket); \ -+} -+ -+#define PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(pQueue, pPacket) { \ -+ (pPacket)->pNext = NULL; \ -+ if ((pQueue)->pTail != NULL) { \ -+ (pQueue)->pTail->pNext = (pPacket); \ -+ } else { \ -+ (pQueue)->pHead = (pPacket); \ -+ } \ -+ (pQueue)->pTail = (pPacket); \ -+} -+ -+#define PLAIN_PUSH_MULTIPLE_PKT_AS_LAST_IN_QUEUE(pQueue,pPktGrpStart,pPktGrpEnd) { \ -+ if ((pPktGrpStart) != NULL) { \ -+ if ((pQueue)->pTail != NULL) { \ -+ (pQueue)->pTail->pNext = (pPktGrpStart); \ -+ } else { \ -+ (pQueue)->pHead = (pPktGrpStart); \ -+ } \ -+ (pQueue)->pTail = (pPktGrpEnd); \ -+ } \ -+} -+ -+/* Required: 'Flags' */ -+#define POP_FIRST_PKT_FROM_QUEUE(pQueue, pPacket) { \ -+ spin_lock_irqsave(&((pQueue)->QueueLock), Flags); \ -+ if ((pQueue)->pHead != NULL) { \ -+ (pPacket) = (pQueue)->pHead; \ -+ (pQueue)->pHead = (pPacket)->pNext; \ -+ if ((pQueue)->pHead == NULL) { \ -+ (pQueue)->pTail = NULL; \ -+ } \ -+ (pPacket)->pNext = NULL; \ -+ } else { \ -+ (pPacket) = NULL; \ -+ } \ -+ spin_unlock_irqrestore(&((pQueue)->QueueLock), Flags); \ -+} -+ -+/* Required: 'Flags' */ -+#define PUSH_PKT_AS_FIRST_IN_QUEUE(pQueue, pPacket) { \ -+ spin_lock_irqsave(&(pQueue)->QueueLock, Flags); \ -+ if ((pQueue)->pHead != NULL) { \ -+ (pPacket)->pNext = (pQueue)->pHead; \ -+ } else { \ -+ (pPacket)->pNext = NULL; \ -+ (pQueue)->pTail = (pPacket); \ -+ } \ -+ (pQueue)->pHead = (pPacket); \ -+ spin_unlock_irqrestore(&(pQueue)->QueueLock, Flags); \ -+} -+ -+/* Required: 'Flags' */ -+#define PUSH_PKT_AS_LAST_IN_QUEUE(pQueue, pPacket) { \ -+ (pPacket)->pNext = NULL; \ -+ spin_lock_irqsave(&(pQueue)->QueueLock, Flags); \ -+ if ((pQueue)->pTail != NULL) { \ -+ (pQueue)->pTail->pNext = (pPacket); \ -+ } else { \ -+ (pQueue)->pHead = (pPacket); \ -+ } \ -+ (pQueue)->pTail = (pPacket); \ -+ spin_unlock_irqrestore(&(pQueue)->QueueLock, Flags); \ -+} -+ -+/* Required: 'Flags' */ -+#define PUSH_MULTIPLE_PKT_AS_LAST_IN_QUEUE(pQueue,pPktGrpStart,pPktGrpEnd) { \ -+ if ((pPktGrpStart) != NULL) { \ -+ spin_lock_irqsave(&(pQueue)->QueueLock, Flags); \ -+ if ((pQueue)->pTail != NULL) { \ -+ (pQueue)->pTail->pNext = (pPktGrpStart); \ -+ } else { \ -+ (pQueue)->pHead = (pPktGrpStart); \ -+ } \ -+ (pQueue)->pTail = (pPktGrpEnd); \ -+ spin_unlock_irqrestore(&(pQueue)->QueueLock, Flags); \ -+ } \ -+} -+ -+/* -+ *Check if the low address (32 bit) is near the 4G limit or over it. -+ * Set the high address to a wrong value. -+ * Doing so we force to write the ADDR64 LE. -+ */ -+#define CHECK_LOW_ADDRESS( _HighAddress, _LowAddress , _Length) { \ -+ if ((~0-_LowAddress) <_Length) { \ -+ _HighAddress= MAXIMUM_LOW_ADDRESS; \ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, \ -+ ("High Address must be set for HW. LowAddr = %d Length = %d\n", \ -+ _LowAddress, _Length)); \ -+ } \ -+} -+ -+/******************************************************************************* -+ * -+ * Macros specific for Yukon-II queues (tist) -+ * -+ ******************************************************************************/ -+ -+#ifdef USE_TIST_FOR_RESET -+/* port is fully operational */ -+#define SK_PSTATE_NOT_WAITING_FOR_TIST 0 -+/* port in reset until any tist LE */ -+#define SK_PSTATE_WAITING_FOR_ANY_TIST BIT_0 -+/* port in reset until timer reaches pAC->MinTistLo */ -+#define SK_PSTATE_WAITING_FOR_SPECIFIC_TIST BIT_1 -+#define SK_PSTATE_PORT_SHIFT 4 -+#define SK_PSTATE_PORT_MASK ((1 << SK_PSTATE_PORT_SHIFT) - 1) -+ -+/* use this + Port to build OP_MOD_TXINDEX_NO_PORT_A|B */ -+#define OP_MOD_TXINDEX 0x71 -+/* opcode for a TX_INDEX LE in which Port A has to be ignored */ -+#define OP_MOD_TXINDEX_NO_PORT_A 0x71 -+/* opcode for a TX_INDEX LE in which Port B has to be ignored */ -+#define OP_MOD_TXINDEX_NO_PORT_B 0x72 -+/* opcode for LE to be ignored because port is still in reset */ -+#define OP_MOD_LE 0x7F -+ -+/* set tist wait mode Bit for port */ -+#define SK_SET_WAIT_BIT_FOR_PORT(pAC, Bit, Port) \ -+ { \ -+ (pAC)->AdapterResetState |= ((Bit) << (SK_PSTATE_PORT_SHIFT * Port)); \ -+ } -+ -+/* reset tist waiting for specified port */ -+#define SK_CLR_STATE_FOR_PORT(pAC, Port) \ -+ { \ -+ (pAC)->AdapterResetState &= \ -+ ~(SK_PSTATE_PORT_MASK << (SK_PSTATE_PORT_SHIFT * Port)); \ -+ } -+ -+/* return SK_TRUE when port is in reset waiting for tist */ -+#define SK_PORT_WAITING_FOR_TIST(pAC, Port) \ -+ ((((pAC)->AdapterResetState >> (SK_PSTATE_PORT_SHIFT * Port)) & \ -+ SK_PSTATE_PORT_MASK) != SK_PSTATE_NOT_WAITING_FOR_TIST) -+ -+/* return SK_TRUE when port is in reset waiting for any tist */ -+#define SK_PORT_WAITING_FOR_ANY_TIST(pAC, Port) \ -+ ((((pAC)->AdapterResetState >> (SK_PSTATE_PORT_SHIFT * Port)) & \ -+ SK_PSTATE_WAITING_FOR_ANY_TIST) == SK_PSTATE_WAITING_FOR_ANY_TIST) -+ -+/* return SK_TRUE when port is in reset waiting for a specific tist */ -+#define SK_PORT_WAITING_FOR_SPECIFIC_TIST(pAC, Port) \ -+ ((((pAC)->AdapterResetState >> (SK_PSTATE_PORT_SHIFT * Port)) & \ -+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST) == \ -+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST) -+ -+/* return whether adapter is expecting a tist LE */ -+#define SK_ADAPTER_WAITING_FOR_TIST(pAC) ((pAC)->AdapterResetState != 0) -+ -+/* enable timestamp timer and force creation of tist LEs */ -+#define Y2_ENABLE_TIST(IoC) \ -+ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8) GMT_ST_START) -+ -+/* disable timestamp timer and stop creation of tist LEs */ -+#define Y2_DISABLE_TIST(IoC) \ -+ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8) GMT_ST_STOP) -+ -+/* get current value of timestamp timer */ -+#define Y2_GET_TIST_LOW_VAL(IoC, pVal) \ -+ SK_IN32(IoC, GMAC_TI_ST_VAL, pVal) - --#define DRIVER_IRQS ((IS_IRQ_SW) | \ -- (IS_R1_F) |(IS_R2_F) | \ -- (IS_XS1_F) |(IS_XA1_F) | \ -- (IS_XS2_F) |(IS_XA2_F)) -- --#define SPECIAL_IRQS ((IS_HW_ERR) |(IS_I2C_READY) | \ -- (IS_EXT_REG) |(IS_TIMINT) | \ -- (IS_PA_TO_RX1) |(IS_PA_TO_RX2) | \ -- (IS_PA_TO_TX1) |(IS_PA_TO_TX2) | \ -- (IS_MAC1) |(IS_LNK_SYNC_M1)| \ -- (IS_MAC2) |(IS_LNK_SYNC_M2)| \ -- (IS_R1_C) |(IS_R2_C) | \ -- (IS_XS1_C) |(IS_XA1_C) | \ -- (IS_XS2_C) |(IS_XA2_C)) -- --#define IRQ_MASK ((IS_IRQ_SW) | \ -- (IS_R1_B) |(IS_R1_F) |(IS_R2_B) |(IS_R2_F) | \ -- (IS_XS1_B) |(IS_XS1_F) |(IS_XA1_B)|(IS_XA1_F)| \ -- (IS_XS2_B) |(IS_XS2_F) |(IS_XA2_B)|(IS_XA2_F)| \ -- (IS_HW_ERR) |(IS_I2C_READY)| \ -- (IS_EXT_REG) |(IS_TIMINT) | \ -- (IS_PA_TO_RX1) |(IS_PA_TO_RX2)| \ -- (IS_PA_TO_TX1) |(IS_PA_TO_TX2)| \ -- (IS_MAC1) |(IS_MAC2) | \ -- (IS_R1_C) |(IS_R2_C) | \ -- (IS_XS1_C) |(IS_XA1_C) | \ -- (IS_XS2_C) |(IS_XA2_C)) -+#endif - --#define IRQ_HWE_MASK (IS_ERR_MSK) /* enable all HW irqs */ -+ -+/******************************************************************************* -+ * -+ * Used interrupt bits in the interrupts source register -+ * -+ ******************************************************************************/ -+ -+#define DRIVER_IRQS ((IS_IRQ_SW) | \ -+ (IS_R1_F) | (IS_R2_F) | \ -+ (IS_XS1_F) | (IS_XA1_F) | \ -+ (IS_XS2_F) | (IS_XA2_F)) -+ -+#define TX_COMPL_IRQS ((IS_XS1_B) | (IS_XS1_F) | \ -+ (IS_XA1_B) | (IS_XA1_F) | \ -+ (IS_XS2_B) | (IS_XS2_F) | \ -+ (IS_XA2_B) | (IS_XA2_F)) -+ -+#define NAPI_DRV_IRQS ((IS_R1_F) | (IS_R2_F) | \ -+ (IS_XS1_F) | (IS_XA1_F)| \ -+ (IS_XS2_F) | (IS_XA2_F)) -+ -+#define Y2_DRIVER_IRQS ((Y2_IS_STAT_BMU) | (Y2_IS_IRQ_SW) | (Y2_IS_POLL_CHK)) -+ -+#define SPECIAL_IRQS ((IS_HW_ERR) |(IS_I2C_READY) | \ -+ (IS_EXT_REG) |(IS_TIMINT) | \ -+ (IS_PA_TO_RX1) |(IS_PA_TO_RX2) | \ -+ (IS_PA_TO_TX1) |(IS_PA_TO_TX2) | \ -+ (IS_MAC1) |(IS_LNK_SYNC_M1)| \ -+ (IS_MAC2) |(IS_LNK_SYNC_M2)| \ -+ (IS_R1_C) |(IS_R2_C) | \ -+ (IS_XS1_C) |(IS_XA1_C) | \ -+ (IS_XS2_C) |(IS_XA2_C)) -+ -+#define Y2_SPECIAL_IRQS ((Y2_IS_HW_ERR) |(Y2_IS_ASF) | \ -+ (Y2_IS_TWSI_RDY) |(Y2_IS_TIMINT) | \ -+ (Y2_IS_IRQ_PHY2) |(Y2_IS_IRQ_MAC2) | \ -+ (Y2_IS_CHK_RX2) |(Y2_IS_CHK_TXS2) | \ -+ (Y2_IS_CHK_TXA2) |(Y2_IS_IRQ_PHY1) | \ -+ (Y2_IS_IRQ_MAC1) |(Y2_IS_CHK_RX1) | \ -+ (Y2_IS_CHK_TXS1) |(Y2_IS_CHK_TXA1)) -+ -+#define IRQ_MASK ((IS_IRQ_SW) | \ -+ (IS_R1_F) |(IS_R2_F) | \ -+ (IS_XS1_F) |(IS_XA1_F) | \ -+ (IS_XS2_F) |(IS_XA2_F) | \ -+ (IS_HW_ERR) |(IS_I2C_READY)| \ -+ (IS_EXT_REG) |(IS_TIMINT) | \ -+ (IS_PA_TO_RX1) |(IS_PA_TO_RX2)| \ -+ (IS_PA_TO_TX1) |(IS_PA_TO_TX2)| \ -+ (IS_MAC1) |(IS_MAC2) | \ -+ (IS_R1_C) |(IS_R2_C) | \ -+ (IS_XS1_C) |(IS_XA1_C) | \ -+ (IS_XS2_C) |(IS_XA2_C)) -+ -+#define Y2_IRQ_MASK ((Y2_DRIVER_IRQS) | (Y2_SPECIAL_IRQS)) -+ -+#define IRQ_HWE_MASK (IS_ERR_MSK) /* enable all HW irqs */ -+#define Y2_IRQ_HWE_MASK (Y2_HWE_ALL_MSK) /* enable all HW irqs */ - - typedef struct s_DevNet DEV_NET; - - struct s_DevNet { -- struct proc_dir_entry *proc; -- int PortNr; -- int NetNr; -- int Mtu; -- int Up; -- SK_AC *pAC; -+ struct proc_dir_entry *proc; -+ int PortNr; -+ int NetNr; -+ char InitialDevName[20]; -+ SK_BOOL NetConsoleMode; -+#ifdef Y2_RECOVERY -+ struct timer_list KernelTimer; /* Kernel timer struct */ -+ int TransmitTimeoutTimer; /* Transmit timer */ -+ SK_BOOL TimerExpired; /* Transmit timer */ -+ SK_BOOL InRecover; /* Recover flag */ -+#ifdef Y2_RX_CHECK -+ SK_U32 PreviousMACFifoRP; /* Backup of the FRP */ -+ SK_U32 PreviousMACFifoRLev; /* Backup of the FRL */ -+ SK_U32 PreviousRXFifoRP; /* Backup of the RX FRP */ -+ SK_U8 PreviousRXFifoRLev; /* Backup of the RX FRL */ -+ SK_U32 LastJiffies; /* Backup of the jiffies*/ -+#endif -+#endif -+ SK_AC *pAC; - }; - --typedef struct s_TxPort TX_PORT; -+/******************************************************************************* -+ * -+ * Rx/Tx Port structures -+ * -+ ******************************************************************************/ - --struct s_TxPort { -- /* the transmit descriptor rings */ -- caddr_t pTxDescrRing; /* descriptor area memory */ -- SK_U64 VTxDescrRing; /* descr. area bus virt. addr. */ -- TXD *pTxdRingHead; /* Head of Tx rings */ -- TXD *pTxdRingTail; /* Tail of Tx rings */ -- TXD *pTxdRingPrev; /* descriptor sent previously */ -- int TxdRingFree; /* # of free entrys */ -- spinlock_t TxDesRingLock; /* serialize descriptor accesses */ -- caddr_t HwAddr; /* bmu registers address */ -- int PortIndex; /* index number of port (0 or 1) */ -+typedef struct s_TxPort TX_PORT; -+struct s_TxPort { /* the transmit descriptor rings */ -+ caddr_t pTxDescrRing; /* descriptor area memory */ -+ SK_U64 VTxDescrRing; /* descr. area bus virt. addr. */ -+ TXD *pTxdRingHead; /* Head of Tx rings */ -+ TXD *pTxdRingTail; /* Tail of Tx rings */ -+ TXD *pTxdRingPrev; /* descriptor sent previously */ -+ int TxdRingPrevFree;/* previously # of free entrys */ -+ int TxdRingFree; /* # of free entrys */ -+ spinlock_t TxDesRingLock; /* serialize descriptor accesses */ -+ caddr_t HwAddr; /* bmu registers address */ -+ int PortIndex; /* index number of port (0 or 1) */ -+ SK_PACKET *TransmitPacketTable; -+ SK_LE_TABLE TxALET; /* tx (async) list element table */ -+ SK_LE_TABLE TxSLET; /* tx (sync) list element table */ -+ SK_PKT_QUEUE TxQ_free; -+ SK_PKT_QUEUE TxAQ_waiting; -+ SK_PKT_QUEUE TxSQ_waiting; -+ SK_PKT_QUEUE TxAQ_working; -+ SK_PKT_QUEUE TxSQ_working; -+ unsigned LastDone; - }; - --typedef struct s_RxPort RX_PORT; -- --struct s_RxPort { -- /* the receive descriptor rings */ -- caddr_t pRxDescrRing; /* descriptor area memory */ -- SK_U64 VRxDescrRing; /* descr. area bus virt. addr. */ -- RXD *pRxdRingHead; /* Head of Rx rings */ -- RXD *pRxdRingTail; /* Tail of Rx rings */ -- RXD *pRxdRingPrev; /* descriptor given to BMU previously */ -- int RxdRingFree; /* # of free entrys */ -- spinlock_t RxDesRingLock; /* serialize descriptor accesses */ -- int RxFillLimit; /* limit for buffers in ring */ -- caddr_t HwAddr; /* bmu registers address */ -- int PortIndex; /* index number of port (0 or 1) */ -+typedef struct s_RxPort RX_PORT; -+struct s_RxPort { /* the receive descriptor rings */ -+ caddr_t pRxDescrRing; /* descriptor area memory */ -+ SK_U64 VRxDescrRing; /* descr. area bus virt. addr. */ -+ RXD *pRxdRingHead; /* Head of Rx rings */ -+ RXD *pRxdRingTail; /* Tail of Rx rings */ -+ RXD *pRxdRingPrev; /* descr given to BMU previously */ -+ int RxdRingFree; /* # of free entrys */ -+ spinlock_t RxDesRingLock; /* serialize descriptor accesses */ -+ int RxFillLimit; /* limit for buffers in ring */ -+ caddr_t HwAddr; /* bmu registers address */ -+ int PortIndex; /* index number of port (0 or 1) */ -+ SK_BOOL UseRxCsum; /* use Rx checksumming (yes/no) */ -+ SK_PACKET *ReceivePacketTable; -+ SK_LE_TABLE RxLET; /* rx list element table */ -+ SK_PKT_QUEUE RxQ_working; -+ SK_PKT_QUEUE RxQ_waiting; -+ int RxBufSize; - }; - --/* Definitions needed for interrupt moderation *******************************/ -+/******************************************************************************* -+ * -+ * Interrupt masks used in combination with interrupt moderation -+ * -+ ******************************************************************************/ - - #define IRQ_EOF_AS_TX ((IS_XA1_F) | (IS_XA2_F)) - #define IRQ_EOF_SY_TX ((IS_XS1_F) | (IS_XS2_F)) -@@ -371,139 +732,151 @@ struct s_RxPort { - #define IRQ_MASK_SP_TX ((SPECIAL_IRQS) | (IRQ_MASK_TX_ONLY)) - #define IRQ_MASK_RX_TX_SP ((SPECIAL_IRQS) | (IRQ_MASK_TX_RX)) - --#define C_INT_MOD_NONE 1 --#define C_INT_MOD_STATIC 2 --#define C_INT_MOD_DYNAMIC 4 -- --#define C_CLK_FREQ_GENESIS 53215000 /* shorter: 53.125 MHz */ --#define C_CLK_FREQ_YUKON 78215000 /* shorter: 78.125 MHz */ -- --#define C_INTS_PER_SEC_DEFAULT 2000 --#define C_INT_MOD_ENABLE_PERCENTAGE 50 /* if higher 50% enable */ --#define C_INT_MOD_DISABLE_PERCENTAGE 50 /* if lower 50% disable */ --#define C_INT_MOD_IPS_LOWER_RANGE 30 --#define C_INT_MOD_IPS_UPPER_RANGE 40000 -- -- --typedef struct s_DynIrqModInfo DIM_INFO; --struct s_DynIrqModInfo { -- unsigned long PrevTimeVal; -- unsigned int PrevSysLoad; -- unsigned int PrevUsedTime; -- unsigned int PrevTotalTime; -- int PrevUsedDescrRatio; -- int NbrProcessedDescr; -- SK_U64 PrevPort0RxIntrCts; -- SK_U64 PrevPort1RxIntrCts; -- SK_U64 PrevPort0TxIntrCts; -- SK_U64 PrevPort1TxIntrCts; -- SK_BOOL ModJustEnabled; /* Moderation just enabled yes/no */ -- -- int MaxModIntsPerSec; /* Moderation Threshold */ -- int MaxModIntsPerSecUpperLimit; /* Upper limit for DIM */ -- int MaxModIntsPerSecLowerLimit; /* Lower limit for DIM */ -- -- long MaskIrqModeration; /* ModIrqType (eg. 'TxRx') */ -- SK_BOOL DisplayStats; /* Stats yes/no */ -- SK_BOOL AutoSizing; /* Resize DIM-timer on/off */ -- int IntModTypeSelect; /* EnableIntMod (eg. 'dynamic') */ -+#define IRQ_MASK_Y2_TX_ONLY (Y2_IS_STAT_BMU) -+#define IRQ_MASK_Y2_RX_ONLY (Y2_IS_STAT_BMU) -+#define IRQ_MASK_Y2_SP_ONLY (SPECIAL_IRQS) -+#define IRQ_MASK_Y2_TX_RX ((IRQ_MASK_TX_ONLY)| (IRQ_MASK_RX_ONLY)) -+#define IRQ_MASK_Y2_SP_RX ((SPECIAL_IRQS) | (IRQ_MASK_RX_ONLY)) -+#define IRQ_MASK_Y2_SP_TX ((SPECIAL_IRQS) | (IRQ_MASK_TX_ONLY)) -+#define IRQ_MASK_Y2_RX_TX_SP ((SPECIAL_IRQS) | (IRQ_MASK_TX_RX)) - -- SK_TIMER ModTimer; /* just some timer */ --}; -+/******************************************************************************* -+ * -+ * Defines and typedefs regarding interrupt moderation -+ * -+ ******************************************************************************/ - --typedef struct s_PerStrm PER_STRM; -+#define C_INT_MOD_NONE 1 -+#define C_INT_MOD_STATIC 2 -+#define C_INT_MOD_DYNAMIC 4 -+ -+#define C_CLK_FREQ_GENESIS 53215000 /* or: 53.125 MHz */ -+#define C_CLK_FREQ_YUKON 78215000 /* or: 78.125 MHz */ -+#define C_CLK_FREQ_YUKON_EC 125000000 /* or: 125.000 MHz */ -+ -+#define C_Y2_INTS_PER_SEC_DEFAULT 5000 -+#define C_INTS_PER_SEC_DEFAULT 2000 -+#define C_INT_MOD_IPS_LOWER_RANGE 30 /* in IRQs/second */ -+#define C_INT_MOD_IPS_UPPER_RANGE 40000 /* in IRQs/second */ -+ -+typedef struct s_DynIrqModInfo { -+ SK_U64 PrevPort0RxIntrCts; -+ SK_U64 PrevPort1RxIntrCts; -+ SK_U64 PrevPort0TxIntrCts; -+ SK_U64 PrevPort1TxIntrCts; -+ SK_U64 PrevPort0StatusLeIntrCts; -+ SK_U64 PrevPort1StatusLeIntrCts; -+ int MaxModIntsPerSec; /* Moderation Threshold */ -+ int MaxModIntsPerSecUpperLimit; /* Upper limit for DIM */ -+ int MaxModIntsPerSecLowerLimit; /* Lower limit for DIM */ -+ long MaskIrqModeration; /* IRQ Mask (eg. 'TxRx') */ -+ int IntModTypeSelect; /* Type (eg. 'dynamic') */ -+ int DynIrqModSampleInterval; /* expressed in seconds! */ -+ SK_TIMER ModTimer; /* Timer for dynamic mod. */ -+} DIM_INFO; - --#define SK_ALLOC_IRQ 0x00000001 -+/******************************************************************************* -+ * -+ * Defines and typedefs regarding wake-on-lan -+ * -+ ******************************************************************************/ -+ -+typedef struct s_WakeOnLanInfo { -+ SK_U32 SupportedWolOptions; /* e.g. WAKE_PHY... */ -+ SK_U32 ConfiguredWolOptions; /* e.g. WAKE_PHY... */ -+} WOL_INFO; - --#ifdef SK_DIAG_SUPPORT -+#define SK_ALLOC_IRQ 0x00000001 - #define DIAG_ACTIVE 1 - #define DIAG_NOTACTIVE 0 --#endif - - /**************************************************************************** -+ * - * Per board structure / Adapter Context structure: -- * Allocated within attach(9e) and freed within detach(9e). -- * Contains all 'per device' necessary handles, flags, locks etc.: -- */ -+ * Contains all 'per device' necessary handles, flags, locks etc.: -+ * -+ ******************************************************************************/ -+ - struct s_AC { -- SK_GEINIT GIni; /* GE init struct */ -- SK_PNMI Pnmi; /* PNMI data struct */ -- SK_VPD vpd; /* vpd data struct */ -- SK_QUEUE Event; /* Event queue */ -- SK_HWT Hwt; /* Hardware Timer control struct */ -- SK_TIMCTRL Tim; /* Software Timer control struct */ -- SK_I2C I2c; /* I2C relevant data structure */ -- SK_ADDR Addr; /* for Address module */ -- SK_CSUM Csum; /* for checksum module */ -- SK_RLMT Rlmt; /* for rlmt module */ -- spinlock_t SlowPathLock; /* Normal IRQ lock */ -- SK_PNMI_STRUCT_DATA PnmiStruct; /* structure to get all Pnmi-Data */ -- int RlmtMode; /* link check mode to set */ -- int RlmtNets; /* Number of nets */ -- -- SK_IOC IoBase; /* register set of adapter */ -- int BoardLevel; /* level of active hw init (0-2) */ -- char DeviceStr[80]; /* adapter string from vpd */ -- SK_U32 AllocFlag; /* flag allocation of resources */ -- struct pci_dev *PciDev; /* for access to pci config space */ -- SK_U32 PciDevId; /* pci device id */ -- struct SK_NET_DEVICE *dev[2]; /* pointer to device struct */ -- char Name[30]; /* driver name */ -- struct SK_NET_DEVICE *Next; /* link all devices (for clearing) */ -- int RxBufSize; /* length of receive buffers */ -- struct net_device_stats stats; /* linux 'netstat -i' statistics */ -- int Index; /* internal board index number */ -- -- /* adapter RAM sizes for queues of active port */ -- int RxQueueSize; /* memory used for receive queue */ -- int TxSQueueSize; /* memory used for sync. tx queue */ -- int TxAQueueSize; /* memory used for async. tx queue */ -- -- int PromiscCount; /* promiscuous mode counter */ -- int AllMultiCount; /* allmulticast mode counter */ -- int MulticCount; /* number of different MC */ -- /* addresses for this board */ -- /* (may be more than HW can)*/ -- -- int HWRevision; /* Hardware revision */ -- int ActivePort; /* the active XMAC port */ -- int MaxPorts; /* number of activated ports */ -- int TxDescrPerRing; /* # of descriptors per tx ring */ -- int RxDescrPerRing; /* # of descriptors per rx ring */ -- -- caddr_t pDescrMem; /* Pointer to the descriptor area */ -- dma_addr_t pDescrMemDMA; /* PCI DMA address of area */ -- -- /* the port structures with descriptor rings */ -- TX_PORT TxPort[SK_MAX_MACS][2]; -- RX_PORT RxPort[SK_MAX_MACS]; -- -- unsigned int CsOfs1; /* for checksum calculation */ -- unsigned int CsOfs2; /* for checksum calculation */ -- SK_U32 CsOfs; /* for checksum calculation */ -- -- SK_BOOL CheckQueue; /* check event queue soon */ -- SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */ -- DIM_INFO DynIrqModInfo; /* all data related to DIM */ -- -- /* Only for tests */ -- int PortUp; -- int PortDown; -- int ChipsetType; /* Chipset family type -- * 0 == Genesis family support -- * 1 == Yukon family support -- */ --#ifdef SK_DIAG_SUPPORT -- SK_U32 DiagModeActive; /* is diag active? */ -- SK_BOOL DiagFlowCtrl; /* for control purposes */ -- SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for all Pnmi-Data */ -- SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while -- * DIAG is busy with NIC -- */ -+ SK_GEINIT GIni; /* GE init struct */ -+ SK_PNMI Pnmi; /* PNMI data struct */ -+ SK_VPD vpd; /* vpd data struct */ -+ SK_QUEUE Event; /* Event queue */ -+ SK_HWT Hwt; /* Hardware Timer ctrl struct */ -+ SK_TIMCTRL Tim; /* Software Timer ctrl struct */ -+ SK_I2C I2c; /* I2C relevant data structure*/ -+ SK_ADDR Addr; /* for Address module */ -+ SK_CSUM Csum; /* for checksum module */ -+ SK_RLMT Rlmt; /* for rlmt module */ -+ spinlock_t SlowPathLock; /* Normal IRQ lock */ -+ spinlock_t InitLock; /* Init lock */ -+ spinlock_t TxQueueLock; /* TX Queue lock */ -+ SK_PNMI_STRUCT_DATA PnmiStruct; /* struct for all Pnmi-Data */ -+ int RlmtMode; /* link check mode to set */ -+ int RlmtNets; /* Number of nets */ -+ SK_IOC IoBase; /* register set of adapter */ -+ int BoardLevel; /* level of hw init (0-2) */ -+ char DeviceStr[80]; /* adapter string from vpd */ -+ SK_U32 AllocFlag; /* alloc flag of resources */ -+ struct pci_dev *PciDev; /* for access to pci cfg space*/ -+ SK_U32 PciDevId; /* pci device id */ -+ struct SK_NET_DEVICE *dev[2]; /* pointer to device struct */ -+ char Name[30]; /* driver name */ -+ struct SK_NET_DEVICE *Next; /* link all devs for cleanup */ -+ struct net_device_stats stats; /* linux 'netstat -i' stats */ -+ int Index; /* internal board idx number */ -+ int RxQueueSize; /* memory used for RX queue */ -+ int TxSQueueSize; /* memory used for TXS queue */ -+ int TxAQueueSize; /* memory used for TXA queue */ -+ int PromiscCount; /* promiscuous mode counter */ -+ int AllMultiCount; /* allmulticast mode counter */ -+ int MulticCount; /* number of MC addresses used*/ -+ int HWRevision; /* Hardware revision */ -+ int ActivePort; /* the active XMAC port */ -+ int MaxPorts; /* number of activated ports */ -+ int TxDescrPerRing;/* # of descriptors TX ring */ -+ int RxDescrPerRing;/* # of descriptors RX ring */ -+ caddr_t pDescrMem; /* Ptr to the descriptor area */ -+ dma_addr_t pDescrMemDMA; /* PCI DMA address of area */ -+ SK_U32 PciState[16]; /* PCI state */ -+ TX_PORT TxPort[SK_MAX_MACS][2]; -+ RX_PORT RxPort[SK_MAX_MACS]; -+ SK_LE_TABLE StatusLETable; -+ unsigned SizeOfAlignedLETables; -+ spinlock_t SetPutIndexLock; -+ int MaxUnusedRxLeWorking; -+ unsigned int CsOfs1; /* for checksum calculation */ -+ unsigned int CsOfs2; /* for checksum calculation */ -+ SK_U32 CsOfs; /* for checksum calculation */ -+ SK_BOOL CheckQueue; /* check event queue soon */ -+ DIM_INFO DynIrqModInfo; /* all data related to IntMod */ -+ WOL_INFO WolInfo; /* all info regarding WOL */ -+ int ChipsetType; /* 0=GENESIS; 1=Yukon */ -+ SK_BOOL LowLatency; /* LowLatency optimization on?*/ -+ SK_U32 DiagModeActive;/* is diag active? */ -+ SK_BOOL DiagFlowCtrl; /* for control purposes */ -+ SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for PNMI */ -+ SK_BOOL WasIfUp[SK_MAX_MACS]; -+#ifdef USE_TIST_FOR_RESET -+ int AdapterResetState; -+ SK_U32 MinTistLo; -+ SK_U32 MinTistHi; -+#endif -+#ifdef Y2_RECOVERY -+ int LastPort; /* port for curr. handled rx */ -+ int LastOpc; /* last rx LEs opcode */ -+#endif -+#ifdef Y2_SYNC_CHECK -+ unsigned long FramesWithoutSyncCheck; /* since last check */ - #endif -- - }; - - --#endif /* __INC_SKDRV2ND_H */ - -+#endif -+ -+/******************************************************************************* -+ * -+ * End of file -+ * -+ ******************************************************************************/ ---- ./drivers/net/sk98lin/h/skerror.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skerror.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skerror.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.7 $ -- * Date: $Date: 2003/05/13 17:25:13 $ -+ * Version: $Revision: 2.3 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: SK specific Error log support - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2004 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -36,7 +37,6 @@ - #define SK_ERRCL_HW (1L<<4) /* Hardware Failure */ - #define SK_ERRCL_COMM (1L<<5) /* Communication error */ - -- - /* - * Define Error Code Bases - */ -@@ -49,7 +49,9 @@ - #define SK_ERRBASE_I2C 700 /* Base Error number for I2C module */ - #define SK_ERRBASE_QUEUE 800 /* Base Error number for Scheduler */ - #define SK_ERRBASE_ADDR 900 /* Base Error number for Address module */ --#define SK_ERRBASE_PECP 1000 /* Base Error number for PECP */ -+#define SK_ERRBASE_PECP 1000 /* Base Error number for PECP */ - #define SK_ERRBASE_DRV 1100 /* Base Error number for Driver */ -+#define SK_ERRBASE_ASF 1200 /* Base Error number for ASF */ - - #endif /* _INC_SKERROR_H_ */ -+ ---- ./drivers/net/sk98lin/h/skgedrv.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgedrv.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skgedrv.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.10 $ -- * Date: $Date: 2003/07/04 12:25:01 $ -+ * Version: $Revision: 2.3 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: Interface with the driver - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -33,7 +34,7 @@ - * In case of the driver we put the definition of the events here. - */ - #define SK_DRV_PORT_RESET 1 /* The port needs to be reset */ --#define SK_DRV_NET_UP 2 /* The net is operational */ -+#define SK_DRV_NET_UP 2 /* The net is operational */ - #define SK_DRV_NET_DOWN 3 /* The net is down */ - #define SK_DRV_SWITCH_SOFT 4 /* Ports switch with both links connected */ - #define SK_DRV_SWITCH_HARD 5 /* Port switch due to link failure */ -@@ -44,8 +45,9 @@ - #define SK_DRV_POWER_DOWN 10 /* Power down mode */ - #define SK_DRV_TIMER 11 /* Timer for free use */ - #ifdef SK_NO_RLMT --#define SK_DRV_LINK_UP 12 /* Link Up event for driver */ -+#define SK_DRV_LINK_UP 12 /* Link Up event for driver */ - #define SK_DRV_LINK_DOWN 13 /* Link Down event for driver */ - #endif - #define SK_DRV_DOWNSHIFT_DET 14 /* Downshift 4-Pair / 2-Pair (YUKON only) */ -+#define SK_DRV_RX_OVERFLOW 15 /* Receive Overflow */ - #endif /* __INC_SKGEDRV_H_ */ ---- ./drivers/net/sk98lin/h/skgehw.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgehw.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skgehw.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.56 $ -- * Date: $Date: 2003/09/23 09:01:00 $ -+ * Version: $Revision: 2.62 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: Defines and Macros for the Gigabit Ethernet Adapter Product Family - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -114,6 +115,16 @@ extern "C" { - #define SHIFT1(x) ((x) << 1) - #define SHIFT0(x) ((x) << 0) - -+/* Macro for arbitrary alignment of a given pointer */ -+#define ALIGN_ADDR( ADDRESS, GRANULARITY ) { \ -+ SK_UPTR addr = (SK_UPTR)(ADDRESS); \ -+ if (addr & ((GRANULARITY)-1)) { \ -+ addr += (GRANULARITY); \ -+ addr &= ~(SK_UPTR)((GRANULARITY)-1); \ -+ ADDRESS = (void *)addr; \ -+ }\ -+} -+ - /* - * Configuration Space header - * Since this module is used for different OS', those may be -@@ -132,34 +143,81 @@ extern "C" { - #define PCI_BIST 0x0f /* 8 bit Built-in selftest */ - #define PCI_BASE_1ST 0x10 /* 32 bit 1st Base address */ - #define PCI_BASE_2ND 0x14 /* 32 bit 2nd Base address */ -- /* Byte 0x18..0x2b: reserved */ -+ /* Bytes 0x18..0x2b: reserved */ - #define PCI_SUB_VID 0x2c /* 16 bit Subsystem Vendor ID */ - #define PCI_SUB_ID 0x2e /* 16 bit Subsystem ID */ - #define PCI_BASE_ROM 0x30 /* 32 bit Expansion ROM Base Address */ --#define PCI_CAP_PTR 0x34 /* 8 bit Capabilities Ptr */ -- /* Byte 0x35..0x3b: reserved */ -+#define PCI_CAP_PTR 0x34 /* 8 bit Capabilities Pointer */ -+ /* Bytes 0x35..0x3b: reserved */ - #define PCI_IRQ_LINE 0x3c /* 8 bit Interrupt Line */ - #define PCI_IRQ_PIN 0x3d /* 8 bit Interrupt Pin */ - #define PCI_MIN_GNT 0x3e /* 8 bit Min_Gnt */ - #define PCI_MAX_LAT 0x3f /* 8 bit Max_Lat */ - /* Device Dependent Region */ --#define PCI_OUR_REG_1 0x40 /* 32 bit Our Register 1 */ --#define PCI_OUR_REG_2 0x44 /* 32 bit Our Register 2 */ -+#define PCI_OUR_REG_1 0x40 /* 32 bit Our Register 1 */ -+#define PCI_OUR_REG_2 0x44 /* 32 bit Our Register 2 */ - /* Power Management Region */ --#define PCI_PM_CAP_ID 0x48 /* 8 bit Power Management Cap. ID */ --#define PCI_PM_NITEM 0x49 /* 8 bit Next Item Ptr */ --#define PCI_PM_CAP_REG 0x4a /* 16 bit Power Management Capabilities */ --#define PCI_PM_CTL_STS 0x4c /* 16 bit Power Manag. Control/Status */ -+#define PCI_PM_CAP_ID 0x48 /* 8 bit Power Management Cap. ID */ -+#define PCI_PM_NITEM 0x49 /* 8 bit PM Next Item Pointer */ -+#define PCI_PM_CAP_REG 0x4a /* 16 bit Power Management Capabilities */ -+#define PCI_PM_CTL_STS 0x4c /* 16 bit Power Manag. Control/Status */ - /* Byte 0x4e: reserved */ --#define PCI_PM_DAT_REG 0x4f /* 8 bit Power Manag. Data Register */ -+#define PCI_PM_DAT_REG 0x4f /* 8 bit Power Manag. Data Register */ - /* VPD Region */ --#define PCI_VPD_CAP_ID 0x50 /* 8 bit VPD Cap. ID */ --#define PCI_VPD_NITEM 0x51 /* 8 bit Next Item Ptr */ --#define PCI_VPD_ADR_REG 0x52 /* 16 bit VPD Address Register */ --#define PCI_VPD_DAT_REG 0x54 /* 32 bit VPD Data Register */ -- /* Byte 0x58..0x59: reserved */ --#define PCI_SER_LD_CTRL 0x5a /* 16 bit SEEPROM Loader Ctrl (YUKON only) */ -- /* Byte 0x5c..0xff: reserved */ -+#define PCI_VPD_CAP_ID 0x50 /* 8 bit VPD Cap. ID */ -+#define PCI_VPD_NITEM 0x51 /* 8 bit VPD Next Item Pointer */ -+#define PCI_VPD_ADR_REG 0x52 /* 16 bit VPD Address Register */ -+#define PCI_VPD_DAT_REG 0x54 /* 32 bit VPD Data Register */ -+ /* Bytes 0x58..0x59: reserved */ -+#define PCI_SER_LD_CTRL 0x5a /* 16 bit SEEPROM Loader Ctrl (YUKON only) */ -+ /* Bytes 0x5c..0xfc: used by Yukon-2 */ -+#define PCI_MSI_CAP_ID 0x5c /* 8 bit MSI Capability ID Register */ -+#define PCI_MSI_NITEM 0x5d /* 8 bit MSI Next Item Pointer */ -+#define PCI_MSI_CTRL 0x5e /* 16 bit MSI Message Control */ -+#define PCI_MSI_ADR_LO 0x60 /* 32 bit MSI Message Address (Lower) */ -+#define PCI_MSI_ADR_HI 0x64 /* 32 bit MSI Message Address (Upper) */ -+#define PCI_MSI_DATA 0x68 /* 16 bit MSI Message Data */ -+ /* Bytes 0x6a..0x6b: reserved */ -+#define PCI_X_CAP_ID 0x6c /* 8 bit PCI-X Capability ID Register */ -+#define PCI_X_NITEM 0x6d /* 8 bit PCI-X Next Item Pointer */ -+#define PCI_X_COMMAND 0x6e /* 16 bit PCI-X Command */ -+#define PCI_X_PE_STAT 0x70 /* 32 bit PCI-X / PE Status */ -+#define PCI_CAL_CTRL 0x74 /* 16 bit PCI Calibration Control Register */ -+#define PCI_CAL_STAT 0x76 /* 16 bit PCI Calibration Status Register */ -+#define PCI_DISC_CNT 0x78 /* 16 bit PCI Discard Counter */ -+#define PCI_RETRY_CNT 0x7a /* 8 bit PCI Retry Counter */ -+ /* Byte 0x7b: reserved */ -+#define PCI_OUR_STATUS 0x7c /* 32 bit Adapter Status Register */ -+#define PCI_OUR_REG_3 0x80 /* 32 bit Our Register 3 (Yukon-ECU only) */ -+#define PCI_OUR_REG_4 0x84 /* 32 bit Our Register 4 (Yukon-ECU only) */ -+#define PCI_OUR_REG_5 0x88 /* 32 bit Our Register 5 (Yukon-ECU only) */ -+ /* Bytes 0x8c..0xdf: reserved */ -+ -+/* PCI Express Capability */ -+#define PEX_CAP_ID 0xe0 /* 8 bit PEX Capability ID */ -+#define PEX_NITEM 0xe1 /* 8 bit PEX Next Item Pointer */ -+#define PEX_CAP_REG 0xe2 /* 16 bit PEX Capability Register */ -+#define PEX_DEV_CAP 0xe4 /* 32 bit PEX Device Capabilities */ -+#define PEX_DEV_CTRL 0xe8 /* 16 bit PEX Device Control */ -+#define PEX_DEV_STAT 0xea /* 16 bit PEX Device Status */ -+#define PEX_LNK_CAP 0xec /* 32 bit PEX Link Capabilities */ -+#define PEX_LNK_CTRL 0xf0 /* 16 bit PEX Link Control */ -+#define PEX_LNK_STAT 0xf2 /* 16 bit PEX Link Status */ -+ /* Bytes 0xf4..0xff: reserved */ -+ -+/* PCI Express Extended Capabilities */ -+#define PEX_ADV_ERR_REP 0x100 /* 32 bit PEX Advanced Error Reporting */ -+#define PEX_UNC_ERR_STAT 0x104 /* 32 bit PEX Uncorr. Errors Status */ -+#define PEX_UNC_ERR_MASK 0x108 /* 32 bit PEX Uncorr. Errors Mask */ -+#define PEX_UNC_ERR_SEV 0x10c /* 32 bit PEX Uncorr. Errors Severity */ -+#define PEX_COR_ERR_STAT 0x110 /* 32 bit PEX Correc. Errors Status */ -+#define PEX_COR_ERR_MASK 0x114 /* 32 bit PEX Correc. Errors Mask */ -+#define PEX_ADV_ERR_CAP_C 0x118 /* 32 bit PEX Advanced Error Cap./Ctrl */ -+#define PEX_HEADER_LOG 0x11c /* 4x32 bit PEX Header Log Register */ -+ -+/* PCI Express Ack Timer for 1x Link */ -+#define PEX_ACK_LAT_TOX1 0x228 /* 16 bit PEX Ack Latency Timeout x1 */ -+#define PEX_ACK_RPLY_TOX1 0x22a /* 16 bit PEX Ack Reply Timeout val x1 */ - - /* - * I2C Address (PCI Config) -@@ -180,13 +238,13 @@ extern "C" { - #define PCI_ADSTEP BIT_7S /* Address Stepping */ - #define PCI_PERREN BIT_6S /* Parity Report Response enable */ - #define PCI_VGA_SNOOP BIT_5S /* VGA palette snoop */ --#define PCI_MWIEN BIT_4S /* Memory write an inv cycl ena */ -+#define PCI_MWIEN BIT_4S /* Memory write an inv cycl enable */ - #define PCI_SCYCEN BIT_3S /* Special Cycle enable */ - #define PCI_BMEN BIT_2S /* Bus Master enable */ - #define PCI_MEMEN BIT_1S /* Memory Space Access enable */ - #define PCI_IOEN BIT_0S /* I/O Space Access enable */ - --#define PCI_COMMAND_VAL (PCI_FBTEN | PCI_SERREN | PCI_PERREN | PCI_MWIEN |\ -+#define PCI_COMMAND_VAL (PCI_INT_DIS | PCI_SERREN | PCI_PERREN | \ - PCI_BMEN | PCI_MEMEN | PCI_IOEN) - - /* PCI_STATUS 16 bit Status */ -@@ -220,7 +278,7 @@ extern "C" { - - /* PCI_HEADER_T 8 bit Header Type */ - #define PCI_HD_MF_DEV BIT_7S /* 0= single, 1= multi-func dev */ --#define PCI_HD_TYPE 0x7f /* Bit 6..0: Header Layout 0= normal */ -+#define PCI_HD_TYPE 0x7f /* Bit 6..0: Header Layout (0=normal) */ - - /* PCI_BIST 8 bit Built-in selftest */ - /* Built-in Self test not supported (optional) */ -@@ -229,33 +287,42 @@ extern "C" { - #define PCI_MEMSIZE 0x4000L /* use 16 kB Memory Base */ - #define PCI_MEMBASE_MSK 0xffffc000L /* Bit 31..14: Memory Base Address */ - #define PCI_MEMSIZE_MSK 0x00003ff0L /* Bit 13.. 4: Memory Size Req. */ --#define PCI_PREFEN BIT_3 /* Prefetchable */ --#define PCI_MEM_TYP (3L<<2) /* Bit 2.. 1: Memory Type */ -+#define PCI_PREFEN BIT_3 /* Prefetch enable */ -+#define PCI_MEM_TYP_MSK (3L<<1) /* Bit 2.. 1: Memory Type Mask */ -+#define PCI_MEMSPACE BIT_0 /* Memory Space Indicator */ -+ - #define PCI_MEM32BIT (0L<<1) /* Base addr anywhere in 32 Bit range */ - #define PCI_MEM1M (1L<<1) /* Base addr below 1 MegaByte */ - #define PCI_MEM64BIT (2L<<1) /* Base addr anywhere in 64 Bit range */ --#define PCI_MEMSPACE BIT_0 /* Memory Space Indicator */ - - /* PCI_BASE_2ND 32 bit 2nd Base address */ - #define PCI_IOBASE 0xffffff00L /* Bit 31.. 8: I/O Base address */ - #define PCI_IOSIZE 0x000000fcL /* Bit 7.. 2: I/O Size Requirements */ -- /* Bit 1: reserved */ -+ /* Bit 1: reserved */ - #define PCI_IOSPACE BIT_0 /* I/O Space Indicator */ - - /* PCI_BASE_ROM 32 bit Expansion ROM Base Address */ - #define PCI_ROMBASE_MSK 0xfffe0000L /* Bit 31..17: ROM Base address */ - #define PCI_ROMBASE_SIZ (0x1cL<<14) /* Bit 16..14: Treat as Base or Size */ - #define PCI_ROMSIZE (0x38L<<11) /* Bit 13..11: ROM Size Requirements */ -- /* Bit 10.. 1: reserved */ -+ /* Bit 10.. 1: reserved */ - #define PCI_ROMEN BIT_0 /* Address Decode enable */ - - /* Device Dependent Region */ - /* PCI_OUR_REG_1 32 bit Our Register 1 */ -- /* Bit 31..29: reserved */ -+ /* Bit 31..29: reserved */ - #define PCI_PHY_COMA BIT_28 /* Set PHY to Coma Mode (YUKON only) */ - #define PCI_TEST_CAL BIT_27 /* Test PCI buffer calib. (YUKON only) */ - #define PCI_EN_CAL BIT_26 /* Enable PCI buffer calib. (YUKON only) */ - #define PCI_VIO BIT_25 /* PCI I/O Voltage, 0 = 3.3V, 1 = 5V */ -+/* Yukon-2 */ -+#define PCI_Y2_PIG_ENA BIT_31 /* Enable Plug-in-Go (YUKON-2) */ -+#define PCI_Y2_DLL_DIS BIT_30 /* Disable PCI DLL (YUKON-2) */ -+#define PCI_Y2_PHY2_COMA BIT_29 /* Set PHY 2 to Coma Mode (YUKON-2) */ -+#define PCI_Y2_PHY1_COMA BIT_28 /* Set PHY 1 to Coma Mode (YUKON-2) */ -+#define PCI_Y2_PHY2_POWD BIT_27 /* Set PHY 2 to Power Down (YUKON-2) */ -+#define PCI_Y2_PHY1_POWD BIT_26 /* Set PHY 1 to Power Down (YUKON-2) */ -+ /* Bit 25: reserved */ - #define PCI_DIS_BOOT BIT_24 /* Disable BOOT via ROM */ - #define PCI_EN_IO BIT_23 /* Mapping to I/O space */ - #define PCI_EN_FPROM BIT_22 /* Enable FLASH mapping to memory */ -@@ -266,9 +333,10 @@ extern "C" { - #define PCI_PAGE_32K (1L<<20) /* 32 k pages */ - #define PCI_PAGE_64K (2L<<20) /* 64 k pages */ - #define PCI_PAGE_128K (3L<<20) /* 128 k pages */ -- /* Bit 19: reserved */ --#define PCI_PAGEREG (7L<<16) /* Bit 18..16: Page Register */ -+ /* Bit 19: reserved */ -+#define PCI_PAGEREG (7L<<16) /* Bit 18..16: Page Register */ - #define PCI_NOTAR BIT_15 /* No turnaround cycle */ -+#define PCI_PEX_LEGNAT BIT_15 /* PEX PM legacy/native mode (YUKON-2) */ - #define PCI_FORCE_BE BIT_14 /* Assert all BEs on MR */ - #define PCI_DIS_MRL BIT_13 /* Disable Mem Read Line */ - #define PCI_DIS_MRM BIT_12 /* Disable Mem Read Multiple */ -@@ -278,13 +346,21 @@ extern "C" { - #define PCI_DIS_PCI_CLK BIT_8 /* Disable PCI clock driving */ - #define PCI_SKEW_DAS (0xfL<<4) /* Bit 7.. 4: Skew Ctrl, DAS Ext */ - #define PCI_SKEW_BASE 0xfL /* Bit 3.. 0: Skew Ctrl, Base */ -+#define PCI_CLS_OPT BIT_3 /* Cache Line Size opt. PCI-X (YUKON-2) */ - -+/* Yukon-EC Ultra only */ -+ /* Bit 14..10: reserved */ -+#define PCI_PHY_LNK_TIM_MSK (3L<<8) /* Bit 9.. 8: GPHY Link Trigger Timer */ -+#define PCI_ENA_L1_EVENT BIT_7 /* Enable PEX L1 Event */ -+#define PCI_ENA_GPHY_LNK BIT_6 /* Enable PEX L1 on GPHY Link down */ -+#define PCI_FORCE_PEX_L1 BIT_5 /* Force to PEX L1 */ -+ /* Bit 4.. 0: reserved */ - - /* PCI_OUR_REG_2 32 bit Our Register 2 */ - #define PCI_VPD_WR_THR (0xffL<<24) /* Bit 31..24: VPD Write Threshold */ - #define PCI_DEV_SEL (0x7fL<<17) /* Bit 23..17: EEPROM Device Select */ - #define PCI_VPD_ROM_SZ (7L<<14) /* Bit 16..14: VPD ROM Size */ -- /* Bit 13..12: reserved */ -+ /* Bit 13..12: reserved */ - #define PCI_PATCH_DIR (0xfL<<8) /* Bit 11.. 8: Ext Patches dir 3..0 */ - #define PCI_PATCH_DIR_3 BIT_11 - #define PCI_PATCH_DIR_2 BIT_10 -@@ -296,22 +372,21 @@ extern "C" { - #define PCI_EXT_PATCH_1 BIT_5 - #define PCI_EXT_PATCH_0 BIT_4 - #define PCI_EN_DUMMY_RD BIT_3 /* Enable Dummy Read */ --#define PCI_REV_DESC BIT_2 /* Reverse Desc. Bytes */ -- /* Bit 1: reserved */ -+#define PCI_REV_DESC BIT_2 /* Reverse Descriptor Bytes */ -+ /* Bit 1: reserved */ - #define PCI_USEDATA64 BIT_0 /* Use 64Bit Data bus ext */ - -- --/* Power Management Region */ -+/* Power Management (PM) Region */ - /* PCI_PM_CAP_REG 16 bit Power Management Capabilities */ --#define PCI_PME_SUP_MSK (0x1f<<11) /* Bit 15..11: PM Event Support Mask */ --#define PCI_PME_D3C_SUP BIT_15S /* PME from D3cold Support (if Vaux) */ -+#define PCI_PME_SUP_MSK (0x1f<<11) /* Bit 15..11: PM Event (PME) Supp. Mask */ -+#define PCI_PME_D3C_SUP BIT_15S /* PME from D3cold Support (if VAUX) */ - #define PCI_PME_D3H_SUP BIT_14S /* PME from D3hot Support */ - #define PCI_PME_D2_SUP BIT_13S /* PME from D2 Support */ - #define PCI_PME_D1_SUP BIT_12S /* PME from D1 Support */ - #define PCI_PME_D0_SUP BIT_11S /* PME from D0 Support */ - #define PCI_PM_D2_SUP BIT_10S /* D2 Support in 33 MHz mode */ - #define PCI_PM_D1_SUP BIT_9S /* D1 Support */ -- /* Bit 8.. 6: reserved */ -+ /* Bit 8.. 6: reserved */ - #define PCI_PM_DSI BIT_5S /* Device Specific Initialization */ - #define PCI_PM_APS BIT_4S /* Auxialiary Power Source */ - #define PCI_PME_CLOCK BIT_3S /* PM Event Clock */ -@@ -322,7 +397,7 @@ extern "C" { - #define PCI_PM_DAT_SCL (3<<13) /* Bit 14..13: Data Reg. scaling factor */ - #define PCI_PM_DAT_SEL (0xf<<9) /* Bit 12.. 9: PM data selector field */ - #define PCI_PME_EN BIT_8S /* Enable PME# generation (YUKON only) */ -- /* Bit 7.. 2: reserved */ -+ /* Bit 7.. 2: reserved */ - #define PCI_PM_STATE_MSK 3 /* Bit 1.. 0: Power Management State */ - - #define PCI_PM_STATE_D0 0 /* D0: Operational (default) */ -@@ -333,7 +408,144 @@ extern "C" { - /* VPD Region */ - /* PCI_VPD_ADR_REG 16 bit VPD Address Register */ - #define PCI_VPD_FLAG BIT_15S /* starts VPD rd/wr cycle */ --#define PCI_VPD_ADR_MSK 0x7fffL /* Bit 14.. 0: VPD address mask */ -+#define PCI_VPD_ADR_MSK 0x7fffL /* Bit 14.. 0: VPD Address Mask */ -+ -+/* PCI_OUR_STATUS 32 bit Adapter Status Register (Yukon-2) */ -+#define PCI_OS_PCI64B BIT_31 /* Conventional PCI 64 bits Bus */ -+#define PCI_OS_PCIX BIT_30 /* PCI-X Bus */ -+#define PCI_OS_MODE_MSK (3L<<28) /* Bit 29..28: PCI-X Bus Mode Mask */ -+#define PCI_OS_PCI66M BIT_27 /* PCI 66 MHz Bus */ -+#define PCI_OS_PCI_X BIT_26 /* PCI/PCI-X Bus (0 = PEX) */ -+#define PCI_OS_DLLE_MSK (3L<<24) /* Bit 25..24: DLL Status Indication */ -+#define PCI_OS_DLLR_MSK (0xfL<<20) /* Bit 23..20: DLL Row Counters Values */ -+#define PCI_OS_DLLC_MSK (0xfL<<16) /* Bit 19..16: DLL Col. Counters Values */ -+ /* Bit 15.. 8: reserved */ -+ -+#define PCI_OS_SPEED(val) ((val & PCI_OS_MODE_MSK) >> 28) /* PCI-X Speed */ -+/* possible values for the speed field of the register */ -+#define PCI_OS_SPD_PCI 0 /* PCI Conventional Bus */ -+#define PCI_OS_SPD_X66 1 /* PCI-X 66MHz Bus */ -+#define PCI_OS_SPD_X100 2 /* PCI-X 100MHz Bus */ -+#define PCI_OS_SPD_X133 3 /* PCI-X 133MHz Bus */ -+ -+/* PCI_OUR_REG_3 32 bit Our Register 3 (Yukon-ECU only) */ -+ /* Bit 31..18: reserved */ -+#define P_CLK_COR_REGS_D0_DIS BIT_17 /* Disable Clock Core Regs in D0 */ -+#define P_CLK_PCI_REGS_D0_DIS BIT_16 /* Disable Clock PCI Regs in D0 */ -+#define P_CLK_COR_YTB_ARB_DIS BIT_15 /* Disable Clock YTB Arbiter */ -+#define P_CLK_MAC_LNK1_D3_DIS BIT_14 /* Disable Clock MAC Link1 in D3 */ -+#define P_CLK_COR_LNK1_D0_DIS BIT_13 /* Disable Clock Core Link1 in D0 */ -+#define P_CLK_MAC_LNK1_D0_DIS BIT_12 /* Disable Clock MAC Link1 in D0 */ -+#define P_CLK_COR_LNK1_D3_DIS BIT_11 /* Disable Clock Core Link1 in D3 */ -+#define P_CLK_PCI_MST_ARB_DIS BIT_10 /* Disable Clock PCI Master Arb. */ -+#define P_CLK_COR_REGS_D3_DIS BIT_9 /* Disable Clock Core Regs in D3 */ -+#define P_CLK_PCI_REGS_D3_DIS BIT_8 /* Disable Clock PCI Regs in D3 */ -+#define P_CLK_REF_LNK1_GM_DIS BIT_7 /* Disable Clock Ref. Link1 GMAC */ -+#define P_CLK_COR_LNK1_GM_DIS BIT_6 /* Disable Clock Core Link1 GMAC */ -+#define P_CLK_PCI_COMMON_DIS BIT_5 /* Disable Clock PCI Common */ -+#define P_CLK_COR_COMMON_DIS BIT_4 /* Disable Clock Core Common */ -+#define P_CLK_PCI_LNK1_BMU_DIS BIT_3 /* Disable Clock PCI Link1 BMU */ -+#define P_CLK_COR_LNK1_BMU_DIS BIT_2 /* Disable Clock Core Link1 BMU */ -+#define P_CLK_PCI_LNK1_BIU_DIS BIT_1 /* Disable Clock PCI Link1 BIU */ -+#define P_CLK_COR_LNK1_BIU_DIS BIT_0 /* Disable Clock Core Link1 BIU */ -+ -+/* PCI_OUR_REG_4 32 bit Our Register 4 (Yukon-ECU only) */ -+#define P_PEX_LTSSM_STAT_MSK (0x7fL<<25) /* Bit 31..25: PEX LTSSM Mask */ -+ /* (Link Training & Status State Machine) */ -+ /* Bit 24: reserved */ -+#define P_TIMER_VALUE_MSK (0xffL<<16) /* Bit 23..16: Timer Value Mask */ -+#define P_FORCE_ASPM_REQUEST BIT_15 /* Force ASPM Request (A1 only) */ -+ /* (Active State Power Management) */ -+ /* Bit 14..12: Force ASPM on Event */ -+#define P_ASPM_GPHY_LINK_DOWN BIT_14 /* GPHY Link Down (A1 only) */ -+#define P_ASPM_INT_FIFO_EMPTY BIT_13 /* Internal FIFO Empty (A1 only) */ -+#define P_ASPM_CLKRUN_REQUEST BIT_12 /* CLKRUN Request (A1 only) */ -+ /* Bit 11.. 4: reserved */ -+#define P_ASPM_FORCE_CLKREQ_ENA BIT_4 /* Force CLKREQ Enable (A1b only) */ -+#define P_ASPM_CLKREQ_PAD_CTL BIT_3 /* CLKREQ PAD Control (A1 only) */ -+#define P_ASPM_A1_MODE_SELECT BIT_2 /* A1 Mode Select (A1 only) */ -+#define P_CLK_GATE_PEX_UNIT_ENA BIT_1 /* Enable Gate PEX Unit Clock */ -+#define P_CLK_GATE_ROOT_COR_ENA BIT_0 /* Enable Gate Root Core Clock */ -+ -+#define P_PEX_LTSSM_STAT(x) (SHIFT25(x) & P_PEX_LTSSM_STAT_MSK) -+#define P_PEX_LTSSM_L1_STAT 0x34 -+#define P_PEX_LTSSM_DET_STAT 0x01 -+ -+#define P_ASPM_CONTROL_MSK (P_FORCE_ASPM_REQUEST | P_ASPM_GPHY_LINK_DOWN | \ -+ P_ASPM_CLKRUN_REQUEST | P_ASPM_INT_FIFO_EMPTY) -+ -+/* PCI_OUR_REG_5 32 bit Our Register 5 (Yukon-ECU only) */ -+ /* Bit 31..27: reserved */ -+ /* Bit 26..16: Release Clock on Event */ -+#define P_REL_PCIE_RST_DE_ASS BIT_26 /* PCIe Reset De-Asserted */ -+#define P_REL_GPHY_REC_PACKET BIT_25 /* GPHY Received Packet */ -+#define P_REL_INT_FIFO_N_EMPTY BIT_24 /* Internal FIFO Not Empty */ -+#define P_REL_MAIN_PWR_AVAIL BIT_23 /* Main Power Available */ -+#define P_REL_CLKRUN_REQ_REL BIT_22 /* CLKRUN Request Release */ -+#define P_REL_PCIE_RESET_ASS BIT_21 /* PCIe Reset Asserted */ -+#define P_REL_PME_ASSERTED BIT_20 /* PME Asserted */ -+#define P_REL_PCIE_EXIT_L1_ST BIT_19 /* PCIe Exit L1 State */ -+#define P_REL_LOADER_NOT_FIN BIT_18 /* EPROM Loader Not Finished */ -+#define P_REL_PCIE_RX_EX_IDLE BIT_17 /* PCIe Rx Exit Electrical Idle State */ -+#define P_REL_GPHY_LINK_UP BIT_16 /* GPHY Link Up */ -+ /* Bit 15..11: reserved */ -+ /* Bit 10.. 0: Mask for Gate Clock */ -+#define P_GAT_PCIE_RST_DE_ASS BIT_10 /* PCIe Reset De-Asserted */ -+#define P_GAT_GPHY_N_REC_PACKET BIT_9 /* GPHY Not Received Packet */ -+#define P_GAT_INT_FIFO_EMPTY BIT_8 /* Internal FIFO Empty */ -+#define P_GAT_MAIN_PWR_N_AVAIL BIT_7 /* Main Power Not Available */ -+#define P_GAT_CLKRUN_REQ_REL BIT_6 /* CLKRUN Not Requested */ -+#define P_GAT_PCIE_RESET_ASS BIT_5 /* PCIe Reset Asserted */ -+#define P_GAT_PME_DE_ASSERTED BIT_4 /* PME De-Asserted */ -+#define P_GAT_PCIE_ENTER_L1_ST BIT_3 /* PCIe Enter L1 State */ -+#define P_GAT_LOADER_FINISHED BIT_2 /* EPROM Loader Finished */ -+#define P_GAT_PCIE_RX_EL_IDLE BIT_1 /* PCIe Rx Electrical Idle State */ -+#define P_GAT_GPHY_LINK_DOWN BIT_0 /* GPHY Link Down */ -+ -+/* PEX_DEV_CTRL 16 bit PEX Device Control (Yukon-2) */ -+ /* Bit 15 reserved */ -+#define PEX_DC_MAX_RRS_MSK (7<<12) /* Bit 14..12: Max. Read Request Size */ -+#define PEX_DC_EN_NO_SNOOP BIT_11S /* Enable No Snoop */ -+#define PEX_DC_EN_AUX_POW BIT_10S /* Enable AUX Power */ -+#define PEX_DC_EN_PHANTOM BIT_9S /* Enable Phantom Functions */ -+#define PEX_DC_EN_EXT_TAG BIT_8S /* Enable Extended Tag Field */ -+#define PEX_DC_MAX_PLS_MSK (7<<5) /* Bit 7.. 5: Max. Payload Size Mask */ -+#define PEX_DC_EN_REL_ORD BIT_4S /* Enable Relaxed Ordering */ -+#define PEX_DC_EN_UNS_RQ_RP BIT_3S /* Enable Unsupported Request Reporting */ -+#define PEX_DC_EN_FAT_ER_RP BIT_2S /* Enable Fatal Error Reporting */ -+#define PEX_DC_EN_NFA_ER_RP BIT_1S /* Enable Non-Fatal Error Reporting */ -+#define PEX_DC_EN_COR_ER_RP BIT_0S /* Enable Correctable Error Reporting */ -+ -+#define PEX_DC_MAX_RD_RQ_SIZE(x) (SHIFT12(x) & PEX_DC_MAX_RRS_MSK) -+ -+/* PEX_LNK_CTRL 16 bit PEX Link Control (Yukon-2) */ -+#define PEX_LC_CLK_PM_ENA BIT_8S /* Enable Clock Power Management (CLKREQ) */ -+ -+/* PEX_LNK_STAT 16 bit PEX Link Status (Yukon-2) */ -+ /* Bit 15..13 reserved */ -+#define PEX_LS_SLOT_CLK_CFG BIT_12S /* Slot Clock Config */ -+#define PEX_LS_LINK_TRAIN BIT_11S /* Link Training */ -+#define PEX_LS_TRAIN_ERROR BIT_10S /* Training Error */ -+#define PEX_LS_LINK_WI_MSK (0x3f<<4) /* Bit 9.. 4: Neg. Link Width Mask */ -+#define PEX_LS_LINK_SP_MSK 0x0f /* Bit 3.. 0: Link Speed Mask */ -+ -+/* PEX_UNC_ERR_STAT 16 bit PEX Uncorrectable Errors Status (Yukon-2) */ -+ /* Bit 31..21 reserved */ -+#define PEX_UNSUP_REQ BIT_20 /* Unsupported Request Error */ -+ /* ECRC Error (not supported) */ -+#define PEX_MALFOR_TLP BIT_18 /* Malformed TLP */ -+ /* Receiver Overflow (not supported) */ -+#define PEX_UNEXP_COMP BIT_16 /* Unexpected Completion */ -+ /* Completer Abort (not supported) */ -+#define PEX_COMP_TO BIT_14 /* Completion Timeout */ -+#define PEX_FLOW_CTRL_P BIT_13 /* Flow Control Protocol Error */ -+#define PEX_POIS_TLP BIT_12 /* Poisoned TLP */ -+ /* Bit 11.. 5: reserved */ -+#define PEX_DATA_LINK_P BIT_4 /* Data Link Protocol Error */ -+ /* Bit 3.. 1: reserved */ -+ /* Training Error (not supported) */ -+ -+#define PEX_FATAL_ERRORS (PEX_MALFOR_TLP | PEX_FLOW_CTRL_P | PEX_DATA_LINK_P) - - /* Control Register File (Address Map) */ - -@@ -349,8 +561,14 @@ extern "C" { - #define B0_IMSK 0x000c /* 32 bit Interrupt Mask Register */ - #define B0_HWE_ISRC 0x0010 /* 32 bit HW Error Interrupt Src Reg */ - #define B0_HWE_IMSK 0x0014 /* 32 bit HW Error Interrupt Mask Reg */ --#define B0_SP_ISRC 0x0018 /* 32 bit Special Interrupt Source Reg */ -- /* 0x001c: reserved */ -+#define B0_SP_ISRC 0x0018 /* 32 bit Special Interrupt Source Reg 1 */ -+ -+/* Special ISR registers (Yukon-2 only) */ -+#define B0_Y2_SP_ISRC2 0x001c /* 32 bit Special Interrupt Source Reg 2 */ -+#define B0_Y2_SP_ISRC3 0x0020 /* 32 bit Special Interrupt Source Reg 3 */ -+#define B0_Y2_SP_EISR 0x0024 /* 32 bit Enter ISR Reg */ -+#define B0_Y2_SP_LISR 0x0028 /* 32 bit Leave ISR Reg */ -+#define B0_Y2_SP_ICR 0x002c /* 32 bit Interrupt Control Reg */ - - /* B0 XMAC 1 registers (GENESIS only) */ - #define B0_XM1_IMSK 0x0020 /* 16 bit r/w XMAC 1 Interrupt Mask Register*/ -@@ -372,7 +590,7 @@ extern "C" { - #define B0_XM2_PHY_DATA 0x0054 /* 16 bit r/w XMAC 2 PHY Data Register */ - /* 0x0056 - 0x005f: reserved */ - --/* BMU Control Status Registers */ -+/* BMU Control Status Registers (Yukon and Genesis) */ - #define B0_R1_CSR 0x0060 /* 32 bit BMU Ctrl/Stat Rx Queue 1 */ - #define B0_R2_CSR 0x0064 /* 32 bit BMU Ctrl/Stat Rx Queue 2 */ - #define B0_XS1_CSR 0x0068 /* 32 bit BMU Ctrl/Stat Sync Tx Queue 1 */ -@@ -390,7 +608,7 @@ extern "C" { - /* - * Bank 2 - */ --/* NA reg = 48 bit Network Address Register, 3x16 or 8x8 bit readable */ -+/* NA reg = 48 bit Network Address Register, 3x16 or 6x8 bit readable */ - #define B2_MAC_1 0x0100 /* NA reg MAC Address 1 */ - /* 0x0106 - 0x0107: reserved */ - #define B2_MAC_2 0x0108 /* NA reg MAC Address 2 */ -@@ -400,14 +618,23 @@ extern "C" { - #define B2_CONN_TYP 0x0118 /* 8 bit Connector type */ - #define B2_PMD_TYP 0x0119 /* 8 bit PMD type */ - #define B2_MAC_CFG 0x011a /* 8 bit MAC Configuration / Chip Revision */ --#define B2_CHIP_ID 0x011b /* 8 bit Chip Identification Number */ -- /* Eprom registers are currently of no use */ -+#define B2_CHIP_ID 0x011b /* 8 bit Chip Identification Number */ -+ /* Eprom registers */ - #define B2_E_0 0x011c /* 8 bit EPROM Byte 0 (ext. SRAM size */ -+/* Yukon and Genesis */ - #define B2_E_1 0x011d /* 8 bit EPROM Byte 1 (PHY type) */ - #define B2_E_2 0x011e /* 8 bit EPROM Byte 2 */ -+/* Yukon-2 */ -+#define B2_Y2_CLK_GATE 0x011d /* 8 bit Clock Gating (Yukon-2) */ -+#define B2_Y2_HW_RES 0x011e /* 8 bit HW Resources (Yukon-2) */ -+ - #define B2_E_3 0x011f /* 8 bit EPROM Byte 3 */ -+ -+/* Yukon and Genesis */ - #define B2_FAR 0x0120 /* 32 bit Flash-Prom Addr Reg/Cnt */ - #define B2_FDP 0x0124 /* 8 bit Flash-Prom Data Port */ -+/* Yukon-2 */ -+#define B2_Y2_CLK_CTRL 0x0120 /* 32 bit Core Clock Frequency Control */ - /* 0x0125 - 0x0127: reserved */ - #define B2_LD_CTRL 0x0128 /* 8 bit EPROM loader control register */ - #define B2_LD_TEST 0x0129 /* 8 bit EPROM loader test register */ -@@ -439,6 +666,10 @@ extern "C" { - #define B2_BSC_CTRL 0x0178 /* 8 bit Blink Source Counter Control */ - #define B2_BSC_STAT 0x0179 /* 8 bit Blink Source Counter Status */ - #define B2_BSC_TST 0x017a /* 16 bit Blink Source Counter Test Reg */ -+ -+/* Yukon-2 */ -+#define Y2_PEX_PHY_DATA 0x0170 /* 16 bit PEX PHY Data Register */ -+#define Y2_PEX_PHY_ADDR 0x0172 /* 16 bit PEX PHY Address Register */ - /* 0x017c - 0x017f: reserved */ - - /* -@@ -448,9 +679,14 @@ extern "C" { - #define B3_RAM_ADDR 0x0180 /* 32 bit RAM Address, to read or write */ - #define B3_RAM_DATA_LO 0x0184 /* 32 bit RAM Data Word (low dWord) */ - #define B3_RAM_DATA_HI 0x0188 /* 32 bit RAM Data Word (high dWord) */ -+#define B3_RAM_PARITY 0x018c /* 8 bit RAM Parity (Yukon-ECU A1) */ -+ -+#define SELECT_RAM_BUFFER(rb, addr) (addr | (rb << 6)) /* Yukon-2 only */ -+ - /* 0x018c - 0x018f: reserved */ - - /* RAM Interface Registers */ -+/* Yukon-2: use SELECT_RAM_BUFFER() to access the RAM buffer */ - /* - * The HW-Spec. calls this registers Timeout Value 0..11. But this names are - * not usable in SW. Please notice these are NOT real timeouts, these are -@@ -517,8 +753,8 @@ extern "C" { - /* 0x01ea - 0x01eb: reserved */ - #define B3_PA_TOVAL_TX2 0x01ec /* 16 bit Timeout Val Tx Path MAC 2 */ - /* 0x01ee - 0x01ef: reserved */ --#define B3_PA_CTRL 0x01f0 /* 16 bit Packet Arbiter Ctrl Register */ --#define B3_PA_TEST 0x01f2 /* 16 bit Packet Arbiter Test Register */ -+#define B3_PA_CTRL 0x01f0 /* 16 bit Packet Arbiter Ctrl Register */ -+#define B3_PA_TEST 0x01f2 /* 16 bit Packet Arbiter Test Register */ - /* 0x01f4 - 0x01ff: reserved */ - - /* -@@ -532,7 +768,16 @@ extern "C" { - #define TXA_CTRL 0x0210 /* 8 bit Tx Arbiter Control Register */ - #define TXA_TEST 0x0211 /* 8 bit Tx Arbiter Test Register */ - #define TXA_STAT 0x0212 /* 8 bit Tx Arbiter Status Register */ -- /* 0x0213 - 0x027f: reserved */ -+ /* 0x0213 - 0x021f: reserved */ -+ -+ /* RSS key registers for Yukon-2 Family */ -+#define B4_RSS_KEY 0x0220 /* 4x32 bit RSS Key register (Yukon-2) */ -+ /* RSS key register offsets */ -+#define KEY_IDX_0 0 /* offset for location of KEY 0 */ -+#define KEY_IDX_1 4 /* offset for location of KEY 1 */ -+#define KEY_IDX_2 8 /* offset for location of KEY 2 */ -+#define KEY_IDX_3 12 /* offset for location of KEY 3 */ -+ - /* 0x0280 - 0x0292: MAC 2 */ - /* 0x0213 - 0x027f: reserved */ - -@@ -556,10 +801,10 @@ extern "C" { - - /* Queue Register Offsets, use Q_ADDR() to access */ - #define Q_D 0x00 /* 8*32 bit Current Descriptor */ --#define Q_DA_L 0x20 /* 32 bit Current Descriptor Address Low dWord */ --#define Q_DA_H 0x24 /* 32 bit Current Descriptor Address High dWord */ --#define Q_AC_L 0x28 /* 32 bit Current Address Counter Low dWord */ --#define Q_AC_H 0x2c /* 32 bit Current Address Counter High dWord */ -+#define Q_DA_L 0x20 /* 32 bit Current Descriptor Address Low DWord */ -+#define Q_DA_H 0x24 /* 32 bit Current Descriptor Address High DWord */ -+#define Q_AC_L 0x28 /* 32 bit Current Address Counter Low DWord */ -+#define Q_AC_H 0x2c /* 32 bit Current Address Counter High DWord */ - #define Q_BC 0x30 /* 32 bit Current Byte Counter */ - #define Q_CSR 0x34 /* 32 bit BMU Control/Status Register */ - #define Q_F 0x38 /* 32 bit Flag Register */ -@@ -570,8 +815,56 @@ extern "C" { - #define Q_T1_SV 0x3f /* 8 bit Test Register 1 Supervisor SM */ - #define Q_T2 0x40 /* 32 bit Test Register 2 */ - #define Q_T3 0x44 /* 32 bit Test Register 3 */ -+ -+/* Yukon-2 */ -+#define Q_DONE 0x24 /* 16 bit Done Index */ -+ -+#define Q_WM 0x40 /* 16 bit FIFO Watermark */ -+#define Q_AL 0x42 /* 8 bit FIFO Alignment */ -+ /* 0x43: reserved */ -+/* RX Queue */ -+#define Q_RX_RSP 0x44 /* 16 bit FIFO Read Shadow Pointer */ -+#define Q_RX_RSL 0x46 /* 8 bit FIFO Read Shadow Level */ -+ /* 0x47: reserved */ -+#define Q_RX_RP 0x48 /* 8 bit FIFO Read Pointer */ -+ /* 0x49: reserved */ -+#define Q_RX_RL 0x4a /* 8 bit FIFO Read Level */ -+ /* 0x4b: reserved */ -+#define Q_RX_WP 0x4c /* 8 bit FIFO Write Pointer */ -+#define Q_RX_WSP 0x4d /* 8 bit FIFO Write Shadow Pointer */ -+#define Q_RX_WL 0x4e /* 8 bit FIFO Write Level */ -+#define Q_RX_WSL 0x4f /* 8 bit FIFO Write Shadow Level */ -+/* TX Queue */ -+#define Q_TX_WSP 0x44 /* 16 bit FIFO Write Shadow Pointer */ -+#define Q_TX_WSL 0x46 /* 8 bit FIFO Write Shadow Level */ -+ /* 0x47: reserved */ -+#define Q_TX_WP 0x48 /* 8 bit FIFO Write Pointer */ -+ /* 0x49: reserved */ -+#define Q_TX_WL 0x4a /* 8 bit FIFO Write Level */ -+ /* 0x4b: reserved */ -+#define Q_TX_RP 0x4c /* 8 bit FIFO Read Pointer */ -+ /* 0x4d: reserved */ -+#define Q_TX_RL 0x4e /* 8 bit FIFO Read Level */ -+ /* 0x4f: reserved */ -+ - /* 0x48 - 0x7f: reserved */ - -+/* Queue Prefetch Unit Offsets, use Y2_PREF_Q_ADDR() to address (Yukon-2 only)*/ -+#define Y2_B8_PREF_REGS 0x0450 -+ -+#define PREF_UNIT_CTRL_REG 0x00 /* 32 bit Prefetch Control register */ -+#define PREF_UNIT_LAST_IDX_REG 0x04 /* 16 bit Last Index */ -+#define PREF_UNIT_ADDR_LOW_REG 0x08 /* 32 bit List start addr, low part */ -+#define PREF_UNIT_ADDR_HI_REG 0x0c /* 32 bit List start addr, high part*/ -+#define PREF_UNIT_GET_IDX_REG 0x10 /* 16 bit Get Index */ -+#define PREF_UNIT_PUT_IDX_REG 0x14 /* 16 bit Put Index */ -+#define PREF_UNIT_FIFO_WP_REG 0x20 /* 8 bit FIFO write pointer */ -+#define PREF_UNIT_FIFO_RP_REG 0x24 /* 8 bit FIFO read pointer */ -+#define PREF_UNIT_FIFO_WM_REG 0x28 /* 8 bit FIFO watermark */ -+#define PREF_UNIT_FIFO_LEV_REG 0x2c /* 8 bit FIFO level */ -+ -+#define PREF_UNIT_MASK_IDX 0x0fff -+ - /* - * Bank 16 - 23 - */ -@@ -583,17 +876,17 @@ extern "C" { - #define RB_END 0x04 /* 32 bit RAM Buffer End Address */ - #define RB_WP 0x08 /* 32 bit RAM Buffer Write Pointer */ - #define RB_RP 0x0c /* 32 bit RAM Buffer Read Pointer */ --#define RB_RX_UTPP 0x10 /* 32 bit Rx Upper Threshold, Pause Pack */ --#define RB_RX_LTPP 0x14 /* 32 bit Rx Lower Threshold, Pause Pack */ -+#define RB_RX_UTPP 0x10 /* 32 bit Rx Upper Threshold, Pause Packet */ -+#define RB_RX_LTPP 0x14 /* 32 bit Rx Lower Threshold, Pause Packet */ - #define RB_RX_UTHP 0x18 /* 32 bit Rx Upper Threshold, High Prio */ - #define RB_RX_LTHP 0x1c /* 32 bit Rx Lower Threshold, High Prio */ - /* 0x10 - 0x1f: reserved at Tx RAM Buffer Registers */ - #define RB_PC 0x20 /* 32 bit RAM Buffer Packet Counter */ - #define RB_LEV 0x24 /* 32 bit RAM Buffer Level Register */ --#define RB_CTRL 0x28 /* 8 bit RAM Buffer Control Register */ -+#define RB_CTRL 0x28 /* 32 bit RAM Buffer Control Register */ - #define RB_TST1 0x29 /* 8 bit RAM Buffer Test Register 1 */ --#define RB_TST2 0x2A /* 8 bit RAM Buffer Test Register 2 */ -- /* 0x2c - 0x7f: reserved */ -+#define RB_TST2 0x2a /* 8 bit RAM Buffer Test Register 2 */ -+ /* 0x2b - 0x7f: reserved */ - - /* - * Bank 24 -@@ -603,7 +896,7 @@ extern "C" { - * use MR_ADDR() to access - */ - #define RX_MFF_EA 0x0c00 /* 32 bit Receive MAC FIFO End Address */ --#define RX_MFF_WP 0x0c04 /* 32 bit Receive MAC FIFO Write Pointer */ -+#define RX_MFF_WP 0x0c04 /* 32 bit Receive MAC FIFO Write Pointer */ - /* 0x0c08 - 0x0c0b: reserved */ - #define RX_MFF_RP 0x0c0c /* 32 bit Receive MAC FIFO Read Pointer */ - #define RX_MFF_PC 0x0c10 /* 32 bit Receive MAC FIFO Packet Cnt */ -@@ -628,20 +921,23 @@ extern "C" { - #define LNK_LED_REG 0x0c3c /* 8 bit Link LED Register */ - /* 0x0c3d - 0x0c3f: reserved */ - --/* Receive GMAC FIFO (YUKON only), use MR_ADDR() to access */ -+/* Receive GMAC FIFO (YUKON and Yukon-2), use MR_ADDR() to access */ - #define RX_GMF_EA 0x0c40 /* 32 bit Rx GMAC FIFO End Address */ - #define RX_GMF_AF_THR 0x0c44 /* 32 bit Rx GMAC FIFO Almost Full Thresh. */ - #define RX_GMF_CTRL_T 0x0c48 /* 32 bit Rx GMAC FIFO Control/Test */ - #define RX_GMF_FL_MSK 0x0c4c /* 32 bit Rx GMAC FIFO Flush Mask */ - #define RX_GMF_FL_THR 0x0c50 /* 32 bit Rx GMAC FIFO Flush Threshold */ -- /* 0x0c54 - 0x0c5f: reserved */ --#define RX_GMF_WP 0x0c60 /* 32 bit Rx GMAC FIFO Write Pointer */ -+#define RX_GMF_TR_THR 0x0c54 /* 32 bit Rx Truncation Threshold (Yukon-2) */ -+#define RX_GMF_UP_THR 0x0c58 /* 16 bit Rx Upper Pause Thr (Yukon-EC_U) */ -+#define RX_GMF_LP_THR 0x0c5a /* 16 bit Rx Lower Pause Thr (Yukon-EC_U) */ -+#define RX_GMF_VLAN 0x0c5c /* 32 bit Rx VLAN Type Register (Yukon-2) */ -+#define RX_GMF_WP 0x0c60 /* 32 bit Rx GMAC FIFO Write Pointer */ - /* 0x0c64 - 0x0c67: reserved */ --#define RX_GMF_WLEV 0x0c68 /* 32 bit Rx GMAC FIFO Write Level */ -+#define RX_GMF_WLEV 0x0c68 /* 32 bit Rx GMAC FIFO Write Level */ - /* 0x0c6c - 0x0c6f: reserved */ --#define RX_GMF_RP 0x0c70 /* 32 bit Rx GMAC FIFO Read Pointer */ -+#define RX_GMF_RP 0x0c70 /* 32 bit Rx GMAC FIFO Read Pointer */ - /* 0x0c74 - 0x0c77: reserved */ --#define RX_GMF_RLEV 0x0c78 /* 32 bit Rx GMAC FIFO Read Level */ -+#define RX_GMF_RLEV 0x0c78 /* 32 bit Rx GMAC FIFO Read Level */ - /* 0x0c7c - 0x0c7f: reserved */ - - /* -@@ -658,7 +954,7 @@ extern "C" { - * use MR_ADDR() to access - */ - #define TX_MFF_EA 0x0d00 /* 32 bit Transmit MAC FIFO End Address */ --#define TX_MFF_WP 0x0d04 /* 32 bit Transmit MAC FIFO WR Pointer */ -+#define TX_MFF_WP 0x0d04 /* 32 bit Transmit MAC FIFO WR Pointer */ - #define TX_MFF_WSP 0x0d08 /* 32 bit Transmit MAC FIFO WR Shadow Ptr */ - #define TX_MFF_RP 0x0d0c /* 32 bit Transmit MAC FIFO RD Pointer */ - #define TX_MFF_PC 0x0d10 /* 32 bit Transmit MAC FIFO Packet Cnt */ -@@ -676,18 +972,19 @@ extern "C" { - #define TX_LED_TST 0x0d29 /* 8 bit Transmit LED Cnt Test Reg */ - /* 0x0d2a - 0x0d3f: reserved */ - --/* Transmit GMAC FIFO (YUKON only), use MR_ADDR() to access */ -+/* Transmit GMAC FIFO (YUKON and Yukon-2), use MR_ADDR() to access */ - #define TX_GMF_EA 0x0d40 /* 32 bit Tx GMAC FIFO End Address */ --#define TX_GMF_AE_THR 0x0d44 /* 32 bit Tx GMAC FIFO Almost Empty Thresh.*/ -+#define TX_GMF_AE_THR 0x0d44 /* 32 bit Tx GMAC FIFO Almost Empty Thresh. */ - #define TX_GMF_CTRL_T 0x0d48 /* 32 bit Tx GMAC FIFO Control/Test */ -- /* 0x0d4c - 0x0d5f: reserved */ --#define TX_GMF_WP 0x0d60 /* 32 bit Tx GMAC FIFO Write Pointer */ --#define TX_GMF_WSP 0x0d64 /* 32 bit Tx GMAC FIFO Write Shadow Ptr. */ --#define TX_GMF_WLEV 0x0d68 /* 32 bit Tx GMAC FIFO Write Level */ -+ /* 0x0d4c - 0x0d5b: reserved */ -+#define TX_GMF_VLAN 0x0d5c /* 32 bit Tx VLAN Type Register (Yukon-2) */ -+#define TX_GMF_WP 0x0d60 /* 32 bit Tx GMAC FIFO Write Pointer */ -+#define TX_GMF_WSP 0x0d64 /* 32 bit Tx GMAC FIFO Write Shadow Pointer */ -+#define TX_GMF_WLEV 0x0d68 /* 32 bit Tx GMAC FIFO Write Level */ - /* 0x0d6c - 0x0d6f: reserved */ --#define TX_GMF_RP 0x0d70 /* 32 bit Tx GMAC FIFO Read Pointer */ --#define TX_GMF_RSTP 0x0d74 /* 32 bit Tx GMAC FIFO Restart Pointer */ --#define TX_GMF_RLEV 0x0d78 /* 32 bit Tx GMAC FIFO Read Level */ -+#define TX_GMF_RP 0x0d70 /* 32 bit Tx GMAC FIFO Read Pointer */ -+#define TX_GMF_RSTP 0x0d74 /* 32 bit Tx GMAC FIFO Restart Pointer */ -+#define TX_GMF_RLEV 0x0d78 /* 32 bit Tx GMAC FIFO Read Level */ - /* 0x0d7c - 0x0d7f: reserved */ - - /* -@@ -713,12 +1010,84 @@ extern "C" { - #define GMAC_TI_ST_CTRL 0x0e18 /* 8 bit Time Stamp Timer Ctrl Reg */ - /* 0x0e19: reserved */ - #define GMAC_TI_ST_TST 0x0e1a /* 8 bit Time Stamp Timer Test Reg */ -- /* 0x0e1b - 0x0e7f: reserved */ -+ /* 0x0e1b - 0x0e1f: reserved */ -+ -+/* Polling Unit Registers (Yukon-2 only) */ -+#define POLL_CTRL 0x0e20 /* 32 bit Polling Unit Control Reg */ -+#define POLL_LAST_IDX 0x0e24 /* 16 bit Polling Unit List Last Index */ -+ /* 0x0e26 - 0x0e27: reserved */ -+#define POLL_LIST_ADDR_LO 0x0e28 /* 32 bit Poll. List Start Addr (low) */ -+#define POLL_LIST_ADDR_HI 0x0e2c /* 32 bit Poll. List Start Addr (high) */ -+ /* 0x0e30 - 0x0e3f: reserved */ -+ -+/* ASF Subsystem Registers (Yukon-2 only) */ -+#define B28_Y2_SMB_CONFIG 0x0e40 /* 32 bit ASF SMBus Config Register */ -+#define B28_Y2_SMB_CSD_REG 0x0e44 /* 32 bit ASF SMB Control/Status/Data */ -+ /* 0x0e48 - 0x0e5f: reserved */ -+#define B28_Y2_ASF_IRQ_V_BASE 0x0e60 /* 32 bit ASF IRQ Vector Base */ -+ /* 0x0e64 - 0x0e67: reserved */ -+#define B28_Y2_ASF_STAT_CMD 0x0e68 /* 32 bit ASF Status and Command Reg */ -+#define B28_Y2_ASF_HOST_COM 0x0e6c /* 32 bit ASF Host Communication Reg */ -+#define B28_Y2_DATA_REG_1 0x0e70 /* 32 bit ASF/Host Data Register 1 */ -+#define B28_Y2_DATA_REG_2 0x0e74 /* 32 bit ASF/Host Data Register 2 */ -+#define B28_Y2_DATA_REG_3 0x0e78 /* 32 bit ASF/Host Data Register 3 */ -+#define B28_Y2_DATA_REG_4 0x0e7c /* 32 bit ASF/Host Data Register 4 */ - - /* - * Bank 29 - */ -- /* 0x0e80 - 0x0efc: reserved */ -+ -+/* Status BMU Registers (Yukon-2 only)*/ -+#define STAT_CTRL 0x0e80 /* 32 bit Status BMU Control Reg */ -+#define STAT_LAST_IDX 0x0e84 /* 16 bit Status BMU Last Index */ -+ /* 0x0e85 - 0x0e86: reserved */ -+#define STAT_LIST_ADDR_LO 0x0e88 /* 32 bit Status List Start Addr (low) */ -+#define STAT_LIST_ADDR_HI 0x0e8c /* 32 bit Status List Start Addr (high) */ -+#define STAT_TXA1_RIDX 0x0e90 /* 16 bit Status TxA1 Report Index Reg */ -+#define STAT_TXS1_RIDX 0x0e92 /* 16 bit Status TxS1 Report Index Reg */ -+#define STAT_TXA2_RIDX 0x0e94 /* 16 bit Status TxA2 Report Index Reg */ -+#define STAT_TXS2_RIDX 0x0e96 /* 16 bit Status TxS2 Report Index Reg */ -+#define STAT_TX_IDX_TH 0x0e98 /* 16 bit Status Tx Index Threshold Reg */ -+ /* 0x0e9a - 0x0e9b: reserved */ -+#define STAT_PUT_IDX 0x0e9c /* 16 bit Status Put Index Reg */ -+ /* 0x0e9e - 0x0e9f: reserved */ -+ -+/* FIFO Control/Status Registers (Yukon-2 only) */ -+#define STAT_FIFO_WP 0x0ea0 /* 8 bit Status FIFO Write Pointer Reg */ -+ /* 0x0ea1 - 0x0ea3: reserved */ -+#define STAT_FIFO_RP 0x0ea4 /* 8 bit Status FIFO Read Pointer Reg */ -+ /* 0x0ea5: reserved */ -+#define STAT_FIFO_RSP 0x0ea6 /* 8 bit Status FIFO Read Shadow Ptr */ -+ /* 0x0ea7: reserved */ -+#define STAT_FIFO_LEVEL 0x0ea8 /* 8 bit Status FIFO Level Reg */ -+ /* 0x0ea9: reserved */ -+#define STAT_FIFO_SHLVL 0x0eaa /* 8 bit Status FIFO Shadow Level Reg */ -+ /* 0x0eab: reserved */ -+#define STAT_FIFO_WM 0x0eac /* 8 bit Status FIFO Watermark Reg */ -+#define STAT_FIFO_ISR_WM 0x0ead /* 8 bit Status FIFO ISR Watermark Reg */ -+ /* 0x0eae - 0x0eaf: reserved */ -+ -+/* Level and ISR Timer Registers (Yukon-2 only) */ -+#define STAT_LEV_TIMER_INI 0x0eb0 /* 32 bit Level Timer Init. Value Reg */ -+#define STAT_LEV_TIMER_CNT 0x0eb4 /* 32 bit Level Timer Counter Reg */ -+#define STAT_LEV_TIMER_CTRL 0x0eb8 /* 8 bit Level Timer Control Reg */ -+#define STAT_LEV_TIMER_TEST 0x0eb9 /* 8 bit Level Timer Test Reg */ -+ /* 0x0eba - 0x0ebf: reserved */ -+#define STAT_TX_TIMER_INI 0x0ec0 /* 32 bit Tx Timer Init. Value Reg */ -+#define STAT_TX_TIMER_CNT 0x0ec4 /* 32 bit Tx Timer Counter Reg */ -+#define STAT_TX_TIMER_CTRL 0x0ec8 /* 8 bit Tx Timer Control Reg */ -+#define STAT_TX_TIMER_TEST 0x0ec9 /* 8 bit Tx Timer Test Reg */ -+ /* 0x0eca - 0x0ecf: reserved */ -+#define STAT_ISR_TIMER_INI 0x0ed0 /* 32 bit ISR Timer Init. Value Reg */ -+#define STAT_ISR_TIMER_CNT 0x0ed4 /* 32 bit ISR Timer Counter Reg */ -+#define STAT_ISR_TIMER_CTRL 0x0ed8 /* 8 bit ISR Timer Control Reg */ -+#define STAT_ISR_TIMER_TEST 0x0ed9 /* 8 bit ISR Timer Test Reg */ -+ /* 0x0eda - 0x0eff: reserved */ -+ -+#define ST_LAST_IDX_MASK 0x007f /* Last Index Mask */ -+#define ST_TXRP_IDX_MASK 0x0fff /* Tx Report Index Mask */ -+#define ST_TXTH_IDX_MASK 0x0fff /* Tx Threshold Index Mask */ -+#define ST_WM_IDX_MASK 0x3f /* FIFO Watermark Index Mask */ - - /* - * Bank 30 -@@ -742,11 +1111,9 @@ extern "C" { - #define WOL_MATCH_RES 0x0f23 /* 8 bit WOL Match Result Reg */ - #define WOL_MAC_ADDR_LO 0x0f24 /* 32 bit WOL MAC Address Low */ - #define WOL_MAC_ADDR_HI 0x0f28 /* 16 bit WOL MAC Address High */ --#define WOL_PATT_RPTR 0x0f2c /* 8 bit WOL Pattern Read Ptr */ -- --/* use this macro to access above registers */ --#define WOL_REG(Reg) ((Reg) + (pAC->GIni.GIWolOffs)) -- -+#define WOL_PATT_PME 0x0f2a /* 8 bit WOL PME Match Enable (Yukon-2) */ -+#define WOL_PATT_ASFM 0x0f2b /* 8 bit WOL ASF Match Enable (Yukon-2) */ -+#define WOL_PATT_RPTR 0x0f2c /* 8 bit WOL Pattern Read Pointer */ - - /* WOL Pattern Length Registers (YUKON only) */ - -@@ -764,11 +1131,22 @@ extern "C" { - */ - /* 0x0f80 - 0x0fff: reserved */ - -+/* WOL registers link 2 */ -+ -+/* use this macro to access WOL registers */ -+#define WOL_REG(Port, Reg) ((Reg) + ((Port)*0x80) + (pAC->GIni.GIWolOffs)) -+ - /* - * Bank 32 - 33 - */ - #define WOL_PATT_RAM_1 0x1000 /* WOL Pattern RAM Link 1 */ -+#define WOL_PATT_RAM_2 0x1400 /* WOL Pattern RAM Link 2 */ -+ -+/* use this macro to retrieve the pattern ram base address */ -+#define WOL_PATT_RAM_BASE(Port) (WOL_PATT_RAM_1 + (Port)*0x400) - -+/* offset to configuration space on Yukon-2 */ -+#define Y2_CFG_SPC 0x1c00 - /* - * Bank 0x22 - 0x3f - */ -@@ -800,13 +1178,27 @@ extern "C" { - */ - /* B0_RAP 8 bit Register Address Port */ - /* Bit 7: reserved */ --#define RAP_RAP 0x3f /* Bit 6..0: 0 = block 0,..,6f = block 6f */ -+#define RAP_MSK 0x7f /* Bit 6..0: 0 = block 0,..,6f = block 6f */ -+ -+/* B0_CTST 24 bit Control/Status register */ -+ /* Bit 23..18: reserved */ -+#define Y2_VMAIN_AVAIL BIT_17 /* VMAIN available (YUKON-2 only) */ -+#define Y2_VAUX_AVAIL BIT_16 /* VAUX available (YUKON-2 only) */ -+#define Y2_HW_WOL_ON BIT_15S /* HW WOL On (Yukon-EC Ultra A1 only) */ -+#define Y2_HW_WOL_OFF BIT_14S /* HW WOL Off (Yukon-EC Ultra A1 only) */ -+#define Y2_ASF_ENABLE BIT_13S /* ASF Unit Enable (YUKON-2 only) */ -+#define Y2_ASF_DISABLE BIT_12S /* ASF Unit Disable (YUKON-2 only) */ -+#define Y2_CLK_RUN_ENA BIT_11S /* CLK_RUN Enable (YUKON-2 only) */ -+#define Y2_CLK_RUN_DIS BIT_10S /* CLK_RUN Disable (YUKON-2 only) */ -+#define Y2_LED_STAT_ON BIT_9S /* Status LED On (YUKON-2 only) */ -+#define Y2_LED_STAT_OFF BIT_8S /* Status LED Off (YUKON-2 only) */ -+ /* Bit 7.. 0: same as below */ - - /* B0_CTST 16 bit Control/Status register */ - /* Bit 15..14: reserved */ --#define CS_CLK_RUN_HOT BIT_13S /* CLK_RUN hot m. (YUKON-Lite only) */ --#define CS_CLK_RUN_RST BIT_12S /* CLK_RUN reset (YUKON-Lite only) */ --#define CS_CLK_RUN_ENA BIT_11S /* CLK_RUN enable (YUKON-Lite only) */ -+#define CS_CLK_RUN_HOT BIT_13S /* CLK_RUN Hot m. (YUKON-Lite only) */ -+#define CS_CLK_RUN_RST BIT_12S /* CLK_RUN Reset (YUKON-Lite only) */ -+#define CS_CLK_RUN_ENA BIT_11S /* CLK_RUN Enable (YUKON-Lite only) */ - #define CS_VAUX_AVAIL BIT_10S /* VAUX available (YUKON only) */ - #define CS_BUS_CLOCK BIT_9S /* Bus Clock 0/1 = 33/66 MHz */ - #define CS_BUS_SLOT_SZ BIT_8S /* Slot Size 0/1 = 32/64 bit slot */ -@@ -814,26 +1206,27 @@ extern "C" { - #define CS_CL_SW_IRQ BIT_6S /* Clear IRQ SW Request */ - #define CS_STOP_DONE BIT_5S /* Stop Master is finished */ - #define CS_STOP_MAST BIT_4S /* Command Bit to stop the master */ --#define CS_MRST_CLR BIT_3S /* Clear Master reset */ --#define CS_MRST_SET BIT_2S /* Set Master reset */ --#define CS_RST_CLR BIT_1S /* Clear Software reset */ --#define CS_RST_SET BIT_0S /* Set Software reset */ -+#define CS_MRST_CLR BIT_3S /* Clear Master Reset */ -+#define CS_MRST_SET BIT_2S /* Set Master Reset */ -+#define CS_RST_CLR BIT_1S /* Clear Software Reset */ -+#define CS_RST_SET BIT_0S /* Set Software Reset */ - --/* B0_LED 8 Bit LED register */ -+/* B0_LED 8 Bit LED register (GENESIS only)*/ - /* Bit 7.. 2: reserved */ --#define LED_STAT_ON BIT_1S /* Status LED on */ --#define LED_STAT_OFF BIT_0S /* Status LED off */ -+#define LED_STAT_ON BIT_1S /* Status LED On */ -+#define LED_STAT_OFF BIT_0S /* Status LED Off */ - - /* B0_POWER_CTRL 8 Bit Power Control reg (YUKON only) */ - #define PC_VAUX_ENA BIT_7 /* Switch VAUX Enable */ --#define PC_VAUX_DIS BIT_6 /* Switch VAUX Disable */ --#define PC_VCC_ENA BIT_5 /* Switch VCC Enable */ --#define PC_VCC_DIS BIT_4 /* Switch VCC Disable */ --#define PC_VAUX_ON BIT_3 /* Switch VAUX On */ --#define PC_VAUX_OFF BIT_2 /* Switch VAUX Off */ --#define PC_VCC_ON BIT_1 /* Switch VCC On */ --#define PC_VCC_OFF BIT_0 /* Switch VCC Off */ -+#define PC_VAUX_DIS BIT_6 /* Switch VAUX Disable */ -+#define PC_VCC_ENA BIT_5 /* Switch VCC Enable */ -+#define PC_VCC_DIS BIT_4 /* Switch VCC Disable */ -+#define PC_VAUX_ON BIT_3 /* Switch VAUX On */ -+#define PC_VAUX_OFF BIT_2 /* Switch VAUX Off */ -+#define PC_VCC_ON BIT_1 /* Switch VCC On */ -+#define PC_VCC_OFF BIT_0 /* Switch VCC Off */ - -+/* Yukon and Genesis */ - /* B0_ISRC 32 bit Interrupt Source Register */ - /* B0_IMSK 32 bit Interrupt Mask Register */ - /* B0_SP_ISRC 32 bit Special Interrupt Source Reg */ -@@ -879,12 +1272,51 @@ extern "C" { - #define IS_XA2_F BIT_1 /* Q_XA2 End of Frame */ - #define IS_XA2_C BIT_0 /* Q_XA2 Encoding Error */ - -+/* Yukon-2 */ -+/* B0_ISRC 32 bit Interrupt Source Register */ -+/* B0_IMSK 32 bit Interrupt Mask Register */ -+/* B0_SP_ISRC 32 bit Special Interrupt Source Reg */ -+/* B2_IRQM_MSK 32 bit IRQ Moderation Mask */ -+/* B0_Y2_SP_ISRC2 32 bit Special Interrupt Source Reg 2 */ -+/* B0_Y2_SP_ISRC3 32 bit Special Interrupt Source Reg 3 */ -+/* B0_Y2_SP_EISR 32 bit Enter ISR Reg */ -+/* B0_Y2_SP_LISR 32 bit Leave ISR Reg */ -+#define Y2_IS_PORT_MASK(Port, Mask) ((Mask) << (Port*8)) -+#define Y2_IS_HW_ERR BIT_31 /* Interrupt HW Error */ -+#define Y2_IS_STAT_BMU BIT_30 /* Status BMU Interrupt */ -+#define Y2_IS_ASF BIT_29 /* ASF subsystem Interrupt */ -+ /* Bit 28: reserved */ -+#define Y2_IS_POLL_CHK BIT_27 /* Check IRQ from polling unit */ -+#define Y2_IS_TWSI_RDY BIT_26 /* IRQ on end of TWSI Tx */ -+#define Y2_IS_IRQ_SW BIT_25 /* SW forced IRQ */ -+#define Y2_IS_TIMINT BIT_24 /* IRQ from Timer */ -+ /* Bit 23..16 reserved */ -+ /* Link 2 Interrupts */ -+#define Y2_IS_IRQ_PHY2 BIT_12 /* Interrupt from PHY 2 */ -+#define Y2_IS_IRQ_MAC2 BIT_11 /* Interrupt from MAC 2 */ -+#define Y2_IS_CHK_RX2 BIT_10 /* Descriptor error Rx 2 */ -+#define Y2_IS_CHK_TXS2 BIT_9 /* Descriptor error TXS 2 */ -+#define Y2_IS_CHK_TXA2 BIT_8 /* Descriptor error TXA 2 */ -+ /* Bit 7.. 5 reserved */ -+ /* Link 1 interrupts */ -+#define Y2_IS_IRQ_PHY1 BIT_4 /* Interrupt from PHY 1 */ -+#define Y2_IS_IRQ_MAC1 BIT_3 /* Interrupt from MAC 1 */ -+#define Y2_IS_CHK_RX1 BIT_2 /* Descriptor error Rx 1 */ -+#define Y2_IS_CHK_TXS1 BIT_1 /* Descriptor error TXS 1 */ -+#define Y2_IS_CHK_TXA1 BIT_0 /* Descriptor error TXA 1 */ -+ -+#define Y2_IS_L1_MASK 0x0000001fUL /* IRQ Mask for port 1 */ -+ -+#define Y2_IS_L2_MASK 0x00001f00UL /* IRQ Mask for port 2 */ -+ -+#define Y2_IS_ALL_MSK 0xef001f1fUL /* All Interrupt bits */ - -+/* Yukon and Genesis */ - /* B0_HWE_ISRC 32 bit HW Error Interrupt Src Reg */ - /* B0_HWE_IMSK 32 bit HW Error Interrupt Mask Reg */ - /* B2_IRQM_HWE_MSK 32 bit IRQ Moderation HW Error Mask */ - #define IS_ERR_MSK 0x00000fffL /* All Error bits */ -- /* Bit 31..14: reserved */ -+ /* Bit 31..14: reserved */ - #define IS_IRQ_TIST_OV BIT_13 /* Time Stamp Timer Overflow (YUKON only) */ - #define IS_IRQ_SENSOR BIT_12 /* IRQ from Sensor (YUKON only) */ - #define IS_IRQ_MST_ERR BIT_11 /* IRQ master error detected */ -@@ -900,6 +1332,43 @@ extern "C" { - #define IS_R1_PAR_ERR BIT_1 /* Queue R1 Parity Error */ - #define IS_R2_PAR_ERR BIT_0 /* Queue R2 Parity Error */ - -+/* Yukon-2 */ -+/* B0_HWE_ISRC 32 bit HW Error Interrupt Src Reg */ -+/* B0_HWE_IMSK 32 bit HW Error Interrupt Mask Reg */ -+/* B2_IRQM_HWE_MSK 32 bit IRQ Moderation HW Error Mask */ -+ /* Bit: 31..30 reserved */ -+#define Y2_IS_TIST_OV BIT_29 /* Time Stamp Timer overflow interrupt */ -+#define Y2_IS_SENSOR BIT_28 /* Sensor interrupt */ -+#define Y2_IS_MST_ERR BIT_27 /* Master error interrupt */ -+#define Y2_IS_IRQ_STAT BIT_26 /* Status exception interrupt */ -+#define Y2_IS_PCI_EXP BIT_25 /* PCI-Express interrupt */ -+#define Y2_IS_PCI_NEXP BIT_24 /* Bus Abort detected */ -+ /* Bit: 23..14 reserved */ -+ /* Link 2 */ -+#define Y2_IS_PAR_RD2 BIT_13 /* Read RAM parity error interrupt */ -+#define Y2_IS_PAR_WR2 BIT_12 /* Write RAM parity error interrupt */ -+#define Y2_IS_PAR_MAC2 BIT_11 /* MAC hardware fault interrupt */ -+#define Y2_IS_PAR_RX2 BIT_10 /* Parity Error Rx Queue 2 */ -+#define Y2_IS_TCP_TXS2 BIT_9 /* TCP length mismatch sync Tx queue IRQ */ -+#define Y2_IS_TCP_TXA2 BIT_8 /* TCP length mismatch async Tx queue IRQ */ -+ /* Bit: 9.. 6 reserved */ -+ /* Link 1 */ -+#define Y2_IS_PAR_RD1 BIT_5 /* Read RAM parity error interrupt */ -+#define Y2_IS_PAR_WR1 BIT_4 /* Write RAM parity error interrupt */ -+#define Y2_IS_PAR_MAC1 BIT_3 /* MAC hardware fault interrupt */ -+#define Y2_IS_PAR_RX1 BIT_2 /* Parity Error Rx Queue 1 */ -+#define Y2_IS_TCP_TXS1 BIT_1 /* TCP length mismatch sync Tx queue IRQ */ -+#define Y2_IS_TCP_TXA1 BIT_0 /* TCP length mismatch async Tx queue IRQ */ -+ -+#define Y2_HWE_L1_MASK (Y2_IS_PAR_RD1 | Y2_IS_PAR_WR1 | Y2_IS_PAR_MAC1 |\ -+ Y2_IS_PAR_RX1 | Y2_IS_TCP_TXS1| Y2_IS_TCP_TXA1) -+#define Y2_HWE_L2_MASK (Y2_IS_PAR_RD2 | Y2_IS_PAR_WR2 | Y2_IS_PAR_MAC2 |\ -+ Y2_IS_PAR_RX2 | Y2_IS_TCP_TXS2| Y2_IS_TCP_TXA2) -+ -+#define Y2_HWE_ALL_MSK (Y2_IS_TIST_OV | /* Y2_IS_SENSOR | */ Y2_IS_MST_ERR |\ -+ Y2_IS_IRQ_STAT | Y2_IS_PCI_EXP |\ -+ Y2_HWE_L1_MASK | Y2_HWE_L2_MASK) -+ - /* B2_CONN_TYP 8 bit Connector type */ - /* B2_PMD_TYP 8 bit PMD type */ - /* Values of connector and PMD type comply to SysKonnect internal std */ -@@ -908,19 +1377,74 @@ extern "C" { - #define CFG_CHIP_R_MSK (0xf<<4) /* Bit 7.. 4: Chip Revision */ - /* Bit 3.. 2: reserved */ - #define CFG_DIS_M2_CLK BIT_1S /* Disable Clock for 2nd MAC */ --#define CFG_SNG_MAC BIT_0S /* MAC Config: 0=2 MACs / 1=1 MAC*/ -+#define CFG_SNG_MAC BIT_0S /* MAC Config: 0 = 2 MACs; 1 = 1 MAC */ - --/* B2_CHIP_ID 8 bit Chip Identification Number */ -+/* B2_CHIP_ID 8 bit Chip Identification Number */ - #define CHIP_ID_GENESIS 0x0a /* Chip ID for GENESIS */ - #define CHIP_ID_YUKON 0xb0 /* Chip ID for YUKON */ - #define CHIP_ID_YUKON_LITE 0xb1 /* Chip ID for YUKON-Lite (Rev. A1-A3) */ - #define CHIP_ID_YUKON_LP 0xb2 /* Chip ID for YUKON-LP */ -+#define CHIP_ID_YUKON_XL 0xb3 /* Chip ID for YUKON-2 XL */ -+#define CHIP_ID_YUKON_EC_U 0xb4 /* Chip ID for YUKON-2 EC Ultra */ -+#define CHIP_ID_YUKON_EC 0xb6 /* Chip ID for YUKON-2 EC */ -+#define CHIP_ID_YUKON_FE 0xb7 /* Chip ID for YUKON-2 FE */ - - #define CHIP_REV_YU_LITE_A1 3 /* Chip Rev. for YUKON-Lite A1,A2 */ - #define CHIP_REV_YU_LITE_A3 7 /* Chip Rev. for YUKON-Lite A3 */ - -+#define CHIP_REV_YU_XL_A0 0 /* Chip Rev. for Yukon-2 A0 */ -+#define CHIP_REV_YU_XL_A1 1 /* Chip Rev. for Yukon-2 A1 */ -+#define CHIP_REV_YU_XL_A2 2 /* Chip Rev. for Yukon-2 A2 */ -+#define CHIP_REV_YU_XL_A3 3 /* Chip Rev. for Yukon-2 A3 */ -+ -+#define CHIP_REV_YU_EC_A1 0 /* Chip Rev. for Yukon-EC A0,A1 */ -+#define CHIP_REV_YU_EC_A2 1 /* Chip Rev. for Yukon-EC A2 */ -+#define CHIP_REV_YU_EC_A3 2 /* Chip Rev. for Yukon-EC A3 */ -+ -+#define CHIP_REV_YU_EC_U_A0 1 /* Chip Rev. for Yukon-EC Ultra A0 */ -+#define CHIP_REV_YU_EC_U_A1 2 /* Chip Rev. for Yukon-EC Ultra A1 */ -+ -+/* B2_Y2_CLK_GATE 8 bit Clock Gating (Yukon-2 only) */ -+#define Y2_STATUS_LNK2_INAC BIT_7S /* Status Link 2 inactiv (0 = activ) */ -+#define Y2_CLK_GAT_LNK2_DIS BIT_6S /* Disable PHY clock for Link 2 */ -+#define Y2_COR_CLK_LNK2_DIS BIT_5S /* Disable Core clock Link 2 */ -+#define Y2_PCI_CLK_LNK2_DIS BIT_4S /* Disable PCI clock Link 2 */ -+#define Y2_STATUS_LNK1_INAC BIT_3S /* Status Link 1 inactiv (0 = activ) */ -+#define Y2_CLK_GAT_LNK1_DIS BIT_2S /* Disable PHY clock for Link 1 */ -+#define Y2_COR_CLK_LNK1_DIS BIT_1S /* Disable Core clock Link 1 */ -+#define Y2_PCI_CLK_LNK1_DIS BIT_0S /* Disable PCI clock Link 1 */ -+ -+/* B2_Y2_HW_RES 8 bit HW Resources (Yukon-2 only) */ -+ /* Bit 7.. 5: reserved */ -+#define CFG_LED_MODE_MSK (7<<2) /* Bit 4.. 2: LED Mode Mask */ -+#define CFG_LINK_2_AVAIL BIT_1S /* Link 2 available */ -+#define CFG_LINK_1_AVAIL BIT_0S /* Link 1 available */ -+ -+#define CFG_LED_MODE(x) (((x) & CFG_LED_MODE_MSK) >> 2) -+#define CFG_DUAL_MAC_MSK (CFG_LINK_2_AVAIL | CFG_LINK_1_AVAIL) -+ -+#define CFG_LED_SING_ACT_LNK 0 /* Single LED ACT/LNK mode */ -+#define CFG_LED_DUAL_ACT_LNK 1 /* Dual LED ACT/LNK mode */ -+ -+/* B2_E_3 8 bit lower 4 bits used for HW self test result */ -+#define B2_E3_RES_MASK 0x0f -+ - /* B2_FAR 32 bit Flash-Prom Addr Reg/Cnt */ --#define FAR_ADDR 0x1ffffL /* Bit 16.. 0: FPROM Address mask */ -+#define FAR_ADDR 0x1ffffL /* Bit 16.. 0: FPROM Address Mask */ -+ -+/* B2_Y2_CLK_CTRL 32 bit Core Clock Frequency Control Register (Yukon-2/EC) */ -+ /* Bit 31..24: reserved */ -+/* Yukon-EC/FE */ -+#define Y2_CLK_DIV_VAL_MSK (0xffL<<16) /* Bit 23..16: Clock Divisor Value */ -+#define Y2_CLK_DIV_VAL(x) (SHIFT16(x) & Y2_CLK_DIV_VAL_MSK) -+/* Yukon-2 */ -+#define Y2_CLK_DIV_VAL2_MSK (7L<<21) /* Bit 23..21: Clock Divisor Value */ -+#define Y2_CLK_SELECT2_MSK (0x1fL<<16) /* Bit 20..16: Clock Select */ -+#define Y2_CLK_DIV_VAL_2(x) (SHIFT21(x) & Y2_CLK_DIV_VAL2_MSK) -+#define Y2_CLK_SEL_VAL_2(x) (SHIFT16(x) & Y2_CLK_SELECT2_MSK) -+ /* Bit 15.. 2: reserved */ -+#define Y2_CLK_DIV_ENA BIT_1S /* Enable Core Clock Division */ -+#define Y2_CLK_DIV_DIS BIT_0S /* Disable Core Clock Division */ - - /* B2_LD_CTRL 8 bit EPROM loader control register */ - /* Bits are currently reserved */ -@@ -960,9 +1484,6 @@ extern "C" { - #define DPT_START BIT_1S /* Start Descriptor Poll Timer */ - #define DPT_STOP BIT_0S /* Stop Descriptor Poll Timer */ - --/* B2_E_3 8 bit lower 4 bits used for HW self test result */ --#define B2_E3_RES_MASK 0x0f -- - /* B2_TST_CTRL1 8 bit Test Control Register 1 */ - #define TST_FRC_DPERR_MR BIT_7S /* force DATAPERR on MST RD */ - #define TST_FRC_DPERR_MW BIT_6S /* force DATAPERR on MST WR */ -@@ -975,14 +1496,14 @@ extern "C" { - - /* B2_TST_CTRL2 8 bit Test Control Register 2 */ - /* Bit 7.. 4: reserved */ -- /* force the following error on the next master read/write */ -+ /* force the following error on the next master read/write */ - #define TST_FRC_DPERR_MR64 BIT_3S /* DataPERR RD 64 */ - #define TST_FRC_DPERR_MW64 BIT_2S /* DataPERR WR 64 */ - #define TST_FRC_APERR_1M64 BIT_1S /* AddrPERR on 1. phase */ - #define TST_FRC_APERR_2M64 BIT_0S /* AddrPERR on 2. phase */ - - /* B2_GP_IO 32 bit General Purpose I/O Register */ -- /* Bit 31..26: reserved */ -+ /* Bit 31..26: reserved */ - #define GP_DIR_9 BIT_25 /* IO_9 direct, 0=In/1=Out */ - #define GP_DIR_8 BIT_24 /* IO_8 direct, 0=In/1=Out */ - #define GP_DIR_7 BIT_23 /* IO_7 direct, 0=In/1=Out */ -@@ -1009,15 +1530,15 @@ extern "C" { - #define I2C_FLAG BIT_31 /* Start read/write if WR */ - #define I2C_ADDR (0x7fffL<<16) /* Bit 30..16: Addr to be RD/WR */ - #define I2C_DEV_SEL (0x7fL<<9) /* Bit 15.. 9: I2C Device Select */ -- /* Bit 8.. 5: reserved */ -+ /* Bit 8.. 5: reserved */ - #define I2C_BURST_LEN BIT_4 /* Burst Len, 1/4 bytes */ --#define I2C_DEV_SIZE (7<<1) /* Bit 3.. 1: I2C Device Size */ --#define I2C_025K_DEV (0<<1) /* 0: 256 Bytes or smal. */ --#define I2C_05K_DEV (1<<1) /* 1: 512 Bytes */ --#define I2C_1K_DEV (2<<1) /* 2: 1024 Bytes */ --#define I2C_2K_DEV (3<<1) /* 3: 2048 Bytes */ --#define I2C_4K_DEV (4<<1) /* 4: 4096 Bytes */ --#define I2C_8K_DEV (5<<1) /* 5: 8192 Bytes */ -+#define I2C_DEV_SIZE (7<<1) /* Bit 3.. 1: I2C Device Size */ -+#define I2C_025K_DEV (0<<1) /* 0: 256 Bytes or smaller */ -+#define I2C_05K_DEV (1<<1) /* 1: 512 Bytes */ -+#define I2C_1K_DEV (2<<1) /* 2: 1024 Bytes */ -+#define I2C_2K_DEV (3<<1) /* 3: 2048 Bytes */ -+#define I2C_4K_DEV (4<<1) /* 4: 4096 Bytes */ -+#define I2C_8K_DEV (5<<1) /* 5: 8192 Bytes */ - #define I2C_16K_DEV (6<<1) /* 6: 16384 Bytes */ - #define I2C_32K_DEV (7<<1) /* 7: 32768 Bytes */ - #define I2C_STOP BIT_0 /* Interrupt I2C transfer */ -@@ -1026,16 +1547,14 @@ extern "C" { - /* Bit 31.. 1 reserved */ - #define I2C_CLR_IRQ BIT_0 /* Clear I2C IRQ */ - --/* B2_I2C_SW 32 bit (8 bit access) I2C HW SW Port Register */ -+/* B2_I2C_SW 32 bit (8 bit access) I2C SW Port Register */ - /* Bit 7.. 3: reserved */ - #define I2C_DATA_DIR BIT_2S /* direction of I2C_DATA */ --#define I2C_DATA BIT_1S /* I2C Data Port */ --#define I2C_CLK BIT_0S /* I2C Clock Port */ -+#define I2C_DATA BIT_1S /* I2C Data Port */ -+#define I2C_CLK BIT_0S /* I2C Clock Port */ - --/* -- * I2C Address -- */ --#define I2C_SENS_ADDR LM80_ADDR /* I2C Sensor Address, (Volt and Temp)*/ -+/* I2C Address */ -+#define I2C_SENS_ADDR LM80_ADDR /* I2C Sensor Address (Volt and Temp) */ - - - /* B2_BSC_CTRL 8 bit Blink Source Counter Control */ -@@ -1052,16 +1571,20 @@ extern "C" { - #define BSC_T_OFF BIT_1S /* Test mode off */ - #define BSC_T_STEP BIT_0S /* Test step */ - -+/* Y2_PEX_PHY_ADDR/DATA PEX PHY address and data reg (Yukon-2 only) */ -+#define PEX_RD_ACCESS BIT_31 /* Access Mode Read = 1, Write = 0 */ -+#define PEX_DB_ACCESS BIT_30 /* Access to debug register */ -+ - - /* B3_RAM_ADDR 32 bit RAM Address, to read or write */ - /* Bit 31..19: reserved */ - #define RAM_ADR_RAN 0x0007ffffL /* Bit 18.. 0: RAM Address Range */ - - /* RAM Interface Registers */ --/* B3_RI_CTRL 16 bit RAM Iface Control Register */ -+/* B3_RI_CTRL 16 bit RAM Interface Control Register */ - /* Bit 15..10: reserved */ --#define RI_CLR_RD_PERR BIT_9S /* Clear IRQ RAM Read Parity Err */ --#define RI_CLR_WR_PERR BIT_8S /* Clear IRQ RAM Write Parity Err*/ -+#define RI_CLR_RD_PERR BIT_9S /* Clear IRQ RAM Read Parity Err */ -+#define RI_CLR_WR_PERR BIT_8S /* Clear IRQ RAM Write Parity Err */ - /* Bit 7.. 2: reserved */ - #define RI_RST_CLR BIT_1S /* Clear RAM Interface Reset */ - #define RI_RST_SET BIT_0S /* Set RAM Interface Reset */ -@@ -1171,7 +1694,7 @@ extern "C" { - /* Bit 31..16: reserved */ - #define BC_MAX 0xffff /* Bit 15.. 0: Byte counter */ - --/* BMU Control Status Registers */ -+/* BMU Control / Status Registers (Yukon and Genesis) */ - /* B0_R1_CSR 32 bit BMU Ctrl/Stat Rx Queue 1 */ - /* B0_R2_CSR 32 bit BMU Ctrl/Stat Rx Queue 2 */ - /* B0_XA1_CSR 32 bit BMU Ctrl/Stat Sync Tx Queue 1 */ -@@ -1212,13 +1735,48 @@ extern "C" { - CSR_SV_RUN | CSR_DREAD_RUN | CSR_DWRITE_RUN |\ - CSR_TRANS_RUN) - -+/* Rx BMU Control / Status Registers (Yukon-2) */ -+#define BMU_IDLE BIT_31 /* BMU Idle State */ -+#define BMU_RX_TCP_PKT BIT_30 /* Rx TCP Packet (when RSS Hash enabled) */ -+#define BMU_RX_IP_PKT BIT_29 /* Rx IP Packet (when RSS Hash enabled) */ -+ /* Bit 28..16: reserved */ -+#define BMU_ENA_RX_RSS_HASH BIT_15 /* Enable Rx RSS Hash */ -+#define BMU_DIS_RX_RSS_HASH BIT_14 /* Disable Rx RSS Hash */ -+#define BMU_ENA_RX_CHKSUM BIT_13 /* Enable Rx TCP/IP Checksum Check */ -+#define BMU_DIS_RX_CHKSUM BIT_12 /* Disable Rx TCP/IP Checksum Check */ -+#define BMU_CLR_IRQ_PAR BIT_11 /* Clear IRQ on Parity errors (Rx) */ -+#define BMU_CLR_IRQ_TCP BIT_11 /* Clear IRQ on TCP segmen. error (Tx) */ -+#define BMU_CLR_IRQ_CHK BIT_10 /* Clear IRQ Check */ -+#define BMU_STOP BIT_9 /* Stop Rx/Tx Queue */ -+#define BMU_START BIT_8 /* Start Rx/Tx Queue */ -+#define BMU_FIFO_OP_ON BIT_7 /* FIFO Operational On */ -+#define BMU_FIFO_OP_OFF BIT_6 /* FIFO Operational Off */ -+#define BMU_FIFO_ENA BIT_5 /* Enable FIFO */ -+#define BMU_FIFO_RST BIT_4 /* Reset FIFO */ -+#define BMU_OP_ON BIT_3 /* BMU Operational On */ -+#define BMU_OP_OFF BIT_2 /* BMU Operational Off */ -+#define BMU_RST_CLR BIT_1 /* Clear BMU Reset (Enable) */ -+#define BMU_RST_SET BIT_0 /* Set BMU Reset */ -+ -+#define BMU_CLR_RESET (BMU_FIFO_RST | BMU_OP_OFF | BMU_RST_CLR) -+#define BMU_OPER_INIT (BMU_CLR_IRQ_PAR | BMU_CLR_IRQ_CHK | BMU_START | \ -+ BMU_FIFO_ENA | BMU_OP_ON) -+ -+/* Tx BMU Control / Status Registers (Yukon-2) */ -+ /* Bit 31: same as for Rx */ -+ /* Bit 30..14: reserved */ -+#define BMU_TX_IPIDINCR_ON BIT_13 /* Enable IP ID Increment */ -+#define BMU_TX_IPIDINCR_OFF BIT_12 /* Disable IP ID Increment */ -+#define BMU_TX_CLR_IRQ_TCP BIT_11 /* Clear IRQ on TCP segm. length mism. */ -+ /* Bit 10..0: same as for Rx */ -+ - /* Q_F 32 bit Flag Register */ - /* Bit 31..28: reserved */ - #define F_ALM_FULL BIT_27 /* Rx FIFO: almost full */ - #define F_EMPTY BIT_27 /* Tx FIFO: empty flag */ - #define F_FIFO_EOF BIT_26 /* Tag (EOF Flag) bit in FIFO */ - #define F_WM_REACHED BIT_25 /* Watermark reached */ -- /* reserved */ -+#define F_M_RX_RAM_DIS BIT_24 /* MAC Rx RAM Read Port disable */ - #define F_FIFO_LEVEL (0x1fL<<16) /* Bit 23..16: # of Qwords in FIFO */ - /* Bit 15..11: reserved */ - #define F_WATER_MARK 0x0007ffL /* Bit 10.. 0: Watermark */ -@@ -1260,6 +1818,13 @@ extern "C" { - /* Bit 3: reserved */ - #define T3_VRAM_MSK 7 /* Bit 2.. 0: Virtual RAM Buffer Address */ - -+/* Queue Prefetch Unit Offsets, use Y2_PREF_Q_ADDR() to address (Yukon-2 only)*/ -+/* PREF_UNIT_CTRL_REG 32 bit Prefetch Control register */ -+#define PREF_UNIT_OP_ON BIT_3 /* prefetch unit operational */ -+#define PREF_UNIT_OP_OFF BIT_2 /* prefetch unit not operational */ -+#define PREF_UNIT_RST_CLR BIT_1 /* Clear Prefetch Unit Reset */ -+#define PREF_UNIT_RST_SET BIT_0 /* Set Prefetch Unit Reset */ -+ - /* RAM Buffer Register Offsets, use RB_ADDR(Queue, Offs) to access */ - /* RB_START 32 bit RAM Buffer Start Address */ - /* RB_END 32 bit RAM Buffer End Address */ -@@ -1275,24 +1840,24 @@ extern "C" { - #define RB_MSK 0x0007ffff /* Bit 18.. 0: RAM Buffer Pointer Bits */ - - /* RB_TST2 8 bit RAM Buffer Test Register 2 */ -- /* Bit 7.. 4: reserved */ --#define RB_PC_DEC BIT_3S /* Packet Counter Decrem */ -+ /* Bit 7.. 4: reserved */ -+#define RB_PC_DEC BIT_3S /* Packet Counter Decrement */ - #define RB_PC_T_ON BIT_2S /* Packet Counter Test On */ --#define RB_PC_T_OFF BIT_1S /* Packet Counter Tst Off */ --#define RB_PC_INC BIT_0S /* Packet Counter Increm */ -+#define RB_PC_T_OFF BIT_1S /* Packet Counter Test Off */ -+#define RB_PC_INC BIT_0S /* Packet Counter Increment */ - - /* RB_TST1 8 bit RAM Buffer Test Register 1 */ - /* Bit 7: reserved */ - #define RB_WP_T_ON BIT_6S /* Write Pointer Test On */ - #define RB_WP_T_OFF BIT_5S /* Write Pointer Test Off */ --#define RB_WP_INC BIT_4S /* Write Pointer Increm */ -+#define RB_WP_INC BIT_4S /* Write Pointer Increment */ - /* Bit 3: reserved */ - #define RB_RP_T_ON BIT_2S /* Read Pointer Test On */ - #define RB_RP_T_OFF BIT_1S /* Read Pointer Test Off */ --#define RB_RP_DEC BIT_0S /* Read Pointer Decrement */ -+#define RB_RP_INC BIT_0S /* Read Pointer Increment */ - - /* RB_CTRL 8 bit RAM Buffer Control Register */ -- /* Bit 7.. 6: reserved */ -+ /* Bit 7.. 6: reserved */ - #define RB_ENA_STFWD BIT_5S /* Enable Store & Forward */ - #define RB_DIS_STFWD BIT_4S /* Disable Store & Forward */ - #define RB_ENA_OP_MD BIT_3S /* Enable Operation Mode */ -@@ -1300,16 +1865,31 @@ extern "C" { - #define RB_RST_CLR BIT_1S /* Clear RAM Buf STM Reset */ - #define RB_RST_SET BIT_0S /* Set RAM Buf STM Reset */ - -+/* Yukon-2 */ -+ /* Bit 31..20: reserved */ -+#define RB_CNT_DOWN BIT_19 /* Packet Counter Decrement */ -+#define RB_CNT_TST_ON BIT_18 /* Packet Counter Test On */ -+#define RB_CNT_TST_OFF BIT_17 /* Packet Counter Test Off */ -+#define RB_CNT_UP BIT_16 /* Packet Counter Increment */ -+ /* Bit 15: reserved */ -+#define RB_WP_TST_ON BIT_14 /* Write Pointer Test On */ -+#define RB_WP_TST_OFF BIT_13 /* Write Pointer Test Off */ -+#define RB_WP_UP BIT_12 /* Write Pointer Increment */ -+ /* Bit 11: reserved */ -+#define RB_RP_TST_ON BIT_10 /* Read Pointer Test On */ -+#define RB_RP_TST_OFF BIT_9 /* Read Pointer Test Off */ -+#define RB_RP_UP BIT_8 /* Read Pointer Increment */ -+ - - /* Receive and Transmit MAC FIFO Registers (GENESIS only) */ - - /* RX_MFF_EA 32 bit Receive MAC FIFO End Address */ --/* RX_MFF_WP 32 bit Receive MAC FIFO Write Pointer */ -+/* RX_MFF_WP 32 bit Receive MAC FIFO Write Pointer */ - /* RX_MFF_RP 32 bit Receive MAC FIFO Read Pointer */ - /* RX_MFF_PC 32 bit Receive MAC FIFO Packet Counter */ - /* RX_MFF_LEV 32 bit Receive MAC FIFO Level */ - /* TX_MFF_EA 32 bit Transmit MAC FIFO End Address */ --/* TX_MFF_WP 32 bit Transmit MAC FIFO Write Pointer */ -+/* TX_MFF_WP 32 bit Transmit MAC FIFO Write Pointer */ - /* TX_MFF_WSP 32 bit Transmit MAC FIFO WR Shadow Pointer */ - /* TX_MFF_RP 32 bit Transmit MAC FIFO Read Pointer */ - /* TX_MFF_PC 32 bit Transmit MAC FIFO Packet Cnt */ -@@ -1359,9 +1939,9 @@ extern "C" { - /* RX_MFF_TST2 8 bit Receive MAC FIFO Test Register 2 */ - /* TX_MFF_TST2 8 bit Transmit MAC FIFO Test Register 2 */ - /* Bit 7: reserved */ --#define MFF_WSP_T_ON BIT_6S /* Tx: Write Shadow Ptr TestOn */ --#define MFF_WSP_T_OFF BIT_5S /* Tx: Write Shadow Ptr TstOff */ --#define MFF_WSP_INC BIT_4S /* Tx: Write Shadow Ptr Increment */ -+#define MFF_WSP_T_ON BIT_6S /* Tx: Write Shadow Pointer Test On */ -+#define MFF_WSP_T_OFF BIT_5S /* Tx: Write Shadow Pointer Test Off */ -+#define MFF_WSP_INC BIT_4S /* Tx: Write Shadow Pointer Increment */ - #define MFF_PC_DEC BIT_3S /* Packet Counter Decrement */ - #define MFF_PC_T_ON BIT_2S /* Packet Counter Test On */ - #define MFF_PC_T_OFF BIT_1S /* Packet Counter Test Off */ -@@ -1372,7 +1952,7 @@ extern "C" { - /* Bit 7: reserved */ - #define MFF_WP_T_ON BIT_6S /* Write Pointer Test On */ - #define MFF_WP_T_OFF BIT_5S /* Write Pointer Test Off */ --#define MFF_WP_INC BIT_4S /* Write Pointer Increm */ -+#define MFF_WP_INC BIT_4S /* Write Pointer Increment */ - /* Bit 3: reserved */ - #define MFF_RP_T_ON BIT_2S /* Read Pointer Test On */ - #define MFF_RP_T_OFF BIT_1S /* Read Pointer Test Off */ -@@ -1391,12 +1971,16 @@ extern "C" { - - /* RX_LED_CTRL 8 bit Receive LED Cnt Control Reg */ - /* TX_LED_CTRL 8 bit Transmit LED Cnt Control Reg */ -+ /* Bit 7.. 3: reserved */ -+#define LED_START BIT_2S /* Start Counter */ -+#define LED_STOP BIT_1S /* Stop Counter */ -+#define LED_STATE BIT_0S /* Rx/Tx: LED State, 1=LED On */ -+ - /* LNK_SYNC_CTRL 8 bit Link Sync Cnt Control Register */ - /* Bit 7.. 3: reserved */ --#define LED_START BIT_2S /* Start Timer */ --#define LED_STOP BIT_1S /* Stop Timer */ --#define LED_STATE BIT_0S /* Rx/Tx: LED State, 1=LED on */ --#define LED_CLR_IRQ BIT_0S /* Lnk: Clear Link IRQ */ -+#define LNK_START BIT_2S /* Start Counter */ -+#define LNK_STOP BIT_1S /* Stop Counter */ -+#define LNK_CLR_IRQ BIT_0S /* Clear Link IRQ */ - - /* RX_LED_TST 8 bit Receive LED Cnt Test Register */ - /* TX_LED_TST 8 bit Transmit LED Cnt Test Register */ -@@ -1407,86 +1991,142 @@ extern "C" { - #define LED_T_STEP BIT_0S /* LED Counter Step */ - - /* LNK_LED_REG 8 bit Link LED Register */ -- /* Bit 7.. 6: reserved */ -+ /* Bit 7.. 6: reserved */ - #define LED_BLK_ON BIT_5S /* Link LED Blinking On */ - #define LED_BLK_OFF BIT_4S /* Link LED Blinking Off */ - #define LED_SYNC_ON BIT_3S /* Use Sync Wire to switch LED */ - #define LED_SYNC_OFF BIT_2S /* Disable Sync Wire Input */ --#define LED_ON BIT_1S /* switch LED on */ --#define LED_OFF BIT_0S /* switch LED off */ -+#define LED_ON BIT_1S /* Switch LED On */ -+#define LED_OFF BIT_0S /* Switch LED Off */ - - /* Receive and Transmit GMAC FIFO Registers (YUKON only) */ - - /* RX_GMF_EA 32 bit Rx GMAC FIFO End Address */ - /* RX_GMF_AF_THR 32 bit Rx GMAC FIFO Almost Full Thresh. */ --/* RX_GMF_WP 32 bit Rx GMAC FIFO Write Pointer */ --/* RX_GMF_WLEV 32 bit Rx GMAC FIFO Write Level */ --/* RX_GMF_RP 32 bit Rx GMAC FIFO Read Pointer */ --/* RX_GMF_RLEV 32 bit Rx GMAC FIFO Read Level */ -+/* RX_GMF_WP 32 bit Rx GMAC FIFO Write Pointer */ -+/* RX_GMF_WLEV 32 bit Rx GMAC FIFO Write Level */ -+/* RX_GMF_RP 32 bit Rx GMAC FIFO Read Pointer */ -+/* RX_GMF_RLEV 32 bit Rx GMAC FIFO Read Level */ - /* TX_GMF_EA 32 bit Tx GMAC FIFO End Address */ - /* TX_GMF_AE_THR 32 bit Tx GMAC FIFO Almost Empty Thresh.*/ --/* TX_GMF_WP 32 bit Tx GMAC FIFO Write Pointer */ --/* TX_GMF_WSP 32 bit Tx GMAC FIFO Write Shadow Ptr. */ --/* TX_GMF_WLEV 32 bit Tx GMAC FIFO Write Level */ --/* TX_GMF_RP 32 bit Tx GMAC FIFO Read Pointer */ --/* TX_GMF_RSTP 32 bit Tx GMAC FIFO Restart Pointer */ --/* TX_GMF_RLEV 32 bit Tx GMAC FIFO Read Level */ -+/* TX_GMF_WP 32 bit Tx GMAC FIFO Write Pointer */ -+/* TX_GMF_WSP 32 bit Tx GMAC FIFO Write Shadow Pointer */ -+/* TX_GMF_WLEV 32 bit Tx GMAC FIFO Write Level */ -+/* TX_GMF_RP 32 bit Tx GMAC FIFO Read Pointer */ -+/* TX_GMF_RSTP 32 bit Tx GMAC FIFO Restart Pointer */ -+/* TX_GMF_RLEV 32 bit Tx GMAC FIFO Read Level */ - - /* RX_GMF_CTRL_T 32 bit Rx GMAC FIFO Control/Test */ -- /* Bits 31..15: reserved */ --#define GMF_WP_TST_ON BIT_14 /* Write Pointer Test On */ --#define GMF_WP_TST_OFF BIT_13 /* Write Pointer Test Off */ --#define GMF_WP_STEP BIT_12 /* Write Pointer Step/Increment */ -+ /* Bit 31..28 reserved */ -+#define RX_TRUNC_ON BIT_27 /* Enable Packet Truncation */ -+#define RX_TRUNC_OFF BIT_26 /* Disable Packet Truncation */ -+#define RX_VLAN_STRIP_ON BIT_25 /* Enable VLAN Stripping */ -+#define RX_VLAN_STRIP_OFF BIT_24 /* Disable VLAN Stripping */ -+ /* Bit 23..15 reserved */ -+#define GMF_WP_TST_ON BIT_14 /* Write Pointer Test On */ -+#define GMF_WP_TST_OFF BIT_13 /* Write Pointer Test Off */ -+#define GMF_WP_STEP BIT_12 /* Write Pointer Step/Increment */ - /* Bit 11: reserved */ --#define GMF_RP_TST_ON BIT_10 /* Read Pointer Test On */ --#define GMF_RP_TST_OFF BIT_9 /* Read Pointer Test Off */ --#define GMF_RP_STEP BIT_8 /* Read Pointer Step/Increment */ --#define GMF_RX_F_FL_ON BIT_7 /* Rx FIFO Flush Mode On */ --#define GMF_RX_F_FL_OFF BIT_6 /* Rx FIFO Flush Mode Off */ --#define GMF_CLI_RX_FO BIT_5 /* Clear IRQ Rx FIFO Overrun */ --#define GMF_CLI_RX_FC BIT_4 /* Clear IRQ Rx Frame Complete */ --#define GMF_OPER_ON BIT_3 /* Operational Mode On */ --#define GMF_OPER_OFF BIT_2 /* Operational Mode Off */ --#define GMF_RST_CLR BIT_1 /* Clear GMAC FIFO Reset */ --#define GMF_RST_SET BIT_0 /* Set GMAC FIFO Reset */ -- --/* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test */ -- /* Bits 31..19: reserved */ --#define GMF_WSP_TST_ON BIT_18 /* Write Shadow Pointer Test On */ --#define GMF_WSP_TST_OFF BIT_17 /* Write Shadow Pointer Test Off */ --#define GMF_WSP_STEP BIT_16 /* Write Shadow Pointer Step/Increment */ -- /* Bits 15..7: same as for RX_GMF_CTRL_T */ --#define GMF_CLI_TX_FU BIT_6 /* Clear IRQ Tx FIFO Underrun */ --#define GMF_CLI_TX_FC BIT_5 /* Clear IRQ Tx Frame Complete */ --#define GMF_CLI_TX_PE BIT_4 /* Clear IRQ Tx Parity Error */ -+#define GMF_RP_TST_ON BIT_10 /* Read Pointer Test On */ -+#define GMF_RP_TST_OFF BIT_9 /* Read Pointer Test Off */ -+#define GMF_RP_STEP BIT_8 /* Read Pointer Step/Increment */ -+#define GMF_RX_F_FL_ON BIT_7 /* Rx FIFO Flush Mode On */ -+#define GMF_RX_F_FL_OFF BIT_6 /* Rx FIFO Flush Mode Off */ -+#define GMF_CLI_RX_FO BIT_5 /* Clear IRQ Rx FIFO Overrun */ -+#define GMF_CLI_RX_FC BIT_4 /* Clear IRQ Rx Frame Complete */ -+#define GMF_OPER_ON BIT_3 /* Operational Mode On */ -+#define GMF_OPER_OFF BIT_2 /* Operational Mode Off */ -+#define GMF_RST_CLR BIT_1 /* Clear GMAC FIFO Reset */ -+#define GMF_RST_SET BIT_0 /* Set GMAC FIFO Reset */ -+ -+/* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test (YUKON and Yukon-2) */ -+#define TX_STFW_DIS BIT_31 /* Disable Store & Forward (Yukon-EC Ultra) */ -+#define TX_STFW_ENA BIT_30 /* Enable Store & Forward (Yukon-EC Ultra) */ -+ /* Bits 29..26: reserved */ -+#define TX_VLAN_TAG_ON BIT_25 /* Enable VLAN tagging */ -+#define TX_VLAN_TAG_OFF BIT_24 /* Disable VLAN tagging */ -+#define TX_PCI_JUM_ENA BIT_23 /* Enable PCI Jumbo Mode (Yukon-EC Ultra) */ -+#define TX_PCI_JUM_DIS BIT_22 /* Disable PCI Jumbo Mode (Yukon-EC Ultra) */ -+ /* Bits 21..19: reserved */ -+#define GMF_WSP_TST_ON BIT_18 /* Write Shadow Pointer Test On */ -+#define GMF_WSP_TST_OFF BIT_17 /* Write Shadow Pointer Test Off */ -+#define GMF_WSP_STEP BIT_16 /* Write Shadow Pointer Step/Increment */ -+ /* Bits 15..8: same as for RX_GMF_CTRL_T */ -+ /* Bit 7: reserved */ -+#define GMF_CLI_TX_FU BIT_6 /* Clear IRQ Tx FIFO Underrun */ -+#define GMF_CLI_TX_FC BIT_5 /* Clear IRQ Tx Frame Complete */ -+#define GMF_CLI_TX_PE BIT_4 /* Clear IRQ Tx Parity Error */ - /* Bits 3..0: same as for RX_GMF_CTRL_T */ - - #define GMF_RX_CTRL_DEF (GMF_OPER_ON | GMF_RX_F_FL_ON) - #define GMF_TX_CTRL_DEF GMF_OPER_ON - -+#define RX_GMF_AF_THR_MIN 0x0c /* Rx GMAC FIFO Almost Full Thresh. min. */ - #define RX_GMF_FL_THR_DEF 0x0a /* Rx GMAC FIFO Flush Threshold default */ - - /* GMAC_TI_ST_CTRL 8 bit Time Stamp Timer Ctrl Reg (YUKON only) */ -- /* Bit 7.. 3: reserved */ --#define GMT_ST_START BIT_2S /* Start Time Stamp Timer */ --#define GMT_ST_STOP BIT_1S /* Stop Time Stamp Timer */ --#define GMT_ST_CLR_IRQ BIT_0S /* Clear Time Stamp Timer IRQ */ -- -+ /* Bit 7.. 3: reserved */ -+#define GMT_ST_START BIT_2S /* Start Time Stamp Timer */ -+#define GMT_ST_STOP BIT_1S /* Stop Time Stamp Timer */ -+#define GMT_ST_CLR_IRQ BIT_0S /* Clear Time Stamp Timer IRQ */ -+ -+/* POLL_CTRL 32 bit Polling Unit control register (Yukon-2 only) */ -+ /* Bit 31.. 6: reserved */ -+#define PC_CLR_IRQ_CHK BIT_5 /* Clear IRQ Check */ -+#define PC_POLL_RQ BIT_4 /* Poll Request Start */ -+#define PC_POLL_OP_ON BIT_3 /* Operational Mode On */ -+#define PC_POLL_OP_OFF BIT_2 /* Operational Mode Off */ -+#define PC_POLL_RST_CLR BIT_1 /* Clear Polling Unit Reset (Enable) */ -+#define PC_POLL_RST_SET BIT_0 /* Set Polling Unit Reset */ -+ -+ -+/* The bit definition of the following registers is still missing! */ -+/* B28_Y2_SMB_CONFIG 32 bit ASF SMBus Config Register */ -+/* B28_Y2_SMB_CSD_REG 32 bit ASF SMB Control/Status/Data */ -+/* B28_Y2_ASF_IRQ_V_BASE 32 bit ASF IRQ Vector Base */ -+ -+/* B28_Y2_ASF_STAT_CMD 32 bit ASF Status and Command Reg */ -+/* This register is used by the host driver software */ -+ /* Bit 31.. 5 reserved */ -+#define Y2_ASF_OS_PRES BIT_4S /* ASF operation system present */ -+#define Y2_ASF_RESET BIT_3S /* ASF system in reset state */ -+#define Y2_ASF_RUNNING BIT_2S /* ASF system operational */ -+#define Y2_ASF_CLR_HSTI BIT_1S /* Clear ASF IRQ */ -+#define Y2_ASF_IRQ BIT_0S /* Issue an IRQ to ASF system */ -+ -+#define Y2_ASF_UC_STATE (3<<2) /* ASF uC State */ -+#define Y2_ASF_CLK_HALT 0 /* ASF system clock stopped */ -+ -+/* B28_Y2_ASF_HOST_COM 32 bit ASF Host Communication Reg */ -+/* This register is used by the ASF firmware */ -+ /* Bit 31.. 2 reserved */ -+#define Y2_ASF_CLR_ASFI BIT_1 /* Clear host IRQ */ -+#define Y2_ASF_HOST_IRQ BIT_0 /* Issue an IRQ to HOST system */ -+ -+ -+/* STAT_CTRL 32 bit Status BMU control register (Yukon-2 only) */ -+ /* Bit 7.. 5: reserved */ -+#define SC_STAT_CLR_IRQ BIT_4 /* Status Burst IRQ clear */ -+#define SC_STAT_OP_ON BIT_3 /* Operational Mode On */ -+#define SC_STAT_OP_OFF BIT_2 /* Operational Mode Off */ -+#define SC_STAT_RST_CLR BIT_1 /* Clear Status Unit Reset (Enable) */ -+#define SC_STAT_RST_SET BIT_0 /* Set Status Unit Reset */ -+ - /* GMAC_CTRL 32 bit GMAC Control Reg (YUKON only) */ - /* Bits 31.. 8: reserved */ --#define GMC_H_BURST_ON BIT_7 /* Half Duplex Burst Mode On */ --#define GMC_H_BURST_OFF BIT_6 /* Half Duplex Burst Mode Off */ --#define GMC_F_LOOPB_ON BIT_5 /* FIFO Loopback On */ --#define GMC_F_LOOPB_OFF BIT_4 /* FIFO Loopback Off */ --#define GMC_PAUSE_ON BIT_3 /* Pause On */ --#define GMC_PAUSE_OFF BIT_2 /* Pause Off */ --#define GMC_RST_CLR BIT_1 /* Clear GMAC Reset */ --#define GMC_RST_SET BIT_0 /* Set GMAC Reset */ -+#define GMC_H_BURST_ON BIT_7 /* Half Duplex Burst Mode On */ -+#define GMC_H_BURST_OFF BIT_6 /* Half Duplex Burst Mode Off */ -+#define GMC_F_LOOPB_ON BIT_5 /* FIFO Loopback On */ -+#define GMC_F_LOOPB_OFF BIT_4 /* FIFO Loopback Off */ -+#define GMC_PAUSE_ON BIT_3 /* Pause On */ -+#define GMC_PAUSE_OFF BIT_2 /* Pause Off */ -+#define GMC_RST_CLR BIT_1 /* Clear GMAC Reset */ -+#define GMC_RST_SET BIT_0 /* Set GMAC Reset */ - - /* GPHY_CTRL 32 bit GPHY Control Reg (YUKON only) */ - /* Bits 31..29: reserved */ - #define GPC_SEL_BDT BIT_28 /* Select Bi-Dir. Transfer for MDC/MDIO */ --#define GPC_INT_POL_HI BIT_27 /* IRQ Polarity is Active HIGH */ -+#define GPC_INT_POL BIT_27 /* IRQ Polarity is Active Low */ - #define GPC_75_OHM BIT_26 /* Use 75 Ohm Termination instead of 50 */ - #define GPC_DIS_FC BIT_25 /* Disable Automatic Fiber/Copper Detection */ - #define GPC_DIS_SLEEP BIT_24 /* Disable Energy Detect */ -@@ -1510,6 +2150,13 @@ extern "C" { - #define GPC_RST_CLR BIT_1 /* Clear GPHY Reset */ - #define GPC_RST_SET BIT_0 /* Set GPHY Reset */ - -+/* Yukon-EC Ultra only */ -+#define GPC_PD_125M_CLK_OFF BIT_5 /* Disable Power Down Clock 125 MHz */ -+#define GPC_PD_125M_CLK_ON BIT_4 /* Enable Power Down Clock 125 MHz */ -+#define GPC_DPLL_RST_SET BIT_3 /* Set GPHY's DPLL Reset */ -+#define GPC_DPLL_RST_CLR BIT_2 /* Clear GPHY's DPLL Reset */ -+ /* (DPLL = Digital Phase Lock Loop) */ -+ - #define GPC_HWCFG_GMII_COP (GPC_HWCFG_M_3 | GPC_HWCFG_M_2 | \ - GPC_HWCFG_M_1 | GPC_HWCFG_M_0) - -@@ -1540,14 +2187,14 @@ extern "C" { - - /* GMAC_IRQ_SRC 8 bit GMAC Interrupt Source Reg (YUKON only) */ - /* GMAC_IRQ_MSK 8 bit GMAC Interrupt Mask Reg (YUKON only) */ --#define GM_IS_TX_CO_OV BIT_5 /* Transmit Counter Overflow IRQ */ --#define GM_IS_RX_CO_OV BIT_4 /* Receive Counter Overflow IRQ */ --#define GM_IS_TX_FF_UR BIT_3 /* Transmit FIFO Underrun */ --#define GM_IS_TX_COMPL BIT_2 /* Frame Transmission Complete */ --#define GM_IS_RX_FF_OR BIT_1 /* Receive FIFO Overrun */ --#define GM_IS_RX_COMPL BIT_0 /* Frame Reception Complete */ -+#define GM_IS_RX_CO_OV BIT_5S /* Receive Counter Overflow IRQ */ -+#define GM_IS_TX_CO_OV BIT_4S /* Transmit Counter Overflow IRQ */ -+#define GM_IS_TX_FF_UR BIT_3S /* Transmit FIFO Underrun */ -+#define GM_IS_TX_COMPL BIT_2S /* Frame Transmission Complete */ -+#define GM_IS_RX_FF_OR BIT_1S /* Receive FIFO Overrun */ -+#define GM_IS_RX_COMPL BIT_0S /* Frame Reception Complete */ - --#define GMAC_DEF_MSK (GM_IS_TX_CO_OV | GM_IS_RX_CO_OV | \ -+#define GMAC_DEF_MSK (GM_IS_RX_CO_OV | GM_IS_TX_CO_OV | \ - GM_IS_TX_FF_UR) - - /* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */ -@@ -1579,15 +2226,19 @@ extern "C" { - - #define WOL_CTL_DEFAULT \ - (WOL_CTL_DIS_PME_ON_LINK_CHG | \ -- WOL_CTL_DIS_PME_ON_PATTERN | \ -- WOL_CTL_DIS_PME_ON_MAGIC_PKT | \ -- WOL_CTL_DIS_LINK_CHG_UNIT | \ -- WOL_CTL_DIS_PATTERN_UNIT | \ -- WOL_CTL_DIS_MAGIC_PKT_UNIT) -+ WOL_CTL_DIS_PME_ON_PATTERN | \ -+ WOL_CTL_DIS_PME_ON_MAGIC_PKT | \ -+ WOL_CTL_DIS_LINK_CHG_UNIT | \ -+ WOL_CTL_DIS_PATTERN_UNIT | \ -+ WOL_CTL_DIS_MAGIC_PKT_UNIT) - - /* WOL_MATCH_CTL 8 bit WOL Match Control Reg */ - #define WOL_CTL_PATT_ENA(x) (BIT_0 << (x)) - -+/* WOL_PATT_PME 8 bit WOL PME Match Enable (Yukon-2) */ -+#define WOL_PATT_FORCE_PME BIT_7 /* Generates a PME */ -+#define WOL_PATT_MATCH_PME_ALL 0x7f -+ - #define SK_NUM_WOL_PATTERN 7 - #define SK_PATTERN_PER_WORD 4 - #define SK_BITMASK_PATTERN 7 -@@ -1597,26 +2248,28 @@ extern "C" { - #define WOL_LENGTH_SHIFT 8 - - -+/* typedefs ******************************************************************/ -+ - /* Receive and Transmit Descriptors ******************************************/ - - /* Transmit Descriptor struct */ - typedef struct s_HwTxd { - SK_U32 volatile TxCtrl; /* Transmit Buffer Control Field */ - SK_U32 TxNext; /* Physical Address Pointer to the next TxD */ -- SK_U32 TxAdrLo; /* Physical Tx Buffer Address lower dword */ -- SK_U32 TxAdrHi; /* Physical Tx Buffer Address upper dword */ -+ SK_U32 TxAdrLo; /* Physical Tx Buffer Address lower DWord */ -+ SK_U32 TxAdrHi; /* Physical Tx Buffer Address upper DWord */ - SK_U32 TxStat; /* Transmit Frame Status Word */ --#ifndef SK_USE_REV_DESC -+#ifndef SK_USE_REV_DESC - SK_U16 TxTcpOffs; /* TCP Checksum Calculation Start Value */ - SK_U16 TxRes1; /* 16 bit reserved field */ - SK_U16 TxTcpWp; /* TCP Checksum Write Position */ - SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */ --#else /* SK_USE_REV_DESC */ -+#else /* SK_USE_REV_DESC */ - SK_U16 TxRes1; /* 16 bit reserved field */ - SK_U16 TxTcpOffs; /* TCP Checksum Calculation Start Value */ - SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */ - SK_U16 TxTcpWp; /* TCP Checksum Write Position */ --#endif /* SK_USE_REV_DESC */ -+#endif /* SK_USE_REV_DESC */ - SK_U32 TxRes2; /* 32 bit reserved field */ - } SK_HWTXD; - -@@ -1624,33 +2277,266 @@ typedef struct s_HwTxd { - typedef struct s_HwRxd { - SK_U32 volatile RxCtrl; /* Receive Buffer Control Field */ - SK_U32 RxNext; /* Physical Address Pointer to the next RxD */ -- SK_U32 RxAdrLo; /* Physical Rx Buffer Address lower dword */ -- SK_U32 RxAdrHi; /* Physical Rx Buffer Address upper dword */ -+ SK_U32 RxAdrLo; /* Physical Rx Buffer Address lower DWord */ -+ SK_U32 RxAdrHi; /* Physical Rx Buffer Address upper DWord */ - SK_U32 RxStat; /* Receive Frame Status Word */ - SK_U32 RxTiSt; /* Receive Time Stamp (from XMAC on GENESIS) */ --#ifndef SK_USE_REV_DESC -- SK_U16 RxTcpSum1; /* TCP Checksum 1 */ -- SK_U16 RxTcpSum2; /* TCP Checksum 2 */ -+#ifndef SK_USE_REV_DESC -+ SK_U16 RxTcpSum1; /* Rx TCP Checksum 1 */ -+ SK_U16 RxTcpSum2; /* Rx TCP Checksum 2 */ - SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */ - SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */ --#else /* SK_USE_REV_DESC */ -- SK_U16 RxTcpSum2; /* TCP Checksum 2 */ -- SK_U16 RxTcpSum1; /* TCP Checksum 1 */ -+#else /* SK_USE_REV_DESC */ -+ SK_U16 RxTcpSum2; /* Rx TCP Checksum 2 */ -+ SK_U16 RxTcpSum1; /* Rx TCP Checksum 1 */ - SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */ - SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */ --#endif /* SK_USE_REV_DESC */ -+#endif /* SK_USE_REV_DESC */ - } SK_HWRXD; - - /* - * Drivers which use the reverse descriptor feature (PCI_OUR_REG_2) - * should set the define SK_USE_REV_DESC. -- * Structures are 'normaly' not endianess dependent. But in -- * this case the SK_U16 fields are bound to bit positions inside the -- * descriptor. RxTcpSum1 e.g. must start at bit 0 within the 6.th DWord. -+ * Structures are 'normally' not endianess dependent. But in this case -+ * the SK_U16 fields are bound to bit positions inside the descriptor. -+ * RxTcpSum1 e.g. must start at bit 0 within the 7.th DWord. - * The bit positions inside a DWord are of course endianess dependent and -- * swaps if the DWord is swapped by the hardware. -+ * swap if the DWord is swapped by the hardware. - */ - -+/* YUKON-2 descriptors ******************************************************/ -+ -+typedef struct _TxChksum { -+#ifndef SK_USE_REV_DESC -+ SK_U16 TxTcpWp; /* TCP Checksum Write Position */ -+ SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */ -+#else /* SK_USE_REV_DESC */ -+ SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */ -+ SK_U16 TxTcpWp; /* TCP Checksum Write Position */ -+#endif /* SK_USE_REV_DESC */ -+} SK_HWTXCS; -+ -+typedef struct _LargeSend { -+#ifndef SK_USE_REV_DESC -+ SK_U16 Length; /* Large Send Segment Length */ -+ SK_U16 Reserved; /* reserved */ -+#else /* SK_USE_REV_DESC */ -+ SK_U16 Reserved; /* reserved */ -+ SK_U16 Length; /* Large Send Segment Length */ -+#endif /* SK_USE_REV_DESC */ -+} SK_HWTXLS; -+ -+typedef union u_HwTxBuf { -+ SK_U16 BufLen; /* Tx Buffer Length */ -+ SK_U16 VlanTag; /* VLAN Tag */ -+ SK_U16 InitCsum; /* Init. Checksum */ -+} SK_HWTXBUF; -+ -+/* Tx List Element structure */ -+typedef struct s_HwLeTx { -+ union { -+ SK_U32 BufAddr; /* Tx LE Buffer Address high/low */ -+ SK_HWTXCS ChkSum; /* Tx LE TCP Checksum parameters */ -+ SK_HWTXLS LargeSend;/* Large Send length */ -+ } TxUn; -+#ifndef SK_USE_REV_DESC -+ SK_HWTXBUF Send; -+ SK_U8 ControlFlags; /* Tx LE Control field or Lock Number */ -+ SK_U8 Opcode; /* Tx LE Opcode field */ -+#else /* SK_USE_REV_DESC */ -+ SK_U8 Opcode; /* Tx LE Opcode field */ -+ SK_U8 ControlFlags; /* Tx LE Control field or Lock Number */ -+ SK_HWTXBUF Send; -+#endif /* SK_USE_REV_DESC */ -+} SK_HWLETX; -+ -+typedef struct _RxChkSum{ -+#ifndef SK_USE_REV_DESC -+ SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */ -+ SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */ -+#else /* SK_USE_REV_DESC */ -+ SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */ -+ SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */ -+#endif /* SK_USE_REV_DESC */ -+} SK_HWRXCS; -+ -+/* Rx List Element structure */ -+typedef struct s_HwLeRx { -+ union { -+ SK_U32 BufAddr; /* Rx LE Buffer Address high/low */ -+ SK_HWRXCS ChkSum; /* Rx LE TCP Checksum parameters */ -+ } RxUn; -+#ifndef SK_USE_REV_DESC -+ SK_U16 BufferLength; /* Rx LE Buffer Length field */ -+ SK_U8 ControlFlags; /* Rx LE Control field */ -+ SK_U8 Opcode; /* Rx LE Opcode field */ -+#else /* SK_USE_REV_DESC */ -+ SK_U8 Opcode; /* Rx LE Opcode field */ -+ SK_U8 ControlFlags; /* Rx LE Control field */ -+ SK_U16 BufferLength; /* Rx LE Buffer Length field */ -+#endif /* SK_USE_REV_DESC */ -+} SK_HWLERX; -+ -+typedef struct s_StRxTCPChkSum { -+#ifndef SK_USE_REV_DESC -+ SK_U16 RxTCPSum1; /* Rx TCP Checksum 1 */ -+ SK_U16 RxTCPSum2; /* Rx TCP Checksum 2 */ -+#else /* SK_USE_REV_DESC */ -+ SK_U16 RxTCPSum2; /* Rx TCP Checksum 2 */ -+ SK_U16 RxTCPSum1; /* Rx TCP Checksum 1 */ -+#endif /* SK_USE_REV_DESC */ -+} SK_HWSTCS; -+ -+typedef struct s_StRxRssFlags { -+#ifndef SK_USE_REV_DESC -+ SK_U8 FlagField; /* contains TCP and IP flags */ -+ SK_U8 reserved; /* reserved */ -+#else /* SK_USE_REV_DESC */ -+ SK_U8 reserved; /* reserved */ -+ SK_U8 FlagField; /* contains TCP and IP flags */ -+#endif /* SK_USE_REV_DESC */ -+} SK_HWSTRSS; -+ -+/* bit definition of RSS LE bit 32/33 (SK_HWSTRSS.FlagField) */ -+ /* bit 7..2 reserved */ -+#define RSS_TCP_FLAG BIT_1S /* RSS value related to TCP area */ -+#define RSS_IP_FLAG BIT_0S /* RSS value related to IP area */ -+/* StRxRssValue is valid if at least RSS_IP_FLAG is set */ -+/* For protocol errors or other protocols an empty RSS LE is generated */ -+ -+typedef union u_HwStBuf { -+ SK_U16 BufLen; /* Rx Buffer Length */ -+ SK_U16 VlanTag; /* VLAN Tag */ -+ SK_U16 StTxStatHi; /* Tx Queue Status (high) */ -+ SK_HWSTRSS Rss; /* Flag Field for TCP and IP protocol */ -+} SK_HWSTBUF; -+ -+/* Status List Element structure */ -+typedef struct s_HwLeSt { -+ union { -+ SK_U32 StRxStatWord; /* Rx Status Dword */ -+ SK_U32 StRxTimeStamp; /* Rx Timestamp */ -+ SK_HWSTCS StRxTCPCSum; /* Rx TCP Checksum */ -+ SK_U32 StTxStatLow; /* Tx Queue Status (low) */ -+ SK_U32 StRxRssValue; /* Rx RSS value */ -+ } StUn; -+#ifndef SK_USE_REV_DESC -+ SK_HWSTBUF Stat; -+ SK_U8 Link; /* Status LE Link field */ -+ SK_U8 Opcode; /* Status LE Opcode field */ -+#else /* SK_USE_REV_DESC */ -+ SK_U8 Opcode; /* Status LE Opcode field */ -+ SK_U8 Link; /* Status LE Link field */ -+ SK_HWSTBUF Stat; -+#endif /* SK_USE_REV_DESC */ -+} SK_HWLEST; -+ -+/* Special Action List Element */ -+typedef struct s_HwLeSa { -+#ifndef SK_USE_REV_DESC -+ SK_U16 TxAIdxVld; /* Special Action LE TxA Put Index field */ -+ SK_U16 TxSIdxVld; /* Special Action LE TxS Put Index field */ -+ SK_U16 RxIdxVld; /* Special Action LE Rx Put Index field */ -+ SK_U8 Link; /* Special Action LE Link field */ -+ SK_U8 Opcode; /* Special Action LE Opcode field */ -+#else /* SK_USE_REV_DESC */ -+ SK_U16 TxSIdxVld; /* Special Action LE TxS Put Index field */ -+ SK_U16 TxAIdxVld; /* Special Action LE TxA Put Index field */ -+ SK_U8 Opcode; /* Special Action LE Opcode field */ -+ SK_U8 Link; /* Special Action LE Link field */ -+ SK_U16 RxIdxVld; /* Special Action LE Rx Put Index field */ -+#endif /* SK_USE_REV_DESC */ -+} SK_HWLESA; -+ -+/* Common List Element union */ -+typedef union u_HwLeTxRxSt { -+ /* Transmit List Element Structure */ -+ SK_HWLETX Tx; -+ /* Receive List Element Structure */ -+ SK_HWLERX Rx; -+ /* Status List Element Structure */ -+ SK_HWLEST St; -+ /* Special Action List Element Structure */ -+ SK_HWLESA Sa; -+ /* Full List Element */ -+ SK_U64 Full; -+} SK_HWLE; -+ -+/* mask and shift value to get Tx async queue status for port 1 */ -+#define STLE_TXA1_MSKL 0x00000fff -+#define STLE_TXA1_SHIFTL 0 -+ -+/* mask and shift value to get Tx sync queue status for port 1 */ -+#define STLE_TXS1_MSKL 0x00fff000 -+#define STLE_TXS1_SHIFTL 12 -+ -+/* mask and shift value to get Tx async queue status for port 2 */ -+#define STLE_TXA2_MSKL 0xff000000 -+#define STLE_TXA2_SHIFTL 24 -+#define STLE_TXA2_MSKH 0x000f -+/* this one shifts up */ -+#define STLE_TXA2_SHIFTH 8 -+ -+/* mask and shift value to get Tx sync queue status for port 2 */ -+#define STLE_TXS2_MSKL 0x00000000 -+#define STLE_TXS2_SHIFTL 0 -+#define STLE_TXS2_MSKH 0xfff0 -+#define STLE_TXS2_SHIFTH 4 -+ -+/* YUKON-2 bit values */ -+#define HW_OWNER BIT_7 -+#define SW_OWNER 0 -+ -+#define PU_PUTIDX_VALID BIT_12 -+ -+/* YUKON-2 Control flags */ -+#define UDPTCP BIT_0S -+#define CALSUM BIT_1S -+#define WR_SUM BIT_2S -+#define INIT_SUM BIT_3S -+#define LOCK_SUM BIT_4S -+#define INS_VLAN BIT_5S -+#define FRC_STAT BIT_6S -+#define EOP BIT_7S -+ -+#define TX_LOCK BIT_8S -+#define BUF_SEND BIT_9S -+#define PACKET_SEND BIT_10S -+ -+#define NO_WARNING BIT_14S -+#define NO_UPDATE BIT_15S -+ -+/* YUKON-2 Rx/Tx opcodes defines */ -+#define OP_TCPWRITE 0x11 -+#define OP_TCPSTART 0x12 -+#define OP_TCPINIT 0x14 -+#define OP_TCPLCK 0x18 -+#define OP_TCPCHKSUM OP_TCPSTART -+#define OP_TCPIS (OP_TCPINIT | OP_TCPSTART) -+#define OP_TCPLW (OP_TCPLCK | OP_TCPWRITE) -+#define OP_TCPLSW (OP_TCPLCK | OP_TCPSTART | OP_TCPWRITE) -+#define OP_TCPLISW (OP_TCPLCK | OP_TCPINIT | OP_TCPSTART | OP_TCPWRITE) -+#define OP_ADDR64 0x21 -+#define OP_VLAN 0x22 -+#define OP_ADDR64VLAN (OP_ADDR64 | OP_VLAN) -+#define OP_LRGLEN 0x24 -+#define OP_LRGLENVLAN (OP_LRGLEN | OP_VLAN) -+#define OP_BUFFER 0x40 -+#define OP_PACKET 0x41 -+#define OP_LARGESEND 0x43 -+ -+/* YUKON-2 STATUS opcodes defines */ -+#define OP_RXSTAT 0x60 -+#define OP_RXTIMESTAMP 0x61 -+#define OP_RXVLAN 0x62 -+#define OP_RXCHKS 0x64 -+#define OP_RXCHKSVLAN (OP_RXCHKS | OP_RXVLAN) -+#define OP_RXTIMEVLAN (OP_RXTIMESTAMP | OP_RXVLAN) -+#define OP_RSS_HASH 0x65 -+#define OP_TXINDEXLE 0x68 -+ -+/* YUKON-2 SPECIAL opcodes defines */ -+#define OP_PUTIDX 0x70 - - /* Descriptor Bit Definition */ - /* TxCtrl Transmit Buffer Control Field */ -@@ -1685,6 +2571,10 @@ typedef struct s_HwRxd { - - /* macros ********************************************************************/ - -+/* Macro for accessing the key registers */ -+#define RSS_KEY_ADDR(Port, KeyIndex) \ -+ ((B4_RSS_KEY | ( ((Port) == 0) ? 0 : 0x80)) + (KeyIndex)) -+ - /* Receive and Transmit Queues */ - #define Q_R1 0x0000 /* Receive Queue 1 */ - #define Q_R2 0x0080 /* Receive Queue 2 */ -@@ -1693,6 +2583,10 @@ typedef struct s_HwRxd { - #define Q_XS2 0x0300 /* Synchronous Transmit Queue 2 */ - #define Q_XA2 0x0380 /* Asynchronous Transmit Queue 2 */ - -+#define Q_ASF_R1 0x100 /* ASF Rx Queue 1 */ -+#define Q_ASF_R2 0x180 /* ASF Rx Queue 2 */ -+#define Q_ASF_T1 0x140 /* ASF Tx Queue 1 */ -+#define Q_ASF_T2 0x1c0 /* ASF Tx Queue 2 */ - /* - * Macro Q_ADDR() - * -@@ -1704,11 +2598,27 @@ typedef struct s_HwRxd { - * Offs Queue register offset. - * Values: Q_D, Q_DA_L ... Q_T2, Q_T3 - * -- * usage SK_IN32(pAC, Q_ADDR(Q_R2, Q_BC), pVal) -+ * usage SK_IN32(IoC, Q_ADDR(Q_R2, Q_BC), pVal) - */ - #define Q_ADDR(Queue, Offs) (B8_Q_REGS + (Queue) + (Offs)) - - /* -+ * Macro Y2_PREF_Q_ADDR() -+ * -+ * Use this macro to access the Prefetch Units of the receive and -+ * transmit queues of Yukon-2. -+ * -+ * para: -+ * Queue Queue to access. -+ * Values: Q_R1, Q_R2, Q_XS1, Q_XA1, Q_XS2, Q_XA2, -+ * Offs Queue register offset. -+ * Values: PREF_UNIT_CTRL_REG ... PREF_UNIT_FIFO_LEV_REG -+ * -+ * usage SK_IN16(IoC, Y2_Q_ADDR(Q_R2, PREF_UNIT_GET_IDX_REG), pVal) -+ */ -+#define Y2_PREF_Q_ADDR(Queue, Offs) (Y2_B8_PREF_REGS + (Queue) + (Offs)) -+ -+/* - * Macro RB_ADDR() - * - * Use this macro to access the RAM Buffer Registers. -@@ -1719,14 +2629,14 @@ typedef struct s_HwRxd { - * Offs Queue register offset. - * Values: RB_START, RB_END ... RB_LEV, RB_CTRL - * -- * usage SK_IN32(pAC, RB_ADDR(Q_R2, RB_RP), pVal) -+ * usage SK_IN32(IoC, RB_ADDR(Q_R2, RB_RP), pVal) - */ - #define RB_ADDR(Queue, Offs) (B16_RAM_REGS + (Queue) + (Offs)) - - - /* MAC Related Registers */ --#define MAC_1 0 /* belongs to the port near the slot */ --#define MAC_2 1 /* belongs to the port far away from the slot */ -+#define MAC_1 0 /* 1st port */ -+#define MAC_2 1 /* 2nd port */ - - /* - * Macro MR_ADDR() -@@ -1740,19 +2650,10 @@ typedef struct s_HwRxd { - * Values: RX_MFF_EA, RX_MFF_WP ... LNK_LED_REG, - * TX_MFF_EA, TX_MFF_WP ... TX_LED_TST - * -- * usage SK_IN32(pAC, MR_ADDR(MAC_1, TX_MFF_EA), pVal) -+ * usage SK_IN32(IoC, MR_ADDR(MAC_1, TX_MFF_EA), pVal) - */ - #define MR_ADDR(Mac, Offs) (((Mac) << 7) + (Offs)) - --#ifdef SK_LITTLE_ENDIAN --#define XM_WORD_LO 0 --#define XM_WORD_HI 1 --#else /* !SK_LITTLE_ENDIAN */ --#define XM_WORD_LO 1 --#define XM_WORD_HI 0 --#endif /* !SK_LITTLE_ENDIAN */ -- -- - /* - * macros to access the XMAC (GENESIS only) - * -@@ -1777,22 +2678,31 @@ typedef struct s_HwRxd { - #define XMA(Mac, Reg) \ - ((BASE_XMAC_1 + (Mac) * (BASE_XMAC_2 - BASE_XMAC_1)) | ((Reg) << 1)) - --#define XM_IN16(IoC, Mac, Reg, pVal) \ -- SK_IN16((IoC), XMA((Mac), (Reg)), (pVal)) -+#define XM_IN16(IoC, Mac, Reg, pVal) \ -+ SK_IN16(IoC, XMA(Mac, Reg), pVal) -+ -+#define XM_OUT16(IoC, Mac, Reg, Val) \ -+ SK_OUT16(IoC, XMA(Mac, Reg), Val) -+ -+#ifdef SK_LITTLE_ENDIAN - --#define XM_OUT16(IoC, Mac, Reg, Val) \ -- SK_OUT16((IoC), XMA((Mac), (Reg)), (Val)) -+#define XM_IN32(IoC, Mac, Reg, pVal) { \ -+ SK_IN16(IoC, XMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal)); \ -+ SK_IN16(IoC, XMA(Mac, (Reg) + 2), (SK_U16 SK_FAR *)(pVal) + 1); \ -+} -+ -+#else /* !SK_LITTLE_ENDIAN */ - --#define XM_IN32(IoC, Mac, Reg, pVal) { \ -- SK_IN16((IoC), XMA((Mac), (Reg)), \ -- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_LO]); \ -- SK_IN16((IoC), XMA((Mac), (Reg+2)), \ -- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_HI]); \ -+#define XM_IN32(IoC, Mac, Reg, pVal) { \ -+ SK_IN16(IoC, XMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal) + 1); \ -+ SK_IN16(IoC, XMA(Mac, (Reg) + 2), (SK_U16 SK_FAR *)(pVal)); \ - } - -+#endif /* !SK_LITTLE_ENDIAN */ -+ - #define XM_OUT32(IoC, Mac, Reg, Val) { \ -- SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16)((Val) & 0xffffL)); \ -- SK_OUT16((IoC), XMA((Mac), (Reg+2)), (SK_U16)(((Val) >> 16) & 0xffffL));\ -+ SK_OUT16(IoC, XMA(Mac, Reg), (SK_U16)((Val) & 0xffffL)); \ -+ SK_OUT16(IoC, XMA(Mac, (Reg) + 2), (SK_U16)(((Val) >> 16) & 0xffffL)); \ - } - - /* Remember: we are always writing to / reading from LITTLE ENDIAN memory */ -@@ -1802,13 +2712,13 @@ typedef struct s_HwRxd { - SK_U8 *pByte; \ - pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \ - SK_IN16((IoC), XMA((Mac), (Reg)), &Word); \ -- pByte[0] = (SK_U8)(Word & 0x00ff); \ -+ pByte[0] = (SK_U8)(Word & 0x00ff); \ - pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), XMA((Mac), (Reg+2)), &Word); \ -- pByte[2] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), XMA((Mac), (Reg) + 2), &Word); \ -+ pByte[2] = (SK_U8)(Word & 0x00ff); \ - pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), XMA((Mac), (Reg+4)), &Word); \ -- pByte[4] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), XMA((Mac), (Reg) + 4), &Word); \ -+ pByte[4] = (SK_U8)(Word & 0x00ff); \ - pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \ - } - -@@ -1818,10 +2728,10 @@ typedef struct s_HwRxd { - SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16) \ - (((SK_U16)(pByte[0]) & 0x00ff) | \ - (((SK_U16)(pByte[1]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), XMA((Mac), (Reg+2)), (SK_U16) \ -+ SK_OUT16((IoC), XMA((Mac), (Reg) + 2), (SK_U16) \ - (((SK_U16)(pByte[2]) & 0x00ff) | \ - (((SK_U16)(pByte[3]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), XMA((Mac), (Reg+4)), (SK_U16) \ -+ SK_OUT16((IoC), XMA((Mac), (Reg) + 4), (SK_U16) \ - (((SK_U16)(pByte[4]) & 0x00ff) | \ - (((SK_U16)(pByte[5]) << 8) & 0xff00))); \ - } -@@ -1831,16 +2741,16 @@ typedef struct s_HwRxd { - SK_U8 SK_FAR *pByte; \ - pByte = (SK_U8 SK_FAR *)&((SK_U8 SK_FAR *)(pVal))[0]; \ - SK_IN16((IoC), XMA((Mac), (Reg)), &Word); \ -- pByte[0] = (SK_U8)(Word & 0x00ff); \ -+ pByte[0] = (SK_U8)(Word & 0x00ff); \ - pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), XMA((Mac), (Reg+2)), &Word); \ -- pByte[2] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), XMA((Mac), (Reg) + 2), &Word); \ -+ pByte[2] = (SK_U8)(Word & 0x00ff); \ - pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), XMA((Mac), (Reg+4)), &Word); \ -- pByte[4] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), XMA((Mac), (Reg) + 4), &Word); \ -+ pByte[4] = (SK_U8)(Word & 0x00ff); \ - pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), XMA((Mac), (Reg+6)), &Word); \ -- pByte[6] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), XMA((Mac), (Reg) + 6), &Word); \ -+ pByte[6] = (SK_U8)(Word & 0x00ff); \ - pByte[7] = (SK_U8)((Word >> 8) & 0x00ff); \ - } - -@@ -1850,13 +2760,13 @@ typedef struct s_HwRxd { - SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16) \ - (((SK_U16)(pByte[0]) & 0x00ff)| \ - (((SK_U16)(pByte[1]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), XMA((Mac), (Reg+2)), (SK_U16) \ -+ SK_OUT16((IoC), XMA((Mac), (Reg) + 2), (SK_U16) \ - (((SK_U16)(pByte[2]) & 0x00ff)| \ - (((SK_U16)(pByte[3]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), XMA((Mac), (Reg+4)), (SK_U16) \ -+ SK_OUT16((IoC), XMA((Mac), (Reg) + 4), (SK_U16) \ - (((SK_U16)(pByte[4]) & 0x00ff)| \ - (((SK_U16)(pByte[5]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), XMA((Mac), (Reg+6)), (SK_U16) \ -+ SK_OUT16((IoC), XMA((Mac), (Reg) + 6), (SK_U16) \ - (((SK_U16)(pByte[6]) & 0x00ff)| \ - (((SK_U16)(pByte[7]) << 8) & 0xff00))); \ - } -@@ -1866,7 +2776,7 @@ typedef struct s_HwRxd { - * - * GM_IN16(), to read a 16 bit register (e.g. GM_GP_STAT) - * GM_OUT16(), to write a 16 bit register (e.g. GM_GP_CTRL) -- * GM_IN32(), to read a 32 bit register (e.g. GM_) -+ * GM_IN32(), to read a 32 bit register (e.g. GM_RXF_UC_OK) - * GM_OUT32(), to write a 32 bit register (e.g. GM_) - * GM_INADDR(), to read a network address register (e.g. GM_SRC_ADDR_1L) - * GM_OUTADDR(), to write a network address register (e.g. GM_SRC_ADDR_2L) -@@ -1885,22 +2795,31 @@ typedef struct s_HwRxd { - #define GMA(Mac, Reg) \ - ((BASE_GMAC_1 + (Mac) * (BASE_GMAC_2 - BASE_GMAC_1)) | (Reg)) - --#define GM_IN16(IoC, Mac, Reg, pVal) \ -- SK_IN16((IoC), GMA((Mac), (Reg)), (pVal)) -+#define GM_IN16(IoC, Mac, Reg, pVal) \ -+ SK_IN16(IoC, GMA(Mac, Reg), pVal) -+ -+#define GM_OUT16(IoC, Mac, Reg, Val) \ -+ SK_OUT16(IoC, GMA(Mac, Reg), Val) -+ -+#ifdef SK_LITTLE_ENDIAN -+ -+#define GM_IN32(IoC, Mac, Reg, pVal) { \ -+ SK_IN16(IoC, GMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal)); \ -+ SK_IN16((IoC), GMA(Mac, (Reg) + 4), (SK_U16 SK_FAR *)(pVal) + 1); \ -+} - --#define GM_OUT16(IoC, Mac, Reg, Val) \ -- SK_OUT16((IoC), GMA((Mac), (Reg)), (Val)) -+#else /* !SK_LITTLE_ENDIAN */ - --#define GM_IN32(IoC, Mac, Reg, pVal) { \ -- SK_IN16((IoC), GMA((Mac), (Reg)), \ -- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_LO]); \ -- SK_IN16((IoC), GMA((Mac), (Reg+4)), \ -- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_HI]); \ -+#define GM_IN32(IoC, Mac, Reg, pVal) { \ -+ SK_IN16(IoC, GMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal) + 1); \ -+ SK_IN16(IoC, GMA(Mac, (Reg) + 4), (SK_U16 SK_FAR *)(pVal)); \ - } - -+#endif /* !SK_LITTLE_ENDIAN */ -+ - #define GM_OUT32(IoC, Mac, Reg, Val) { \ -- SK_OUT16((IoC), GMA((Mac), (Reg)), (SK_U16)((Val) & 0xffffL)); \ -- SK_OUT16((IoC), GMA((Mac), (Reg+4)), (SK_U16)(((Val) >> 16) & 0xffffL));\ -+ SK_OUT16(IoC, GMA(Mac, Reg), (SK_U16)((Val) & 0xffffL)); \ -+ SK_OUT16(IoC, GMA(Mac, (Reg) + 4), (SK_U16)(((Val) >> 16) & 0xffffL)); \ - } - - #define GM_INADDR(IoC, Mac, Reg, pVal) { \ -@@ -1908,13 +2827,13 @@ typedef struct s_HwRxd { - SK_U8 *pByte; \ - pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \ - SK_IN16((IoC), GMA((Mac), (Reg)), &Word); \ -- pByte[0] = (SK_U8)(Word & 0x00ff); \ -+ pByte[0] = (SK_U8)(Word & 0x00ff); \ - pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), GMA((Mac), (Reg+4)), &Word); \ -- pByte[2] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), GMA((Mac), (Reg) + 4), &Word); \ -+ pByte[2] = (SK_U8)(Word & 0x00ff); \ - pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), GMA((Mac), (Reg+8)), &Word); \ -- pByte[4] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), GMA((Mac), (Reg) + 8), &Word); \ -+ pByte[4] = (SK_U8)(Word & 0x00ff); \ - pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \ - } - -@@ -1924,10 +2843,10 @@ typedef struct s_HwRxd { - SK_OUT16((IoC), GMA((Mac), (Reg)), (SK_U16) \ - (((SK_U16)(pByte[0]) & 0x00ff) | \ - (((SK_U16)(pByte[1]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), GMA((Mac), (Reg+4)), (SK_U16) \ -+ SK_OUT16((IoC), GMA((Mac), (Reg) + 4), (SK_U16) \ - (((SK_U16)(pByte[2]) & 0x00ff) | \ - (((SK_U16)(pByte[3]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), GMA((Mac), (Reg+8)), (SK_U16) \ -+ SK_OUT16((IoC), GMA((Mac), (Reg) + 8), (SK_U16) \ - (((SK_U16)(pByte[4]) & 0x00ff) | \ - (((SK_U16)(pByte[5]) << 8) & 0xff00))); \ - } -@@ -1937,16 +2856,16 @@ typedef struct s_HwRxd { - SK_U8 *pByte; \ - pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \ - SK_IN16((IoC), GMA((Mac), (Reg)), &Word); \ -- pByte[0] = (SK_U8)(Word & 0x00ff); \ -+ pByte[0] = (SK_U8)(Word & 0x00ff); \ - pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), GMA((Mac), (Reg+4)), &Word); \ -- pByte[2] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), GMA((Mac), (Reg) + 4), &Word); \ -+ pByte[2] = (SK_U8)(Word & 0x00ff); \ - pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), GMA((Mac), (Reg+8)), &Word); \ -- pByte[4] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), GMA((Mac), (Reg) + 8), &Word); \ -+ pByte[4] = (SK_U8)(Word & 0x00ff); \ - pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \ -- SK_IN16((IoC), GMA((Mac), (Reg+12)), &Word); \ -- pByte[6] = (SK_U8)(Word & 0x00ff); \ -+ SK_IN16((IoC), GMA((Mac), (Reg) + 12), &Word); \ -+ pByte[6] = (SK_U8)(Word & 0x00ff); \ - pByte[7] = (SK_U8)((Word >> 8) & 0x00ff); \ - } - -@@ -1956,13 +2875,13 @@ typedef struct s_HwRxd { - SK_OUT16((IoC), GMA((Mac), (Reg)), (SK_U16) \ - (((SK_U16)(pByte[0]) & 0x00ff)| \ - (((SK_U16)(pByte[1]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), GMA((Mac), (Reg+4)), (SK_U16) \ -+ SK_OUT16((IoC), GMA((Mac), (Reg) + 4), (SK_U16) \ - (((SK_U16)(pByte[2]) & 0x00ff)| \ - (((SK_U16)(pByte[3]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), GMA((Mac), (Reg+8)), (SK_U16) \ -+ SK_OUT16((IoC), GMA((Mac), (Reg) + 8), (SK_U16) \ - (((SK_U16)(pByte[4]) & 0x00ff)| \ - (((SK_U16)(pByte[5]) << 8) & 0xff00))); \ -- SK_OUT16((IoC), GMA((Mac), (Reg+12)), (SK_U16) \ -+ SK_OUT16((IoC), GMA((Mac), (Reg) + 12), (SK_U16) \ - (((SK_U16)(pByte[6]) & 0x00ff)| \ - (((SK_U16)(pByte[7]) << 8) & 0xff00))); \ - } -@@ -1980,8 +2899,8 @@ typedef struct s_HwRxd { - #define SK_PHY_BCOM 1 /* Broadcom BCM5400 */ - #define SK_PHY_LONE 2 /* Level One LXT1000 */ - #define SK_PHY_NAT 3 /* National DP83891 */ --#define SK_PHY_MARV_COPPER 4 /* Marvell 88E1011S */ --#define SK_PHY_MARV_FIBER 5 /* Marvell 88E1011S working on fiber */ -+#define SK_PHY_MARV_COPPER 4 /* Marvell 88E1040S */ -+#define SK_PHY_MARV_FIBER 5 /* Marvell 88E1040S working on fiber */ - - /* - * PHY addresses (bits 12..8 of PHY address reg) -@@ -2010,30 +2929,30 @@ typedef struct s_HwRxd { - * - * usage: PHY_READ(IoC, pPort, MAC_1, PHY_CTRL, Value); - * Warning: a PHY_READ on an uninitialized PHY (PHY still in reset) never -- * comes back. This is checked in DEBUG mode. -+ * comes back. This is checked in DEBUG mode. - */ - #ifndef DEBUG - #define PHY_READ(IoC, pPort, Mac, PhyReg, pVal) { \ -- SK_U16 Mmu; \ -+ SK_U16 Mmu; \ - \ - XM_OUT16((IoC), (Mac), XM_PHY_ADDR, (PhyReg) | (pPort)->PhyAddr); \ - XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \ - if ((pPort)->PhyType != SK_PHY_XMAC) { \ -- do { \ -+ do { \ - XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \ - } while ((Mmu & XM_MMU_PHY_RDY) == 0); \ - XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \ -- } \ -+ } \ - } - #else - #define PHY_READ(IoC, pPort, Mac, PhyReg, pVal) { \ -- SK_U16 Mmu; \ -+ SK_U16 Mmu; \ - int __i = 0; \ - \ - XM_OUT16((IoC), (Mac), XM_PHY_ADDR, (PhyReg) | (pPort)->PhyAddr); \ - XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \ - if ((pPort)->PhyType != SK_PHY_XMAC) { \ -- do { \ -+ do { \ - XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \ - __i++; \ - if (__i > 100000) { \ -@@ -2044,7 +2963,7 @@ typedef struct s_HwRxd { - } \ - } while ((Mmu & XM_MMU_PHY_RDY) == 0); \ - XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \ -- } \ -+ } \ - } - #endif /* DEBUG */ - -@@ -2052,17 +2971,17 @@ typedef struct s_HwRxd { - SK_U16 Mmu; \ - \ - if ((pPort)->PhyType != SK_PHY_XMAC) { \ -- do { \ -+ do { \ - XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \ - } while ((Mmu & XM_MMU_PHY_BUSY) != 0); \ -- } \ -+ } \ - XM_OUT16((IoC), (Mac), XM_PHY_ADDR, (PhyReg) | (pPort)->PhyAddr); \ - XM_OUT16((IoC), (Mac), XM_PHY_DATA, (Val)); \ - if ((pPort)->PhyType != SK_PHY_XMAC) { \ -- do { \ -+ do { \ - XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \ - } while ((Mmu & XM_MMU_PHY_BUSY) != 0); \ -- } \ -+ } \ - } - - /* -@@ -2071,12 +2990,14 @@ typedef struct s_HwRxd { - * Use this macro to access PCI config register from the I/O space. - * - * para: -+ * pAC Pointer to adapter context - * Addr PCI configuration register to access. - * Values: PCI_VENDOR_ID ... PCI_VPD_ADR_REG, - * -- * usage SK_IN16(pAC, PCI_C(PCI_VENDOR_ID), pVal); -+ * usage SK_IN16(IoC, PCI_C(pAC, PCI_VENDOR_ID), pVal); - */ --#define PCI_C(Addr) (B7_CFG_SPC + (Addr)) /* PCI Config Space */ -+#define PCI_C(p, Addr) \ -+ (((CHIP_ID_YUKON_2(p)) ? Y2_CFG_SPC : B7_CFG_SPC) + (Addr)) - - /* - * Macro SK_HW_ADDR(Base, Addr) -@@ -2088,7 +3009,7 @@ typedef struct s_HwRxd { - * Addr Address offset - * - * usage: May be used in SK_INxx and SK_OUTxx macros -- * #define SK_IN8(pAC, Addr, pVal) ...\ -+ * #define SK_IN8(IoC, Addr, pVal) ...\ - * *pVal = (SK_U8)inp(SK_HW_ADDR(pAC->Hw.Iop, Addr))) - */ - #ifdef SK_MEM_MAPPED_IO -@@ -2107,20 +3028,31 @@ typedef struct s_HwRxd { - * para: - * pAC Pointer to adapter context struct - * IoC I/O context needed for SK I/O macros -- * Port Port number -+ * Port Port number - * Mode Mode to set for this LED - */ - #define SK_HWAC_LINK_LED(pAC, IoC, Port, Mode) \ - SK_OUT8(IoC, MR_ADDR(Port, LNK_LED_REG), Mode); - -+#define SK_SET_GP_IO(IoC, Bit) { \ -+ SK_U32 DWord; \ -+ SK_IN32(IoC, B2_GP_IO, &DWord); \ -+ DWord |= ((GP_DIR_0 | GP_IO_0) << (Bit));\ -+ SK_OUT32(IoC, B2_GP_IO, DWord); \ -+} - --/* typedefs *******************************************************************/ -- -+#define SK_CLR_GP_IO(IoC, Bit) { \ -+ SK_U32 DWord; \ -+ SK_IN32(IoC, B2_GP_IO, &DWord); \ -+ DWord &= ~((GP_DIR_0 | GP_IO_0) << (Bit));\ -+ SK_OUT32(IoC, B2_GP_IO, DWord); \ -+} - --/* function prototypes ********************************************************/ -+#define SK_GE_PCI_FIFO_SIZE 1600 /* PCI FIFO Size */ - - #ifdef __cplusplus - } - #endif /* __cplusplus */ - - #endif /* __INC_SKGEHW_H */ -+ ---- ./drivers/net/sk98lin/h/skgehwt.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgehwt.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skhwt.h - * Project: Gigabit Ethernet Adapters, Event Scheduler Module -- * Version: $Revision: 1.7 $ -- * Date: $Date: 2003/09/16 12:55:08 $ -+ * Version: $Revision: 2.1 $ -+ * Date: $Date: 2003/10/27 14:16:09 $ - * Purpose: Defines for the hardware timer functions - * - ******************************************************************************/ ---- ./drivers/net/sk98lin/h/skgei2c.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgei2c.h 1970-01-01 03:00:00.000000000 +0300 -@@ -1,210 +0,0 @@ --/****************************************************************************** -- * -- * Name: skgei2c.h -- * Project: Gigabit Ethernet Adapters, TWSI-Module -- * Version: $Revision: 1.25 $ -- * Date: $Date: 2003/10/20 09:06:05 $ -- * Purpose: Special defines for TWSI -- * -- ******************************************************************************/ -- --/****************************************************************************** -- * -- * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * The information in this file is provided "AS IS" without warranty. -- * -- ******************************************************************************/ -- --/* -- * SKGEI2C.H contains all SK-98xx specific defines for the TWSI handling -- */ -- --#ifndef _INC_SKGEI2C_H_ --#define _INC_SKGEI2C_H_ -- --/* -- * Macros to access the B2_I2C_CTRL -- */ --#define SK_I2C_CTL(IoC, flag, dev, dev_size, reg, burst) \ -- SK_OUT32(IoC, B2_I2C_CTRL,\ -- (flag ? 0x80000000UL : 0x0L) | \ -- (((SK_U32)reg << 16) & I2C_ADDR) | \ -- (((SK_U32)dev << 9) & I2C_DEV_SEL) | \ -- (dev_size & I2C_DEV_SIZE) | \ -- ((burst << 4) & I2C_BURST_LEN)) -- --#define SK_I2C_STOP(IoC) { \ -- SK_U32 I2cCtrl; \ -- SK_IN32(IoC, B2_I2C_CTRL, &I2cCtrl); \ -- SK_OUT32(IoC, B2_I2C_CTRL, I2cCtrl | I2C_STOP); \ --} -- --#define SK_I2C_GET_CTL(IoC, pI2cCtrl) SK_IN32(IoC, B2_I2C_CTRL, pI2cCtrl) -- --/* -- * Macros to access the TWSI SW Registers -- */ --#define SK_I2C_SET_BIT(IoC, SetBits) { \ -- SK_U8 OrgBits; \ -- SK_IN8(IoC, B2_I2C_SW, &OrgBits); \ -- SK_OUT8(IoC, B2_I2C_SW, OrgBits | (SK_U8)(SetBits)); \ --} -- --#define SK_I2C_CLR_BIT(IoC, ClrBits) { \ -- SK_U8 OrgBits; \ -- SK_IN8(IoC, B2_I2C_SW, &OrgBits); \ -- SK_OUT8(IoC, B2_I2C_SW, OrgBits & ~((SK_U8)(ClrBits))); \ --} -- --#define SK_I2C_GET_SW(IoC, pI2cSw) SK_IN8(IoC, B2_I2C_SW, pI2cSw) -- --/* -- * define the possible sensor states -- */ --#define SK_SEN_IDLE 0 /* Idle: sensor not read */ --#define SK_SEN_VALUE 1 /* Value Read cycle */ --#define SK_SEN_VALEXT 2 /* Extended Value Read cycle */ -- --/* -- * Conversion factor to convert read Voltage sensor to milli Volt -- * Conversion factor to convert read Temperature sensor to 10th degree Celsius -- */ --#define SK_LM80_VT_LSB 22 /* 22mV LSB resolution */ --#define SK_LM80_TEMP_LSB 10 /* 1 degree LSB resolution */ --#define SK_LM80_TEMPEXT_LSB 5 /* 0.5 degree LSB resolution for ext. val. */ -- --/* -- * formula: counter = (22500*60)/(rpm * divisor * pulses/2) -- * assuming: 6500rpm, 4 pulses, divisor 1 -- */ --#define SK_LM80_FAN_FAKTOR ((22500L*60)/(1*2)) -- --/* -- * Define sensor management data -- * Maximum is reached on Genesis copper dual port and Yukon-64 -- * Board specific maximum is in pAC->I2c.MaxSens -- */ --#define SK_MAX_SENSORS 8 /* maximal no. of installed sensors */ --#define SK_MIN_SENSORS 5 /* minimal no. of installed sensors */ -- --/* -- * To watch the state machine (SM) use the timer in two ways -- * instead of one as hitherto -- */ --#define SK_TIMER_WATCH_SM 0 /* Watch the SM to finish in a spec. time */ --#define SK_TIMER_NEW_GAUGING 1 /* Start a new gauging when timer expires */ -- --/* -- * Defines for the individual thresholds -- */ -- --/* Temperature sensor */ --#define SK_SEN_TEMP_HIGH_ERR 800 /* Temperature High Err Threshold */ --#define SK_SEN_TEMP_HIGH_WARN 700 /* Temperature High Warn Threshold */ --#define SK_SEN_TEMP_LOW_WARN 100 /* Temperature Low Warn Threshold */ --#define SK_SEN_TEMP_LOW_ERR 0 /* Temperature Low Err Threshold */ -- --/* VCC which should be 5 V */ --#define SK_SEN_PCI_5V_HIGH_ERR 5588 /* Voltage PCI High Err Threshold */ --#define SK_SEN_PCI_5V_HIGH_WARN 5346 /* Voltage PCI High Warn Threshold */ --#define SK_SEN_PCI_5V_LOW_WARN 4664 /* Voltage PCI Low Warn Threshold */ --#define SK_SEN_PCI_5V_LOW_ERR 4422 /* Voltage PCI Low Err Threshold */ -- --/* -- * VIO may be 5 V or 3.3 V. Initialization takes two parts: -- * 1. Initialize lowest lower limit and highest higher limit. -- * 2. After the first value is read correct the upper or the lower limit to -- * the appropriate C constant. -- * -- * Warning limits are +-5% of the exepected voltage. -- * Error limits are +-10% of the expected voltage. -- */ -- --/* Bug fix AF: 16.Aug.2001: Correct the init base of LM80 sensor */ -- --#define SK_SEN_PCI_IO_5V_HIGH_ERR 5566 /* + 10% V PCI-IO High Err Threshold */ --#define SK_SEN_PCI_IO_5V_HIGH_WARN 5324 /* + 5% V PCI-IO High Warn Threshold */ -- /* 5000 mVolt */ --#define SK_SEN_PCI_IO_5V_LOW_WARN 4686 /* - 5% V PCI-IO Low Warn Threshold */ --#define SK_SEN_PCI_IO_5V_LOW_ERR 4444 /* - 10% V PCI-IO Low Err Threshold */ -- --#define SK_SEN_PCI_IO_RANGE_LIMITER 4000 /* 4000 mV range delimiter */ -- --/* correction values for the second pass */ --#define SK_SEN_PCI_IO_3V3_HIGH_ERR 3850 /* + 15% V PCI-IO High Err Threshold */ --#define SK_SEN_PCI_IO_3V3_HIGH_WARN 3674 /* + 10% V PCI-IO High Warn Threshold */ -- /* 3300 mVolt */ --#define SK_SEN_PCI_IO_3V3_LOW_WARN 2926 /* - 10% V PCI-IO Low Warn Threshold */ --#define SK_SEN_PCI_IO_3V3_LOW_ERR 2772 /* - 15% V PCI-IO Low Err Threshold */ -- --/* -- * VDD voltage -- */ --#define SK_SEN_VDD_HIGH_ERR 3630 /* Voltage ASIC High Err Threshold */ --#define SK_SEN_VDD_HIGH_WARN 3476 /* Voltage ASIC High Warn Threshold */ --#define SK_SEN_VDD_LOW_WARN 3146 /* Voltage ASIC Low Warn Threshold */ --#define SK_SEN_VDD_LOW_ERR 2970 /* Voltage ASIC Low Err Threshold */ -- --/* -- * PHY PLL 3V3 voltage -- */ --#define SK_SEN_PLL_3V3_HIGH_ERR 3630 /* Voltage PMA High Err Threshold */ --#define SK_SEN_PLL_3V3_HIGH_WARN 3476 /* Voltage PMA High Warn Threshold */ --#define SK_SEN_PLL_3V3_LOW_WARN 3146 /* Voltage PMA Low Warn Threshold */ --#define SK_SEN_PLL_3V3_LOW_ERR 2970 /* Voltage PMA Low Err Threshold */ -- --/* -- * VAUX (YUKON only) -- */ --#define SK_SEN_VAUX_3V3_HIGH_ERR 3630 /* Voltage VAUX High Err Threshold */ --#define SK_SEN_VAUX_3V3_HIGH_WARN 3476 /* Voltage VAUX High Warn Threshold */ --#define SK_SEN_VAUX_3V3_LOW_WARN 3146 /* Voltage VAUX Low Warn Threshold */ --#define SK_SEN_VAUX_3V3_LOW_ERR 2970 /* Voltage VAUX Low Err Threshold */ --#define SK_SEN_VAUX_0V_WARN_ERR 0 /* if VAUX not present */ --#define SK_SEN_VAUX_RANGE_LIMITER 1000 /* 1000 mV range delimiter */ -- --/* -- * PHY 2V5 voltage -- */ --#define SK_SEN_PHY_2V5_HIGH_ERR 2750 /* Voltage PHY High Err Threshold */ --#define SK_SEN_PHY_2V5_HIGH_WARN 2640 /* Voltage PHY High Warn Threshold */ --#define SK_SEN_PHY_2V5_LOW_WARN 2376 /* Voltage PHY Low Warn Threshold */ --#define SK_SEN_PHY_2V5_LOW_ERR 2222 /* Voltage PHY Low Err Threshold */ -- --/* -- * ASIC Core 1V5 voltage (YUKON only) -- */ --#define SK_SEN_CORE_1V5_HIGH_ERR 1650 /* Voltage ASIC Core High Err Threshold */ --#define SK_SEN_CORE_1V5_HIGH_WARN 1575 /* Voltage ASIC Core High Warn Threshold */ --#define SK_SEN_CORE_1V5_LOW_WARN 1425 /* Voltage ASIC Core Low Warn Threshold */ --#define SK_SEN_CORE_1V5_LOW_ERR 1350 /* Voltage ASIC Core Low Err Threshold */ -- --/* -- * FAN 1 speed -- */ --/* assuming: 6500rpm +-15%, 4 pulses, -- * warning at: 80 % -- * error at: 70 % -- * no upper limit -- */ --#define SK_SEN_FAN_HIGH_ERR 20000 /* FAN Speed High Err Threshold */ --#define SK_SEN_FAN_HIGH_WARN 20000 /* FAN Speed High Warn Threshold */ --#define SK_SEN_FAN_LOW_WARN 5200 /* FAN Speed Low Warn Threshold */ --#define SK_SEN_FAN_LOW_ERR 4550 /* FAN Speed Low Err Threshold */ -- --/* -- * Some Voltages need dynamic thresholds -- */ --#define SK_SEN_DYN_INIT_NONE 0 /* No dynamic init of thresholds */ --#define SK_SEN_DYN_INIT_PCI_IO 10 /* Init PCI-IO with new thresholds */ --#define SK_SEN_DYN_INIT_VAUX 11 /* Init VAUX with new thresholds */ -- --extern int SkLm80ReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen); --#endif /* n_INC_SKGEI2C_H */ ---- ./drivers/net/sk98lin/h/skgeinit.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgeinit.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skgeinit.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.83 $ -- * Date: $Date: 2003/09/16 14:07:37 $ -+ * Version: $Revision: 2.48 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: Structures and prototypes for the GE Init Module - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -60,14 +61,17 @@ extern "C" { - #define SK_XMIT_DUR 0x002faf08UL /* 50 ms */ - #define SK_BLK_DUR 0x01dcd650UL /* 500 ms */ - --#define SK_DPOLL_DEF 0x00ee6b28UL /* 250 ms at 62.5 MHz */ -+#define SK_DPOLL_DEF 0x00ee6b28UL /* 250 ms at 62.5 MHz (Genesis) */ -+#define SK_DPOLL_DEF_Y2 0x0000124fUL /* 75 us (Yukon-2) */ - - #define SK_DPOLL_MAX 0x00ffffffUL /* 268 ms at 62.5 MHz */ -- /* 215 ms at 78.12 MHz */ -+ /* 215 ms at 78.12 MHz (Yukon) */ - - #define SK_FACT_62 100 /* is given in percent */ --#define SK_FACT_53 85 /* on GENESIS: 53.12 MHz */ -+#define SK_FACT_53 85 /* on GENESIS: 53.12 MHz */ - #define SK_FACT_78 125 /* on YUKON: 78.12 MHz */ -+#define SK_FACT_100 161 /* on YUKON-FE: 100 MHz */ -+#define SK_FACT_125 202 /* on YUKON-EC: 125 MHz */ - - /* Timeout values */ - #define SK_MAC_TO_53 72 /* MAC arbiter timeout */ -@@ -82,11 +86,23 @@ extern "C" { - #define SK_RB_LLPP_S (10 * 1024) /* Lower Level for small Queues */ - #define SK_RB_LLPP_B (16 * 1024) /* Lower Level for big Queues */ - -+/* Threshold values for Yukon-EC Ultra */ -+#define SK_ECU_ULPP 0x0080 /* Upper Pause Threshold (multiples of 8) */ -+#define SK_ECU_LLPP 0x0060 /* Lower Pause Threshold (multiples of 8) */ -+#define SK_ECU_AE_THR 0x0180 /* Almost Empty Threshold */ -+#define SK_ECU_TXFF_LEV 0x01a0 /* Tx BMU FIFO Level */ -+ - #ifndef SK_BMU_RX_WM --#define SK_BMU_RX_WM 0x600 /* BMU Rx Watermark */ -+#define SK_BMU_RX_WM 0x600 /* BMU Rx Watermark */ - #endif -+ - #ifndef SK_BMU_TX_WM --#define SK_BMU_TX_WM 0x600 /* BMU Tx Watermark */ -+#define SK_BMU_TX_WM 0x600 /* BMU Tx Watermark */ -+#endif -+ -+/* performance sensitive drivers should set this define to 0x80 */ -+#ifndef SK_BMU_RX_WM_PEX -+#define SK_BMU_RX_WM_PEX 0x600 /* BMU Rx Watermark for PEX */ - #endif - - /* XMAC II Rx High Watermark */ -@@ -98,37 +114,31 @@ extern "C" { - #define SK_XM_THR_MULL 0x01fb /* .. for multiple link usage */ - #define SK_XM_THR_JUMBO 0x03fc /* .. for jumbo frame usage */ - --/* values for GIPortUsage */ -+/* values for PortUsage */ - #define SK_RED_LINK 1 /* redundant link usage */ - #define SK_MUL_LINK 2 /* multiple link usage */ - #define SK_JUMBO_LINK 3 /* driver uses jumbo frames */ - - /* Minimum RAM Buffer Rx Queue Size */ --#define SK_MIN_RXQ_SIZE 16 /* 16 kB */ -+#define SK_MIN_RXQ_SIZE (((pAC)->GIni.GIYukon2) ? 10 : 16) /* 10/16 kB */ - - /* Minimum RAM Buffer Tx Queue Size */ --#define SK_MIN_TXQ_SIZE 16 /* 16 kB */ -+#define SK_MIN_TXQ_SIZE (((pAC)->GIni.GIYukon2) ? 10 : 16) /* 10/16 kB */ - --/* Queue Size units */ --#define QZ_UNITS 0x7 -+/* Queue Size units (Genesis/Yukon) */ -+#define QZ_UNITS 7 - #define QZ_STEP 8 - -+/* Queue Size units (Yukon-2) */ -+#define QZ_STEP_Y2 1 -+ - /* Percentage of queue size from whole memory */ - /* 80 % for receive */ --#define RAM_QUOTA_RX 80L --/* 0% for sync transfer */ --#define RAM_QUOTA_SYNC 0L -+#define RAM_QUOTA_RX 80 -+/* 0 % for sync transfer */ -+#define RAM_QUOTA_SYNC 0 - /* the rest (20%) is taken for async transfer */ - --/* Get the rounded queue size in Bytes in 8k steps */ --#define ROUND_QUEUE_SIZE(SizeInBytes) \ -- ((((unsigned long) (SizeInBytes) + (QZ_STEP*1024L)-1) / 1024) & \ -- ~(QZ_STEP-1)) -- --/* Get the rounded queue size in KBytes in 8k steps */ --#define ROUND_QUEUE_SIZE_KB(Kilobytes) \ -- ROUND_QUEUE_SIZE((Kilobytes) * 1024L) -- - /* Types of RAM Buffer Queues */ - #define SK_RX_SRAM_Q 1 /* small receive queue */ - #define SK_RX_BRAM_Q 2 /* big receive queue */ -@@ -167,11 +177,11 @@ extern "C" { - - - /* Link Speed Capabilities */ --#define SK_LSPEED_CAP_AUTO (1<<0) /* Automatic resolution */ --#define SK_LSPEED_CAP_10MBPS (1<<1) /* 10 Mbps */ --#define SK_LSPEED_CAP_100MBPS (1<<2) /* 100 Mbps */ --#define SK_LSPEED_CAP_1000MBPS (1<<3) /* 1000 Mbps */ --#define SK_LSPEED_CAP_INDETERMINATED (1<<4) /* indeterminated */ -+#define SK_LSPEED_CAP_AUTO BIT_0S /* Automatic resolution */ -+#define SK_LSPEED_CAP_10MBPS BIT_1S /* 10 Mbps */ -+#define SK_LSPEED_CAP_100MBPS BIT_2S /* 100 Mbps */ -+#define SK_LSPEED_CAP_1000MBPS BIT_3S /* 1000 Mbps */ -+#define SK_LSPEED_CAP_INDETERMINATED BIT_4S /* indeterminated */ - - /* Link Speed Parameter */ - #define SK_LSPEED_AUTO 1 /* Automatic resolution */ -@@ -189,11 +199,11 @@ extern "C" { - - - /* Link Capability Parameter */ --#define SK_LMODE_CAP_HALF (1<<0) /* Half Duplex Mode */ --#define SK_LMODE_CAP_FULL (1<<1) /* Full Duplex Mode */ --#define SK_LMODE_CAP_AUTOHALF (1<<2) /* AutoHalf Duplex Mode */ --#define SK_LMODE_CAP_AUTOFULL (1<<3) /* AutoFull Duplex Mode */ --#define SK_LMODE_CAP_INDETERMINATED (1<<4) /* indeterminated */ -+#define SK_LMODE_CAP_HALF BIT_0S /* Half Duplex Mode */ -+#define SK_LMODE_CAP_FULL BIT_1S /* Full Duplex Mode */ -+#define SK_LMODE_CAP_AUTOHALF BIT_2S /* AutoHalf Duplex Mode */ -+#define SK_LMODE_CAP_AUTOFULL BIT_3S /* AutoFull Duplex Mode */ -+#define SK_LMODE_CAP_INDETERMINATED BIT_4S /* indeterminated */ - - /* Link Mode Current State */ - #define SK_LMODE_STAT_UNKNOWN 1 /* Unknown Duplex Mode */ -@@ -220,10 +230,10 @@ extern "C" { - #define SK_FLOW_STAT_INDETERMINATED 5 /* indeterminated */ - - /* Master/Slave Mode Capabilities */ --#define SK_MS_CAP_AUTO (1<<0) /* Automatic resolution */ --#define SK_MS_CAP_MASTER (1<<1) /* This station is master */ --#define SK_MS_CAP_SLAVE (1<<2) /* This station is slave */ --#define SK_MS_CAP_INDETERMINATED (1<<3) /* indeterminated */ -+#define SK_MS_CAP_AUTO BIT_0S /* Automatic resolution */ -+#define SK_MS_CAP_MASTER BIT_1S /* This station is master */ -+#define SK_MS_CAP_SLAVE BIT_2S /* This station is slave */ -+#define SK_MS_CAP_INDETERMINATED BIT_3S /* indeterminated */ - - /* Set Master/Slave Mode Parameter (and capabilities) */ - #define SK_MS_MODE_AUTO 1 /* Automatic resolution */ -@@ -238,25 +248,25 @@ extern "C" { - #define SK_MS_STAT_FAULT 4 /* M/S resolution failed */ - #define SK_MS_STAT_INDETERMINATED 5 /* indeterminated */ - --/* parameter 'Mode' when calling SkXmSetRxCmd() */ --#define SK_STRIP_FCS_ON (1<<0) /* Enable FCS stripping of Rx frames */ --#define SK_STRIP_FCS_OFF (1<<1) /* Disable FCS stripping of Rx frames */ --#define SK_STRIP_PAD_ON (1<<2) /* Enable pad byte stripping of Rx fr */ --#define SK_STRIP_PAD_OFF (1<<3) /* Disable pad byte stripping of Rx fr */ --#define SK_LENERR_OK_ON (1<<4) /* Don't chk fr for in range len error */ --#define SK_LENERR_OK_OFF (1<<5) /* Check frames for in range len error */ --#define SK_BIG_PK_OK_ON (1<<6) /* Don't set Rx Error bit for big frames */ --#define SK_BIG_PK_OK_OFF (1<<7) /* Set Rx Error bit for big frames */ --#define SK_SELF_RX_ON (1<<8) /* Enable Rx of own packets */ --#define SK_SELF_RX_OFF (1<<9) /* Disable Rx of own packets */ -+/* parameter 'Mode' when calling SkMacSetRxCmd() */ -+#define SK_STRIP_FCS_ON BIT_0S /* Enable FCS stripping of Rx frames */ -+#define SK_STRIP_FCS_OFF BIT_1S /* Disable FCS stripping of Rx frames */ -+#define SK_STRIP_PAD_ON BIT_2S /* Enable pad byte stripping of Rx fr */ -+#define SK_STRIP_PAD_OFF BIT_3S /* Disable pad byte stripping of Rx fr */ -+#define SK_LENERR_OK_ON BIT_4S /* Don't chk fr for in range len error */ -+#define SK_LENERR_OK_OFF BIT_5S /* Check frames for in range len error */ -+#define SK_BIG_PK_OK_ON BIT_6S /* Don't set Rx Error bit for big frames */ -+#define SK_BIG_PK_OK_OFF BIT_7S /* Set Rx Error bit for big frames */ -+#define SK_SELF_RX_ON BIT_8S /* Enable Rx of own packets */ -+#define SK_SELF_RX_OFF BIT_9S /* Disable Rx of own packets */ - - /* parameter 'Para' when calling SkMacSetRxTxEn() */ --#define SK_MAC_LOOPB_ON (1<<0) /* Enable MAC Loopback Mode */ --#define SK_MAC_LOOPB_OFF (1<<1) /* Disable MAC Loopback Mode */ --#define SK_PHY_LOOPB_ON (1<<2) /* Enable PHY Loopback Mode */ --#define SK_PHY_LOOPB_OFF (1<<3) /* Disable PHY Loopback Mode */ --#define SK_PHY_FULLD_ON (1<<4) /* Enable GMII Full Duplex */ --#define SK_PHY_FULLD_OFF (1<<5) /* Disable GMII Full Duplex */ -+#define SK_MAC_LOOPB_ON BIT_0S /* Enable MAC Loopback Mode */ -+#define SK_MAC_LOOPB_OFF BIT_1S /* Disable MAC Loopback Mode */ -+#define SK_PHY_LOOPB_ON BIT_2S /* Enable PHY Loopback Mode */ -+#define SK_PHY_LOOPB_OFF BIT_3S /* Disable PHY Loopback Mode */ -+#define SK_PHY_FULLD_ON BIT_4S /* Enable GMII Full Duplex */ -+#define SK_PHY_FULLD_OFF BIT_5S /* Disable GMII Full Duplex */ - - /* States of PState */ - #define SK_PRT_RESET 0 /* the port is reset */ -@@ -266,18 +276,24 @@ extern "C" { - - /* PHY power down modes */ - #define PHY_PM_OPERATIONAL_MODE 0 /* PHY operational mode */ --#define PHY_PM_DEEP_SLEEP 1 /* coma mode --> minimal power */ -+#define PHY_PM_DEEP_SLEEP 1 /* Coma mode --> minimal power */ - #define PHY_PM_IEEE_POWER_DOWN 2 /* IEEE 22.2.4.1.5 compl. power down */ --#define PHY_PM_ENERGY_DETECT 3 /* energy detect */ --#define PHY_PM_ENERGY_DETECT_PLUS 4 /* energy detect plus */ -+#define PHY_PM_ENERGY_DETECT 3 /* Energy detect */ -+#define PHY_PM_ENERGY_DETECT_PLUS 4 /* Energy detect plus */ -+ -+/* PCI Bus Types */ -+#define SK_PCI_BUS BIT_0S /* normal PCI bus */ -+#define SK_PCIX_BUS BIT_1S /* PCI-X bus */ -+#define SK_PEX_BUS BIT_2S /* PCI-Express bus */ - - /* Default receive frame limit for Workaround of XMAC Errata */ - #define SK_DEF_RX_WA_LIM SK_CONSTU64(100) - - /* values for GILedBlinkCtrl (LED Blink Control) */ --#define SK_ACT_LED_BLINK (1<<0) /* Active LED blinking */ --#define SK_DUP_LED_NORMAL (1<<1) /* Duplex LED normal */ --#define SK_LED_LINK100_ON (1<<2) /* Link 100M LED on */ -+#define SK_ACT_LED_BLINK BIT_0S /* Active LED blinking */ -+#define SK_DUP_LED_NORMAL BIT_1S /* Duplex LED normal */ -+#define SK_LED_LINK100_ON BIT_2S /* Link 100M LED on */ -+#define SK_DUAL_LED_ACT_LNK BIT_3S /* Dual LED ACT/LNK configuration */ - - /* Link Partner Status */ - #define SK_LIPA_UNKNOWN 0 /* Link partner is in unknown state */ -@@ -290,18 +306,173 @@ extern "C" { - /* Max. Auto-neg. timeouts before link detection in sense mode is reset */ - #define SK_MAX_ANEG_TO 10 /* Max. 10 times the sense mode is reset */ - -+ -+/****************************************************************************** -+ * -+ * HW_FEATURE() macro -+ */ -+ -+/* DWORD 0: Features */ -+#define HWF_CLK_GATING_ENABLE 0x02000000UL /* Enable Clock Gating */ -+#define HWF_RED_CORE_CLK_SUP 0x01000000UL /* Reduced Core Clock supp. */ -+#define HWF_SYNC_TX_SUP 0x00800000UL /* Synch. Tx Queue available */ -+#define HWF_SINGLE_PORT_DEVICE 0x00400000UL /* Device has only one LAN IF */ -+#define HWF_JUMBO_FRAMES_SUP 0x00200000UL /* Jumbo Frames supported */ -+#define HWF_TX_TCP_CSUM_SUP 0x00100000UL /* TCP Tx checksum supported */ -+#define HWF_TX_UDP_CSUM_SUP 0x00080000UL /* UDP Tx checksum supported */ -+#define HWF_RX_CSUM_SUP 0x00040000UL /* RX checksum supported */ -+#define HWF_TCP_SEGM_SUP 0x00020000UL /* TCP segmentation supported */ -+#define HWF_RSS_HASH_SUP 0x00010000UL /* RSS Hash supported */ -+#define HWF_PORT_VLAN_SUP 0x00008000UL /* VLAN can be config per port*/ -+#define HWF_ROLE_PARAM_SUP 0x00004000UL /* Role parameter supported */ -+#define HWF_LOW_PMODE_SUP 0x00002000UL /* Low Power Mode supported */ -+#define HWF_ENERGIE_DEMO_SUP 0x00001000UL /* Energy Detect mode supp. */ -+#define HWF_SPEED1000_SUP 0x00000800UL /* Line Speed 1000 supported */ -+#define HWF_SPEED100_SUP 0x00000400UL /* Line Speed 100 supported */ -+#define HWF_SPEED10_SUP 0x00000200UL /* Line Speed 10 supported */ -+#define HWF_AUTONEGSENSE_SUP 0x00000100UL /* Autoneg Sense supported */ -+#define HWF_PHY_LOOPB_MD_SUP 0x00000080UL /* PHY loopback mode supp. */ -+#define HWF_ASF_SUP 0x00000040UL /* ASF support possible */ -+#define HWF_QS_STEPS_1KB 0x00000020UL /* The Rx/Tx queues can be */ -+ /* configured with 1 kB res. */ -+#define HWF_OWN_RAM_PER_PORT 0x00000010UL /* Each port has a separate */ -+ /* RAM buffer */ -+#define HWF_MIN_LED_IF 0x00000008UL /* Minimal LED interface */ -+ /* (e.g. for Yukon-EC) */ -+#define HWF_LIST_ELEMENTS_USED 0x00000004UL /* HW uses list elements */ -+ /* (otherwise desc. are used) */ -+#define HWF_GMAC_INSIDE 0x00000002UL /* Device contains GMAC */ -+#define HWF_TWSI_PRESENT 0x00000001UL /* TWSI sensor bus present */ -+ -+/*-RMV- DWORD 1: Deviations */ -+#define HWF_WA_DEV_4200 0x10200000UL /*-RMV- 4.200 (D3 Blue Screen)*/ -+#define HWF_WA_DEV_4185CS 0x10100000UL /*-RMV- 4.185 (ECU 100 CS cal)*/ -+#define HWF_WA_DEV_4185 0x10080000UL /*-RMV- 4.185 (ECU Tx h check)*/ -+#define HWF_WA_DEV_4167 0x10040000UL /*-RMV- 4.167 (Rx OvSize Hang)*/ -+#define HWF_WA_DEV_4152 0x10020000UL /*-RMV- 4.152 (RSS issue) */ -+#define HWF_WA_DEV_4115 0x10010000UL /*-RMV- 4.115 (Rx MAC FIFO) */ -+#define HWF_WA_DEV_4109 0x10008000UL /*-RMV- 4.109 (BIU hang) */ -+#define HWF_WA_DEV_483 0x10004000UL /*-RMV- 4.83 (Rx TCP wrong) */ -+#define HWF_WA_DEV_479 0x10002000UL /*-RMV- 4.79 (Rx BMU hang II) */ -+#define HWF_WA_DEV_472 0x10001000UL /*-RMV- 4.72 (GPHY2 MDC clk) */ -+#define HWF_WA_DEV_463 0x10000800UL /*-RMV- 4.63 (Rx BMU hang I) */ -+#define HWF_WA_DEV_427 0x10000400UL /*-RMV- 4.27 (Tx Done Rep) */ -+#define HWF_WA_DEV_42 0x10000200UL /*-RMV- 4.2 (pref unit burst) */ -+#define HWF_WA_DEV_46 0x10000100UL /*-RMV- 4.6 (CPU crash II) */ -+#define HWF_WA_DEV_43_418 0x10000080UL /*-RMV- 4.3 & 4.18 (PCI unexp */ -+ /*-RMV- compl&Stat BMU deadl) */ -+#define HWF_WA_DEV_420 0x10000040UL /*-RMV- 4.20 (Status BMU ov) */ -+#define HWF_WA_DEV_423 0x10000020UL /*-RMV- 4.23 (TCP Segm Hang) */ -+#define HWF_WA_DEV_424 0x10000010UL /*-RMV- 4.24 (MAC reg overwr) */ -+#define HWF_WA_DEV_425 0x10000008UL /*-RMV- 4.25 (Magic packet */ -+ /*-RMV- with odd offset) */ -+#define HWF_WA_DEV_428 0x10000004UL /*-RMV- 4.28 (Poll-U &BigEndi)*/ -+#define HWF_WA_FIFO_FLUSH_YLA0 0x10000002UL /*-RMV- dis Rx GMAC FIFO Flush*/ -+ /*-RMV- for Yu-L Rev. A0 only */ -+#define HWF_WA_COMA_MODE 0x10000001UL /*-RMV- Coma Mode WA req */ -+ -+/* DWORD 2: still unused */ -+/* DWORD 3: still unused */ -+ -+ -+/* -+ * HW_FEATURE() - returns whether the feature is serviced or not -+ */ -+#define HW_FEATURE(pAC, ReqFeature) \ -+ (((pAC)->GIni.HwF.Features[((ReqFeature) & 0x30000000UL) >> 28] &\ -+ ((ReqFeature) & 0x0fffffffUL)) != 0) -+ -+#define HW_FEAT_LIST 0 -+#define HW_DEV_LIST 1 -+ -+#define SET_HW_FEATURE_MASK(pAC, List, OffMaskValue, OnMaskValue) { \ -+ if ((List) == HW_FEAT_LIST || (List) == HW_DEV_LIST) { \ -+ (pAC)->GIni.HwF.OffMask[List] = (OffMaskValue); \ -+ (pAC)->GIni.HwF.OnMask[List] = (OnMaskValue); \ -+ } \ -+} -+ -+/* driver access macros for GIni structure ***********************************/ -+ -+#define CHIP_ID_YUKON_2(pAC) ((pAC)->GIni.GIYukon2) -+ -+#define HW_SYNC_TX_SUPPORTED(pAC) \ -+ ((pAC)->GIni.GIChipId != CHIP_ID_YUKON_EC && \ -+ (pAC)->GIni.GIChipId != CHIP_ID_YUKON_FE && \ -+ (pAC)->GIni.GIChipId != CHIP_ID_YUKON_EC_U) -+ -+#define HW_MS_TO_TICKS(pAC, MsTime) \ -+ ((MsTime) * (62500L/100) * (pAC)->GIni.GIHstClkFact) -+ -+#ifdef XXX -+/* still under construction */ -+#define HW_IS_SINGLE_PORT(pAC) ((pAC)->GIni.GIMacsFound == 1) -+#define HW_NUMBER_OF_PORTS(pAC) ((pAC)->GIni.GIMacsFound) -+ -+#define HW_TX_UDP_CSUM_SUPPORTED(pAC) \ -+ ((((pAC)->GIni.GIChipId >= CHIP_ID_YUKON) && ((pAC)->GIni.GIChipRev != 0)) -+ -+#define HW_DEFAULT_LINESPEED(pAC) \ -+ ((!(pAC)->GIni.GIGenesis && (pAC)->GIni.GICopperType) ? \ -+ SK_LSPEED_AUTO : SK_LSPEED_1000MBPS) -+ -+#define HW_ROLE_PARAM_SUPPORTED(pAC) ((pAC)->GIni.GICopperType) -+ -+#define HW_SPEED1000_SUPPORTED(pAC, Port) \ -+ ((pAC)->GIni.GP[Port].PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) -+ -+#define HW_SPEED100_SUPPORTED(pAC, Port) \ -+ ((pAC)->GIni.GP[Port].PLinkSpeedCap & SK_LSPEED_CAP_100MBPS) -+ -+#define HW_SPEED10_SUPPORTED(pAC, Port) \ -+ ((pAC)->GIni.GP[Port].PLinkSpeedCap & SK_LSPEED_CAP_10MBPS) -+ -+#define HW_AUTONEGSENSE_SUPPORTED(pAC) ((pAC)->GIni.GP[0].PhyType==SK_PHY_XMAC) -+ -+#define HW_FREQ_TO_CARD_TICKS(pAC, AdapterClkSpeed, Freq) \ -+ (((AdapterClkSpeed / 100) * (pAC)->GIni.GIHstClkFact) / Freq) -+ -+#define HW_IS_LINK_UP(pAC, Port) ((pAC)->GIni.GP[Port].PHWLinkUp) -+#define HW_LINK_SPEED_USED(pAC, Port) ((pAC)->GIni.GP[Port].PLinkSpeedUsed) -+#define HW_RAM_SIZE(pAC) ((pAC)->GIni.GIRamSize) -+ -+#define HW_PHY_LP_MODE_SUPPORTED(pAC) (pAC0->??? -+#define HW_ASF_ACTIVE(pAC) ??? -+#define RAWIO_OUT32(pAC, pAC->RegIrqMask, pAC->GIni.GIValIrqMask)... -+ -+/* macro to check whether Tx checksum is supported */ -+#define HW_TX_CSUM_SUPPORTED(pAC) ((pAC)->GIni.GIChipId != CHIP_ID_GENESIS) -+ -+BMU_UDP_CHECK : BMU_TCP_CHECK; -+ -+/* macro for - Own Bit mirrored to DWORD7 (Yukon LP receive descriptor) */ -+#endif /* 0 */ -+ -+ - /* structures *****************************************************************/ - - /* -+ * HW Feature structure -+ */ -+typedef struct s_HwFeatures { -+ SK_U32 Features[4]; /* Feature list */ -+ SK_U32 OffMask[4]; /* Off Mask */ -+ SK_U32 OnMask[4]; /* On Mask */ -+} SK_HW_FEATURES; -+ -+/* - * MAC specific functions - */ - typedef struct s_GeMacFunc { -- int (*pFnMacUpdateStats)(SK_AC *pAC, SK_IOC IoC, unsigned int Port); -- int (*pFnMacStatistic)(SK_AC *pAC, SK_IOC IoC, unsigned int Port, -- SK_U16 StatAddr, SK_U32 SK_FAR *pVal); -- int (*pFnMacResetCounter)(SK_AC *pAC, SK_IOC IoC, unsigned int Port); -- int (*pFnMacOverflow)(SK_AC *pAC, SK_IOC IoC, unsigned int Port, -- SK_U16 IStatus, SK_U64 SK_FAR *pVal); -+ int (*pFnMacUpdateStats)(SK_AC *, SK_IOC, unsigned int); -+ int (*pFnMacStatistic)(SK_AC *, SK_IOC, unsigned int, SK_U16, SK_U32 SK_FAR *); -+ int (*pFnMacResetCounter)(SK_AC *, SK_IOC, unsigned int); -+ int (*pFnMacOverflow)(SK_AC *, SK_IOC, unsigned int, SK_U16, SK_U64 SK_FAR *); -+ void (*pSkGeSirqIsr)(SK_AC *, SK_IOC, SK_U32); -+#ifdef SK_DIAG -+ int (*pFnMacPhyRead)(SK_AC *, SK_IOC, int, int, SK_U16 SK_FAR *); -+ int (*pFnMacPhyWrite)(SK_AC *, SK_IOC, int, int, SK_U16); -+#endif /* SK_DIAG */ - } SK_GEMACFUNC; - - /* -@@ -311,7 +482,7 @@ typedef struct s_GePort { - #ifndef SK_DIAG - SK_TIMER PWaTimer; /* Workaround Timer */ - SK_TIMER HalfDupChkTimer; --#endif /* SK_DIAG */ -+#endif /* !SK_DIAG */ - SK_U32 PPrevShorts; /* Previous Short Counter checking */ - SK_U32 PPrevFcs; /* Previous FCS Error Counter checking */ - SK_U64 PPrevRx; /* Previous RxOk Counter checking */ -@@ -335,6 +506,7 @@ typedef struct s_GePort { - int PXaQOff; /* Asynchronous Tx Queue Address Offset */ - int PhyType; /* PHY used on this port */ - int PState; /* Port status (reset, stop, init, run) */ -+ int PPortUsage; /* Driver Port Usage */ - SK_U16 PhyId1; /* PHY Id1 on this port */ - SK_U16 PhyAddr; /* MDIO/MDC PHY address */ - SK_U16 PIsave; /* Saved Interrupt status word */ -@@ -367,7 +539,10 @@ typedef struct s_GePort { - int PMacJamLen; /* MAC Jam length */ - int PMacJamIpgVal; /* MAC Jam IPG */ - int PMacJamIpgData; /* MAC IPG Jam to Data */ -+ int PMacBackOffLim; /* MAC Back-off Limit */ -+ int PMacDataBlind; /* MAC Data Blinder */ - int PMacIpgData; /* MAC Data IPG */ -+ SK_U16 PMacAddr[3]; /* MAC address */ - SK_BOOL PMacLimit4; /* reset collision counter and backoff algorithm */ - } SK_GEPORT; - -@@ -379,27 +554,37 @@ typedef struct s_GeInit { - int GIChipId; /* Chip Identification Number */ - int GIChipRev; /* Chip Revision Number */ - SK_U8 GIPciHwRev; /* PCI HW Revision Number */ -+ SK_U8 GIPciBus; /* PCI Bus Type (PCI / PCI-X / PCI-Express) */ -+ SK_U8 GIPciMode; /* PCI / PCI-X Mode @ Clock */ -+ SK_U8 GIPexWidth; /* PCI-Express Negotiated Link Width */ - SK_BOOL GIGenesis; /* Genesis adapter ? */ -- SK_BOOL GIYukon; /* YUKON-A1/Bx chip */ -+ SK_BOOL GIYukon; /* YUKON family (1 and 2) */ - SK_BOOL GIYukonLite; /* YUKON-Lite chip */ -+ SK_BOOL GIYukon2; /* YUKON-2 chip (-XL, -EC or -FE) */ -+ SK_U8 GIConTyp; /* Connector Type */ -+ SK_U8 GIPmdTyp; /* PMD Type */ - SK_BOOL GICopperType; /* Copper Type adapter ? */ - SK_BOOL GIPciSlot64; /* 64-bit PCI Slot */ - SK_BOOL GIPciClock66; /* 66 MHz PCI Clock */ - SK_BOOL GIVauxAvail; /* VAUX available (YUKON) */ - SK_BOOL GIYukon32Bit; /* 32-Bit YUKON adapter */ -+ SK_BOOL GIAsfEnabled; /* ASF subsystem enabled */ -+ SK_BOOL GIAsfRunning; /* ASF subsystem running */ - SK_U16 GILedBlinkCtrl; /* LED Blink Control */ - int GIMacsFound; /* Number of MACs found on this adapter */ - int GIMacType; /* MAC Type used on this adapter */ -- int GIHstClkFact; /* Host Clock Factor (62.5 / HstClk * 100) */ -- int GIPortUsage; /* Driver Port Usage */ -+ int GIChipCap; /* Adapter's Capabilities */ -+ int GIHstClkFact; /* Host Clock Factor (HstClk / 62.5 * 100) */ - int GILevel; /* Initialization Level completed */ - int GIRamSize; /* The RAM size of the adapter in kB */ - int GIWolOffs; /* WOL Register Offset (HW-Bug in Rev. A) */ - SK_U32 GIRamOffs; /* RAM Address Offset for addr calculation */ - SK_U32 GIPollTimerVal; /* Descr. Poll Timer Init Val (HstClk ticks) */ - SK_U32 GIValIrqMask; /* Value for Interrupt Mask */ -+ SK_U32 GIValHwIrqMask; /* Value for Interrupt Mask */ - SK_U32 GITimeStampCnt; /* Time Stamp High Counter (YUKON only) */ - SK_GEPORT GP[SK_MAX_MACS];/* Port Dependent Information */ -+ SK_HW_FEATURES HwF; /* HW Features struct */ - SK_GEMACFUNC GIFunc; /* MAC depedent functions */ - } SK_GEINIT; - -@@ -417,7 +602,7 @@ typedef struct s_GeInit { - #define SKERR_HWI_E005 (SKERR_HWI_E004+1) - #define SKERR_HWI_E005MSG "SkGeInitPort(): cannot init running ports" - #define SKERR_HWI_E006 (SKERR_HWI_E005+1) --#define SKERR_HWI_E006MSG "SkGeMacInit(): PState does not match HW state" -+#define SKERR_HWI_E006MSG "SkGeInit() called with illegal Chip Id" - #define SKERR_HWI_E007 (SKERR_HWI_E006+1) - #define SKERR_HWI_E007MSG "SkXmInitDupMd() called with invalid Dup Mode" - #define SKERR_HWI_E008 (SKERR_HWI_E007+1) -@@ -433,11 +618,11 @@ typedef struct s_GeInit { - #define SKERR_HWI_E013 (SKERR_HWI_E012+1) - #define SKERR_HWI_E013MSG "SkGeInitPort(): cfg changed for running queue" - #define SKERR_HWI_E014 (SKERR_HWI_E013+1) --#define SKERR_HWI_E014MSG "SkGeInitPort(): unknown GIPortUsage specified" -+#define SKERR_HWI_E014MSG "SkGeInitPort(): unknown PortUsage specified" - #define SKERR_HWI_E015 (SKERR_HWI_E014+1) --#define SKERR_HWI_E015MSG "Illegal Link mode parameter" -+#define SKERR_HWI_E015MSG "Illegal Link Mode parameter" - #define SKERR_HWI_E016 (SKERR_HWI_E015+1) --#define SKERR_HWI_E016MSG "Illegal Flow control mode parameter" -+#define SKERR_HWI_E016MSG "Illegal Flow Control Mode parameter" - #define SKERR_HWI_E017 (SKERR_HWI_E016+1) - #define SKERR_HWI_E017MSG "Illegal value specified for GIPollTimerVal" - #define SKERR_HWI_E018 (SKERR_HWI_E017+1) -@@ -447,9 +632,9 @@ typedef struct s_GeInit { - #define SKERR_HWI_E020 (SKERR_HWI_E019+1) - #define SKERR_HWI_E020MSG "Illegal Master/Slave parameter" - #define SKERR_HWI_E021 (SKERR_HWI_E020+1) --#define SKERR_HWI_E021MSG "MacUpdateStats(): cannot update statistic counter" --#define SKERR_HWI_E022 (SKERR_HWI_E021+1) --#define SKERR_HWI_E022MSG "MacStatistic(): illegal statistic base address" -+#define SKERR_HWI_E021MSG "MacUpdateStats(): cannot update statistic counter" -+#define SKERR_HWI_E022 (SKERR_HWI_E021+1) -+#define SKERR_HWI_E022MSG "MacStatistic(): illegal statistic base address" - #define SKERR_HWI_E023 (SKERR_HWI_E022+1) - #define SKERR_HWI_E023MSG "SkGeInitPort(): Transmit Queue Size too small" - #define SKERR_HWI_E024 (SKERR_HWI_E023+1) -@@ -464,6 +649,24 @@ typedef struct s_GeInit { - /* - * public functions in skgeinit.c - */ -+extern void SkGePortVlan( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ int Port, -+ SK_BOOL Enable); -+ -+extern void SkGeRxRss( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ int Port, -+ SK_BOOL Enable); -+ -+extern void SkGeRxCsum( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ int Port, -+ SK_BOOL Enable); -+ - extern void SkGePollRxD( - SK_AC *pAC, - SK_IOC IoC, -@@ -528,9 +731,14 @@ extern void SkGeInitRamIface( - - extern int SkGeInitAssignRamToQueues( - SK_AC *pAC, -- int ActivePort, -+ int Port, - SK_BOOL DualNet); - -+extern int SkYuk2RestartRxBmu( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ int Port); -+ - /* - * public functions in skxmac2.c - */ -@@ -601,13 +809,13 @@ extern void SkMacAutoNegLipaPhy( - int Port, - SK_U16 IStatus); - --extern void SkMacSetRxTxEn( -+extern void SkMacSetRxTxEn( - SK_AC *pAC, - SK_IOC IoC, - int Port, - int Para); - --extern int SkMacRxTxEnable( -+extern int SkMacRxTxEnable( - SK_AC *pAC, - SK_IOC IoC, - int Port); -@@ -624,28 +832,28 @@ extern void SkMacHashing( - int Port, - SK_BOOL Enable); - --extern void SkXmPhyRead( -+extern int SkXmPhyRead( - SK_AC *pAC, - SK_IOC IoC, - int Port, - int Addr, - SK_U16 SK_FAR *pVal); - --extern void SkXmPhyWrite( -+extern int SkXmPhyWrite( - SK_AC *pAC, - SK_IOC IoC, - int Port, - int Addr, - SK_U16 Val); - --extern void SkGmPhyRead( -+extern int SkGmPhyRead( - SK_AC *pAC, - SK_IOC IoC, - int Port, - int Addr, - SK_U16 SK_FAR *pVal); - --extern void SkGmPhyWrite( -+extern int SkGmPhyWrite( - SK_AC *pAC, - SK_IOC IoC, - int Port, -@@ -713,7 +921,7 @@ extern int SkXmOverflowStatus( - SK_AC *pAC, - SK_IOC IoC, - unsigned int Port, -- SK_U16 IStatus, -+ SK_U16 IStatus, - SK_U64 SK_FAR *pStatus); - - extern int SkGmOverflowStatus( -@@ -729,6 +937,7 @@ extern int SkGmCableDiagStatus( - int Port, - SK_BOOL StartTest); - -+#ifdef SK_PHY_LP_MODE - extern int SkGmEnterLowPowerMode( - SK_AC *pAC, - SK_IOC IoC, -@@ -739,6 +948,7 @@ extern int SkGmLeaveLowPowerMode( - SK_AC *pAC, - SK_IOC IoC, - int Port); -+#endif /* SK_PHY_LP_MODE */ - - #ifdef SK_DIAG - extern void SkGePhyRead( -@@ -794,31 +1004,35 @@ extern int SkGeInitPort(); - extern void SkGeXmitLED(); - extern void SkGeInitRamIface(); - extern int SkGeInitAssignRamToQueues(); -+extern void SkGePortVlan(); -+extern void SkGeRxCsum(); -+extern void SkGeRxRss(); -+extern int SkYuk2RestartRxBmu(); - - /* - * public functions in skxmac2.c - */ --extern void SkMacRxTxDisable(); -+extern void SkMacRxTxDisable(); - extern void SkMacSoftRst(); - extern void SkMacHardRst(); - extern void SkMacClearRst(); --extern void SkMacInitPhy(); --extern int SkMacRxTxEnable(); --extern void SkMacPromiscMode(); --extern void SkMacHashing(); --extern void SkMacIrqDisable(); -+extern void SkMacInitPhy(); -+extern int SkMacRxTxEnable(); -+extern void SkMacPromiscMode(); -+extern void SkMacHashing(); -+extern void SkMacIrqDisable(); - extern void SkMacFlushTxFifo(); - extern void SkMacFlushRxFifo(); - extern void SkMacIrq(); - extern int SkMacAutoNegDone(); - extern void SkMacAutoNegLipaPhy(); --extern void SkMacSetRxTxEn(); -+extern void SkMacSetRxTxEn(); - extern void SkXmInitMac(); --extern void SkXmPhyRead(); --extern void SkXmPhyWrite(); -+extern int SkXmPhyRead(); -+extern int SkXmPhyWrite(); - extern void SkGmInitMac(); --extern void SkGmPhyRead(); --extern void SkGmPhyWrite(); -+extern int SkGmPhyRead(); -+extern int SkGmPhyWrite(); - extern void SkXmClrExactAddr(); - extern void SkXmInitDupMd(); - extern void SkXmInitPauseMd(); -@@ -832,8 +1046,10 @@ extern int SkGmResetCounter(); - extern int SkXmOverflowStatus(); - extern int SkGmOverflowStatus(); - extern int SkGmCableDiagStatus(); -+#ifdef SK_PHY_LP_MODE - extern int SkGmEnterLowPowerMode(); - extern int SkGmLeaveLowPowerMode(); -+#endif /* SK_PHY_LP_MODE */ - - #ifdef SK_DIAG - extern void SkGePhyRead(); -@@ -844,10 +1060,11 @@ extern void SkMacTimeStamp(); - extern void SkXmSendCont(); - #endif /* SK_DIAG */ - --#endif /* SK_KR_PROTO */ -+#endif /* SK_KR_PROTO */ - - #ifdef __cplusplus - } - #endif /* __cplusplus */ - - #endif /* __INC_SKGEINIT_H_ */ -+ ---- ./drivers/net/sk98lin/h/skgepnm2.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgepnm2.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skgepnm2.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.36 $ -- * Date: $Date: 2003/05/23 12:45:13 $ -+ * Version: $Revision: 2.4 $ -+ * Date: $Date: 2005/05/03 06:42:43 $ - * Purpose: Defines for Private Network Management Interface - * - ****************************************************************************/ -@@ -28,8 +28,13 @@ - /* - * General definitions - */ --#define SK_PNMI_CHIPSET_XMAC 1 /* XMAC11800FP */ --#define SK_PNMI_CHIPSET_YUKON 2 /* YUKON */ -+#define SK_PNMI_CHIPSET_XMAC 1 /* XMAC11800FP */ -+#define SK_PNMI_CHIPSET_YUKON 2 /* YUKON */ -+#define SK_PNMI_CHIPSET_YUKON_LITE 3 /* YUKON-Lite (Rev. A1-A3) */ -+#define SK_PNMI_CHIPSET_YUKON_LP 4 /* YUKON-LP */ -+#define SK_PNMI_CHIPSET_YUKON_XL 5 /* YUKON-2 XL */ -+#define SK_PNMI_CHIPSET_YUKON_EC 6 /* YUKON-2 EC */ -+#define SK_PNMI_CHIPSET_YUKON_FE 7 /* YUKON-2 FE */ - - #define SK_PNMI_BUS_PCI 1 /* PCI bus*/ - -@@ -70,9 +75,9 @@ - /* - * VCT internal status values - */ --#define SK_PNMI_VCT_PENDING 32 --#define SK_PNMI_VCT_TEST_DONE 64 --#define SK_PNMI_VCT_LINK 128 -+#define SK_PNMI_VCT_PENDING 0x20 -+#define SK_PNMI_VCT_TEST_DONE 0x40 -+#define SK_PNMI_VCT_LINK 0x80 - - /* - * Internal table definitions -@@ -323,7 +328,7 @@ typedef struct s_PnmiStatAddr { - vSt, \ - pAC->Pnmi.MacUpdatedFlag, \ - pAC->Pnmi.RlmtUpdatedFlag, \ -- pAC->Pnmi.SirqUpdatedFlag))}} -+ pAC->Pnmi.SirqUpdatedFlag));}} - - #else /* !DEBUG */ - ---- ./drivers/net/sk98lin/h/skgepnmi.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgepnmi.h 2006-04-04 13:13:34.000000000 +0400 -@@ -1,9 +1,9 @@ - /***************************************************************************** - * - * Name: skgepnmi.h -- * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.62 $ -- * Date: $Date: 2003/08/15 12:31:52 $ -+ * Project: Gigabit Ethernet Adapters, PNMI-Module -+ * Version: $Revision: 2.11 $ -+ * Date: $Date: 2005/08/09 09:02:12 $ - * Purpose: Defines for Private Network Management Interface - * - ****************************************************************************/ -@@ -31,7 +31,7 @@ - #include "h/sktypes.h" - #include "h/skerror.h" - #include "h/sktimer.h" --#include "h/ski2c.h" -+#include "h/sktwsi.h" - #include "h/skaddr.h" - #include "h/skrlmt.h" - #include "h/skvpd.h" -@@ -41,7 +41,6 @@ - */ - #define SK_PNMI_MDB_VERSION 0x00030001 /* 3.1 */ - -- - /* - * Event definitions - */ -@@ -54,16 +53,13 @@ - #define SK_PNMI_EVT_UTILIZATION_TIMER 7 /* Timer event for Utiliza. */ - #define SK_PNMI_EVT_CLEAR_COUNTER 8 /* Clear statistic counters */ - #define SK_PNMI_EVT_XMAC_RESET 9 /* XMAC will be reset */ -- - #define SK_PNMI_EVT_RLMT_PORT_UP 10 /* Port came logically up */ - #define SK_PNMI_EVT_RLMT_PORT_DOWN 11 /* Port went logically down */ - #define SK_PNMI_EVT_RLMT_SEGMENTATION 13 /* Two SP root bridges found */ - #define SK_PNMI_EVT_RLMT_ACTIVE_DOWN 14 /* Port went logically down */ - #define SK_PNMI_EVT_RLMT_ACTIVE_UP 15 /* Port came logically up */ --#define SK_PNMI_EVT_RLMT_SET_NETS 16 /* 1. Parameter is number of nets -- 1 = single net; 2 = dual net */ --#define SK_PNMI_EVT_VCT_RESET 17 /* VCT port reset timer event started with SET. */ -- -+#define SK_PNMI_EVT_RLMT_SET_NETS 16 /* Number of nets (1 or 2). */ -+#define SK_PNMI_EVT_VCT_RESET 17 /* VCT port reset timer event started with SET. */ - - /* - * Return values -@@ -78,7 +74,6 @@ - #define SK_PNMI_ERR_UNKNOWN_NET 7 - #define SK_PNMI_ERR_NOT_SUPPORTED 10 - -- - /* - * Return values of driver reset function SK_DRIVER_RESET() and - * driver event function SK_DRIVER_EVENT() -@@ -86,19 +81,17 @@ - #define SK_PNMI_ERR_OK 0 - #define SK_PNMI_ERR_FAIL 1 - -- - /* - * Return values of driver test function SK_DRIVER_SELFTEST() - */ - #define SK_PNMI_TST_UNKNOWN (1 << 0) --#define SK_PNMI_TST_TRANCEIVER (1 << 1) -+#define SK_PNMI_TST_TRANCEIVER (1 << 1) - #define SK_PNMI_TST_ASIC (1 << 2) - #define SK_PNMI_TST_SENSOR (1 << 3) --#define SK_PNMI_TST_POWERMGMT (1 << 4) -+#define SK_PNMI_TST_POWERMGMT (1 << 4) - #define SK_PNMI_TST_PCI (1 << 5) - #define SK_PNMI_TST_MAC (1 << 6) - -- - /* - * RLMT specific definitions - */ -@@ -223,7 +216,17 @@ - #define OID_SKGE_RLMT_PORT_NUMBER 0xFF010141 - #define OID_SKGE_RLMT_PORT_ACTIVE 0xFF010142 - #define OID_SKGE_RLMT_PORT_PREFERRED 0xFF010143 --#define OID_SKGE_INTERMEDIATE_SUPPORT 0xFF010160 -+ -+#define OID_SKGE_RLMT_MONITOR_NUMBER 0xFF010150 -+#define OID_SKGE_RLMT_MONITOR_INDEX 0xFF010151 -+#define OID_SKGE_RLMT_MONITOR_ADDR 0xFF010152 -+#define OID_SKGE_RLMT_MONITOR_ERRS 0xFF010153 -+#define OID_SKGE_RLMT_MONITOR_TIMESTAMP 0xFF010154 -+#define OID_SKGE_RLMT_MONITOR_ADMIN 0xFF010155 -+ -+#define OID_SKGE_INTERMEDIATE_SUPPORT 0xFF010160 -+#define OID_SKGE_SET_TEAM_MAC_ADDRESS 0xFF010161 -+#define OID_SKGE_DEVICE_INFORMATION 0xFF010162 - - #define OID_SKGE_SPEED_CAP 0xFF010170 - #define OID_SKGE_SPEED_MODE 0xFF010171 -@@ -322,13 +325,6 @@ - #define OID_SKGE_RLMT_TX_SP_REQ_CTS 0xFF020168 - #define OID_SKGE_RLMT_RX_SP_CTS 0xFF020169 - --#define OID_SKGE_RLMT_MONITOR_NUMBER 0xFF010150 --#define OID_SKGE_RLMT_MONITOR_INDEX 0xFF010151 --#define OID_SKGE_RLMT_MONITOR_ADDR 0xFF010152 --#define OID_SKGE_RLMT_MONITOR_ERRS 0xFF010153 --#define OID_SKGE_RLMT_MONITOR_TIMESTAMP 0xFF010154 --#define OID_SKGE_RLMT_MONITOR_ADMIN 0xFF010155 -- - #define OID_SKGE_TX_SW_QUEUE_LEN 0xFF020170 - #define OID_SKGE_TX_SW_QUEUE_MAX 0xFF020171 - #define OID_SKGE_TX_RETRY 0xFF020172 -@@ -352,6 +348,7 @@ - #define OID_SKGE_VCT_GET 0xFF020200 - #define OID_SKGE_VCT_SET 0xFF020201 - #define OID_SKGE_VCT_STATUS 0xFF020202 -+#define OID_SKGE_VCT_CAPABILITIES 0xFF020203 - - #ifdef SK_DIAG_SUPPORT - /* Defines for driver DIAG mode. */ -@@ -367,22 +364,79 @@ - #define OID_SKGE_PHY_TYPE 0xFF020215 - #define OID_SKGE_PHY_LP_MODE 0xFF020216 - -+/* -+ * Added for new DualNet IM driver V2 -+ * these OIDs should later be in pnmi.h -+ */ -+#define OID_SKGE_MAC_COUNT 0xFF020217 -+#define OID_SKGE_DUALNET_MODE 0xFF020218 -+#define OID_SKGE_SET_TAGHEADER 0xFF020219 -+ -+#ifdef SK_ASF -+/* Defines for ASF */ -+#define OID_SKGE_ASF 0xFF02021a -+#define OID_SKGE_ASF_STORE_CONFIG 0xFF02021b -+#define OID_SKGE_ASF_ENA 0xFF02021c -+#define OID_SKGE_ASF_RETRANS 0xFF02021d -+#define OID_SKGE_ASF_RETRANS_INT 0xFF02021e -+#define OID_SKGE_ASF_HB_ENA 0xFF02021f -+#define OID_SKGE_ASF_HB_INT 0xFF020220 -+#define OID_SKGE_ASF_WD_ENA 0xFF020221 -+#define OID_SKGE_ASF_WD_TIME 0xFF020222 -+#define OID_SKGE_ASF_IP_SOURCE 0xFF020223 -+#define OID_SKGE_ASF_MAC_SOURCE 0xFF020224 -+#define OID_SKGE_ASF_IP_DEST 0xFF020225 -+#define OID_SKGE_ASF_MAC_DEST 0xFF020226 -+#define OID_SKGE_ASF_COMMUNITY_NAME 0xFF020227 -+#define OID_SKGE_ASF_RSP_ENA 0xFF020228 -+#define OID_SKGE_ASF_RETRANS_COUNT_MIN 0xFF020229 -+#define OID_SKGE_ASF_RETRANS_COUNT_MAX 0xFF02022a -+#define OID_SKGE_ASF_RETRANS_INT_MIN 0xFF02022b -+#define OID_SKGE_ASF_RETRANS_INT_MAX 0xFF02022c -+#define OID_SKGE_ASF_HB_INT_MIN 0xFF02022d -+#define OID_SKGE_ASF_HB_INT_MAX 0xFF02022e -+#define OID_SKGE_ASF_WD_TIME_MIN 0xFF02022f -+#define OID_SKGE_ASF_WD_TIME_MAX 0xFF020230 -+#define OID_SKGE_ASF_HB_CAP 0xFF020231 -+#define OID_SKGE_ASF_WD_TIMER_RES 0xFF020232 -+#define OID_SKGE_ASF_GUID 0xFF020233 -+#define OID_SKGE_ASF_KEY_OP 0xFF020234 -+#define OID_SKGE_ASF_KEY_ADM 0xFF020235 -+#define OID_SKGE_ASF_KEY_GEN 0xFF020236 -+#define OID_SKGE_ASF_CAP 0xFF020237 -+#define OID_SKGE_ASF_PAR_1 0xFF020238 -+#define OID_SKGE_ASF_OVERALL_OID 0xFF020239 -+#endif /* SK_ASF */ -+ -+ -+// Defined for yukon2 path only -+#define OID_SKGE_UPPER_MINIPORT 0xFF02023D -+ -+ -+#ifdef SK_ASF -+/* Defines for ASF */ -+#define OID_SKGE_ASF_FWVER_OID 0xFF020240 -+#define OID_SKGE_ASF_ACPI_OID 0xFF020241 -+#define OID_SKGE_ASF_SMBUS_OID 0xFF020242 -+#endif /* SK_ASF */ -+ -+ - /* VCT struct to store a backup copy of VCT data after a port reset. */ - typedef struct s_PnmiVct { - SK_U8 VctStatus; -- SK_U8 PCableLen; -- SK_U32 PMdiPairLen[4]; -- SK_U8 PMdiPairSts[4]; -+ SK_U8 CableLen; -+ SK_U32 MdiPairLen[4]; -+ SK_U8 MdiPairSts[4]; - } SK_PNMI_VCT; - - - /* VCT status values (to be given to CPA via OID_SKGE_VCT_STATUS). */ --#define SK_PNMI_VCT_NONE 0 --#define SK_PNMI_VCT_OLD_VCT_DATA 1 --#define SK_PNMI_VCT_NEW_VCT_DATA 2 --#define SK_PNMI_VCT_OLD_DSP_DATA 4 --#define SK_PNMI_VCT_NEW_DSP_DATA 8 --#define SK_PNMI_VCT_RUNNING 16 -+#define SK_PNMI_VCT_NONE 0x00 -+#define SK_PNMI_VCT_OLD_VCT_DATA 0x01 -+#define SK_PNMI_VCT_NEW_VCT_DATA 0x02 -+#define SK_PNMI_VCT_OLD_DSP_DATA 0x04 -+#define SK_PNMI_VCT_NEW_DSP_DATA 0x08 -+#define SK_PNMI_VCT_RUNNING 0x10 - - - /* VCT cable test status. */ -@@ -390,7 +444,12 @@ typedef struct s_PnmiVct { - #define SK_PNMI_VCT_SHORT_CABLE 1 - #define SK_PNMI_VCT_OPEN_CABLE 2 - #define SK_PNMI_VCT_TEST_FAIL 3 --#define SK_PNMI_VCT_IMPEDANCE_MISMATCH 4 -+#define SK_PNMI_VCT_IMPEDANCE_MISMATCH 4 -+#define SK_PNMI_VCT_NOT_PRESENT 5 -+ -+/* VCT capabilities (needed for OID_SKGE_VCT_CAPABILITIES. */ -+#define SK_PNMI_VCT_SUPPORTED 1 -+#define SK_PNMI_VCT_NOT_SUPPORTED 0 - - #define OID_SKGE_TRAP_SEN_WAR_LOW 500 - #define OID_SKGE_TRAP_SEN_WAR_UPP 501 -@@ -419,7 +478,6 @@ typedef struct s_PnmiVct { - #define SK_SET_FULL_MIB 5 - #define SK_PRESET_FULL_MIB 6 - -- - /* - * Define error numbers and messages for syslog - */ -@@ -452,7 +510,7 @@ typedef struct s_PnmiVct { - #define SK_PNMI_ERR014 (SK_ERRBASE_PNMI + 14) - #define SK_PNMI_ERR014MSG "Vpd: Cannot read VPD keys" - #define SK_PNMI_ERR015 (SK_ERRBASE_PNMI + 15) --#define SK_PNMI_ERR015MSG "Vpd: Internal array for VPD keys to small" -+#define SK_PNMI_ERR015MSG "Vpd: Internal array for VPD keys too small" - #define SK_PNMI_ERR016 (SK_ERRBASE_PNMI + 16) - #define SK_PNMI_ERR016MSG "Vpd: Key string too long" - #define SK_PNMI_ERR017 (SK_ERRBASE_PNMI + 17) -@@ -494,9 +552,9 @@ typedef struct s_PnmiVct { - #define SK_PNMI_ERR036 (SK_ERRBASE_PNMI + 36) - #define SK_PNMI_ERR036MSG "" - #define SK_PNMI_ERR037 (SK_ERRBASE_PNMI + 37) --#define SK_PNMI_ERR037MSG "Rlmt: SK_RLMT_MODE_CHANGE event return not 0" -+#define SK_PNMI_ERR037MSG "Rlmt: SK_RLMT_MODE_CHANGE event returned not 0" - #define SK_PNMI_ERR038 (SK_ERRBASE_PNMI + 38) --#define SK_PNMI_ERR038MSG "Rlmt: SK_RLMT_PREFPORT_CHANGE event return not 0" -+#define SK_PNMI_ERR038MSG "Rlmt: SK_RLMT_PREFPORT_CHANGE event returned not 0" - #define SK_PNMI_ERR039 (SK_ERRBASE_PNMI + 39) - #define SK_PNMI_ERR039MSG "RlmtStat: Unknown OID" - #define SK_PNMI_ERR040 (SK_ERRBASE_PNMI + 40) -@@ -514,9 +572,9 @@ typedef struct s_PnmiVct { - #define SK_PNMI_ERR046 (SK_ERRBASE_PNMI + 46) - #define SK_PNMI_ERR046MSG "Monitor: Unknown OID" - #define SK_PNMI_ERR047 (SK_ERRBASE_PNMI + 47) --#define SK_PNMI_ERR047MSG "SirqUpdate: Event function returns not 0" -+#define SK_PNMI_ERR047MSG "SirqUpdate: Event function returned not 0" - #define SK_PNMI_ERR048 (SK_ERRBASE_PNMI + 48) --#define SK_PNMI_ERR048MSG "RlmtUpdate: Event function returns not 0" -+#define SK_PNMI_ERR048MSG "RlmtUpdate: Event function returned not 0" - #define SK_PNMI_ERR049 (SK_ERRBASE_PNMI + 49) - #define SK_PNMI_ERR049MSG "SkPnmiInit: Invalid size of 'CounterOffset' struct!!" - #define SK_PNMI_ERR050 (SK_ERRBASE_PNMI + 50) -@@ -826,23 +884,25 @@ typedef struct s_PnmiStrucData { - } SK_PNMI_STRUCT_DATA; - - #define SK_PNMI_STRUCT_SIZE (sizeof(SK_PNMI_STRUCT_DATA)) -+ -+/* The ReturnStatus field must be located before VpdFreeBytes! */ - #define SK_PNMI_MIN_STRUCT_SIZE ((unsigned int)(SK_UPTR)\ - &(((SK_PNMI_STRUCT_DATA *)0)->VpdFreeBytes)) -- /* -- * ReturnStatus field -- * must be located -- * before VpdFreeBytes -- */ - - /* - * Various definitions - */ -+#define SK_PNMI_EVT_TIMER_CHECK 28125000L /* 28125 ms */ -+ -+#define SK_PNMI_VCT_TIMER_CHECK 4000000L /* 4 sec. */ -+ - #define SK_PNMI_MAX_PROTOS 3 - --#define SK_PNMI_CNT_NO 66 /* Must have the value of the enum -- * SK_PNMI_MAX_IDX. Define SK_PNMI_CHECK -- * for check while init phase 1 -- */ -+/* -+ * SK_PNMI_CNT_NO must have the value of the enum SK_PNMI_MAX_IDX. -+ * Define SK_PNMI_CHECK to check this during init level SK_INIT_IO. -+ */ -+#define SK_PNMI_CNT_NO 66 - - /* - * Estimate data structure -@@ -856,14 +916,6 @@ typedef struct s_PnmiEstimate { - - - /* -- * VCT timer data structure -- */ --typedef struct s_VctTimer { -- SK_TIMER VctTimer; --} SK_PNMI_VCT_TIMER; -- -- --/* - * PNMI specific adapter context structure - */ - typedef struct s_PnmiPort { -@@ -933,12 +985,13 @@ typedef struct s_PnmiData { - unsigned int TrapQueueEnd; - unsigned int TrapBufPad; - unsigned int TrapUnique; -- SK_U8 VctStatus[SK_MAX_MACS]; -- SK_PNMI_VCT VctBackup[SK_MAX_MACS]; -- SK_PNMI_VCT_TIMER VctTimeout[SK_MAX_MACS]; -+ SK_U8 VctStatus[SK_MAX_MACS]; -+ SK_PNMI_VCT VctBackup[SK_MAX_MACS]; -+ SK_TIMER VctTimeout[SK_MAX_MACS]; - #ifdef SK_DIAG_SUPPORT - SK_U32 DiagAttached; - #endif /* SK_DIAG_SUPPORT */ -+ SK_BOOL VpdKeyReadError; - } SK_PNMI; - - ---- ./drivers/net/sk98lin/h/skgesirq.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skgesirq.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skgesirq.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.30 $ -- * Date: $Date: 2003/07/04 12:34:13 $ -- * Purpose: SK specific Gigabit Ethernet special IRQ functions -+ * Version: $Revision: 2.5 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ -+ * Purpose: Gigabit Ethernet special IRQ functions - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -26,9 +27,9 @@ - #define _INC_SKGESIRQ_H_ - - /* Define return codes of SkGePortCheckUp and CheckShort */ --#define SK_HW_PS_NONE 0 /* No action needed */ --#define SK_HW_PS_RESTART 1 /* Restart needed */ --#define SK_HW_PS_LINK 2 /* Link Up actions needed */ -+#define SK_HW_PS_NONE 0 /* No action needed */ -+#define SK_HW_PS_RESTART 1 /* Restart needed */ -+#define SK_HW_PS_LINK 2 /* Link Up actions needed */ - - /* - * Define the Event the special IRQ/INI module can handle -@@ -44,10 +45,10 @@ - #define SK_HWEV_SET_SPEED 9 /* Set Link Speed by PNMI */ - #define SK_HWEV_HALFDUP_CHK 10 /* Half Duplex Hangup Workaround */ - --#define SK_WA_ACT_TIME (5000000UL) /* 5 sec */ --#define SK_WA_INA_TIME (100000UL) /* 100 msec */ -+#define SK_WA_ACT_TIME 1000000UL /* 1000 msec (1 sec) */ -+#define SK_WA_INA_TIME 100000UL /* 100 msec */ - --#define SK_HALFDUP_CHK_TIME (10000UL) /* 10 msec */ -+#define SK_HALFDUP_CHK_TIME 10000UL /* 10 msec */ - - /* - * Define the error numbers and messages -@@ -75,9 +76,9 @@ - #define SKERR_SIRQ_E011 (SKERR_SIRQ_E010+1) - #define SKERR_SIRQ_E011MSG "CHECK failure XA2" - #define SKERR_SIRQ_E012 (SKERR_SIRQ_E011+1) --#define SKERR_SIRQ_E012MSG "unexpected IRQ Master error" -+#define SKERR_SIRQ_E012MSG "Unexpected IRQ Master error" - #define SKERR_SIRQ_E013 (SKERR_SIRQ_E012+1) --#define SKERR_SIRQ_E013MSG "unexpected IRQ Status error" -+#define SKERR_SIRQ_E013MSG "Unexpected IRQ Status error" - #define SKERR_SIRQ_E014 (SKERR_SIRQ_E013+1) - #define SKERR_SIRQ_E014MSG "Parity error on RAM (read)" - #define SKERR_SIRQ_E015 (SKERR_SIRQ_E014+1) -@@ -102,10 +103,35 @@ - #define SKERR_SIRQ_E024MSG "FIFO overflow error" - #define SKERR_SIRQ_E025 (SKERR_SIRQ_E024+1) - #define SKERR_SIRQ_E025MSG "2 Pair Downshift detected" -+#define SKERR_SIRQ_E026 (SKERR_SIRQ_E025+1) -+#define SKERR_SIRQ_E026MSG "Uncorrectable PCI Express error" -+#define SKERR_SIRQ_E027 (SKERR_SIRQ_E026+1) -+#define SKERR_SIRQ_E027MSG "PCI Bus Abort detected" -+#define SKERR_SIRQ_E028 (SKERR_SIRQ_E027+1) -+#define SKERR_SIRQ_E028MSG "Parity error on RAM 1 (read)" -+#define SKERR_SIRQ_E029 (SKERR_SIRQ_E028+1) -+#define SKERR_SIRQ_E029MSG "Parity error on RAM 1 (write)" -+#define SKERR_SIRQ_E030 (SKERR_SIRQ_E029+1) -+#define SKERR_SIRQ_E030MSG "Parity error on RAM 2 (read)" -+#define SKERR_SIRQ_E031 (SKERR_SIRQ_E030+1) -+#define SKERR_SIRQ_E031MSG "Parity error on RAM 2 (write)" -+#define SKERR_SIRQ_E032 (SKERR_SIRQ_E031+1) -+#define SKERR_SIRQ_E032MSG "TCP segmentation error async. queue 1" -+#define SKERR_SIRQ_E033 (SKERR_SIRQ_E032+1) -+#define SKERR_SIRQ_E033MSG "TCP segmentation error sync. queue 1" -+#define SKERR_SIRQ_E034 (SKERR_SIRQ_E033+1) -+#define SKERR_SIRQ_E034MSG "TCP segmentation error async. queue 2" -+#define SKERR_SIRQ_E035 (SKERR_SIRQ_E034+1) -+#define SKERR_SIRQ_E035MSG "TCP segmentation error sync. queue 2" -+#define SKERR_SIRQ_E036 (SKERR_SIRQ_E035+1) -+#define SKERR_SIRQ_E036MSG "CHECK failure polling unit" - - extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus); - extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para); - extern void SkHWLinkUp(SK_AC *pAC, SK_IOC IoC, int Port); - extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port); -+extern void SkGeYuSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus); -+extern void SkYuk2SirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus); - - #endif /* _INC_SKGESIRQ_H_ */ -+ ---- /dev/null 2006-03-09 09:48:23.770951496 +0300 -+++ ./drivers/net/sk98lin/h/skgetwsi.h 2006-04-04 13:13:34.000000000 +0400 -@@ -0,0 +1,241 @@ -+/****************************************************************************** -+ * -+ * Name: skgetwsi.h -+ * Project: Gigabit Ethernet Adapters, TWSI-Module -+ * Version: $Revision: 1.7 $ -+ * Date: $Date: 2004/12/20 14:48:51 $ -+ * Purpose: Special defines for TWSI -+ * -+ ******************************************************************************/ -+ -+/****************************************************************************** -+ * -+ * (C)Copyright 1998-2002 SysKonnect. -+ * (C)Copyright 2002-2004 Marvell. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * The information in this file is provided "AS IS" without warranty. -+ * -+ ******************************************************************************/ -+ -+/* -+ * SKGETWSI.H contains all SK-98xx specific defines for the TWSI handling -+ */ -+ -+#ifndef _INC_SKGETWSI_H_ -+#define _INC_SKGETWSI_H_ -+ -+/* -+ * Macros to access the B2_I2C_CTRL -+ */ -+#define SK_I2C_CTL(IoC, flag, dev, dev_size, reg, burst) \ -+ SK_OUT32(IoC, B2_I2C_CTRL,\ -+ (flag ? 0x80000000UL : 0x0L) | \ -+ (((SK_U32)reg << 16) & I2C_ADDR) | \ -+ (((SK_U32)dev << 9) & I2C_DEV_SEL) | \ -+ (dev_size & I2C_DEV_SIZE) | \ -+ ((burst << 4) & I2C_BURST_LEN)) -+ -+#define SK_I2C_STOP(IoC) { \ -+ SK_U32 I2cCtrl; \ -+ SK_IN32(IoC, B2_I2C_CTRL, &I2cCtrl); \ -+ SK_OUT32(IoC, B2_I2C_CTRL, I2cCtrl | I2C_STOP); \ -+} -+ -+#define SK_I2C_GET_CTL(IoC, pI2cCtrl) SK_IN32(IoC, B2_I2C_CTRL, pI2cCtrl) -+ -+/* -+ * Macros to access the TWSI SW Registers -+ */ -+#define SK_I2C_SET_BIT(IoC, SetBits) { \ -+ SK_U8 OrgBits; \ -+ SK_IN8(IoC, B2_I2C_SW, &OrgBits); \ -+ SK_OUT8(IoC, B2_I2C_SW, OrgBits | (SK_U8)(SetBits)); \ -+} -+ -+#define SK_I2C_CLR_BIT(IoC, ClrBits) { \ -+ SK_U8 OrgBits; \ -+ SK_IN8(IoC, B2_I2C_SW, &OrgBits); \ -+ SK_OUT8(IoC, B2_I2C_SW, OrgBits & ~((SK_U8)(ClrBits))); \ -+} -+ -+#define SK_I2C_GET_SW(IoC, pI2cSw) SK_IN8(IoC, B2_I2C_SW, pI2cSw) -+ -+/* -+ * define the possible sensor states -+ */ -+#define SK_SEN_IDLE 0 /* Idle: sensor not read */ -+#define SK_SEN_VALUE 1 /* Value Read cycle */ -+#define SK_SEN_VALEXT 2 /* Extended Value Read cycle */ -+ -+/* -+ * Conversion factor to convert read Voltage sensor to milli Volt -+ * Conversion factor to convert read Temperature sensor to 10th degree Celsius -+ */ -+#define SK_LM80_VT_LSB 22 /* 22mV LSB resolution */ -+#define SK_LM80_TEMP_LSB 10 /* 1 degree LSB resolution */ -+#define SK_LM80_TEMPEXT_LSB 5 /* 0.5 degree LSB resolution for ext. val. */ -+ -+/* -+ * formula: counter = (22500*60)/(rpm * divisor * pulses/2) -+ * assuming: 6500rpm, 4 pulses, divisor 1 -+ */ -+#define SK_LM80_FAN_FAKTOR ((22500L*60)/(1*2)) -+ -+/* -+ * Define sensor management data -+ * Maximum is reached on Genesis copper dual port and Yukon-64 -+ * Board specific maximum is in pAC->I2c.MaxSens -+ */ -+#define SK_MAX_SENSORS 8 /* maximal no. of installed sensors */ -+#define SK_MIN_SENSORS 5 /* minimal no. of installed sensors */ -+ -+/* -+ * To watch the state machine (SM) use the timer in two ways -+ * instead of one as hitherto -+ */ -+#define SK_TIMER_WATCH_SM 0 /* Watch the SM to finish in a spec. time */ -+#define SK_TIMER_NEW_GAUGING 1 /* Start a new gauging when timer expires */ -+ -+/* -+ * Defines for the individual thresholds -+ */ -+ -+#define C_PLUS_20 120 / 100 -+#define C_PLUS_15 115 / 100 -+#define C_PLUS_10 110 / 100 -+#define C_PLUS_5 105 / 100 -+#define C_MINUS_5 95 / 100 -+#define C_MINUS_10 90 / 100 -+#define C_MINUS_15 85 / 100 -+ -+/* Temperature sensor */ -+#define SK_SEN_TEMP_HIGH_ERR 800 /* Temperature High Err Threshold */ -+#define SK_SEN_TEMP_HIGH_WARN 700 /* Temperature High Warn Threshold */ -+#define SK_SEN_TEMP_LOW_WARN 100 /* Temperature Low Warn Threshold */ -+#define SK_SEN_TEMP_LOW_ERR 0 /* Temperature Low Err Threshold */ -+ -+/* VCC which should be 5 V */ -+#define SK_SEN_PCI_5V_HIGH_ERR 5588 /* Voltage PCI High Err Threshold */ -+#define SK_SEN_PCI_5V_HIGH_WARN 5346 /* Voltage PCI High Warn Threshold */ -+#define SK_SEN_PCI_5V_LOW_WARN 4664 /* Voltage PCI Low Warn Threshold */ -+#define SK_SEN_PCI_5V_LOW_ERR 4422 /* Voltage PCI Low Err Threshold */ -+ -+/* -+ * VIO may be 5 V or 3.3 V. Initialization takes two parts: -+ * 1. Initialize lowest lower limit and highest higher limit. -+ * 2. After the first value is read correct the upper or the lower limit to -+ * the appropriate C constant. -+ * -+ * Warning limits are +-5% of the exepected voltage. -+ * Error limits are +-10% of the expected voltage. -+ */ -+ -+/* Bug fix AF: 16.Aug.2001: Correct the init base of LM80 sensor */ -+ -+#define SK_SEN_PCI_IO_5V_HIGH_ERR 5566 /* + 10% V PCI-IO High Err Threshold */ -+#define SK_SEN_PCI_IO_5V_HIGH_WARN 5324 /* + 5% V PCI-IO High Warn Threshold */ -+ /* 5000 mVolt */ -+#define SK_SEN_PCI_IO_5V_LOW_WARN 4686 /* - 5% V PCI-IO Low Warn Threshold */ -+#define SK_SEN_PCI_IO_5V_LOW_ERR 4444 /* - 10% V PCI-IO Low Err Threshold */ -+ -+#define SK_SEN_PCI_IO_RANGE_LIMITER 4000 /* 4000 mV range delimiter */ -+ -+/* correction values for the second pass */ -+#define SK_SEN_PCI_IO_3V3_HIGH_ERR 3850 /* + 15% V PCI-IO High Err Threshold */ -+#define SK_SEN_PCI_IO_3V3_HIGH_WARN 3674 /* + 10% V PCI-IO High Warn Threshold */ -+ /* 3300 mVolt */ -+#define SK_SEN_PCI_IO_3V3_LOW_WARN 2926 /* - 10% V PCI-IO Low Warn Threshold */ -+#define SK_SEN_PCI_IO_3V3_LOW_ERR 2772 /* - 15% V PCI-IO Low Err Threshold */ -+ -+/* -+ * VDD voltage -+ */ -+#define SK_SEN_VDD_HIGH_ERR 3630 /* Voltage ASIC High Err Threshold */ -+#define SK_SEN_VDD_HIGH_WARN 3476 /* Voltage ASIC High Warn Threshold */ -+#define SK_SEN_VDD_LOW_WARN 3146 /* Voltage ASIC Low Warn Threshold */ -+#define SK_SEN_VDD_LOW_ERR 2970 /* Voltage ASIC Low Err Threshold */ -+ -+/* -+ * PHY PLL 3V3 voltage -+ */ -+#define SK_SEN_PLL_3V3_HIGH_ERR 3630 /* Voltage PMA High Err Threshold */ -+#define SK_SEN_PLL_3V3_HIGH_WARN 3476 /* Voltage PMA High Warn Threshold */ -+#define SK_SEN_PLL_3V3_LOW_WARN 3146 /* Voltage PMA Low Warn Threshold */ -+#define SK_SEN_PLL_3V3_LOW_ERR 2970 /* Voltage PMA Low Err Threshold */ -+ -+/* -+ * VAUX (YUKON only) -+ */ -+#define SK_SEN_VAUX_3V3_VAL 3300 /* Voltage VAUX 3.3 Volt */ -+ -+#define SK_SEN_VAUX_3V3_HIGH_ERR (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_PLUS_10) -+#define SK_SEN_VAUX_3V3_HIGH_WARN (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_PLUS_5) -+#define SK_SEN_VAUX_3V3_LOW_WARN (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_MINUS_5) -+#define SK_SEN_VAUX_3V3_LOW_ERR (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_MINUS_10) -+ -+#define SK_SEN_VAUX_RANGE_LIMITER 1000 /* 1000 mV range delimiter */ -+ -+/* -+ * PHY 2V5 voltage -+ */ -+#define SK_SEN_PHY_2V5_VAL 2500 /* Voltage PHY 2.5 Volt */ -+ -+#define SK_SEN_PHY_2V5_HIGH_ERR (SK_I32)(SK_SEN_PHY_2V5_VAL * C_PLUS_10) -+#define SK_SEN_PHY_2V5_HIGH_WARN (SK_I32)(SK_SEN_PHY_2V5_VAL * C_PLUS_5) -+#define SK_SEN_PHY_2V5_LOW_WARN (SK_I32)(SK_SEN_PHY_2V5_VAL * C_MINUS_5) -+#define SK_SEN_PHY_2V5_LOW_ERR (SK_I32)(SK_SEN_PHY_2V5_VAL * C_MINUS_10) -+ -+/* -+ * ASIC Core 1V5 voltage (YUKON only) -+ */ -+#define SK_SEN_CORE_1V5_VAL 1500 /* Voltage ASIC Core 1.5 Volt */ -+ -+#define SK_SEN_CORE_1V5_HIGH_ERR (SK_I32)(SK_SEN_CORE_1V5_VAL * C_PLUS_10) -+#define SK_SEN_CORE_1V5_HIGH_WARN (SK_I32)(SK_SEN_CORE_1V5_VAL * C_PLUS_5) -+#define SK_SEN_CORE_1V5_LOW_WARN (SK_I32)(SK_SEN_CORE_1V5_VAL * C_MINUS_5) -+#define SK_SEN_CORE_1V5_LOW_ERR (SK_I32)(SK_SEN_CORE_1V5_VAL * C_MINUS_10) -+ -+/* -+ * ASIC Core 1V2 (1V3) voltage (YUKON-2 only) -+ */ -+#define SK_SEN_CORE_1V2_VAL 1200 /* Voltage ASIC Core 1.2 Volt */ -+ -+#define SK_SEN_CORE_1V2_HIGH_ERR (SK_I32)(SK_SEN_CORE_1V2_VAL * C_PLUS_20) -+#define SK_SEN_CORE_1V2_HIGH_WARN (SK_I32)(SK_SEN_CORE_1V2_VAL * C_PLUS_15) -+#define SK_SEN_CORE_1V2_LOW_WARN (SK_I32)(SK_SEN_CORE_1V2_VAL * C_MINUS_5) -+#define SK_SEN_CORE_1V2_LOW_ERR (SK_I32)(SK_SEN_CORE_1V2_VAL * C_MINUS_10) -+ -+#define SK_SEN_CORE_1V3_VAL 1300 /* Voltage ASIC Core 1.3 Volt */ -+ -+#define SK_SEN_CORE_1V3_HIGH_ERR (SK_I32)(SK_SEN_CORE_1V3_VAL * C_PLUS_15) -+#define SK_SEN_CORE_1V3_HIGH_WARN (SK_I32)(SK_SEN_CORE_1V3_VAL * C_PLUS_10) -+#define SK_SEN_CORE_1V3_LOW_WARN (SK_I32)(SK_SEN_CORE_1V3_VAL * C_MINUS_5) -+#define SK_SEN_CORE_1V3_LOW_ERR (SK_I32)(SK_SEN_CORE_1V3_VAL * C_MINUS_10) -+ -+/* -+ * FAN 1 speed -+ */ -+/* assuming: 6500rpm +-15%, 4 pulses, -+ * warning at: 80 % -+ * error at: 70 % -+ * no upper limit -+ */ -+#define SK_SEN_FAN_HIGH_ERR 20000 /* FAN Speed High Err Threshold */ -+#define SK_SEN_FAN_HIGH_WARN 20000 /* FAN Speed High Warn Threshold */ -+#define SK_SEN_FAN_LOW_WARN 5200 /* FAN Speed Low Warn Threshold */ -+#define SK_SEN_FAN_LOW_ERR 4550 /* FAN Speed Low Err Threshold */ -+ -+/* -+ * Some Voltages need dynamic thresholds -+ */ -+#define SK_SEN_DYN_INIT_NONE 0 /* No dynamic init of thresholds */ -+#define SK_SEN_DYN_INIT_PCI_IO 10 /* Init PCI-IO with new thresholds */ -+#define SK_SEN_DYN_INIT_VAUX 11 /* Init VAUX with new thresholds */ -+ -+extern int SkLm80ReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen); -+#endif /* n_INC_SKGETWSI_H */ -+ ---- ./drivers/net/sk98lin/h/ski2c.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/ski2c.h 1970-01-01 03:00:00.000000000 +0300 -@@ -1,177 +0,0 @@ --/****************************************************************************** -- * -- * Name: ski2c.h -- * Project: Gigabit Ethernet Adapters, TWSI-Module -- * Version: $Revision: 1.35 $ -- * Date: $Date: 2003/10/20 09:06:30 $ -- * Purpose: Defines to access Voltage and Temperature Sensor -- * -- ******************************************************************************/ -- --/****************************************************************************** -- * -- * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * The information in this file is provided "AS IS" without warranty. -- * -- ******************************************************************************/ -- --/* -- * SKI2C.H contains all I2C specific defines -- */ -- --#ifndef _SKI2C_H_ --#define _SKI2C_H_ -- --typedef struct s_Sensor SK_SENSOR; -- --#include "h/skgei2c.h" -- --/* -- * Define the I2C events. -- */ --#define SK_I2CEV_IRQ 1 /* IRQ happened Event */ --#define SK_I2CEV_TIM 2 /* Timeout event */ --#define SK_I2CEV_CLEAR 3 /* Clear MIB Values */ -- --/* -- * Define READ and WRITE Constants. -- */ --#define I2C_READ 0 --#define I2C_WRITE 1 --#define I2C_BURST 1 --#define I2C_SINGLE 0 -- --#define SKERR_I2C_E001 (SK_ERRBASE_I2C+0) --#define SKERR_I2C_E001MSG "Sensor index unknown" --#define SKERR_I2C_E002 (SKERR_I2C_E001+1) --#define SKERR_I2C_E002MSG "TWSI: transfer does not complete" --#define SKERR_I2C_E003 (SKERR_I2C_E002+1) --#define SKERR_I2C_E003MSG "LM80: NAK on device send" --#define SKERR_I2C_E004 (SKERR_I2C_E003+1) --#define SKERR_I2C_E004MSG "LM80: NAK on register send" --#define SKERR_I2C_E005 (SKERR_I2C_E004+1) --#define SKERR_I2C_E005MSG "LM80: NAK on device (2) send" --#define SKERR_I2C_E006 (SKERR_I2C_E005+1) --#define SKERR_I2C_E006MSG "Unknown event" --#define SKERR_I2C_E007 (SKERR_I2C_E006+1) --#define SKERR_I2C_E007MSG "LM80 read out of state" --#define SKERR_I2C_E008 (SKERR_I2C_E007+1) --#define SKERR_I2C_E008MSG "Unexpected sensor read completed" --#define SKERR_I2C_E009 (SKERR_I2C_E008+1) --#define SKERR_I2C_E009MSG "WARNING: temperature sensor out of range" --#define SKERR_I2C_E010 (SKERR_I2C_E009+1) --#define SKERR_I2C_E010MSG "WARNING: voltage sensor out of range" --#define SKERR_I2C_E011 (SKERR_I2C_E010+1) --#define SKERR_I2C_E011MSG "ERROR: temperature sensor out of range" --#define SKERR_I2C_E012 (SKERR_I2C_E011+1) --#define SKERR_I2C_E012MSG "ERROR: voltage sensor out of range" --#define SKERR_I2C_E013 (SKERR_I2C_E012+1) --#define SKERR_I2C_E013MSG "ERROR: couldn't init sensor" --#define SKERR_I2C_E014 (SKERR_I2C_E013+1) --#define SKERR_I2C_E014MSG "WARNING: fan sensor out of range" --#define SKERR_I2C_E015 (SKERR_I2C_E014+1) --#define SKERR_I2C_E015MSG "ERROR: fan sensor out of range" --#define SKERR_I2C_E016 (SKERR_I2C_E015+1) --#define SKERR_I2C_E016MSG "TWSI: active transfer does not complete" -- --/* -- * Define Timeout values -- */ --#define SK_I2C_TIM_LONG 2000000L /* 2 seconds */ --#define SK_I2C_TIM_SHORT 100000L /* 100 milliseconds */ --#define SK_I2C_TIM_WATCH 1000000L /* 1 second */ -- --/* -- * Define trap and error log hold times -- */ --#ifndef SK_SEN_ERR_TR_HOLD --#define SK_SEN_ERR_TR_HOLD (4*SK_TICKS_PER_SEC) --#endif --#ifndef SK_SEN_ERR_LOG_HOLD --#define SK_SEN_ERR_LOG_HOLD (60*SK_TICKS_PER_SEC) --#endif --#ifndef SK_SEN_WARN_TR_HOLD --#define SK_SEN_WARN_TR_HOLD (15*SK_TICKS_PER_SEC) --#endif --#ifndef SK_SEN_WARN_LOG_HOLD --#define SK_SEN_WARN_LOG_HOLD (15*60*SK_TICKS_PER_SEC) --#endif -- --/* -- * Defines for SenType -- */ --#define SK_SEN_UNKNOWN 0 --#define SK_SEN_TEMP 1 --#define SK_SEN_VOLT 2 --#define SK_SEN_FAN 3 -- --/* -- * Define for the SenErrorFlag -- */ --#define SK_SEN_ERR_NOT_PRESENT 0 /* Error Flag: Sensor not present */ --#define SK_SEN_ERR_OK 1 /* Error Flag: O.K. */ --#define SK_SEN_ERR_WARN 2 /* Error Flag: Warning */ --#define SK_SEN_ERR_ERR 3 /* Error Flag: Error */ --#define SK_SEN_ERR_FAULTY 4 /* Error Flag: Faulty */ -- --/* -- * Define the Sensor struct -- */ --struct s_Sensor { -- char *SenDesc; /* Description */ -- int SenType; /* Voltage or Temperature */ -- SK_I32 SenValue; /* Current value of the sensor */ -- SK_I32 SenThreErrHigh; /* High error Threshhold of this sensor */ -- SK_I32 SenThreWarnHigh; /* High warning Threshhold of this sensor */ -- SK_I32 SenThreErrLow; /* Lower error Threshold of the sensor */ -- SK_I32 SenThreWarnLow; /* Lower warning Threshold of the sensor */ -- int SenErrFlag; /* Sensor indicated an error */ -- SK_BOOL SenInit; /* Is sensor initialized ? */ -- SK_U64 SenErrCts; /* Error trap counter */ -- SK_U64 SenWarnCts; /* Warning trap counter */ -- SK_U64 SenBegErrTS; /* Begin error timestamp */ -- SK_U64 SenBegWarnTS; /* Begin warning timestamp */ -- SK_U64 SenLastErrTrapTS; /* Last error trap timestamp */ -- SK_U64 SenLastErrLogTS; /* Last error log timestamp */ -- SK_U64 SenLastWarnTrapTS; /* Last warning trap timestamp */ -- SK_U64 SenLastWarnLogTS; /* Last warning log timestamp */ -- int SenState; /* Sensor State (see HW specific include) */ -- int (*SenRead)(SK_AC *pAC, SK_IOC IoC, struct s_Sensor *pSen); -- /* Sensors read function */ -- SK_U16 SenReg; /* Register Address for this sensor */ -- SK_U8 SenDev; /* Device Selection for this sensor */ --}; -- --typedef struct s_I2c { -- SK_SENSOR SenTable[SK_MAX_SENSORS]; /* Sensor Table */ -- int CurrSens; /* Which sensor is currently queried */ -- int MaxSens; /* Max. number of sensors */ -- int TimerMode; /* Use the timer also to watch the state machine */ -- int InitLevel; /* Initialized Level */ --#ifndef SK_DIAG -- int DummyReads; /* Number of non-checked dummy reads */ -- SK_TIMER SenTimer; /* Sensors timer */ --#endif /* !SK_DIAG */ --} SK_I2C; -- --extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level); --extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size, -- int Reg, int Burst); --extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen); --#ifdef SK_DIAG --extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg, -- int Burst); --#else /* !SK_DIAG */ --extern int SkI2cEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para); --extern void SkI2cWaitIrq(SK_AC *pAC, SK_IOC IoC); --extern void SkI2cIsr(SK_AC *pAC, SK_IOC IoC); --#endif /* !SK_DIAG */ --#endif /* n_SKI2C_H */ -- ---- ./drivers/net/sk98lin/h/skqueue.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skqueue.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skqueue.h - * Project: Gigabit Ethernet Adapters, Event Scheduler Module -- * Version: $Revision: 1.16 $ -- * Date: $Date: 2003/09/16 12:50:32 $ -+ * Version: $Revision: 2.3 $ -+ * Date: $Date: 2004/05/14 13:39:15 $ - * Purpose: Defines for the Event queue - * - ******************************************************************************/ -@@ -45,6 +45,9 @@ - #define SKGE_RSF 11 /* RSF Aggregation Event Class */ - #define SKGE_MARKER 12 /* MARKER Aggregation Event Class */ - #define SKGE_FD 13 /* FD Distributor Event Class */ -+#ifdef SK_ASF -+#define SKGE_ASF 14 /* ASF Event Class */ -+#endif - - /* - * define event queue as circular buffer -@@ -90,5 +93,11 @@ extern int SkEventDispatcher(SK_AC *pAC, - #define SKERR_Q_E001MSG "Event queue overflow" - #define SKERR_Q_E002 (SKERR_Q_E001+1) - #define SKERR_Q_E002MSG "Undefined event class" -+#define SKERR_Q_E003 (SKERR_Q_E001+2) -+#define SKERR_Q_E003MSG "Event queued in Init Level 0" -+#define SKERR_Q_E004 (SKERR_Q_E001+3) -+#define SKERR_Q_E004MSG "Error Reported from Event Fuction (Queue Blocked)" -+#define SKERR_Q_E005 (SKERR_Q_E001+4) -+#define SKERR_Q_E005MSG "Event scheduler called in Init Level 0 or 1" - #endif /* _SKQUEUE_H_ */ - ---- ./drivers/net/sk98lin/h/skrlmt.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skrlmt.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skrlmt.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.37 $ -- * Date: $Date: 2003/04/15 09:43:43 $ -+ * Version: $Revision: 2.1 $ -+ * Date: $Date: 2003/10/27 14:16:09 $ - * Purpose: Header file for Redundant Link ManagemenT. - * - ******************************************************************************/ ---- ./drivers/net/sk98lin/h/sktimer.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/sktimer.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: sktimer.h - * Project: Gigabit Ethernet Adapters, Event Scheduler Module -- * Version: $Revision: 1.11 $ -- * Date: $Date: 2003/09/16 12:58:18 $ -+ * Version: $Revision: 2.1 $ -+ * Date: $Date: 2003/10/27 14:16:09 $ - * Purpose: Defines for the timer functions - * - ******************************************************************************/ ---- /dev/null 2006-03-09 09:48:23.770951496 +0300 -+++ ./drivers/net/sk98lin/h/sktwsi.h 2006-04-04 13:13:34.000000000 +0400 -@@ -0,0 +1,177 @@ -+/****************************************************************************** -+ * -+ * Name: sktwsi.h -+ * Project: Gigabit Ethernet Adapters, TWSI-Module -+ * Version: $Revision: 1.1 $ -+ * Date: $Date: 2003/12/19 14:02:56 $ -+ * Purpose: Defines to access Voltage and Temperature Sensor -+ * -+ ******************************************************************************/ -+ -+/****************************************************************************** -+ * -+ * (C)Copyright 1998-2002 SysKonnect. -+ * (C)Copyright 2002-2003 Marvell. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * The information in this file is provided "AS IS" without warranty. -+ * -+ ******************************************************************************/ -+ -+/* -+ * SKTWSI.H contains all TWSI specific defines -+ */ -+ -+#ifndef _SKTWSI_H_ -+#define _SKTWSI_H_ -+ -+typedef struct s_Sensor SK_SENSOR; -+ -+#include "h/skgetwsi.h" -+ -+/* -+ * Define the TWSI events. -+ */ -+#define SK_I2CEV_IRQ 1 /* IRQ happened Event */ -+#define SK_I2CEV_TIM 2 /* Timeout event */ -+#define SK_I2CEV_CLEAR 3 /* Clear MIB Values */ -+ -+/* -+ * Define READ and WRITE Constants. -+ */ -+#define I2C_READ 0 -+#define I2C_WRITE 1 -+#define I2C_BURST 1 -+#define I2C_SINGLE 0 -+ -+#define SKERR_I2C_E001 (SK_ERRBASE_I2C+0) -+#define SKERR_I2C_E001MSG "Sensor index unknown" -+#define SKERR_I2C_E002 (SKERR_I2C_E001+1) -+#define SKERR_I2C_E002MSG "TWSI: transfer does not complete" -+#define SKERR_I2C_E003 (SKERR_I2C_E002+1) -+#define SKERR_I2C_E003MSG "LM80: NAK on device send" -+#define SKERR_I2C_E004 (SKERR_I2C_E003+1) -+#define SKERR_I2C_E004MSG "LM80: NAK on register send" -+#define SKERR_I2C_E005 (SKERR_I2C_E004+1) -+#define SKERR_I2C_E005MSG "LM80: NAK on device (2) send" -+#define SKERR_I2C_E006 (SKERR_I2C_E005+1) -+#define SKERR_I2C_E006MSG "Unknown event" -+#define SKERR_I2C_E007 (SKERR_I2C_E006+1) -+#define SKERR_I2C_E007MSG "LM80 read out of state" -+#define SKERR_I2C_E008 (SKERR_I2C_E007+1) -+#define SKERR_I2C_E008MSG "Unexpected sensor read completed" -+#define SKERR_I2C_E009 (SKERR_I2C_E008+1) -+#define SKERR_I2C_E009MSG "WARNING: temperature sensor out of range" -+#define SKERR_I2C_E010 (SKERR_I2C_E009+1) -+#define SKERR_I2C_E010MSG "WARNING: voltage sensor out of range" -+#define SKERR_I2C_E011 (SKERR_I2C_E010+1) -+#define SKERR_I2C_E011MSG "ERROR: temperature sensor out of range" -+#define SKERR_I2C_E012 (SKERR_I2C_E011+1) -+#define SKERR_I2C_E012MSG "ERROR: voltage sensor out of range" -+#define SKERR_I2C_E013 (SKERR_I2C_E012+1) -+#define SKERR_I2C_E013MSG "ERROR: couldn't init sensor" -+#define SKERR_I2C_E014 (SKERR_I2C_E013+1) -+#define SKERR_I2C_E014MSG "WARNING: fan sensor out of range" -+#define SKERR_I2C_E015 (SKERR_I2C_E014+1) -+#define SKERR_I2C_E015MSG "ERROR: fan sensor out of range" -+#define SKERR_I2C_E016 (SKERR_I2C_E015+1) -+#define SKERR_I2C_E016MSG "TWSI: active transfer does not complete" -+ -+/* -+ * Define Timeout values -+ */ -+#define SK_I2C_TIM_LONG 2000000L /* 2 seconds */ -+#define SK_I2C_TIM_SHORT 100000L /* 100 milliseconds */ -+#define SK_I2C_TIM_WATCH 1000000L /* 1 second */ -+ -+/* -+ * Define trap and error log hold times -+ */ -+#ifndef SK_SEN_ERR_TR_HOLD -+#define SK_SEN_ERR_TR_HOLD (4*SK_TICKS_PER_SEC) -+#endif -+#ifndef SK_SEN_ERR_LOG_HOLD -+#define SK_SEN_ERR_LOG_HOLD (60*SK_TICKS_PER_SEC) -+#endif -+#ifndef SK_SEN_WARN_TR_HOLD -+#define SK_SEN_WARN_TR_HOLD (15*SK_TICKS_PER_SEC) -+#endif -+#ifndef SK_SEN_WARN_LOG_HOLD -+#define SK_SEN_WARN_LOG_HOLD (15*60*SK_TICKS_PER_SEC) -+#endif -+ -+/* -+ * Defines for SenType -+ */ -+#define SK_SEN_UNKNOWN 0 -+#define SK_SEN_TEMP 1 -+#define SK_SEN_VOLT 2 -+#define SK_SEN_FAN 3 -+ -+/* -+ * Define for the SenErrorFlag -+ */ -+#define SK_SEN_ERR_NOT_PRESENT 0 /* Error Flag: Sensor not present */ -+#define SK_SEN_ERR_OK 1 /* Error Flag: O.K. */ -+#define SK_SEN_ERR_WARN 2 /* Error Flag: Warning */ -+#define SK_SEN_ERR_ERR 3 /* Error Flag: Error */ -+#define SK_SEN_ERR_FAULTY 4 /* Error Flag: Faulty */ -+ -+/* -+ * Define the Sensor struct -+ */ -+struct s_Sensor { -+ char *SenDesc; /* Description */ -+ int SenType; /* Voltage or Temperature */ -+ SK_I32 SenValue; /* Current value of the sensor */ -+ SK_I32 SenThreErrHigh; /* High error Threshhold of this sensor */ -+ SK_I32 SenThreWarnHigh; /* High warning Threshhold of this sensor */ -+ SK_I32 SenThreErrLow; /* Lower error Threshold of the sensor */ -+ SK_I32 SenThreWarnLow; /* Lower warning Threshold of the sensor */ -+ int SenErrFlag; /* Sensor indicated an error */ -+ SK_BOOL SenInit; /* Is sensor initialized ? */ -+ SK_U64 SenErrCts; /* Error trap counter */ -+ SK_U64 SenWarnCts; /* Warning trap counter */ -+ SK_U64 SenBegErrTS; /* Begin error timestamp */ -+ SK_U64 SenBegWarnTS; /* Begin warning timestamp */ -+ SK_U64 SenLastErrTrapTS; /* Last error trap timestamp */ -+ SK_U64 SenLastErrLogTS; /* Last error log timestamp */ -+ SK_U64 SenLastWarnTrapTS; /* Last warning trap timestamp */ -+ SK_U64 SenLastWarnLogTS; /* Last warning log timestamp */ -+ int SenState; /* Sensor State (see HW specific include) */ -+ int (*SenRead)(SK_AC *pAC, SK_IOC IoC, struct s_Sensor *pSen); -+ /* Sensors read function */ -+ SK_U16 SenReg; /* Register Address for this sensor */ -+ SK_U8 SenDev; /* Device Selection for this sensor */ -+}; -+ -+typedef struct s_I2c { -+ SK_SENSOR SenTable[SK_MAX_SENSORS]; /* Sensor Table */ -+ int CurrSens; /* Which sensor is currently queried */ -+ int MaxSens; /* Max. number of sensors */ -+ int TimerMode; /* Use the timer also to watch the state machine */ -+ int InitLevel; /* Initialized Level */ -+#ifndef SK_DIAG -+ int DummyReads; /* Number of non-checked dummy reads */ -+ SK_TIMER SenTimer; /* Sensors timer */ -+#endif /* !SK_DIAG */ -+} SK_I2C; -+ -+extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level); -+extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size, -+ int Reg, int Burst); -+extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen); -+#ifdef SK_DIAG -+extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg, -+ int Burst); -+#else /* !SK_DIAG */ -+extern int SkI2cEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para); -+extern void SkI2cWaitIrq(SK_AC *pAC, SK_IOC IoC); -+extern void SkI2cIsr(SK_AC *pAC, SK_IOC IoC); -+#endif /* !SK_DIAG */ -+#endif /* n_SKTWSI_H */ -+ ---- ./drivers/net/sk98lin/h/sktypes.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/sktypes.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: sktypes.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.2 $ -- * Date: $Date: 2003/10/07 08:16:51 $ -+ * Version: $Revision: 1.2.2.1 $ -+ * Date: $Date: 2005/04/11 09:00:53 $ - * Purpose: Define data types for Linux - * - ******************************************************************************/ -@@ -11,7 +11,7 @@ - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -22,48 +22,28 @@ - * - ******************************************************************************/ - --/****************************************************************************** -- * -- * Description: -- * -- * In this file, all data types that are needed by the common modules -- * are mapped to Linux data types. -- * -- * -- * Include File Hierarchy: -- * -- * -- ******************************************************************************/ -- - #ifndef __INC_SKTYPES_H - #define __INC_SKTYPES_H - -- --/* defines *******************************************************************/ -- --/* -- * Data types with a specific size. 'I' = signed, 'U' = unsigned. -- */ --#define SK_I8 s8 --#define SK_U8 u8 --#define SK_I16 s16 --#define SK_U16 u16 --#define SK_I32 s32 --#define SK_U32 u32 --#define SK_I64 s64 --#define SK_U64 u64 -- --#define SK_UPTR ulong /* casting pointer <-> integral */ -- --/* --* Boolean type. --*/ --#define SK_BOOL SK_U8 --#define SK_FALSE 0 --#define SK_TRUE (!SK_FALSE) -- --/* typedefs *******************************************************************/ -- --/* function prototypes ********************************************************/ -+#define SK_I8 s8 /* 8 bits (1 byte) signed */ -+#define SK_U8 u8 /* 8 bits (1 byte) unsigned */ -+#define SK_I16 s16 /* 16 bits (2 bytes) signed */ -+#define SK_U16 u16 /* 16 bits (2 bytes) unsigned */ -+#define SK_I32 s32 /* 32 bits (4 bytes) signed */ -+#define SK_U32 u32 /* 32 bits (4 bytes) unsigned */ -+#define SK_I64 s64 /* 64 bits (8 bytes) signed */ -+#define SK_U64 u64 /* 64 bits (8 bytes) unsigned */ -+ -+#define SK_UPTR ulong /* casting pointer <-> integral */ -+ -+#define SK_BOOL SK_U8 -+#define SK_FALSE 0 -+#define SK_TRUE (!SK_FALSE) - - #endif /* __INC_SKTYPES_H */ -+ -+/******************************************************************************* -+ * -+ * End of file -+ * -+ ******************************************************************************/ ---- ./drivers/net/sk98lin/h/skversion.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skversion.h 2006-04-04 13:13:34.000000000 +0400 -@@ -1,17 +1,17 @@ - /****************************************************************************** - * -- * Name: version.h -+ * Name: skversion.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.5 $ -- * Date: $Date: 2003/10/07 08:16:51 $ -- * Purpose: SK specific Error log support -+ * Version: $Revision: 1.3.2.1 $ -+ * Date: $Date: 2005/04/11 09:00:53 $ -+ * Purpose: specific version strings and numbers - * - ******************************************************************************/ - - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -22,17 +22,15 @@ - * - ******************************************************************************/ - --#ifdef lint --static const char SysKonnectFileId[] = "@(#) (C) SysKonnect GmbH."; --static const char SysKonnectBuildNumber[] = -- "@(#)SK-BUILD: 6.23 PL: 01"; --#endif /* !defined(lint) */ -- --#define BOOT_STRING "sk98lin: Network Device Driver v6.23\n" \ -- "(C)Copyright 1999-2004 Marvell(R)." -- --#define VER_STRING "6.23" --#define DRIVER_FILE_NAME "sk98lin" --#define DRIVER_REL_DATE "Feb-13-2004" -- -+#define BOOT_STRING "sk98lin: Network Device Driver v8.31.2.3\n" \ -+ "(C)Copyright 1999-2006 Marvell(R)." -+#define VER_STRING "8.31.2.3" -+#define PATCHLEVEL "02" -+#define DRIVER_FILE_NAME "sk98lin" -+#define DRIVER_REL_DATE "Jan-18-2006" - -+/******************************************************************************* -+ * -+ * End of file -+ * -+ ******************************************************************************/ ---- ./drivers/net/sk98lin/h/skvpd.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/skvpd.h 2006-04-04 13:13:34.000000000 +0400 -@@ -1,22 +1,22 @@ - /****************************************************************************** - * - * Name: skvpd.h -- * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.15 $ -- * Date: $Date: 2003/01/13 10:39:38 $ -+ * Project: Gigabit Ethernet Adapters, VPD-Module -+ * Version: $Revision: 2.6 $ -+ * Date: $Date: 2004/11/09 15:18:00 $ - * Purpose: Defines and Macros for VPD handling - * - ******************************************************************************/ - - /****************************************************************************** - * -- * (C)Copyright 1998-2003 SysKonnect GmbH. -+ * (C)Copyright 1998-2002 SysKonnect. -+ * (C)Copyright 2002-2004 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ -@@ -31,7 +31,7 @@ - /* - * Define Resource Type Identifiers and VPD keywords - */ --#define RES_ID 0x82 /* Resource Type ID String (Product Name) */ -+#define RES_ID 0x82 /* Resource Type ID String (Product Name) */ - #define RES_VPD_R 0x90 /* start of VPD read only area */ - #define RES_VPD_W 0x91 /* start of VPD read/write area */ - #define RES_END 0x78 /* Resource Type End Tag */ -@@ -40,14 +40,16 @@ - #define VPD_NAME "Name" /* Product Name, VPD name of RES_ID */ - #endif /* VPD_NAME */ - #define VPD_PN "PN" /* Adapter Part Number */ --#define VPD_EC "EC" /* Adapter Engineering Level */ -+#define VPD_EC "EC" /* Adapter Engineering Level */ - #define VPD_MN "MN" /* Manufacture ID */ - #define VPD_SN "SN" /* Serial Number */ - #define VPD_CP "CP" /* Extended Capability */ - #define VPD_RV "RV" /* Checksum and Reserved */ --#define VPD_YA "YA" /* Asset Tag Identifier */ -+#define VPD_YA "YA" /* Asset Tag Identifier */ - #define VPD_VL "VL" /* First Error Log Message (SK specific) */ - #define VPD_VF "VF" /* Second Error Log Message (SK specific) */ -+#define VPD_VB "VB" /* Boot Agent ROM Configuration (SK specific) */ -+#define VPD_VE "VE" /* EFI UNDI Configuration (SK specific) */ - #define VPD_RW "RW" /* Remaining Read / Write Area */ - - /* 'type' values for vpd_setup_para() */ -@@ -55,7 +57,7 @@ - #define VPD_RW_KEY 2 /* RW keys are "Yx", "Vx", and "RW" */ - - /* 'op' values for vpd_setup_para() */ --#define ADD_KEY 1 /* add the key at the pos "RV" or "RW" */ -+#define ADD_KEY 1 /* add the key at the pos "RV" or "RW" */ - #define OWR_KEY 2 /* overwrite key if already exists */ - - /* -@@ -64,18 +66,18 @@ - - #define VPD_DEV_ID_GENESIS 0x4300 - --#define VPD_SIZE_YUKON 256 --#define VPD_SIZE_GENESIS 512 --#define VPD_SIZE 512 -+#define VPD_SIZE_YUKON 256 -+#define VPD_SIZE_GENESIS 512 -+#define VPD_SIZE 512 - #define VPD_READ 0x0000 - #define VPD_WRITE 0x8000 - - #define VPD_STOP(pAC,IoC) VPD_OUT16(pAC,IoC,PCI_VPD_ADR_REG,VPD_WRITE) - --#define VPD_GET_RES_LEN(p) ((unsigned int) \ -- (* (SK_U8 *)&(p)[1]) |\ -- ((* (SK_U8 *)&(p)[2]) << 8)) --#define VPD_GET_VPD_LEN(p) ((unsigned int)(* (SK_U8 *)&(p)[2])) -+#define VPD_GET_RES_LEN(p) ((unsigned int)\ -+ (*(SK_U8 *)&(p)[1]) |\ -+ ((*(SK_U8 *)&(p)[2]) << 8)) -+#define VPD_GET_VPD_LEN(p) ((unsigned int)(*(SK_U8 *)&(p)[2])) - #define VPD_GET_VAL(p) ((char *)&(p)[3]) - - #define VPD_MAX_LEN 50 -@@ -126,7 +128,7 @@ typedef struct s_vpd_key { - /* - * System specific VPD macros - */ --#ifndef SKDIAG -+#ifndef SK_DIAG - #ifndef VPD_DO_IO - #define VPD_OUT8(pAC,IoC,Addr,Val) (void)SkPciWriteCfgByte(pAC,Addr,Val) - #define VPD_OUT16(pAC,IoC,Addr,Val) (void)SkPciWriteCfgWord(pAC,Addr,Val) -@@ -135,61 +137,61 @@ typedef struct s_vpd_key { - #define VPD_IN16(pAC,IoC,Addr,pVal) (void)SkPciReadCfgWord(pAC,Addr,pVal) - #define VPD_IN32(pAC,IoC,Addr,pVal) (void)SkPciReadCfgDWord(pAC,Addr,pVal) - #else /* VPD_DO_IO */ --#define VPD_OUT8(pAC,IoC,Addr,Val) SK_OUT8(IoC,PCI_C(Addr),Val) --#define VPD_OUT16(pAC,IoC,Addr,Val) SK_OUT16(IoC,PCI_C(Addr),Val) --#define VPD_OUT32(pAC,IoC,Addr,Val) SK_OUT32(IoC,PCI_C(Addr),Val) --#define VPD_IN8(pAC,IoC,Addr,pVal) SK_IN8(IoC,PCI_C(Addr),pVal) --#define VPD_IN16(pAC,IoC,Addr,pVal) SK_IN16(IoC,PCI_C(Addr),pVal) --#define VPD_IN32(pAC,IoC,Addr,pVal) SK_IN32(IoC,PCI_C(Addr),pVal) -+#define VPD_OUT8(pAC,IoC,Addr,Val) SK_OUT8(IoC,PCI_C(pAC,Addr),Val) -+#define VPD_OUT16(pAC,IoC,Addr,Val) SK_OUT16(IoC,PCI_C(pAC,Addr),Val) -+#define VPD_OUT32(pAC,IoC,Addr,Val) SK_OUT32(IoC,PCI_C(pAC,Addr),Val) -+#define VPD_IN8(pAC,IoC,Addr,pVal) SK_IN8(IoC,PCI_C(pAC,Addr),pVal) -+#define VPD_IN16(pAC,IoC,Addr,pVal) SK_IN16(IoC,PCI_C(pAC,Addr),pVal) -+#define VPD_IN32(pAC,IoC,Addr,pVal) SK_IN32(IoC,PCI_C(pAC,Addr),pVal) - #endif /* VPD_DO_IO */ --#else /* SKDIAG */ -+#else /* SK_DIAG */ - #define VPD_OUT8(pAC,Ioc,Addr,Val) { \ - if ((pAC)->DgT.DgUseCfgCycle) \ - SkPciWriteCfgByte(pAC,Addr,Val); \ - else \ -- SK_OUT8(pAC,PCI_C(Addr),Val); \ -+ SK_OUT8(pAC,PCI_C(pAC,Addr),Val); \ - } - #define VPD_OUT16(pAC,Ioc,Addr,Val) { \ - if ((pAC)->DgT.DgUseCfgCycle) \ - SkPciWriteCfgWord(pAC,Addr,Val); \ - else \ -- SK_OUT16(pAC,PCI_C(Addr),Val); \ -+ SK_OUT16(pAC,PCI_C(pAC,Addr),Val); \ - } - #define VPD_OUT32(pAC,Ioc,Addr,Val) { \ - if ((pAC)->DgT.DgUseCfgCycle) \ - SkPciWriteCfgDWord(pAC,Addr,Val); \ - else \ -- SK_OUT32(pAC,PCI_C(Addr),Val); \ -+ SK_OUT32(pAC,PCI_C(pAC,Addr),Val); \ - } - #define VPD_IN8(pAC,Ioc,Addr,pVal) { \ -- if ((pAC)->DgT.DgUseCfgCycle) \ -+ if ((pAC)->DgT.DgUseCfgCycle) \ - SkPciReadCfgByte(pAC,Addr,pVal); \ - else \ -- SK_IN8(pAC,PCI_C(Addr),pVal); \ -+ SK_IN8(pAC,PCI_C(pAC,Addr),pVal); \ - } - #define VPD_IN16(pAC,Ioc,Addr,pVal) { \ -- if ((pAC)->DgT.DgUseCfgCycle) \ -+ if ((pAC)->DgT.DgUseCfgCycle) \ - SkPciReadCfgWord(pAC,Addr,pVal); \ - else \ -- SK_IN16(pAC,PCI_C(Addr),pVal); \ -+ SK_IN16(pAC,PCI_C(pAC,Addr),pVal); \ - } - #define VPD_IN32(pAC,Ioc,Addr,pVal) { \ - if ((pAC)->DgT.DgUseCfgCycle) \ - SkPciReadCfgDWord(pAC,Addr,pVal); \ - else \ -- SK_IN32(pAC,PCI_C(Addr),pVal); \ -+ SK_IN32(pAC,PCI_C(pAC,Addr),pVal); \ - } --#endif /* nSKDIAG */ -+#endif /* SK_DIAG */ - - /* function prototypes ********************************************************/ - - #ifndef SK_KR_PROTO --#ifdef SKDIAG -+#ifdef SK_DIAG - extern SK_U32 VpdReadDWord( - SK_AC *pAC, - SK_IOC IoC, - int addr); --#endif /* SKDIAG */ -+#endif /* SK_DIAG */ - - extern int VpdSetupPara( - SK_AC *pAC, -@@ -240,7 +242,12 @@ extern void VpdErrLog( - SK_IOC IoC, - char *msg); - --#ifdef SKDIAG -+int VpdInit( -+ SK_AC *pAC, -+ SK_IOC IoC); -+ -+#if defined(SK_DIAG) || defined(SK_ASF) -+ - extern int VpdReadBlock( - SK_AC *pAC, - SK_IOC IoC, -@@ -254,7 +261,9 @@ extern int VpdWriteBlock( - char *buf, - int addr, - int len); --#endif /* SKDIAG */ -+ -+#endif /* SK_DIAG || SK_ASF */ -+ - #else /* SK_KR_PROTO */ - extern SK_U32 VpdReadDWord(); - extern int VpdSetupPara(); -@@ -269,3 +278,4 @@ extern void VpdErrLog(); - #endif /* SK_KR_PROTO */ - - #endif /* __INC_SKVPD_H_ */ -+ ---- /dev/null 2006-03-09 09:48:23.770951496 +0300 -+++ ./drivers/net/sk98lin/h/sky2le.h 2006-04-04 13:13:34.000000000 +0400 -@@ -0,0 +1,893 @@ -+/****************************************************************************** -+ * -+ * Name: sky2le.h -+ * Project: Gigabit Ethernet Adapters, Common Modules -+ * Version: $Revision: 1.10 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ -+ * Purpose: Common list element definitions and access macros. -+ * -+ ******************************************************************************/ -+ -+/****************************************************************************** -+ * -+ * LICENSE: -+ * (C)Copyright 2003-2004 Marvell -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE -+ * -+ ******************************************************************************/ -+ -+#ifndef __INC_SKY2LE_H -+#define __INC_SKY2LE_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif /* __cplusplus */ -+ -+/* defines ********************************************************************/ -+ -+#define MIN_LEN_OF_LE_TAB 128 -+#define MAX_LEN_OF_LE_TAB 4096 -+#ifdef USE_POLLING_UNIT -+#define NUM_LE_POLLING_UNIT 2 -+#endif -+#define MAX_FRAG_OVERHEAD 10 -+ -+/* Macro for aligning a given value */ -+#define SK_ALIGN_SIZE(Value, Alignment, AlignedVal) { \ -+ (AlignedVal) = (((Value) + (Alignment) - 1) & (~((Alignment) - 1)));\ -+} -+ -+/****************************************************************************** -+ * -+ * LE2DWord() - Converts the given Little Endian value to machine order value -+ * -+ * Description: -+ * This function converts the Little Endian value received as an argument to -+ * the machine order value. -+ * -+ * Returns: -+ * The converted value -+ * -+ */ -+ -+#ifdef SK_LITTLE_ENDIAN -+ -+#ifndef SK_USE_REV_DESC -+#define LE2DWord(value) (value) -+#else /* SK_USE_REV_DESC */ -+#define LE2DWord(value) \ -+ ((((value)<<24L) & 0xff000000L) + \ -+ (((value)<< 8L) & 0x00ff0000L) + \ -+ (((value)>> 8L) & 0x0000ff00L) + \ -+ (((value)>>24L) & 0x000000ffL)) -+#endif /* SK_USE_REV_DESC */ -+ -+#else /* !SK_LITTLE_ENDIAN */ -+ -+#ifndef SK_USE_REV_DESC -+#define LE2DWord(value) \ -+ ((((value)<<24L) & 0xff000000L) + \ -+ (((value)<< 8L) & 0x00ff0000L) + \ -+ (((value)>> 8L) & 0x0000ff00L) + \ -+ (((value)>>24L) & 0x000000ffL)) -+#else /* SK_USE_REV_DESC */ -+#define LE2DWord(value) (value) -+#endif /* SK_USE_REV_DESC */ -+ -+#endif /* !SK_LITTLE_ENDIAN */ -+ -+/****************************************************************************** -+ * -+ * DWord2LE() - Converts the given value to a Little Endian value -+ * -+ * Description: -+ * This function converts the value received as an argument to a Little Endian -+ * value on Big Endian machines. If the machine running the code is Little -+ * Endian, then no conversion is done. -+ * -+ * Returns: -+ * The converted value -+ * -+ */ -+ -+#ifdef SK_LITTLE_ENDIAN -+ -+#ifndef SK_USE_REV_DESC -+#define DWord2LE(value) (value) -+#else /* SK_USE_REV_DESC */ -+#define DWord2LE(value) \ -+ ((((value)<<24L) & 0xff000000L) + \ -+ (((value)<< 8L) & 0x00ff0000L) + \ -+ (((value)>> 8L) & 0x0000ff00L) + \ -+ (((value)>>24L) & 0x000000ffL)) -+#endif /* SK_USE_REV_DESC */ -+ -+#else /* !SK_LITTLE_ENDIAN */ -+ -+#ifndef SK_USE_REV_DESC -+#define DWord2LE(value) \ -+ ((((value)<<24L) & 0xff000000L) + \ -+ (((value)<< 8L) & 0x00ff0000L) + \ -+ (((value)>> 8L) & 0x0000ff00L) + \ -+ (((value)>>24L) & 0x000000ffL)) -+#else /* SK_USE_REV_DESC */ -+#define DWord2LE(value) (value) -+#endif /* SK_USE_REV_DESC */ -+#endif /* !SK_LITTLE_ENDIAN */ -+ -+/****************************************************************************** -+ * -+ * LE2Word() - Converts the given Little Endian value to machine order value -+ * -+ * Description: -+ * This function converts the Little Endian value received as an argument to -+ * the machine order value. -+ * -+ * Returns: -+ * The converted value -+ * -+ */ -+ -+#ifdef SK_LITTLE_ENDIAN -+#ifndef SK_USE_REV_DESC -+#define LE2Word(value) (value) -+#else /* SK_USE_REV_DESC */ -+#define LE2Word(value) \ -+ ((((value)<< 8L) & 0xff00) + \ -+ (((value)>> 8L) & 0x00ff)) -+#endif /* SK_USE_REV_DESC */ -+ -+#else /* !SK_LITTLE_ENDIAN */ -+#ifndef SK_USE_REV_DESC -+#define LE2Word(value) \ -+ ((((value)<< 8L) & 0xff00) + \ -+ (((value)>> 8L) & 0x00ff)) -+#else /* SK_USE_REV_DESC */ -+#define LE2Word(value) (value) -+#endif /* SK_USE_REV_DESC */ -+#endif /* !SK_LITTLE_ENDIAN */ -+ -+/****************************************************************************** -+ * -+ * Word2LE() - Converts the given value to a Little Endian value -+ * -+ * Description: -+ * This function converts the value received as an argument to a Little Endian -+ * value on Big Endian machines. If the machine running the code is Little -+ * Endian, then no conversion is done. -+ * -+ * Returns: -+ * The converted value -+ * -+ */ -+ -+#ifdef SK_LITTLE_ENDIAN -+#ifndef SK_USE_REV_DESC -+#define Word2LE(value) (value) -+#else /* SK_USE_REV_DESC */ -+#define Word2LE(value) \ -+ ((((value)<< 8L) & 0xff00) + \ -+ (((value)>> 8L) & 0x00ff)) -+#endif /* SK_USE_REV_DESC */ -+ -+#else /* !SK_LITTLE_ENDIAN */ -+#ifndef SK_USE_REV_DESC -+#define Word2LE(value) \ -+ ((((value)<< 8L) & 0xff00) + \ -+ (((value)>> 8L) & 0x00ff)) -+#else /* SK_USE_REV_DESC */ -+#define Word2LE(value) (value) -+#endif /* SK_USE_REV_DESC */ -+#endif /* !SK_LITTLE_ENDIAN */ -+ -+/****************************************************************************** -+ * -+ * Transmit list element macros -+ * -+ */ -+ -+#define TXLE_SET_ADDR(pLE, Addr) \ -+ ((pLE)->Tx.TxUn.BufAddr = DWord2LE(Addr)) -+#define TXLE_SET_LSLEN(pLE, Len) \ -+ ((pLE)->Tx.TxUn.LargeSend.Length = Word2LE(Len)) -+#define TXLE_SET_STACS(pLE, Start) \ -+ ((pLE)->Tx.TxUn.ChkSum.TxTcpSp = Word2LE(Start)) -+#define TXLE_SET_WRICS(pLE, Write) \ -+ ((pLE)->Tx.TxUn.ChkSum.TxTcpWp = Word2LE(Write)) -+#define TXLE_SET_INICS(pLE, Ini) ((pLE)->Tx.Send.InitCsum = Word2LE(Ini)) -+#define TXLE_SET_LEN(pLE, Len) ((pLE)->Tx.Send.BufLen = Word2LE(Len)) -+#define TXLE_SET_VLAN(pLE, Vlan) ((pLE)->Tx.Send.VlanTag = Word2LE(Vlan)) -+#define TXLE_SET_LCKCS(pLE, Lock) ((pLE)->Tx.ControlFlags = (Lock)) -+#define TXLE_SET_CTRL(pLE, Ctrl) ((pLE)->Tx.ControlFlags = (Ctrl)) -+#define TXLE_SET_OPC(pLE, Opc) ((pLE)->Tx.Opcode = (Opc)) -+ -+#define TXLE_GET_ADDR(pLE) LE2DWord((pLE)->Tx.TxUn.BufAddr) -+#define TXLE_GET_LSLEN(pLE) LE2Word((pLE)->Tx.TxUn.LargeSend.Length) -+#define TXLE_GET_STACS(pLE) LE2Word((pLE)->Tx.TxUn.ChkSum.TxTcpSp) -+#define TXLE_GET_WRICS(pLE) LE2Word((pLE)->Tx.TxUn.ChkSum.TxTcpWp) -+#define TXLE_GET_INICS(pLE) LE2Word((pLE)->Tx.Send.InitCsum) -+#define TXLE_GET_LEN(pLE) LE2Word((pLE)->Tx.Send.BufLen) -+#define TXLE_GET_VLAN(pLE) LE2Word((pLE)->Tx.Send.VlanTag) -+#define TXLE_GET_LCKCS(pLE) ((pLE)->Tx.ControlFlags) -+#define TXLE_GET_CTRL(pLE) ((pLE)->Tx.ControlFlags) -+#define TXLE_GET_OPC(pLE) ((pLE)->Tx.Opcode) -+ -+/****************************************************************************** -+ * -+ * Receive list element macros -+ * -+ */ -+ -+#define RXLE_SET_ADDR(pLE, Addr) \ -+ ((pLE)->Rx.RxUn.BufAddr = (SK_U32) DWord2LE(Addr)) -+#define RXLE_SET_STACS2(pLE, Offs) \ -+ ((pLE)->Rx.RxUn.ChkSum.RxTcpSp2 = Word2LE(Offs)) -+#define RXLE_SET_STACS1(pLE, Offs) \ -+ ((pLE)->Rx.RxUn.ChkSum.RxTcpSp1 = Word2LE(Offs)) -+#define RXLE_SET_LEN(pLE, Len) ((pLE)->Rx.BufferLength = Word2LE(Len)) -+#define RXLE_SET_CTRL(pLE, Ctrl) ((pLE)->Rx.ControlFlags = (Ctrl)) -+#define RXLE_SET_OPC(pLE, Opc) ((pLE)->Rx.Opcode = (Opc)) -+ -+#define RXLE_GET_ADDR(pLE) LE2DWord((pLE)->Rx.RxUn.BufAddr) -+#define RXLE_GET_STACS2(pLE) LE2Word((pLE)->Rx.RxUn.ChkSum.RxTcpSp2) -+#define RXLE_GET_STACS1(pLE) LE2Word((pLE)->Rx.RxUn.ChkSum.RxTcpSp1) -+#define RXLE_GET_LEN(pLE) LE2Word((pLE)->Rx.BufferLength) -+#define RXLE_GET_CTRL(pLE) ((pLE)->Rx.ControlFlags) -+#define RXLE_GET_OPC(pLE) ((pLE)->Rx.Opcode) -+ -+/****************************************************************************** -+ * -+ * Status list element macros -+ * -+ */ -+ -+#define STLE_SET_OPC(pLE, Opc) ((pLE)->St.Opcode = (Opc)) -+ -+#define STLE_GET_FRSTATUS(pLE) LE2DWord((pLE)->St.StUn.StRxStatWord) -+#define STLE_GET_TIST(pLE) LE2DWord((pLE)->St.StUn.StRxTimeStamp) -+#define STLE_GET_TCP1(pLE) LE2Word((pLE)->St.StUn.StRxTCPCSum.RxTCPSum1) -+#define STLE_GET_TCP2(pLE) LE2Word((pLE)->St.StUn.StRxTCPCSum.RxTCPSum2) -+#define STLE_GET_LEN(pLE) LE2Word((pLE)->St.Stat.BufLen) -+#define STLE_GET_VLAN(pLE) LE2Word((pLE)->St.Stat.VlanTag) -+#define STLE_GET_LINK(pLE) ((pLE)->St.Link) -+#define STLE_GET_OPC(pLE) ((pLE)->St.Opcode) -+#define STLE_GET_DONE_IDX(pLE,LowVal,HighVal) { \ -+ (LowVal) = LE2DWord((pLE)->St.StUn.StTxStatLow); \ -+ (HighVal) = LE2Word((pLE)->St.Stat.StTxStatHi); \ -+} -+ -+#define STLE_GET_RSS(pLE) LE2DWord((pLE)->St.StUn.StRxRssValue) -+#define STLE_GET_IPBIT(pLE) ((pLE)->St.Stat.Rss.FlagField & RSS_IP_FLAG) -+#define STLE_GET_TCPBIT(pLE) ((pLE)->St.Stat.Rss.FlagField & RSS_TCP_FLAG) -+ -+ -+/* I always take both values as a paramter to avoid typos */ -+#define STLE_GET_DONE_IDX_TXA1(LowVal,HighVal) \ -+ (((LowVal) & STLE_TXA1_MSKL) >> STLE_TXA1_SHIFTL) -+#define STLE_GET_DONE_IDX_TXS1(LowVal,HighVal) \ -+ ((LowVal & STLE_TXS1_MSKL) >> STLE_TXS1_SHIFTL) -+#define STLE_GET_DONE_IDX_TXA2(LowVal,HighVal) \ -+ (((LowVal & STLE_TXA2_MSKL) >> STLE_TXA2_SHIFTL) + \ -+ ((HighVal & STLE_TXA2_MSKH) << STLE_TXA2_SHIFTH)) -+#define STLE_GET_DONE_IDX_TXS2(LowVal,HighVal) \ -+ ((HighVal & STLE_TXS2_MSKH) >> STLE_TXS2_SHIFTH) -+ -+ -+#define SK_Y2_RXSTAT_CHECK_PKT(Len, RxStat, IsOk) { \ -+ (IsOk) = (((RxStat) & GMR_FS_RX_OK) != 0) && \ -+ (((RxStat) & GMR_FS_ANY_ERR) == 0); \ -+ \ -+ if ((IsOk) && ((SK_U16)(((RxStat) & GMR_FS_LEN_MSK) >> \ -+ GMR_FS_LEN_SHIFT) != (Len))) { \ -+ /* length in MAC status differs from length in LE */\ -+ (IsOk) = SK_FALSE; \ -+ } \ -+} -+ -+ -+/****************************************************************************** -+ * -+ * Polling unit list element macros -+ * -+ * NOTE: the Idx must be <= 0xfff and PU_PUTIDX_VALID makes them valid -+ * -+ */ -+ -+#ifdef USE_POLLING_UNIT -+ -+#define POLE_SET_OPC(pLE, Opc) ((pLE)->Sa.Opcode = (Opc)) -+#define POLE_SET_LINK(pLE, Port) ((pLE)->Sa.Link = (Port)) -+#define POLE_SET_RXIDX(pLE, Idx) ((pLE)->Sa.RxIdxVld = Word2LE(Idx)) -+#define POLE_SET_TXAIDX(pLE, Idx) ((pLE)->Sa.TxAIdxVld = Word2LE(Idx)) -+#define POLE_SET_TXSIDX(pLE, Idx) ((pLE)->Sa.TxSIdxVld = Word2LE(Idx)) -+ -+#define POLE_GET_OPC(pLE) ((pLE)->Sa.Opcode) -+#define POLE_GET_LINK(pLE) ((pLE)->Sa.Link) -+#define POLE_GET_RXIDX(pLE) LE2Word((pLE)->Sa.RxIdxVld) -+#define POLE_GET_TXAIDX(pLE) LE2Word((pLE)->Sa.TxAIdxVld) -+#define POLE_GET_TXSIDX(pLE) LE2Word((pLE)->Sa.TxSIdxVld) -+ -+#endif /* USE_POLLING_UNIT */ -+ -+/****************************************************************************** -+ * -+ * Debug macros for list elements -+ * -+ */ -+ -+#ifdef DEBUG -+ -+#define SK_DBG_DUMP_RX_LE(pLE) { \ -+ SK_U8 Opcode; \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=== RX_LIST_ELEMENT @addr: %p cont: %02x %02x %02x %02x %02x %02x %02x %02x\n", \ -+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\ -+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \ -+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (16bit) %04x %04x %04x %04x\n", \ -+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \ -+ ((SK_U16 *) pLE)[3])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (32bit) %08x %08x\n", \ -+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \ -+ Opcode = RXLE_GET_OPC(pLE); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == HW_OWNER) ? \ -+ "Hardware" : "Software")); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOpc: 0x%x ",Opcode)); \ -+ switch (Opcode & (~HW_OWNER)) { \ -+ case OP_BUFFER: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_BUFFER\n")); \ -+ break; \ -+ case OP_PACKET: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_PACKET\n")); \ -+ break; \ -+ case OP_ADDR64: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_ADDR64\n")); \ -+ break; \ -+ case OP_TCPSTART: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TCPPAR\n")); \ -+ break; \ -+ case SW_OWNER: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tunused LE\n")); \ -+ break; \ -+ default: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tunknown Opcode!!!\n")); \ -+ break; \ -+ } \ -+ if ((Opcode & OP_BUFFER) == OP_BUFFER) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tControl: 0x%x\n", RXLE_GET_CTRL(pLE))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tBufLen: 0x%x\n", RXLE_GET_LEN(pLE))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tLowAddr: 0x%x\n", RXLE_GET_ADDR(pLE))); \ -+ } \ -+ if ((Opcode & OP_ADDR64) == OP_ADDR64) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tHighAddr: 0x%x\n", RXLE_GET_ADDR(pLE))); \ -+ } \ -+ if ((Opcode & OP_TCPSTART) == OP_TCPSTART) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTCP Sum Start 1 : 0x%x\n", RXLE_GET_STACS1(pLE))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTCP Sum Start 2 : 0x%x\n", RXLE_GET_STACS2(pLE))); \ -+ } \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=====================\n")); \ -+} -+ -+#define SK_DBG_DUMP_TX_LE(pLE) { \ -+ SK_U8 Opcode; \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=== TX_LIST_ELEMENT @addr: %p cont: %02x %02x %02x %02x %02x %02x %02x %02x\n", \ -+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\ -+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \ -+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (16bit) %04x %04x %04x %04x\n", \ -+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \ -+ ((SK_U16 *) pLE)[3])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (32bit) %08x %08x\n", \ -+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \ -+ Opcode = TXLE_GET_OPC(pLE); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == HW_OWNER) ? \ -+ "Hardware" : "Software")); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOpc: 0x%x ",Opcode)); \ -+ switch (Opcode & (~HW_OWNER)) { \ -+ case OP_TCPCHKSUM: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TCPCHKSUM\n")); \ -+ break; \ -+ case OP_TCPIS: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TCPIS\n")); \ -+ break; \ -+ case OP_TCPLCK: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TCPLCK\n")); \ -+ break; \ -+ case OP_TCPLW: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TCPLW\n")); \ -+ break; \ -+ case OP_TCPLSW: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TCPLSW\n")); \ -+ break; \ -+ case OP_TCPLISW: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TCPLISW\n")); \ -+ break; \ -+ case OP_ADDR64: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_ADDR64\n")); \ -+ break; \ -+ case OP_VLAN: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_VLAN\n")); \ -+ break; \ -+ case OP_ADDR64VLAN: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_ADDR64VLAN\n")); \ -+ break; \ -+ case OP_LRGLEN: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_LRGLEN\n")); \ -+ break; \ -+ case OP_LRGLENVLAN: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_LRGLENVLAN\n")); \ -+ break; \ -+ case OP_BUFFER: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_BUFFER\n")); \ -+ break; \ -+ case OP_PACKET: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_PACKET\n")); \ -+ break; \ -+ case OP_LARGESEND: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_LARGESEND\n")); \ -+ break; \ -+ case SW_OWNER: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tunused LE\n")); \ -+ break; \ -+ default: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tunknown Opcode!!!\n")); \ -+ break; \ -+ } \ -+ if ((Opcode & OP_BUFFER) == OP_BUFFER) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tControl: 0x%x\n", TXLE_GET_CTRL(pLE))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tBufLen: 0x%x\n", TXLE_GET_LEN(pLE))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tLowAddr: 0x%x\n", TXLE_GET_ADDR(pLE))); \ -+ } \ -+ if ((Opcode & OP_ADDR64) == OP_ADDR64) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tHighAddr: 0x%x\n", TXLE_GET_ADDR(pLE))); \ -+ } \ -+ if ((Opcode & OP_VLAN) == OP_VLAN) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tVLAN Id: 0x%x\n", TXLE_GET_VLAN(pLE))); \ -+ } \ -+ if ((Opcode & OP_LRGLEN) == OP_LRGLEN) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tLarge send length: 0x%x\n", TXLE_GET_LSLEN(pLE))); \ -+ } \ -+ if ((Opcode &(~HW_OWNER)) <= OP_ADDR64) { \ -+ if ((Opcode & OP_TCPWRITE) == OP_TCPWRITE) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTCP Sum Write: 0x%x\n", TXLE_GET_WRICS(pLE))); \ -+ } \ -+ if ((Opcode & OP_TCPSTART) == OP_TCPSTART) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTCP Sum Start: 0x%x\n", TXLE_GET_STACS(pLE))); \ -+ } \ -+ if ((Opcode & OP_TCPINIT) == OP_TCPINIT) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTCP Sum Init: 0x%x\n", TXLE_GET_INICS(pLE))); \ -+ } \ -+ if ((Opcode & OP_TCPLCK) == OP_TCPLCK) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTCP Sum Lock: 0x%x\n", TXLE_GET_LCKCS(pLE))); \ -+ } \ -+ } \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=====================\n")); \ -+} -+ -+#define SK_DBG_DUMP_ST_LE(pLE) { \ -+ SK_U8 Opcode; \ -+ SK_U16 HighVal; \ -+ SK_U32 LowVal; \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=== ST_LIST_ELEMENT @addr: %p contains: %02x %02x %02x %02x %02x %02x %02x %02x\n",\ -+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\ -+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \ -+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (16bit) %04x %04x %04x %04x\n", \ -+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \ -+ ((SK_U16 *) pLE)[3])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (32bit) %08x %08x\n", \ -+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \ -+ Opcode = STLE_GET_OPC(pLE); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == SW_OWNER) ? \ -+ "Hardware" : "Software")); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOpc: 0x%x", Opcode)); \ -+ Opcode &= (~HW_OWNER); \ -+ switch (Opcode) { \ -+ case OP_RXSTAT: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_RXSTAT\n")); \ -+ break; \ -+ case OP_RXTIMESTAMP: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_RXTIMESTAMP\n")); \ -+ break; \ -+ case OP_RXVLAN: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_RXVLAN\n")); \ -+ break; \ -+ case OP_RXCHKS: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_RXCHKS\n")); \ -+ break; \ -+ case OP_RXCHKSVLAN: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_RXCHKSVLAN\n")); \ -+ break; \ -+ case OP_RXTIMEVLAN: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_RXTIMEVLAN\n")); \ -+ break; \ -+ case OP_RSS_HASH: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_RSS_HASH\n")); \ -+ break; \ -+ case OP_TXINDEXLE: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_TXINDEXLE\n")); \ -+ break; \ -+ case HW_OWNER: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tunused LE\n")); \ -+ break; \ -+ default: \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tunknown status list element!!!\n")); \ -+ break; \ -+ } \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tPort: %c\n", 'A' + STLE_GET_LINK(pLE))); \ -+ if (Opcode == OP_RXSTAT) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tFrameLen: 0x%x\n", STLE_GET_LEN(pLE))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tFrameStat: 0x%x\n", STLE_GET_FRSTATUS(pLE))); \ -+ } \ -+ if ((Opcode & OP_RXVLAN) == OP_RXVLAN) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tVLAN Id: 0x%x\n", STLE_GET_VLAN(pLE))); \ -+ } \ -+ if ((Opcode & OP_RXTIMESTAMP) == OP_RXTIMESTAMP) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTimestamp: 0x%x\n", STLE_GET_TIST(pLE))); \ -+ } \ -+ if ((Opcode & OP_RXCHKS) == OP_RXCHKS) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTCP: 0x%x 0x%x\n", STLE_GET_TCP1(pLE), \ -+ STLE_GET_TCP2(pLE))); \ -+ } \ -+ if (Opcode == OP_TXINDEXLE) { \ -+ STLE_GET_DONE_IDX(pLE, LowVal, HighVal); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTx Index TxA1: 0x%x\n", \ -+ STLE_GET_DONE_IDX_TXA1(LowVal,HighVal))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTx Index TxS1: 0x%x\n", \ -+ STLE_GET_DONE_IDX_TXS1(LowVal,HighVal))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTx Index TxA2: 0x%x\n", \ -+ STLE_GET_DONE_IDX_TXA2(LowVal,HighVal))); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTx Index TxS2: 0x%x\n", \ -+ STLE_GET_DONE_IDX_TXS2(LowVal,HighVal))); \ -+ } \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=====================\n")); \ -+} -+ -+#ifdef USE_POLLING_UNIT -+#define SK_DBG_DUMP_PO_LE(pLE) { \ -+ SK_U8 Opcode; \ -+ SK_U16 Idx; \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=== PO_LIST_ELEMENT @addr: %p cont: %02x %02x %02x %02x %02x %02x %02x %02x\n", \ -+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\ -+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \ -+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (16bit) %04x %04x %04x %04x\n", \ -+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \ -+ ((SK_U16 *) pLE)[3])); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\t (32bit) %08x %08x\n", \ -+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \ -+ Opcode = POLE_GET_OPC(pLE); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == HW_OWNER) ? \ -+ "Hardware" : "Software")); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOpc: 0x%x ",Opcode)); \ -+ if ((Opcode & ~HW_OWNER) == OP_PUTIDX) { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tOP_PUTIDX\n")); \ -+ } \ -+ else { \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tunknown Opcode!!!\n")); \ -+ } \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tPort %c\n", 'A' + POLE_GET_LINK(pLE))); \ -+ Idx = POLE_GET_TXAIDX(pLE); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTxA Index is 0x%X and %svalid\n", Idx, \ -+ (Idx & PU_PUTIDX_VALID) ? "" : "not ")); \ -+ Idx = POLE_GET_TXSIDX(pLE); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tTxS Index is 0x%X and %svalid\n", Idx, \ -+ (Idx & PU_PUTIDX_VALID) ? "" : "not ")); \ -+ Idx = POLE_GET_RXIDX(pLE); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("\tRx Index is 0x%X and %svalid\n", Idx, \ -+ (Idx & PU_PUTIDX_VALID) ? "" : "not ")); \ -+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \ -+ ("=====================\n")); \ -+} -+#endif /* USE_POLLING_UNIT */ -+ -+#else /* !DEBUG */ -+ -+#define SK_DBG_DUMP_RX_LE(pLE) -+#define SK_DBG_DUMP_TX_LE(pLE) -+#define SK_DBG_DUMP_ST_LE(pLE) -+#define SK_DBG_DUMP_PO_LE(pLE) -+ -+#endif /* !DEBUG */ -+ -+/****************************************************************************** -+ * -+ * Macros for listelement tables -+ * -+ * -+ */ -+ -+#define LE_SIZE sizeof(SK_HWLE) -+#define LE_TAB_SIZE(NumElements) ((NumElements) * LE_SIZE) -+ -+/* Number of unused list elements in table -+ * this macro always returns the number of free listelements - 1 -+ * this way we want to guarantee that always one LE remains unused -+ */ -+#define NUM_FREE_LE_IN_TABLE(pTable) \ -+ ( ((pTable)->Put >= (pTable)->Done) ? \ -+ (NUM_LE_IN_TABLE(pTable) - (pTable)->Put + (pTable)->Done - 1) :\ -+ ((pTable)->Done - (pTable)->Put - 1) ) -+ -+/* total number of list elements in table */ -+#define NUM_LE_IN_TABLE(pTable) ((pTable)->Num) -+ -+/* get next unused Rx list element */ -+#define GET_RX_LE(pLE, pTable) { \ -+ pLE = &(pTable)->pLETab[(pTable)->Put]; \ -+ (pTable)->Put = ((pTable)->Put + 1) & (NUM_LE_IN_TABLE(pTable) - 1);\ -+} -+ -+/* get next unused Tx list element */ -+#define GET_TX_LE(pLE, pTable) GET_RX_LE(pLE, pTable) -+ -+/* get next status list element expected to be finished by hw */ -+#define GET_ST_LE(pLE, pTable) { \ -+ pLE = &(pTable)->pLETab[(pTable)->Done]; \ -+ (pTable)->Done = ((pTable)->Done +1) & (NUM_LE_IN_TABLE(pTable) - 1);\ -+} -+ -+#ifdef USE_POLLING_UNIT -+/* get next polling unit list element for port */ -+#define GET_PO_LE(pLE, pTable, Port) { \ -+ pLE = &(pTable)->pLETab[(Port)]; \ -+} -+#endif /* USE_POLLING_UNIT */ -+ -+#define GET_PUT_IDX(pTable) ((pTable)->Put) -+ -+#define UPDATE_HWPUT_IDX(pTable) {(pTable)->HwPut = (pTable)->Put; } -+ -+/* -+ * get own bit of next status LE -+ * if the result is != 0 there has been at least one status LE finished -+ */ -+#define OWN_OF_FIRST_LE(pTable) \ -+ (STLE_GET_OPC(&(pTable)->pLETab[(pTable)->Done]) & HW_OWNER) -+ -+#define SET_DONE_INDEX(pTable, Idx) (pTable)->Done = (Idx); -+ -+#define GET_DONE_INDEX(pTable) ((pTable)->Done) -+ -+#ifdef SAFE_BUT_SLOW -+ -+/* check own bit of LE before current done idx */ -+#define CHECK_STLE_OVERFLOW(pTable, IsOk) { \ -+ unsigned i; \ -+ if ((i = (pTable)->Done) == 0) { \ -+ i = NUM_LE_IN_TABLE(pTable); \ -+ } \ -+ else { \ -+ i = i - 1; \ -+ } \ -+ if (STLE_GET_OPC(&(pTable)->pLETab[i]) == HW_OWNER) { \ -+ (IsOk) = SK_TRUE; \ -+ } \ -+ else { \ -+ (IsOk) = SK_FALSE; \ -+ } \ -+ } -+ -+ -+/* -+ * for Yukon-2 the hardware is not polling the list elements, so it -+ * is not necessary to change the own-bit of Rx or Tx LEs before -+ * reusing them -+ * but it might make debugging easier if one simply can see whether -+ * a LE has been worked on -+ */ -+ -+#define CLEAR_LE_OWN(pTable, Idx) \ -+ STLE_SET_OPC(&(pTable)->pLETab[(Idx)], SW_OWNER) -+ -+/* -+ * clear all own bits starting from old done index up to the LE before -+ * the new done index -+ */ -+#define CLEAR_LE_OWN_FROM_DONE_TO(pTable, To) { \ -+ int i; \ -+ i = (pTable)->Done; \ -+ while (i != To) { \ -+ CLEAR_LE_OWN(pTable, i); \ -+ i = (i + 1) & (NUM_LE_IN_TABLE(pTable) - 1); \ -+ } \ -+ } -+ -+#else /* !SAFE_BUT_SLOW */ -+ -+#define CHECK_STLE_OVERFLOW(pTable, IsOk) -+#define CLEAR_LE_OWN(pTable, Idx) -+#define CLEAR_LE_OWN_FROM_DONE_TO(pTable, To) -+ -+#endif /* !SAFE_BUT_SLOW */ -+ -+ -+/* typedefs *******************************************************************/ -+ -+typedef struct s_LetRxTx { -+ SK_U16 VlanId; /* VLAN Id given down last time */ -+ SK_U16 TcpWp; /* TCP Checksum Write Position */ -+ SK_U16 TcpSp1; /* TCP Checksum Calculation Start Position 1 */ -+ SK_U16 TcpSp2; /* TCP Checksum Calculation Start Position 2 */ -+ SK_U16 MssValue; /* Maximum Segment Size */ -+ SK_U16 Reserved1; /* reserved word for furture extensions */ -+ SK_U16 Reserved2; /* reserved word for furture extensions */ -+ SK_U16 Reserved3; /* reserved word for furture extensions */ -+} SK_LET_RX_TX; -+ -+typedef struct s_LetStat { -+ SK_U32 RxTimeStamp; /* Receive Timestamp */ -+ SK_U32 RssHashValue; /* RSS Hash Value */ -+ SK_BOOL RssIsIp; /* RSS Hash Value: IP packet detected */ -+ SK_BOOL RssIsTcp; /* RSS Hash Value: IP+TCP packet detected */ -+ SK_U16 VlanId; /* VLAN Id given received by Status BMU */ -+ SK_U16 TcpSum1; /* TCP checksum 1 (status BMU) */ -+ SK_U16 TcpSum2; /* TCP checksum 2 (status BMU) */ -+} SK_LET_STAT; -+ -+typedef union s_LetBmuSpec { -+ SK_LET_RX_TX RxTx; /* Rx/Tx BMU specific variables */ -+ SK_LET_STAT Stat; /* Status BMU specific variables */ -+} SK_LET_BMU_S; -+ -+typedef struct s_le_table { -+ /* all LE's between Done and HWPut are owned by the hardware */ -+ /* all LE's between Put and Done can be used from Software */ -+ /* all LE's between HWPut and Put are currently processed in DriverSend */ -+ unsigned Done; /* done index - consumed from HW and available */ -+ unsigned Put; /* put index - to be given to hardware */ -+ unsigned HwPut; /* put index actually given to hardware */ -+ unsigned Num; /* total number of list elements */ -+ SK_HWLE *pLETab; /* virtual address of list element table */ -+ SK_U32 pPhyLETABLow; /* physical address of list element table */ -+ SK_U32 pPhyLETABHigh; /* physical address of list element table */ -+ /* values to remember in order to save some LEs */ -+ SK_U32 BufHighAddr; /* high addr given down last time */ -+ SK_LET_BMU_S Bmu; /* contains BMU specific information */ -+ SK_U32 private; /* driver private variable free usable */ -+ SK_U16 TcpInitCsum; /* Init. Checksum */ -+} SK_LE_TABLE; -+ -+/* function prototypes ********************************************************/ -+ -+#ifndef SK_KR_PROTO -+ -+/* -+ * public functions in sky2le.c -+ */ -+extern void SkGeY2SetPutIndex( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ SK_U32 StartAddrPrefetchUnit, -+ SK_LE_TABLE *pLETab); -+ -+extern void SkGeY2InitPrefetchUnit( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ unsigned int Queue, -+ SK_LE_TABLE *pLETab); -+ -+extern void SkGeY2InitStatBmu( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ SK_LE_TABLE *pLETab); -+ -+extern void SkGeY2InitPollUnit( -+ SK_AC *pAC, -+ SK_IOC IoC, -+ SK_LE_TABLE *pLETab); -+ -+extern void SkGeY2InitSingleLETable( -+ SK_AC *pAC, -+ SK_LE_TABLE *pLETab, -+ unsigned int NumLE, -+ void *pVMem, -+ SK_U32 PMemLowAddr, -+ SK_U32 PMemHighAddr); -+ -+#else /* SK_KR_PROTO */ -+extern void SkGeY2SetPutIndex(); -+extern void SkGeY2InitPrefetchUnit(); -+extern void SkGeY2InitStatBmu(); -+extern void SkGeY2InitPollUnit(); -+extern void SkGeY2InitSingleLETable(); -+#endif /* SK_KR_PROTO */ -+ -+#ifdef __cplusplus -+} -+#endif /* __cplusplus */ -+ -+#endif /* __INC_SKY2LE_H */ -+ ---- ./drivers/net/sk98lin/h/xmac_ii.h.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/h/xmac_ii.h 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: xmac_ii.h - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.52 $ -- * Date: $Date: 2003/10/02 16:35:50 $ -+ * Version: $Revision: 2.14 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: Defines and Macros for Gigabit Ethernet Controller - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -371,18 +372,18 @@ extern "C" { - /* Bit 16..6: reserved */ - #define XM_SC_SNP_RXC (1<<5) /* Bit 5: (sc) Snap Rx Counters */ - #define XM_SC_SNP_TXC (1<<4) /* Bit 4: (sc) Snap Tx Counters */ --#define XM_SC_CP_RXC (1<<3) /* Bit 3: Copy Rx Counters Continuously */ -+#define XM_SC_CP_RXC (1<<3) /* Bit 3: Copy Rx Counters Continuously */ - #define XM_SC_CP_TXC (1<<2) /* Bit 2: Copy Tx Counters Continuously */ - #define XM_SC_CLR_RXC (1<<1) /* Bit 1: (sc) Clear Rx Counters */ --#define XM_SC_CLR_TXC (1<<0) /* Bit 0: (sc) Clear Tx Counters */ -+#define XM_SC_CLR_TXC (1<<0) /* Bit 0: (sc) Clear Tx Counters */ - - - /* XM_RX_CNT_EV 32 bit r/o Rx Counter Event Register */ - /* XM_RX_EV_MSK 32 bit r/w Rx Counter Event Mask */ --#define XMR_MAX_SZ_OV (1UL<<31) /* Bit 31: 1024-MaxSize Rx Cnt Ov*/ --#define XMR_1023B_OV (1L<<30) /* Bit 30: 512-1023Byte Rx Cnt Ov*/ --#define XMR_511B_OV (1L<<29) /* Bit 29: 256-511 Byte Rx Cnt Ov*/ --#define XMR_255B_OV (1L<<28) /* Bit 28: 128-255 Byte Rx Cnt Ov*/ -+#define XMR_MAX_SZ_OV (1UL<<31) /* Bit 31: 1024-MaxSize Rx Cnt Ov */ -+#define XMR_1023B_OV (1L<<30) /* Bit 30: 512-1023Byte Rx Cnt Ov */ -+#define XMR_511B_OV (1L<<29) /* Bit 29: 256-511 Byte Rx Cnt Ov */ -+#define XMR_255B_OV (1L<<28) /* Bit 28: 128-255 Byte Rx Cnt Ov */ - #define XMR_127B_OV (1L<<27) /* Bit 27: 65-127 Byte Rx Cnt Ov */ - #define XMR_64B_OV (1L<<26) /* Bit 26: 64 Byte Rx Cnt Ov */ - #define XMR_UTIL_OV (1L<<25) /* Bit 25: Rx Util Cnt Overflow */ -@@ -390,9 +391,9 @@ extern "C" { - #define XMR_CEX_ERR_OV (1L<<23) /* Bit 23: CEXT Err Cnt Ov */ - /* Bit 22: reserved */ - #define XMR_FCS_ERR_OV (1L<<21) /* Bit 21: Rx FCS Error Cnt Ov */ --#define XMR_LNG_ERR_OV (1L<<20) /* Bit 20: Rx too Long Err Cnt Ov*/ -+#define XMR_LNG_ERR_OV (1L<<20) /* Bit 20: Rx too Long Err Cnt Ov */ - #define XMR_RUNT_OV (1L<<19) /* Bit 19: Runt Event Cnt Ov */ --#define XMR_SHT_ERR_OV (1L<<18) /* Bit 18: Rx Short Ev Err Cnt Ov*/ -+#define XMR_SHT_ERR_OV (1L<<18) /* Bit 18: Rx Short Ev Err Cnt Ov */ - #define XMR_SYM_ERR_OV (1L<<17) /* Bit 17: Rx Sym Err Cnt Ov */ - /* Bit 16: reserved */ - #define XMR_CAR_ERR_OV (1L<<15) /* Bit 15: Rx Carr Ev Err Cnt Ov */ -@@ -401,57 +402,57 @@ extern "C" { - #define XMR_FRA_ERR_OV (1L<<12) /* Bit 12: Rx Framing Err Cnt Ov */ - #define XMR_FMISS_OV (1L<<11) /* Bit 11: Rx Missed Ev Cnt Ov */ - #define XMR_BURST (1L<<10) /* Bit 10: Rx Burst Event Cnt Ov */ --#define XMR_INV_MOC (1L<<9) /* Bit 9: Rx with inv. MAC OC Ov*/ -+#define XMR_INV_MOC (1L<<9) /* Bit 9: Rx with inv. MAC OC Ov */ - #define XMR_INV_MP (1L<<8) /* Bit 8: Rx inv Pause Frame Ov */ - #define XMR_MCTRL_OV (1L<<7) /* Bit 7: Rx MAC Ctrl-F Cnt Ov */ --#define XMR_MPAUSE_OV (1L<<6) /* Bit 6: Rx Pause MAC Ctrl-F Ov*/ --#define XMR_UC_OK_OV (1L<<5) /* Bit 5: Rx Unicast Frame CntOv*/ -+#define XMR_MPAUSE_OV (1L<<6) /* Bit 6: Rx Pause MAC Ctrl-F Ov */ -+#define XMR_UC_OK_OV (1L<<5) /* Bit 5: Rx Unicast Frame Cnt Ov */ - #define XMR_MC_OK_OV (1L<<4) /* Bit 4: Rx Multicast Cnt Ov */ - #define XMR_BC_OK_OV (1L<<3) /* Bit 3: Rx Broadcast Cnt Ov */ --#define XMR_OK_LO_OV (1L<<2) /* Bit 2: Octets Rx OK Low CntOv*/ --#define XMR_OK_HI_OV (1L<<1) /* Bit 1: Octets Rx OK Hi Cnt Ov*/ --#define XMR_OK_OV (1L<<0) /* Bit 0: Frames Received Ok Ov */ -+#define XMR_OK_LO_OV (1L<<2) /* Bit 2: Octets Rx OK Low Cnt Ov */ -+#define XMR_OK_HI_OV (1L<<1) /* Bit 1: Octets Rx OK High Cnt Ov */ -+#define XMR_OK_OV (1L<<0) /* Bit 0: Frames Received OK Ov */ - - #define XMR_DEF_MSK (XMR_OK_LO_OV | XMR_OK_HI_OV) - - /* XM_TX_CNT_EV 32 bit r/o Tx Counter Event Register */ - /* XM_TX_EV_MSK 32 bit r/w Tx Counter Event Mask */ - /* Bit 31..26: reserved */ --#define XMT_MAX_SZ_OV (1L<<25) /* Bit 25: 1024-MaxSize Tx Cnt Ov*/ --#define XMT_1023B_OV (1L<<24) /* Bit 24: 512-1023Byte Tx Cnt Ov*/ --#define XMT_511B_OV (1L<<23) /* Bit 23: 256-511 Byte Tx Cnt Ov*/ --#define XMT_255B_OV (1L<<22) /* Bit 22: 128-255 Byte Tx Cnt Ov*/ -+#define XMT_MAX_SZ_OV (1L<<25) /* Bit 25: 1024-MaxSize Tx Cnt Ov */ -+#define XMT_1023B_OV (1L<<24) /* Bit 24: 512-1023Byte Tx Cnt Ov */ -+#define XMT_511B_OV (1L<<23) /* Bit 23: 256-511 Byte Tx Cnt Ov */ -+#define XMT_255B_OV (1L<<22) /* Bit 22: 128-255 Byte Tx Cnt Ov */ - #define XMT_127B_OV (1L<<21) /* Bit 21: 65-127 Byte Tx Cnt Ov */ - #define XMT_64B_OV (1L<<20) /* Bit 20: 64 Byte Tx Cnt Ov */ - #define XMT_UTIL_OV (1L<<19) /* Bit 19: Tx Util Cnt Overflow */ - #define XMT_UTIL_UR (1L<<18) /* Bit 18: Tx Util Cnt Underrun */ --#define XMT_CS_ERR_OV (1L<<17) /* Bit 17: Tx Carr Sen Err Cnt Ov*/ -+#define XMT_CS_ERR_OV (1L<<17) /* Bit 17: Tx Carr Sen Err Cnt Ov */ - #define XMT_FIFO_UR_OV (1L<<16) /* Bit 16: Tx FIFO Ur Ev Cnt Ov */ - #define XMT_EX_DEF_OV (1L<<15) /* Bit 15: Tx Ex Deferall Cnt Ov */ - #define XMT_DEF (1L<<14) /* Bit 14: Tx Deferred Cnt Ov */ - #define XMT_LAT_COL_OV (1L<<13) /* Bit 13: Tx Late Col Cnt Ov */ --#define XMT_ABO_COL_OV (1L<<12) /* Bit 12: Tx abo dueto Ex Col Ov*/ -+#define XMT_ABO_COL_OV (1L<<12) /* Bit 12: Tx abo dueto Ex Col Ov */ - #define XMT_MUL_COL_OV (1L<<11) /* Bit 11: Tx Mult Col Cnt Ov */ - #define XMT_SNG_COL (1L<<10) /* Bit 10: Tx Single Col Cnt Ov */ --#define XMT_MCTRL_OV (1L<<9) /* Bit 9: Tx MAC Ctrl Counter Ov*/ --#define XMT_MPAUSE (1L<<8) /* Bit 8: Tx Pause MAC Ctrl-F Ov*/ -+#define XMT_MCTRL_OV (1L<<9) /* Bit 9: Tx MAC Ctrl Counter Ov */ -+#define XMT_MPAUSE (1L<<8) /* Bit 8: Tx Pause MAC Ctrl-F Ov */ - #define XMT_BURST (1L<<7) /* Bit 7: Tx Burst Event Cnt Ov */ - #define XMT_LONG (1L<<6) /* Bit 6: Tx Long Frame Cnt Ov */ - #define XMT_UC_OK_OV (1L<<5) /* Bit 5: Tx Unicast Cnt Ov */ - #define XMT_MC_OK_OV (1L<<4) /* Bit 4: Tx Multicast Cnt Ov */ - #define XMT_BC_OK_OV (1L<<3) /* Bit 3: Tx Broadcast Cnt Ov */ --#define XMT_OK_LO_OV (1L<<2) /* Bit 2: Octets Tx OK Low CntOv*/ --#define XMT_OK_HI_OV (1L<<1) /* Bit 1: Octets Tx OK Hi Cnt Ov*/ --#define XMT_OK_OV (1L<<0) /* Bit 0: Frames Tx Ok Ov */ -+#define XMT_OK_LO_OV (1L<<2) /* Bit 2: Octets Tx OK Low Cnt Ov */ -+#define XMT_OK_HI_OV (1L<<1) /* Bit 1: Octets Tx OK High Cnt Ov */ -+#define XMT_OK_OV (1L<<0) /* Bit 0: Frames Tx OK Ov */ - - #define XMT_DEF_MSK (XMT_OK_LO_OV | XMT_OK_HI_OV) - - /* - * Receive Frame Status Encoding - */ --#define XMR_FS_LEN (0x3fffUL<<18) /* Bit 31..18: Rx Frame Length */ --#define XMR_FS_2L_VLAN (1L<<17) /* Bit 17: tagged wh 2Lev VLAN ID*/ --#define XMR_FS_1L_VLAN (1L<<16) /* Bit 16: tagged wh 1Lev VLAN ID*/ -+#define XMR_FS_LEN_MSK (0x3fffUL<<18) /* Bit 31..18: Rx Frame Length */ -+#define XMR_FS_2L_VLAN (1L<<17) /* Bit 17: Tagged wh 2Lev VLAN ID */ -+#define XMR_FS_1L_VLAN (1L<<16) /* Bit 16: Tagged wh 1Lev VLAN ID */ - #define XMR_FS_BC (1L<<15) /* Bit 15: Broadcast Frame */ - #define XMR_FS_MC (1L<<14) /* Bit 14: Multicast Frame */ - #define XMR_FS_UC (1L<<13) /* Bit 13: Unicast Frame */ -@@ -469,6 +470,8 @@ extern "C" { - #define XMR_FS_ERR (1L<<1) /* Bit 1: Frame Error */ - #define XMR_FS_MCTRL (1L<<0) /* Bit 0: MAC Control Packet */ - -+#define XMR_FS_LEN_SHIFT 18 -+ - /* - * XMR_FS_ERR will be set if - * XMR_FS_FCS_ERR, XMR_FS_LNG_ERR, XMR_FS_RUNT, -@@ -488,7 +491,7 @@ extern "C" { - #define PHY_XMAC_ID0 0x02 /* 16 bit r/o PHY ID0 Register */ - #define PHY_XMAC_ID1 0x03 /* 16 bit r/o PHY ID1 Register */ - #define PHY_XMAC_AUNE_ADV 0x04 /* 16 bit r/w Auto-Neg. Advertisement */ --#define PHY_XMAC_AUNE_LP 0x05 /* 16 bit r/o Link Partner Abi Reg */ -+#define PHY_XMAC_AUNE_LP 0x05 /* 16 bit r/o Link Partner Ability Reg */ - #define PHY_XMAC_AUNE_EXP 0x06 /* 16 bit r/o Auto-Neg. Expansion Reg */ - #define PHY_XMAC_NEPG 0x07 /* 16 bit r/w Next Page Register */ - #define PHY_XMAC_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */ -@@ -510,7 +513,7 @@ extern "C" { - #define PHY_BCOM_NEPG 0x07 /* 16 bit r/w Next Page Register */ - #define PHY_BCOM_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */ - /* Broadcom-specific registers */ --#define PHY_BCOM_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Ctrl Reg */ -+#define PHY_BCOM_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */ - #define PHY_BCOM_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */ - /* 0x0b - 0x0e: reserved */ - #define PHY_BCOM_EXT_STAT 0x0f /* 16 bit r/o Extended Status Reg */ -@@ -541,24 +544,32 @@ extern "C" { - #define PHY_MARV_NEPG 0x07 /* 16 bit r/w Next Page Register */ - #define PHY_MARV_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */ - /* Marvel-specific registers */ --#define PHY_MARV_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Ctrl Reg */ -+#define PHY_MARV_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */ - #define PHY_MARV_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */ - /* 0x0b - 0x0e: reserved */ - #define PHY_MARV_EXT_STAT 0x0f /* 16 bit r/o Extended Status Reg */ --#define PHY_MARV_PHY_CTRL 0x10 /* 16 bit r/w PHY Specific Ctrl Reg */ --#define PHY_MARV_PHY_STAT 0x11 /* 16 bit r/o PHY Specific Stat Reg */ -+#define PHY_MARV_PHY_CTRL 0x10 /* 16 bit r/w PHY Specific Control Reg */ -+#define PHY_MARV_PHY_STAT 0x11 /* 16 bit r/o PHY Specific Status Reg */ - #define PHY_MARV_INT_MASK 0x12 /* 16 bit r/w Interrupt Mask Reg */ - #define PHY_MARV_INT_STAT 0x13 /* 16 bit r/o Interrupt Status Reg */ - #define PHY_MARV_EXT_CTRL 0x14 /* 16 bit r/w Ext. PHY Specific Ctrl */ - #define PHY_MARV_RXE_CNT 0x15 /* 16 bit r/w Receive Error Counter */ - #define PHY_MARV_EXT_ADR 0x16 /* 16 bit r/w Ext. Ad. for Cable Diag. */ -- /* 0x17: reserved */ -+#define PHY_MARV_PORT_IRQ 0x17 /* 16 bit r/o Port 0 IRQ (88E1111 only) */ - #define PHY_MARV_LED_CTRL 0x18 /* 16 bit r/w LED Control Reg */ - #define PHY_MARV_LED_OVER 0x19 /* 16 bit r/w Manual LED Override Reg */ - #define PHY_MARV_EXT_CTRL_2 0x1a /* 16 bit r/w Ext. PHY Specific Ctrl 2 */ - #define PHY_MARV_EXT_P_STAT 0x1b /* 16 bit r/w Ext. PHY Spec. Stat Reg */ - #define PHY_MARV_CABLE_DIAG 0x1c /* 16 bit r/o Cable Diagnostic Reg */ -- /* 0x1d - 0x1f: reserved */ -+#define PHY_MARV_PAGE_ADDR 0x1d /* 16 bit r/w Extended Page Address Reg */ -+#define PHY_MARV_PAGE_DATA 0x1e /* 16 bit r/w Extended Page Data Reg */ -+ -+/* for 10/100 Fast Ethernet PHY (88E3082 only) */ -+#define PHY_MARV_FE_LED_PAR 0x16 /* 16 bit r/w LED Parallel Select Reg. */ -+#define PHY_MARV_FE_LED_SER 0x17 /* 16 bit r/w LED Stream Select S. LED */ -+#define PHY_MARV_FE_VCT_TX 0x1a /* 16 bit r/w VCT Reg. for TXP/N Pins */ -+#define PHY_MARV_FE_VCT_RX 0x1b /* 16 bit r/o VCT Reg. for RXP/N Pins */ -+#define PHY_MARV_FE_SPEC_2 0x1c /* 16 bit r/w Specific Control Reg. 2 */ - - /*----------------------------------------------------------------------------*/ - /* -@@ -574,9 +585,9 @@ extern "C" { - #define PHY_LONE_NEPG 0x07 /* 16 bit r/w Next Page Register */ - #define PHY_LONE_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */ - /* Level One-specific registers */ --#define PHY_LONE_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg*/ -+#define PHY_LONE_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */ - #define PHY_LONE_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */ -- /* 0x0b -0x0e: reserved */ -+ /* 0x0b - 0x0e: reserved */ - #define PHY_LONE_EXT_STAT 0x0f /* 16 bit r/o Extended Status Reg */ - #define PHY_LONE_PORT_CFG 0x10 /* 16 bit r/w Port Configuration Reg*/ - #define PHY_LONE_Q_STAT 0x11 /* 16 bit r/o Quick Status Reg */ -@@ -585,7 +596,7 @@ extern "C" { - #define PHY_LONE_LED_CFG 0x14 /* 16 bit r/w LED Configuration Reg */ - #define PHY_LONE_PORT_CTRL 0x15 /* 16 bit r/w Port Control Reg */ - #define PHY_LONE_CIM 0x16 /* 16 bit r/o CIM Reg */ -- /* 0x17 -0x1c: reserved */ -+ /* 0x17 - 0x1c: reserved */ - - /*----------------------------------------------------------------------------*/ - /* -@@ -603,14 +614,14 @@ extern "C" { - /* National-specific registers */ - #define PHY_NAT_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */ - #define PHY_NAT_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */ -- /* 0x0b -0x0e: reserved */ -+ /* 0x0b - 0x0e: reserved */ - #define PHY_NAT_EXT_STAT 0x0f /* 16 bit r/o Extended Status Register */ - #define PHY_NAT_EXT_CTRL1 0x10 /* 16 bit r/o Extended Control Reg1 */ - #define PHY_NAT_Q_STAT1 0x11 /* 16 bit r/o Quick Status Reg1 */ - #define PHY_NAT_10B_OP 0x12 /* 16 bit r/o 10Base-T Operations Reg */ - #define PHY_NAT_EXT_CTRL2 0x13 /* 16 bit r/o Extended Control Reg1 */ - #define PHY_NAT_Q_STAT2 0x14 /* 16 bit r/o Quick Status Reg2 */ -- /* 0x15 -0x18: reserved */ -+ /* 0x15 - 0x18: reserved */ - #define PHY_NAT_PHY_ADDR 0x19 /* 16 bit r/o PHY Address Register */ - - -@@ -618,7 +629,7 @@ extern "C" { - - /* - * PHY bit definitions -- * Bits defined as PHY_X_..., PHY_B_..., PHY_L_... or PHY_N_... are -+ * Bits defined as PHY_X_..., PHY_B_..., PHY_L_..., PHY_N_... or PHY_M_... are - * XMAC/Broadcom/LevelOne/National/Marvell-specific. - * All other are general. - */ -@@ -629,14 +640,14 @@ extern "C" { - /***** PHY_LONE_CTRL 16 bit r/w PHY Control Register *****/ - #define PHY_CT_RESET (1<<15) /* Bit 15: (sc) clear all PHY related regs */ - #define PHY_CT_LOOP (1<<14) /* Bit 14: enable Loopback over PHY */ --#define PHY_CT_SPS_LSB (1<<13) /* Bit 13: (BC,L1) Speed select, lower bit */ -+#define PHY_CT_SPS_LSB (1<<13) /* Bit 13: Speed select, lower bit */ - #define PHY_CT_ANE (1<<12) /* Bit 12: Auto-Negotiation Enabled */ --#define PHY_CT_PDOWN (1<<11) /* Bit 11: (BC,L1) Power Down Mode */ --#define PHY_CT_ISOL (1<<10) /* Bit 10: (BC,L1) Isolate Mode */ --#define PHY_CT_RE_CFG (1<<9) /* Bit 9: (sc) Restart Auto-Negotiation */ -+#define PHY_CT_PDOWN (1<<11) /* Bit 11: Power Down Mode */ -+#define PHY_CT_ISOL (1<<10) /* Bit 10: Isolate Mode */ -+#define PHY_CT_RE_CFG (1<<9) /* Bit 9: (sc) Restart Auto-Negotiation */ - #define PHY_CT_DUP_MD (1<<8) /* Bit 8: Duplex Mode */ --#define PHY_CT_COL_TST (1<<7) /* Bit 7: (BC,L1) Collision Test enabled */ --#define PHY_CT_SPS_MSB (1<<6) /* Bit 6: (BC,L1) Speed select, upper bit */ -+#define PHY_CT_COL_TST (1<<7) /* Bit 7: Collision Test enabled */ -+#define PHY_CT_SPS_MSB (1<<6) /* Bit 6: Speed select, upper bit */ - /* Bit 5..0: reserved */ - - #define PHY_CT_SP1000 PHY_CT_SPS_MSB /* enable speed of 1000 Mbps */ -@@ -649,25 +660,25 @@ extern "C" { - /***** PHY_MARV_STAT 16 bit r/w PHY Status Register *****/ - /***** PHY_LONE_STAT 16 bit r/w PHY Status Register *****/ - /* Bit 15..9: reserved */ -- /* (BC/L1) 100/10 Mbps cap bits ignored*/ -+ /* (BC/L1) 100/10 Mbps cap bits ignored */ - #define PHY_ST_EXT_ST (1<<8) /* Bit 8: Extended Status Present */ - /* Bit 7: reserved */ --#define PHY_ST_PRE_SUP (1<<6) /* Bit 6: (BC/L1) preamble suppression */ -+#define PHY_ST_PRE_SUP (1<<6) /* Bit 6: Preamble Suppression */ - #define PHY_ST_AN_OVER (1<<5) /* Bit 5: Auto-Negotiation Over */ - #define PHY_ST_REM_FLT (1<<4) /* Bit 4: Remote Fault Condition Occured */ - #define PHY_ST_AN_CAP (1<<3) /* Bit 3: Auto-Negotiation Capability */ - #define PHY_ST_LSYNC (1<<2) /* Bit 2: Link Synchronized */ --#define PHY_ST_JAB_DET (1<<1) /* Bit 1: (BC/L1) Jabber Detected */ -+#define PHY_ST_JAB_DET (1<<1) /* Bit 1: Jabber Detected */ - #define PHY_ST_EXT_REG (1<<0) /* Bit 0: Extended Register available */ - - --/***** PHY_XMAC_ID1 16 bit r/o PHY ID1 Register */ --/***** PHY_BCOM_ID1 16 bit r/o PHY ID1 Register */ --/***** PHY_MARV_ID1 16 bit r/o PHY ID1 Register */ --/***** PHY_LONE_ID1 16 bit r/o PHY ID1 Register */ -+/***** PHY_XMAC_ID1 16 bit r/o PHY ID1 Register */ -+/***** PHY_BCOM_ID1 16 bit r/o PHY ID1 Register */ -+/***** PHY_MARV_ID1 16 bit r/o PHY ID1 Register */ -+/***** PHY_LONE_ID1 16 bit r/o PHY ID1 Register */ - #define PHY_I1_OUI_MSK (0x3f<<10) /* Bit 15..10: Organization Unique ID */ - #define PHY_I1_MOD_NUM (0x3f<<4) /* Bit 9.. 4: Model Number */ --#define PHY_I1_REV_MSK 0x0f /* Bit 3.. 0: Revision Number */ -+#define PHY_I1_REV_MSK 0xf /* Bit 3.. 0: Revision Number */ - - /* different Broadcom PHY Ids */ - #define PHY_BCOM_ID1_A1 0x6041 -@@ -675,11 +686,21 @@ extern "C" { - #define PHY_BCOM_ID1_C0 0x6044 - #define PHY_BCOM_ID1_C5 0x6047 - -+/* different Marvell PHY Ids */ -+#define PHY_MARV_ID0_VAL 0x0141 /* Marvell Unique Identifier */ -+ -+#define PHY_MARV_ID1_B0 0x0C23 /* Yukon (PHY 88E1040 Rev.C0) */ -+#define PHY_MARV_ID1_B2 0x0C25 /* Yukon-Plus (PHY 88E1040 Rev.D0) */ -+#define PHY_MARV_ID1_C2 0x0CC2 /* Yukon-EC (PHY 88E1111 Rev.B1) */ -+#define PHY_MARV_ID1_Y2 0x0C91 /* Yukon-XL (PHY 88E1112 Rev.B0) */ -+#define PHY_MARV_ID1_FE 0x0C83 /* Yukon-FE (PHY 88E3082 Rev.A1) */ -+#define PHY_MARV_ID1_ECU 0x0CB0 /* Yukon-ECU (PHY 88E1149 Rev.B2?) */ -+ - - /***** PHY_XMAC_AUNE_ADV 16 bit r/w Auto-Negotiation Advertisement *****/ - /***** PHY_XMAC_AUNE_LP 16 bit r/o Link Partner Ability Reg *****/ - #define PHY_AN_NXT_PG (1<<15) /* Bit 15: Request Next Page */ --#define PHY_X_AN_ACK (1<<14) /* Bit 14: (ro) Acknowledge Received */ -+#define PHY_X_AN_ACK (1<<14) /* Bit 14: (ro) Acknowledge Received */ - #define PHY_X_AN_RFB (3<<12) /* Bit 13..12: Remote Fault Bits */ - /* Bit 11.. 9: reserved */ - #define PHY_X_AN_PAUSE (3<<7) /* Bit 8.. 7: Pause Bits */ -@@ -827,7 +848,7 @@ extern "C" { - #define PHY_B_PEC_BY_MLT3 (1<<8) /* Bit 8: Bypass MLT3 Encoder */ - #define PHY_B_PEC_BY_RXA (1<<7) /* Bit 7: Bypass Rx Alignm. */ - #define PHY_B_PEC_RES_SCR (1<<6) /* Bit 6: Reset Scrambler */ --#define PHY_B_PEC_EN_LTR (1<<5) /* Bit 5: Ena LED Traffic Mode */ -+#define PHY_B_PEC_EN_LTR (1<<5) /* Bit 5: Enable LED Traffic Mode */ - #define PHY_B_PEC_LED_ON (1<<4) /* Bit 4: Force LED's on */ - #define PHY_B_PEC_LED_OFF (1<<3) /* Bit 3: Force LED's off */ - #define PHY_B_PEC_EX_IPG (1<<2) /* Bit 2: Extend Tx IPG Mode */ -@@ -981,7 +1002,7 @@ extern "C" { - #define PHY_L_QS_DUP_MOD (1<<9) /* Bit 9: Full/Half Duplex */ - #define PHY_L_QS_AN (1<<8) /* Bit 8: AutoNeg is On */ - #define PHY_L_QS_AN_C (1<<7) /* Bit 7: AN is Complete */ --#define PHY_L_QS_LLE (7<<4) /* Bit 6: Line Length Estim. */ -+#define PHY_L_QS_LLE (7<<4) /* Bit 6..4: Line Length Estim. */ - #define PHY_L_QS_PAUSE (1<<3) /* Bit 3: LP advertised Pause */ - #define PHY_L_QS_AS_PAUSE (1<<2) /* Bit 2: LP adv. asym. Pause */ - #define PHY_L_QS_ISOLATE (1<<1) /* Bit 1: CIM Isolated */ -@@ -1029,9 +1050,8 @@ extern "C" { - /* Bit 9..0: not described */ - - /***** PHY_LONE_CIM 16 bit r/o CIM Reg *****/ --#define PHY_L_CIM_ISOL (255<<8)/* Bit 15..8: Isolate Count */ --#define PHY_L_CIM_FALSE_CAR (255<<0)/* Bit 7..0: False Carrier Count */ -- -+#define PHY_L_CIM_ISOL (0xff<<8) /* Bit 15..8: Isolate Count */ -+#define PHY_L_CIM_FALSE_CAR 0xff /* Bit 7..0: False Carrier Count */ - - /* - * Pause Bits (PHY_L_AN_ASP and PHY_L_AN_PC) encoding -@@ -1041,7 +1061,6 @@ extern "C" { - #define PHY_L_P_ASYM_MD (2<<10) /* Bit 11..10: asymmetric Pause Mode */ - #define PHY_L_P_BOTH_MD (3<<10) /* Bit 11..10: both Pause Mode */ - -- - /* - * National-Specific - */ -@@ -1086,22 +1105,24 @@ extern "C" { - */ - /***** PHY_MARV_AUNE_ADV 16 bit r/w Auto-Negotiation Advertisement *****/ - /***** PHY_MARV_AUNE_LP 16 bit r/w Link Part Ability Reg *****/ --#define PHY_M_AN_NXT_PG BIT_15 /* Request Next Page */ --#define PHY_M_AN_ACK BIT_14 /* (ro) Acknowledge Received */ --#define PHY_M_AN_RF BIT_13 /* Remote Fault */ -- /* Bit 12: reserved */ --#define PHY_M_AN_ASP BIT_11 /* Asymmetric Pause */ --#define PHY_M_AN_PC BIT_10 /* MAC Pause implemented */ --#define PHY_M_AN_100_FD BIT_8 /* Advertise 100Base-TX Full Duplex */ --#define PHY_M_AN_100_HD BIT_7 /* Advertise 100Base-TX Half Duplex */ --#define PHY_M_AN_10_FD BIT_6 /* Advertise 10Base-TX Full Duplex */ --#define PHY_M_AN_10_HD BIT_5 /* Advertise 10Base-TX Half Duplex */ -- --/* special defines for FIBER (88E1011S only) */ --#define PHY_M_AN_ASP_X BIT_8 /* Asymmetric Pause */ --#define PHY_M_AN_PC_X BIT_7 /* MAC Pause implemented */ --#define PHY_M_AN_1000X_AHD BIT_6 /* Advertise 10000Base-X Half Duplex */ --#define PHY_M_AN_1000X_AFD BIT_5 /* Advertise 10000Base-X Full Duplex */ -+#define PHY_M_AN_NXT_PG BIT_15S /* Request Next Page */ -+#define PHY_M_AN_ACK BIT_14S /* (ro) Acknowledge Received */ -+#define PHY_M_AN_RF BIT_13S /* Remote Fault */ -+ /* Bit 12: reserved */ -+#define PHY_M_AN_ASP BIT_11S /* Asymmetric Pause */ -+#define PHY_M_AN_PC BIT_10S /* MAC Pause implemented */ -+#define PHY_M_AN_100_T4 BIT_9S /* Not cap. 100Base-T4 (always 0) */ -+#define PHY_M_AN_100_FD BIT_8S /* Advertise 100Base-TX Full Duplex */ -+#define PHY_M_AN_100_HD BIT_7S /* Advertise 100Base-TX Half Duplex */ -+#define PHY_M_AN_10_FD BIT_6S /* Advertise 10Base-TX Full Duplex */ -+#define PHY_M_AN_10_HD BIT_5S /* Advertise 10Base-TX Half Duplex */ -+#define PHY_M_AN_SEL_MSK (0x1f<<4) /* Bit 4.. 0: Selector Field Mask */ -+ -+/* special defines for FIBER (88E1040S only) */ -+#define PHY_M_AN_ASP_X BIT_8S /* Asymmetric Pause */ -+#define PHY_M_AN_PC_X BIT_7S /* MAC Pause implemented */ -+#define PHY_M_AN_1000X_AHD BIT_6S /* Advertise 10000Base-X Half Duplex */ -+#define PHY_M_AN_1000X_AFD BIT_5S /* Advertise 10000Base-X Full Duplex */ - - /* Pause Bits (PHY_M_AN_ASP_X and PHY_M_AN_PC_X) encoding */ - #define PHY_M_P_NO_PAUSE_X (0<<7) /* Bit 8.. 7: no Pause Mode */ -@@ -1111,105 +1132,167 @@ extern "C" { - - /***** PHY_MARV_1000T_CTRL 16 bit r/w 1000Base-T Control Reg *****/ - #define PHY_M_1000C_TEST (7<<13) /* Bit 15..13: Test Modes */ --#define PHY_M_1000C_MSE (1<<12) /* Bit 12: Manual Master/Slave Enable */ --#define PHY_M_1000C_MSC (1<<11) /* Bit 11: M/S Configuration (1=Master) */ --#define PHY_M_1000C_MPD (1<<10) /* Bit 10: Multi-Port Device */ --#define PHY_M_1000C_AFD (1<<9) /* Bit 9: Advertise Full Duplex */ --#define PHY_M_1000C_AHD (1<<8) /* Bit 8: Advertise Half Duplex */ -+#define PHY_M_1000C_MSE BIT_12S /* Manual Master/Slave Enable */ -+#define PHY_M_1000C_MSC BIT_11S /* M/S Configuration (1=Master) */ -+#define PHY_M_1000C_MPD BIT_10S /* Multi-Port Device */ -+#define PHY_M_1000C_AFD BIT_9S /* Advertise Full Duplex */ -+#define PHY_M_1000C_AHD BIT_8S /* Advertise Half Duplex */ - /* Bit 7..0: reserved */ - - /***** PHY_MARV_PHY_CTRL 16 bit r/w PHY Specific Ctrl Reg *****/ --#define PHY_M_PC_TX_FFD_MSK (3<<14) /* Bit 15..14: Tx FIFO Depth Mask */ --#define PHY_M_PC_RX_FFD_MSK (3<<12) /* Bit 13..12: Rx FIFO Depth Mask */ --#define PHY_M_PC_ASS_CRS_TX (1<<11) /* Bit 11: Assert CRS on Transmit */ --#define PHY_M_PC_FL_GOOD (1<<10) /* Bit 10: Force Link Good */ --#define PHY_M_PC_EN_DET_MSK (3<<8) /* Bit 9.. 8: Energy Detect Mask */ --#define PHY_M_PC_ENA_EXT_D (1<<7) /* Bit 7: Enable Ext. Distance (10BT) */ --#define PHY_M_PC_MDIX_MSK (3<<5) /* Bit 6.. 5: MDI/MDIX Config. Mask */ --#define PHY_M_PC_DIS_125CLK (1<<4) /* Bit 4: Disable 125 CLK */ --#define PHY_M_PC_MAC_POW_UP (1<<3) /* Bit 3: MAC Power up */ --#define PHY_M_PC_SQE_T_ENA (1<<2) /* Bit 2: SQE Test Enabled */ --#define PHY_M_PC_POL_R_DIS (1<<1) /* Bit 1: Polarity Reversal Disabled */ --#define PHY_M_PC_DIS_JABBER (1<<0) /* Bit 0: Disable Jabber */ -+#define PHY_M_PC_TX_FFD_MSK (3<<14) /* Bit 15..14: Tx FIFO Depth Mask */ -+#define PHY_M_PC_RX_FFD_MSK (3<<12) /* Bit 13..12: Rx FIFO Depth Mask */ -+#define PHY_M_PC_ASS_CRS_TX BIT_11S /* Assert CRS on Transmit */ -+#define PHY_M_PC_FL_GOOD BIT_10S /* Force Link Good */ -+#define PHY_M_PC_EN_DET_MSK (3<<8) /* Bit 9.. 8: Energy Detect Mask */ -+#define PHY_M_PC_ENA_EXT_D BIT_7S /* Enable Ext. Distance (10BT) */ -+#define PHY_M_PC_MDIX_MSK (3<<5) /* Bit 6.. 5: MDI/MDIX Config. Mask */ -+#define PHY_M_PC_DIS_125CLK BIT_4S /* Disable 125 CLK */ -+#define PHY_M_PC_MAC_POW_UP BIT_3S /* MAC Power up */ -+#define PHY_M_PC_SQE_T_ENA BIT_2S /* SQE Test Enabled */ -+#define PHY_M_PC_POL_R_DIS BIT_1S /* Polarity Reversal Disabled */ -+#define PHY_M_PC_DIS_JABBER BIT_0S /* Disable Jabber */ - - #define PHY_M_PC_EN_DET SHIFT8(2) /* Energy Detect (Mode 1) */ - #define PHY_M_PC_EN_DET_PLUS SHIFT8(3) /* Energy Detect Plus (Mode 2) */ - --#define PHY_M_PC_MDI_XMODE(x) SHIFT5(x) --#define PHY_M_PC_MAN_MDI 0 /* 00 = Manual MDI configuration */ -+#define PHY_M_PC_MDI_XMODE(x) (SHIFT5(x) & PHY_M_PC_MDIX_MSK) -+ -+#define PHY_M_PC_MAN_MDI 0 /* 00 = Manual MDI configuration */ - #define PHY_M_PC_MAN_MDIX 1 /* 01 = Manual MDIX configuration */ - #define PHY_M_PC_ENA_AUTO 3 /* 11 = Enable Automatic Crossover */ - -+/* for Yukon-2/-EC Ultra Gigabit Ethernet PHY (88E1112/88E1149 only) */ -+#define PHY_M_PC_DIS_LINK_P BIT_15S /* Disable Link Pulses */ -+#define PHY_M_PC_DSC_MSK (7<<12) /* Bit 14..12: Downshift Counter */ -+#define PHY_M_PC_DOWN_S_ENA BIT_11S /* Downshift Enable */ -+ /* !!! Errata in spec. (1 = disable) */ -+ -+#define PHY_M_PC_DSC(x) (SHIFT12(x) & PHY_M_PC_DSC_MSK) -+ /* 000=1x; 001=2x; 010=3x; 011=4x */ -+ /* 100=5x; 101=6x; 110=7x; 111=8x */ -+ -+/* for Yukon-EC Ultra Gigabit Ethernet PHY (88E1149 only) */ -+ /* Bit 4: reserved */ -+#define PHY_M_PC_COP_TX_DIS BIT_3S /* Copper Transmitter Disable */ -+#define PHY_M_PC_POW_D_ENA BIT_2S /* Power Down Enable */ -+ -+/* for 10/100 Fast Ethernet PHY (88E3082 only) */ -+#define PHY_M_PC_ENA_DTE_DT BIT_15S /* Enable Data Terminal Equ. (DTE) Detect */ -+#define PHY_M_PC_ENA_ENE_DT BIT_14S /* Enable Energy Detect (sense & pulse) */ -+#define PHY_M_PC_DIS_NLP_CK BIT_13S /* Disable Normal Link Puls (NLP) Check */ -+#define PHY_M_PC_ENA_LIP_NP BIT_12S /* Enable Link Partner Next Page Reg. */ -+#define PHY_M_PC_DIS_NLP_GN BIT_11S /* Disable Normal Link Puls Generation */ -+ -+#define PHY_M_PC_DIS_SCRAMB BIT_9S /* Disable Scrambler */ -+#define PHY_M_PC_DIS_FEFI BIT_8S /* Disable Far End Fault Indic. (FEFI) */ -+ -+#define PHY_M_PC_SH_TP_SEL BIT_6S /* Shielded Twisted Pair Select */ -+#define PHY_M_PC_RX_FD_MSK (3<<2) /* Bit 3.. 2: Rx FIFO Depth Mask */ -+ - /***** PHY_MARV_PHY_STAT 16 bit r/o PHY Specific Status Reg *****/ --#define PHY_M_PS_SPEED_MSK (3<<14) /* Bit 15..14: Speed Mask */ --#define PHY_M_PS_SPEED_1000 (1<<15) /* 10 = 1000 Mbps */ --#define PHY_M_PS_SPEED_100 (1<<14) /* 01 = 100 Mbps */ --#define PHY_M_PS_SPEED_10 0 /* 00 = 10 Mbps */ --#define PHY_M_PS_FULL_DUP (1<<13) /* Bit 13: Full Duplex */ --#define PHY_M_PS_PAGE_REC (1<<12) /* Bit 12: Page Received */ --#define PHY_M_PS_SPDUP_RES (1<<11) /* Bit 11: Speed & Duplex Resolved */ --#define PHY_M_PS_LINK_UP (1<<10) /* Bit 10: Link Up */ --#define PHY_M_PS_CABLE_MSK (3<<7) /* Bit 9.. 7: Cable Length Mask */ --#define PHY_M_PS_MDI_X_STAT (1<<6) /* Bit 6: MDI Crossover Stat (1=MDIX) */ --#define PHY_M_PS_DOWNS_STAT (1<<5) /* Bit 5: Downshift Status (1=downsh.) */ --#define PHY_M_PS_ENDET_STAT (1<<4) /* Bit 4: Energy Detect Status (1=act) */ --#define PHY_M_PS_TX_P_EN (1<<3) /* Bit 3: Tx Pause Enabled */ --#define PHY_M_PS_RX_P_EN (1<<2) /* Bit 2: Rx Pause Enabled */ --#define PHY_M_PS_POL_REV (1<<1) /* Bit 1: Polarity Reversed */ --#define PHY_M_PC_JABBER (1<<0) /* Bit 0: Jabber */ -+#define PHY_M_PS_SPEED_MSK (3<<14) /* Bit 15..14: Speed Mask */ -+#define PHY_M_PS_SPEED_1000 BIT_15S /* 10 = 1000 Mbps */ -+#define PHY_M_PS_SPEED_100 BIT_14S /* 01 = 100 Mbps */ -+#define PHY_M_PS_SPEED_10 0 /* 00 = 10 Mbps */ -+#define PHY_M_PS_FULL_DUP BIT_13S /* Full Duplex */ -+#define PHY_M_PS_PAGE_REC BIT_12S /* Page Received */ -+#define PHY_M_PS_SPDUP_RES BIT_11S /* Speed & Duplex Resolved */ -+#define PHY_M_PS_LINK_UP BIT_10S /* Link Up */ -+#define PHY_M_PS_CABLE_MSK (7<<7) /* Bit 9.. 7: Cable Length Mask */ -+#define PHY_M_PS_MDI_X_STAT BIT_6S /* MDI Crossover Stat (1=MDIX) */ -+#define PHY_M_PS_DOWNS_STAT BIT_5S /* Downshift Status (1=downsh.) */ -+#define PHY_M_PS_ENDET_STAT BIT_4S /* Energy Detect Status (1=act) */ -+#define PHY_M_PS_TX_P_EN BIT_3S /* Tx Pause Enabled */ -+#define PHY_M_PS_RX_P_EN BIT_2S /* Rx Pause Enabled */ -+#define PHY_M_PS_POL_REV BIT_1S /* Polarity Reversed */ -+#define PHY_M_PS_JABBER BIT_0S /* Jabber */ - - #define PHY_M_PS_PAUSE_MSK (PHY_M_PS_TX_P_EN | PHY_M_PS_RX_P_EN) - -+/* for 10/100 Fast Ethernet PHY (88E3082 only) */ -+#define PHY_M_PS_DTE_DETECT BIT_15S /* Data Terminal Equipment (DTE) Detected */ -+#define PHY_M_PS_RES_SPEED BIT_14S /* Resolved Speed (1=100 Mbps, 0=10 Mbps */ -+ - /***** PHY_MARV_INT_MASK 16 bit r/w Interrupt Mask Reg *****/ - /***** PHY_MARV_INT_STAT 16 bit r/o Interrupt Status Reg *****/ --#define PHY_M_IS_AN_ERROR (1<<15) /* Bit 15: Auto-Negotiation Error */ --#define PHY_M_IS_LSP_CHANGE (1<<14) /* Bit 14: Link Speed Changed */ --#define PHY_M_IS_DUP_CHANGE (1<<13) /* Bit 13: Duplex Mode Changed */ --#define PHY_M_IS_AN_PR (1<<12) /* Bit 12: Page Received */ --#define PHY_M_IS_AN_COMPL (1<<11) /* Bit 11: Auto-Negotiation Completed */ --#define PHY_M_IS_LST_CHANGE (1<<10) /* Bit 10: Link Status Changed */ --#define PHY_M_IS_SYMB_ERROR (1<<9) /* Bit 9: Symbol Error */ --#define PHY_M_IS_FALSE_CARR (1<<8) /* Bit 8: False Carrier */ --#define PHY_M_IS_FIFO_ERROR (1<<7) /* Bit 7: FIFO Overflow/Underrun Error */ --#define PHY_M_IS_MDI_CHANGE (1<<6) /* Bit 6: MDI Crossover Changed */ --#define PHY_M_IS_DOWNSH_DET (1<<5) /* Bit 5: Downshift Detected */ --#define PHY_M_IS_END_CHANGE (1<<4) /* Bit 4: Energy Detect Changed */ -- /* Bit 3..2: reserved */ --#define PHY_M_IS_POL_CHANGE (1<<1) /* Bit 1: Polarity Changed */ --#define PHY_M_IS_JABBER (1<<0) /* Bit 0: Jabber */ -+#define PHY_M_IS_AN_ERROR BIT_15S /* Auto-Negotiation Error */ -+#define PHY_M_IS_LSP_CHANGE BIT_14S /* Link Speed Changed */ -+#define PHY_M_IS_DUP_CHANGE BIT_13S /* Duplex Mode Changed */ -+#define PHY_M_IS_AN_PR BIT_12S /* Page Received */ -+#define PHY_M_IS_AN_COMPL BIT_11S /* Auto-Negotiation Completed */ -+#define PHY_M_IS_LST_CHANGE BIT_10S /* Link Status Changed */ -+#define PHY_M_IS_SYMB_ERROR BIT_9S /* Symbol Error */ -+#define PHY_M_IS_FALSE_CARR BIT_8S /* False Carrier */ -+#define PHY_M_IS_FIFO_ERROR BIT_7S /* FIFO Overflow/Underrun Error */ -+#define PHY_M_IS_MDI_CHANGE BIT_6S /* MDI Crossover Changed */ -+#define PHY_M_IS_DOWNSH_DET BIT_5S /* Downshift Detected */ -+#define PHY_M_IS_END_CHANGE BIT_4S /* Energy Detect Changed */ -+ /* Bit 3: reserved */ -+#define PHY_M_IS_DTE_CHANGE BIT_2S /* DTE Power Det. Status Changed */ -+ /* (88E1111 only) */ -+#define PHY_M_IS_POL_CHANGE BIT_1S /* Polarity Changed */ -+#define PHY_M_IS_JABBER BIT_0S /* Jabber */ - - #define PHY_M_DEF_MSK (PHY_M_IS_AN_ERROR | PHY_M_IS_AN_PR | \ - PHY_M_IS_LST_CHANGE | PHY_M_IS_FIFO_ERROR) - - /***** PHY_MARV_EXT_CTRL 16 bit r/w Ext. PHY Specific Ctrl *****/ --#define PHY_M_EC_M_DSC_MSK (3<<10) /* Bit 11..10: Master downshift counter */ --#define PHY_M_EC_S_DSC_MSK (3<<8) /* Bit 9.. 8: Slave downshift counter */ -+#define PHY_M_EC_ENA_BC_EXT BIT_15S /* Enable Block Carr. Ext. (88E1111 only) */ -+#define PHY_M_EC_ENA_LIN_LB BIT_14S /* Enable Line Loopback (88E1111 only) */ -+ /* Bit 13: reserved */ -+#define PHY_M_EC_DIS_LINK_P BIT_12S /* Disable Link Pulses (88E1111 only) */ -+#define PHY_M_EC_M_DSC_MSK (3<<10) /* Bit 11..10: Master Downshift Counter */ -+ /* (88E1040 Rev.C0 only) */ -+#define PHY_M_EC_S_DSC_MSK (3<<8) /* Bit 9.. 8: Slave Downshift Counter */ -+ /* (88E1040 Rev.C0 only) */ -+#define PHY_M_EC_DSC_MSK_2 (7<<9) /* Bit 11.. 9: Downshift Counter */ -+ /* (88E1040 Rev.D0 and higher) */ -+#define PHY_M_EC_DOWN_S_ENA BIT_8S /* Downshift Enable (88E1040 Rev.D0 and */ -+ /* 88E1111 !!! Errata in spec. (1=dis.) */ -+#define PHY_M_EC_RX_TIM_CT BIT_7S /* RGMII Rx Timing Control*/ - #define PHY_M_EC_MAC_S_MSK (7<<4) /* Bit 6.. 4: Def. MAC interface speed */ --#define PHY_M_EC_FIB_AN_ENA (1<<3) /* Bit 3: Fiber Auto-Neg. Enable */ -- --#define PHY_M_EC_M_DSC(x) SHIFT10(x) /* 00=1x; 01=2x; 10=3x; 11=4x */ --#define PHY_M_EC_S_DSC(x) SHIFT8(x) /* 00=dis; 01=1x; 10=2x; 11=3x */ --#define PHY_M_EC_MAC_S(x) SHIFT4(x) /* 01X=0; 110=2.5; 111=25 (MHz) */ -- -+#define PHY_M_EC_FIB_AN_ENA BIT_3S /* Fiber Auto-Neg. Enable 88E1040S only) */ -+#define PHY_M_EC_DTE_D_ENA BIT_2S /* DTE Detect Enable (88E1111 only) */ -+#define PHY_M_EC_TX_TIM_CT BIT_1S /* RGMII Tx Timing Control */ -+#define PHY_M_EC_TRANS_DIS BIT_0S /* Transmitter Disable (88E1111 only) */ -+ -+#define PHY_M_EC_M_DSC(x) (SHIFT10(x) & PHY_M_EC_M_DSC_MSK) -+ /* 00=1x; 01=2x; 10=3x; 11=4x */ -+#define PHY_M_EC_S_DSC(x) (SHIFT8(x) & PHY_M_EC_S_DSC_MSK) -+ /* 00=dis; 01=1x; 10=2x; 11=3x */ -+#define PHY_M_EC_MAC_S(x) (SHIFT4(x) & PHY_M_EC_MAC_S_MSK) -+ /* 01X=0; 110=2.5; 111=25 (MHz) */ -+ -+#define PHY_M_EC_DSC_2(x) (SHIFT9(x) & PHY_M_EC_DSC_MSK_2) -+ /* 000=1x; 001=2x; 010=3x; 011=4x */ -+ /* 100=5x; 101=6x; 110=7x; 111=8x */ - #define MAC_TX_CLK_0_MHZ 2 - #define MAC_TX_CLK_2_5_MHZ 6 - #define MAC_TX_CLK_25_MHZ 7 - - /***** PHY_MARV_LED_CTRL 16 bit r/w LED Control Reg *****/ --#define PHY_M_LEDC_DIS_LED (1<<15) /* Bit 15: Disable LED */ --#define PHY_M_LEDC_PULS_MSK (7<<12) /* Bit 14..12: Pulse Stretch Mask */ --#define PHY_M_LEDC_F_INT (1<<11) /* Bit 11: Force Interrupt */ --#define PHY_M_LEDC_BL_R_MSK (7<<8) /* Bit 10.. 8: Blink Rate Mask */ -- /* Bit 7.. 5: reserved */ --#define PHY_M_LEDC_LINK_MSK (3<<3) /* Bit 4.. 3: Link Control Mask */ --#define PHY_M_LEDC_DP_CTRL (1<<2) /* Bit 2: Duplex Control */ --#define PHY_M_LEDC_RX_CTRL (1<<1) /* Bit 1: Rx activity / Link */ --#define PHY_M_LEDC_TX_CTRL (1<<0) /* Bit 0: Tx activity / Link */ -+#define PHY_M_LEDC_DIS_LED BIT_15S /* Disable LED */ -+#define PHY_M_LEDC_PULS_MSK (7<<12) /* Bit 14..12: Pulse Stretch Mask */ -+#define PHY_M_LEDC_F_INT BIT_11S /* Force Interrupt */ -+#define PHY_M_LEDC_BL_R_MSK (7<<8) /* Bit 10.. 8: Blink Rate Mask */ -+#define PHY_M_LEDC_DP_C_LSB BIT_7S /* Duplex Control (LSB, 88E1111 only) */ -+#define PHY_M_LEDC_TX_C_LSB BIT_6S /* Tx Control (LSB, 88E1111 only) */ -+#define PHY_M_LEDC_LK_C_MSK (7<<3) /* Bit 5.. 3: Link Control Mask */ -+ /* (88E1111 only) */ -+ /* Bit 7.. 5: reserved (88E1040 only) */ -+#define PHY_M_LEDC_LINK_MSK (3<<3) /* Bit 4.. 3: Link Control Mask */ -+ /* (88E1040 only) */ -+#define PHY_M_LEDC_DP_CTRL BIT_2S /* Duplex Control */ -+#define PHY_M_LEDC_DP_C_MSB BIT_2S /* Duplex Control (MSB, 88E1111 only) */ -+#define PHY_M_LEDC_RX_CTRL BIT_1S /* Rx Activity / Link */ -+#define PHY_M_LEDC_TX_CTRL BIT_0S /* Tx Activity / Link */ -+#define PHY_M_LEDC_TX_C_MSB BIT_0S /* Tx Control (MSB, 88E1111 only) */ - --#define PHY_M_LED_PULS_DUR(x) SHIFT12(x) /* Pulse Stretch Duration */ -+#define PHY_M_LED_PULS_DUR(x) (SHIFT12(x) & PHY_M_LEDC_PULS_MSK) - --#define PULS_NO_STR 0 /* no pulse stretching */ --#define PULS_21MS 1 /* 21 ms to 42 ms */ -+#define PULS_NO_STR 0 /* no pulse stretching */ -+#define PULS_21MS 1 /* 21 ms to 42 ms */ - #define PULS_42MS 2 /* 42 ms to 84 ms */ - #define PULS_84MS 3 /* 84 ms to 170 ms */ - #define PULS_170MS 4 /* 170 ms to 340 ms */ -@@ -1217,7 +1300,7 @@ extern "C" { - #define PULS_670MS 6 /* 670 ms to 1.3 s */ - #define PULS_1300MS 7 /* 1.3 s to 2.7 s */ - --#define PHY_M_LED_BLINK_RT(x) SHIFT8(x) /* Blink Rate */ -+#define PHY_M_LED_BLINK_RT(x) (SHIFT8(x) & PHY_M_LEDC_BL_R_MSK) - - #define BLINK_42MS 0 /* 42 ms */ - #define BLINK_84MS 1 /* 84 ms */ -@@ -1227,6 +1310,8 @@ extern "C" { - /* values 5 - 7: reserved */ - - /***** PHY_MARV_LED_OVER 16 bit r/w Manual LED Override Reg *****/ -+#define PHY_M_LED_MO_SGMII(x) SHIFT14(x) /* Bit 15..14: SGMII AN Timer */ -+ /* Bit 13..12: reserved */ - #define PHY_M_LED_MO_DUP(x) SHIFT10(x) /* Bit 11..10: Duplex */ - #define PHY_M_LED_MO_10(x) SHIFT8(x) /* Bit 9.. 8: Link 10 */ - #define PHY_M_LED_MO_100(x) SHIFT6(x) /* Bit 7.. 6: Link 100 */ -@@ -1240,30 +1325,35 @@ extern "C" { - #define MO_LED_ON 3 - - /***** PHY_MARV_EXT_CTRL_2 16 bit r/w Ext. PHY Specific Ctrl 2 *****/ -- /* Bit 15.. 7: reserved */ --#define PHY_M_EC2_FI_IMPED (1<<6) /* Bit 6: Fiber Input Impedance */ --#define PHY_M_EC2_FO_IMPED (1<<5) /* Bit 5: Fiber Output Impedance */ --#define PHY_M_EC2_FO_M_CLK (1<<4) /* Bit 4: Fiber Mode Clock Enable */ --#define PHY_M_EC2_FO_BOOST (1<<3) /* Bit 3: Fiber Output Boost */ -+ /* Bit 15.. 7: reserved */ -+#define PHY_M_EC2_FI_IMPED BIT_6S /* Fiber Input Impedance */ -+#define PHY_M_EC2_FO_IMPED BIT_5S /* Fiber Output Impedance */ -+#define PHY_M_EC2_FO_M_CLK BIT_4S /* Fiber Mode Clock Enable */ -+#define PHY_M_EC2_FO_BOOST BIT_3S /* Fiber Output Boost */ - #define PHY_M_EC2_FO_AM_MSK 7 /* Bit 2.. 0: Fiber Output Amplitude */ - --/***** PHY_MARV_EXT_P_STAT 16 bit r/w Ext. PHY Specific Status *****/ --#define PHY_M_FC_AUTO_SEL (1<<15) /* Bit 15: Fiber/Copper Auto Sel. dis. */ --#define PHY_M_FC_AN_REG_ACC (1<<14) /* Bit 14: Fiber/Copper Autoneg. reg acc */ --#define PHY_M_FC_RESULUTION (1<<13) /* Bit 13: Fiber/Copper Resulution */ --#define PHY_M_SER_IF_AN_BP (1<<12) /* Bit 12: Ser IF autoneg. bypass enable */ --#define PHY_M_SER_IF_BP_ST (1<<11) /* Bit 11: Ser IF autoneg. bypass status */ --#define PHY_M_IRQ_POLARITY (1<<10) /* Bit 10: IRQ polarity */ -- /* Bit 9..4: reserved */ --#define PHY_M_UNDOC1 (1<< 7) /* undocumented bit !! */ --#define PHY_M_MODE_MASK (0xf<<0)/* Bit 3..0: copy of HWCFG MODE[3:0] */ -- -+/***** PHY_MARV_EXT_P_STAT 16 bit r/w Ext. PHY Specific Status *****/ -+#define PHY_M_FC_AUTO_SEL BIT_15S /* Fiber/Copper Auto Sel. Dis. */ -+#define PHY_M_FC_AN_REG_ACC BIT_14S /* Fiber/Copper AN Reg. Access */ -+#define PHY_M_FC_RESOLUTION BIT_13S /* Fiber/Copper Resolution */ -+#define PHY_M_SER_IF_AN_BP BIT_12S /* Ser. IF AN Bypass Enable */ -+#define PHY_M_SER_IF_BP_ST BIT_11S /* Ser. IF AN Bypass Status */ -+#define PHY_M_IRQ_POLARITY BIT_10S /* IRQ polarity */ -+#define PHY_M_DIS_AUT_MED BIT_9S /* Disable Aut. Medium Reg. Selection */ -+ /* (88E1111 only) */ -+ /* Bit 9.. 4: reserved (88E1040 only) */ -+#define PHY_M_UNDOC1 BIT_7S /* undocumented bit !! */ -+#define PHY_M_DTE_POW_STAT BIT_4S /* DTE Power Status (88E1111 only) */ -+#define PHY_M_MODE_MASK 0xf /* Bit 3.. 0: copy of HWCFG MODE[3:0] */ - - /***** PHY_MARV_CABLE_DIAG 16 bit r/o Cable Diagnostic Reg *****/ --#define PHY_M_CABD_ENA_TEST (1<<15) /* Bit 15: Enable Test */ --#define PHY_M_CABD_STAT_MSK (3<<13) /* Bit 14..13: Status */ -- /* Bit 12.. 8: reserved */ --#define PHY_M_CABD_DIST_MSK 0xff /* Bit 7.. 0: Distance */ -+#define PHY_M_CABD_ENA_TEST BIT_15S /* Enable Test (Page 0) */ -+#define PHY_M_CABD_DIS_WAIT BIT_15S /* Disable Waiting Period (Page 1) */ -+ /* (88E1111 only) */ -+#define PHY_M_CABD_STAT_MSK (3<<13) /* Bit 14..13: Status Mask */ -+#define PHY_M_CABD_AMPL_MSK (0x1f<<8) /* Bit 12.. 8: Amplitude Mask */ -+ /* (88E1111 only) */ -+#define PHY_M_CABD_DIST_MSK 0xff /* Bit 7.. 0: Distance Mask */ - - /* values for Cable Diagnostic Status (11=fail; 00=OK; 10=open; 01=short) */ - #define CABD_STAT_NORMAL 0 -@@ -1271,6 +1361,79 @@ extern "C" { - #define CABD_STAT_OPEN 2 - #define CABD_STAT_FAIL 3 - -+/* for 10/100 Fast Ethernet PHY (88E3082 only) */ -+/***** PHY_MARV_FE_LED_PAR 16 bit r/w LED Parallel Select Reg. *****/ -+ /* Bit 15..12: reserved (used internally) */ -+#define PHY_M_FELP_LED2_MSK (0xf<<8) /* Bit 11.. 8: LED2 Mask (LINK) */ -+#define PHY_M_FELP_LED1_MSK (0xf<<4) /* Bit 7.. 4: LED1 Mask (ACT) */ -+#define PHY_M_FELP_LED0_MSK 0xf /* Bit 3.. 0: LED0 Mask (SPEED) */ -+ -+#define PHY_M_FELP_LED2_CTRL(x) (SHIFT8(x) & PHY_M_FELP_LED2_MSK) -+#define PHY_M_FELP_LED1_CTRL(x) (SHIFT4(x) & PHY_M_FELP_LED1_MSK) -+#define PHY_M_FELP_LED0_CTRL(x) (SHIFT0(x) & PHY_M_FELP_LED0_MSK) -+ -+#define LED_PAR_CTRL_COLX 0x00 -+#define LED_PAR_CTRL_ERROR 0x01 -+#define LED_PAR_CTRL_DUPLEX 0x02 -+#define LED_PAR_CTRL_DP_COL 0x03 -+#define LED_PAR_CTRL_SPEED 0x04 -+#define LED_PAR_CTRL_LINK 0x05 -+#define LED_PAR_CTRL_TX 0x06 -+#define LED_PAR_CTRL_RX 0x07 -+#define LED_PAR_CTRL_ACT 0x08 -+#define LED_PAR_CTRL_LNK_RX 0x09 -+#define LED_PAR_CTRL_LNK_AC 0x0a -+#define LED_PAR_CTRL_ACT_BL 0x0b -+#define LED_PAR_CTRL_TX_BL 0x0c -+#define LED_PAR_CTRL_RX_BL 0x0d -+#define LED_PAR_CTRL_COL_BL 0x0e -+#define LED_PAR_CTRL_INACT 0x0f -+ -+/***** PHY_MARV_FE_SPEC_2 16 bit r/w Specific Control Reg. 2 *****/ -+#define PHY_M_FESC_DIS_WAIT BIT_2S /* Disable TDR Waiting Period */ -+#define PHY_M_FESC_ENA_MCLK BIT_1S /* Enable MAC Rx Clock in sleep mode */ -+#define PHY_M_FESC_SEL_CL_A BIT_0S /* Select Class A driver (100B-TX) */ -+ -+/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */ -+/***** PHY_MARV_PHY_CTRL (page 1) 16 bit r/w Fiber Specific Ctrl *****/ -+#define PHY_M_FIB_FORCE_LNK BIT_10S /* Force Link Good */ -+#define PHY_M_FIB_SIGD_POL BIT_9S /* SIGDET Polarity */ -+#define PHY_M_FIB_TX_DIS BIT_3S /* Transmitter Disable */ -+ -+/***** PHY_MARV_PHY_CTRL (page 2) 16 bit r/w MAC Specific Ctrl *****/ -+#define PHY_M_MAC_MD_MSK (7<<7) /* Bit 9.. 7: Mode Select Mask */ -+#define PHY_M_MAC_GMIF_PUP BIT_3S /* GMII Power Up (88E1149 only) */ -+ -+#define PHY_M_MAC_MD_AUTO 3 /* Auto Copper/1000Base-X */ -+#define PHY_M_MAC_MD_COPPER 5 /* Copper only */ -+#define PHY_M_MAC_MD_1000BX 7 /* 1000Base-X only */ -+#define PHY_M_MAC_MODE_SEL(x) (SHIFT7(x) & PHY_M_MAC_MD_MSK) -+ -+/***** PHY_MARV_PHY_CTRL (page 3) 16 bit r/w LED Control Reg. *****/ -+#define PHY_M_LEDC_LOS_MSK (0xf<<12) /* Bit 15..12: LOS LED Ctrl. Mask */ -+#define PHY_M_LEDC_INIT_MSK (0xf<<8) /* Bit 11.. 8: INIT LED Ctrl. Mask */ -+#define PHY_M_LEDC_STA1_MSK (0xf<<4) /* Bit 7.. 4: STAT1 LED Ctrl. Mask */ -+#define PHY_M_LEDC_STA0_MSK 0xf /* Bit 3.. 0: STAT0 LED Ctrl. Mask */ -+ -+#define PHY_M_LEDC_LOS_CTRL(x) (SHIFT12(x) & PHY_M_LEDC_LOS_MSK) -+#define PHY_M_LEDC_INIT_CTRL(x) (SHIFT8(x) & PHY_M_LEDC_INIT_MSK) -+#define PHY_M_LEDC_STA1_CTRL(x) (SHIFT4(x) & PHY_M_LEDC_STA1_MSK) -+#define PHY_M_LEDC_STA0_CTRL(x) (SHIFT0(x) & PHY_M_LEDC_STA0_MSK) -+ -+/***** PHY_MARV_PHY_STAT (page 3) 16 bit r/w Polarity Control Reg. *****/ -+#define PHY_M_POLC_LS1M_MSK (0xf<<12) /* Bit 15..12: LOS,STAT1 Mix % Mask */ -+#define PHY_M_POLC_IS0M_MSK (0xf<<8) /* Bit 11.. 8: INIT,STAT0 Mix % Mask */ -+#define PHY_M_POLC_LOS_MSK (0x3<<6) /* Bit 7.. 6: LOS Pol. Ctrl. Mask */ -+#define PHY_M_POLC_INIT_MSK (0x3<<4) /* Bit 5.. 4: INIT Pol. Ctrl. Mask */ -+#define PHY_M_POLC_STA1_MSK (0x3<<2) /* Bit 3.. 2: STAT1 Pol. Ctrl. Mask */ -+#define PHY_M_POLC_STA0_MSK 0x3 /* Bit 1.. 0: STAT0 Pol. Ctrl. Mask */ -+ -+#define PHY_M_POLC_LS1_P_MIX(x) (SHIFT12(x) & PHY_M_POLC_LS1M_MSK) -+#define PHY_M_POLC_IS0_P_MIX(x) (SHIFT8(x) & PHY_M_POLC_IS0M_MSK) -+#define PHY_M_POLC_LOS_CTRL(x) (SHIFT6(x) & PHY_M_POLC_LOS_MSK) -+#define PHY_M_POLC_INIT_CTRL(x) (SHIFT4(x) & PHY_M_POLC_INIT_MSK) -+#define PHY_M_POLC_STA1_CTRL(x) (SHIFT2(x) & PHY_M_POLC_STA1_MSK) -+#define PHY_M_POLC_STA0_CTRL(x) (SHIFT0(x) & PHY_M_POLC_STA0_MSK) - - /* - * GMAC registers -@@ -1431,141 +1594,159 @@ extern "C" { - */ - - /* GM_GP_STAT 16 bit r/o General Purpose Status Register */ --#define GM_GPSR_SPEED (1<<15) /* Bit 15: Port Speed (1 = 100 Mbps) */ --#define GM_GPSR_DUPLEX (1<<14) /* Bit 14: Duplex Mode (1 = Full) */ --#define GM_GPSR_FC_TX_DIS (1<<13) /* Bit 13: Tx Flow-Control Mode Disabled */ --#define GM_GPSR_LINK_UP (1<<12) /* Bit 12: Link Up Status */ --#define GM_GPSR_PAUSE (1<<11) /* Bit 11: Pause State */ --#define GM_GPSR_TX_ACTIVE (1<<10) /* Bit 10: Tx in Progress */ --#define GM_GPSR_EXC_COL (1<<9) /* Bit 9: Excessive Collisions Occured */ --#define GM_GPSR_LAT_COL (1<<8) /* Bit 8: Late Collisions Occured */ -- /* Bit 7..6: reserved */ --#define GM_GPSR_PHY_ST_CH (1<<5) /* Bit 5: PHY Status Change */ --#define GM_GPSR_GIG_SPEED (1<<4) /* Bit 4: Gigabit Speed (1 = 1000 Mbps) */ --#define GM_GPSR_PART_MODE (1<<3) /* Bit 3: Partition mode */ --#define GM_GPSR_FC_RX_DIS (1<<2) /* Bit 2: Rx Flow-Control Mode Disabled */ --#define GM_GPSR_PROM_EN (1<<1) /* Bit 1: Promiscuous Mode Enabled */ -- /* Bit 0: reserved */ -- -+#define GM_GPSR_SPEED BIT_15S /* Port Speed (1 = 100 Mbps) */ -+#define GM_GPSR_DUPLEX BIT_14S /* Duplex Mode (1 = Full) */ -+#define GM_GPSR_FC_TX_DIS BIT_13S /* Tx Flow-Control Mode Disabled */ -+#define GM_GPSR_LINK_UP BIT_12S /* Link Up Status */ -+#define GM_GPSR_PAUSE BIT_11S /* Pause State */ -+#define GM_GPSR_TX_ACTIVE BIT_10S /* Tx in Progress */ -+#define GM_GPSR_EXC_COL BIT_9S /* Excessive Collisions Occured */ -+#define GM_GPSR_LAT_COL BIT_8S /* Late Collisions Occured */ -+ /* Bit 7.. 6: reserved */ -+#define GM_GPSR_PHY_ST_CH BIT_5S /* PHY Status Change */ -+#define GM_GPSR_GIG_SPEED BIT_4S /* Gigabit Speed (1 = 1000 Mbps) */ -+#define GM_GPSR_PART_MODE BIT_3S /* Partition mode */ -+#define GM_GPSR_FC_RX_DIS BIT_2S /* Rx Flow-Control Mode Disabled */ -+ /* Bit 2.. 0: reserved */ -+ - /* GM_GP_CTRL 16 bit r/w General Purpose Control Register */ -- /* Bit 15: reserved */ --#define GM_GPCR_PROM_ENA (1<<14) /* Bit 14: Enable Promiscuous Mode */ --#define GM_GPCR_FC_TX_DIS (1<<13) /* Bit 13: Disable Tx Flow-Control Mode */ --#define GM_GPCR_TX_ENA (1<<12) /* Bit 12: Enable Transmit */ --#define GM_GPCR_RX_ENA (1<<11) /* Bit 11: Enable Receive */ --#define GM_GPCR_BURST_ENA (1<<10) /* Bit 10: Enable Burst Mode */ --#define GM_GPCR_LOOP_ENA (1<<9) /* Bit 9: Enable MAC Loopback Mode */ --#define GM_GPCR_PART_ENA (1<<8) /* Bit 8: Enable Partition Mode */ --#define GM_GPCR_GIGS_ENA (1<<7) /* Bit 7: Gigabit Speed (1000 Mbps) */ --#define GM_GPCR_FL_PASS (1<<6) /* Bit 6: Force Link Pass */ --#define GM_GPCR_DUP_FULL (1<<5) /* Bit 5: Full Duplex Mode */ --#define GM_GPCR_FC_RX_DIS (1<<4) /* Bit 4: Disable Rx Flow-Control Mode */ --#define GM_GPCR_SPEED_100 (1<<3) /* Bit 3: Port Speed 100 Mbps */ --#define GM_GPCR_AU_DUP_DIS (1<<2) /* Bit 2: Disable Auto-Update Duplex */ --#define GM_GPCR_AU_FCT_DIS (1<<1) /* Bit 1: Disable Auto-Update Flow-C. */ --#define GM_GPCR_AU_SPD_DIS (1<<0) /* Bit 0: Disable Auto-Update Speed */ -+#define GM_GPCR_RMII_PH_ENA BIT_15S /* Enable RMII for PHY (Yukon-FE only) */ -+#define GM_GPCR_RMII_LB_ENA BIT_14S /* Enable RMII Loopback (Yukon-FE only) */ -+#define GM_GPCR_FC_TX_DIS BIT_13S /* Disable Tx Flow-Control Mode */ -+#define GM_GPCR_TX_ENA BIT_12S /* Enable Transmit */ -+#define GM_GPCR_RX_ENA BIT_11S /* Enable Receive */ -+ /* Bit 10: reserved */ -+#define GM_GPCR_LOOP_ENA BIT_9S /* Enable MAC Loopback Mode */ -+#define GM_GPCR_PART_ENA BIT_8S /* Enable Partition Mode */ -+#define GM_GPCR_GIGS_ENA BIT_7S /* Gigabit Speed (1000 Mbps) */ -+#define GM_GPCR_FL_PASS BIT_6S /* Force Link Pass */ -+#define GM_GPCR_DUP_FULL BIT_5S /* Full Duplex Mode */ -+#define GM_GPCR_FC_RX_DIS BIT_4S /* Disable Rx Flow-Control Mode */ -+#define GM_GPCR_SPEED_100 BIT_3S /* Port Speed 100 Mbps */ -+#define GM_GPCR_AU_DUP_DIS BIT_2S /* Disable Auto-Update Duplex */ -+#define GM_GPCR_AU_FCT_DIS BIT_1S /* Disable Auto-Update Flow-C. */ -+#define GM_GPCR_AU_SPD_DIS BIT_0S /* Disable Auto-Update Speed */ - - #define GM_GPCR_SPEED_1000 (GM_GPCR_GIGS_ENA | GM_GPCR_SPEED_100) - #define GM_GPCR_AU_ALL_DIS (GM_GPCR_AU_DUP_DIS | GM_GPCR_AU_FCT_DIS |\ - GM_GPCR_AU_SPD_DIS) -- -+ - /* GM_TX_CTRL 16 bit r/w Transmit Control Register */ --#define GM_TXCR_FORCE_JAM (1<<15) /* Bit 15: Force Jam / Flow-Control */ --#define GM_TXCR_CRC_DIS (1<<14) /* Bit 14: Disable insertion of CRC */ --#define GM_TXCR_PAD_DIS (1<<13) /* Bit 13: Disable padding of packets */ --#define GM_TXCR_COL_THR_MSK (1<<10) /* Bit 12..10: Collision Threshold */ -+#define GM_TXCR_FORCE_JAM BIT_15S /* Force Jam / Flow-Control */ -+#define GM_TXCR_CRC_DIS BIT_14S /* Disable insertion of CRC */ -+#define GM_TXCR_PAD_DIS BIT_13S /* Disable padding of packets */ -+#define GM_TXCR_COL_THR_MSK (7<<10) /* Bit 12..10: Collision Threshold Mask */ -+ /* Bit 9.. 8: reserved */ -+#define GM_TXCR_PAD_PAT_MSK 0xff /* Bit 7.. 0: Padding Pattern Mask */ -+ /* (Yukon-2 only) */ - - #define TX_COL_THR(x) (SHIFT10(x) & GM_TXCR_COL_THR_MSK) - - #define TX_COL_DEF 0x04 -- -+ - /* GM_RX_CTRL 16 bit r/w Receive Control Register */ --#define GM_RXCR_UCF_ENA (1<<15) /* Bit 15: Enable Unicast filtering */ --#define GM_RXCR_MCF_ENA (1<<14) /* Bit 14: Enable Multicast filtering */ --#define GM_RXCR_CRC_DIS (1<<13) /* Bit 13: Remove 4-byte CRC */ --#define GM_RXCR_PASS_FC (1<<12) /* Bit 12: Pass FC packets to FIFO */ -- -+#define GM_RXCR_UCF_ENA BIT_15S /* Enable Unicast filtering */ -+#define GM_RXCR_MCF_ENA BIT_14S /* Enable Multicast filtering */ -+#define GM_RXCR_CRC_DIS BIT_13S /* Remove 4-byte CRC */ -+#define GM_RXCR_PASS_FC BIT_12S /* Pass FC packets to FIFO (Yukon-1 only) */ -+ /* Bit 11.. 0: reserved */ -+ - /* GM_TX_PARAM 16 bit r/w Transmit Parameter Register */ --#define GM_TXPA_JAMLEN_MSK (0x03<<14) /* Bit 15..14: Jam Length */ --#define GM_TXPA_JAMIPG_MSK (0x1f<<9) /* Bit 13..9: Jam IPG */ --#define GM_TXPA_JAMDAT_MSK (0x1f<<4) /* Bit 8..4: IPG Jam to Data */ -- /* Bit 3..0: reserved */ -+#define GM_TXPA_JAMLEN_MSK (3<<14) /* Bit 15..14: Jam Length Mask */ -+#define GM_TXPA_JAMIPG_MSK (0x1f<<9) /* Bit 13.. 9: Jam IPG Mask */ -+#define GM_TXPA_JAMDAT_MSK (0x1f<<4) /* Bit 8.. 4: IPG Jam to Data Mask */ -+#define GM_TXPA_BO_LIM_MSK 0x0f /* Bit 3.. 0: Backoff Limit Mask */ -+ /* (Yukon-2 only) */ - - #define TX_JAM_LEN_VAL(x) (SHIFT14(x) & GM_TXPA_JAMLEN_MSK) - #define TX_JAM_IPG_VAL(x) (SHIFT9(x) & GM_TXPA_JAMIPG_MSK) - #define TX_IPG_JAM_DATA(x) (SHIFT4(x) & GM_TXPA_JAMDAT_MSK) -+#define TX_BACK_OFF_LIM(x) ((x) & GM_TXPA_BO_LIM_MSK) - - #define TX_JAM_LEN_DEF 0x03 - #define TX_JAM_IPG_DEF 0x0b - #define TX_IPG_JAM_DEF 0x1c -+#define TX_BOF_LIM_DEF 0x04 - - /* GM_SERIAL_MODE 16 bit r/w Serial Mode Register */ --#define GM_SMOD_DATABL_MSK (0x1f<<11) /* Bit 15..11: Data Blinder (r/o) */ --#define GM_SMOD_LIMIT_4 (1<<10) /* Bit 10: 4 consecutive Tx trials */ --#define GM_SMOD_VLAN_ENA (1<<9) /* Bit 9: Enable VLAN (Max. Frame Len) */ --#define GM_SMOD_JUMBO_ENA (1<<8) /* Bit 8: Enable Jumbo (Max. Frame Len) */ -- /* Bit 7..5: reserved */ --#define GM_SMOD_IPG_MSK 0x1f /* Bit 4..0: Inter-Packet Gap (IPG) */ -- -+#define GM_SMOD_DATABL_MSK (0x1f<<11) /* Bit 15..11: Data Blinder */ -+ /* r/o on Yukon, r/w on Yukon-EC */ -+#define GM_SMOD_LIMIT_4 BIT_10S /* 4 consecutive Tx trials */ -+#define GM_SMOD_VLAN_ENA BIT_9S /* Enable VLAN (Max. Frame Len) */ -+#define GM_SMOD_JUMBO_ENA BIT_8S /* Enable Jumbo (Max. Frame Len) */ -+ /* Bit 7.. 5: reserved */ -+#define GM_SMOD_IPG_MSK 0x1f /* Bit 4.. 0: Inter-Packet Gap (IPG) */ -+ - #define DATA_BLIND_VAL(x) (SHIFT11(x) & GM_SMOD_DATABL_MSK) --#define DATA_BLIND_DEF 0x04 -+#define IPG_DATA_VAL(x) ((x) & GM_SMOD_IPG_MSK) - --#define IPG_DATA_VAL(x) (x & GM_SMOD_IPG_MSK) -+#define DATA_BLIND_DEF 0x04 - #define IPG_DATA_DEF 0x1e - - /* GM_SMI_CTRL 16 bit r/w SMI Control Register */ - #define GM_SMI_CT_PHY_A_MSK (0x1f<<11) /* Bit 15..11: PHY Device Address */ - #define GM_SMI_CT_REG_A_MSK (0x1f<<6) /* Bit 10.. 6: PHY Register Address */ --#define GM_SMI_CT_OP_RD (1<<5) /* Bit 5: OpCode Read (0=Write)*/ --#define GM_SMI_CT_RD_VAL (1<<4) /* Bit 4: Read Valid (Read completed) */ --#define GM_SMI_CT_BUSY (1<<3) /* Bit 3: Busy (Operation in progress) */ -- /* Bit 2..0: reserved */ -- -+#define GM_SMI_CT_OP_RD BIT_5S /* OpCode Read (0=Write)*/ -+#define GM_SMI_CT_RD_VAL BIT_4S /* Read Valid (Read completed) */ -+#define GM_SMI_CT_BUSY BIT_3S /* Busy (Operation in progress) */ -+ /* Bit 2.. 0: reserved */ -+ - #define GM_SMI_CT_PHY_AD(x) (SHIFT11(x) & GM_SMI_CT_PHY_A_MSK) - #define GM_SMI_CT_REG_AD(x) (SHIFT6(x) & GM_SMI_CT_REG_A_MSK) - -- /* GM_PHY_ADDR 16 bit r/w GPHY Address Register */ -- /* Bit 15..6: reserved */ --#define GM_PAR_MIB_CLR (1<<5) /* Bit 5: Set MIB Clear Counter Mode */ --#define GM_PAR_MIB_TST (1<<4) /* Bit 4: MIB Load Counter (Test Mode) */ -- /* Bit 3..0: reserved */ -- -+/* GM_PHY_ADDR 16 bit r/w GPHY Address Register */ -+ /* Bit 15.. 6: reserved */ -+#define GM_PAR_MIB_CLR BIT_5S /* Set MIB Clear Counter Mode */ -+#define GM_PAR_MIB_TST BIT_4S /* MIB Load Counter (Test Mode) */ -+ /* Bit 3.. 0: reserved */ -+ - /* Receive Frame Status Encoding */ --#define GMR_FS_LEN (0xffffUL<<16) /* Bit 31..16: Rx Frame Length */ -+#define GMR_FS_LEN_MSK (0xffffUL<<16) /* Bit 31..16: Rx Frame Length */ - /* Bit 15..14: reserved */ --#define GMR_FS_VLAN (1L<<13) /* Bit 13: VLAN Packet */ --#define GMR_FS_JABBER (1L<<12) /* Bit 12: Jabber Packet */ --#define GMR_FS_UN_SIZE (1L<<11) /* Bit 11: Undersize Packet */ --#define GMR_FS_MC (1L<<10) /* Bit 10: Multicast Packet */ --#define GMR_FS_BC (1L<<9) /* Bit 9: Broadcast Packet */ --#define GMR_FS_RX_OK (1L<<8) /* Bit 8: Receive OK (Good Packet) */ --#define GMR_FS_GOOD_FC (1L<<7) /* Bit 7: Good Flow-Control Packet */ --#define GMR_FS_BAD_FC (1L<<6) /* Bit 6: Bad Flow-Control Packet */ --#define GMR_FS_MII_ERR (1L<<5) /* Bit 5: MII Error */ --#define GMR_FS_LONG_ERR (1L<<4) /* Bit 4: Too Long Packet */ --#define GMR_FS_FRAGMENT (1L<<3) /* Bit 3: Fragment */ -+#define GMR_FS_VLAN BIT_13 /* VLAN Packet */ -+#define GMR_FS_JABBER BIT_12 /* Jabber Packet */ -+#define GMR_FS_UN_SIZE BIT_11 /* Undersize Packet */ -+#define GMR_FS_MC BIT_10 /* Multicast Packet */ -+#define GMR_FS_BC BIT_9 /* Broadcast Packet */ -+#define GMR_FS_RX_OK BIT_8 /* Receive OK (Good Packet) */ -+#define GMR_FS_GOOD_FC BIT_7 /* Good Flow-Control Packet */ -+#define GMR_FS_BAD_FC BIT_6 /* Bad Flow-Control Packet */ -+#define GMR_FS_MII_ERR BIT_5 /* MII Error */ -+#define GMR_FS_LONG_ERR BIT_4 /* Too Long Packet */ -+#define GMR_FS_FRAGMENT BIT_3 /* Fragment */ - /* Bit 2: reserved */ --#define GMR_FS_CRC_ERR (1L<<1) /* Bit 1: CRC Error */ --#define GMR_FS_RX_FF_OV (1L<<0) /* Bit 0: Rx FIFO Overflow */ -+#define GMR_FS_CRC_ERR BIT_1 /* CRC Error */ -+#define GMR_FS_RX_FF_OV BIT_0 /* Rx FIFO Overflow */ -+ -+#define GMR_FS_LEN_SHIFT 16 - - /* - * GMR_FS_ANY_ERR (analogous to XMR_FS_ANY_ERR) - */ --#define GMR_FS_ANY_ERR (GMR_FS_CRC_ERR | \ -- GMR_FS_LONG_ERR | \ -+#ifdef SK_DIAG -+#define GMR_FS_ANY_ERR ( \ -+ GMR_FS_RX_FF_OV | \ -+ GMR_FS_CRC_ERR | \ -+ GMR_FS_FRAGMENT | \ - GMR_FS_MII_ERR | \ - GMR_FS_BAD_FC | \ - GMR_FS_GOOD_FC | \ - GMR_FS_JABBER) -- --/* Rx GMAC FIFO Flush Mask (default) */ --#define RX_FF_FL_DEF_MSK (GMR_FS_CRC_ERR | \ -+#else -+#define GMR_FS_ANY_ERR ( \ - GMR_FS_RX_FF_OV | \ -+ GMR_FS_CRC_ERR | \ -+ GMR_FS_FRAGMENT | \ -+ GMR_FS_LONG_ERR | \ - GMR_FS_MII_ERR | \ - GMR_FS_BAD_FC | \ - GMR_FS_GOOD_FC | \ - GMR_FS_UN_SIZE | \ - GMR_FS_JABBER) -+#endif -+ -+/* Rx GMAC FIFO Flush Mask (default) */ -+#define RX_FF_FL_DEF_MSK GMR_FS_ANY_ERR - - /* typedefs *******************************************************************/ - -@@ -1577,3 +1758,4 @@ extern "C" { - #endif /* __cplusplus */ - - #endif /* __INC_XMAC_H */ -+ ---- ./drivers/net/sk98lin/Makefile.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/Makefile 2006-04-04 13:13:34.000000000 +0400 -@@ -1,6 +1,59 @@ -+#****************************************************************************** - # --# Makefile for the SysKonnect SK-98xx device driver. -+# Name: skge.c -+# Project: GEnesis, PCI Gigabit Ethernet Adapter -+# Version: $Revision: 1.9.2.1 $ -+# Date: $Date: 2005/04/11 09:01:18 $ -+# Purpose: The main driver source module - # -+#****************************************************************************** -+ -+#****************************************************************************** -+# -+# (C)Copyright 1998-2002 SysKonnect GmbH. -+# (C)Copyright 2002-2005 Marvell. -+# -+# Makefile for Marvell Yukon chipset and SysKonnect Gigabit Ethernet -+# Server Adapter driver. (Kernel 2.6) -+# -+# Author: Mirko Lindner (mlindner@syskonnect.de) -+# Ralph Roesler (rroesler@syskonnect.de) -+# -+# Address all question to: linux@syskonnect.de -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# The information in this file is provided "AS IS" without warranty. -+# -+#****************************************************************************** -+ -+#****************************************************************************** -+# -+# History: -+# -+# $Log: Makefile2.6,v $ -+# Revision 1.9.2.1 2005/04/11 09:01:18 mlindner -+# Fix: Copyright year changed -+# -+# Revision 1.9 2004/07/13 15:54:50 rroesler -+# Add: file skethtool.c -+# Fix: corrected header regarding copyright -+# Fix: minor typos corrected -+# -+# Revision 1.8 2004/06/08 08:39:38 mlindner -+# Fix: Add CONFIG_SK98LIN_ZEROCOPY as default -+# -+# Revision 1.7 2004/06/03 16:06:56 mlindner -+# Fix: Added compile flag SK_DIAG_SUPPORT -+# -+# Revision 1.6 2004/06/02 08:02:59 mlindner -+# Add: Changed header information and inserted a GPL statement -+# -+# -+#****************************************************************************** - - - # -@@ -13,13 +66,16 @@ - obj-$(CONFIG_SK98LIN) += sk98lin.o - sk98lin-objs := \ - skge.o \ -+ sky2.o \ -+ skethtool.o \ -+ sky2le.o \ - skdim.o \ - skaddr.o \ - skgehwt.o \ - skgeinit.o \ - skgepnmi.o \ - skgesirq.o \ -- ski2c.o \ -+ sktwsi.o \ - sklm80.o \ - skqueue.o \ - skrlmt.o \ -@@ -76,13 +132,11 @@ endif - # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources - # SK_DBGCAT_DRV_EVENT 0x08000000 driver events - --EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) -+EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_USE_CSUM -DSK_DIAG_SUPPORT \ -+ -DGENESIS -DYUKON -DYUK2 -DCONFIG_SK98LIN_ZEROCOPY \ -+ $(DBGDEF) $(SKPARAM) - - clean: - rm -f core *.o *.a *.s - - -- -- -- -- ---- ./drivers/net/sk98lin/skaddr.c.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/skaddr.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skaddr.c - * Project: Gigabit Ethernet Adapters, ADDR-Module -- * Version: $Revision: 1.52 $ -- * Date: $Date: 2003/06/02 13:46:15 $ -+ * Version: $Revision: 2.8 $ -+ * Date: $Date: 2005/07/21 12:01:30 $ - * Purpose: Manage Addresses (Multicast and Unicast) and Promiscuous Mode. - * - ******************************************************************************/ -@@ -11,7 +11,7 @@ - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -44,7 +44,7 @@ - - #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: skaddr.c,v 1.52 2003/06/02 13:46:15 tschilli Exp $ (C) Marvell."; -+ "@(#) $Id: skaddr.c,v 2.8 2005/07/21 12:01:30 tschilli Exp $ (C) Marvell."; - #endif /* DEBUG ||!LINT || !SK_SLIM */ - - #define __SKADDR_C -@@ -58,11 +58,10 @@ extern "C" { - - /* defines ********************************************************************/ - -- - #define XMAC_POLY 0xEDB88320UL /* CRC32-Poly - XMAC: Little Endian */ - #define GMAC_POLY 0x04C11DB7L /* CRC16-Poly - GMAC: Little Endian */ - #define HASH_BITS 6 /* #bits in hash */ --#define SK_MC_BIT 0x01 -+#define SK_MC_BIT 0x01 - - /* Error numbers and messages. */ - -@@ -79,7 +78,7 @@ extern "C" { - - /* 64-bit hash values with all bits set. */ - --SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; -+SK_U16 OnesHash[4] = {0xffff, 0xffff, 0xffff, 0xffff}; - - /* local variables ************************************************************/ - -@@ -136,13 +135,12 @@ int Level) /* initialization level */ - - switch (Level) { - case SK_INIT_DATA: -- SK_MEMSET((char *) &pAC->Addr, (SK_U8) 0, -- (SK_U16) sizeof(SK_ADDR)); -+ SK_MEMSET((char *)&pAC->Addr, (SK_U8)0, (SK_U16)sizeof(SK_ADDR)); - - for (i = 0; i < SK_MAX_MACS; i++) { - pAPort = &pAC->Addr.Port[i]; - pAPort->PromMode = SK_PROM_MODE_NONE; -- -+ - pAPort->FirstExactMatchRlmt = SK_ADDR_FIRST_MATCH_RLMT; - pAPort->FirstExactMatchDrv = SK_ADDR_FIRST_MATCH_DRV; - pAPort->NextExactMatchRlmt = SK_ADDR_FIRST_MATCH_RLMT; -@@ -159,7 +157,7 @@ int Level) /* initialization level */ - /* pAC->Addr.InitDone = SK_INIT_DATA; */ - break; - -- case SK_INIT_IO: -+ case SK_INIT_IO: - #ifndef SK_NO_RLMT - for (i = 0; i < SK_MAX_NETS; i++) { - pAC->Addr.Net[i].ActivePort = pAC->Rlmt.Net[i].ActivePort; -@@ -173,7 +171,7 @@ int Level) /* initialization level */ - } - } - #endif /* DEBUG */ -- -+ - /* Read permanent logical MAC address from Control Register File. */ - for (j = 0; j < SK_MAC_ADDR_LEN; j++) { - InAddr = (SK_U8 *) &pAC->Addr.Net[0].PermanentMacAddress.a[j]; -@@ -191,11 +189,11 @@ int Level) /* initialization level */ - pAC->Addr.Port[pAC->Addr.Net[0].ActivePort].Exact[0] = - pAC->Addr.Net[0].CurrentMacAddress; - #if SK_MAX_NETS > 1 -- /* Set logical MAC address for net 2 to (log | 3). */ -+ /* Set logical MAC address for net 2 to. */ - if (!pAC->Addr.Net[1].CurrentMacAddressSet) { - pAC->Addr.Net[1].PermanentMacAddress = - pAC->Addr.Net[0].PermanentMacAddress; -- pAC->Addr.Net[1].PermanentMacAddress.a[5] |= 3; -+ pAC->Addr.Net[1].PermanentMacAddress.a[5] += 1; - /* Set the current logical MAC address to the permanent one. */ - pAC->Addr.Net[1].CurrentMacAddress = - pAC->Addr.Net[1].PermanentMacAddress; -@@ -213,8 +211,8 @@ int Level) /* initialization level */ - pAC->Addr.Net[i].PermanentMacAddress.a[2], - pAC->Addr.Net[i].PermanentMacAddress.a[3], - pAC->Addr.Net[i].PermanentMacAddress.a[4], -- pAC->Addr.Net[i].PermanentMacAddress.a[5])) -- -+ pAC->Addr.Net[i].PermanentMacAddress.a[5])); -+ - SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_INIT, - ("Logical MAC Address (Net%d): %02X %02X %02X %02X %02X %02X\n", - i, -@@ -223,7 +221,7 @@ int Level) /* initialization level */ - pAC->Addr.Net[i].CurrentMacAddress.a[2], - pAC->Addr.Net[i].CurrentMacAddress.a[3], - pAC->Addr.Net[i].CurrentMacAddress.a[4], -- pAC->Addr.Net[i].CurrentMacAddress.a[5])) -+ pAC->Addr.Net[i].CurrentMacAddress.a[5])); - } - #endif /* DEBUG */ - -@@ -266,8 +264,8 @@ int Level) /* initialization level */ - pAPort->PermanentMacAddress.a[2], - pAPort->PermanentMacAddress.a[3], - pAPort->PermanentMacAddress.a[4], -- pAPort->PermanentMacAddress.a[5])) -- -+ pAPort->PermanentMacAddress.a[5])); -+ - SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_INIT, - ("SkAddrInit: Physical MAC Address: %02X %02X %02X %02X %02X %02X\n", - pAPort->CurrentMacAddress.a[0], -@@ -275,7 +273,7 @@ int Level) /* initialization level */ - pAPort->CurrentMacAddress.a[2], - pAPort->CurrentMacAddress.a[3], - pAPort->CurrentMacAddress.a[4], -- pAPort->CurrentMacAddress.a[5])) -+ pAPort->CurrentMacAddress.a[5])); - #endif /* DEBUG */ - } - /* pAC->Addr.InitDone = SK_INIT_IO; */ -@@ -299,7 +297,7 @@ int Level) /* initialization level */ - } - - return (SK_ADDR_SUCCESS); -- -+ - } /* SkAddrInit */ - - #ifndef SK_SLIM -@@ -333,16 +331,20 @@ SK_U32 PortNumber, /* Index of affected - int Flags) /* permanent/non-perm, sw-only */ - { - int ReturnCode; -- -+ - if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { - return (SK_ADDR_ILLEGAL_PORT); - } -- -+ - if (pAC->GIni.GIGenesis) { -+#ifdef GENESIS - ReturnCode = SkAddrXmacMcClear(pAC, IoC, PortNumber, Flags); -+#endif - } - else { -+#ifdef YUKON - ReturnCode = SkAddrGmacMcClear(pAC, IoC, PortNumber, Flags); -+#endif - } - - return (ReturnCode); -@@ -352,7 +354,7 @@ int Flags) /* permanent/non-perm, sw-o - #endif /* !SK_SLIM */ - - #ifndef SK_SLIM -- -+#ifdef GENESIS - /****************************************************************************** - * - * SkAddrXmacMcClear - clear the multicast table -@@ -402,13 +404,13 @@ int Flags) /* permanent/non-perm, sw-o - } - - return (SK_ADDR_SUCCESS); -- --} /* SkAddrXmacMcClear */ - -+} /* SkAddrXmacMcClear */ -+#endif /* GENESIS */ - #endif /* !SK_SLIM */ - - #ifndef SK_SLIM -- -+#ifdef YUKON - /****************************************************************************** - * - * SkAddrGmacMcClear - clear the multicast table -@@ -447,38 +449,37 @@ int Flags) /* permanent/non-perm, sw-o - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[4], - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[5], - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[6], -- pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7])) -+ pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7])); - #endif /* DEBUG */ - - /* Clear InexactFilter */ - for (i = 0; i < 8; i++) { - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] = 0; - } -- -+ - if (Flags & SK_ADDR_PERMANENT) { /* permanent => RLMT */ -- -+ - /* Copy DRV bits to InexactFilter. */ - for (i = 0; i < 8; i++) { - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |= - pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i]; -- -+ - /* Clear InexactRlmtFilter. */ - pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i] = 0; -- -- } -+ } - } - else { /* not permanent => DRV */ -- -+ - /* Copy RLMT bits to InexactFilter. */ - for (i = 0; i < 8; i++) { - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |= - pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i]; -- -+ - /* Clear InexactDrvFilter. */ - pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i] = 0; - } - } -- -+ - #ifdef DEBUG - SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, - ("GMAC InexactFilter (cleared): %02X %02X %02X %02X %02X %02X %02X %02X\n", -@@ -489,19 +490,20 @@ int Flags) /* permanent/non-perm, sw-o - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[4], - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[5], - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[6], -- pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7])) -+ pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7])); - #endif /* DEBUG */ -- -+ - if (!(Flags & SK_MC_SW_ONLY)) { - (void) SkAddrGmacMcUpdate(pAC, IoC, PortNumber); - } -- -+ - return (SK_ADDR_SUCCESS); - - } /* SkAddrGmacMcClear */ -+#endif /* YUKON */ - - #ifndef SK_ADDR_CHEAT -- -+#ifdef GENESIS - /****************************************************************************** - * - * SkXmacMcHash - hash multicast address -@@ -538,8 +540,9 @@ unsigned char *pMc) /* Multicast address - return (Crc & ((1 << HASH_BITS) - 1)); - - } /* SkXmacMcHash */ -+#endif /* GENESIS */ - -- -+#ifdef YUKON - /****************************************************************************** - * - * SkGmacMcHash - hash multicast address -@@ -570,7 +573,7 @@ unsigned char *pMc) /* Multicast address - for (Byte = 0; Byte < 6; Byte++) { - /* Get next byte. */ - Data = (SK_U32) pMc[Byte]; -- -+ - /* Change bit order in byte. */ - TmpData = Data; - for (Bit = 0; Bit < 8; Bit++) { -@@ -582,7 +585,7 @@ unsigned char *pMc) /* Multicast address - } - TmpData >>= 1; - } -- -+ - Crc ^= (Data << 24); - for (Bit = 0; Bit < 8; Bit++) { - if (Crc & 0x80000000) { -@@ -593,11 +596,11 @@ unsigned char *pMc) /* Multicast address - } - } - } -- -+ - return (Crc & ((1 << HASH_BITS) - 1)); - - } /* SkGmacMcHash */ -- -+#endif /* YUKON */ - #endif /* !SK_ADDR_CHEAT */ - - /****************************************************************************** -@@ -632,23 +635,27 @@ SK_MAC_ADDR *pMc, /* multicast address - int Flags) /* permanent/non-permanent */ - { - int ReturnCode; -- -+ - if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { - return (SK_ADDR_ILLEGAL_PORT); - } -- -+ - if (pAC->GIni.GIGenesis) { -+#ifdef GENESIS - ReturnCode = SkAddrXmacMcAdd(pAC, IoC, PortNumber, pMc, Flags); -+#endif - } - else { -+#ifdef YUKON - ReturnCode = SkAddrGmacMcAdd(pAC, IoC, PortNumber, pMc, Flags); -+#endif - } - - return (ReturnCode); - - } /* SkAddrMcAdd */ - -- -+#ifdef GENESIS - /****************************************************************************** - * - * SkAddrXmacMcAdd - add a multicast address to a port -@@ -693,7 +700,7 @@ int Flags) /* permanent/non-permanent - return (SK_MC_RLMT_OVERFLOW); - } - #endif /* DEBUG */ -- -+ - if (pAC->Addr.Port[PortNumber].NextExactMatchRlmt > - SK_ADDR_LAST_MATCH_RLMT) { - return (SK_MC_RLMT_OVERFLOW); -@@ -714,7 +721,7 @@ int Flags) /* permanent/non-permanent - return (SK_MC_RLMT_OVERFLOW); - } - #endif /* DEBUG */ -- -+ - if (pAC->Addr.Port[PortNumber].NextExactMatchDrv <= SK_ADDR_LAST_MATCH_DRV) { - - /* Set exact match entry. */ -@@ -758,8 +765,9 @@ int Flags) /* permanent/non-permanent - } - - } /* SkAddrXmacMcAdd */ -+#endif /* GENESIS */ - -- -+#ifdef YUKON - /****************************************************************************** - * - * SkAddrGmacMcAdd - add a multicast address to a port -@@ -789,28 +797,29 @@ int Flags) /* permanent/non-permanent - #ifndef SK_ADDR_CHEAT - SK_U32 HashBit; - #endif /* !defined(SK_ADDR_CHEAT) */ -- -+ - if (!(pMc->a[0] & SK_MC_BIT)) { - /* Hashing only possible with multicast addresses */ - return (SK_MC_ILLEGAL_ADDRESS); - } -- -+ - #ifndef SK_ADDR_CHEAT -- -+ - /* Compute hash value of address. */ - HashBit = SkGmacMcHash(&pMc->a[0]); -- -+ - if (Flags & SK_ADDR_PERMANENT) { /* permanent => RLMT */ -- -+ - /* Add bit to InexactRlmtFilter. */ - pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[HashBit / 8] |= - 1 << (HashBit % 8); -- -+ - /* Copy bit to InexactFilter. */ - for (i = 0; i < 8; i++) { - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |= - pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i]; - } -+ - #ifdef DEBUG - SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, - ("GMAC InexactRlmtFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n", -@@ -821,20 +830,21 @@ int Flags) /* permanent/non-permanent - pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[4], - pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[5], - pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[6], -- pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[7])) -+ pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[7])); - #endif /* DEBUG */ - } - else { /* not permanent => DRV */ -- -+ - /* Add bit to InexactDrvFilter. */ - pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[HashBit / 8] |= - 1 << (HashBit % 8); -- -+ - /* Copy bit to InexactFilter. */ - for (i = 0; i < 8; i++) { - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |= - pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i]; - } -+ - #ifdef DEBUG - SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, - ("GMAC InexactDrvFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n", -@@ -845,22 +855,22 @@ int Flags) /* permanent/non-permanent - pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[4], - pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[5], - pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[6], -- pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[7])) -+ pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[7])); - #endif /* DEBUG */ - } -- -+ - #else /* SK_ADDR_CHEAT */ -- -+ - /* Set all bits in InexactFilter. */ - for (i = 0; i < 8; i++) { - pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] = 0xFF; - } - #endif /* SK_ADDR_CHEAT */ -- -+ - return (SK_MC_FILTERING_INEXACT); -- --} /* SkAddrGmacMcAdd */ - -+} /* SkAddrGmacMcAdd */ -+#endif /* YUKON */ - #endif /* !SK_SLIM */ - - /****************************************************************************** -@@ -892,7 +902,8 @@ SK_AC *pAC, /* adapter context */ - SK_IOC IoC, /* I/O context */ - SK_U32 PortNumber) /* Port Number */ - { -- int ReturnCode; -+ int ReturnCode = SK_ADDR_ILLEGAL_PORT; -+ - #if (!defined(SK_SLIM) || defined(DEBUG)) - if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { - return (SK_ADDR_ILLEGAL_PORT); -@@ -948,13 +959,13 @@ SK_U32 PortNumber) /* Port Number */ - SK_ADDR_PORT *pAPort; - - SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, -- ("SkAddrXmacMcUpdate on Port %u.\n", PortNumber)) -- -+ ("SkAddrXmacMcUpdate on Port %u.\n", PortNumber)); -+ - pAPort = &pAC->Addr.Port[PortNumber]; - - #ifdef DEBUG - SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, -- ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber])) -+ ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber])); - #endif /* DEBUG */ - - /* Start with 0 to also program the logical MAC address. */ -@@ -966,7 +977,7 @@ SK_U32 PortNumber) /* Port Number */ - - /* Clear other permanent exact match addresses on XMAC */ - if (pAPort->NextExactMatchRlmt <= SK_ADDR_LAST_MATCH_RLMT) { -- -+ - SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchRlmt, - SK_ADDR_LAST_MATCH_RLMT); - } -@@ -978,7 +989,7 @@ SK_U32 PortNumber) /* Port Number */ - - /* Clear other non-permanent exact match addresses on XMAC */ - if (pAPort->NextExactMatchDrv <= SK_ADDR_LAST_MATCH_DRV) { -- -+ - SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchDrv, - SK_ADDR_LAST_MATCH_DRV); - } -@@ -988,18 +999,18 @@ SK_U32 PortNumber) /* Port Number */ - } - - if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) { -- -+ - /* Set all bits in 64-bit hash register. */ - XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash); -- -+ - /* Enable Hashing */ - SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); - } - else if (Inexact != 0) { -- -+ - /* Set 64-bit hash register to InexactFilter. */ - XM_OUTHASH(IoC, PortNumber, XM_HSM, &pAPort->InexactFilter.Bytes[0]); -- -+ - /* Enable Hashing */ - SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); - } -@@ -1014,7 +1025,7 @@ SK_U32 PortNumber) /* Port Number */ - - /* Set port's current physical MAC address. */ - OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0]; -- -+ - XM_OUTADDR(IoC, PortNumber, XM_SA, OutAddr); - - #ifdef xDEBUG -@@ -1024,9 +1035,9 @@ SK_U32 PortNumber) /* Port Number */ - - /* Get exact match address i from port PortNumber. */ - InAddr = (SK_U16 *) &InAddr8[0]; -- -+ - XM_INADDR(IoC, PortNumber, XM_EXM(i), InAddr); -- -+ - SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, - ("SkAddrXmacMcUpdate: MC address %d on Port %u: ", - "%02x %02x %02x %02x %02x %02x -- %02x %02x %02x %02x %02x %02x\n", -@@ -1043,7 +1054,7 @@ SK_U32 PortNumber) /* Port Number */ - pAPort->Exact[i].a[2], - pAPort->Exact[i].a[3], - pAPort->Exact[i].a[4], -- pAPort->Exact[i].a[5])) -+ pAPort->Exact[i].a[5])); - } - #endif /* DEBUG */ - -@@ -1054,7 +1065,7 @@ SK_U32 PortNumber) /* Port Number */ - else { - return (SK_MC_FILTERING_INEXACT); - } -- -+ - } /* SkAddrXmacMcUpdate */ - - #endif /* GENESIS */ -@@ -1095,37 +1106,37 @@ SK_U32 PortNumber) /* Port Number */ - SK_ADDR_PORT *pAPort; - - SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, -- ("SkAddrGmacMcUpdate on Port %u.\n", PortNumber)) -- -+ ("SkAddrGmacMcUpdate on Port %u.\n", PortNumber)); -+ - pAPort = &pAC->Addr.Port[PortNumber]; - - #ifdef DEBUG - SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, -- ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber])) -+ ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber])); - #endif /* DEBUG */ -- -+ - #ifndef SK_SLIM - for (Inexact = 0, i = 0; i < 8; i++) { - Inexact |= pAPort->InexactFilter.Bytes[i]; - } -- -+ - /* Set 64-bit hash register to InexactFilter. */ - GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, - &pAPort->InexactFilter.Bytes[0]); -- -- if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) { -- -+ -+ if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) { -+ - /* Set all bits in 64-bit hash register. */ - GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash); -- -+ - /* Enable Hashing */ - SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); - } -- else { -+ else { - /* Enable Hashing. */ - SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); - } -- -+ - if (pAPort->PromMode != SK_PROM_MODE_NONE) { - (void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode); - } -@@ -1136,19 +1147,19 @@ SK_U32 PortNumber) /* Port Number */ - - /* Enable Hashing */ - SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); -- -+ - (void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode); -- -+ - #endif /* SK_SLIM */ -- -+ - /* Set port's current physical MAC address. */ - OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0]; - GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_1L, OutAddr); -- -+ - /* Set port's current logical MAC address. */ - OutAddr = (SK_U16 *) &pAPort->Exact[0].a[0]; - GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_2L, OutAddr); -- -+ - #ifdef DEBUG - SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, - ("SkAddrGmacMcUpdate: Permanent Physical MAC Address: %02X %02X %02X %02X %02X %02X\n", -@@ -1157,8 +1168,8 @@ SK_U32 PortNumber) /* Port Number */ - pAPort->Exact[0].a[2], - pAPort->Exact[0].a[3], - pAPort->Exact[0].a[4], -- pAPort->Exact[0].a[5])) -- -+ pAPort->Exact[0].a[5])); -+ - SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, - ("SkAddrGmacMcUpdate: Physical MAC Address: %02X %02X %02X %02X %02X %02X\n", - pAPort->CurrentMacAddress.a[0], -@@ -1166,9 +1177,9 @@ SK_U32 PortNumber) /* Port Number */ - pAPort->CurrentMacAddress.a[2], - pAPort->CurrentMacAddress.a[3], - pAPort->CurrentMacAddress.a[4], -- pAPort->CurrentMacAddress.a[5])) -+ pAPort->CurrentMacAddress.a[5])); - #endif /* DEBUG */ -- -+ - #ifndef SK_SLIM - /* Determine return value. */ - if (Inexact == 0 && pAPort->PromMode == 0) { -@@ -1180,7 +1191,7 @@ SK_U32 PortNumber) /* Port Number */ - #else /* SK_SLIM */ - return (SK_MC_FILTERING_INEXACT); - #endif /* SK_SLIM */ -- -+ - } /* SkAddrGmacMcUpdate */ - - #endif /* YUKON */ -@@ -1275,26 +1286,46 @@ int Flags) /* logical/physical MAC - (void) SkAddrMcUpdate(pAC, IoC, PortNumber); - } - else if (Flags & SK_ADDR_PHYSICAL_ADDRESS) { /* Physical MAC address. */ -- if (SK_ADDR_EQUAL(pNewAddr->a, -- pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) { -- return (SK_ADDR_DUPLICATE_ADDRESS); -- } -- - for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) { - if (!pAC->Addr.Port[i].CurrentMacAddressSet) { - return (SK_ADDR_TOO_EARLY); - } -+ } - -+ /* -+ * In dual net mode it should be possible to set all MAC -+ * addresses independently. Therefore the equality checks -+ * against the locical address of the same port and the -+ * physical address of the other port are suppressed here. -+ */ -+#ifndef SK_NO_RLMT -+ if (pAC->Rlmt.NumNets == 1) { -+#endif /* SK_NO_RLMT */ - if (SK_ADDR_EQUAL(pNewAddr->a, -- pAC->Addr.Port[i].CurrentMacAddress.a)) { -- if (i == PortNumber) { -- return (SK_ADDR_SUCCESS); -- } -- else { -- return (SK_ADDR_DUPLICATE_ADDRESS); -+ pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) { -+ return (SK_ADDR_DUPLICATE_ADDRESS); -+ } -+ -+ for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) { -+ if (SK_ADDR_EQUAL(pNewAddr->a, -+ pAC->Addr.Port[i].CurrentMacAddress.a)) { -+ if (i == PortNumber) { -+ return (SK_ADDR_SUCCESS); -+ } -+ else { -+ return (SK_ADDR_DUPLICATE_ADDRESS); -+ } - } - } -+#ifndef SK_NO_RLMT - } -+ else { -+ if (SK_ADDR_EQUAL(pNewAddr->a, -+ pAC->Addr.Port[PortNumber].CurrentMacAddress.a)) { -+ return (SK_ADDR_SUCCESS); -+ } -+ } -+#endif /* SK_NO_RLMT */ - - pAC->Addr.Port[PortNumber].PreviousMacAddress = - pAC->Addr.Port[PortNumber].CurrentMacAddress; -@@ -1325,18 +1356,32 @@ int Flags) /* logical/physical MAC - pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) { - return (SK_ADDR_SUCCESS); - } -- -+ - for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) { - if (!pAC->Addr.Port[i].CurrentMacAddressSet) { - return (SK_ADDR_TOO_EARLY); - } -+ } - -- if (SK_ADDR_EQUAL(pNewAddr->a, -- pAC->Addr.Port[i].CurrentMacAddress.a)) { -- return (SK_ADDR_DUPLICATE_ADDRESS); -+ /* -+ * In dual net mode on Yukon-2 adapters the physical address -+ * of port 0 and the logical address of port 1 are equal - in -+ * this case the equality check of the physical address leads -+ * to an error and is suppressed here. -+ */ -+#ifndef SK_NO_RLMT -+ if (pAC->Rlmt.NumNets == 1) { -+#endif /* SK_NO_RLMT */ -+ for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) { -+ if (SK_ADDR_EQUAL(pNewAddr->a, -+ pAC->Addr.Port[i].CurrentMacAddress.a)) { -+ return (SK_ADDR_DUPLICATE_ADDRESS); -+ } - } -+#ifndef SK_NO_RLMT - } -- -+#endif /* SK_NO_RLMT */ -+ - /* - * In case that the physical and the logical MAC addresses are equal - * we must also change the physical MAC address here. -@@ -1345,11 +1390,11 @@ int Flags) /* logical/physical MAC - */ - if (SK_ADDR_EQUAL(pAC->Addr.Port[PortNumber].CurrentMacAddress.a, - pAC->Addr.Port[PortNumber].Exact[0].a)) { -- -+ - pAC->Addr.Port[PortNumber].PreviousMacAddress = - pAC->Addr.Port[PortNumber].CurrentMacAddress; - pAC->Addr.Port[PortNumber].CurrentMacAddress = *pNewAddr; -- -+ - #ifndef SK_NO_RLMT - /* Report address change to RLMT. */ - Para.Para32[0] = PortNumber; -@@ -1357,7 +1402,7 @@ int Flags) /* logical/physical MAC - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_PORT_ADDR, Para); - #endif /* !SK_NO_RLMT */ - } -- -+ - #ifndef SK_NO_RLMT - /* Set PortNumber to number of net's active port. */ - PortNumber = pAC->Rlmt.Net[NetNumber]. -@@ -1373,8 +1418,8 @@ int Flags) /* logical/physical MAC - pAC->Addr.Net[NetNumber].PermanentMacAddress.a[2], - pAC->Addr.Net[NetNumber].PermanentMacAddress.a[3], - pAC->Addr.Net[NetNumber].PermanentMacAddress.a[4], -- pAC->Addr.Net[NetNumber].PermanentMacAddress.a[5])) -- -+ pAC->Addr.Net[NetNumber].PermanentMacAddress.a[5])); -+ - SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, - ("SkAddrOverride: New logical MAC Address: %02X %02X %02X %02X %02X %02X\n", - pAC->Addr.Net[NetNumber].CurrentMacAddress.a[0], -@@ -1382,17 +1427,16 @@ int Flags) /* logical/physical MAC - pAC->Addr.Net[NetNumber].CurrentMacAddress.a[2], - pAC->Addr.Net[NetNumber].CurrentMacAddress.a[3], - pAC->Addr.Net[NetNumber].CurrentMacAddress.a[4], -- pAC->Addr.Net[NetNumber].CurrentMacAddress.a[5])) -+ pAC->Addr.Net[NetNumber].CurrentMacAddress.a[5])); - #endif /* DEBUG */ - -- /* Write address to first exact match entry of active port. */ -- (void) SkAddrMcUpdate(pAC, IoC, PortNumber); -+ /* Write address to first exact match entry of active port. */ -+ (void)SkAddrMcUpdate(pAC, IoC, PortNumber); - } - - return (SK_ADDR_SUCCESS); -- --} /* SkAddrOverride */ - -+} /* SkAddrOverride */ - - #endif /* SK_NO_MAO */ - -@@ -1424,7 +1468,8 @@ SK_IOC IoC, /* I/O context */ - SK_U32 PortNumber, /* port whose promiscuous mode changes */ - int NewPromMode) /* new promiscuous mode */ - { -- int ReturnCode; -+ int ReturnCode = SK_ADDR_ILLEGAL_PORT; -+ - #if (!defined(SK_SLIM) || defined(DEBUG)) - if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { - return (SK_ADDR_ILLEGAL_PORT); -@@ -1489,17 +1534,18 @@ int NewPromMode) /* new promiscuous mod - /* Promiscuous mode! */ - CurPromMode |= SK_PROM_MODE_LLC; - } -- -+ - for (Inexact = 0xFF, i = 0; i < 8; i++) { - Inexact &= pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i]; - } -+ - if (Inexact == 0xFF) { - CurPromMode |= (pAC->Addr.Port[PortNumber].PromMode & SK_PROM_MODE_ALL_MC); - } - else { - /* Get InexactModeBit (bit XM_MD_ENA_HASH in mode register) */ - XM_IN16(IoC, PortNumber, XM_MODE, &LoMode); -- -+ - InexactModeBit = (LoMode & XM_MD_ENA_HASH) != 0; - - /* Read 64-bit hash register from XMAC */ -@@ -1522,7 +1568,7 @@ int NewPromMode) /* new promiscuous mod - - if ((NewPromMode & SK_PROM_MODE_ALL_MC) && - !(CurPromMode & SK_PROM_MODE_ALL_MC)) { /* All MC. */ -- -+ - /* Set all bits in 64-bit hash register. */ - XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash); - -@@ -1558,9 +1604,9 @@ int NewPromMode) /* new promiscuous mod - /* Clear Promiscuous Mode */ - SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_FALSE); - } -- -+ - return (SK_ADDR_SUCCESS); -- -+ - } /* SkAddrXmacPromiscuousChange */ - - #endif /* GENESIS */ -@@ -1607,22 +1653,25 @@ int NewPromMode) /* new promiscuous mod - CurPromMode |= (pAC->Addr.Port[PortNumber].PromMode & SK_PROM_MODE_ALL_MC); - } - -+ /* dummy read after GM_IN16() */ -+ SK_IN16(IoC, B0_RAP, &ReceiveControl); -+ - pAC->Addr.Port[PortNumber].PromMode = NewPromMode; - - if (NewPromMode == CurPromMode) { - return (SK_ADDR_SUCCESS); - } -- -+ - if ((NewPromMode & SK_PROM_MODE_ALL_MC) && - !(CurPromMode & SK_PROM_MODE_ALL_MC)) { /* All MC */ -- -+ - /* Set all bits in 64-bit hash register. */ - GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash); -- -+ - /* Enable Hashing */ - SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); - } -- -+ - if ((CurPromMode & SK_PROM_MODE_ALL_MC) && - !(NewPromMode & SK_PROM_MODE_ALL_MC)) { /* Norm. MC */ - -@@ -1636,19 +1685,19 @@ int NewPromMode) /* new promiscuous mod - - if ((NewPromMode & SK_PROM_MODE_LLC) && - !(CurPromMode & SK_PROM_MODE_LLC)) { /* Prom. LLC */ -- -+ - /* Set the MAC to Promiscuous Mode. */ - SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_TRUE); - } - else if ((CurPromMode & SK_PROM_MODE_LLC) && - !(NewPromMode & SK_PROM_MODE_LLC)) { /* Norm. LLC */ -- -+ - /* Clear Promiscuous Mode. */ - SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_FALSE); - } - - return (SK_ADDR_SUCCESS); -- -+ - } /* SkAddrGmacPromiscuousChange */ - - #endif /* YUKON */ -@@ -1720,33 +1769,33 @@ SK_U32 ToPortNumber) /* Port2 Index */ - pAC->Addr.Port[ToPortNumber].InexactFilter.Bytes[i]; - pAC->Addr.Port[ToPortNumber].InexactFilter.Bytes[i] = Byte; - } -- -+ - i = pAC->Addr.Port[FromPortNumber].PromMode; - pAC->Addr.Port[FromPortNumber].PromMode = pAC->Addr.Port[ToPortNumber].PromMode; - pAC->Addr.Port[ToPortNumber].PromMode = i; -- -+ - if (pAC->GIni.GIGenesis) { - DWord = pAC->Addr.Port[FromPortNumber].FirstExactMatchRlmt; - pAC->Addr.Port[FromPortNumber].FirstExactMatchRlmt = - pAC->Addr.Port[ToPortNumber].FirstExactMatchRlmt; - pAC->Addr.Port[ToPortNumber].FirstExactMatchRlmt = DWord; -- -+ - DWord = pAC->Addr.Port[FromPortNumber].NextExactMatchRlmt; - pAC->Addr.Port[FromPortNumber].NextExactMatchRlmt = - pAC->Addr.Port[ToPortNumber].NextExactMatchRlmt; - pAC->Addr.Port[ToPortNumber].NextExactMatchRlmt = DWord; -- -+ - DWord = pAC->Addr.Port[FromPortNumber].FirstExactMatchDrv; - pAC->Addr.Port[FromPortNumber].FirstExactMatchDrv = - pAC->Addr.Port[ToPortNumber].FirstExactMatchDrv; - pAC->Addr.Port[ToPortNumber].FirstExactMatchDrv = DWord; -- -+ - DWord = pAC->Addr.Port[FromPortNumber].NextExactMatchDrv; - pAC->Addr.Port[FromPortNumber].NextExactMatchDrv = - pAC->Addr.Port[ToPortNumber].NextExactMatchDrv; - pAC->Addr.Port[ToPortNumber].NextExactMatchDrv = DWord; - } -- -+ - /* CAUTION: Solution works if only ports of one adapter are in use. */ - for (i = 0; (SK_U32) i < pAC->Rlmt.Net[pAC->Rlmt.Port[ToPortNumber]. - Net->NetNumber].NumPorts; i++) { -@@ -1757,12 +1806,12 @@ SK_U32 ToPortNumber) /* Port2 Index */ - /* 20001207 RA: Was "ToPortNumber;". */ - } - } -- -+ - (void) SkAddrMcUpdate(pAC, IoC, FromPortNumber); - (void) SkAddrMcUpdate(pAC, IoC, ToPortNumber); - - return (SK_ADDR_SUCCESS); -- -+ - } /* SkAddrSwap */ - - #endif /* !SK_SLIM */ ---- ./drivers/net/sk98lin/skcsum.c.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/skcsum.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skcsum.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.12 $ -- * Date: $Date: 2003/08/20 13:55:53 $ -+ * Version: $Revision: 2.1 $ -+ * Date: $Date: 2003/10/27 14:16:08 $ - * Purpose: Store/verify Internet checksum in send/receive packets. - * - ******************************************************************************/ -@@ -25,7 +25,7 @@ - - #ifndef lint - static const char SysKonnectFileId[] = -- "@(#) $Id: skcsum.c,v 1.12 2003/08/20 13:55:53 mschmid Exp $ (C) SysKonnect."; -+ "@(#) $Id: skcsum.c,v 2.1 2003/10/27 14:16:08 amock Exp $ (C) SysKonnect."; - #endif /* !lint */ - - /****************************************************************************** ---- ./drivers/net/sk98lin/skdim.c.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/skdim.c 2006-04-04 13:13:34.000000000 +0400 -@@ -1,17 +1,25 @@ - /****************************************************************************** - * -- * Name: skdim.c -- * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.5 $ -- * Date: $Date: 2003/11/28 12:55:40 $ -- * Purpose: All functions to maintain interrupt moderation -+ * Name: skdim.c -+ * Project: GEnesis, PCI Gigabit Ethernet Adapter -+ * Version: $Revision: 1.5.2.2 $ -+ * Date: $Date: 2005/05/23 13:47:33 $ -+ * Purpose: All functions regardig interrupt moderation - * - ******************************************************************************/ - - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. -+ * -+ * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet -+ * Server Adapters. -+ * -+ * Author: Ralph Roesler (rroesler@syskonnect.de) -+ * Mirko Lindner (mlindner@syskonnect.de) -+ * -+ * Address all question to: linux@syskonnect.de - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -20,723 +28,367 @@ - * - * The information in this file is provided "AS IS" without warranty. - * -- ******************************************************************************/ -+ *****************************************************************************/ - --/****************************************************************************** -- * -- * Description: -- * -- * This module is intended to manage the dynamic interrupt moderation on both -- * GEnesis and Yukon adapters. -- * -- * Include File Hierarchy: -- * -- * "skdrv1st.h" -- * "skdrv2nd.h" -- * -- ******************************************************************************/ -- --#ifndef lint --static const char SysKonnectFileId[] = -- "@(#) $Id: skdim.c,v 1.5 2003/11/28 12:55:40 rroesler Exp $ (C) SysKonnect."; --#endif -- --#define __SKADDR_C -- --#ifdef __cplusplus --#error C++ is not yet supported. --extern "C" { --#endif -- --/******************************************************************************* --** --** Includes --** --*******************************************************************************/ -- --#ifndef __INC_SKDRV1ST_H - #include "h/skdrv1st.h" --#endif -- --#ifndef __INC_SKDRV2ND_H - #include "h/skdrv2nd.h" --#endif - --#include <linux/kernel_stat.h> -- --/******************************************************************************* --** --** Defines --** --*******************************************************************************/ -- --/******************************************************************************* --** --** Typedefs --** --*******************************************************************************/ -+/****************************************************************************** -+ * -+ * Local Function Prototypes -+ * -+ *****************************************************************************/ - --/******************************************************************************* --** --** Local function prototypes --** --*******************************************************************************/ -- --static unsigned int GetCurrentSystemLoad(SK_AC *pAC); --static SK_U64 GetIsrCalls(SK_AC *pAC); --static SK_BOOL IsIntModEnabled(SK_AC *pAC); --static void SetCurrIntCtr(SK_AC *pAC); --static void EnableIntMod(SK_AC *pAC); --static void DisableIntMod(SK_AC *pAC); --static void ResizeDimTimerDuration(SK_AC *pAC); --static void DisplaySelectedModerationType(SK_AC *pAC); --static void DisplaySelectedModerationMask(SK_AC *pAC); --static void DisplayDescrRatio(SK_AC *pAC); -+static SK_U64 getIsrCalls(SK_AC *pAC); -+static SK_BOOL isIntModEnabled(SK_AC *pAC); -+static void setCurrIntCtr(SK_AC *pAC); -+static void enableIntMod(SK_AC *pAC); -+static void disableIntMod(SK_AC *pAC); - --/******************************************************************************* --** --** Global variables --** --*******************************************************************************/ -+#define M_DIMINFO pAC->DynIrqModInfo - --/******************************************************************************* --** --** Local variables --** --*******************************************************************************/ -+/****************************************************************************** -+ * -+ * Global Functions -+ * -+ *****************************************************************************/ - --/******************************************************************************* --** --** Global functions --** --*******************************************************************************/ -+/***************************************************************************** -+ * -+ * SkDimModerate - Moderates the IRQs depending on the current needs -+ * -+ * Description: -+ * Moderation of IRQs depends on the number of occurred IRQs with -+ * respect to the previous moderation cycle. -+ * -+ * Returns: N/A -+ * -+ */ -+void SkDimModerate( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_U64 IsrCalls = getIsrCalls(pAC); -+ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==> SkDimModerate\n")); -+ -+ if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -+ if (isIntModEnabled(pAC)) { -+ if (IsrCalls < M_DIMINFO.MaxModIntsPerSecLowerLimit) { -+ disableIntMod(pAC); -+ } -+ } else { -+ if (IsrCalls > M_DIMINFO.MaxModIntsPerSecUpperLimit) { -+ enableIntMod(pAC); -+ } -+ } -+ } -+ setCurrIntCtr(pAC); - --/******************************************************************************* --** Function : SkDimModerate --** Description : Called in every ISR to check if moderation is to be applied --** or not for the current number of interrupts --** Programmer : Ralph Roesler --** Last Modified: 22-mar-03 --** Returns : void (!) --** Notes : - --*******************************************************************************/ -- --void --SkDimModerate(SK_AC *pAC) { -- unsigned int CurrSysLoad = 0; /* expressed in percent */ -- unsigned int LoadIncrease = 0; /* expressed in percent */ -- SK_U64 ThresholdInts = 0; -- SK_U64 IsrCallsPerSec = 0; -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("<== SkDimModerate\n")); -+} - --#define M_DIMINFO pAC->DynIrqModInfo -+/***************************************************************************** -+ * -+ * SkDimStartModerationTimer - Starts the moderation timer -+ * -+ * Description: -+ * Dynamic interrupt moderation is regularly checked using the -+ * so-called moderation timer. This timer is started with this function. -+ * -+ * Returns: N/A -+ */ -+void SkDimStartModerationTimer( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_EVPARA EventParam; /* Event struct for timer event */ -+ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("==> SkDimStartModerationTimer\n")); - -- if (!IsIntModEnabled(pAC)) { -- if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -- CurrSysLoad = GetCurrentSystemLoad(pAC); -- if (CurrSysLoad > 75) { -- /* -- ** More than 75% total system load! Enable the moderation -- ** to shield the system against too many interrupts. -- */ -- EnableIntMod(pAC); -- } else if (CurrSysLoad > M_DIMINFO.PrevSysLoad) { -- LoadIncrease = (CurrSysLoad - M_DIMINFO.PrevSysLoad); -- if (LoadIncrease > ((M_DIMINFO.PrevSysLoad * -- C_INT_MOD_ENABLE_PERCENTAGE) / 100)) { -- if (CurrSysLoad > 10) { -- /* -- ** More than 50% increase with respect to the -- ** previous load of the system. Most likely this -- ** is due to our ISR-proc... -- */ -- EnableIntMod(pAC); -- } -- } -- } else { -- /* -- ** Neither too much system load at all nor too much increase -- ** with respect to the previous system load. Hence, we can leave -- ** the ISR-handling like it is without enabling moderation. -- */ -- } -- M_DIMINFO.PrevSysLoad = CurrSysLoad; -- } -- } else { -- if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -- ThresholdInts = ((M_DIMINFO.MaxModIntsPerSec * -- C_INT_MOD_DISABLE_PERCENTAGE) / 100); -- IsrCallsPerSec = GetIsrCalls(pAC); -- if (IsrCallsPerSec <= ThresholdInts) { -- /* -- ** The number of interrupts within the last second is -- ** lower than the disable_percentage of the desried -- ** maxrate. Therefore we can disable the moderation. -- */ -- DisableIntMod(pAC); -- M_DIMINFO.MaxModIntsPerSec = -- (M_DIMINFO.MaxModIntsPerSecUpperLimit + -- M_DIMINFO.MaxModIntsPerSecLowerLimit) / 2; -- } else { -- /* -- ** The number of interrupts per sec is the same as expected. -- ** Evalulate the descriptor-ratio. If it has changed, a resize -- ** in the moderation timer might be usefull -- */ -- if (M_DIMINFO.AutoSizing) { -- ResizeDimTimerDuration(pAC); -- } -- } -- } -- } -- -- /* -- ** Some information to the log... -- */ -- if (M_DIMINFO.DisplayStats) { -- DisplaySelectedModerationType(pAC); -- DisplaySelectedModerationMask(pAC); -- DisplayDescrRatio(pAC); -- } -+ if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -+ SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam)); -+ EventParam.Para32[0] = SK_DRV_MODERATION_TIMER; -+ SkTimerStart(pAC, pAC->IoBase, -+ &pAC->DynIrqModInfo.ModTimer, -+ pAC->DynIrqModInfo.DynIrqModSampleInterval * 1000000, -+ SKGE_DRV, SK_DRV_TIMER, EventParam); -+ } - -- M_DIMINFO.NbrProcessedDescr = 0; -- SetCurrIntCtr(pAC); -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("<== SkDimStartModerationTimer\n")); - } - --/******************************************************************************* --** Function : SkDimStartModerationTimer --** Description : Starts the audit-timer for the dynamic interrupt moderation --** Programmer : Ralph Roesler --** Last Modified: 22-mar-03 --** Returns : void (!) --** Notes : - --*******************************************************************************/ -- --void --SkDimStartModerationTimer(SK_AC *pAC) { -- SK_EVPARA EventParam; /* Event struct for timer event */ -- -- SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam)); -- EventParam.Para32[0] = SK_DRV_MODERATION_TIMER; -- SkTimerStart(pAC, pAC->IoBase, &pAC->DynIrqModInfo.ModTimer, -- SK_DRV_MODERATION_TIMER_LENGTH, -- SKGE_DRV, SK_DRV_TIMER, EventParam); --} -+/***************************************************************************** -+ * -+ * SkDimEnableModerationIfNeeded - Enables or disables any moderationtype -+ * -+ * Description: -+ * This function effectively initializes the IRQ moderation of a network -+ * adapter. Depending on the configuration, this might be either static -+ * or dynamic. If no moderation is configured, this function will do -+ * nothing. -+ * -+ * Returns: N/A -+ */ -+void SkDimEnableModerationIfNeeded( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("==> SkDimEnableModerationIfNeeded\n")); -+ -+ if (M_DIMINFO.IntModTypeSelect != C_INT_MOD_NONE) { -+ if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_STATIC) { -+ enableIntMod(pAC); -+ } else { /* must be C_INT_MOD_DYNAMIC */ -+ SkDimStartModerationTimer(pAC); -+ } -+ } - --/******************************************************************************* --** Function : SkDimEnableModerationIfNeeded --** Description : Either enables or disables moderation --** Programmer : Ralph Roesler --** Last Modified: 22-mar-03 --** Returns : void (!) --** Notes : This function is called when a particular adapter is opened --** There is no Disable function, because when all interrupts --** might be disable, the moderation timer has no meaning at all --******************************************************************************/ -- --void --SkDimEnableModerationIfNeeded(SK_AC *pAC) { -- -- if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_STATIC) { -- EnableIntMod(pAC); /* notification print in this function */ -- } else if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -- SkDimStartModerationTimer(pAC); -- if (M_DIMINFO.DisplayStats) { -- printk("Dynamic moderation has been enabled\n"); -- } -- } else { -- if (M_DIMINFO.DisplayStats) { -- printk("No moderation has been enabled\n"); -- } -- } -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("<== SkDimEnableModerationIfNeeded\n")); - } - --/******************************************************************************* --** Function : SkDimDisplayModerationSettings --** Description : Displays the current settings regaring interrupt moderation --** Programmer : Ralph Roesler --** Last Modified: 22-mar-03 --** Returns : void (!) --** Notes : - --*******************************************************************************/ -- --void --SkDimDisplayModerationSettings(SK_AC *pAC) { -- DisplaySelectedModerationType(pAC); -- DisplaySelectedModerationMask(pAC); --} -+/***************************************************************************** -+ * -+ * SkDimDisableModeration - disables moderation if it is enabled -+ * -+ * Description: -+ * Disabling of the moderation requires that is enabled already. -+ * -+ * Returns: N/A -+ */ -+void SkDimDisableModeration( -+SK_AC *pAC, /* pointer to adapter control context */ -+int CurrentModeration) /* type of current moderation */ -+{ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("==> SkDimDisableModeration\n")); -+ -+ if (M_DIMINFO.IntModTypeSelect != C_INT_MOD_NONE) { -+ if (CurrentModeration == C_INT_MOD_STATIC) { -+ disableIntMod(pAC); -+ } else { /* must be C_INT_MOD_DYNAMIC */ -+ SkTimerStop(pAC, pAC->IoBase, &M_DIMINFO.ModTimer); -+ disableIntMod(pAC); -+ } -+ } - --/******************************************************************************* --** --** Local functions --** --*******************************************************************************/ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("<== SkDimDisableModeration\n")); -+} - --/******************************************************************************* --** Function : GetCurrentSystemLoad --** Description : Retrieves the current system load of the system. This load --** is evaluated for all processors within the system. --** Programmer : Ralph Roesler --** Last Modified: 22-mar-03 --** Returns : unsigned int: load expressed in percentage --** Notes : The possible range being returned is from 0 up to 100. --** Whereas 0 means 'no load at all' and 100 'system fully loaded' --** It is impossible to determine what actually causes the system --** to be in 100%, but maybe that is due to too much interrupts. --*******************************************************************************/ -- --static unsigned int --GetCurrentSystemLoad(SK_AC *pAC) { -- unsigned long jif = jiffies; -- unsigned int UserTime = 0; -- unsigned int SystemTime = 0; -- unsigned int NiceTime = 0; -- unsigned int IdleTime = 0; -- unsigned int TotalTime = 0; -- unsigned int UsedTime = 0; -- unsigned int SystemLoad = 0; -+/****************************************************************************** -+ * -+ * Local Functions -+ * -+ *****************************************************************************/ - -- /* unsigned int NbrCpu = 0; */ -+/***************************************************************************** -+ * -+ * getIsrCalls - evaluate the number of IRQs handled in mod interval -+ * -+ * Description: -+ * Depending on the selected moderation mask, this function will return -+ * the number of interrupts handled in the previous moderation interval. -+ * This evaluated number is based on the current number of interrupts -+ * stored in PNMI-context and the previous stored interrupts. -+ * -+ * Returns: -+ * the number of IRQs handled -+ */ -+static SK_U64 getIsrCalls( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_U64 RxPort0IntDiff = 0, RxPort1IntDiff = 0; -+ SK_U64 TxPort0IntDiff = 0, TxPort1IntDiff = 0; -+ SK_U64 StatusPort0IntDiff = 0, StatusPort1IntDiff = 0; -+ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==>getIsrCalls\n")); -+ -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if ((M_DIMINFO.MaskIrqModeration == IRQ_MASK_TX_ONLY) || -+ (M_DIMINFO.MaskIrqModeration == IRQ_MASK_SP_TX)) { -+ if (pAC->GIni.GIMacsFound == 2) { -+ TxPort1IntDiff = -+ pAC->Pnmi.Port[1].TxIntrCts - -+ M_DIMINFO.PrevPort1TxIntrCts; -+ } -+ TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts - -+ M_DIMINFO.PrevPort0TxIntrCts; -+ } else if ((M_DIMINFO.MaskIrqModeration == IRQ_MASK_RX_ONLY) || -+ (M_DIMINFO.MaskIrqModeration == IRQ_MASK_SP_RX)) { -+ if (pAC->GIni.GIMacsFound == 2) { -+ RxPort1IntDiff = -+ pAC->Pnmi.Port[1].RxIntrCts - -+ M_DIMINFO.PrevPort1RxIntrCts; -+ } -+ RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - -+ M_DIMINFO.PrevPort0RxIntrCts; -+ } else { -+ if (pAC->GIni.GIMacsFound == 2) { -+ RxPort1IntDiff = -+ pAC->Pnmi.Port[1].RxIntrCts - -+ M_DIMINFO.PrevPort1RxIntrCts; -+ TxPort1IntDiff = -+ pAC->Pnmi.Port[1].TxIntrCts - -+ M_DIMINFO.PrevPort1TxIntrCts; -+ } -+ RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - -+ M_DIMINFO.PrevPort0RxIntrCts; -+ TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts - -+ M_DIMINFO.PrevPort0TxIntrCts; -+ } -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("==>getIsrCalls (!CHIP_ID_YUKON_2)\n")); -+ return (RxPort0IntDiff + RxPort1IntDiff + -+ TxPort0IntDiff + TxPort1IntDiff); -+ } - - /* -- ** The following lines have been commented out, because -- ** from kernel 2.5.44 onwards, the kernel-owned structure -- ** -- ** struct kernel_stat kstat -- ** -- ** is not marked as an exported symbol in the file -+ ** We have a Yukon2 compliant chipset if we come up to here - ** -- ** kernel/ksyms.c -- ** -- ** As a consequence, using this driver as KLM is not possible -- ** and any access of the structure kernel_stat via the -- ** dedicated macros kstat_cpu(i).cpustat.xxx is to be avoided. -- ** -- ** The kstat-information might be added again in future -- ** versions of the 2.5.xx kernel, but for the time being, -- ** number of interrupts will serve as indication how much -- ** load we currently have... -- ** -- ** for (NbrCpu = 0; NbrCpu < num_online_cpus(); NbrCpu++) { -- ** UserTime = UserTime + kstat_cpu(NbrCpu).cpustat.user; -- ** NiceTime = NiceTime + kstat_cpu(NbrCpu).cpustat.nice; -- ** SystemTime = SystemTime + kstat_cpu(NbrCpu).cpustat.system; -- ** } -+ if (pAC->GIni.GIMacsFound == 2) { -+ StatusPort1IntDiff = pAC->Pnmi.Port[1].StatusLeIntrCts - -+ M_DIMINFO.PrevPort1StatusIntrCts; -+ } -+ StatusPort0IntDiff = pAC->Pnmi.Port[0].StatusLeIntrCts - -+ M_DIMINFO.PrevPort0StatusIntrCts; - */ -- SK_U64 ThresholdInts = 0; -- SK_U64 IsrCallsPerSec = 0; -- -- ThresholdInts = ((M_DIMINFO.MaxModIntsPerSec * -- C_INT_MOD_ENABLE_PERCENTAGE) + 100); -- IsrCallsPerSec = GetIsrCalls(pAC); -- if (IsrCallsPerSec >= ThresholdInts) { -- /* -- ** We do not know how much the real CPU-load is! -- ** Return 80% as a default in order to activate DIM -- */ -- SystemLoad = 80; -- return (SystemLoad); -- } -- -- UsedTime = UserTime + NiceTime + SystemTime; -- -- IdleTime = jif * num_online_cpus() - UsedTime; -- TotalTime = UsedTime + IdleTime; -- -- SystemLoad = ( 100 * (UsedTime - M_DIMINFO.PrevUsedTime) ) / -- (TotalTime - M_DIMINFO.PrevTotalTime); -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("==>getIsrCalls (CHIP_ID_YUKON_2)\n")); -+ return (StatusPort0IntDiff + StatusPort1IntDiff); -+} - -- if (M_DIMINFO.DisplayStats) { -- printk("Current system load is: %u\n", SystemLoad); -+/***************************************************************************** -+ * -+ * setCurrIntCtr - stores the current number of interrupts -+ * -+ * Description: -+ * Stores the current number of occurred interrupts in the adapter -+ * context. This is needed to evaluate the umber of interrupts within -+ * the moderation interval. -+ * -+ * Returns: N/A -+ * -+ */ -+static void setCurrIntCtr( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==>setCurrIntCtr\n")); -+ -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if (pAC->GIni.GIMacsFound == 2) { -+ M_DIMINFO.PrevPort1RxIntrCts = pAC->Pnmi.Port[1].RxIntrCts; -+ M_DIMINFO.PrevPort1TxIntrCts = pAC->Pnmi.Port[1].TxIntrCts; -+ } -+ M_DIMINFO.PrevPort0RxIntrCts = pAC->Pnmi.Port[0].RxIntrCts; -+ M_DIMINFO.PrevPort0TxIntrCts = pAC->Pnmi.Port[0].TxIntrCts; -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("<== setCurrIntCtr (!CHIP_ID_YUKON_2)\n")); -+ return; - } - -- M_DIMINFO.PrevTotalTime = TotalTime; -- M_DIMINFO.PrevUsedTime = UsedTime; -- -- return (SystemLoad); -+ /* -+ ** We have a Yukon2 compliant chipset if we come up to here -+ ** -+ if (pAC->GIni.GIMacsFound == 2) { -+ M_DIMINFO.PrevPort1StatusIntrCts = pAC->Pnmi.Port[1].StatusLeIntrCts; -+ } -+ M_DIMINFO.PrevPort0StatusIntrCts = pAC->Pnmi.Port[0].StatusLeIntrCts; -+ */ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("<== setCurrIntCtr (CHIP_ID_YUKON_2)\n")); - } - --/******************************************************************************* --** Function : GetIsrCalls --** Description : Depending on the selected moderation mask, this function will --** return the number of interrupts handled in the previous time- --** frame. This evaluated number is based on the current number --** of interrupts stored in PNMI-context and the previous stored --** interrupts. --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : int: the number of interrupts being executed in the last --** timeframe --** Notes : It makes only sense to call this function, when dynamic --** interrupt moderation is applied --*******************************************************************************/ -- --static SK_U64 --GetIsrCalls(SK_AC *pAC) { -- SK_U64 RxPort0IntDiff = 0; -- SK_U64 RxPort1IntDiff = 0; -- SK_U64 TxPort0IntDiff = 0; -- SK_U64 TxPort1IntDiff = 0; -- -- if (pAC->DynIrqModInfo.MaskIrqModeration == IRQ_MASK_TX_ONLY) { -- if (pAC->GIni.GIMacsFound == 2) { -- TxPort1IntDiff = pAC->Pnmi.Port[1].TxIntrCts - -- pAC->DynIrqModInfo.PrevPort1TxIntrCts; -- } -- TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts - -- pAC->DynIrqModInfo.PrevPort0TxIntrCts; -- } else if (pAC->DynIrqModInfo.MaskIrqModeration == IRQ_MASK_RX_ONLY) { -- if (pAC->GIni.GIMacsFound == 2) { -- RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts - -- pAC->DynIrqModInfo.PrevPort1RxIntrCts; -- } -- RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - -- pAC->DynIrqModInfo.PrevPort0RxIntrCts; -- } else { -- if (pAC->GIni.GIMacsFound == 2) { -- RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts - -- pAC->DynIrqModInfo.PrevPort1RxIntrCts; -- TxPort1IntDiff = pAC->Pnmi.Port[1].TxIntrCts - -- pAC->DynIrqModInfo.PrevPort1TxIntrCts; -- } -- RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - -- pAC->DynIrqModInfo.PrevPort0RxIntrCts; -- TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts - -- pAC->DynIrqModInfo.PrevPort0TxIntrCts; -- } -- -- return (RxPort0IntDiff + RxPort1IntDiff + TxPort0IntDiff + TxPort1IntDiff); -+/***************************************************************************** -+ * -+ * isIntModEnabled - returns the current state of interrupt moderation -+ * -+ * Description: -+ * This function retrieves the current value of the interrupt moderation -+ * command register. Its content determines whether any moderation is -+ * running or not. -+ * -+ * Returns: -+ * SK_TRUE : IRQ moderation is currently active -+ * SK_FALSE: No IRQ moderation is active -+ */ -+static SK_BOOL isIntModEnabled( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ unsigned long CtrCmd; -+ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==>isIntModEnabled\n")); -+ -+ SK_IN32(pAC->IoBase, B2_IRQM_CTRL, &CtrCmd); -+ if ((CtrCmd & TIM_START) == TIM_START) { -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("<== isIntModEnabled (SK_TRUE)\n")); -+ return SK_TRUE; -+ } -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG, -+ ("<== isIntModEnabled (SK_FALSE)\n")); -+ return SK_FALSE; - } - --/******************************************************************************* --** Function : GetRxCalls --** Description : This function will return the number of times a receive inter- --** rupt was processed. This is needed to evaluate any resizing --** factor. --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : SK_U64: the number of RX-ints being processed --** Notes : It makes only sense to call this function, when dynamic --** interrupt moderation is applied --*******************************************************************************/ -- --static SK_U64 --GetRxCalls(SK_AC *pAC) { -- SK_U64 RxPort0IntDiff = 0; -- SK_U64 RxPort1IntDiff = 0; -- -- if (pAC->GIni.GIMacsFound == 2) { -- RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts - -- pAC->DynIrqModInfo.PrevPort1RxIntrCts; -- } -- RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - -- pAC->DynIrqModInfo.PrevPort0RxIntrCts; -- -- return (RxPort0IntDiff + RxPort1IntDiff); --} -+/***************************************************************************** -+ * -+ * enableIntMod - enables the interrupt moderation -+ * -+ * Description: -+ * Enabling the interrupt moderation is done by putting the desired -+ * moderation interval in the B2_IRQM_INI register, specifying the -+ * desired maks in the B2_IRQM_MSK register and finally starting the -+ * IRQ moderation timer using the B2_IRQM_CTRL register. -+ * -+ * Returns: N/A -+ * -+ */ -+static void enableIntMod( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ unsigned long ModBase; -+ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==> enableIntMod\n")); -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { -+ ModBase = C_CLK_FREQ_GENESIS / M_DIMINFO.MaxModIntsPerSec; -+ } else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) { -+ ModBase = C_CLK_FREQ_YUKON_EC / M_DIMINFO.MaxModIntsPerSec; -+ } else { -+ ModBase = C_CLK_FREQ_YUKON / M_DIMINFO.MaxModIntsPerSec; -+ } - --/******************************************************************************* --** Function : SetCurrIntCtr --** Description : Will store the current number orf occured interrupts in the --** adapter context. This is needed to evaluated the number of --** interrupts within a current timeframe. --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : void (!) --** Notes : - --*******************************************************************************/ -- --static void --SetCurrIntCtr(SK_AC *pAC) { -- if (pAC->GIni.GIMacsFound == 2) { -- pAC->DynIrqModInfo.PrevPort1RxIntrCts = pAC->Pnmi.Port[1].RxIntrCts; -- pAC->DynIrqModInfo.PrevPort1TxIntrCts = pAC->Pnmi.Port[1].TxIntrCts; -- } -- pAC->DynIrqModInfo.PrevPort0RxIntrCts = pAC->Pnmi.Port[0].RxIntrCts; -- pAC->DynIrqModInfo.PrevPort0TxIntrCts = pAC->Pnmi.Port[0].TxIntrCts; --} -+ SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase); -+ SK_OUT32(pAC->IoBase, B2_IRQM_MSK, M_DIMINFO.MaskIrqModeration); -+ SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START); - --/******************************************************************************* --** Function : IsIntModEnabled() --** Description : Retrieves the current value of the interrupts moderation --** command register. Its content determines whether any --** moderation is running or not. --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : SK_TRUE : if mod timer running --** SK_FALSE : if no moderation is being performed --** Notes : - --*******************************************************************************/ -- --static SK_BOOL --IsIntModEnabled(SK_AC *pAC) { -- unsigned long CtrCmd; -- -- SK_IN32(pAC->IoBase, B2_IRQM_CTRL, &CtrCmd); -- if ((CtrCmd & TIM_START) == TIM_START) { -- return SK_TRUE; -- } else { -- return SK_FALSE; -- } -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("<== enableIntMod\n")); - } - --/******************************************************************************* --** Function : EnableIntMod() --** Description : Enables the interrupt moderation using the values stored in --** in the pAC->DynIntMod data structure --** Programmer : Ralph Roesler --** Last Modified: 22-mar-03 --** Returns : - --** Notes : - --*******************************************************************************/ -- --static void --EnableIntMod(SK_AC *pAC) { -- unsigned long ModBase; -- -- if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { -- ModBase = C_CLK_FREQ_GENESIS / pAC->DynIrqModInfo.MaxModIntsPerSec; -- } else { -- ModBase = C_CLK_FREQ_YUKON / pAC->DynIrqModInfo.MaxModIntsPerSec; -- } -- -- SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase); -- SK_OUT32(pAC->IoBase, B2_IRQM_MSK, pAC->DynIrqModInfo.MaskIrqModeration); -- SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START); -- if (M_DIMINFO.DisplayStats) { -- printk("Enabled interrupt moderation (%i ints/sec)\n", -- M_DIMINFO.MaxModIntsPerSec); -- } --} -+/***************************************************************************** -+ * -+ * disableIntMod - disables the interrupt moderation -+ * -+ * Description: -+ * Disabling the interrupt moderation is done by stopping the -+ * IRQ moderation timer using the B2_IRQM_CTRL register. -+ * -+ * Returns: N/A -+ * -+ */ -+static void disableIntMod( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==> disableIntMod\n")); - --/******************************************************************************* --** Function : DisableIntMod() --** Description : Disbles the interrupt moderation independent of what inter- --** rupts are running or not --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : - --** Notes : - --*******************************************************************************/ -- --static void --DisableIntMod(SK_AC *pAC) { -- -- SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_STOP); -- if (M_DIMINFO.DisplayStats) { -- printk("Disabled interrupt moderation\n"); -- } --} -+ SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_STOP); - --/******************************************************************************* --** Function : ResizeDimTimerDuration(); --** Description : Checks the current used descriptor ratio and resizes the --** duration timer (longer/smaller) if possible. --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : - --** Notes : There are both maximum and minimum timer duration value. --** This function assumes that interrupt moderation is already --** enabled! --*******************************************************************************/ -- --static void --ResizeDimTimerDuration(SK_AC *pAC) { -- SK_BOOL IncreaseTimerDuration; -- int TotalMaxNbrDescr; -- int UsedDescrRatio; -- int RatioDiffAbs; -- int RatioDiffRel; -- int NewMaxModIntsPerSec; -- int ModAdjValue; -- long ModBase; -- -- /* -- ** Check first if we are allowed to perform any modification -- */ -- if (IsIntModEnabled(pAC)) { -- if (M_DIMINFO.IntModTypeSelect != C_INT_MOD_DYNAMIC) { -- return; -- } else { -- if (M_DIMINFO.ModJustEnabled) { -- M_DIMINFO.ModJustEnabled = SK_FALSE; -- return; -- } -- } -- } -- -- /* -- ** If we got until here, we have to evaluate the amount of the -- ** descriptor ratio change... -- */ -- TotalMaxNbrDescr = pAC->RxDescrPerRing * GetRxCalls(pAC); -- UsedDescrRatio = (M_DIMINFO.NbrProcessedDescr * 100) / TotalMaxNbrDescr; -- -- if (UsedDescrRatio > M_DIMINFO.PrevUsedDescrRatio) { -- RatioDiffAbs = (UsedDescrRatio - M_DIMINFO.PrevUsedDescrRatio); -- RatioDiffRel = (RatioDiffAbs * 100) / UsedDescrRatio; -- M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio; -- IncreaseTimerDuration = SK_FALSE; /* in other words: DECREASE */ -- } else if (UsedDescrRatio < M_DIMINFO.PrevUsedDescrRatio) { -- RatioDiffAbs = (M_DIMINFO.PrevUsedDescrRatio - UsedDescrRatio); -- RatioDiffRel = (RatioDiffAbs * 100) / M_DIMINFO.PrevUsedDescrRatio; -- M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio; -- IncreaseTimerDuration = SK_TRUE; /* in other words: INCREASE */ -- } else { -- RatioDiffAbs = (M_DIMINFO.PrevUsedDescrRatio - UsedDescrRatio); -- RatioDiffRel = (RatioDiffAbs * 100) / M_DIMINFO.PrevUsedDescrRatio; -- M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio; -- IncreaseTimerDuration = SK_TRUE; /* in other words: INCREASE */ -- } -- -- /* -- ** Now we can determine the change in percent -- */ -- if ((RatioDiffRel >= 0) && (RatioDiffRel <= 5) ) { -- ModAdjValue = 1; /* 1% change - maybe some other value in future */ -- } else if ((RatioDiffRel > 5) && (RatioDiffRel <= 10) ) { -- ModAdjValue = 1; /* 1% change - maybe some other value in future */ -- } else if ((RatioDiffRel > 10) && (RatioDiffRel <= 15) ) { -- ModAdjValue = 1; /* 1% change - maybe some other value in future */ -- } else { -- ModAdjValue = 1; /* 1% change - maybe some other value in future */ -- } -- -- if (IncreaseTimerDuration) { -- NewMaxModIntsPerSec = M_DIMINFO.MaxModIntsPerSec + -- (M_DIMINFO.MaxModIntsPerSec * ModAdjValue) / 100; -- } else { -- NewMaxModIntsPerSec = M_DIMINFO.MaxModIntsPerSec - -- (M_DIMINFO.MaxModIntsPerSec * ModAdjValue) / 100; -- } -- -- /* -- ** Check if we exceed boundaries... -- */ -- if ( (NewMaxModIntsPerSec > M_DIMINFO.MaxModIntsPerSecUpperLimit) || -- (NewMaxModIntsPerSec < M_DIMINFO.MaxModIntsPerSecLowerLimit)) { -- if (M_DIMINFO.DisplayStats) { -- printk("Cannot change ModTim from %i to %i ints/sec\n", -- M_DIMINFO.MaxModIntsPerSec, NewMaxModIntsPerSec); -- } -- return; -- } else { -- if (M_DIMINFO.DisplayStats) { -- printk("Resized ModTim from %i to %i ints/sec\n", -- M_DIMINFO.MaxModIntsPerSec, NewMaxModIntsPerSec); -- } -- } -- -- M_DIMINFO.MaxModIntsPerSec = NewMaxModIntsPerSec; -- -- if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { -- ModBase = C_CLK_FREQ_GENESIS / pAC->DynIrqModInfo.MaxModIntsPerSec; -- } else { -- ModBase = C_CLK_FREQ_YUKON / pAC->DynIrqModInfo.MaxModIntsPerSec; -- } -- -- /* -- ** We do not need to touch any other registers -- */ -- SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase); -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("<== disableIntMod\n")); - } - - /******************************************************************************* --** Function : DisplaySelectedModerationType() --** Description : Displays what type of moderation we have --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : void! --** Notes : - --*******************************************************************************/ -- --static void --DisplaySelectedModerationType(SK_AC *pAC) { -- -- if (pAC->DynIrqModInfo.DisplayStats) { -- if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) { -- printk("Static int moderation runs with %i INTS/sec\n", -- pAC->DynIrqModInfo.MaxModIntsPerSec); -- } else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -- if (IsIntModEnabled(pAC)) { -- printk("Dynamic int moderation runs with %i INTS/sec\n", -- pAC->DynIrqModInfo.MaxModIntsPerSec); -- } else { -- printk("Dynamic int moderation currently not applied\n"); -- } -- } else { -- printk("No interrupt moderation selected!\n"); -- } -- } --} -- --/******************************************************************************* --** Function : DisplaySelectedModerationMask() --** Description : Displays what interrupts are moderated --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : void! --** Notes : - --*******************************************************************************/ -- --static void --DisplaySelectedModerationMask(SK_AC *pAC) { -- -- if (pAC->DynIrqModInfo.DisplayStats) { -- if (pAC->DynIrqModInfo.IntModTypeSelect != C_INT_MOD_NONE) { -- switch (pAC->DynIrqModInfo.MaskIrqModeration) { -- case IRQ_MASK_TX_ONLY: -- printk("Only Tx-interrupts are moderated\n"); -- break; -- case IRQ_MASK_RX_ONLY: -- printk("Only Rx-interrupts are moderated\n"); -- break; -- case IRQ_MASK_SP_ONLY: -- printk("Only special-interrupts are moderated\n"); -- break; -- case IRQ_MASK_TX_RX: -- printk("Tx- and Rx-interrupts are moderated\n"); -- break; -- case IRQ_MASK_SP_RX: -- printk("Special- and Rx-interrupts are moderated\n"); -- break; -- case IRQ_MASK_SP_TX: -- printk("Special- and Tx-interrupts are moderated\n"); -- break; -- case IRQ_MASK_RX_TX_SP: -- printk("All Rx-, Tx and special-interrupts are moderated\n"); -- break; -- default: -- printk("Don't know what is moderated\n"); -- break; -- } -- } else { -- printk("No specific interrupts masked for moderation\n"); -- } -- } --} -- --/******************************************************************************* --** Function : DisplayDescrRatio --** Description : Like the name states... --** Programmer : Ralph Roesler --** Last Modified: 23-mar-03 --** Returns : void! --** Notes : - --*******************************************************************************/ -- --static void --DisplayDescrRatio(SK_AC *pAC) { -- int TotalMaxNbrDescr = 0; -- -- if (pAC->DynIrqModInfo.DisplayStats) { -- TotalMaxNbrDescr = pAC->RxDescrPerRing * GetRxCalls(pAC); -- printk("Ratio descriptors: %i/%i\n", -- M_DIMINFO.NbrProcessedDescr, TotalMaxNbrDescr); -- } --} -- --/******************************************************************************* --** --** End of file --** --*******************************************************************************/ -+ * -+ * End of file -+ * -+ ******************************************************************************/ ---- /dev/null 2006-03-09 09:48:23.770951496 +0300 -+++ ./drivers/net/sk98lin/skethtool.c 2006-04-04 13:13:34.000000000 +0400 -@@ -0,0 +1,1356 @@ -+/****************************************************************************** -+ * -+ * Name: skethtool.c -+ * Project: GEnesis, PCI Gigabit Ethernet Adapter -+ * Version: $Revision: 1.3.2.11 $ -+ * Date: $Date: 2005/10/27 12:42:34 $ -+ * Purpose: All functions regarding ethtool handling -+ * -+ ******************************************************************************/ -+ -+/****************************************************************************** -+ * -+ * (C)Copyright 1998-2002 SysKonnect GmbH. -+ * (C)Copyright 2002-2005 Marvell. -+ * -+ * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet -+ * Server Adapters. -+ * -+ * Author: Ralph Roesler (rroesler@syskonnect.de) -+ * Mirko Lindner (mlindner@syskonnect.de) -+ * -+ * Address all question to: linux@syskonnect.de -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * The information in this file is provided "AS IS" without warranty. -+ * -+ *****************************************************************************/ -+ -+#include "h/skdrv1st.h" -+#include "h/skdrv2nd.h" -+#include "h/skversion.h" -+#include <linux/ethtool.h> -+#include <linux/module.h> -+#include <linux/timer.h> -+ -+/****************************************************************************** -+ * -+ * External Functions and Data -+ * -+ *****************************************************************************/ -+ -+extern void SkDimDisableModeration(SK_AC *pAC, int CurrentModeration); -+extern void SkDimEnableModerationIfNeeded(SK_AC *pAC); -+ -+/****************************************************************************** -+ * -+ * Defines -+ * -+ *****************************************************************************/ -+ -+#ifndef ETHT_STATSTRING_LEN -+#define ETHT_STATSTRING_LEN 32 -+#endif -+ -+#define SK98LIN_STAT(m) sizeof(((SK_AC *)0)->m),offsetof(SK_AC, m) -+ -+#define SUPP_COPPER_ALL (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \ -+ SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \ -+ SUPPORTED_1000baseT_Half| SUPPORTED_1000baseT_Full| \ -+ SUPPORTED_TP) -+ -+#define ADV_COPPER_ALL (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \ -+ ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \ -+ ADVERTISED_1000baseT_Half| ADVERTISED_1000baseT_Full| \ -+ ADVERTISED_TP) -+ -+#define SUPP_FIBRE_ALL (SUPPORTED_1000baseT_Full | \ -+ SUPPORTED_FIBRE | \ -+ SUPPORTED_Autoneg) -+ -+#define ADV_FIBRE_ALL (ADVERTISED_1000baseT_Full | \ -+ ADVERTISED_FIBRE | \ -+ ADVERTISED_Autoneg) -+ -+/****************************************************************************** -+ * -+ * Local Function Prototypes -+ * -+ *****************************************************************************/ -+ -+#ifdef ETHTOOL_GSET -+static void getSettings(SK_AC *pAC, int port, struct ethtool_cmd *ecmd); -+#endif -+#ifdef ETHTOOL_SSET -+static int setSettings(SK_AC *pAC, int port, struct ethtool_cmd *ecmd); -+#endif -+#ifdef ETHTOOL_GPAUSEPARAM -+static void getPauseParams(SK_AC *pAC, int port, struct ethtool_pauseparam *epause); -+#endif -+#ifdef ETHTOOL_SPAUSEPARAM -+static int setPauseParams(SK_AC *pAC, int port, struct ethtool_pauseparam *epause); -+#endif -+#ifdef ETHTOOL_GDRVINFO -+static void getDriverInfo(SK_AC *pAC, int port, struct ethtool_drvinfo *edrvinfo); -+#endif -+#ifdef ETHTOOL_PHYS_ID -+static int startLocateNIC(SK_AC *pAC, int port, struct ethtool_value *blinkSecs); -+static void toggleLeds(unsigned long ptr); -+#endif -+#ifdef ETHTOOL_GCOALESCE -+static void getModerationParams(SK_AC *pAC, int port, struct ethtool_coalesce *ecoalesc); -+#endif -+#ifdef ETHTOOL_SCOALESCE -+static int setModerationParams(SK_AC *pAC, int port, struct ethtool_coalesce *ecoalesc); -+#endif -+#ifdef ETHTOOL_GWOL -+static void getWOLsettings(SK_AC *pAC, int port, struct ethtool_wolinfo *ewol); -+#endif -+#ifdef ETHTOOL_SWOL -+static int setWOLsettings(SK_AC *pAC, int port, struct ethtool_wolinfo *ewol); -+#endif -+ -+static int getPortNumber(struct net_device *netdev, struct ifreq *ifr); -+ -+/****************************************************************************** -+ * -+ * Local Variables -+ * -+ *****************************************************************************/ -+ -+struct sk98lin_stats { -+ char stat_string[ETHT_STATSTRING_LEN]; -+ int sizeof_stat; -+ int stat_offset; -+}; -+ -+static struct sk98lin_stats sk98lin_etht_stats_port0[] = { -+ { "rx_packets" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxOkCts) }, -+ { "tx_packets" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxOkCts) }, -+ { "rx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxOctetsOkCts) }, -+ { "tx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxOctetsOkCts) }, -+ { "rx_errors" , SK98LIN_STAT(PnmiStruct.InErrorsCts) }, -+ { "tx_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxSingleCollisionCts) }, -+ { "rx_dropped" , SK98LIN_STAT(PnmiStruct.RxNoBufCts) }, -+ { "tx_dropped" , SK98LIN_STAT(PnmiStruct.TxNoBufCts) }, -+ { "multicasts" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxMulticastOkCts) }, -+ { "collisions" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxSingleCollisionCts) }, -+ { "rx_length_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxRuntCts) }, -+ { "rx_buffer_overflow_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxFifoOverflowCts) }, -+ { "rx_crc_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxFcsCts) }, -+ { "rx_frame_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxFramingCts) }, -+ { "rx_too_short_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxShortsCts) }, -+ { "rx_too_long_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxTooLongCts) }, -+ { "rx_carrier_extension_errors", SK98LIN_STAT(PnmiStruct.Stat[0].StatRxCextCts) }, -+ { "rx_symbol_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxSymbolCts) }, -+ { "rx_llc_mac_size_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxIRLengthCts) }, -+ { "rx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxCarrierCts) }, -+ { "rx_jabber_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxJabberCts) }, -+ { "rx_missed_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxMissedCts) }, -+ { "tx_abort_collision_errors" , SK98LIN_STAT(stats.tx_aborted_errors) }, -+ { "tx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxCarrierCts) }, -+ { "tx_buffer_underrun_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxFifoUnderrunCts) }, -+ { "tx_heartbeat_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxCarrierCts) } , -+ { "tx_window_errors" , SK98LIN_STAT(stats.tx_window_errors) } -+}; -+ -+static struct sk98lin_stats sk98lin_etht_stats_port1[] = { -+ { "rx_packets" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxOkCts) }, -+ { "tx_packets" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxOkCts) }, -+ { "rx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxOctetsOkCts) }, -+ { "tx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxOctetsOkCts) }, -+ { "rx_errors" , SK98LIN_STAT(PnmiStruct.InErrorsCts) }, -+ { "tx_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxSingleCollisionCts) }, -+ { "rx_dropped" , SK98LIN_STAT(PnmiStruct.RxNoBufCts) }, -+ { "tx_dropped" , SK98LIN_STAT(PnmiStruct.TxNoBufCts) }, -+ { "multicasts" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxMulticastOkCts) }, -+ { "collisions" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxSingleCollisionCts) }, -+ { "rx_length_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxRuntCts) }, -+ { "rx_buffer_overflow_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxFifoOverflowCts) }, -+ { "rx_crc_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxFcsCts) }, -+ { "rx_frame_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxFramingCts) }, -+ { "rx_too_short_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxShortsCts) }, -+ { "rx_too_long_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxTooLongCts) }, -+ { "rx_carrier_extension_errors", SK98LIN_STAT(PnmiStruct.Stat[1].StatRxCextCts) }, -+ { "rx_symbol_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxSymbolCts) }, -+ { "rx_llc_mac_size_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxIRLengthCts) }, -+ { "rx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxCarrierCts) }, -+ { "rx_jabber_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxJabberCts) }, -+ { "rx_missed_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxMissedCts) }, -+ { "tx_abort_collision_errors" , SK98LIN_STAT(stats.tx_aborted_errors) }, -+ { "tx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxCarrierCts) }, -+ { "tx_buffer_underrun_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxFifoUnderrunCts) }, -+ { "tx_heartbeat_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxCarrierCts) } , -+ { "tx_window_errors" , SK98LIN_STAT(stats.tx_window_errors) } -+}; -+ -+#define SK98LIN_STATS_LEN sizeof(sk98lin_etht_stats_port0) / sizeof(struct sk98lin_stats) -+ -+static int nbrBlinkQuarterSeconds; -+static int currentPortIndex; -+static SK_BOOL isLocateNICrunning = SK_FALSE; -+static SK_BOOL isDualNetCard = SK_FALSE; -+static SK_BOOL doSwitchLEDsOn = SK_FALSE; -+static SK_BOOL boardWasDown[2] = { SK_FALSE, SK_FALSE }; -+static struct timer_list locateNICtimer; -+ -+/****************************************************************************** -+ * -+ * Global Functions -+ * -+ *****************************************************************************/ -+ -+/***************************************************************************** -+ * -+ * SkEthIoctl - IOCTL entry point for all ethtool queries -+ * -+ * Description: -+ * Any IOCTL request that has to deal with the ethtool command tool is -+ * dispatched via this function. -+ * -+ * Returns: -+ * ==0: everything fine, no error -+ * !=0: the return value is the error code of the failure -+ */ -+int SkEthIoctl( -+struct net_device *netdev, /* the pointer to netdev structure */ -+struct ifreq *ifr) /* what interface the request refers to? */ -+{ -+ DEV_NET *pNet = (DEV_NET*) netdev->priv; -+ SK_AC *pAC = pNet->pAC; -+ void *pAddr = ifr->ifr_data; -+ int port = getPortNumber(netdev, ifr); -+ SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; -+ SK_U32 Size = sizeof(SK_PNMI_STRUCT_DATA); -+ SK_U32 cmd; -+ struct sk98lin_stats *sk98lin_etht_stats = -+ (port == 0) ? sk98lin_etht_stats_port0 : sk98lin_etht_stats_port1; -+ -+ if (get_user(cmd, (uint32_t *) pAddr)) { -+ return -EFAULT; -+ } -+ -+ switch(cmd) { -+#ifdef ETHTOOL_GSET -+ case ETHTOOL_GSET: { -+ struct ethtool_cmd ecmd = { ETHTOOL_GSET }; -+ getSettings(pAC, port, &ecmd); -+ if(copy_to_user(pAddr, &ecmd, sizeof(ecmd))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+ break; -+#endif -+#ifdef ETHTOOL_SSET -+ case ETHTOOL_SSET: { -+ struct ethtool_cmd ecmd; -+ if(copy_from_user(&ecmd, pAddr, sizeof(ecmd))) { -+ return -EFAULT; -+ } -+ return setSettings(pAC, port, &ecmd); -+ } -+ break; -+#endif -+#ifdef ETHTOOL_GLINK -+ case ETHTOOL_GLINK: { -+ struct ethtool_value edata = { ETHTOOL_GLINK }; -+ edata.data = netif_carrier_ok(netdev); -+ if (copy_to_user(pAddr, &edata, sizeof(edata))) -+ return -EFAULT; -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_GDRVINFO -+ case ETHTOOL_GDRVINFO: { -+ struct ethtool_drvinfo drvinfo = { ETHTOOL_GDRVINFO }; -+ getDriverInfo(pAC, port, &drvinfo); -+ if(copy_to_user(pAddr, &drvinfo, sizeof(drvinfo))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+ break; -+#endif -+#ifdef ETHTOOL_GSTRINGS -+ case ETHTOOL_GSTRINGS: { -+ struct ethtool_gstrings gstrings = { ETHTOOL_GSTRINGS }; -+ char *strings = NULL; -+ int err = 0; -+ if(copy_from_user(&gstrings, pAddr, sizeof(gstrings))) { -+ return -EFAULT; -+ } -+ switch(gstrings.string_set) { -+#ifdef ETHTOOL_GSTATS -+ case ETH_SS_STATS: { -+ int i; -+ gstrings.len = SK98LIN_STATS_LEN; -+ if ((strings = kmalloc(SK98LIN_STATS_LEN*ETHT_STATSTRING_LEN,GFP_KERNEL)) == NULL) { -+ return -ENOMEM; -+ } -+ for(i=0; i < SK98LIN_STATS_LEN; i++) { -+ memcpy(&strings[i * ETHT_STATSTRING_LEN], -+ &(sk98lin_etht_stats[i].stat_string), -+ ETHT_STATSTRING_LEN); -+ } -+ } -+ break; -+#endif -+ default: -+ return -EOPNOTSUPP; -+ } -+ if(copy_to_user(pAddr, &gstrings, sizeof(gstrings))) { -+ err = -EFAULT; -+ } -+ pAddr = (void *) ((unsigned long int) pAddr + offsetof(struct ethtool_gstrings, data)); -+ if(!err && copy_to_user(pAddr, strings, gstrings.len * ETH_GSTRING_LEN)) { -+ err = -EFAULT; -+ } -+ kfree(strings); -+ return err; -+ } -+#endif -+#ifdef ETHTOOL_GSTATS -+ case ETHTOOL_GSTATS: { -+ struct { -+ struct ethtool_stats eth_stats; -+ uint64_t data[SK98LIN_STATS_LEN]; -+ } stats = { {ETHTOOL_GSTATS, SK98LIN_STATS_LEN} }; -+ int i; -+ -+ if (netif_running(pAC->dev[port])) { -+ SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, port); -+ } -+ for(i = 0; i < SK98LIN_STATS_LEN; i++) { -+ if (netif_running(pAC->dev[port])) { -+ stats.data[i] = (sk98lin_etht_stats[i].sizeof_stat == -+ sizeof(uint64_t)) ? -+ *(uint64_t *)((char *)pAC + -+ sk98lin_etht_stats[i].stat_offset) : -+ *(uint32_t *)((char *)pAC + -+ sk98lin_etht_stats[i].stat_offset); -+ } else { -+ stats.data[i] = (sk98lin_etht_stats[i].sizeof_stat == -+ sizeof(uint64_t)) ? (uint64_t) 0 : (uint32_t) 0; -+ } -+ } -+ if(copy_to_user(pAddr, &stats, sizeof(stats))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_PHYS_ID -+ case ETHTOOL_PHYS_ID: { -+ struct ethtool_value blinkSecs; -+ if(copy_from_user(&blinkSecs, pAddr, sizeof(blinkSecs))) { -+ return -EFAULT; -+ } -+ return startLocateNIC(pAC, port, &blinkSecs); -+ } -+#endif -+#ifdef ETHTOOL_GPAUSEPARAM -+ case ETHTOOL_GPAUSEPARAM: { -+ struct ethtool_pauseparam epause = { ETHTOOL_GPAUSEPARAM }; -+ getPauseParams(pAC, port, &epause); -+ if(copy_to_user(pAddr, &epause, sizeof(epause))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_SPAUSEPARAM -+ case ETHTOOL_SPAUSEPARAM: { -+ struct ethtool_pauseparam epause; -+ if(copy_from_user(&epause, pAddr, sizeof(epause))) { -+ return -EFAULT; -+ } -+ return setPauseParams(pAC, port, &epause); -+ } -+#endif -+#ifdef ETHTOOL_GSG -+ case ETHTOOL_GSG: { -+ struct ethtool_value edata = { ETHTOOL_GSG }; -+ edata.data = (netdev->features & NETIF_F_SG) != 0; -+ if (copy_to_user(pAddr, &edata, sizeof(edata))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_SSG -+ case ETHTOOL_SSG: { -+ struct ethtool_value edata; -+ if (copy_from_user(&edata, pAddr, sizeof(edata))) { -+ return -EFAULT; -+ } -+ if (pAC->ChipsetType) { /* Don't handle if Genesis */ -+ if (edata.data) { -+ netdev->features |= NETIF_F_SG; -+ } else { -+ netdev->features &= ~NETIF_F_SG; -+ } -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_GRXCSUM -+ case ETHTOOL_GRXCSUM: { -+ struct ethtool_value edata = { ETHTOOL_GRXCSUM }; -+ edata.data = pAC->RxPort[port].UseRxCsum; -+ if (copy_to_user(pAddr, &edata, sizeof(edata))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_SRXCSUM -+ case ETHTOOL_SRXCSUM: { -+ struct ethtool_value edata; -+ if (copy_from_user(&edata, pAddr, sizeof(edata))) { -+ return -EFAULT; -+ } -+ pAC->RxPort[port].UseRxCsum = edata.data; -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_GTXCSUM -+ case ETHTOOL_GTXCSUM: { -+ struct ethtool_value edata = { ETHTOOL_GTXCSUM }; -+ edata.data = ((netdev->features & NETIF_F_IP_CSUM) != 0); -+ if (copy_to_user(pAddr, &edata, sizeof(edata))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_STXCSUM -+ case ETHTOOL_STXCSUM: { -+ struct ethtool_value edata; -+ if (copy_from_user(&edata, pAddr, sizeof(edata))) { -+ return -EFAULT; -+ } -+ if (pAC->ChipsetType) { /* Don't handle if Genesis */ -+ if (edata.data) { -+ netdev->features |= NETIF_F_IP_CSUM; -+ } else { -+ netdev->features &= ~NETIF_F_IP_CSUM; -+ } -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_NWAY_RST -+ case ETHTOOL_NWAY_RST: { -+ if(netif_running(netdev)) { -+ (*netdev->stop)(netdev); -+ (*netdev->open)(netdev); -+ } -+ return 0; -+ } -+#endif -+#ifdef NETIF_F_TSO -+#ifdef ETHTOOL_GTSO -+ case ETHTOOL_GTSO: { -+ struct ethtool_value edata = { ETHTOOL_GTSO }; -+ edata.data = (netdev->features & NETIF_F_TSO) != 0; -+ if (copy_to_user(pAddr, &edata, sizeof(edata))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_STSO -+ case ETHTOOL_STSO: { -+ struct ethtool_value edata; -+ if (CHIP_ID_YUKON_2(pAC)) { -+ if (copy_from_user(&edata, pAddr, sizeof(edata))) { -+ return -EFAULT; -+ } -+ if (edata.data) { -+ netdev->features |= NETIF_F_TSO; -+ } else { -+ netdev->features &= ~NETIF_F_TSO; -+ } -+ return 0; -+ } -+ return -EOPNOTSUPP; -+ } -+#endif -+#endif -+#ifdef ETHTOOL_GCOALESCE -+ case ETHTOOL_GCOALESCE: { -+ struct ethtool_coalesce ecoalesc = { ETHTOOL_GCOALESCE }; -+ getModerationParams(pAC, port, &ecoalesc); -+ if(copy_to_user(pAddr, &ecoalesc, sizeof(ecoalesc))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_SCOALESCE -+ case ETHTOOL_SCOALESCE: { -+ struct ethtool_coalesce ecoalesc; -+ if(copy_from_user(&ecoalesc, pAddr, sizeof(ecoalesc))) { -+ return -EFAULT; -+ } -+ return setModerationParams(pAC, port, &ecoalesc); -+ } -+#endif -+#ifdef ETHTOOL_GWOL -+ case ETHTOOL_GWOL: { -+ struct ethtool_wolinfo ewol = { ETHTOOL_GWOL }; -+ getWOLsettings(pAC, port, &ewol); -+ if(copy_to_user(pAddr, &ewol, sizeof(ewol))) { -+ return -EFAULT; -+ } -+ return 0; -+ } -+#endif -+#ifdef ETHTOOL_SWOL -+ case ETHTOOL_SWOL: { -+ struct ethtool_wolinfo ewol; -+ if(copy_from_user(&ewol, pAddr, sizeof(ewol))) { -+ return -EFAULT; -+ } -+ return setWOLsettings(pAC, port, &ewol); -+ } -+#endif -+ default: -+ return -EOPNOTSUPP; -+ } -+} /* SkEthIoctl() */ -+ -+/****************************************************************************** -+ * -+ * Local Functions -+ * -+ *****************************************************************************/ -+ -+#ifdef ETHTOOL_GSET -+/***************************************************************************** -+ * -+ * getSettings - retrieves the current settings of the selected adapter -+ * -+ * Description: -+ * The current configuration of the selected adapter is returned. -+ * This configuration involves a)speed, b)duplex and c)autoneg plus -+ * a number of other variables. -+ * -+ * Returns: N/A -+ * -+ */ -+static void getSettings( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_cmd *ecmd) /* mandatory command structure for results */ -+{ -+ SK_GEPORT *pPort = &pAC->GIni.GP[port]; -+ -+ static int DuplexAutoNegConfMap[9][3]= { -+ { -1 , -1 , -1 }, -+ { 0 , -1 , -1 }, -+ { SK_LMODE_HALF , DUPLEX_HALF, AUTONEG_DISABLE }, -+ { SK_LMODE_FULL , DUPLEX_FULL, AUTONEG_DISABLE }, -+ { SK_LMODE_AUTOHALF , DUPLEX_HALF, AUTONEG_ENABLE }, -+ { SK_LMODE_AUTOFULL , DUPLEX_FULL, AUTONEG_ENABLE }, -+ { SK_LMODE_AUTOBOTH , DUPLEX_FULL, AUTONEG_ENABLE }, -+ { SK_LMODE_AUTOSENSE , -1 , -1 }, -+ { SK_LMODE_INDETERMINATED, -1 , -1 } -+ }; -+ -+ static int SpeedConfMap[6][2] = { -+ { 0 , -1 }, -+ { SK_LSPEED_AUTO , -1 }, -+ { SK_LSPEED_10MBPS , SPEED_10 }, -+ { SK_LSPEED_100MBPS , SPEED_100 }, -+ { SK_LSPEED_1000MBPS , SPEED_1000 }, -+ { SK_LSPEED_INDETERMINATED, -1 } -+ }; -+ -+ static int AdvSpeedMap[6][2] = { -+ { 0 , -1 }, -+ { SK_LSPEED_AUTO , -1 }, -+ { SK_LSPEED_10MBPS , ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full }, -+ { SK_LSPEED_100MBPS , ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full }, -+ { SK_LSPEED_1000MBPS , ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full}, -+ { SK_LSPEED_INDETERMINATED, -1 } -+ }; -+ -+ ecmd->phy_address = port; -+ ecmd->speed = SpeedConfMap[pPort->PLinkSpeedUsed][1]; -+ ecmd->duplex = DuplexAutoNegConfMap[pPort->PLinkModeStatus][1]; -+ ecmd->autoneg = DuplexAutoNegConfMap[pPort->PLinkModeStatus][2]; -+ ecmd->transceiver = XCVR_INTERNAL; -+ -+ if (pAC->GIni.GICopperType) { -+ ecmd->port = PORT_TP; -+ ecmd->supported = (SUPP_COPPER_ALL|SUPPORTED_Autoneg); -+ if (pAC->GIni.GIGenesis) { -+ ecmd->supported &= ~(SUPPORTED_10baseT_Half); -+ ecmd->supported &= ~(SUPPORTED_10baseT_Full); -+ ecmd->supported &= ~(SUPPORTED_100baseT_Half); -+ ecmd->supported &= ~(SUPPORTED_100baseT_Full); -+ } else { -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { -+ ecmd->supported &= ~(SUPPORTED_1000baseT_Half); -+ } -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) { -+ ecmd->supported &= ~(SUPPORTED_1000baseT_Half); -+ ecmd->supported &= ~(SUPPORTED_1000baseT_Full); -+ } -+ } -+ if (pAC->GIni.GP[0].PLinkSpeed != SK_LSPEED_AUTO) { -+ ecmd->advertising = AdvSpeedMap[pPort->PLinkSpeed][1]; -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { -+ ecmd->advertising &= ~(SUPPORTED_1000baseT_Half); -+ } -+ } else { -+ ecmd->advertising = ecmd->supported; -+ } -+ if (ecmd->autoneg == AUTONEG_ENABLE) { -+ ecmd->advertising |= ADVERTISED_Autoneg; -+ } else { -+ ecmd->advertising = ADVERTISED_TP; -+ } -+ } else { -+ ecmd->port = PORT_FIBRE; -+ ecmd->supported = (SUPP_FIBRE_ALL); -+ ecmd->advertising = (ADV_FIBRE_ALL); -+ } -+} -+#endif -+ -+#ifdef ETHTOOL_SSET -+/***************************************************************************** -+ * -+ * setSettings - configures the settings of a selected adapter -+ * -+ * Description: -+ * Possible settings that may be altered are a)speed, b)duplex or -+ * c)autonegotiation. -+ * -+ * Returns: -+ * ==0: everything fine, no error -+ * !=0: the return value is the error code of the failure -+ */ -+static int setSettings( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_cmd *ecmd) /* command structure containing settings */ -+{ -+ DEV_NET *pNet = (DEV_NET *) pAC->dev[port]->priv; -+ SK_U32 Instance; -+ char Buf[4]; -+ unsigned int Len = 1; -+ int Ret; -+ -+ if (port == 0) { -+ Instance = (pAC->RlmtNets == 2) ? 1 : 2; -+ } else { -+ Instance = (pAC->RlmtNets == 2) ? 2 : 3; -+ } -+ -+ if (((ecmd->autoneg == AUTONEG_DISABLE) || (ecmd->autoneg == AUTONEG_ENABLE)) && -+ ((ecmd->duplex == DUPLEX_FULL) || (ecmd->duplex == DUPLEX_HALF))) { -+ if (ecmd->autoneg == AUTONEG_DISABLE) { -+ if (ecmd->duplex == DUPLEX_FULL) { -+ *Buf = (char) SK_LMODE_FULL; -+ } else { -+ *Buf = (char) SK_LMODE_HALF; -+ } -+ } else { -+ if (ecmd->duplex == DUPLEX_FULL) { -+ *Buf = (char) SK_LMODE_AUTOFULL; -+ } else { -+ *Buf = (char) SK_LMODE_AUTOHALF; -+ } -+ } -+ -+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_LINK_MODE, -+ &Buf, &Len, Instance, pNet->NetNr); -+ -+ if (Ret != SK_PNMI_ERR_OK) { -+ return -EINVAL; -+ } -+ } else if (ecmd->autoneg == AUTONEG_ENABLE) { -+ /* Set default values */ -+ *Buf = (char) SK_LMODE_AUTOFULL; -+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_LINK_MODE, -+ &Buf, &Len, Instance, pNet->NetNr); -+ } -+ -+ if ((ecmd->speed == SPEED_1000) || -+ (ecmd->speed == SPEED_100) || -+ (ecmd->speed == SPEED_10)) { -+ if (ecmd->autoneg == AUTONEG_ENABLE) { -+ *Buf = (char) SK_LSPEED_AUTO; -+ } else if (ecmd->speed == SPEED_1000) { -+ *Buf = (char) SK_LSPEED_1000MBPS; -+ } else if (ecmd->speed == SPEED_100) { -+ *Buf = (char) SK_LSPEED_100MBPS; -+ } else { -+ *Buf = (char) SK_LSPEED_10MBPS; -+ } -+ -+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE, -+ &Buf, &Len, Instance, pNet->NetNr); -+ -+ if (Ret != SK_PNMI_ERR_OK) { -+ return -EINVAL; -+ } -+ } else if (ecmd->autoneg == AUTONEG_ENABLE) { -+ *Buf = (char) SK_LSPEED_AUTO; -+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE, -+ &Buf, &Len, Instance, pNet->NetNr); -+ } else { -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+#endif -+ -+#ifdef ETHTOOL_GPAUSEPARAM -+/***************************************************************************** -+ * -+ * getPauseParams - retrieves the pause parameters -+ * -+ * Description: -+ * All current pause parameters of a selected adapter are placed -+ * in the passed ethtool_pauseparam structure and are returned. -+ * -+ * Returns: N/A -+ * -+ */ -+static void getPauseParams( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_pauseparam *epause) /* pause parameter struct for result */ -+{ -+ SK_GEPORT *pPort = &pAC->GIni.GP[port]; -+ -+ epause->rx_pause = 0; -+ epause->tx_pause = 0; -+ -+ if (pPort->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND) { -+ epause->tx_pause = 1; -+ } -+ if ((pPort->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC) || -+ (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM)) { -+ epause->tx_pause = 1; -+ epause->rx_pause = 1; -+ } -+ -+ if ((epause->rx_pause == 0) && (epause->tx_pause == 0)) { -+ epause->autoneg = SK_FALSE; -+ } else { -+ epause->autoneg = SK_TRUE; -+ } -+} -+#endif -+ -+#ifdef ETHTOOL_SPAUSEPARAM -+/***************************************************************************** -+ * -+ * setPauseParams - configures the pause parameters of an adapter -+ * -+ * Description: -+ * This function sets the Rx or Tx pause parameters -+ * -+ * Returns: -+ * ==0: everything fine, no error -+ * !=0: the return value is the error code of the failure -+ */ -+static int setPauseParams( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_pauseparam *epause) /* pause parameter struct with params */ -+{ -+ SK_GEPORT *pPort = &pAC->GIni.GP[port]; -+ DEV_NET *pNet = (DEV_NET *) pAC->dev[port]->priv; -+ int PrevSpeedVal = pPort->PLinkSpeedUsed; -+ -+ SK_U32 Instance; -+ char Buf[4]; -+ int Ret; -+ SK_BOOL prevAutonegValue = SK_TRUE; -+ int prevTxPause = 0; -+ int prevRxPause = 0; -+ unsigned int Len = 1; -+ -+ if (port == 0) { -+ Instance = (pAC->RlmtNets == 2) ? 1 : 2; -+ } else { -+ Instance = (pAC->RlmtNets == 2) ? 2 : 3; -+ } -+ -+ /* -+ ** we have to determine the current settings to see if -+ ** the operator requested any modification of the flow -+ ** control parameters... -+ */ -+ if (pPort->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND) { -+ prevTxPause = 1; -+ } -+ if ((pPort->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC) || -+ (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM)) { -+ prevTxPause = 1; -+ prevRxPause = 1; -+ } -+ -+ if ((prevRxPause == 0) && (prevTxPause == 0)) { -+ prevAutonegValue = SK_FALSE; -+ } -+ -+ -+ /* -+ ** perform modifications regarding the changes -+ ** requested by the operator -+ */ -+ if (epause->autoneg != prevAutonegValue) { -+ if (epause->autoneg == AUTONEG_DISABLE) { -+ *Buf = (char) SK_FLOW_MODE_NONE; -+ } else { -+ *Buf = (char) SK_FLOW_MODE_SYMMETRIC; -+ } -+ } else { -+ if(epause->rx_pause && epause->tx_pause) { -+ *Buf = (char) SK_FLOW_MODE_SYMMETRIC; -+ } else if (epause->rx_pause && !epause->tx_pause) { -+ *Buf = (char) SK_FLOW_MODE_SYM_OR_REM; -+ } else if(!epause->rx_pause && epause->tx_pause) { -+ *Buf = (char) SK_FLOW_MODE_LOC_SEND; -+ } else { -+ *Buf = (char) SK_FLOW_MODE_NONE; -+ } -+ } -+ -+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_FLOWCTRL_MODE, -+ &Buf, &Len, Instance, pNet->NetNr); -+ -+ if (Ret != SK_PNMI_ERR_OK) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL, -+ ("ethtool (sk98lin): error changing rx/tx pause (%i)\n", Ret)); -+ } else { -+ Len = 1; /* set buffer length to correct value */ -+ } -+ -+ /* -+ ** It may be that autoneg has been disabled! Therefore -+ ** set the speed to the previously used value... -+ */ -+ *Buf = (char) PrevSpeedVal; -+ -+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE, -+ &Buf, &Len, Instance, pNet->NetNr); -+ -+ if (Ret != SK_PNMI_ERR_OK) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL, -+ ("ethtool (sk98lin): error setting speed (%i)\n", Ret)); -+ } -+ return 0; -+} -+#endif -+ -+#ifdef ETHTOOL_GCOALESCE -+/***************************************************************************** -+ * -+ * getModerationParams - retrieves the IRQ moderation settings -+ * -+ * Description: -+ * All current IRQ moderation settings of a selected adapter are placed -+ * in the passed ethtool_coalesce structure and are returned. -+ * -+ * Returns: N/A -+ * -+ */ -+static void getModerationParams( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_coalesce *ecoalesc) /* IRQ moderation struct for results */ -+{ -+ DIM_INFO *Info = &pAC->DynIrqModInfo; -+ SK_BOOL UseTxIrqModeration = SK_FALSE; -+ SK_BOOL UseRxIrqModeration = SK_FALSE; -+ -+ if (Info->IntModTypeSelect != C_INT_MOD_NONE) { -+ if (CHIP_ID_YUKON_2(pAC)) { -+ UseRxIrqModeration = SK_TRUE; -+ UseTxIrqModeration = SK_TRUE; -+ } else { -+ if ((Info->MaskIrqModeration == IRQ_MASK_RX_ONLY) || -+ (Info->MaskIrqModeration == IRQ_MASK_SP_RX) || -+ (Info->MaskIrqModeration == IRQ_MASK_RX_TX_SP)) { -+ UseRxIrqModeration = SK_TRUE; -+ } -+ if ((Info->MaskIrqModeration == IRQ_MASK_TX_ONLY) || -+ (Info->MaskIrqModeration == IRQ_MASK_SP_TX) || -+ (Info->MaskIrqModeration == IRQ_MASK_RX_TX_SP)) { -+ UseTxIrqModeration = SK_TRUE; -+ } -+ } -+ -+ if (UseRxIrqModeration) { -+ ecoalesc->rx_coalesce_usecs = 1000000 / Info->MaxModIntsPerSec; -+ } -+ if (UseTxIrqModeration) { -+ ecoalesc->tx_coalesce_usecs = 1000000 / Info->MaxModIntsPerSec; -+ } -+ if (Info->IntModTypeSelect == C_INT_MOD_DYNAMIC) { -+ ecoalesc->rate_sample_interval = Info->DynIrqModSampleInterval; -+ if (UseRxIrqModeration) { -+ ecoalesc->use_adaptive_rx_coalesce = 1; -+ ecoalesc->rx_coalesce_usecs_low = -+ 1000000 / Info->MaxModIntsPerSecLowerLimit; -+ ecoalesc->rx_coalesce_usecs_high = -+ 1000000 / Info->MaxModIntsPerSecUpperLimit; -+ } -+ if (UseTxIrqModeration) { -+ ecoalesc->use_adaptive_tx_coalesce = 1; -+ ecoalesc->tx_coalesce_usecs_low = -+ 1000000 / Info->MaxModIntsPerSecLowerLimit; -+ ecoalesc->tx_coalesce_usecs_high = -+ 1000000 / Info->MaxModIntsPerSecUpperLimit; -+ } -+ } -+ } -+} -+#endif -+ -+#ifdef ETHTOOL_SCOALESCE -+/***************************************************************************** -+ * -+ * setModerationParams - configures the IRQ moderation of an adapter -+ * -+ * Description: -+ * Depending on the desired IRQ moderation parameters, either a) static, -+ * b) dynamic or c) no moderation is configured. -+ * -+ * Returns: -+ * ==0: everything fine, no error -+ * !=0: the return value is the error code of the failure -+ * -+ * Notes: -+ * The supported timeframe for the coalesced interrupts ranges from -+ * 33.333us (30 IntsPerSec) down to 25us (40.000 IntsPerSec). -+ * Any requested value that is not in this range will abort the request! -+ */ -+static int setModerationParams( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_coalesce *ecoalesc) /* IRQ moderation struct with params */ -+{ -+ DIM_INFO *Info = &pAC->DynIrqModInfo; -+ int PrevModeration = Info->IntModTypeSelect; -+ -+ Info->IntModTypeSelect = C_INT_MOD_NONE; /* initial default */ -+ -+ if ((ecoalesc->rx_coalesce_usecs) || (ecoalesc->tx_coalesce_usecs)) { -+ if (ecoalesc->rx_coalesce_usecs) { -+ if ((ecoalesc->rx_coalesce_usecs < 25) || -+ (ecoalesc->rx_coalesce_usecs > 33333)) { -+ return -EINVAL; -+ } -+ } -+ if (ecoalesc->tx_coalesce_usecs) { -+ if ((ecoalesc->tx_coalesce_usecs < 25) || -+ (ecoalesc->tx_coalesce_usecs > 33333)) { -+ return -EINVAL; -+ } -+ } -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if ((Info->MaskIrqModeration == IRQ_MASK_SP_RX) || -+ (Info->MaskIrqModeration == IRQ_MASK_SP_TX) || -+ (Info->MaskIrqModeration == IRQ_MASK_RX_TX_SP)) { -+ Info->MaskIrqModeration = IRQ_MASK_SP_ONLY; -+ } -+ } -+ Info->IntModTypeSelect = C_INT_MOD_STATIC; -+ if (ecoalesc->rx_coalesce_usecs) { -+ Info->MaxModIntsPerSec = -+ 1000000 / ecoalesc->rx_coalesce_usecs; -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if (Info->MaskIrqModeration == IRQ_MASK_TX_ONLY) { -+ Info->MaskIrqModeration = IRQ_MASK_TX_RX; -+ } -+ if (Info->MaskIrqModeration == IRQ_MASK_SP_ONLY) { -+ Info->MaskIrqModeration = IRQ_MASK_SP_RX; -+ } -+ if (Info->MaskIrqModeration == IRQ_MASK_SP_TX) { -+ Info->MaskIrqModeration = IRQ_MASK_RX_TX_SP; -+ } -+ } else { -+ Info->MaskIrqModeration = Y2_IRQ_MASK; -+ } -+ } -+ if (ecoalesc->tx_coalesce_usecs) { -+ Info->MaxModIntsPerSec = -+ 1000000 / ecoalesc->tx_coalesce_usecs; -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if (Info->MaskIrqModeration == IRQ_MASK_RX_ONLY) { -+ Info->MaskIrqModeration = IRQ_MASK_TX_RX; -+ } -+ if (Info->MaskIrqModeration == IRQ_MASK_SP_ONLY) { -+ Info->MaskIrqModeration = IRQ_MASK_SP_TX; -+ } -+ if (Info->MaskIrqModeration == IRQ_MASK_SP_RX) { -+ Info->MaskIrqModeration = IRQ_MASK_RX_TX_SP; -+ } -+ } else { -+ Info->MaskIrqModeration = Y2_IRQ_MASK; -+ } -+ } -+ } -+ if ((ecoalesc->rate_sample_interval) || -+ (ecoalesc->rx_coalesce_usecs_low) || -+ (ecoalesc->tx_coalesce_usecs_low) || -+ (ecoalesc->rx_coalesce_usecs_high)|| -+ (ecoalesc->tx_coalesce_usecs_high)) { -+ if (ecoalesc->rate_sample_interval) { -+ if ((ecoalesc->rate_sample_interval < 1) || -+ (ecoalesc->rate_sample_interval > 10)) { -+ return -EINVAL; -+ } -+ } -+ if (ecoalesc->rx_coalesce_usecs_low) { -+ if ((ecoalesc->rx_coalesce_usecs_low < 25) || -+ (ecoalesc->rx_coalesce_usecs_low > 33333)) { -+ return -EINVAL; -+ } -+ } -+ if (ecoalesc->rx_coalesce_usecs_high) { -+ if ((ecoalesc->rx_coalesce_usecs_high < 25) || -+ (ecoalesc->rx_coalesce_usecs_high > 33333)) { -+ return -EINVAL; -+ } -+ } -+ if (ecoalesc->tx_coalesce_usecs_low) { -+ if ((ecoalesc->tx_coalesce_usecs_low < 25) || -+ (ecoalesc->tx_coalesce_usecs_low > 33333)) { -+ return -EINVAL; -+ } -+ } -+ if (ecoalesc->tx_coalesce_usecs_high) { -+ if ((ecoalesc->tx_coalesce_usecs_high < 25) || -+ (ecoalesc->tx_coalesce_usecs_high > 33333)) { -+ return -EINVAL; -+ } -+ } -+ -+ Info->IntModTypeSelect = C_INT_MOD_DYNAMIC; -+ if (ecoalesc->rate_sample_interval) { -+ Info->DynIrqModSampleInterval = -+ ecoalesc->rate_sample_interval; -+ } -+ if (ecoalesc->rx_coalesce_usecs_low) { -+ Info->MaxModIntsPerSecLowerLimit = -+ 1000000 / ecoalesc->rx_coalesce_usecs_low; -+ } -+ if (ecoalesc->tx_coalesce_usecs_low) { -+ Info->MaxModIntsPerSecLowerLimit = -+ 1000000 / ecoalesc->tx_coalesce_usecs_low; -+ } -+ if (ecoalesc->rx_coalesce_usecs_high) { -+ Info->MaxModIntsPerSecUpperLimit = -+ 1000000 / ecoalesc->rx_coalesce_usecs_high; -+ } -+ if (ecoalesc->tx_coalesce_usecs_high) { -+ Info->MaxModIntsPerSecUpperLimit = -+ 1000000 / ecoalesc->tx_coalesce_usecs_high; -+ } -+ } -+ -+ if ((PrevModeration == C_INT_MOD_NONE) && -+ (Info->IntModTypeSelect != C_INT_MOD_NONE)) { -+ SkDimEnableModerationIfNeeded(pAC); -+ } -+ if (PrevModeration != C_INT_MOD_NONE) { -+ SkDimDisableModeration(pAC, PrevModeration); -+ if (Info->IntModTypeSelect != C_INT_MOD_NONE) { -+ SkDimEnableModerationIfNeeded(pAC); -+ } -+ } -+ -+ return 0; -+} -+#endif -+ -+#ifdef ETHTOOL_GWOL -+/***************************************************************************** -+ * -+ * getWOLsettings - retrieves the WOL settings of the selected adapter -+ * -+ * Description: -+ * All current WOL settings of a selected adapter are placed in the -+ * passed ethtool_wolinfo structure and are returned to the caller. -+ * -+ * Returns: N/A -+ * -+ */ -+static void getWOLsettings( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_wolinfo *ewol) /* mandatory WOL structure for results */ -+{ -+ ewol->supported = pAC->WolInfo.SupportedWolOptions; -+ ewol->wolopts = pAC->WolInfo.ConfiguredWolOptions; -+ -+ return; -+} -+#endif -+ -+#ifdef ETHTOOL_SWOL -+/***************************************************************************** -+ * -+ * setWOLsettings - configures the WOL settings of a selected adapter -+ * -+ * Description: -+ * The WOL settings of a selected adapter are configured regarding -+ * the parameters in the passed ethtool_wolinfo structure. -+ * Note that currently only wake on magic packet is supported! -+ * -+ * Returns: -+ * ==0: everything fine, no error -+ * !=0: the return value is the error code of the failure -+ */ -+static int setWOLsettings( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_wolinfo *ewol) /* WOL structure containing settings */ -+{ -+ if (((ewol->wolopts & WAKE_MAGIC) == WAKE_MAGIC) || (ewol->wolopts == 0)) { -+ pAC->WolInfo.ConfiguredWolOptions = ewol->wolopts; -+ return 0; -+ } -+ return -EFAULT; -+} -+#endif -+ -+#ifdef ETHTOOL_GDRVINFO -+/***************************************************************************** -+ * -+ * getDriverInfo - returns generic driver and adapter information -+ * -+ * Description: -+ * Generic driver information is returned via this function, such as -+ * the name of the driver, its version and and firmware version. -+ * In addition to this, the location of the selected adapter is -+ * returned as a bus info string (e.g. '01:05.0'). -+ * -+ * Returns: N/A -+ * -+ */ -+static void getDriverInfo( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_drvinfo *edrvinfo) /* mandatory info structure for results */ -+{ -+ char versionString[32]; -+ -+ snprintf(versionString, 32, "%s (%s)", VER_STRING, PATCHLEVEL); -+ strncpy(edrvinfo->driver, DRIVER_FILE_NAME , 32); -+ strncpy(edrvinfo->version, versionString , 32); -+ strncpy(edrvinfo->fw_version, "N/A", 32); -+ strncpy(edrvinfo->bus_info, pci_name(pAC->PciDev), 32); -+ -+#ifdef ETHTOOL_GSTATS -+ edrvinfo->n_stats = SK98LIN_STATS_LEN; -+#endif -+} -+#endif -+ -+#ifdef ETHTOOL_PHYS_ID -+/***************************************************************************** -+ * -+ * startLocateNIC - start the locate NIC feature of the elected adapter -+ * -+ * Description: -+ * This function is used if the user want to locate a particular NIC. -+ * All LEDs are regularly switched on and off, so the NIC can easily -+ * be identified. -+ * -+ * Returns: -+ * ==0: everything fine, no error, locateNIC test was started -+ * !=0: one locateNIC test runs already -+ * -+ */ -+static int startLocateNIC( -+SK_AC *pAC, /* pointer to adapter control context */ -+int port, /* the port of the selected adapter */ -+struct ethtool_value *blinkSecs) /* how long the LEDs should blink in seconds */ -+{ -+ struct SK_NET_DEVICE *pDev = pAC->dev[port]; -+ int OtherPort = (port) ? 0 : 1; -+ struct SK_NET_DEVICE *pOtherDev = pAC->dev[OtherPort]; -+ -+ if (isLocateNICrunning) { -+ return -EFAULT; -+ } -+ isLocateNICrunning = SK_TRUE; -+ currentPortIndex = port; -+ isDualNetCard = (pDev != pOtherDev) ? SK_TRUE : SK_FALSE; -+ -+ if (netif_running(pAC->dev[port])) { -+ boardWasDown[0] = SK_FALSE; -+ } else { -+ (*pDev->open)(pDev); -+ boardWasDown[0] = SK_TRUE; -+ } -+ -+ if (isDualNetCard) { -+ if (netif_running(pAC->dev[OtherPort])) { -+ boardWasDown[1] = SK_FALSE; -+ } else { -+ (*pOtherDev->open)(pOtherDev); -+ boardWasDown[1] = SK_TRUE; -+ } -+ } -+ -+ if ((blinkSecs->data < 1) || (blinkSecs->data > 30)) { -+ blinkSecs->data = 3; /* three seconds default */ -+ } -+ nbrBlinkQuarterSeconds = 4*blinkSecs->data; -+ -+ init_timer(&locateNICtimer); -+ locateNICtimer.function = toggleLeds; -+ locateNICtimer.data = (unsigned long) pAC; -+ locateNICtimer.expires = jiffies + HZ; /* initially 1sec */ -+ add_timer(&locateNICtimer); -+ -+ return 0; -+} -+ -+/***************************************************************************** -+ * -+ * toggleLeds - Changes the LED state of an adapter -+ * -+ * Description: -+ * This function changes the current state of all LEDs of an adapter so -+ * that it can be located by a user. If the requested time interval for -+ * this test has elapsed, this function cleans up everything that was -+ * temporarily setup during the locate NIC test. This involves of course -+ * also closing or opening any adapter so that the initial board state -+ * is recovered. -+ * -+ * Returns: N/A -+ * -+ */ -+static void toggleLeds( -+unsigned long ptr) /* holds the pointer to adapter control context */ -+{ -+ SK_AC *pAC = (SK_AC *) ptr; -+ int port = currentPortIndex; -+ SK_IOC IoC = pAC->IoBase; -+ struct SK_NET_DEVICE *pDev = pAC->dev[port]; -+ int OtherPort = (port) ? 0 : 1; -+ struct SK_NET_DEVICE *pOtherDev = pAC->dev[OtherPort]; -+ -+ SK_U16 YukLedOn = (PHY_M_LED_MO_DUP(MO_LED_ON) | -+ PHY_M_LED_MO_10(MO_LED_ON) | -+ PHY_M_LED_MO_100(MO_LED_ON) | -+ PHY_M_LED_MO_1000(MO_LED_ON) | -+ PHY_M_LED_MO_RX(MO_LED_ON)); -+ SK_U16 YukLedOff = (PHY_M_LED_MO_DUP(MO_LED_OFF) | -+ PHY_M_LED_MO_10(MO_LED_OFF) | -+ PHY_M_LED_MO_100(MO_LED_OFF) | -+ PHY_M_LED_MO_1000(MO_LED_OFF) | -+ PHY_M_LED_MO_RX(MO_LED_OFF)); -+ -+ nbrBlinkQuarterSeconds--; -+ if (nbrBlinkQuarterSeconds <= 0) { -+ (*pDev->stop)(pDev); -+ if (isDualNetCard) { -+ (*pOtherDev->stop)(pOtherDev); -+ } -+ -+ if (!boardWasDown[0]) { -+ (*pDev->open)(pDev); -+ } -+ if (isDualNetCard) { -+ (*pOtherDev->open)(pOtherDev); -+ } -+ isDualNetCard = SK_FALSE; -+ isLocateNICrunning = SK_FALSE; -+ return; -+ } -+ -+ doSwitchLEDsOn = (doSwitchLEDsOn) ? SK_FALSE : SK_TRUE; -+ if (doSwitchLEDsOn) { -+ if (pAC->GIni.GIGenesis) { -+ SK_OUT8(IoC,MR_ADDR(port,LNK_LED_REG),(SK_U8)SK_LNK_ON); -+ SkGeYellowLED(pAC,IoC,LED_ON >> 1); -+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,RX_LED_INI),SK_LED_TST); -+ if (pAC->GIni.GP[port].PhyType == SK_PHY_BCOM) { -+ SkXmPhyWrite(pAC,IoC,port,PHY_BCOM_P_EXT_CTRL,PHY_B_PEC_LED_ON); -+ } else if (pAC->GIni.GP[port].PhyType == SK_PHY_LONE) { -+ SkXmPhyWrite(pAC,IoC,port,PHY_LONE_LED_CFG,0x0800); -+ } else { -+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,TX_LED_INI),SK_LED_TST); -+ } -+ } else { -+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_CTRL,0); -+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_OVER,YukLedOn); -+ } -+ } else { -+ if (pAC->GIni.GIGenesis) { -+ SK_OUT8(IoC,MR_ADDR(port,LNK_LED_REG),(SK_U8)SK_LNK_OFF); -+ SkGeYellowLED(pAC,IoC,LED_OFF >> 1); -+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,RX_LED_INI),SK_LED_DIS); -+ if (pAC->GIni.GP[port].PhyType == SK_PHY_BCOM) { -+ SkXmPhyWrite(pAC,IoC,port,PHY_BCOM_P_EXT_CTRL,PHY_B_PEC_LED_OFF); -+ } else if (pAC->GIni.GP[port].PhyType == SK_PHY_LONE) { -+ SkXmPhyWrite(pAC,IoC,port,PHY_LONE_LED_CFG,PHY_L_LC_LEDT); -+ } else { -+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,TX_LED_INI),SK_LED_DIS); -+ } -+ } else { -+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_CTRL,0); -+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_OVER,YukLedOff); -+ } -+ } -+ -+ locateNICtimer.function = toggleLeds; -+ locateNICtimer.data = (unsigned long) pAC; -+ locateNICtimer.expires = jiffies + (HZ/4); /* 250ms */ -+ add_timer(&locateNICtimer); -+} -+#endif -+ -+/***************************************************************************** -+ * -+ * getPortNumber - evaluates the port number of an interface -+ * -+ * Description: -+ * It may be that the current interface refers to one which is located -+ * on a dual net adapter. Hence, this function will return the correct -+ * port for further use. -+ * -+ * Returns: -+ * the port number that corresponds to the selected adapter -+ * -+ */ -+static int getPortNumber( -+struct net_device *netdev, /* the pointer to netdev structure */ -+struct ifreq *ifr) /* what interface the request refers to? */ -+{ -+ DEV_NET *pNet = (DEV_NET*) netdev->priv; -+ SK_AC *pAC = pNet->pAC; -+ -+ if (pAC->dev[1] != pAC->dev[0]) { -+ if (!strcmp(pAC->dev[1]->name, ifr->ifr_name)) { -+ return 1; /* port index 1 */ -+ } -+ } -+ return 0; -+} -+ -+/******************************************************************************* -+ * -+ * End of file -+ * -+ ******************************************************************************/ ---- ./drivers/net/sk98lin/skge.c.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/skge.c 2006-04-04 13:13:34.000000000 +0400 -@@ -1,32 +1,26 @@ - /****************************************************************************** - * -- * Name: skge.c -- * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.45 $ -- * Date: $Date: 2004/02/12 14:41:02 $ -- * Purpose: The main driver source module -+ * Name: skge.c -+ * Project: GEnesis, PCI Gigabit Ethernet Adapter -+ * Version: $Revision: 1.60.2.68 $ -+ * Date: $Date: 2005/11/14 15:22:08 $ -+ * Purpose: The main driver source module - * - ******************************************************************************/ - - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * Driver for Marvell Yukon chipset and SysKonnect Gigabit Ethernet - * Server Adapters. - * -- * Created 10-Feb-1999, based on Linux' acenic.c, 3c59x.c and -- * SysKonnects GEnesis Solaris driver -- * Author: Christoph Goos (cgoos@syskonnect.de) -- * Mirko Lindner (mlindner@syskonnect.de) -+ * Author: Mirko Lindner (mlindner@syskonnect.de) -+ * Ralph Roesler (rroesler@syskonnect.de) - * - * Address all question to: linux@syskonnect.de - * -- * The technical manual for the adapters is available from SysKonnect's -- * web pages: www.syskonnect.com -- * Goto "Support" and search Knowledge Base for "manual". -- * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or -@@ -38,71 +32,33 @@ - - /****************************************************************************** - * -- * Possible compiler options (#define xxx / -Dxxx): -- * -- * debugging can be enable by changing SK_DEBUG_CHKMOD and -- * SK_DEBUG_CHKCAT in makefile (described there). -- * -- ******************************************************************************/ -- --/****************************************************************************** -- * - * Description: - * -- * This is the main module of the Linux GE driver. -- * -- * All source files except skge.c, skdrv1st.h, skdrv2nd.h and sktypes.h -- * are part of SysKonnect's COMMON MODULES for the SK-98xx adapters. -- * Those are used for drivers on multiple OS', so some thing may seem -- * unnecessary complicated on Linux. Please do not try to 'clean up' -- * them without VERY good reasons, because this will make it more -- * difficult to keep the Linux driver in synchronisation with the -- * other versions. -- * -- * Include file hierarchy: -- * -- * <linux/module.h> -- * -- * "h/skdrv1st.h" -- * <linux/types.h> -- * <linux/kernel.h> -- * <linux/string.h> -- * <linux/errno.h> -- * <linux/ioport.h> -- * <linux/slab.h> -- * <linux/interrupt.h> -- * <linux/pci.h> -- * <asm/byteorder.h> -- * <asm/bitops.h> -- * <asm/io.h> -- * <linux/netdevice.h> -- * <linux/etherdevice.h> -- * <linux/skbuff.h> -- * those three depending on kernel version used: -- * <linux/bios32.h> -- * <linux/init.h> -- * <asm/uaccess.h> -- * <net/checksum.h> -- * -- * "h/skerror.h" -- * "h/skdebug.h" -- * "h/sktypes.h" -- * "h/lm80.h" -- * "h/xmac_ii.h" -- * -- * "h/skdrv2nd.h" -- * "h/skqueue.h" -- * "h/skgehwt.h" -- * "h/sktimer.h" -- * "h/ski2c.h" -- * "h/skgepnmi.h" -- * "h/skvpd.h" -- * "h/skgehw.h" -- * "h/skgeinit.h" -- * "h/skaddr.h" -- * "h/skgesirq.h" -- * "h/skcsum.h" -- * "h/skrlmt.h" -+ * All source files in this sk98lin directory except of the sk98lin -+ * Linux specific files -+ * -+ * - skdim.c -+ * - skethtool.c -+ * - skge.c -+ * - skproc.c -+ * - sky2.c -+ * - Makefile -+ * - h/skdrv1st.h -+ * - h/skdrv2nd.h -+ * - h/sktypes.h -+ * - h/skversion.h -+ * -+ * are part of SysKonnect's common modules for the SK-9xxx adapters. -+ * -+ * Those common module files which are not Linux specific are used to -+ * build drivers on different OS' (e.g. Windows, MAC OS) so that those -+ * drivers are based on the same set of files -+ * -+ * At a first glance, this seems to complicate things unnescessarily on -+ * Linux, but please do not try to 'clean up' them without VERY good -+ * reasons, because this will make it more difficult to keep the sk98lin -+ * driver for Linux in synchronisation with the other drivers running on -+ * other operating systems. - * - ******************************************************************************/ - -@@ -110,6 +66,7 @@ - - #include <linux/module.h> - #include <linux/init.h> -+#include <linux/ethtool.h> - - #ifdef CONFIG_PROC_FS - #include <linux/proc_fs.h> -@@ -118,6 +75,10 @@ - #include "h/skdrv1st.h" - #include "h/skdrv2nd.h" - -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9) -+#include <linux/moduleparam.h> -+#endif -+ - /******************************************************************************* - * - * Defines -@@ -127,62 +88,14 @@ - /* for debuging on x86 only */ - /* #define BREAKPOINT() asm(" int $3"); */ - --/* use the transmit hw checksum driver functionality */ --#define USE_SK_TX_CHECKSUM -- --/* use the receive hw checksum driver functionality */ --#define USE_SK_RX_CHECKSUM -- --/* use the scatter-gather functionality with sendfile() */ --#define SK_ZEROCOPY -- --/* use of a transmit complete interrupt */ --#define USE_TX_COMPLETE -- --/* -- * threshold for copying small receive frames -- * set to 0 to avoid copying, set to 9001 to copy all frames -- */ --#define SK_COPY_THRESHOLD 50 -- --/* number of adapters that can be configured via command line params */ --#define SK_MAX_CARD_PARAM 16 -- -- -- --/* -- * use those defines for a compile-in version of the driver instead -- * of command line parameters -- */ --// #define LINK_SPEED_A {"Auto", } --// #define LINK_SPEED_B {"Auto", } --// #define AUTO_NEG_A {"Sense", } --// #define AUTO_NEG_B {"Sense", } --// #define DUP_CAP_A {"Both", } --// #define DUP_CAP_B {"Both", } --// #define FLOW_CTRL_A {"SymOrRem", } --// #define FLOW_CTRL_B {"SymOrRem", } --// #define ROLE_A {"Auto", } --// #define ROLE_B {"Auto", } --// #define PREF_PORT {"A", } --// #define CON_TYPE {"Auto", } --// #define RLMT_MODE {"CheckLinkState", } -- --#define DEV_KFREE_SKB(skb) dev_kfree_skb(skb) --#define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb) --#define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb) -- - - /* Set blink mode*/ - #define OEM_CONFIG_VALUE ( SK_ACT_LED_BLINK | \ - SK_DUP_LED_NORMAL | \ - SK_LED_LINK100_ON) - -- --/* Isr return value */ --#define SkIsrRetVar irqreturn_t --#define SkIsrRetNone IRQ_NONE --#define SkIsrRetHandled IRQ_HANDLED -+#define CLEAR_AND_START_RX(Port) SK_OUT8(pAC->IoBase, RxQueueAddr[(Port)]+Q_CSR, CSR_START | CSR_IRQ_CL_F) -+#define CLEAR_TX_IRQ(Port,Prio) SK_OUT8(pAC->IoBase, TxQueueAddr[(Port)][(Prio)]+Q_CSR, CSR_IRQ_CL_F) - - - /******************************************************************************* -@@ -191,12 +104,25 @@ - * - ******************************************************************************/ - -+static int __devinit sk98lin_init_device(struct pci_dev *pdev, const struct pci_device_id *ent); -+static void sk98lin_remove_device(struct pci_dev *pdev); -+#ifdef CONFIG_PM -+static int sk98lin_suspend(struct pci_dev *pdev, u32 state); -+static int sk98lin_resume(struct pci_dev *pdev); -+static void SkEnableWOMagicPacket(SK_AC *pAC, SK_IOC IoC, SK_MAC_ADDR MacAddr); -+#endif -+#ifdef Y2_RECOVERY -+static void SkGeHandleKernelTimer(unsigned long ptr); -+void SkGeCheckTimer(DEV_NET *pNet); -+static SK_BOOL CheckRXCounters(DEV_NET *pNet); -+static void CheckRxPath(DEV_NET *pNet); -+#endif - static void FreeResources(struct SK_NET_DEVICE *dev); - static int SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC); - static SK_BOOL BoardAllocMem(SK_AC *pAC); - static void BoardFreeMem(SK_AC *pAC); - static void BoardInitMem(SK_AC *pAC); --static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL); -+static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, int*, SK_BOOL); - static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); - static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); - static int SkGeOpen(struct SK_NET_DEVICE *dev); -@@ -212,24 +138,37 @@ static int XmitFrame(SK_AC*, TX_PORT*, s - static void FreeTxDescriptors(SK_AC*pAC, TX_PORT*); - static void FillRxRing(SK_AC*, RX_PORT*); - static SK_BOOL FillRxDescriptor(SK_AC*, RX_PORT*); -+#ifdef CONFIG_SK98LIN_NAPI -+static int SkGePoll(struct net_device *dev, int *budget); -+static void ReceiveIrq(SK_AC*, RX_PORT*, SK_BOOL, int*, int); -+#else - static void ReceiveIrq(SK_AC*, RX_PORT*, SK_BOOL); --static void ClearAndStartRx(SK_AC*, int); --static void ClearTxIrq(SK_AC*, int, int); -+#endif -+#ifdef SK_POLL_CONTROLLER -+static void SkGeNetPoll(struct SK_NET_DEVICE *dev); -+#endif - static void ClearRxRing(SK_AC*, RX_PORT*); - static void ClearTxRing(SK_AC*, TX_PORT*); - static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int new_mtu); - static void PortReInitBmu(SK_AC*, int); - static int SkGeIocMib(DEV_NET*, unsigned int, int); - static int SkGeInitPCI(SK_AC *pAC); --static void StartDrvCleanupTimer(SK_AC *pAC); --static void StopDrvCleanupTimer(SK_AC *pAC); --static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*); -- --#ifdef SK_DIAG_SUPPORT - static SK_U32 ParseDeviceNbrFromSlotName(const char *SlotName); - static int SkDrvInitAdapter(SK_AC *pAC, int devNbr); - static int SkDrvDeInitAdapter(SK_AC *pAC, int devNbr); --#endif -+extern void SkLocalEventQueue( SK_AC *pAC, -+ SK_U32 Class, -+ SK_U32 Event, -+ SK_U32 Param1, -+ SK_U32 Param2, -+ SK_BOOL Flag); -+extern void SkLocalEventQueue64( SK_AC *pAC, -+ SK_U32 Class, -+ SK_U32 Event, -+ SK_U64 Param, -+ SK_BOOL Flag); -+ -+static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*); - - /******************************************************************************* - * -@@ -237,17 +176,34 @@ static int SkDrvDeInitAdapter(SK_AC - * - ******************************************************************************/ - --#ifdef CONFIG_PROC_FS --static const char SK_Root_Dir_entry[] = "sk98lin"; --static struct proc_dir_entry *pSkRootDir = NULL; --extern struct file_operations sk_proc_fops; -+extern SK_BOOL SkY2AllocateResources(SK_AC *pAC); -+extern void SkY2FreeResources(SK_AC *pAC); -+extern void SkY2AllocateRxBuffers(SK_AC *pAC,SK_IOC IoC,int Port); -+extern void SkY2FreeRxBuffers(SK_AC *pAC,SK_IOC IoC,int Port); -+extern void SkY2FreeTxBuffers(SK_AC *pAC,SK_IOC IoC,int Port); -+extern SkIsrRetVar SkY2Isr(int irq,void *dev_id,struct pt_regs *ptregs); -+extern int SkY2Xmit(struct sk_buff *skb,struct SK_NET_DEVICE *dev); -+extern void SkY2PortStop(SK_AC *pAC,SK_IOC IoC,int Port,int Dir,int RstMode); -+extern void SkY2PortStart(SK_AC *pAC,SK_IOC IoC,int Port); -+extern int SkY2RlmtSend(SK_AC *pAC,int PortNr,struct sk_buff *pMessage); -+extern void SkY2RestartStatusUnit(SK_AC *pAC); -+extern void FillReceiveTableYukon2(SK_AC *pAC,SK_IOC IoC,int Port); -+#ifdef CONFIG_SK98LIN_NAPI -+extern int SkY2Poll(struct net_device *dev, int *budget); - #endif - - extern void SkDimEnableModerationIfNeeded(SK_AC *pAC); --extern void SkDimDisplayModerationSettings(SK_AC *pAC); - extern void SkDimStartModerationTimer(SK_AC *pAC); - extern void SkDimModerate(SK_AC *pAC); - -+extern int SkEthIoctl(struct net_device *netdev, struct ifreq *ifr); -+ -+#ifdef CONFIG_PROC_FS -+static const char SK_Root_Dir_entry[] = "sk98lin"; -+static struct proc_dir_entry *pSkRootDir; -+extern struct file_operations sk_proc_fops; -+#endif -+ - #ifdef DEBUG - static void DumpMsg(struct sk_buff*, char*); - static void DumpData(char*, int); -@@ -257,13 +213,12 @@ static void DumpLong(char*, int); - /* global variables *********************************************************/ - static const char *BootString = BOOT_STRING; - struct SK_NET_DEVICE *SkGeRootDev = NULL; --static int probed __initdata = 0; - static SK_BOOL DoPrintInterfaceChange = SK_TRUE; - - /* local variables **********************************************************/ - static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}}; - static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480}; -- -+static int sk98lin_max_boards_found = 0; - - #ifdef CONFIG_PROC_FS - static struct proc_dir_entry *pSkRootDir; -@@ -271,285 +226,420 @@ static struct proc_dir_entry *pSkRootDir - - - -+static struct pci_device_id sk98lin_pci_tbl[] __devinitdata = { -+/* { pci_vendor_id, pci_device_id, * SAMPLE ENTRY! * -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, */ -+ { 0x10b7, 0x1700, /* 3Com (10b7), Gigabit Ethernet Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x10b7, 0x80eb, /* 3Com (10b7), 3Com 3C940B Gigabit LOM Ethernet Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1148, 0x4300, /* SysKonnect (1148), SK-98xx Gigabit Ethernet Server Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1148, 0x4320, /* SysKonnect (1148), SK-98xx V2.0 Gigabit Ethernet Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1148, 0x9000, /* SysKonnect (1148), SK-9Sxx 10/100/1000Base-T Server Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1148, 0x9E00, /* SysKonnect (1148), SK-9Exx 10/100/1000Base-T Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1186, 0x4b00, /* D-Link (1186), Gigabit Ethernet Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1186, 0x4b01, /* D-Link (1186), Gigabit Ethernet Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1186, 0x4c00, /* D-Link (1186), Gigabit Ethernet Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4320, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4340, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4341, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4342, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4343, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4344, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4345, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4346, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4347, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4350, /* Marvell (11ab), Fast Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4351, /* Marvell (11ab), Fast Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4352, /* Marvell (11ab), Fast Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4360, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4361, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4362, /* Marvell (11ab), Gigabit Ethernet Controller */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x4363, /* Marvell (11ab), Marvell */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x11ab, 0x5005, /* Marvell (11ab), Belkin */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1371, 0x434e, /* CNet (1371), GigaCard Network Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1737, 0x1032, /* Linksys (1737), Gigabit Network Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0x1737, 0x1064, /* Linksys (1737), Gigabit Network Adapter */ -+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, -+ { 0, } -+}; -+ -+MODULE_DEVICE_TABLE(pci, sk98lin_pci_tbl); -+ -+static struct pci_driver sk98lin_driver = { -+ .name = DRIVER_FILE_NAME, -+ .id_table = sk98lin_pci_tbl, -+ .probe = sk98lin_init_device, -+ .remove = __devexit_p(sk98lin_remove_device), -+#ifdef CONFIG_PM -+ .suspend = sk98lin_suspend, -+ .resume = sk98lin_resume -+#endif -+}; -+ -+ - /***************************************************************************** - * -- * skge_probe - find all SK-98xx adapters -+ * sk98lin_init_device - initialize the adapter - * - * Description: -- * This function scans the PCI bus for SK-98xx adapters. Resources for -- * each adapter are allocated and the adapter is brought into Init 1 -+ * This function initializes the adapter. Resources for -+ * the adapter are allocated and the adapter is brought into Init 1 - * state. - * - * Returns: - * 0, if everything is ok - * !=0, on error - */ --static int __init skge_probe (void) -+static int __devinit sk98lin_init_device(struct pci_dev *pdev, -+ const struct pci_device_id *ent) -+ - { -- int boards_found = 0; -- int vendor_flag = SK_FALSE; -+ static SK_BOOL sk98lin_boot_string = SK_FALSE; -+ static SK_BOOL sk98lin_proc_entry = SK_FALSE; -+ static int sk98lin_boards_found = 0; - SK_AC *pAC; - DEV_NET *pNet = NULL; -- struct pci_dev *pdev = NULL; - struct SK_NET_DEVICE *dev = NULL; -- SK_BOOL DeviceFound = SK_FALSE; -- SK_BOOL BootStringCount = SK_FALSE; - int retval; - #ifdef CONFIG_PROC_FS - struct proc_dir_entry *pProcFile; - #endif -+ int pci_using_dac; - -- if (probed) -- return -ENODEV; -- probed++; -+ retval = pci_enable_device(pdev); -+ if (retval) { -+ printk(KERN_ERR "Cannot enable PCI device, " -+ "aborting.\n"); -+ return retval; -+ } - -+ dev = NULL; -+ pNet = NULL; - -- while((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev))) { - -- if (pci_enable_device(pdev)) { -- continue; -- } -- dev = NULL; -- pNet = NULL; -+ /* INSERT * We have to find the power-management capabilities */ -+ /* Find power-management capability. */ - -- /* Don't handle Yukon2 cards at the moment */ -- /* 12-feb-2004 ---- mlindner@syskonnect.de */ -- if (pdev->vendor == 0x11ab) { -- if ( (pdev->device == 0x4360) || (pdev->device == 0x4361) ) -- continue; -+ pci_using_dac = 0; /* Set 32 bit DMA per default */ -+ /* Configure DMA attributes. */ -+ retval = pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL); -+ if (!retval) { -+ pci_using_dac = 1; -+ } else { -+ retval = pci_set_dma_mask(pdev, (u64) 0xffffffff); -+ if (retval) { -+ printk(KERN_ERR "No usable DMA configuration, " -+ "aborting.\n"); -+ return retval; - } -+ } - -- SK_PCI_ISCOMPLIANT(vendor_flag, pdev); -- if (!vendor_flag) -- continue; - -- /* Configure DMA attributes. */ -- if (pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL) && -- pci_set_dma_mask(pdev, (u64) 0xffffffff)) -- continue; -+ if ((dev = alloc_etherdev(sizeof(DEV_NET))) == NULL) { -+ printk(KERN_ERR "Unable to allocate etherdev " -+ "structure!\n"); -+ return -ENODEV; -+ } - -+ pNet = dev->priv; -+ pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); -+ if (pNet->pAC == NULL){ -+ free_netdev(dev); -+ printk(KERN_ERR "Unable to allocate adapter " -+ "structure!\n"); -+ return -ENODEV; -+ } - -- if ((dev = alloc_etherdev(sizeof(DEV_NET))) == NULL) { -- printk(KERN_ERR "Unable to allocate etherdev " -- "structure!\n"); -- break; -- } - -- pNet = dev->priv; -- pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); -- if (pNet->pAC == NULL){ -- free_netdev(dev); -- printk(KERN_ERR "Unable to allocate adapter " -- "structure!\n"); -- break; -- } -+ /* Print message */ -+ if (!sk98lin_boot_string) { -+ /* set display flag to TRUE so that */ -+ /* we only display this string ONCE */ -+ sk98lin_boot_string = SK_TRUE; -+ printk("%s\n", BootString); -+ } - -- /* Print message */ -- if (!BootStringCount) { -- /* set display flag to TRUE so that */ -- /* we only display this string ONCE */ -- BootStringCount = SK_TRUE; -- printk("%s\n", BootString); -- } -+ memset(pNet->pAC, 0, sizeof(SK_AC)); -+ pAC = pNet->pAC; -+ pAC->PciDev = pdev; -+ pAC->PciDevId = pdev->device; -+ pAC->dev[0] = dev; -+ pAC->dev[1] = dev; -+ sprintf(pAC->Name, "SysKonnect SK-98xx"); -+ pAC->CheckQueue = SK_FALSE; -+ -+ dev->irq = pdev->irq; -+ retval = SkGeInitPCI(pAC); -+ if (retval) { -+ printk("SKGE: PCI setup failed: %i\n", retval); -+ free_netdev(dev); -+ return -ENODEV; -+ } - -- memset(pNet->pAC, 0, sizeof(SK_AC)); -- pAC = pNet->pAC; -- pAC->PciDev = pdev; -- pAC->PciDevId = pdev->device; -- pAC->dev[0] = dev; -- pAC->dev[1] = dev; -- sprintf(pAC->Name, "SysKonnect SK-98xx"); -- pAC->CheckQueue = SK_FALSE; -+ SET_MODULE_OWNER(dev); - -- pNet->Mtu = 1500; -- pNet->Up = 0; -- dev->irq = pdev->irq; -- retval = SkGeInitPCI(pAC); -- if (retval) { -- printk("SKGE: PCI setup failed: %i\n", retval); -- free_netdev(dev); -- continue; -- } -+ dev->open = &SkGeOpen; -+ dev->stop = &SkGeClose; -+ dev->get_stats = &SkGeStats; -+ dev->set_multicast_list = &SkGeSetRxMode; -+ dev->set_mac_address = &SkGeSetMacAddr; -+ dev->do_ioctl = &SkGeIoctl; -+ dev->change_mtu = &SkGeChangeMtu; -+ dev->flags &= ~IFF_RUNNING; -+#ifdef SK_POLL_CONTROLLER -+ dev->poll_controller = SkGeNetPoll; -+#endif -+ SET_NETDEV_DEV(dev, &pdev->dev); -+ -+ pAC->Index = sk98lin_boards_found; -+ -+ if (SkGeBoardInit(dev, pAC)) { -+ free_netdev(dev); -+ return -ENODEV; -+ } else { -+ ProductStr(pAC); -+ } - -- SET_MODULE_OWNER(dev); -- dev->open = &SkGeOpen; -- dev->stop = &SkGeClose; -+ if (pci_using_dac) -+ dev->features |= NETIF_F_HIGHDMA; -+ -+ /* shifter to later moment in time... */ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ dev->hard_start_xmit = &SkY2Xmit; -+#ifdef CONFIG_SK98LIN_NAPI -+ dev->poll = &SkY2Poll; -+ dev->weight = 64; -+#endif -+ } else { - dev->hard_start_xmit = &SkGeXmit; -- dev->get_stats = &SkGeStats; -- dev->last_stats = &SkGeStats; -- dev->set_multicast_list = &SkGeSetRxMode; -- dev->set_mac_address = &SkGeSetMacAddr; -- dev->do_ioctl = &SkGeIoctl; -- dev->change_mtu = &SkGeChangeMtu; -- dev->flags &= ~IFF_RUNNING; -- SET_NETDEV_DEV(dev, &pdev->dev); -+#ifdef CONFIG_SK98LIN_NAPI -+ dev->poll = &SkGePoll; -+ dev->weight = 64; -+#endif -+ } - --#ifdef SK_ZEROCOPY -+#ifdef NETIF_F_TSO -+#ifdef USE_SK_TSO_FEATURE -+ if ((CHIP_ID_YUKON_2(pAC)) && -+ (pAC->GIni.GIChipId != CHIP_ID_YUKON_EC_U)) { -+ dev->features |= NETIF_F_TSO; -+ } -+#endif -+#endif -+#ifdef CONFIG_SK98LIN_ZEROCOPY -+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) -+ dev->features |= NETIF_F_SG; -+#endif - #ifdef USE_SK_TX_CHECKSUM -- -- if (pAC->ChipsetType) { -- /* Use only if yukon hardware */ -- /* SK and ZEROCOPY - fly baby... */ -- dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; -- } -+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) -+ dev->features |= NETIF_F_IP_CSUM; - #endif -+#ifdef USE_SK_RX_CHECKSUM -+ pAC->RxPort[0].UseRxCsum = SK_TRUE; -+ if (pAC->GIni.GIMacsFound == 2 ) { -+ pAC->RxPort[1].UseRxCsum = SK_TRUE; -+ } - #endif - -- pAC->Index = boards_found; -+ /* Save the hardware revision */ -+ pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + -+ (pAC->GIni.GIPciHwRev & 0x0F); - -- if (SkGeBoardInit(dev, pAC)) { -- free_netdev(dev); -- continue; -- } -+ /* Set driver globals */ -+ pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME; -+ pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE; - -- /* Register net device */ -- if (register_netdev(dev)) { -- printk(KERN_ERR "SKGE: Could not register device.\n"); -- FreeResources(dev); -- free_netdev(dev); -- continue; -- } -+ SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA)); -+ SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct), -+ sizeof(SK_PNMI_STRUCT_DATA)); - -- /* Print adapter specific string from vpd */ -- ProductStr(pAC); -- printk("%s: %s\n", dev->name, pAC->DeviceStr); -+ /* Register net device */ -+ retval = register_netdev(dev); -+ if (retval) { -+ printk(KERN_ERR "SKGE: Could not register device.\n"); -+ FreeResources(dev); -+ free_netdev(dev); -+ return retval; -+ } - -- /* Print configuration settings */ -- printk(" PrefPort:%c RlmtMode:%s\n", -- 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber, -- (pAC->RlmtMode==0) ? "Check Link State" : -- ((pAC->RlmtMode==1) ? "Check Link State" : -- ((pAC->RlmtMode==3) ? "Check Local Port" : -- ((pAC->RlmtMode==7) ? "Check Segmentation" : -- ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error"))))); -+ /* Save initial device name */ -+ strcpy(pNet->InitialDevName, dev->name); - -- SkGeYellowLED(pAC, pAC->IoBase, 1); -+ /* Set network to off */ -+ netif_stop_queue(dev); -+ netif_carrier_off(dev); - -+ /* Print adapter specific string from vpd and config settings */ -+ printk("%s: %s\n", pNet->InitialDevName, pAC->DeviceStr); -+ printk(" PrefPort:%c RlmtMode:%s\n", -+ 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber, -+ (pAC->RlmtMode==0) ? "Check Link State" : -+ ((pAC->RlmtMode==1) ? "Check Link State" : -+ ((pAC->RlmtMode==3) ? "Check Local Port" : -+ ((pAC->RlmtMode==7) ? "Check Segmentation" : -+ ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error"))))); - -- memcpy((caddr_t) &dev->dev_addr, -- (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6); -+ SkGeYellowLED(pAC, pAC->IoBase, 1); -+ -+ memcpy((caddr_t) &dev->dev_addr, -+ (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6); - -- /* First adapter... Create proc and print message */ -+ /* First adapter... Create proc and print message */ - #ifdef CONFIG_PROC_FS -- if (!DeviceFound) { -- DeviceFound = SK_TRUE; -- SK_MEMCPY(&SK_Root_Dir_entry, BootString, -- sizeof(SK_Root_Dir_entry) - 1); -- -- /*Create proc (directory)*/ -- if(!pSkRootDir) { -- pSkRootDir = proc_mkdir(SK_Root_Dir_entry, proc_net); -- if (!pSkRootDir) { -- printk(KERN_WARNING "%s: Unable to create /proc/net/%s", -- dev->name, SK_Root_Dir_entry); -- } else { -- pSkRootDir->owner = THIS_MODULE; -- } -+ if (!sk98lin_proc_entry) { -+ sk98lin_proc_entry = SK_TRUE; -+ SK_MEMCPY(&SK_Root_Dir_entry, BootString, -+ sizeof(SK_Root_Dir_entry) - 1); -+ -+ /*Create proc (directory)*/ -+ if(!pSkRootDir) { -+ pSkRootDir = proc_mkdir(SK_Root_Dir_entry, proc_net); -+ if (!pSkRootDir) { -+ printk(KERN_WARNING "%s: Unable to create /proc/net/%s", -+ dev->name, SK_Root_Dir_entry); -+ } else { -+ pSkRootDir->owner = THIS_MODULE; - } - } -+ } - -- /* Create proc file */ -- if (pSkRootDir && -- (pProcFile = create_proc_entry(dev->name, S_IRUGO, -- pSkRootDir))) { -- pProcFile->proc_fops = &sk_proc_fops; -- pProcFile->data = dev; -- } -+ /* Create proc file */ -+ if (pSkRootDir && -+ (pProcFile = create_proc_entry(pNet->InitialDevName, S_IRUGO, -+ pSkRootDir))) { -+ pProcFile->proc_fops = &sk_proc_fops; -+ pProcFile->data = dev; -+ } - - #endif - -- pNet->PortNr = 0; -- pNet->NetNr = 0; -- -- boards_found++; -+ pNet->PortNr = 0; -+ pNet->NetNr = 0; - -- /* More then one port found */ -- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -- if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) { -- printk(KERN_ERR "Unable to allocate etherdev " -- "structure!\n"); -- break; -- } -+ sk98lin_boards_found++; -+ pci_set_drvdata(pdev, dev); - -- pAC->dev[1] = dev; -- pNet = dev->priv; -- pNet->PortNr = 1; -- pNet->NetNr = 1; -- pNet->pAC = pAC; -- pNet->Mtu = 1500; -- pNet->Up = 0; -- -- dev->open = &SkGeOpen; -- dev->stop = &SkGeClose; -- dev->hard_start_xmit = &SkGeXmit; -- dev->get_stats = &SkGeStats; -- dev->last_stats = &SkGeStats; -- dev->set_multicast_list = &SkGeSetRxMode; -- dev->set_mac_address = &SkGeSetMacAddr; -- dev->do_ioctl = &SkGeIoctl; -- dev->change_mtu = &SkGeChangeMtu; -- dev->flags &= ~IFF_RUNNING; -+ /* More then one port found */ -+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -+ if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) { -+ printk(KERN_ERR "Unable to allocate etherdev " -+ "structure!\n"); -+ return -ENODEV; -+ } - --#ifdef SK_ZEROCOPY --#ifdef USE_SK_TX_CHECKSUM -- if (pAC->ChipsetType) { -- /* SG and ZEROCOPY - fly baby... */ -- dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; -- } -+ pAC->dev[1] = dev; -+ pNet = dev->priv; -+ pNet->PortNr = 1; -+ pNet->NetNr = 1; -+ pNet->pAC = pAC; -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ dev->hard_start_xmit = &SkY2Xmit; -+#ifdef CONFIG_SK98LIN_NAPI -+ dev->poll = &SkY2Poll; -+ dev->weight = 64; -+#endif -+ } else { -+ dev->hard_start_xmit = &SkGeXmit; -+#ifdef CONFIG_SK98LIN_NAPI -+ dev->poll = &SkGePoll; -+ dev->weight = 64; -+#endif -+ } -+ dev->open = &SkGeOpen; -+ dev->stop = &SkGeClose; -+ dev->get_stats = &SkGeStats; -+ dev->set_multicast_list = &SkGeSetRxMode; -+ dev->set_mac_address = &SkGeSetMacAddr; -+ dev->do_ioctl = &SkGeIoctl; -+ dev->change_mtu = &SkGeChangeMtu; -+ dev->flags &= ~IFF_RUNNING; -+#ifdef SK_POLL_CONTROLLER -+ dev->poll_controller = SkGeNetPoll; -+#endif -+ -+#ifdef NETIF_F_TSO -+#ifdef USE_SK_TSO_FEATURE -+ if ((CHIP_ID_YUKON_2(pAC)) && -+ (pAC->GIni.GIChipId != CHIP_ID_YUKON_EC_U)) { -+ dev->features |= NETIF_F_TSO; -+ } - #endif - #endif -+#ifdef CONFIG_SK98LIN_ZEROCOPY -+ /* Don't handle if Genesis chipset */ -+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) -+ dev->features |= NETIF_F_SG; -+#endif -+#ifdef USE_SK_TX_CHECKSUM -+ /* Don't handle if Genesis chipset */ -+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) -+ dev->features |= NETIF_F_IP_CSUM; -+#endif -+ -+ if (register_netdev(dev)) { -+ printk(KERN_ERR "SKGE: Could not register device.\n"); -+ free_netdev(dev); -+ pAC->dev[1] = pAC->dev[0]; -+ } else { -+ -+ /* Save initial device name */ -+ strcpy(pNet->InitialDevName, dev->name); -+ -+ /* Set network to off */ -+ netif_stop_queue(dev); -+ netif_carrier_off(dev); -+ - -- if (register_netdev(dev)) { -- printk(KERN_ERR "SKGE: Could not register device.\n"); -- free_netdev(dev); -- pAC->dev[1] = pAC->dev[0]; -- } else { - #ifdef CONFIG_PROC_FS -- if (pSkRootDir -- && (pProcFile = create_proc_entry(dev->name, -- S_IRUGO, pSkRootDir))) { -- pProcFile->proc_fops = &sk_proc_fops; -- pProcFile->data = dev; -- } -+ if (pSkRootDir -+ && (pProcFile = create_proc_entry(pNet->InitialDevName, -+ S_IRUGO, pSkRootDir))) { -+ pProcFile->proc_fops = &sk_proc_fops; -+ pProcFile->data = dev; -+ } - #endif - -- memcpy((caddr_t) &dev->dev_addr, -- (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6); -+ memcpy((caddr_t) &dev->dev_addr, -+ (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6); - -- printk("%s: %s\n", dev->name, pAC->DeviceStr); -- printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); -- } -+ printk("%s: %s\n", pNet->InitialDevName, pAC->DeviceStr); -+ printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); - } -- -- /* Save the hardware revision */ -- pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + -- (pAC->GIni.GIPciHwRev & 0x0F); -- -- /* Set driver globals */ -- pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME; -- pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE; -- -- SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA)); -- SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct), -- sizeof(SK_PNMI_STRUCT_DATA)); -- -- /* -- * This is bollocks, but we need to tell the net-init -- * code that it shall go for the next device. -- */ --#ifndef MODULE -- dev->base_addr = 0; --#endif - } - -- /* -- * If we're at this point we're going through skge_probe() for -- * the first time. Return success (0) if we've initialized 1 -- * or more boards. Otherwise, return failure (-ENODEV). -- */ -+ pAC->Index = sk98lin_boards_found; -+ sk98lin_max_boards_found = sk98lin_boards_found; -+ return 0; -+} - -- return boards_found; --} /* skge_probe */ - - - /***************************************************************************** -@@ -575,7 +665,7 @@ int SkGeInitPCI(SK_AC *pAC) - dev->mem_start = pci_resource_start (pdev, 0); - pci_set_master(pdev); - -- if (pci_request_regions(pdev, pAC->Name) != 0) { -+ if (pci_request_regions(pdev, DRIVER_FILE_NAME) != 0) { - retval = 2; - goto out_disable; - } -@@ -612,6 +702,455 @@ int SkGeInitPCI(SK_AC *pAC) - return retval; - } - -+#ifdef Y2_RECOVERY -+/***************************************************************************** -+ * -+ * SkGeHandleKernelTimer - Handle the kernel timer requests -+ * -+ * Description: -+ * If the requested time interval for the timer has elapsed, -+ * this function checks the link state. -+ * -+ * Returns: N/A -+ * -+ */ -+static void SkGeHandleKernelTimer( -+unsigned long ptr) /* holds the pointer to adapter control context */ -+{ -+ DEV_NET *pNet = (DEV_NET*) ptr; -+ SkGeCheckTimer(pNet); -+} -+ -+/***************************************************************************** -+ * -+ * sk98lin_check_timer - Resume the the card -+ * -+ * Description: -+ * This function checks the kernel timer -+ * -+ * Returns: N/A -+ * -+ */ -+void SkGeCheckTimer( -+DEV_NET *pNet) /* holds the pointer to adapter control context */ -+{ -+ SK_AC *pAC = pNet->pAC; -+ SK_BOOL StartTimer = SK_TRUE; -+ -+ if (pNet->InRecover) -+ return; -+ if (pNet->TimerExpired) -+ return; -+ pNet->TimerExpired = SK_TRUE; -+ -+#define TXPORT pAC->TxPort[pNet->PortNr][TX_PRIO_LOW] -+#define RXPORT pAC->RxPort[pNet->PortNr] -+ -+ if ( (CHIP_ID_YUKON_2(pAC)) && -+ (netif_running(pAC->dev[pNet->PortNr]))) { -+ -+#ifdef Y2_RX_CHECK -+ if (HW_FEATURE(pAC, HWF_WA_DEV_4167)) { -+ /* Checks the RX path */ -+ CheckRxPath(pNet); -+ } -+#endif -+ -+ /* Checkthe transmitter */ -+ if (!(IS_Q_EMPTY(&TXPORT.TxAQ_working))) { -+ if (TXPORT.LastDone != TXPORT.TxALET.Done) { -+ TXPORT.LastDone = TXPORT.TxALET.Done; -+ pNet->TransmitTimeoutTimer = 0; -+ } else { -+ pNet->TransmitTimeoutTimer++; -+ if (pNet->TransmitTimeoutTimer >= 10) { -+ pNet->TransmitTimeoutTimer = 0; -+#ifdef CHECK_TRANSMIT_TIMEOUT -+ StartTimer = SK_FALSE; -+ SkLocalEventQueue(pAC, SKGE_DRV, -+ SK_DRV_RECOVER,pNet->PortNr,-1,SK_FALSE); -+#endif -+ } -+ } -+ } -+ -+#ifdef CHECK_TRANSMIT_TIMEOUT -+// if (!timer_pending(&pNet->KernelTimer)) { -+ pNet->KernelTimer.expires = jiffies + (HZ/4); /* 100ms */ -+ add_timer(&pNet->KernelTimer); -+ pNet->TimerExpired = SK_FALSE; -+// } -+#endif -+ } -+} -+ -+ -+/***************************************************************************** -+* -+* CheckRXCounters - Checks the the statistics for RX path hang -+* -+* Description: -+* This function is called periodical by a timer. -+* -+* Notes: -+* -+* Function Parameters: -+* -+* Returns: -+* Traffic status -+* -+*/ -+static SK_BOOL CheckRXCounters( -+DEV_NET *pNet) /* holds the pointer to adapter control context */ -+{ -+ SK_AC *pAC = pNet->pAC; -+ SK_BOOL bStatus = SK_FALSE; -+ -+ /* Variable used to store the MAC RX FIFO RP, RPLev*/ -+ SK_U32 MACFifoRP = 0; -+ SK_U32 MACFifoRLev = 0; -+ -+ /* Variable used to store the PCI RX FIFO RP, RPLev*/ -+ SK_U32 RXFifoRP = 0; -+ SK_U8 RXFifoRLev = 0; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> CheckRXCounters()\n")); -+ -+ /*Check if statistic counters hangs*/ -+ if (pNet->LastJiffies == pAC->dev[pNet->PortNr]->last_rx) { -+ /* Now read the values of read pointer/level from MAC RX FIFO again */ -+ SK_IN32(pAC->IoBase, MR_ADDR(pNet->PortNr, RX_GMF_RP), &MACFifoRP); -+ SK_IN32(pAC->IoBase, MR_ADDR(pNet->PortNr, RX_GMF_RLEV), &MACFifoRLev); -+ -+ /* Now read the values of read pointer/level from RX FIFO again */ -+ SK_IN8(pAC->IoBase, Q_ADDR(pAC->GIni.GP[pNet->PortNr].PRxQOff, Q_RX_RP), &RXFifoRP); -+ SK_IN8(pAC->IoBase, Q_ADDR(pAC->GIni.GP[pNet->PortNr].PRxQOff, Q_RX_RL), &RXFifoRLev); -+ -+ /* Check if the MAC RX hang */ -+ if ((MACFifoRP == pNet->PreviousMACFifoRP) && -+ (pNet->PreviousMACFifoRP != 0) && -+ (MACFifoRLev >= pNet->PreviousMACFifoRLev)){ -+ bStatus = SK_TRUE; -+ } -+ -+ /* Check if the PCI RX hang */ -+ if ((RXFifoRP == pNet->PreviousRXFifoRP) && -+ (pNet->PreviousRXFifoRP != 0) && -+ (RXFifoRLev >= pNet->PreviousRXFifoRLev)){ -+ /*Set the flag to indicate that the RX FIFO hangs*/ -+ bStatus = SK_TRUE; -+ } -+ } -+ -+ /* Store now the values of counters for next check */ -+ pNet->LastJiffies = pAC->dev[pNet->PortNr]->last_rx; -+ -+ /* Store the values of read pointer/level from MAC RX FIFO for next test */ -+ pNet->PreviousMACFifoRP = MACFifoRP; -+ pNet->PreviousMACFifoRLev = MACFifoRLev; -+ -+ /* Store the values of read pointer/level from RX FIFO for next test */ -+ pNet->PreviousRXFifoRP = RXFifoRP; -+ pNet->PreviousRXFifoRLev = RXFifoRLev; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== CheckRXCounters()\n")); -+ -+ return bStatus; -+} -+ -+/***************************************************************************** -+* -+* CheckRxPath - Checks if the RX path -+* -+* Description: -+* This function is called periodical by a timer. -+* -+* Notes: -+* -+* Function Parameters: -+* -+* Returns: -+* None. -+* -+*/ -+static void CheckRxPath( -+DEV_NET *pNet) /* holds the pointer to adapter control context */ -+{ -+ unsigned long Flags; /* for the spin locks */ -+ /* Initialize the pAC structure.*/ -+ SK_AC *pAC = pNet->pAC; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> CheckRxPath()\n")); -+ -+ /*If the statistics are not changed then could be an RX problem */ -+ if (CheckRXCounters(pNet)){ -+ /* -+ * First we try the simple solution by resetting the Level Timer -+ */ -+ -+ /* Stop Level Timer of Status BMU */ -+ SK_OUT8(pAC->IoBase, STAT_LEV_TIMER_CTRL, TIM_STOP); -+ -+ /* Start Level Timer of Status BMU */ -+ SK_OUT8(pAC->IoBase, STAT_LEV_TIMER_CTRL, TIM_START); -+ -+ if (!CheckRXCounters(pNet)) { -+ return; -+ } -+ -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); -+ SkLocalEventQueue(pAC, SKGE_DRV, -+ SK_DRV_RECOVER,pNet->PortNr,-1,SK_TRUE); -+ -+ /* Reset the fifo counters */ -+ pNet->PreviousMACFifoRP = 0; -+ pNet->PreviousMACFifoRLev = 0; -+ pNet->PreviousRXFifoRP = 0; -+ pNet->PreviousRXFifoRLev = 0; -+ -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== CheckRxPath()\n")); -+} -+ -+ -+ -+#endif -+ -+ -+#ifdef CONFIG_PM -+/***************************************************************************** -+ * -+ * sk98lin_resume - Resume the the card -+ * -+ * Description: -+ * This function resumes the card into the D0 state -+ * -+ * Returns: N/A -+ * -+ */ -+static int sk98lin_resume( -+struct pci_dev *pdev) /* the device that is to resume */ -+{ -+ struct net_device *dev = pci_get_drvdata(pdev); -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ SK_U16 PmCtlSts; -+ -+ /* Set the power state to D0 */ -+ pci_set_power_state(pdev, 0); -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9) -+ pci_restore_state(pdev); -+#else -+ pci_restore_state(pdev, pAC->PciState); -+#endif -+ -+ /* Set the adapter power state to D0 */ -+ SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts); -+ PmCtlSts &= ~(PCI_PM_STATE_D3); /* reset all DState bits */ -+ PmCtlSts |= PCI_PM_STATE_D0; -+ SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PmCtlSts); -+ -+ /* Reinit the adapter and start the port again */ -+ pAC->BoardLevel = SK_INIT_DATA; -+ SkDrvLeaveDiagMode(pAC); -+ -+ netif_device_attach(dev); -+ netif_start_queue(dev); -+ return 0; -+} -+ -+/***************************************************************************** -+ * -+ * sk98lin_suspend - Suspend the card -+ * -+ * Description: -+ * This function suspends the card into a defined state -+ * -+ * Returns: N/A -+ * -+ */ -+static int sk98lin_suspend( -+struct pci_dev *pdev, /* pointer to the device that is to suspend */ -+u32 state) /* what power state is desired by Linux? */ -+{ -+ struct net_device *dev = pci_get_drvdata(pdev); -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ SK_U16 PciPMControlStatus; -+ SK_U16 PciPMCapabilities; -+ SK_MAC_ADDR MacAddr; -+ int i; -+ -+ /* GEnesis and first yukon revs do not support power management */ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { -+ if (pAC->GIni.GIChipRev == 0) { -+ return 0; /* power management not supported */ -+ } -+ } -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { -+ return 0; /* not supported for this chipset */ -+ } -+ -+ if (pAC->WolInfo.ConfiguredWolOptions == 0) { -+ return 0; /* WOL possible, but disabled via ethtool */ -+ } -+ -+ if(netif_running(dev)) { -+ netif_stop_queue(dev); /* stop device if running */ -+ } -+ -+ netif_device_detach(dev); -+ -+ /* read the PM control/status register from the PCI config space */ -+ SK_IN16(pAC->IoBase, PCI_C(pAC, PCI_PM_CTL_STS), &PciPMControlStatus); -+ -+ /* read the power management capabilities from the config space */ -+ SK_IN16(pAC->IoBase, PCI_C(pAC, PCI_PM_CAP_REG), &PciPMCapabilities); -+ -+ /* Enable WakeUp with Magic Packet - get MAC address from adapter */ -+ for (i = 0; i < SK_MAC_ADDR_LEN; i++) { -+ /* virtual address: will be used for data */ -+ SK_IN8(pAC->IoBase, (B2_MAC_1 + i), &MacAddr.a[i]); -+ } -+ -+ SkDrvEnterDiagMode(pAC); -+ SkEnableWOMagicPacket(pAC, pAC->IoBase, MacAddr); -+ -+ pci_enable_wake(pdev, 3, 1); -+ pci_enable_wake(pdev, 4, 1); /* 4 == D3 cold */ -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9) -+ pci_save_state(pdev); -+#else -+ pci_save_state(pdev, pAC->PciState); -+#endif -+ pci_set_power_state(pdev, state); /* set the state */ -+ -+ return 0; -+} -+ -+ -+/****************************************************************************** -+ * -+ * SkEnableWOMagicPacket - Enable Wake on Magic Packet on the adapter -+ * -+ * Context: -+ * init, pageable -+ * the adapter should be de-initialized before calling this function -+ * -+ * Returns: -+ * nothing -+ */ -+ -+static void SkEnableWOMagicPacket( -+SK_AC *pAC, /* Adapter Control Context */ -+SK_IOC IoC, /* I/O control context */ -+SK_MAC_ADDR MacAddr) /* MacAddr expected in magic packet */ -+{ -+ SK_U16 Word; -+ SK_U32 DWord; -+ int i; -+ int HwPortIndex; -+ int Port = 0; -+ -+ /* use Port 0 as long as we do not have any dual port cards which support WOL */ -+ HwPortIndex = 0; -+ DWord = 0; -+ -+ SK_OUT16(IoC, 0x0004, 0x0002); /* clear S/W Reset */ -+ SK_OUT16(IoC, 0x0f10, 0x0002); /* clear Link Reset */ -+ -+ /* -+ * PHY Configuration: -+ * Autonegotioation is enalbed, advertise 10 HD, 10 FD, -+ * 100 HD, and 100 FD. -+ */ -+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) || -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON) || -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE)) { -+ -+ SK_OUT16(IoC, 0x0004, 0x0800); /* enable CLK_RUN */ -+ SK_OUT8(IoC, 0x0007, 0xa9); /* enable VAUX */ -+ -+ /* WA code for COMA mode */ -+ /* Only for yukon plus based chipsets rev A3 */ -+ if (pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) { -+ SK_IN32(IoC, B2_GP_IO, &DWord); -+ DWord |= GP_DIR_9; /* set to output */ -+ DWord &= ~GP_IO_9; /* clear PHY reset (active high) */ -+ SK_OUT32(IoC, B2_GP_IO, DWord); /* clear PHY reset */ -+ } -+ -+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) || -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { -+ SK_OUT32(IoC, 0x0f04, 0x01f04001); /* set PHY reset */ -+ SK_OUT32(IoC, 0x0f04, 0x01f04002); /* clear PHY reset */ -+ } else { -+ SK_OUT8(IoC, 0x0f04, 0x02); /* clear PHY reset */ -+ } -+ -+ SK_OUT8(IoC, 0x0f00, 0x02); /* clear MAC reset */ -+ SkGmPhyWrite(pAC, IoC, Port, 4, 0x01e1); /* advertise 10/100 HD/FD */ -+ SkGmPhyWrite(pAC, IoC, Port, 9, 0x0000); /* do not advertise 1000 HD/FD */ -+ SkGmPhyWrite(pAC, IoC, Port, 00, 0xB300); /* 100 MBit, disable Autoneg */ -+ } else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) { -+ SK_OUT8(IoC, 0x0007, 0xa9); /* enable VAUX */ -+ SK_OUT8(IoC, 0x0f04, 0x02); /* clear PHY reset */ -+ SK_OUT8(IoC, 0x0f00, 0x02); /* clear MAC reset */ -+ SkGmPhyWrite(pAC, IoC, Port, 16, 0x0130); /* Enable Automatic Crossover */ -+ SkGmPhyWrite(pAC, IoC, Port, 00, 0xB300); /* 100 MBit, disable Autoneg */ -+ } -+ -+ -+ /* -+ * MAC Configuration: -+ * Set the MAC to 100 HD and enable the auto update features -+ * for Speed, Flow Control and Duplex Mode. -+ * If autonegotiation completes successfully the -+ * MAC takes the link parameters from the PHY. -+ * If the link partner doesn't support autonegotiation -+ * the MAC can receive magic packets if the link partner -+ * uses 100 HD. -+ */ -+ SK_OUT16(IoC, 0x2804, 0x3832); -+ -+ -+ /* -+ * Set Up Magic Packet parameters -+ */ -+ for (i = 0; i < 6; i+=2) { /* set up magic packet MAC address */ -+ SK_IN16(IoC, 0x100 + i, &Word); -+ SK_OUT16(IoC, 0xf24 + i, Word); -+ } -+ -+ SK_OUT16(IoC, 0x0f20, 0x0208); /* enable PME on magic packet */ -+ /* and on wake up frame */ -+ -+ /* -+ * Set up PME generation -+ */ -+ /* set PME legacy mode */ -+ /* Only for PCI express based chipsets */ -+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) || -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE)) { -+ SkPciReadCfgDWord(pAC, 0x40, &DWord); -+ DWord |= 0x8000; -+ SkPciWriteCfgDWord(pAC, 0x40, DWord); -+ } -+ -+ /* clear PME status and switch adapter to DState */ -+ SkPciReadCfgWord(pAC, 0x4c, &Word); -+ Word |= 0x103; -+ SkPciWriteCfgWord(pAC, 0x4c, Word); -+} /* SkEnableWOMagicPacket */ -+#endif -+ - - /***************************************************************************** - * -@@ -643,7 +1182,9 @@ SK_AC *pAC; - if (pAC->IoBase) { - iounmap(pAC->IoBase); - } -- if (pAC->pDescrMem) { -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2FreeResources(pAC); -+ } else { - BoardFreeMem(pAC); - } - } -@@ -653,28 +1194,6 @@ SK_AC *pAC; - MODULE_AUTHOR("Mirko Lindner <mlindner@syskonnect.de>"); - MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver"); - MODULE_LICENSE("GPL"); --MODULE_PARM(Speed_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(Speed_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(AutoNeg_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(AutoNeg_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(DupCap_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(DupCap_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(FlowCtrl_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(FlowCtrl_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(ConType, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(PrefPort, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(RlmtMode, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --/* not used, just there because every driver should have them: */ --MODULE_PARM(options, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i"); --MODULE_PARM(debug, "i"); --/* used for interrupt moderation */ --MODULE_PARM(IntsPerSec, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i"); --MODULE_PARM(Moderation, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(Stats, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(ModerationMask, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); --MODULE_PARM(AutoSizing, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); - - - #ifdef LINK_SPEED_A -@@ -755,47 +1274,55 @@ static char *RlmtMode[SK_MAX_CARD_PARAM] - static char *RlmtMode[SK_MAX_CARD_PARAM] = {"", }; - #endif - --static int debug = 0; /* not used */ --static int options[SK_MAX_CARD_PARAM] = {0, }; /* not used */ -- - static int IntsPerSec[SK_MAX_CARD_PARAM]; - static char *Moderation[SK_MAX_CARD_PARAM]; - static char *ModerationMask[SK_MAX_CARD_PARAM]; --static char *AutoSizing[SK_MAX_CARD_PARAM]; --static char *Stats[SK_MAX_CARD_PARAM]; - -+static char *LowLatency[SK_MAX_CARD_PARAM]; - --/***************************************************************************** -- * -- * skge_init_module - module initialization function -- * -- * Description: -- * Very simple, only call skge_probe and return approriate result. -- * -- * Returns: -- * 0, if everything is ok -- * !=0, on error -- */ --static int __init skge_init_module(void) --{ -- int cards; -- SkGeRootDev = NULL; -- -- /* just to avoid warnings ... */ -- debug = 0; -- options[0] = 0; -- -- cards = skge_probe(); -- if (cards == 0) { -- printk("sk98lin: No adapter found.\n"); -- } -- return cards ? 0 : -ENODEV; --} /* skge_init_module */ -+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9) -+module_param_array(Speed_A, charp, NULL, 0); -+module_param_array(Speed_B, charp, NULL, 0); -+module_param_array(AutoNeg_A, charp, NULL, 0); -+module_param_array(AutoNeg_B, charp, NULL, 0); -+module_param_array(DupCap_A, charp, NULL, 0); -+module_param_array(DupCap_B, charp, NULL, 0); -+module_param_array(FlowCtrl_A, charp, NULL, 0); -+module_param_array(FlowCtrl_B, charp, NULL, 0); -+module_param_array(Role_A, charp, NULL, 0); -+module_param_array(Role_B, charp, NULL, 0); -+module_param_array(ConType, charp, NULL, 0); -+module_param_array(PrefPort, charp, NULL, 0); -+module_param_array(RlmtMode, charp, NULL, 0); -+/* used for interrupt moderation */ -+module_param_array(IntsPerSec, int, NULL, 0); -+module_param_array(Moderation, charp, NULL, 0); -+module_param_array(ModerationMask, charp, NULL, 0); -+module_param_array(LowLatency, charp, NULL, 0); -+#else -+MODULE_PARM(Speed_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(Speed_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(AutoNeg_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(AutoNeg_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(DupCap_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(DupCap_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(FlowCtrl_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(FlowCtrl_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(ConType, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(PrefPort, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(RlmtMode, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(IntsPerSec, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i"); -+MODULE_PARM(Moderation, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(ModerationMask, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+MODULE_PARM(LowLatency, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -+#endif - - - /***************************************************************************** - * -- * skge_cleanup_module - module unload function -+ * sk98lin_remove_device - device deinit function - * - * Description: - * Disable adapter if it is still running, free resources, -@@ -803,73 +1330,83 @@ static int __init skge_init_module(void) - * - * Returns: N/A - */ --static void __exit skge_cleanup_module(void) -+ -+static void sk98lin_remove_device(struct pci_dev *pdev) - { - DEV_NET *pNet; - SK_AC *pAC; - struct SK_NET_DEVICE *next; - unsigned long Flags; --SK_EVPARA EvPara; -+struct net_device *dev = pci_get_drvdata(pdev); - -- while (SkGeRootDev) { -- pNet = (DEV_NET*) SkGeRootDev->priv; -- pAC = pNet->pAC; -- next = pAC->Next; - -- netif_stop_queue(SkGeRootDev); -- SkGeYellowLED(pAC, pAC->IoBase, 0); -+ /* Device not available. Return. */ -+ if (!dev) -+ return; - -- if(pAC->BoardLevel == SK_INIT_RUN) { -- /* board is still alive */ -- spin_lock_irqsave(&pAC->SlowPathLock, Flags); -- EvPara.Para32[0] = 0; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); -- EvPara.Para32[0] = 1; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); -- SkEventDispatcher(pAC, pAC->IoBase); -- /* disable interrupts */ -- SK_OUT32(pAC->IoBase, B0_IMSK, 0); -- SkGeDeInit(pAC, pAC->IoBase); -- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -- pAC->BoardLevel = SK_INIT_DATA; -- /* We do NOT check here, if IRQ was pending, of course*/ -- } -- -- if(pAC->BoardLevel == SK_INIT_IO) { -- /* board is still alive */ -- SkGeDeInit(pAC, pAC->IoBase); -- pAC->BoardLevel = SK_INIT_DATA; -- } -- -- if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){ -- unregister_netdev(pAC->dev[1]); -- free_netdev(pAC->dev[1]); -- } -+ pNet = (DEV_NET*) dev->priv; -+ pAC = pNet->pAC; -+ next = pAC->Next; - -- FreeResources(SkGeRootDev); -+ netif_stop_queue(dev); -+ SkGeYellowLED(pAC, pAC->IoBase, 0); - -- SkGeRootDev->get_stats = NULL; -- /* -- * otherwise unregister_netdev calls get_stats with -- * invalid IO ... :-( -- */ -- unregister_netdev(SkGeRootDev); -- free_netdev(SkGeRootDev); -- kfree(pAC); -- SkGeRootDev = next; -+ if(pAC->BoardLevel == SK_INIT_RUN) { -+ /* board is still alive */ -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, -+ 0, -1, SK_FALSE); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, -+ 1, -1, SK_TRUE); -+ -+ /* disable interrupts */ -+ SK_OUT32(pAC->IoBase, B0_IMSK, 0); -+ SkGeDeInit(pAC, pAC->IoBase); -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+ pAC->BoardLevel = SK_INIT_DATA; -+ /* We do NOT check here, if IRQ was pending, of course*/ -+ } -+ -+ if(pAC->BoardLevel == SK_INIT_IO) { -+ /* board is still alive */ -+ SkGeDeInit(pAC, pAC->IoBase); -+ pAC->BoardLevel = SK_INIT_DATA; -+ } -+ -+ if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){ -+ unregister_netdev(pAC->dev[1]); -+ free_netdev(pAC->dev[1]); - } - -+ FreeResources(dev); -+ - #ifdef CONFIG_PROC_FS -- /* clear proc-dir */ -- remove_proc_entry(pSkRootDir->name, proc_net); -+ /* Remove the sk98lin procfs device entries */ -+ if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){ -+ remove_proc_entry(pAC->dev[1]->name, pSkRootDir); -+ } -+ remove_proc_entry(pNet->InitialDevName, pSkRootDir); - #endif - --} /* skge_cleanup_module */ -+ dev->get_stats = NULL; -+ /* -+ * otherwise unregister_netdev calls get_stats with -+ * invalid IO ... :-( -+ */ -+ unregister_netdev(dev); -+ free_netdev(dev); -+ kfree(pAC); -+ sk98lin_max_boards_found--; -+ -+#ifdef CONFIG_PROC_FS -+ /* Remove all Proc entries if last device */ -+ if (sk98lin_max_boards_found == 0) { -+ /* clear proc-dir */ -+ remove_proc_entry(pSkRootDir->name, proc_net); -+ } -+#endif - --module_init(skge_init_module); --module_exit(skge_cleanup_module); -+} - - - /***************************************************************************** -@@ -908,7 +1445,11 @@ SK_BOOL DualNet; - spin_lock_init(&pAC->TxPort[i][0].TxDesRingLock); - spin_lock_init(&pAC->RxPort[i].RxDesRingLock); - } -+ -+ spin_lock_init(&pAC->InitLock); /* Init lock */ - spin_lock_init(&pAC->SlowPathLock); -+ spin_lock_init(&pAC->TxQueueLock); /* for Yukon2 chipsets */ -+ spin_lock_init(&pAC->SetPutIndexLock); /* for Yukon2 chipsets */ - - /* level 0 init common modules here */ - -@@ -927,15 +1468,13 @@ SK_BOOL DualNet; - SkTimerInit(pAC, pAC->IoBase, SK_INIT_DATA); - - pAC->BoardLevel = SK_INIT_DATA; -- pAC->RxBufSize = ETH_BUF_SIZE; -+ pAC->RxPort[0].RxBufSize = ETH_BUF_SIZE; -+ pAC->RxPort[1].RxBufSize = ETH_BUF_SIZE; - - SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString); - SK_PNMI_SET_DRIVER_VER(pAC, VerStr); - -- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -- - /* level 1 init common modules here (HW init) */ -- spin_lock_irqsave(&pAC->SlowPathLock, Flags); - if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { - printk("sk98lin: HWInit (1) failed.\n"); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -@@ -947,51 +1486,93 @@ SK_BOOL DualNet; - SkAddrInit( pAC, pAC->IoBase, SK_INIT_IO); - SkRlmtInit( pAC, pAC->IoBase, SK_INIT_IO); - SkTimerInit(pAC, pAC->IoBase, SK_INIT_IO); -+#ifdef Y2_RECOVERY -+ /* mark entries invalid */ -+ pAC->LastPort = 3; -+ pAC->LastOpc = 0xFF; -+#endif - - /* Set chipset type support */ -- pAC->ChipsetType = 0; - if ((pAC->GIni.GIChipId == CHIP_ID_YUKON) || -- (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE)) { -- pAC->ChipsetType = 1; -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) || -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LP)) { -+ pAC->ChipsetType = 1; /* Yukon chipset (descriptor logic) */ -+ } else if (CHIP_ID_YUKON_2(pAC)) { -+ pAC->ChipsetType = 2; /* Yukon2 chipset (list logic) */ -+ } else { -+ pAC->ChipsetType = 0; /* Genesis chipset (descriptor logic) */ -+ } -+ -+ /* wake on lan support */ -+ pAC->WolInfo.SupportedWolOptions = 0; -+#if defined (ETHTOOL_GWOL) && defined (ETHTOOL_SWOL) -+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) { -+ pAC->WolInfo.SupportedWolOptions = WAKE_MAGIC; -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { -+ if (pAC->GIni.GIChipRev == 0) { -+ pAC->WolInfo.SupportedWolOptions = 0; -+ } -+ } - } -+#endif -+ pAC->WolInfo.ConfiguredWolOptions = pAC->WolInfo.SupportedWolOptions; - - GetConfiguration(pAC); - if (pAC->RlmtNets == 2) { -- pAC->GIni.GIPortUsage = SK_MUL_LINK; -+ pAC->GIni.GP[0].PPortUsage = SK_MUL_LINK; -+ pAC->GIni.GP[1].PPortUsage = SK_MUL_LINK; - } - - pAC->BoardLevel = SK_INIT_IO; - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - -- if (pAC->GIni.GIMacsFound == 2) { -- Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, pAC->Name, dev); -- } else if (pAC->GIni.GIMacsFound == 1) { -- Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, -- pAC->Name, dev); -- } else { -- printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n", -- pAC->GIni.GIMacsFound); -- return -EAGAIN; -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if (pAC->GIni.GIMacsFound == 2) { -+ Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, dev->name, dev); -+ } else if (pAC->GIni.GIMacsFound == 1) { -+ Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, dev->name, dev); -+ } else { -+ printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n", -+ pAC->GIni.GIMacsFound); -+ return -EAGAIN; -+ } -+ } -+ else { -+ Ret = request_irq(dev->irq, SkY2Isr, SA_SHIRQ, dev->name, dev); - } - - if (Ret) { - printk(KERN_WARNING "sk98lin: Requested IRQ %d is busy.\n", -- dev->irq); -+ dev->irq); - return -EAGAIN; - } - pAC->AllocFlag |= SK_ALLOC_IRQ; - -- /* Alloc memory for this board (Mem for RxD/TxD) : */ -- if(!BoardAllocMem(pAC)) { -- printk("No memory for descriptor rings.\n"); -- return(-EAGAIN); -+ /* -+ ** Alloc descriptor/LETable memory for this board (both RxD/TxD) -+ */ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ if (!SkY2AllocateResources(pAC)) { -+ printk("No memory for Yukon2 settings\n"); -+ return(-EAGAIN); -+ } -+ } else { -+ if(!BoardAllocMem(pAC)) { -+ printk("No memory for descriptor rings.\n"); -+ return(-EAGAIN); -+ } - } - -+#ifdef SK_USE_CSUM - SkCsSetReceiveFlags(pAC, - SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP, - &pAC->CsOfs1, &pAC->CsOfs2, 0); - pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1; -+#endif - -+ /* -+ ** Function BoardInitMem() for Yukon dependent settings... -+ */ - BoardInitMem(pAC); - /* tschilling: New common function with minimum size check. */ - DualNet = SK_FALSE; -@@ -1003,7 +1584,12 @@ SK_BOOL DualNet; - pAC, - pAC->ActivePort, - DualNet)) { -- BoardFreeMem(pAC); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2FreeResources(pAC); -+ } else { -+ BoardFreeMem(pAC); -+ } -+ - printk("sk98lin: SkGeInitAssignRamToQueues failed.\n"); - return(-EAGAIN); - } -@@ -1103,16 +1689,20 @@ size_t AllocLength; /* length of comple - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("BoardFreeMem\n")); -+ -+ if (pAC->pDescrMem) { -+ - #if (BITS_PER_LONG == 32) -- AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8; -+ AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8; - #else -- AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound -- + RX_RING_SIZE + 8; -+ AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound -+ + RX_RING_SIZE + 8; - #endif - -- pci_free_consistent(pAC->PciDev, AllocLength, -+ pci_free_consistent(pAC->PciDev, AllocLength, - pAC->pDescrMem, pAC->pDescrMemDMA); -- pAC->pDescrMem = NULL; -+ pAC->pDescrMem = NULL; -+ } - } /* BoardFreeMem */ - - -@@ -1121,7 +1711,7 @@ size_t AllocLength; /* length of comple - * BoardInitMem - initiate the descriptor rings - * - * Description: -- * This function sets the descriptor rings up in memory. -+ * This function sets the descriptor rings or LETables up in memory. - * The adapter is initialized with the descriptor start addresses. - * - * Returns: N/A -@@ -1136,34 +1726,37 @@ int TxDescrSize; /* the size of a tx des - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("BoardInitMem\n")); - -- RxDescrSize = (((sizeof(RXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN; -- pAC->RxDescrPerRing = RX_RING_SIZE / RxDescrSize; -- TxDescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN; -- pAC->TxDescrPerRing = TX_RING_SIZE / RxDescrSize; -+ if (!pAC->GIni.GIYukon2) { -+ RxDescrSize = (((sizeof(RXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN; -+ pAC->RxDescrPerRing = RX_RING_SIZE / RxDescrSize; -+ TxDescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN; -+ pAC->TxDescrPerRing = TX_RING_SIZE / RxDescrSize; - -- for (i=0; i<pAC->GIni.GIMacsFound; i++) { -- SetupRing( -- pAC, -- pAC->TxPort[i][0].pTxDescrRing, -- pAC->TxPort[i][0].VTxDescrRing, -- (RXD**)&pAC->TxPort[i][0].pTxdRingHead, -- (RXD**)&pAC->TxPort[i][0].pTxdRingTail, -- (RXD**)&pAC->TxPort[i][0].pTxdRingPrev, -- &pAC->TxPort[i][0].TxdRingFree, -- SK_TRUE); -- SetupRing( -- pAC, -- pAC->RxPort[i].pRxDescrRing, -- pAC->RxPort[i].VRxDescrRing, -- &pAC->RxPort[i].pRxdRingHead, -- &pAC->RxPort[i].pRxdRingTail, -- &pAC->RxPort[i].pRxdRingPrev, -- &pAC->RxPort[i].RxdRingFree, -- SK_FALSE); -+ for (i=0; i<pAC->GIni.GIMacsFound; i++) { -+ SetupRing( -+ pAC, -+ pAC->TxPort[i][0].pTxDescrRing, -+ pAC->TxPort[i][0].VTxDescrRing, -+ (RXD**)&pAC->TxPort[i][0].pTxdRingHead, -+ (RXD**)&pAC->TxPort[i][0].pTxdRingTail, -+ (RXD**)&pAC->TxPort[i][0].pTxdRingPrev, -+ &pAC->TxPort[i][0].TxdRingFree, -+ &pAC->TxPort[i][0].TxdRingPrevFree, -+ SK_TRUE); -+ SetupRing( -+ pAC, -+ pAC->RxPort[i].pRxDescrRing, -+ pAC->RxPort[i].VRxDescrRing, -+ &pAC->RxPort[i].pRxdRingHead, -+ &pAC->RxPort[i].pRxdRingTail, -+ &pAC->RxPort[i].pRxdRingPrev, -+ &pAC->RxPort[i].RxdRingFree, -+ &pAC->RxPort[i].RxdRingFree, -+ SK_FALSE); -+ } - } - } /* BoardInitMem */ - -- - /***************************************************************************** - * - * SetupRing - create one descriptor ring -@@ -1183,6 +1776,7 @@ RXD **ppRingHead, /* address where the - RXD **ppRingTail, /* address where the tail should be written */ - RXD **ppRingPrev, /* address where the tail should be written */ - int *pRingFree, /* address where the # of free descr. goes */ -+int *pRingPrevFree, /* address where the # of free descr. goes */ - SK_BOOL IsTx) /* flag: is this a tx ring */ - { - int i; /* loop counter */ -@@ -1225,11 +1819,12 @@ uintptr_t VNextDescr; /* the virtual bus - } - pPrevDescr->pNextRxd = (RXD*) pMemArea; - pPrevDescr->VNextRxd = VMemArea; -- pDescr = (RXD*) pMemArea; -- *ppRingHead = (RXD*) pMemArea; -- *ppRingTail = *ppRingHead; -- *ppRingPrev = pPrevDescr; -- *pRingFree = DescrNum; -+ pDescr = (RXD*) pMemArea; -+ *ppRingHead = (RXD*) pMemArea; -+ *ppRingTail = *ppRingHead; -+ *ppRingPrev = pPrevDescr; -+ *pRingFree = DescrNum; -+ *pRingPrevFree = DescrNum; - } /* SetupRing */ - - -@@ -1301,10 +1896,28 @@ SK_U32 IntSrc; /* interrupts source re - * Check and process if its our interrupt - */ - SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); -- if (IntSrc == 0) { -+ if ((IntSrc == 0) && (!pNet->NetConsoleMode)) { - return SkIsrRetNone; - } - -+#ifdef CONFIG_SK98LIN_NAPI -+ if (netif_rx_schedule_prep(dev)) { -+ pAC->GIni.GIValIrqMask &= ~(NAPI_DRV_IRQS); -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ __netif_rx_schedule(dev); -+ } -+ -+#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ -+ if (IntSrc & IS_XA1_F) { -+ CLEAR_TX_IRQ(0, TX_PRIO_LOW); -+ } -+ if (IntSrc & IS_XA2_F) { -+ CLEAR_TX_IRQ(1, TX_PRIO_LOW); -+ } -+#endif -+ -+ -+#else - while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { - #if 0 /* software irq currently not used */ - if (IntSrc & IS_IRQ_SW) { -@@ -1318,6 +1931,7 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBGCAT_DRV_INT_SRC, - ("EOF RX1 IRQ\n")); - ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); -+ CLEAR_AND_START_RX(0); - SK_PNMI_CNT_RX_INTR(pAC, 0); - } - if (IntSrc & IS_R2_F) { -@@ -1325,6 +1939,7 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBGCAT_DRV_INT_SRC, - ("EOF RX2 IRQ\n")); - ReceiveIrq(pAC, &pAC->RxPort[1], SK_TRUE); -+ CLEAR_AND_START_RX(1); - SK_PNMI_CNT_RX_INTR(pAC, 1); - } - #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ -@@ -1332,6 +1947,7 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF AS TX1 IRQ\n")); -+ CLEAR_TX_IRQ(0, TX_PRIO_LOW); - SK_PNMI_CNT_TX_INTR(pAC, 0); - spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock); - FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]); -@@ -1341,6 +1957,7 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF AS TX2 IRQ\n")); -+ CLEAR_TX_IRQ(1, TX_PRIO_LOW); - SK_PNMI_CNT_TX_INTR(pAC, 1); - spin_lock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock); - FreeTxDescriptors(pAC, &pAC->TxPort[1][TX_PRIO_LOW]); -@@ -1351,38 +1968,28 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF SY TX1 IRQ\n")); -+ CLEAR_TX_IRQ(0, TX_PRIO_HIGH); - SK_PNMI_CNT_TX_INTR(pAC, 1); - spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock); - FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH); - spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock); -- ClearTxIrq(pAC, 0, TX_PRIO_HIGH); - } - if (IntSrc & IS_XS2_F) { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF SY TX2 IRQ\n")); -+ CLEAR_TX_IRQ(1, TX_PRIO_HIGH); - SK_PNMI_CNT_TX_INTR(pAC, 1); - spin_lock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock); - FreeTxDescriptors(pAC, 1, TX_PRIO_HIGH); - spin_unlock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock); -- ClearTxIrq(pAC, 1, TX_PRIO_HIGH); - } - #endif - #endif - -- /* do all IO at once */ -- if (IntSrc & IS_R1_F) -- ClearAndStartRx(pAC, 0); -- if (IntSrc & IS_R2_F) -- ClearAndStartRx(pAC, 1); --#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ -- if (IntSrc & IS_XA1_F) -- ClearTxIrq(pAC, 0, TX_PRIO_LOW); -- if (IntSrc & IS_XA2_F) -- ClearTxIrq(pAC, 1, TX_PRIO_LOW); --#endif - SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc); - } /* while (IntSrc & IRQ_MASK != 0) */ -+#endif - - IntSrc &= pAC->GIni.GIValIrqMask; - if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) { -@@ -1396,18 +2003,12 @@ SK_U32 IntSrc; /* interrupts source re - SkEventDispatcher(pAC, pAC->IoBase); - spin_unlock(&pAC->SlowPathLock); - } -- /* -- * do it all again is case we cleared an interrupt that -- * came in after handling the ring (OUTs may be delayed -- * in hardware buffers, but are through after IN) -- * -- * rroesler: has been commented out and shifted to -- * SkGeDrvEvent(), because it is timer -- * guarded now -- * -+ -+#ifndef CONFIG_SK98LIN_NAPI -+ /* Handle interrupts */ - ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); - ReceiveIrq(pAC, &pAC->RxPort[1], SK_TRUE); -- */ -+#endif - - if (pAC->CheckQueue) { - pAC->CheckQueue = SK_FALSE; -@@ -1450,10 +2051,25 @@ SK_U32 IntSrc; /* interrupts source re - * Check and process if its our interrupt - */ - SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc); -- if (IntSrc == 0) { -+ if ((IntSrc == 0) && (!pNet->NetConsoleMode)) { - return SkIsrRetNone; - } - -+#ifdef CONFIG_SK98LIN_NAPI -+ if (netif_rx_schedule_prep(dev)) { -+ CLEAR_AND_START_RX(0); -+ CLEAR_TX_IRQ(0, TX_PRIO_LOW); -+ pAC->GIni.GIValIrqMask &= ~(NAPI_DRV_IRQS); -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ __netif_rx_schedule(dev); -+ } -+ -+#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ -+ if (IntSrc & IS_XA1_F) { -+ CLEAR_TX_IRQ(0, TX_PRIO_LOW); -+ } -+#endif -+#else - while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { - #if 0 /* software irq currently not used */ - if (IntSrc & IS_IRQ_SW) { -@@ -1467,6 +2083,7 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBGCAT_DRV_INT_SRC, - ("EOF RX1 IRQ\n")); - ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); -+ CLEAR_AND_START_RX(0); - SK_PNMI_CNT_RX_INTR(pAC, 0); - } - #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ -@@ -1474,6 +2091,7 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF AS TX1 IRQ\n")); -+ CLEAR_TX_IRQ(0, TX_PRIO_LOW); - SK_PNMI_CNT_TX_INTR(pAC, 0); - spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock); - FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]); -@@ -1484,24 +2102,18 @@ SK_U32 IntSrc; /* interrupts source re - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_INT_SRC, - ("EOF SY TX1 IRQ\n")); -+ CLEAR_TX_IRQ(0, TX_PRIO_HIGH); - SK_PNMI_CNT_TX_INTR(pAC, 0); - spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock); - FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH); - spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock); -- ClearTxIrq(pAC, 0, TX_PRIO_HIGH); - } - #endif - #endif - -- /* do all IO at once */ -- if (IntSrc & IS_R1_F) -- ClearAndStartRx(pAC, 0); --#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ -- if (IntSrc & IS_XA1_F) -- ClearTxIrq(pAC, 0, TX_PRIO_LOW); --#endif - SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc); - } /* while (IntSrc & IRQ_MASK != 0) */ -+#endif - - IntSrc &= pAC->GIni.GIValIrqMask; - if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) { -@@ -1515,17 +2127,10 @@ SK_U32 IntSrc; /* interrupts source re - SkEventDispatcher(pAC, pAC->IoBase); - spin_unlock(&pAC->SlowPathLock); - } -- /* -- * do it all again is case we cleared an interrupt that -- * came in after handling the ring (OUTs may be delayed -- * in hardware buffers, but are through after IN) -- * -- * rroesler: has been commented out and shifted to -- * SkGeDrvEvent(), because it is timer -- * guarded now -- * -+ -+#ifndef CONFIG_SK98LIN_NAPI - ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); -- */ -+#endif - - /* IRQ is processed - Enable IRQs again*/ - SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -@@ -1533,7 +2138,6 @@ SK_U32 IntSrc; /* interrupts source re - return SkIsrRetHandled; - } /* SkGeIsrOnePort */ - -- - /**************************************************************************** - * - * SkGeOpen - handle start of initialized adapter -@@ -1551,27 +2155,23 @@ SK_U32 IntSrc; /* interrupts source re - * != 0 on error - */ - static int SkGeOpen( --struct SK_NET_DEVICE *dev) -+struct SK_NET_DEVICE *dev) /* the device that is to be opened */ - { -- DEV_NET *pNet; -- SK_AC *pAC; -- unsigned long Flags; /* for spin lock */ -- int i; -- SK_EVPARA EvPara; /* an event parameter union */ -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ unsigned long Flags; /* for the spin locks */ -+ unsigned long InitFlags; /* for the spin locks */ -+ int CurrMac; /* loop ctr for ports */ - -- pNet = (DEV_NET*) dev->priv; -- pAC = pNet->pAC; -- - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeOpen: pAC=0x%lX:\n", (unsigned long)pAC)); -+ spin_lock_irqsave(&pAC->InitLock, InitFlags); - --#ifdef SK_DIAG_SUPPORT - if (pAC->DiagModeActive == DIAG_ACTIVE) { - if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) { - return (-1); /* still in use by diag; deny actions */ - } - } --#endif - - if (!try_module_get(THIS_MODULE)) { - return (-1); /* increase of usage count not possible */ -@@ -1595,6 +2195,11 @@ struct SK_NET_DEVICE *dev) - SkRlmtInit (pAC, pAC->IoBase, SK_INIT_IO); - SkTimerInit (pAC, pAC->IoBase, SK_INIT_IO); - pAC->BoardLevel = SK_INIT_IO; -+#ifdef Y2_RECOVERY -+ /* mark entries invalid */ -+ pAC->LastPort = 3; -+ pAC->LastOpc = 0xFF; -+#endif - } - - if (pAC->BoardLevel != SK_INIT_RUN) { -@@ -1613,45 +2218,62 @@ struct SK_NET_DEVICE *dev) - pAC->BoardLevel = SK_INIT_RUN; - } - -- for (i=0; i<pAC->GIni.GIMacsFound; i++) { -- /* Enable transmit descriptor polling. */ -- SkGePollTxD(pAC, pAC->IoBase, i, SK_TRUE); -- FillRxRing(pAC, &pAC->RxPort[i]); -+ for (CurrMac=0; CurrMac<pAC->GIni.GIMacsFound; CurrMac++) { -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ /* Enable transmit descriptor polling. */ -+ SkGePollTxD(pAC, pAC->IoBase, CurrMac, SK_TRUE); -+ FillRxRing(pAC, &pAC->RxPort[CurrMac]); -+ SkMacRxTxEnable(pAC, pAC->IoBase, pNet->PortNr); -+ } - } -- SkGeYellowLED(pAC, pAC->IoBase, 1); - -- StartDrvCleanupTimer(pAC); -+ SkGeYellowLED(pAC, pAC->IoBase, 1); - SkDimEnableModerationIfNeeded(pAC); -- SkDimDisplayModerationSettings(pAC); - -- pAC->GIni.GIValIrqMask &= IRQ_MASK; -- -- /* enable Interrupts */ -- SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -- SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK); -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ /* -+ ** Has been setup already at SkGeInit(SK_INIT_IO), -+ ** but additional masking added for Genesis & Yukon -+ ** chipsets -> modify it... -+ */ -+ pAC->GIni.GIValIrqMask &= IRQ_MASK; -+#ifndef USE_TX_COMPLETE -+ pAC->GIni.GIValIrqMask &= ~(TX_COMPL_IRQS); -+#endif -+ } - - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - - if ((pAC->RlmtMode != 0) && (pAC->MaxPorts == 0)) { -- EvPara.Para32[0] = pAC->RlmtNets; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS, -- EvPara); -- EvPara.Para32[0] = pAC->RlmtMode; -- EvPara.Para32[1] = 0; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_MODE_CHANGE, -- EvPara); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS, -+ pAC->RlmtNets, -1, SK_FALSE); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_MODE_CHANGE, -+ pAC->RlmtMode, 0, SK_FALSE); - } - -- EvPara.Para32[0] = pNet->NetNr; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); -- SkEventDispatcher(pAC, pAC->IoBase); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, -+ pNet->NetNr, -1, SK_TRUE); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - -- pAC->MaxPorts++; -- pNet->Up = 1; -+#ifdef Y2_RECOVERY -+ pNet->TimerExpired = SK_FALSE; -+ pNet->InRecover = SK_FALSE; -+ pNet->NetConsoleMode = SK_FALSE; -+ -+ /* Initialize the kernel timer */ -+ init_timer(&pNet->KernelTimer); -+ pNet->KernelTimer.function = SkGeHandleKernelTimer; -+ pNet->KernelTimer.data = (unsigned long) pNet; -+ pNet->KernelTimer.expires = jiffies + (HZ/4); /* initially 250ms */ -+ add_timer(&pNet->KernelTimer); -+#endif -+ -+ /* enable Interrupts */ -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK); - -+ pAC->MaxPorts++; -+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags); - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeOpen suceeded\n")); -@@ -1672,24 +2294,28 @@ struct SK_NET_DEVICE *dev) - * error code - on error - */ - static int SkGeClose( --struct SK_NET_DEVICE *dev) -+struct SK_NET_DEVICE *dev) /* the device that is to be closed */ - { -- DEV_NET *pNet; -- DEV_NET *newPtrNet; -- SK_AC *pAC; -- -- unsigned long Flags; /* for spin lock */ -- int i; -- int PortIdx; -- SK_EVPARA EvPara; -- -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ DEV_NET *newPtrNet; -+ unsigned long Flags; /* for the spin locks */ -+ unsigned long InitFlags; /* for the spin locks */ -+ int CurrMac; /* loop ctr for the current MAC */ -+ int PortIdx; -+#ifdef CONFIG_SK98LIN_NAPI -+ int WorkToDo = 1; /* min(*budget, dev->quota); */ -+ int WorkDone = 0; -+#endif - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC)); -+ spin_lock_irqsave(&pAC->InitLock, InitFlags); - -- pNet = (DEV_NET*) dev->priv; -- pAC = pNet->pAC; -+#ifdef Y2_RECOVERY -+ pNet->InRecover = SK_TRUE; -+ del_timer(&pNet->KernelTimer); -+#endif - --#ifdef SK_DIAG_SUPPORT - if (pAC->DiagModeActive == DIAG_ACTIVE) { - if (pAC->DiagFlowCtrl == SK_FALSE) { - module_put(THIS_MODULE); -@@ -1709,7 +2335,6 @@ struct SK_NET_DEVICE *dev) - pAC->DiagFlowCtrl = SK_FALSE; - } - } --#endif - - netif_stop_queue(dev); - -@@ -1718,8 +2343,6 @@ struct SK_NET_DEVICE *dev) - else - PortIdx = pNet->NetNr; - -- StopDrvCleanupTimer(pAC); -- - /* - * Clear multicast table, promiscuous mode .... - */ -@@ -1731,46 +2354,101 @@ struct SK_NET_DEVICE *dev) - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - /* disable interrupts */ - SK_OUT32(pAC->IoBase, B0_IMSK, 0); -- EvPara.Para32[0] = pNet->NetNr; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); -- SkEventDispatcher(pAC, pAC->IoBase); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, -+ pNet->NetNr, -1, SK_TRUE); - SK_OUT32(pAC->IoBase, B0_IMSK, 0); - /* stop the hardware */ -- SkGeDeInit(pAC, pAC->IoBase); -- pAC->BoardLevel = SK_INIT_DATA; -+ -+ -+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 1)) { -+ /* RLMT check link state mode */ -+ for (CurrMac=0; CurrMac<pAC->GIni.GIMacsFound; CurrMac++) { -+ if (CHIP_ID_YUKON_2(pAC)) -+ SkY2PortStop( pAC, -+ pAC->IoBase, -+ CurrMac, -+ SK_STOP_ALL, -+ SK_HARD_RST); -+ else -+ SkGeStopPort( pAC, -+ pAC->IoBase, -+ CurrMac, -+ SK_STOP_ALL, -+ SK_HARD_RST); -+ } /* for */ -+ } else { -+ /* Single link or single port */ -+ if (CHIP_ID_YUKON_2(pAC)) -+ SkY2PortStop( pAC, -+ pAC->IoBase, -+ PortIdx, -+ SK_STOP_ALL, -+ SK_HARD_RST); -+ else -+ SkGeStopPort( pAC, -+ pAC->IoBase, -+ PortIdx, -+ SK_STOP_ALL, -+ SK_HARD_RST); -+ } - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - } else { -- - spin_lock_irqsave(&pAC->SlowPathLock, Flags); -- EvPara.Para32[0] = pNet->NetNr; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); -- SkPnmiEvent(pAC, pAC->IoBase, SK_PNMI_EVT_XMAC_RESET, EvPara); -- SkEventDispatcher(pAC, pAC->IoBase); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, -+ pNet->NetNr, -1, SK_FALSE); -+ SkLocalEventQueue(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET, -+ pNet->NetNr, -1, SK_TRUE); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - - /* Stop port */ - spin_lock_irqsave(&pAC->TxPort[pNet->PortNr] - [TX_PRIO_LOW].TxDesRingLock, Flags); -- SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr, -- SK_STOP_ALL, SK_HARD_RST); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2PortStop(pAC, pAC->IoBase, pNet->PortNr, -+ SK_STOP_ALL, SK_HARD_RST); -+ } -+ else { -+ SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr, -+ SK_STOP_ALL, SK_HARD_RST); -+ } - spin_unlock_irqrestore(&pAC->TxPort[pNet->PortNr] - [TX_PRIO_LOW].TxDesRingLock, Flags); - } - - if (pAC->RlmtNets == 1) { - /* clear all descriptor rings */ -- for (i=0; i<pAC->GIni.GIMacsFound; i++) { -- ReceiveIrq(pAC, &pAC->RxPort[i], SK_TRUE); -- ClearRxRing(pAC, &pAC->RxPort[i]); -- ClearTxRing(pAC, &pAC->TxPort[i][TX_PRIO_LOW]); -+ for (CurrMac=0; CurrMac<pAC->GIni.GIMacsFound; CurrMac++) { -+ if (!CHIP_ID_YUKON_2(pAC)) { -+#ifdef CONFIG_SK98LIN_NAPI -+ WorkToDo = 1; -+ ReceiveIrq(pAC,&pAC->RxPort[CurrMac], -+ SK_TRUE,&WorkDone,WorkToDo); -+#else -+ ReceiveIrq(pAC,&pAC->RxPort[CurrMac],SK_TRUE); -+#endif -+ ClearRxRing(pAC, &pAC->RxPort[CurrMac]); -+ ClearTxRing(pAC, &pAC->TxPort[CurrMac][TX_PRIO_LOW]); -+ } else { -+ SkY2FreeRxBuffers(pAC, pAC->IoBase, CurrMac); -+ SkY2FreeTxBuffers(pAC, pAC->IoBase, CurrMac); -+ } - } - } else { - /* clear port descriptor rings */ -- ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE); -- ClearRxRing(pAC, &pAC->RxPort[pNet->PortNr]); -- ClearTxRing(pAC, &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]); -+ if (!CHIP_ID_YUKON_2(pAC)) { -+#ifdef CONFIG_SK98LIN_NAPI -+ WorkToDo = 1; -+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE, &WorkDone, WorkToDo); -+#else -+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE); -+#endif -+ ClearRxRing(pAC, &pAC->RxPort[pNet->PortNr]); -+ ClearTxRing(pAC, &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]); -+ } -+ else { -+ SkY2FreeRxBuffers(pAC, pAC->IoBase, pNet->PortNr); -+ SkY2FreeTxBuffers(pAC, pAC->IoBase, pNet->PortNr); -+ } - } - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, -@@ -1781,9 +2459,13 @@ struct SK_NET_DEVICE *dev) - sizeof(SK_PNMI_STRUCT_DATA)); - - pAC->MaxPorts--; -- pNet->Up = 0; -- - module_put(THIS_MODULE); -+ -+#ifdef Y2_RECOVERY -+ pNet->InRecover = SK_FALSE; -+#endif -+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags); -+ - return (0); - } /* SkGeClose */ - -@@ -1841,9 +2523,11 @@ int Rc; /* return code of XmitFrame */ - } - - /* Transmitter out of resources? */ -+#ifdef USE_TX_COMPLETE - if (Rc <= 0) { - netif_stop_queue(dev); - } -+#endif - - /* If not taken, give buffer ownership back to the - * queueing layer. -@@ -1855,6 +2539,96 @@ int Rc; /* return code of XmitFrame */ - return (0); - } /* SkGeXmit */ - -+#ifdef CONFIG_SK98LIN_NAPI -+/***************************************************************************** -+ * -+ * SkGePoll - NAPI Rx polling callback for GEnesis and Yukon chipsets -+ * -+ * Description: -+ * Called by the Linux system in case NAPI polling is activated -+ * -+ * Returns: -+ * The number of work data still to be handled -+ */ -+static int SkGePoll(struct net_device *dev, int *budget) -+{ -+ SK_AC *pAC = ((DEV_NET*)(dev->priv))->pAC; /* pointer to adapter context */ -+ int WorkToDo = min(*budget, dev->quota); -+ int WorkDone = 0; -+ unsigned long Flags; -+ -+ -+ if (pAC->dev[0] != pAC->dev[1]) { -+ spin_lock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock); -+ FreeTxDescriptors(pAC, &pAC->TxPort[1][TX_PRIO_LOW]); -+ spin_unlock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock); -+ -+ ReceiveIrq(pAC, &pAC->RxPort[1], SK_TRUE, &WorkDone, WorkToDo); -+ CLEAR_AND_START_RX(1); -+ } -+ spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock); -+ FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]); -+ spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock); -+ -+ ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE, &WorkDone, WorkToDo); -+ CLEAR_AND_START_RX(0); -+ -+ *budget -= WorkDone; -+ dev->quota -= WorkDone; -+ -+ if(WorkDone < WorkToDo) { -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); -+ netif_rx_complete(dev); -+ pAC->GIni.GIValIrqMask |= (NAPI_DRV_IRQS); -+#ifndef USE_TX_COMPLETE -+ pAC->GIni.GIValIrqMask &= ~(TX_COMPL_IRQS); -+#endif -+ /* enable interrupts again */ -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+ } -+ return (WorkDone >= WorkToDo); -+} /* SkGePoll */ -+#endif -+ -+#ifdef SK_POLL_CONTROLLER -+/***************************************************************************** -+ * -+ * SkGeNetPoll - Polling "interrupt" -+ * -+ * Description: -+ * Polling 'interrupt' - used by things like netconsole and netdump -+ * to send skbs without having to re-enable interrupts. -+ * It's not called while the interrupt routine is executing. -+ */ -+static void SkGeNetPoll( -+struct SK_NET_DEVICE *dev) -+{ -+DEV_NET *pNet; -+SK_AC *pAC; -+ -+ pNet = (DEV_NET*) dev->priv; -+ pAC = pNet->pAC; -+ pNet->NetConsoleMode = SK_TRUE; -+ -+ /* Prevent any reconfiguration while handling -+ the 'interrupt' */ -+ SK_OUT32(pAC->IoBase, B0_IMSK, 0); -+ -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ /* Handle the GENESIS Isr */ -+ if (pAC->GIni.GIMacsFound == 2) -+ SkGeIsr(dev->irq, dev, NULL); -+ else -+ SkGeIsrOnePort(dev->irq, dev, NULL); -+ } else { -+ /* Handle the Yukon2 Isr */ -+ SkY2Isr(dev->irq, dev, NULL); -+ } -+ -+} -+#endif -+ - - /***************************************************************************** - * -@@ -1879,7 +2653,7 @@ int Rc; /* return code of XmitFrame */ - * < 0 - on failure: other problems ( -> return failure to upper layers) - */ - static int XmitFrame( --SK_AC *pAC, /* pointer to adapter context */ -+SK_AC *pAC, /* pointer to adapter context */ - TX_PORT *pTxPort, /* pointer to struct of port to send to */ - struct sk_buff *pMessage) /* pointer to send-message */ - { -@@ -1895,11 +2669,14 @@ struct sk_buff *pMessage) /* pointer to - - spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); - #ifndef USE_TX_COMPLETE -- FreeTxDescriptors(pAC, pTxPort); -+ if ((pTxPort->TxdRingPrevFree - pTxPort->TxdRingFree) > 6) { -+ FreeTxDescriptors(pAC, pTxPort); -+ pTxPort->TxdRingPrevFree = pTxPort->TxdRingFree; -+ } - #endif - if (pTxPort->TxdRingFree == 0) { - /* -- ** no enough free descriptors in ring at the moment. -+ ** not enough free descriptors in ring at the moment. - ** Maybe free'ing some old one help? - */ - FreeTxDescriptors(pAC, pTxPort); -@@ -1985,7 +2762,7 @@ struct sk_buff *pMessage) /* pointer to - BMU_IRQ_EOF | - #endif - pMessage->len; -- } else { -+ } else { - pTxd->TBControl = BMU_OWN | BMU_STF | BMU_CHECK | - BMU_SW | BMU_EOF | - #ifdef USE_TX_COMPLETE -@@ -2321,7 +3098,7 @@ RXD *pRxd; /* the rxd to fill */ - SK_U16 Length; /* data fragment length */ - SK_U64 PhysAddr; /* physical address of a rx buffer */ - -- pMsgBlock = alloc_skb(pAC->RxBufSize, GFP_ATOMIC); -+ pMsgBlock = alloc_skb(pRxPort->RxBufSize, GFP_ATOMIC); - if (pMsgBlock == NULL) { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_ENTRY, -@@ -2335,12 +3112,12 @@ SK_U64 PhysAddr; /* physical address of - pRxd = pRxPort->pRxdRingTail; - pRxPort->pRxdRingTail = pRxd->pNextRxd; - pRxPort->RxdRingFree--; -- Length = pAC->RxBufSize; -+ Length = pRxPort->RxBufSize; - PhysAddr = (SK_U64) pci_map_page(pAC->PciDev, - virt_to_page(pMsgBlock->data), - ((unsigned long) pMsgBlock->data & - ~PAGE_MASK), -- pAC->RxBufSize - 2, -+ pRxPort->RxBufSize - 2, - PCI_DMA_FROMDEVICE); - - pRxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); -@@ -2380,7 +3157,7 @@ SK_U16 Length; /* data fragment length - pRxd = pRxPort->pRxdRingTail; - pRxPort->pRxdRingTail = pRxd->pNextRxd; - pRxPort->RxdRingFree--; -- Length = pAC->RxBufSize; -+ Length = pRxPort->RxBufSize; - - pRxd->VDataLow = PhysLow; - pRxd->VDataHigh = PhysHigh; -@@ -2405,33 +3182,40 @@ SK_U16 Length; /* data fragment length - * Returns: N/A - */ - static void ReceiveIrq( -- SK_AC *pAC, /* pointer to adapter context */ -- RX_PORT *pRxPort, /* pointer to receive port struct */ -- SK_BOOL SlowPathLock) /* indicates if SlowPathLock is needed */ --{ --RXD *pRxd; /* pointer to receive descriptors */ --SK_U32 Control; /* control field of descriptor */ --struct sk_buff *pMsg; /* pointer to message holding frame */ --struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */ --int FrameLength; /* total length of received frame */ --int IpFrameLength; --SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */ --SK_EVPARA EvPara; /* an event parameter union */ --unsigned long Flags; /* for spin lock */ --int PortIndex = pRxPort->PortIndex; --unsigned int Offset; --unsigned int NumBytes; --unsigned int ForRlmt; --SK_BOOL IsBc; --SK_BOOL IsMc; --SK_BOOL IsBadFrame; /* Bad frame */ -- --SK_U32 FrameStat; --unsigned short Csum1; --unsigned short Csum2; --unsigned short Type; --int Result; --SK_U64 PhysAddr; -+#ifdef CONFIG_SK98LIN_NAPI -+SK_AC *pAC, /* pointer to adapter context */ -+RX_PORT *pRxPort, /* pointer to receive port struct */ -+SK_BOOL SlowPathLock, /* indicates if SlowPathLock is needed */ -+int *WorkDone, -+int WorkToDo) -+#else -+SK_AC *pAC, /* pointer to adapter context */ -+RX_PORT *pRxPort, /* pointer to receive port struct */ -+SK_BOOL SlowPathLock) /* indicates if SlowPathLock is needed */ -+#endif -+{ -+ RXD *pRxd; /* pointer to receive descriptors */ -+ struct sk_buff *pMsg; /* pointer to message holding frame */ -+ struct sk_buff *pNewMsg; /* pointer to new message for frame copy */ -+ SK_MBUF *pRlmtMbuf; /* ptr to buffer for giving frame to RLMT */ -+ SK_EVPARA EvPara; /* an event parameter union */ -+ SK_U32 Control; /* control field of descriptor */ -+ unsigned long Flags; /* for spin lock handling */ -+ int PortIndex = pRxPort->PortIndex; -+ int FrameLength; /* total length of received frame */ -+ int IpFrameLength; /* IP length of the received frame */ -+ unsigned int Offset; -+ unsigned int NumBytes; -+ unsigned int RlmtNotifier; -+ SK_BOOL IsBc; /* we received a broadcast packet */ -+ SK_BOOL IsMc; /* we received a multicast packet */ -+ SK_BOOL IsBadFrame; /* the frame received is bad! */ -+ SK_U32 FrameStat; -+ unsigned short Csum1; -+ unsigned short Csum2; -+ unsigned short Type; -+ int Result; -+ SK_U64 PhysAddr; - - rx_start: - /* do forever; exit if BMU_OWN found */ -@@ -2453,6 +3237,13 @@ rx_start: - - Control = pRxd->RBControl; - -+#ifdef CONFIG_SK98LIN_NAPI -+ if (*WorkDone >= WorkToDo) { -+ break; -+ } -+ (*WorkDone)++; -+#endif -+ - /* check if this descriptor is ready */ - if ((Control & BMU_OWN) != 0) { - /* this descriptor is not yet ready */ -@@ -2461,11 +3252,10 @@ rx_start: - FillRxRing(pAC, pRxPort); - return; - } -- pAC->DynIrqModInfo.NbrProcessedDescr++; - - /* get length of frame and check it */ - FrameLength = Control & BMU_BBC; -- if (FrameLength > pAC->RxBufSize) { -+ if (FrameLength > pRxPort->RxBufSize) { - goto rx_failed; - } - -@@ -2480,8 +3270,8 @@ rx_start: - FrameStat = pRxd->FrameStat; - - /* check for frame length mismatch */ --#define XMR_FS_LEN_SHIFT 18 --#define GMR_FS_LEN_SHIFT 16 -+#define XMR_FS_LEN_SHIFT 18 -+#define GMR_FS_LEN_SHIFT 16 - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { - if (FrameLength != (SK_U32) (FrameStat >> XMR_FS_LEN_SHIFT)) { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -@@ -2491,8 +3281,7 @@ rx_start: - (SK_U32) (FrameStat >> XMR_FS_LEN_SHIFT))); - goto rx_failed; - } -- } -- else { -+ } else { - if (FrameLength != (SK_U32) (FrameStat >> GMR_FS_LEN_SHIFT)) { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_RX_PROGRESS, -@@ -2525,9 +3314,6 @@ rx_start: - /* DumpMsg(pMsg, "Rx"); */ - - if ((Control & BMU_STAT_VAL) != BMU_STAT_VAL || (IsBadFrame)) { --#if 0 -- (FrameStat & (XMR_FS_ANY_ERR | XMR_FS_2L_VLAN)) != 0) { --#endif - /* there is a receive error in this frame */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_RX_PROGRESS, -@@ -2535,6 +3321,20 @@ rx_start: - "Control: %x\nRxStat: %x\n", - Control, FrameStat)); - -+ PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32; -+ PhysAddr |= (SK_U64) pRxd->VDataLow; -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) -+ pci_dma_sync_single(pAC->PciDev, -+ (dma_addr_t) PhysAddr, -+ FrameLength, -+ PCI_DMA_FROMDEVICE); -+#else -+ pci_dma_sync_single_for_cpu(pAC->PciDev, -+ (dma_addr_t) PhysAddr, -+ FrameLength, -+ PCI_DMA_FROMDEVICE); -+#endif - ReQueueRxBuffer(pAC, pRxPort, pMsg, - pRxd->VDataHigh, pRxd->VDataLow); - -@@ -2554,150 +3354,107 @@ rx_start: - skb_put(pNewMsg, FrameLength); - PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32; - PhysAddr |= (SK_U64) pRxd->VDataLow; -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) -+ pci_dma_sync_single(pAC->PciDev, -+ (dma_addr_t) PhysAddr, -+ FrameLength, -+ PCI_DMA_FROMDEVICE); -+#else -+ pci_dma_sync_single_for_device(pAC->PciDev, -+ (dma_addr_t) PhysAddr, -+ FrameLength, -+ PCI_DMA_FROMDEVICE); -+#endif - -- pci_dma_sync_single_for_cpu(pAC->PciDev, -- (dma_addr_t) PhysAddr, -- FrameLength, -- PCI_DMA_FROMDEVICE); - eth_copy_and_sum(pNewMsg, pMsg->data, - FrameLength, 0); -- pci_dma_sync_single_for_device(pAC->PciDev, -- (dma_addr_t) PhysAddr, -- FrameLength, -- PCI_DMA_FROMDEVICE); - ReQueueRxBuffer(pAC, pRxPort, pMsg, - pRxd->VDataHigh, pRxd->VDataLow); - - pMsg = pNewMsg; - -- } -- else { -+ } else { - /* - * if large frame, or SKB allocation failed, pass - * the SKB directly to the networking - */ -- - PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32; - PhysAddr |= (SK_U64) pRxd->VDataLow; - - /* release the DMA mapping */ - pci_unmap_single(pAC->PciDev, - PhysAddr, -- pAC->RxBufSize - 2, -+ pRxPort->RxBufSize - 2, - PCI_DMA_FROMDEVICE); -+ skb_put(pMsg, FrameLength); /* set message len */ -+ pMsg->ip_summed = CHECKSUM_NONE; /* initial default */ - -- /* set length in message */ -- skb_put(pMsg, FrameLength); -- /* hardware checksum */ -- Type = ntohs(*((short*)&pMsg->data[12])); -- --#ifdef USE_SK_RX_CHECKSUM -- if (Type == 0x800) { -- Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff); -- Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff); -- IpFrameLength = (int) ntohs((unsigned short) -- ((unsigned short *) pMsg->data)[8]); -- -- /* -- * Test: If frame is padded, a check is not possible! -- * Frame not padded? Length difference must be 14 (0xe)! -- */ -- if ((FrameLength - IpFrameLength) != 0xe) { -- /* Frame padded => TCP offload not possible! */ -- pMsg->ip_summed = CHECKSUM_NONE; -- } else { -- /* Frame not padded => TCP offload! */ -- if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && -- (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || -- (pAC->ChipsetType)) { -- Result = SkCsGetReceiveInfo(pAC, -- &pMsg->data[14], -- Csum1, Csum2, pRxPort->PortIndex); -- if (Result == -- SKCS_STATUS_IP_FRAGMENT || -- Result == -- SKCS_STATUS_IP_CSUM_OK || -- Result == -- SKCS_STATUS_TCP_CSUM_OK || -- Result == -- SKCS_STATUS_UDP_CSUM_OK) { -- pMsg->ip_summed = -- CHECKSUM_UNNECESSARY; -- } -- else if (Result == -- SKCS_STATUS_TCP_CSUM_ERROR || -- Result == -- SKCS_STATUS_UDP_CSUM_ERROR || -- Result == -- SKCS_STATUS_IP_CSUM_ERROR_UDP || -- Result == -- SKCS_STATUS_IP_CSUM_ERROR_TCP || -- Result == -- SKCS_STATUS_IP_CSUM_ERROR ) { -- /* HW Checksum error */ -- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -- SK_DBGCAT_DRV_RX_PROGRESS, -- ("skge: CRC error. Frame dropped!\n")); -- goto rx_failed; -- } else { -- pMsg->ip_summed = -- CHECKSUM_NONE; -- } -- }/* checksumControl calculation valid */ -- } /* Frame length check */ -- } /* IP frame */ --#else -- pMsg->ip_summed = CHECKSUM_NONE; --#endif -+ if (pRxPort->UseRxCsum) { -+ Type = ntohs(*((short*)&pMsg->data[12])); -+ if (Type == 0x800) { -+ IpFrameLength = (int) ntohs((unsigned short) -+ ((unsigned short *) pMsg->data)[8]); -+ if ((FrameLength - IpFrameLength) == 0xe) { -+ Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff); -+ Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff); -+ if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && -+ (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || -+ (pAC->ChipsetType)) { -+ Result = SkCsGetReceiveInfo(pAC, &pMsg->data[14], -+ Csum1, Csum2, PortIndex); -+ if ((Result == SKCS_STATUS_IP_FRAGMENT) || -+ (Result == SKCS_STATUS_IP_CSUM_OK) || -+ (Result == SKCS_STATUS_TCP_CSUM_OK) || -+ (Result == SKCS_STATUS_UDP_CSUM_OK)) { -+ pMsg->ip_summed = CHECKSUM_UNNECESSARY; -+ } else if ((Result == SKCS_STATUS_TCP_CSUM_ERROR) || -+ (Result == SKCS_STATUS_UDP_CSUM_ERROR) || -+ (Result == SKCS_STATUS_IP_CSUM_ERROR_UDP) || -+ (Result == SKCS_STATUS_IP_CSUM_ERROR_TCP) || -+ (Result == SKCS_STATUS_IP_CSUM_ERROR)) { -+ /* HW Checksum error */ -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS, -+ ("skge: CRC error. Frame dropped!\n")); -+ goto rx_failed; -+ } else { -+ pMsg->ip_summed = CHECKSUM_NONE; -+ } -+ }/* checksumControl calculation valid */ -+ } /* Frame length check */ -+ } /* IP frame */ -+ } /* pRxPort->UseRxCsum */ - } /* frame > SK_COPY_TRESHOLD */ - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); -- ForRlmt = SK_RLMT_RX_PROTOCOL; --#if 0 -- IsBc = (FrameStat & XMR_FS_BC)==XMR_FS_BC; --#endif -+ RlmtNotifier = SK_RLMT_RX_PROTOCOL; - SK_RLMT_PRE_LOOKAHEAD(pAC, PortIndex, FrameLength, -- IsBc, &Offset, &NumBytes); -+ IsBc, &Offset, &NumBytes); - if (NumBytes != 0) { --#if 0 -- IsMc = (FrameStat & XMR_FS_MC)==XMR_FS_MC; --#endif -- SK_RLMT_LOOKAHEAD(pAC, PortIndex, -- &pMsg->data[Offset], -- IsBc, IsMc, &ForRlmt); -+ SK_RLMT_LOOKAHEAD(pAC,PortIndex,&pMsg->data[Offset], -+ IsBc,IsMc,&RlmtNotifier); - } -- if (ForRlmt == SK_RLMT_RX_PROTOCOL) { -- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("W")); -+ if (RlmtNotifier == SK_RLMT_RX_PROTOCOL) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("W")); - /* send up only frames from active port */ -- if ((PortIndex == pAC->ActivePort) || -- (pAC->RlmtNets == 2)) { -- /* frame for upper layer */ -+ if ((PortIndex == pAC->ActivePort)||(pAC->RlmtNets == 2)) { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("U")); - #ifdef xDEBUG - DumpMsg(pMsg, "Rx"); - #endif -- SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC, -- FrameLength, pRxPort->PortIndex); -- -- pMsg->dev = pAC->dev[pRxPort->PortIndex]; -- pMsg->protocol = eth_type_trans(pMsg, -- pAC->dev[pRxPort->PortIndex]); -- netif_rx(pMsg); -- pAC->dev[pRxPort->PortIndex]->last_rx = jiffies; -- } -- else { -- /* drop frame */ -+ SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC,FrameLength,PortIndex); -+ pMsg->dev = pAC->dev[PortIndex]; -+ pMsg->protocol = eth_type_trans(pMsg,pAC->dev[PortIndex]); -+ netif_rx(pMsg); /* frame for upper layer */ -+ pAC->dev[PortIndex]->last_rx = jiffies; -+ } else { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -- SK_DBGCAT_DRV_RX_PROGRESS, -- ("D")); -- DEV_KFREE_SKB(pMsg); -+ SK_DBGCAT_DRV_RX_PROGRESS,("D")); -+ DEV_KFREE_SKB(pMsg); /* drop frame */ - } -- -- } /* if not for rlmt */ -- else { -- /* packet for rlmt */ -+ } else { /* packet for RLMT stack */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -- SK_DBGCAT_DRV_RX_PROGRESS, ("R")); -+ SK_DBGCAT_DRV_RX_PROGRESS,("R")); - pRlmtMbuf = SkDrvAllocRlmtMbuf(pAC, - pAC->IoBase, FrameLength); - if (pRlmtMbuf != NULL) { -@@ -2725,32 +3482,22 @@ rx_start: - } - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -- SK_DBGCAT_DRV_RX_PROGRESS, -- ("Q")); -+ SK_DBGCAT_DRV_RX_PROGRESS,("Q")); - } -- if ((pAC->dev[pRxPort->PortIndex]->flags & -- (IFF_PROMISC | IFF_ALLMULTI)) != 0 || -- (ForRlmt & SK_RLMT_RX_PROTOCOL) == -- SK_RLMT_RX_PROTOCOL) { -- pMsg->dev = pAC->dev[pRxPort->PortIndex]; -- pMsg->protocol = eth_type_trans(pMsg, -- pAC->dev[pRxPort->PortIndex]); -+ if ((pAC->dev[PortIndex]->flags & (IFF_PROMISC | IFF_ALLMULTI)) || -+ (RlmtNotifier & SK_RLMT_RX_PROTOCOL)) { -+ pMsg->dev = pAC->dev[PortIndex]; -+ pMsg->protocol = eth_type_trans(pMsg,pAC->dev[PortIndex]); - netif_rx(pMsg); -- pAC->dev[pRxPort->PortIndex]->last_rx = jiffies; -- } -- else { -+ pAC->dev[PortIndex]->last_rx = jiffies; -+ } else { - DEV_KFREE_SKB(pMsg); - } -- -- } /* if packet for rlmt */ -+ } /* if packet for RLMT stack */ - } /* for ... scanning the RXD ring */ - - /* RXD ring is empty -> fill and restart */ - FillRxRing(pAC, pRxPort); -- /* do not start if called from Close */ -- if (pAC->BoardLevel > SK_INIT_DATA) { -- ClearAndStartRx(pAC, PortIndex); -- } - return; - - rx_failed: -@@ -2764,7 +3511,7 @@ rx_failed: - PhysAddr |= (SK_U64) pRxd->VDataLow; - pci_unmap_page(pAC->PciDev, - PhysAddr, -- pAC->RxBufSize - 2, -+ pRxPort->RxBufSize - 2, - PCI_DMA_FROMDEVICE); - DEV_KFREE_SKB_IRQ(pRxd->pMBuf); - pRxd->pMBuf = NULL; -@@ -2774,49 +3521,6 @@ rx_failed: - - } /* ReceiveIrq */ - -- --/***************************************************************************** -- * -- * ClearAndStartRx - give a start receive command to BMU, clear IRQ -- * -- * Description: -- * This function sends a start command and a clear interrupt -- * command for one receive queue to the BMU. -- * -- * Returns: N/A -- * none -- */ --static void ClearAndStartRx( --SK_AC *pAC, /* pointer to the adapter context */ --int PortIndex) /* index of the receive port (XMAC) */ --{ -- SK_OUT8(pAC->IoBase, -- RxQueueAddr[PortIndex]+Q_CSR, -- CSR_START | CSR_IRQ_CL_F); --} /* ClearAndStartRx */ -- -- --/***************************************************************************** -- * -- * ClearTxIrq - give a clear transmit IRQ command to BMU -- * -- * Description: -- * This function sends a clear tx IRQ command for one -- * transmit queue to the BMU. -- * -- * Returns: N/A -- */ --static void ClearTxIrq( --SK_AC *pAC, /* pointer to the adapter context */ --int PortIndex, /* index of the transmit port (XMAC) */ --int Prio) /* priority or normal queue */ --{ -- SK_OUT8(pAC->IoBase, -- TxQueueAddr[PortIndex][Prio]+Q_CSR, -- CSR_IRQ_CL_F); --} /* ClearTxIrq */ -- -- - /***************************************************************************** - * - * ClearRxRing - remove all buffers from the receive ring -@@ -2847,7 +3551,7 @@ SK_U64 PhysAddr; - PhysAddr |= (SK_U64) pRxd->VDataLow; - pci_unmap_page(pAC->PciDev, - PhysAddr, -- pAC->RxBufSize - 2, -+ pRxPort->RxBufSize - 2, - PCI_DMA_FROMDEVICE); - DEV_KFREE_SKB(pRxd->pMBuf); - pRxd->pMBuf = NULL; -@@ -2907,29 +3611,30 @@ static int SkGeSetMacAddr(struct SK_NET_ - - DEV_NET *pNet = (DEV_NET*) dev->priv; - SK_AC *pAC = pNet->pAC; -+int Ret; - - struct sockaddr *addr = p; - unsigned long Flags; - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeSetMacAddr starts now...\n")); -- if(netif_running(dev)) -- return -EBUSY; - - memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); - - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - - if (pAC->RlmtNets == 2) -- SkAddrOverride(pAC, pAC->IoBase, pNet->NetNr, -+ Ret = SkAddrOverride(pAC, pAC->IoBase, pNet->NetNr, - (SK_MAC_ADDR*)dev->dev_addr, SK_ADDR_VIRTUAL_ADDRESS); - else -- SkAddrOverride(pAC, pAC->IoBase, pAC->ActivePort, -+ Ret = SkAddrOverride(pAC, pAC->IoBase, pAC->ActivePort, - (SK_MAC_ADDR*)dev->dev_addr, SK_ADDR_VIRTUAL_ADDRESS); -- -- - - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+ -+ if (Ret != SK_ADDR_OVERRIDE_SUCCESS) -+ return -EBUSY; -+ - return 0; - } /* SkGeSetMacAddr */ - -@@ -3011,6 +3716,45 @@ unsigned long Flags; - - /***************************************************************************** - * -+ * SkSetMtuBufferSize - set the MTU buffer to another value -+ * -+ * Description: -+ * This function sets the new buffers and is called whenever the MTU -+ * size is changed -+ * -+ * Returns: -+ * N/A -+ */ -+ -+static void SkSetMtuBufferSize( -+SK_AC *pAC, /* pointer to adapter context */ -+int PortNr, /* Port number */ -+int Mtu) /* pointer to tx prt struct */ -+{ -+ pAC->RxPort[PortNr].RxBufSize = Mtu + 32; -+ -+ /* RxBufSize must be a multiple of 8 */ -+ while (pAC->RxPort[PortNr].RxBufSize % 8) { -+ pAC->RxPort[PortNr].RxBufSize = -+ pAC->RxPort[PortNr].RxBufSize + 1; -+ } -+ -+ if (Mtu > 1500) { -+ pAC->GIni.GP[PortNr].PPortUsage = SK_JUMBO_LINK; -+ } else { -+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -+ pAC->GIni.GP[PortNr].PPortUsage = SK_MUL_LINK; -+ } else { -+ pAC->GIni.GP[PortNr].PPortUsage = SK_RED_LINK; -+ } -+ } -+ -+ return; -+} -+ -+ -+/***************************************************************************** -+ * - * SkGeChangeMtu - set the MTU to another value - * - * Description: -@@ -3024,12 +3768,13 @@ unsigned long Flags; - */ - static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int NewMtu) - { --DEV_NET *pNet; --DEV_NET *pOtherNet; --SK_AC *pAC; --unsigned long Flags; --int i; --SK_EVPARA EvPara; -+DEV_NET *pNet; -+SK_AC *pAC; -+unsigned long Flags; -+#ifdef CONFIG_SK98LIN_NAPI -+int WorkToDo = 1; // min(*budget, dev->quota); -+int WorkDone = 0; -+#endif - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeChangeMtu starts now...\n")); -@@ -3037,15 +3782,18 @@ SK_EVPARA EvPara; - pNet = (DEV_NET*) dev->priv; - pAC = pNet->pAC; - -+ /* MTU size outside the spec */ - if ((NewMtu < 68) || (NewMtu > SK_JUMBO_MTU)) { - return -EINVAL; - } - -- if(pAC->BoardLevel != SK_INIT_RUN) { -+ /* MTU > 1500 on yukon ulra not allowed */ -+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) -+ && (NewMtu > 1500)){ - return -EINVAL; - } - --#ifdef SK_DIAG_SUPPORT -+ /* Diag access active */ - if (pAC->DiagModeActive == DIAG_ACTIVE) { - if (pAC->DiagFlowCtrl == SK_FALSE) { - return -1; /* still in use, deny any actions of MTU */ -@@ -3053,201 +3801,74 @@ SK_EVPARA EvPara; - pAC->DiagFlowCtrl = SK_FALSE; - } - } --#endif -- -- pNet->Mtu = NewMtu; -- pOtherNet = (DEV_NET*)pAC->dev[1 - pNet->NetNr]->priv; -- if ((pOtherNet->Mtu>1500) && (NewMtu<=1500) && (pOtherNet->Up==1)) { -- return(0); -- } - -- pAC->RxBufSize = NewMtu + 32; - dev->mtu = NewMtu; -+ SkSetMtuBufferSize(pAC, pNet->PortNr, NewMtu); - -- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, -- ("New MTU: %d\n", NewMtu)); -+ if(!netif_running(dev)) { -+ /* Preset MTU size if device not ready/running */ -+ return 0; -+ } - -- /* -- ** Prevent any reconfiguration while changing the MTU -- ** by disabling any interrupts -- */ -+ /* Prevent any reconfiguration while changing the MTU -+ by disabling any interrupts */ - SK_OUT32(pAC->IoBase, B0_IMSK, 0); - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - -- /* -- ** Notify RLMT that any ports are to be stopped -- */ -- EvPara.Para32[0] = 0; -- EvPara.Para32[1] = -1; -- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); -- EvPara.Para32[0] = 1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); -- } else { -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); -- } -- -- /* -- ** After calling the SkEventDispatcher(), RLMT is aware about -- ** the stopped ports -> configuration can take place! -- */ -- SkEventDispatcher(pAC, pAC->IoBase); -- -- for (i=0; i<pAC->GIni.GIMacsFound; i++) { -- spin_lock_irqsave( -- &pAC->TxPort[i][TX_PRIO_LOW].TxDesRingLock, Flags); -- netif_stop_queue(pAC->dev[i]); -+ /* Notify RLMT that the port has to be stopped */ -+ netif_stop_queue(dev); -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, -+ pNet->PortNr, -1, SK_TRUE); -+ spin_lock(&pAC->TxPort[pNet->PortNr][TX_PRIO_LOW].TxDesRingLock); - -- } - -- /* -- ** Depending on the desired MTU size change, a different number of -- ** RX buffers need to be allocated -- */ -- if (NewMtu > 1500) { -- /* -- ** Use less rx buffers -- */ -- for (i=0; i<pAC->GIni.GIMacsFound; i++) { -- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - -- (pAC->RxDescrPerRing / 4); -- } else { -- if (i == pAC->ActivePort) { -- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - -- (pAC->RxDescrPerRing / 4); -- } else { -- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - -- (pAC->RxDescrPerRing / 10); -- } -- } -- } -+ /* Change RxFillLimit to 1 */ -+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -+ pAC->RxPort[pNet->PortNr].RxFillLimit = 1; - } else { -- /* -- ** Use the normal amount of rx buffers -- */ -- for (i=0; i<pAC->GIni.GIMacsFound; i++) { -- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -- pAC->RxPort[i].RxFillLimit = 1; -- } else { -- if (i == pAC->ActivePort) { -- pAC->RxPort[i].RxFillLimit = 1; -- } else { -- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - -- (pAC->RxDescrPerRing / 4); -- } -- } -- } -+ pAC->RxPort[1 - pNet->PortNr].RxFillLimit = 1; -+ pAC->RxPort[pNet->PortNr].RxFillLimit = pAC->RxDescrPerRing - -+ (pAC->RxDescrPerRing / 4); - } -- -- SkGeDeInit(pAC, pAC->IoBase); - -- /* -- ** enable/disable hardware support for long frames -- */ -- if (NewMtu > 1500) { --// pAC->JumboActivated = SK_TRUE; /* is never set back !!! */ -- pAC->GIni.GIPortUsage = SK_JUMBO_LINK; -+ /* clear and reinit the rx rings here, because of new MTU size */ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2PortStop(pAC, pAC->IoBase, pNet->PortNr, SK_STOP_ALL, SK_SOFT_RST); -+ SkY2AllocateRxBuffers(pAC, pAC->IoBase, pNet->PortNr); -+ SkY2PortStart(pAC, pAC->IoBase, pNet->PortNr); - } else { -- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -- pAC->GIni.GIPortUsage = SK_MUL_LINK; -- } else { -- pAC->GIni.GIPortUsage = SK_RED_LINK; -- } -- } -+// SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr, SK_STOP_ALL, SK_SOFT_RST); -+#ifdef CONFIG_SK98LIN_NAPI -+ WorkToDo = 1; -+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE, &WorkDone, WorkToDo); -+#else -+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE); -+#endif -+ ClearRxRing(pAC, &pAC->RxPort[pNet->PortNr]); -+ FillRxRing(pAC, &pAC->RxPort[pNet->PortNr]); - -- SkGeInit( pAC, pAC->IoBase, SK_INIT_IO); -- SkI2cInit( pAC, pAC->IoBase, SK_INIT_IO); -- SkEventInit(pAC, pAC->IoBase, SK_INIT_IO); -- SkPnmiInit( pAC, pAC->IoBase, SK_INIT_IO); -- SkAddrInit( pAC, pAC->IoBase, SK_INIT_IO); -- SkRlmtInit( pAC, pAC->IoBase, SK_INIT_IO); -- SkTimerInit(pAC, pAC->IoBase, SK_INIT_IO); -- -- /* -- ** tschilling: -- ** Speed and others are set back to default in level 1 init! -- */ -- GetConfiguration(pAC); -- -- SkGeInit( pAC, pAC->IoBase, SK_INIT_RUN); -- SkI2cInit( pAC, pAC->IoBase, SK_INIT_RUN); -- SkEventInit(pAC, pAC->IoBase, SK_INIT_RUN); -- SkPnmiInit( pAC, pAC->IoBase, SK_INIT_RUN); -- SkAddrInit( pAC, pAC->IoBase, SK_INIT_RUN); -- SkRlmtInit( pAC, pAC->IoBase, SK_INIT_RUN); -- SkTimerInit(pAC, pAC->IoBase, SK_INIT_RUN); -+ /* Enable transmit descriptor polling */ -+ SkGePollTxD(pAC, pAC->IoBase, pNet->PortNr, SK_TRUE); -+ FillRxRing(pAC, &pAC->RxPort[pNet->PortNr]); -+ } - -- /* -- ** clear and reinit the rx rings here -- */ -- for (i=0; i<pAC->GIni.GIMacsFound; i++) { -- ReceiveIrq(pAC, &pAC->RxPort[i], SK_TRUE); -- ClearRxRing(pAC, &pAC->RxPort[i]); -- FillRxRing(pAC, &pAC->RxPort[i]); -+ netif_start_queue(pAC->dev[pNet->PortNr]); - -- /* -- ** Enable transmit descriptor polling -- */ -- SkGePollTxD(pAC, pAC->IoBase, i, SK_TRUE); -- FillRxRing(pAC, &pAC->RxPort[i]); -- }; -+ spin_unlock(&pAC->TxPort[pNet->PortNr][TX_PRIO_LOW].TxDesRingLock); - -- SkGeYellowLED(pAC, pAC->IoBase, 1); -- SkDimEnableModerationIfNeeded(pAC); -- SkDimDisplayModerationSettings(pAC); - -- netif_start_queue(pAC->dev[pNet->PortNr]); -- for (i=pAC->GIni.GIMacsFound-1; i>=0; i--) { -- spin_unlock(&pAC->TxPort[i][TX_PRIO_LOW].TxDesRingLock); -- } -+ /* Notify RLMT about the changing and restarting one (or more) ports */ -+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, -+ pNet->PortNr, -1, SK_TRUE); - -- /* -- ** Enable Interrupts again -- */ -+ /* Enable Interrupts again */ - SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); - SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK); - -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); -- SkEventDispatcher(pAC, pAC->IoBase); -- -- /* -- ** Notify RLMT about the changing and restarting one (or more) ports -- */ -- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { -- EvPara.Para32[0] = pAC->RlmtNets; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS, EvPara); -- EvPara.Para32[0] = pNet->PortNr; -- EvPara.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); -- -- if (pOtherNet->Up) { -- EvPara.Para32[0] = pOtherNet->PortNr; -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); -- } -- } else { -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); -- } -- -- SkEventDispatcher(pAC, pAC->IoBase); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -- -- /* -- ** While testing this driver with latest kernel 2.5 (2.5.70), it -- ** seems as if upper layers have a problem to handle a successful -- ** return value of '0'. If such a zero is returned, the complete -- ** system hangs for several minutes (!), which is in acceptable. -- ** -- ** Currently it is not clear, what the exact reason for this problem -- ** is. The implemented workaround for 2.5 is to return the desired -- ** new MTU size if all needed changes for the new MTU size where -- ** performed. In kernels 2.2 and 2.4, a zero value is returned, -- ** which indicates the successful change of the mtu-size. -- */ -- return NewMtu; -+ return 0; - --} /* SkGeChangeMtu */ -+} - - - /***************************************************************************** -@@ -3263,75 +3884,67 @@ SK_EVPARA EvPara; - */ - static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev) - { --DEV_NET *pNet = (DEV_NET*) dev->priv; --SK_AC *pAC = pNet->pAC; --SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */ --SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */ --SK_PNMI_CONF *pPnmiConf; /* pointer to virtual link config. */ --unsigned int Size; /* size of pnmi struct */ --unsigned long Flags; /* for spin lock */ -- -- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, -- ("SkGeStats starts now...\n")); -- pPnmiStruct = &pAC->PnmiStruct; -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ unsigned long LateCollisions, ExcessiveCollisions, RxTooLong; -+ unsigned long Flags; /* for spin lock */ -+ SK_U32 MaxNumOidEntries, Oid, Len; -+ char Buf[8]; -+ struct { -+ SK_U32 Oid; -+ unsigned long *pVar; -+ } Vars[] = { -+ { OID_SKGE_STAT_TX_LATE_COL, &LateCollisions }, -+ { OID_SKGE_STAT_TX_EXCESS_COL, &ExcessiveCollisions }, -+ { OID_SKGE_STAT_RX_TOO_LONG, &RxTooLong }, -+ { OID_SKGE_STAT_RX, &pAC->stats.rx_packets }, -+ { OID_SKGE_STAT_TX, &pAC->stats.tx_packets }, -+ { OID_SKGE_STAT_RX_OCTETS, &pAC->stats.rx_bytes }, -+ { OID_SKGE_STAT_TX_OCTETS, &pAC->stats.tx_bytes }, -+ { OID_SKGE_RX_NO_BUF_CTS, &pAC->stats.rx_dropped }, -+ { OID_SKGE_TX_NO_BUF_CTS, &pAC->stats.tx_dropped }, -+ { OID_SKGE_STAT_RX_MULTICAST, &pAC->stats.multicast }, -+ { OID_SKGE_STAT_RX_RUNT, &pAC->stats.rx_length_errors }, -+ { OID_SKGE_STAT_RX_FCS, &pAC->stats.rx_crc_errors }, -+ { OID_SKGE_STAT_RX_FRAMING, &pAC->stats.rx_frame_errors }, -+ { OID_SKGE_STAT_RX_OVERFLOW, &pAC->stats.rx_over_errors }, -+ { OID_SKGE_STAT_RX_MISSED, &pAC->stats.rx_missed_errors }, -+ { OID_SKGE_STAT_TX_CARRIER, &pAC->stats.tx_carrier_errors }, -+ { OID_SKGE_STAT_TX_UNDERRUN, &pAC->stats.tx_fifo_errors }, -+ }; -+ -+ if ((pAC->DiagModeActive == DIAG_NOTACTIVE) && -+ (pAC->BoardLevel == SK_INIT_RUN)) { -+ memset(&pAC->stats, 0x00, sizeof(pAC->stats)); /* clean first */ -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); - --#ifdef SK_DIAG_SUPPORT -- if ((pAC->DiagModeActive == DIAG_NOTACTIVE) && -- (pAC->BoardLevel == SK_INIT_RUN)) { --#endif -- SK_MEMSET(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA)); -- spin_lock_irqsave(&pAC->SlowPathLock, Flags); -- Size = SK_PNMI_STRUCT_SIZE; -- SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); -- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); --#ifdef SK_DIAG_SUPPORT -- } --#endif -+ MaxNumOidEntries = sizeof(Vars) / sizeof(Vars[0]); -+ for (Oid = 0; Oid < MaxNumOidEntries; Oid++) { -+ if (SkPnmiGetVar(pAC,pAC->IoBase, Vars[Oid].Oid, -+ &Buf, &Len, 1, pNet->NetNr) != SK_PNMI_ERR_OK) { -+ memset(Buf, 0x00, sizeof(Buf)); -+ } -+ *Vars[Oid].pVar = (unsigned long) (*((SK_U64 *) Buf)); -+ } -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - -- pPnmiStat = &pPnmiStruct->Stat[0]; -- pPnmiConf = &pPnmiStruct->Conf[0]; -+ pAC->stats.collisions = LateCollisions + ExcessiveCollisions; -+ pAC->stats.tx_errors = pAC->stats.tx_carrier_errors + -+ pAC->stats.tx_fifo_errors; -+ pAC->stats.rx_errors = pAC->stats.rx_length_errors + -+ pAC->stats.rx_crc_errors + -+ pAC->stats.rx_frame_errors + -+ pAC->stats.rx_over_errors + -+ pAC->stats.rx_missed_errors; - -- pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF; -- pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF; -- pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts; -- pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts; -- -- if (pNet->Mtu <= 1500) { -- pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF; -- } else { -- pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts - -- pPnmiStat->StatRxTooLongCts) & 0xFFFFFFFF); -+ if (dev->mtu > 1500) { -+ pAC->stats.rx_errors = pAC->stats.rx_errors - RxTooLong; -+ } - } - -- -- if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && pAC->HWRevision < 12) -- pAC->stats.rx_errors = pAC->stats.rx_errors - pPnmiStat->StatRxShortsCts; -- -- pAC->stats.tx_errors = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; -- pAC->stats.rx_dropped = (SK_U32) pPnmiStruct->RxNoBufCts & 0xFFFFFFFF; -- pAC->stats.tx_dropped = (SK_U32) pPnmiStruct->TxNoBufCts & 0xFFFFFFFF; -- pAC->stats.multicast = (SK_U32) pPnmiStat->StatRxMulticastOkCts & 0xFFFFFFFF; -- pAC->stats.collisions = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; -- -- /* detailed rx_errors: */ -- pAC->stats.rx_length_errors = (SK_U32) pPnmiStat->StatRxRuntCts & 0xFFFFFFFF; -- pAC->stats.rx_over_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; -- pAC->stats.rx_crc_errors = (SK_U32) pPnmiStat->StatRxFcsCts & 0xFFFFFFFF; -- pAC->stats.rx_frame_errors = (SK_U32) pPnmiStat->StatRxFramingCts & 0xFFFFFFFF; -- pAC->stats.rx_fifo_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; -- pAC->stats.rx_missed_errors = (SK_U32) pPnmiStat->StatRxMissedCts & 0xFFFFFFFF; -- -- /* detailed tx_errors */ -- pAC->stats.tx_aborted_errors = (SK_U32) 0; -- pAC->stats.tx_carrier_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; -- pAC->stats.tx_fifo_errors = (SK_U32) pPnmiStat->StatTxFifoUnderrunCts & 0xFFFFFFFF; -- pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; -- pAC->stats.tx_window_errors = (SK_U32) 0; -- - return(&pAC->stats); - } /* SkGeStats */ - -- - /***************************************************************************** - * - * SkGeIoctl - IO-control function -@@ -3345,32 +3958,35 @@ unsigned long Flags; /* for spin lock - * 0, if everything is ok - * !=0, on error - */ --static int SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd) --{ --DEV_NET *pNet; --SK_AC *pAC; --void *pMemBuf; --struct pci_dev *pdev = NULL; --SK_GE_IOCTL Ioctl; --unsigned int Err = 0; --int Size = 0; --int Ret = 0; --unsigned int Length = 0; --int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32); -+static int SkGeIoctl( -+struct SK_NET_DEVICE *dev, /* the device the IOCTL is to be performed on */ -+struct ifreq *rq, /* additional request structure containing data */ -+int cmd) /* requested IOCTL command number */ -+{ -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ struct pci_dev *pdev = NULL; -+ void *pMemBuf; -+ SK_GE_IOCTL Ioctl; -+ unsigned long Flags; /* for spin lock */ -+ unsigned int Err = 0; -+ unsigned int Length = 0; -+ int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32); -+ int Size = 0; -+ int Ret = 0; - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeIoctl starts now...\n")); - -- pNet = (DEV_NET*) dev->priv; -- pAC = pNet->pAC; -- - if(copy_from_user(&Ioctl, rq->ifr_data, sizeof(SK_GE_IOCTL))) { - return -EFAULT; - } - - switch(cmd) { -- case SK_IOCTL_SETMIB: -- case SK_IOCTL_PRESETMIB: -+ case SIOCETHTOOL: -+ return SkEthIoctl(dev, rq); -+ case SK_IOCTL_SETMIB: /* FALL THRU */ -+ case SK_IOCTL_PRESETMIB: /* FALL THRU (if capable!) */ - if (!capable(CAP_NET_ADMIN)) return -EPERM; - case SK_IOCTL_GETMIB: - if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, -@@ -3397,6 +4013,7 @@ int HeaderLength = sizeof(SK_U32) + siz - if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { - return -ENOMEM; - } -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); - if(copy_from_user(pMemBuf, Ioctl.pData, Length)) { - Err = -EFAULT; - goto fault_gen; -@@ -3415,10 +4032,10 @@ int HeaderLength = sizeof(SK_U32) + siz - goto fault_gen; - } - fault_gen: -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - kfree(pMemBuf); /* cleanup everything */ - break; --#ifdef SK_DIAG_SUPPORT -- case SK_IOCTL_DIAG: -+ case SK_IOCTL_DIAG: - if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; -@@ -3442,7 +4059,7 @@ fault_gen: - */ - * ((SK_U32 *)pMemBuf) = 0; - * ((SK_U32 *)pMemBuf + 1) = pdev->bus->number; -- * ((SK_U32 *)pMemBuf + 2) = ParseDeviceNbrFromSlotName(pdev->slot_name); -+ * ((SK_U32 *)pMemBuf + 2) = ParseDeviceNbrFromSlotName(pci_name(pdev)); - if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { - Err = -EFAULT; - goto fault_diag; -@@ -3455,7 +4072,6 @@ fault_gen: - fault_diag: - kfree(pMemBuf); /* cleanup everything */ - break; --#endif - default: - Err = -EOPNOTSUPP; - } -@@ -3487,12 +4103,12 @@ DEV_NET *pNet, /* pointer to the adapte - unsigned int Size, /* length of ioctl data */ - int mode) /* flag for set/preset */ - { --unsigned long Flags; /* for spin lock */ --SK_AC *pAC; -+ SK_AC *pAC = pNet->pAC; -+ unsigned long Flags; /* for spin lock */ - - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("SkGeIocMib starts now...\n")); -- pAC = pNet->pAC; -+ - /* access MIB */ - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - switch(mode) { -@@ -3535,17 +4151,18 @@ SK_AC *pAC) /* pointer to the adapter co - SK_I32 Port; /* preferred port */ - SK_BOOL AutoSet; - SK_BOOL DupSet; --int LinkSpeed = SK_LSPEED_AUTO; /* Link speed */ --int AutoNeg = 1; /* autoneg off (0) or on (1) */ --int DuplexCap = 0; /* 0=both,1=full,2=half */ --int FlowCtrl = SK_FLOW_MODE_SYM_OR_REM; /* FlowControl */ --int MSMode = SK_MS_MODE_AUTO; /* master/slave mode */ -- --SK_BOOL IsConTypeDefined = SK_TRUE; --SK_BOOL IsLinkSpeedDefined = SK_TRUE; --SK_BOOL IsFlowCtrlDefined = SK_TRUE; --SK_BOOL IsRoleDefined = SK_TRUE; --SK_BOOL IsModeDefined = SK_TRUE; -+int LinkSpeed = SK_LSPEED_AUTO; /* Link speed */ -+int AutoNeg = 1; /* autoneg off (0) or on (1) */ -+int DuplexCap = 0; /* 0=both,1=full,2=half */ -+int FlowCtrl = SK_FLOW_MODE_SYM_OR_REM; /* FlowControl */ -+int MSMode = SK_MS_MODE_AUTO; /* master/slave mode */ -+int IrqModMaskOffset = 6; /* all ints moderated=default */ -+ -+SK_BOOL IsConTypeDefined = SK_TRUE; -+SK_BOOL IsLinkSpeedDefined = SK_TRUE; -+SK_BOOL IsFlowCtrlDefined = SK_TRUE; -+SK_BOOL IsRoleDefined = SK_TRUE; -+SK_BOOL IsModeDefined = SK_TRUE; - /* - * The two parameters AutoNeg. and DuplexCap. map to one configuration - * parameter. The mapping is described by this table: -@@ -3563,6 +4180,15 @@ int Capabilities[3][3] = - {SK_LMODE_AUTOBOTH , SK_LMODE_AUTOFULL , SK_LMODE_AUTOHALF }, - {SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE} }; - -+SK_U32 IrqModMask[7][2] = -+ { { IRQ_MASK_RX_ONLY , Y2_DRIVER_IRQS }, -+ { IRQ_MASK_TX_ONLY , Y2_DRIVER_IRQS }, -+ { IRQ_MASK_SP_ONLY , Y2_SPECIAL_IRQS }, -+ { IRQ_MASK_SP_RX , Y2_IRQ_MASK }, -+ { IRQ_MASK_TX_RX , Y2_DRIVER_IRQS }, -+ { IRQ_MASK_SP_TX , Y2_IRQ_MASK }, -+ { IRQ_MASK_RX_TX_SP, Y2_IRQ_MASK } }; -+ - #define DC_BOTH 0 - #define DC_FULL 1 - #define DC_HALF 2 -@@ -3602,7 +4228,7 @@ int Capabilities[3][3] = - ** - ** This ConType parameter is used for all ports of the adapter! - */ -- if ( (ConType != NULL) && -+ if ( (ConType != NULL) && - (pAC->Index < SK_MAX_CARD_PARAM) && - (ConType[pAC->Index] != NULL) ) { - -@@ -3628,40 +4254,40 @@ int Capabilities[3][3] = - M_CurrPort.PMSMode = SK_MS_MODE_AUTO; - M_CurrPort.PLinkSpeed = SK_LSPEED_AUTO; - } -- } else if (strcmp(ConType[pAC->Index],"100FD")==0) { -+ } else if (strcmp(ConType[pAC->Index],"100FD")==0) { - for (Port = 0; Port < SK_MAX_MACS; Port++) { - M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_FULL]; - M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; - M_CurrPort.PMSMode = SK_MS_MODE_AUTO; - M_CurrPort.PLinkSpeed = SK_LSPEED_100MBPS; - } -- } else if (strcmp(ConType[pAC->Index],"100HD")==0) { -+ } else if (strcmp(ConType[pAC->Index],"100HD")==0) { - for (Port = 0; Port < SK_MAX_MACS; Port++) { - M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_HALF]; - M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; - M_CurrPort.PMSMode = SK_MS_MODE_AUTO; - M_CurrPort.PLinkSpeed = SK_LSPEED_100MBPS; - } -- } else if (strcmp(ConType[pAC->Index],"10FD")==0) { -+ } else if (strcmp(ConType[pAC->Index],"10FD")==0) { - for (Port = 0; Port < SK_MAX_MACS; Port++) { - M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_FULL]; - M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; - M_CurrPort.PMSMode = SK_MS_MODE_AUTO; - M_CurrPort.PLinkSpeed = SK_LSPEED_10MBPS; - } -- } else if (strcmp(ConType[pAC->Index],"10HD")==0) { -+ } else if (strcmp(ConType[pAC->Index],"10HD")==0) { - for (Port = 0; Port < SK_MAX_MACS; Port++) { - M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_HALF]; - M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; - M_CurrPort.PMSMode = SK_MS_MODE_AUTO; - M_CurrPort.PLinkSpeed = SK_LSPEED_10MBPS; - } -- } else { -+ } else { - printk("sk98lin: Illegal value \"%s\" for ConType\n", - ConType[pAC->Index]); - IsConTypeDefined = SK_FALSE; /* Wrong ConType defined */ - } -- } else { -+ } else { - IsConTypeDefined = SK_FALSE; /* No ConType defined */ - } - -@@ -3680,14 +4306,30 @@ int Capabilities[3][3] = - } else if (strcmp(Speed_A[pAC->Index],"100")==0) { - LinkSpeed = SK_LSPEED_100MBPS; - } else if (strcmp(Speed_A[pAC->Index],"1000")==0) { -- LinkSpeed = SK_LSPEED_1000MBPS; -+ if ((pAC->PciDev->vendor == 0x11ab ) && -+ (pAC->PciDev->device == 0x4350)) { -+ LinkSpeed = SK_LSPEED_100MBPS; -+ printk("sk98lin: Illegal value \"%s\" for Speed_A.\n" -+ "Gigabit speed not possible with this chip revision!", -+ Speed_A[pAC->Index]); -+ } else { -+ LinkSpeed = SK_LSPEED_1000MBPS; -+ } - } else { - printk("sk98lin: Illegal value \"%s\" for Speed_A\n", - Speed_A[pAC->Index]); - IsLinkSpeedDefined = SK_FALSE; - } - } else { -- IsLinkSpeedDefined = SK_FALSE; -+ if ((pAC->PciDev->vendor == 0x11ab ) && -+ (pAC->PciDev->device == 0x4350)) { -+ /* Gigabit speed not supported -+ * Swith to speed 100 -+ */ -+ LinkSpeed = SK_LSPEED_100MBPS; -+ } else { -+ IsLinkSpeedDefined = SK_FALSE; -+ } - } - - /* -@@ -3782,9 +4424,6 @@ int Capabilities[3][3] = - } - - if (!AutoSet && DupSet) { -- printk("sk98lin: Port A: Duplex setting not" -- " possible in\n default AutoNegotiation mode" -- " (Sense).\n Using AutoNegotiation On\n"); - AutoNeg = AN_ON; - } - -@@ -3812,7 +4451,7 @@ int Capabilities[3][3] = - FlowCtrl = SK_FLOW_MODE_NONE; - } else { - printk("sk98lin: Illegal value \"%s\" for FlowCtrl_A\n", -- FlowCtrl_A[pAC->Index]); -+ FlowCtrl_A[pAC->Index]); - IsFlowCtrlDefined = SK_FALSE; - } - } else { -@@ -3904,7 +4543,7 @@ int Capabilities[3][3] = - ** Decide whether to set new config value if somethig valid has - ** been received. - */ -- if (IsLinkSpeedDefined) { -+ if (IsLinkSpeedDefined) { - pAC->GIni.GP[1].PLinkSpeed = LinkSpeed; - } - -@@ -3980,9 +4619,6 @@ int Capabilities[3][3] = - } - - if (!AutoSet && DupSet) { -- printk("sk98lin: Port B: Duplex setting not" -- " possible in\n default AutoNegotiation mode" -- " (Sense).\n Using AutoNegotiation On\n"); - AutoNeg = AN_ON; - } - -@@ -4095,11 +4731,15 @@ int Capabilities[3][3] = - } - - pAC->RlmtNets = 1; -+ pAC->RlmtMode = 0; - - if (RlmtMode != NULL && pAC->Index<SK_MAX_CARD_PARAM && - RlmtMode[pAC->Index] != NULL) { - if (strcmp(RlmtMode[pAC->Index], "") == 0) { -- pAC->RlmtMode = 0; -+ if (pAC->GIni.GIMacsFound == 2) { -+ pAC->RlmtMode = SK_RLMT_CHECK_LINK; -+ pAC->RlmtNets = 2; -+ } - } else if (strcmp(RlmtMode[pAC->Index], "CheckLinkState") == 0) { - pAC->RlmtMode = SK_RLMT_CHECK_LINK; - } else if (strcmp(RlmtMode[pAC->Index], "CheckLocalPort") == 0) { -@@ -4120,12 +4760,37 @@ int Capabilities[3][3] = - pAC->RlmtMode = 0; - } - } else { -- pAC->RlmtMode = 0; -+ if (pAC->GIni.GIMacsFound == 2) { -+ pAC->RlmtMode = SK_RLMT_CHECK_LINK; -+ pAC->RlmtNets = 2; -+ } - } -- -+ -+#ifdef SK_YUKON2 -+ /* -+ ** use dualnet config per default -+ * -+ pAC->RlmtMode = SK_RLMT_CHECK_LINK; -+ pAC->RlmtNets = 2; -+ */ -+#endif -+ -+ -+ /* -+ ** Check the LowLatance parameters -+ */ -+ pAC->LowLatency = SK_FALSE; -+ if (LowLatency[pAC->Index] != NULL) { -+ if (strcmp(LowLatency[pAC->Index], "On") == 0) { -+ pAC->LowLatency = SK_TRUE; -+ } -+ } -+ -+ - /* - ** Check the interrupt moderation parameters - */ -+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE; - if (Moderation[pAC->Index] != NULL) { - if (strcmp(Moderation[pAC->Index], "") == 0) { - pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE; -@@ -4139,70 +4804,49 @@ int Capabilities[3][3] = - printk("sk98lin: Illegal value \"%s\" for Moderation.\n" - " Disable interrupt moderation.\n", - Moderation[pAC->Index]); -- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE; -- } -- } else { -- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE; -- } -- -- if (Stats[pAC->Index] != NULL) { -- if (strcmp(Stats[pAC->Index], "Yes") == 0) { -- pAC->DynIrqModInfo.DisplayStats = SK_TRUE; -- } else { -- pAC->DynIrqModInfo.DisplayStats = SK_FALSE; - } - } else { -- pAC->DynIrqModInfo.DisplayStats = SK_FALSE; -+/* Set interrupt moderation if wished */ -+#ifdef CONFIG_SK98LIN_STATINT -+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_STATIC; -+#endif - } - - if (ModerationMask[pAC->Index] != NULL) { - if (strcmp(ModerationMask[pAC->Index], "Rx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY; -+ IrqModMaskOffset = 0; - } else if (strcmp(ModerationMask[pAC->Index], "Tx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_ONLY; -+ IrqModMaskOffset = 1; - } else if (strcmp(ModerationMask[pAC->Index], "Sp") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_ONLY; -+ IrqModMaskOffset = 2; - } else if (strcmp(ModerationMask[pAC->Index], "RxSp") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX; -+ IrqModMaskOffset = 3; - } else if (strcmp(ModerationMask[pAC->Index], "SpRx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX; -+ IrqModMaskOffset = 3; - } else if (strcmp(ModerationMask[pAC->Index], "RxTx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX; -+ IrqModMaskOffset = 4; - } else if (strcmp(ModerationMask[pAC->Index], "TxRx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX; -+ IrqModMaskOffset = 4; - } else if (strcmp(ModerationMask[pAC->Index], "TxSp") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX; -+ IrqModMaskOffset = 5; - } else if (strcmp(ModerationMask[pAC->Index], "SpTx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX; -- } else if (strcmp(ModerationMask[pAC->Index], "RxTxSp") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; -- } else if (strcmp(ModerationMask[pAC->Index], "RxSpTx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; -- } else if (strcmp(ModerationMask[pAC->Index], "TxRxSp") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; -- } else if (strcmp(ModerationMask[pAC->Index], "TxSpRx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; -- } else if (strcmp(ModerationMask[pAC->Index], "SpTxRx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; -- } else if (strcmp(ModerationMask[pAC->Index], "SpRxTx") == 0) { -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; -- } else { /* some rubbish */ -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY; -- } -- } else { /* operator has stated nothing */ -- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX; -- } -- -- if (AutoSizing[pAC->Index] != NULL) { -- if (strcmp(AutoSizing[pAC->Index], "On") == 0) { -- pAC->DynIrqModInfo.AutoSizing = SK_FALSE; -- } else { -- pAC->DynIrqModInfo.AutoSizing = SK_FALSE; -+ IrqModMaskOffset = 5; -+ } else { /* some rubbish stated */ -+ // IrqModMaskOffset = 6; ->has been initialized -+ // already at the begin of this function... - } -- } else { /* operator has stated nothing */ -- pAC->DynIrqModInfo.AutoSizing = SK_FALSE; -+ } -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ pAC->DynIrqModInfo.MaskIrqModeration = IrqModMask[IrqModMaskOffset][0]; -+ } else { -+ pAC->DynIrqModInfo.MaskIrqModeration = IrqModMask[IrqModMaskOffset][1]; - } - -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT; -+ } else { -+ pAC->DynIrqModInfo.MaxModIntsPerSec = C_Y2_INTS_PER_SEC_DEFAULT; -+ } - if (IntsPerSec[pAC->Index] != 0) { - if ((IntsPerSec[pAC->Index]< C_INT_MOD_IPS_LOWER_RANGE) || - (IntsPerSec[pAC->Index] > C_INT_MOD_IPS_UPPER_RANGE)) { -@@ -4211,28 +4855,25 @@ int Capabilities[3][3] = - IntsPerSec[pAC->Index], - C_INT_MOD_IPS_LOWER_RANGE, - C_INT_MOD_IPS_UPPER_RANGE, -- C_INTS_PER_SEC_DEFAULT); -- pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT; -+ pAC->DynIrqModInfo.MaxModIntsPerSec); - } else { - pAC->DynIrqModInfo.MaxModIntsPerSec = IntsPerSec[pAC->Index]; - } -- } else { -- pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT; -- } -+ } - - /* - ** Evaluate upper and lower moderation threshold - */ - pAC->DynIrqModInfo.MaxModIntsPerSecUpperLimit = - pAC->DynIrqModInfo.MaxModIntsPerSec + -- (pAC->DynIrqModInfo.MaxModIntsPerSec / 2); -+ (pAC->DynIrqModInfo.MaxModIntsPerSec / 5); - - pAC->DynIrqModInfo.MaxModIntsPerSecLowerLimit = - pAC->DynIrqModInfo.MaxModIntsPerSec - -- (pAC->DynIrqModInfo.MaxModIntsPerSec / 2); -- -- pAC->DynIrqModInfo.PrevTimeVal = jiffies; /* initial value */ -+ (pAC->DynIrqModInfo.MaxModIntsPerSec / 5); - -+ pAC->DynIrqModInfo.DynIrqModSampleInterval = -+ SK_DRV_MODERATION_TIMER_LENGTH; - - } /* GetConfiguration */ - -@@ -4247,65 +4888,21 @@ int Capabilities[3][3] = - * - * Returns: N/A - */ --static void ProductStr( --SK_AC *pAC /* pointer to adapter context */ --) --{ --int StrLen = 80; /* length of the string, defined in SK_AC */ --char Keyword[] = VPD_NAME; /* vpd productname identifier */ --int ReturnCode; /* return code from vpd_read */ --unsigned long Flags; -+static void ProductStr(SK_AC *pAC) -+{ -+ char Default[] = "Generic Marvell Yukon chipset Ethernet device"; -+ char Key[] = VPD_NAME; /* VPD productname key */ -+ int StrLen = 80; /* stringlen */ -+ unsigned long Flags; - - spin_lock_irqsave(&pAC->SlowPathLock, Flags); -- ReturnCode = VpdRead(pAC, pAC->IoBase, Keyword, pAC->DeviceStr, -- &StrLen); -- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -- if (ReturnCode != 0) { -- /* there was an error reading the vpd data */ -+ if (VpdRead(pAC, pAC->IoBase, Key, pAC->DeviceStr, &StrLen)) { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ERROR, -- ("Error reading VPD data: %d\n", ReturnCode)); -- pAC->DeviceStr[0] = '\0'; -- } --} /* ProductStr */ -- --/***************************************************************************** -- * -- * StartDrvCleanupTimer - Start timer to check for descriptors which -- * might be placed in descriptor ring, but -- * havent been handled up to now -- * -- * Description: -- * This function requests a HW-timer fo the Yukon card. The actions to -- * perform when this timer expires, are located in the SkDrvEvent(). -- * -- * Returns: N/A -- */ --static void --StartDrvCleanupTimer(SK_AC *pAC) { -- SK_EVPARA EventParam; /* Event struct for timer event */ -- -- SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam)); -- EventParam.Para32[0] = SK_DRV_RX_CLEANUP_TIMER; -- SkTimerStart(pAC, pAC->IoBase, &pAC->DrvCleanupTimer, -- SK_DRV_RX_CLEANUP_TIMER_LENGTH, -- SKGE_DRV, SK_DRV_TIMER, EventParam); --} -- --/***************************************************************************** -- * -- * StopDrvCleanupTimer - Stop timer to check for descriptors -- * -- * Description: -- * This function requests a HW-timer fo the Yukon card. The actions to -- * perform when this timer expires, are located in the SkDrvEvent(). -- * -- * Returns: N/A -- */ --static void --StopDrvCleanupTimer(SK_AC *pAC) { -- SkTimerStop(pAC, pAC->IoBase, &pAC->DrvCleanupTimer); -- SK_MEMSET((char *) &pAC->DrvCleanupTimer, 0, sizeof(SK_TIMER)); --} -+ ("Error reading VPD data: %d\n", ReturnCode)); -+ strcpy(pAC->DeviceStr, Default); -+ } -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+} /* ProductStr */ - - /****************************************************************************/ - /* functions for common modules *********************************************/ -@@ -4395,7 +4992,9 @@ SK_MBUF *pNextMbuf; - SK_U64 SkOsGetTime(SK_AC *pAC) - { - SK_U64 PrivateJiffies; -+ - SkOsGetTimeCurrent(pAC, &PrivateJiffies); -+ - return PrivateJiffies; - } /* SkOsGetTime */ - -@@ -4550,29 +5149,27 @@ SK_U8 Val) /* pointer to store the read - * - */ - int SkDrvEvent( --SK_AC *pAC, /* pointer to adapter context */ --SK_IOC IoC, /* io-context */ --SK_U32 Event, /* event-id */ --SK_EVPARA Param) /* event-parameter */ --{ --SK_MBUF *pRlmtMbuf; /* pointer to a rlmt-mbuf structure */ --struct sk_buff *pMsg; /* pointer to a message block */ --int FromPort; /* the port from which we switch away */ --int ToPort; /* the port we switch to */ --SK_EVPARA NewPara; /* parameter for further events */ --int Stat; --unsigned long Flags; --SK_BOOL DualNet; -+SK_AC *pAC, /* pointer to adapter context */ -+SK_IOC IoC, /* IO control context */ -+SK_U32 Event, /* event-id */ -+SK_EVPARA Param) /* event-parameter */ -+{ -+ SK_MBUF *pRlmtMbuf; /* pointer to a rlmt-mbuf structure */ -+ struct sk_buff *pMsg; /* pointer to a message block */ -+ SK_BOOL DualNet; -+ SK_U32 Reason; -+ unsigned long Flags; -+ unsigned long InitFlags; -+ int FromPort; /* the port from which we switch away */ -+ int ToPort; /* the port we switch to */ -+ int Stat; -+ DEV_NET *pNet = NULL; -+#ifdef CONFIG_SK98LIN_NAPI -+ int WorkToDo = 1; /* min(*budget, dev->quota); */ -+ int WorkDone = 0; -+#endif - - switch (Event) { -- case SK_DRV_ADAP_FAIL: -- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, -- ("ADAPTER FAIL EVENT\n")); -- printk("%s: Adapter failed.\n", pAC->dev[0]->name); -- /* disable interrupts */ -- SK_OUT32(pAC->IoBase, B0_IMSK, 0); -- /* cgoos */ -- break; - case SK_DRV_PORT_FAIL: - FromPort = Param.Para32[0]; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, -@@ -4582,222 +5179,296 @@ SK_BOOL DualNet; - } else { - printk("%s: Port B failed.\n", pAC->dev[1]->name); - } -- /* cgoos */ - break; -- case SK_DRV_PORT_RESET: /* SK_U32 PortIdx */ -- /* action list 4 */ -+ case SK_DRV_PORT_RESET: - FromPort = Param.Para32[0]; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, - ("PORT RESET EVENT, Port: %d ", FromPort)); -- NewPara.Para64 = FromPort; -- SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara); -+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET, -+ FromPort, SK_FALSE); - spin_lock_irqsave( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); -- -- SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2PortStop(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST); -+ } else { -+ SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST); -+ } - pAC->dev[Param.Para32[0]]->flags &= ~IFF_RUNNING; - spin_unlock_irqrestore( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); - -- /* clear rx ring from received frames */ -- ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE); -- -- ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]); -+ if (!CHIP_ID_YUKON_2(pAC)) { -+#ifdef CONFIG_SK98LIN_NAPI -+ WorkToDo = 1; -+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE, &WorkDone, WorkToDo); -+#else -+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE); -+#endif -+ ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]); -+ } - spin_lock_irqsave( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); -- -- /* tschilling: Handling of return value inserted. */ -- if (SkGeInitPort(pAC, IoC, FromPort)) { -- if (FromPort == 0) { -- printk("%s: SkGeInitPort A failed.\n", pAC->dev[0]->name); -+ -+#ifdef USE_TIST_FOR_RESET -+ if (pAC->GIni.GIYukon2) { -+#ifdef Y2_RECOVERY -+ /* for Yukon II we want to have tist enabled all the time */ -+ if (!SK_ADAPTER_WAITING_FOR_TIST(pAC)) { -+ Y2_ENABLE_TIST(pAC->IoBase); -+ } -+#else -+ /* make sure that we do not accept any status LEs from now on */ -+ if (SK_ADAPTER_WAITING_FOR_TIST(pAC)) { -+#endif -+ /* port already waiting for tist */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Port %c is now waiting for specific Tist\n", -+ 'A' + FromPort)); -+ SK_SET_WAIT_BIT_FOR_PORT( -+ pAC, -+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST, -+ FromPort); -+ /* get current timestamp */ -+ Y2_GET_TIST_LOW_VAL(pAC->IoBase, &pAC->MinTistLo); -+ pAC->MinTistHi = pAC->GIni.GITimeStampCnt; -+#ifndef Y2_RECOVERY - } else { -- printk("%s: SkGeInitPort B failed.\n", pAC->dev[1]->name); -+ /* nobody is waiting yet */ -+ SK_SET_WAIT_BIT_FOR_PORT( -+ pAC, -+ SK_PSTATE_WAITING_FOR_ANY_TIST, -+ FromPort); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Port %c is now waiting for any Tist (0x%X)\n", -+ 'A' + FromPort, pAC->AdapterResetState)); -+ /* start tist */ -+ Y2_ENABLE_TIST(pAC-IoBase); -+ } -+#endif -+ } -+#endif -+ -+#ifdef Y2_LE_CHECK -+ /* mark entries invalid */ -+ pAC->LastPort = 3; -+ pAC->LastOpc = 0xFF; -+#endif -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2PortStart(pAC, IoC, FromPort); -+ } else { -+ /* tschilling: Handling of return value inserted. */ -+ if (SkGeInitPort(pAC, IoC, FromPort)) { -+ if (FromPort == 0) { -+ printk("%s: SkGeInitPort A failed.\n", pAC->dev[0]->name); -+ } else { -+ printk("%s: SkGeInitPort B failed.\n", pAC->dev[1]->name); -+ } - } -+ SkAddrMcUpdate(pAC,IoC, FromPort); -+ PortReInitBmu(pAC, FromPort); -+ SkGePollTxD(pAC, IoC, FromPort, SK_TRUE); -+ CLEAR_AND_START_RX(FromPort); - } -- SkAddrMcUpdate(pAC,IoC, FromPort); -- PortReInitBmu(pAC, FromPort); -- SkGePollTxD(pAC, IoC, FromPort, SK_TRUE); -- ClearAndStartRx(pAC, FromPort); - spin_unlock_irqrestore( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); - break; -- case SK_DRV_NET_UP: /* SK_U32 PortIdx */ -- /* action list 5 */ -+ case SK_DRV_NET_UP: -+ spin_lock_irqsave(&pAC->InitLock, InitFlags); - FromPort = Param.Para32[0]; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, -- ("NET UP EVENT, Port: %d ", Param.Para32[0])); -- /* Mac update */ -- SkAddrMcUpdate(pAC,IoC, FromPort); -- -+ ("NET UP EVENT, Port: %d ", FromPort)); -+ SkAddrMcUpdate(pAC,IoC, FromPort); /* Mac update */ - if (DoPrintInterfaceChange) { -- printk("%s: network connection up using" -- " port %c\n", pAC->dev[Param.Para32[0]]->name, 'A'+Param.Para32[0]); -+ printk("%s: network connection up using port %c\n", -+ pAC->dev[FromPort]->name, 'A'+FromPort); - -- /* tschilling: Values changed according to LinkSpeedUsed. */ -- Stat = pAC->GIni.GP[FromPort].PLinkSpeedUsed; -- if (Stat == SK_LSPEED_STAT_10MBPS) { -- printk(" speed: 10\n"); -- } else if (Stat == SK_LSPEED_STAT_100MBPS) { -- printk(" speed: 100\n"); -- } else if (Stat == SK_LSPEED_STAT_1000MBPS) { -- printk(" speed: 1000\n"); -- } else { -- printk(" speed: unknown\n"); -- } -+ /* tschilling: Values changed according to LinkSpeedUsed. */ -+ Stat = pAC->GIni.GP[FromPort].PLinkSpeedUsed; -+ if (Stat == SK_LSPEED_STAT_10MBPS) { -+ printk(" speed: 10\n"); -+ } else if (Stat == SK_LSPEED_STAT_100MBPS) { -+ printk(" speed: 100\n"); -+ } else if (Stat == SK_LSPEED_STAT_1000MBPS) { -+ printk(" speed: 1000\n"); -+ } else { -+ printk(" speed: unknown\n"); -+ } - -+ Stat = pAC->GIni.GP[FromPort].PLinkModeStatus; -+ if ((Stat == SK_LMODE_STAT_AUTOHALF) || -+ (Stat == SK_LMODE_STAT_AUTOFULL)) { -+ printk(" autonegotiation: yes\n"); -+ } else { -+ printk(" autonegotiation: no\n"); -+ } - -- Stat = pAC->GIni.GP[FromPort].PLinkModeStatus; -- if (Stat == SK_LMODE_STAT_AUTOHALF || -- Stat == SK_LMODE_STAT_AUTOFULL) { -- printk(" autonegotiation: yes\n"); -- } -- else { -- printk(" autonegotiation: no\n"); -- } -- if (Stat == SK_LMODE_STAT_AUTOHALF || -- Stat == SK_LMODE_STAT_HALF) { -- printk(" duplex mode: half\n"); -- } -- else { -- printk(" duplex mode: full\n"); -- } -- Stat = pAC->GIni.GP[FromPort].PFlowCtrlStatus; -- if (Stat == SK_FLOW_STAT_REM_SEND ) { -- printk(" flowctrl: remote send\n"); -- } -- else if (Stat == SK_FLOW_STAT_LOC_SEND ){ -- printk(" flowctrl: local send\n"); -- } -- else if (Stat == SK_FLOW_STAT_SYMMETRIC ){ -- printk(" flowctrl: symmetric\n"); -- } -- else { -- printk(" flowctrl: none\n"); -- } -- -- /* tschilling: Check against CopperType now. */ -- if ((pAC->GIni.GICopperType == SK_TRUE) && -- (pAC->GIni.GP[FromPort].PLinkSpeedUsed == -- SK_LSPEED_STAT_1000MBPS)) { -- Stat = pAC->GIni.GP[FromPort].PMSStatus; -- if (Stat == SK_MS_STAT_MASTER ) { -- printk(" role: master\n"); -+ if ((Stat == SK_LMODE_STAT_AUTOHALF) || -+ (Stat == SK_LMODE_STAT_HALF)) { -+ printk(" duplex mode: half\n"); -+ } else { -+ printk(" duplex mode: full\n"); - } -- else if (Stat == SK_MS_STAT_SLAVE ) { -- printk(" role: slave\n"); -+ -+ Stat = pAC->GIni.GP[FromPort].PFlowCtrlStatus; -+ if (Stat == SK_FLOW_STAT_REM_SEND ) { -+ printk(" flowctrl: remote send\n"); -+ } else if (Stat == SK_FLOW_STAT_LOC_SEND ) { -+ printk(" flowctrl: local send\n"); -+ } else if (Stat == SK_FLOW_STAT_SYMMETRIC ) { -+ printk(" flowctrl: symmetric\n"); -+ } else { -+ printk(" flowctrl: none\n"); - } -- else { -- printk(" role: ???\n"); -+ -+ /* tschilling: Check against CopperType now. */ -+ if ((pAC->GIni.GICopperType == SK_TRUE) && -+ (pAC->GIni.GP[FromPort].PLinkSpeedUsed == -+ SK_LSPEED_STAT_1000MBPS)) { -+ Stat = pAC->GIni.GP[FromPort].PMSStatus; -+ if (Stat == SK_MS_STAT_MASTER ) { -+ printk(" role: master\n"); -+ } else if (Stat == SK_MS_STAT_SLAVE ) { -+ printk(" role: slave\n"); -+ } else { -+ printk(" role: ???\n"); -+ } - } -- } - -- /* -- Display dim (dynamic interrupt moderation) -- informations -- */ -- if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) -- printk(" irq moderation: static (%d ints/sec)\n", -+ /* Display interrupt moderation informations */ -+ if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) { -+ printk(" irq moderation: static (%d ints/sec)\n", - pAC->DynIrqModInfo.MaxModIntsPerSec); -- else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) -- printk(" irq moderation: dynamic (%d ints/sec)\n", -+ } else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -+ printk(" irq moderation: dynamic (%d ints/sec)\n", - pAC->DynIrqModInfo.MaxModIntsPerSec); -- else -- printk(" irq moderation: disabled\n"); -+ } else { -+ printk(" irq moderation: disabled\n"); -+ } -+ -+#ifdef NETIF_F_TSO -+ if (CHIP_ID_YUKON_2(pAC)) { -+ if (pAC->dev[FromPort]->features & NETIF_F_TSO) { -+ printk(" tcp offload: enabled\n"); -+ } else { -+ printk(" tcp offload: disabled\n"); -+ } -+ } -+#endif - -+ if (pAC->dev[FromPort]->features & NETIF_F_SG) { -+ printk(" scatter-gather: enabled\n"); -+ } else { -+ printk(" scatter-gather: disabled\n"); -+ } - --#ifdef SK_ZEROCOPY -- if (pAC->ChipsetType) --#ifdef USE_SK_TX_CHECKSUM -- printk(" scatter-gather: enabled\n"); --#else -- printk(" tx-checksum: disabled\n"); --#endif -- else -- printk(" scatter-gather: disabled\n"); --#else -- printk(" scatter-gather: disabled\n"); --#endif -+ if (pAC->dev[FromPort]->features & NETIF_F_IP_CSUM) { -+ printk(" tx-checksum: enabled\n"); -+ } else { -+ printk(" tx-checksum: disabled\n"); -+ } - --#ifndef USE_SK_RX_CHECKSUM -- printk(" rx-checksum: disabled\n"); -+ if (pAC->RxPort[FromPort].UseRxCsum) { -+ printk(" rx-checksum: enabled\n"); -+ } else { -+ printk(" rx-checksum: disabled\n"); -+ } -+#ifdef CONFIG_SK98LIN_NAPI -+ printk(" rx-polling: enabled\n"); - #endif -- -+ if (pAC->LowLatency) { -+ printk(" low latency: enabled\n"); -+ } - } else { -- DoPrintInterfaceChange = SK_TRUE; -- } -+ DoPrintInterfaceChange = SK_TRUE; -+ } - -- if ((Param.Para32[0] != pAC->ActivePort) && -- (pAC->RlmtNets == 1)) { -- NewPara.Para32[0] = pAC->ActivePort; -- NewPara.Para32[1] = Param.Para32[0]; -- SkEventQueue(pAC, SKGE_DRV, SK_DRV_SWITCH_INTERN, -- NewPara); -+ if ((FromPort != pAC->ActivePort)&&(pAC->RlmtNets == 1)) { -+ SkLocalEventQueue(pAC, SKGE_DRV, SK_DRV_SWITCH_INTERN, -+ pAC->ActivePort, FromPort, SK_FALSE); - } - - /* Inform the world that link protocol is up. */ -- pAC->dev[Param.Para32[0]]->flags |= IFF_RUNNING; -- -+ netif_wake_queue(pAC->dev[FromPort]); -+ netif_carrier_on(pAC->dev[FromPort]); -+ pAC->dev[FromPort]->flags |= IFF_RUNNING; -+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags); - break; -- case SK_DRV_NET_DOWN: /* SK_U32 Reason */ -- /* action list 7 */ -+ case SK_DRV_NET_DOWN: -+ Reason = Param.Para32[0]; -+ FromPort = Param.Para32[1]; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, - ("NET DOWN EVENT ")); -+ -+ /* Stop queue and carrier */ -+ netif_stop_queue(pAC->dev[FromPort]); -+ netif_carrier_off(pAC->dev[FromPort]); -+ -+ /* Print link change */ - if (DoPrintInterfaceChange) { -- printk("%s: network connection down\n", -- pAC->dev[Param.Para32[1]]->name); -+ if (pAC->dev[FromPort]->flags & IFF_RUNNING) { -+ printk("%s: network connection down\n", -+ pAC->dev[FromPort]->name); -+ } - } else { - DoPrintInterfaceChange = SK_TRUE; - } -- pAC->dev[Param.Para32[1]]->flags &= ~IFF_RUNNING; -+ pAC->dev[FromPort]->flags &= ~IFF_RUNNING; - break; -- case SK_DRV_SWITCH_HARD: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */ -- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, -- ("PORT SWITCH HARD ")); -- case SK_DRV_SWITCH_SOFT: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */ -- /* action list 6 */ -- printk("%s: switching to port %c\n", pAC->dev[0]->name, -- 'A'+Param.Para32[1]); -- case SK_DRV_SWITCH_INTERN: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */ -+ case SK_DRV_SWITCH_HARD: /* FALL THRU */ -+ case SK_DRV_SWITCH_SOFT: /* FALL THRU */ -+ case SK_DRV_SWITCH_INTERN: - FromPort = Param.Para32[0]; -- ToPort = Param.Para32[1]; -+ ToPort = Param.Para32[1]; -+ printk("%s: switching from port %c to port %c\n", -+ pAC->dev[0]->name, 'A'+FromPort, 'A'+ToPort); - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, - ("PORT SWITCH EVENT, From: %d To: %d (Pref %d) ", - FromPort, ToPort, pAC->Rlmt.Net[0].PrefPort)); -- NewPara.Para64 = FromPort; -- SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara); -- NewPara.Para64 = ToPort; -- SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara); -+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET, -+ FromPort, SK_FALSE); -+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET, -+ ToPort, SK_FALSE); - spin_lock_irqsave( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); -- spin_lock_irqsave( -- &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags); -- SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST); -- SkGeStopPort(pAC, IoC, ToPort, SK_STOP_ALL, SK_SOFT_RST); -- spin_unlock_irqrestore( -- &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags); -+ spin_lock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2PortStop(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST); -+ SkY2PortStop(pAC, IoC, ToPort, SK_STOP_ALL, SK_SOFT_RST); -+ } -+ else { -+ SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST); -+ SkGeStopPort(pAC, IoC, ToPort, SK_STOP_ALL, SK_SOFT_RST); -+ } -+ spin_unlock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock); - spin_unlock_irqrestore( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); - -- ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE); /* clears rx ring */ -- ReceiveIrq(pAC, &pAC->RxPort[ToPort], SK_FALSE); /* clears rx ring */ - -- ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]); -- ClearTxRing(pAC, &pAC->TxPort[ToPort][TX_PRIO_LOW]); -+ if (!CHIP_ID_YUKON_2(pAC)) { -+#ifdef CONFIG_SK98LIN_NAPI -+ WorkToDo = 1; -+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE, &WorkDone, WorkToDo); -+ ReceiveIrq(pAC, &pAC->RxPort[ToPort], SK_FALSE, &WorkDone, WorkToDo); -+#else -+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE); /* clears rx ring */ -+ ReceiveIrq(pAC, &pAC->RxPort[ToPort], SK_FALSE); /* clears rx ring */ -+#endif -+ ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]); -+ ClearTxRing(pAC, &pAC->TxPort[ToPort][TX_PRIO_LOW]); -+ } -+ - spin_lock_irqsave( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); -- spin_lock_irqsave( -- &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags); -+ spin_lock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock); - pAC->ActivePort = ToPort; --#if 0 -- SetQueueSizes(pAC); --#else -+ - /* tschilling: New common function with minimum size check. */ - DualNet = SK_FALSE; - if (pAC->RlmtNets == 2) { -@@ -4808,85 +5479,325 @@ SK_BOOL DualNet; - pAC, - pAC->ActivePort, - DualNet)) { -- spin_unlock_irqrestore( -- &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags); -+ spin_unlock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock); - spin_unlock_irqrestore( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); - printk("SkGeInitAssignRamToQueues failed.\n"); - break; - } --#endif -- /* tschilling: Handling of return values inserted. */ -- if (SkGeInitPort(pAC, IoC, FromPort) || -- SkGeInitPort(pAC, IoC, ToPort)) { -- printk("%s: SkGeInitPort failed.\n", pAC->dev[0]->name); -+ -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ /* tschilling: Handling of return values inserted. */ -+ if (SkGeInitPort(pAC, IoC, FromPort) || -+ SkGeInitPort(pAC, IoC, ToPort)) { -+ printk("%s: SkGeInitPort failed.\n", pAC->dev[0]->name); -+ } - } -- if (Event == SK_DRV_SWITCH_SOFT) { -- SkMacRxTxEnable(pAC, IoC, FromPort); -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if (Event == SK_DRV_SWITCH_SOFT) { -+ SkMacRxTxEnable(pAC, IoC, FromPort); -+ } -+ SkMacRxTxEnable(pAC, IoC, ToPort); - } -- SkMacRxTxEnable(pAC, IoC, ToPort); -+ - SkAddrSwap(pAC, IoC, FromPort, ToPort); - SkAddrMcUpdate(pAC, IoC, FromPort); - SkAddrMcUpdate(pAC, IoC, ToPort); -- PortReInitBmu(pAC, FromPort); -- PortReInitBmu(pAC, ToPort); -- SkGePollTxD(pAC, IoC, FromPort, SK_TRUE); -- SkGePollTxD(pAC, IoC, ToPort, SK_TRUE); -- ClearAndStartRx(pAC, FromPort); -- ClearAndStartRx(pAC, ToPort); -- spin_unlock_irqrestore( -- &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags); -+ -+#ifdef USE_TIST_FOR_RESET -+ if (pAC->GIni.GIYukon2) { -+ /* make sure that we do not accept any status LEs from now on */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("both Ports now waiting for specific Tist\n")); -+ SK_SET_WAIT_BIT_FOR_PORT( -+ pAC, -+ SK_PSTATE_WAITING_FOR_ANY_TIST, -+ 0); -+ SK_SET_WAIT_BIT_FOR_PORT( -+ pAC, -+ SK_PSTATE_WAITING_FOR_ANY_TIST, -+ 1); -+ -+ /* start tist */ -+ Y2_ENABLE_TIST(pAC->IoBase); -+ } -+#endif -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ PortReInitBmu(pAC, FromPort); -+ PortReInitBmu(pAC, ToPort); -+ SkGePollTxD(pAC, IoC, FromPort, SK_TRUE); -+ SkGePollTxD(pAC, IoC, ToPort, SK_TRUE); -+ CLEAR_AND_START_RX(FromPort); -+ CLEAR_AND_START_RX(ToPort); -+ } else { -+ SkY2PortStart(pAC, IoC, FromPort); -+ SkY2PortStart(pAC, IoC, ToPort); -+#ifdef SK_YUKON2 -+ /* in yukon-II always port 0 has to be started first */ -+ // SkY2PortStart(pAC, IoC, 0); -+ // SkY2PortStart(pAC, IoC, 1); -+#endif -+ } -+ spin_unlock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock); - spin_unlock_irqrestore( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, - Flags); - break; - case SK_DRV_RLMT_SEND: /* SK_MBUF *pMb */ -- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, -- ("RLS ")); -+ SK_DBG_MSG(NULL,SK_DBGMOD_DRV,SK_DBGCAT_DRV_EVENT,("RLS ")); - pRlmtMbuf = (SK_MBUF*) Param.pParaPtr; - pMsg = (struct sk_buff*) pRlmtMbuf->pOs; - skb_put(pMsg, pRlmtMbuf->Length); -- if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW], -- pMsg) < 0) -- -- DEV_KFREE_SKB_ANY(pMsg); -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW], -+ pMsg) < 0) { -+ DEV_KFREE_SKB_ANY(pMsg); -+ } -+ } else { -+ if (SkY2RlmtSend(pAC, pRlmtMbuf->PortIdx, pMsg) < 0) { -+ DEV_KFREE_SKB_ANY(pMsg); -+ } -+ } - break; - case SK_DRV_TIMER: - if (Param.Para32[0] == SK_DRV_MODERATION_TIMER) { -- /* -- ** expiration of the moderation timer implies that -- ** dynamic moderation is to be applied -- */ -+ /* check what IRQs are to be moderated */ - SkDimStartModerationTimer(pAC); - SkDimModerate(pAC); -- if (pAC->DynIrqModInfo.DisplayStats) { -- SkDimDisplayModerationSettings(pAC); -- } -- } else if (Param.Para32[0] == SK_DRV_RX_CLEANUP_TIMER) { -- /* -- ** check if we need to check for descriptors which -- ** haven't been handled the last millisecs -- */ -- StartDrvCleanupTimer(pAC); -- if (pAC->GIni.GIMacsFound == 2) { -- ReceiveIrq(pAC, &pAC->RxPort[1], SK_FALSE); -- } -- ReceiveIrq(pAC, &pAC->RxPort[0], SK_FALSE); - } else { - printk("Expiration of unknown timer\n"); - } - break; -+ case SK_DRV_ADAP_FAIL: -+#if (!defined (Y2_RECOVERY) && !defined (Y2_LE_CHECK)) -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, -+ ("ADAPTER FAIL EVENT\n")); -+ printk("%s: Adapter failed.\n", pAC->dev[0]->name); -+ SK_OUT32(pAC->IoBase, B0_IMSK, 0); /* disable interrupts */ -+ break; -+#endif -+ -+#if (defined (Y2_RECOVERY) || defined (Y2_LE_CHECK)) -+ case SK_DRV_RECOVER: -+ spin_lock_irqsave(&pAC->InitLock, InitFlags); -+ pNet = (DEV_NET *) pAC->dev[Param.Para32[0]]->priv; -+ -+ /* Recover already in progress */ -+ if (pNet->InRecover) { -+ break; -+ } -+ -+ netif_stop_queue(pAC->dev[Param.Para32[0]]); /* stop device if running */ -+ pNet->InRecover = SK_TRUE; -+ -+ FromPort = Param.Para32[0]; -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, -+ ("PORT RESET EVENT, Port: %d ", FromPort)); -+ -+ /* Disable interrupts */ -+ SK_OUT32(pAC->IoBase, B0_IMSK, 0); -+ SK_OUT32(pAC->IoBase, B0_HWE_IMSK, 0); -+ -+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET, -+ FromPort, SK_FALSE); -+ spin_lock_irqsave( -+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, -+ Flags); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2PortStop(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST); -+ } else { -+ SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST); -+ } -+ pAC->dev[Param.Para32[0]]->flags &= ~IFF_RUNNING; -+ spin_unlock_irqrestore( -+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, -+ Flags); -+ -+ if (!CHIP_ID_YUKON_2(pAC)) { -+#ifdef CONFIG_SK98LIN_NAPI -+ WorkToDo = 1; -+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE, &WorkDone, WorkToDo); -+#else -+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE); -+#endif -+ ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]); -+ } -+ spin_lock_irqsave( -+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, -+ Flags); -+ -+#ifdef USE_TIST_FOR_RESET -+ if (pAC->GIni.GIYukon2) { -+#if 0 -+ /* make sure that we do not accept any status LEs from now on */ -+ Y2_ENABLE_TIST(pAC->IoBase); -+ -+ /* get current timestamp */ -+ Y2_GET_TIST_LOW_VAL(pAC->IoBase, &pAC->MinTistLo); -+ pAC->MinTistHi = pAC->GIni.GITimeStampCnt; -+ -+ SK_SET_WAIT_BIT_FOR_PORT( -+ pAC, -+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST, -+ FromPort); -+#endif -+ SK_SET_WAIT_BIT_FOR_PORT( -+ pAC, -+ SK_PSTATE_WAITING_FOR_ANY_TIST, -+ FromPort); -+ -+ /* start tist */ -+ Y2_ENABLE_TIST(pAC->IoBase); -+ } -+#endif -+ -+ /* Restart Receive BMU on Yukon-2 */ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_4167)) { -+ SkYuk2RestartRxBmu(pAC, IoC, FromPort); -+ } -+ -+#ifdef Y2_LE_CHECK -+ /* mark entries invalid */ -+ pAC->LastPort = 3; -+ pAC->LastOpc = 0xFF; -+#endif -+ -+#endif -+ /* Restart ports but do not initialize PHY. */ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SkY2PortStart(pAC, IoC, FromPort); -+ } else { -+ /* tschilling: Handling of return value inserted. */ -+ if (SkGeInitPort(pAC, IoC, FromPort)) { -+ if (FromPort == 0) { -+ printk("%s: SkGeInitPort A failed.\n", pAC->dev[0]->name); -+ } else { -+ printk("%s: SkGeInitPort B failed.\n", pAC->dev[1]->name); -+ } -+ } -+ SkAddrMcUpdate(pAC,IoC, FromPort); -+ PortReInitBmu(pAC, FromPort); -+ SkGePollTxD(pAC, IoC, FromPort, SK_TRUE); -+ CLEAR_AND_START_RX(FromPort); -+ } -+ spin_unlock_irqrestore( -+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, -+ Flags); -+ -+ /* Map any waiting RX buffers to HW */ -+ FillReceiveTableYukon2(pAC, pAC->IoBase, FromPort); -+ -+ pNet->InRecover = SK_FALSE; -+ /* enable Interrupts */ -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK); -+ netif_wake_queue(pAC->dev[FromPort]); -+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags); -+ break; - default: - break; - } - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT, - ("END EVENT ")); -- -+ - return (0); - } /* SkDrvEvent */ - - -+/****************************************************************************** -+ * -+ * SkLocalEventQueue() - add event to queue -+ * -+ * Description: -+ * This function adds an event to the event queue and run the -+ * SkEventDispatcher. At least Init Level 1 is required to queue events, -+ * but will be scheduled add Init Level 2. -+ * -+ * returns: -+ * nothing -+ */ -+void SkLocalEventQueue( -+SK_AC *pAC, /* Adapters context */ -+SK_U32 Class, /* Event Class */ -+SK_U32 Event, /* Event to be queued */ -+SK_U32 Param1, /* Event parameter 1 */ -+SK_U32 Param2, /* Event parameter 2 */ -+SK_BOOL Dispatcher) /* Dispatcher flag: -+ * TRUE == Call SkEventDispatcher -+ * FALSE == Don't execute SkEventDispatcher -+ */ -+{ -+ SK_EVPARA EvPara; -+ EvPara.Para32[0] = Param1; -+ EvPara.Para32[1] = Param2; -+ -+ -+ if (Class == SKGE_PNMI) { -+ SkPnmiEvent( pAC, -+ pAC->IoBase, -+ Event, -+ EvPara); -+ } else { -+ SkEventQueue( pAC, -+ Class, -+ Event, -+ EvPara); -+ } -+ -+ /* Run the dispatcher */ -+ if (Dispatcher) { -+ SkEventDispatcher(pAC, pAC->IoBase); -+ } -+ -+} -+ -+/****************************************************************************** -+ * -+ * SkLocalEventQueue64() - add event to queue (64bit version) -+ * -+ * Description: -+ * This function adds an event to the event queue and run the -+ * SkEventDispatcher. At least Init Level 1 is required to queue events, -+ * but will be scheduled add Init Level 2. -+ * -+ * returns: -+ * nothing -+ */ -+void SkLocalEventQueue64( -+SK_AC *pAC, /* Adapters context */ -+SK_U32 Class, /* Event Class */ -+SK_U32 Event, /* Event to be queued */ -+SK_U64 Param, /* Event parameter */ -+SK_BOOL Dispatcher) /* Dispatcher flag: -+ * TRUE == Call SkEventDispatcher -+ * FALSE == Don't execute SkEventDispatcher -+ */ -+{ -+ SK_EVPARA EvPara; -+ EvPara.Para64 = Param; -+ -+ -+ if (Class == SKGE_PNMI) { -+ SkPnmiEvent( pAC, -+ pAC->IoBase, -+ Event, -+ EvPara); -+ } else { -+ SkEventQueue( pAC, -+ Class, -+ Event, -+ EvPara); -+ } -+ -+ /* Run the dispatcher */ -+ if (Dispatcher) { -+ SkEventDispatcher(pAC, pAC->IoBase); -+ } -+ -+} -+ -+ - /***************************************************************************** - * - * SkErrorLog - log errors -@@ -4936,8 +5847,6 @@ char ClassStr[80]; - - } /* SkErrorLog */ - --#ifdef SK_DIAG_SUPPORT -- - /***************************************************************************** - * - * SkDrvEnterDiagMode - handles DIAG attach request -@@ -4963,7 +5872,7 @@ SK_AC *pAc) /* pointer to adapter co - - pAC->DiagModeActive = DIAG_ACTIVE; - if (pAC->BoardLevel > SK_INIT_DATA) { -- if (pNet->Up) { -+ if (netif_running(pAC->dev[0])) { - pAC->WasIfUp[0] = SK_TRUE; - pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ - DoPrintInterfaceChange = SK_FALSE; -@@ -4971,9 +5880,10 @@ SK_AC *pAc) /* pointer to adapter co - } else { - pAC->WasIfUp[0] = SK_FALSE; - } -+ - if (pNet != (DEV_NET *) pAc->dev[1]->priv) { - pNet = (DEV_NET *) pAc->dev[1]->priv; -- if (pNet->Up) { -+ if (netif_running(pAC->dev[1])) { - pAC->WasIfUp[1] = SK_TRUE; - pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ - DoPrintInterfaceChange = SK_FALSE; -@@ -5005,16 +5915,16 @@ SK_AC *pAc) /* pointer to adapter co - sizeof(SK_PNMI_STRUCT_DATA)); - pAc->DiagModeActive = DIAG_NOTACTIVE; - pAc->Pnmi.DiagAttached = SK_DIAG_IDLE; -- if (pAc->WasIfUp[0] == SK_TRUE) { -- pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ -+ if (pAc->WasIfUp[0] == SK_TRUE) { -+ pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ - DoPrintInterfaceChange = SK_FALSE; -- SkDrvInitAdapter(pAc, 0); /* first device */ -- } -- if (pAc->WasIfUp[1] == SK_TRUE) { -- pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ -+ SkDrvInitAdapter(pAc, 0); /* first device */ -+ } -+ if (pAc->WasIfUp[1] == SK_TRUE) { -+ pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */ - DoPrintInterfaceChange = SK_FALSE; -- SkDrvInitAdapter(pAc, 1); /* second device */ -- } -+ SkDrvInitAdapter(pAc, 1); /* second device */ -+ } - return(0); - } - -@@ -5159,14 +6069,25 @@ int devNbr) /* what device is to be - - } /* SkDrvInitAdapter */ - --#endif -+static int __init sk98lin_init(void) -+{ -+ return pci_module_init(&sk98lin_driver); -+} -+ -+static void __exit sk98lin_cleanup(void) -+{ -+ pci_unregister_driver(&sk98lin_driver); -+} -+ -+module_init(sk98lin_init); -+module_exit(sk98lin_cleanup); -+ - - #ifdef DEBUG - /****************************************************************************/ - /* "debug only" section *****************************************************/ - /****************************************************************************/ - -- - /***************************************************************************** - * - * DumpMsg - print a frame -@@ -5177,9 +6098,11 @@ int devNbr) /* what device is to be - * Returns: N/A - * - */ --static void DumpMsg(struct sk_buff *skb, char *str) -+static void DumpMsg( -+struct sk_buff *skb, /* linux' socket buffer */ -+char *str) /* additional msg string */ - { -- int msglen; -+ int msglen = (skb->len > 64) ? 64 : skb->len; - - if (skb == NULL) { - printk("DumpMsg(): NULL-Message\n"); -@@ -5191,19 +6114,14 @@ static void DumpMsg(struct sk_buff *skb, - return; - } - -- msglen = skb->len; -- if (msglen > 64) -- msglen = 64; -- -- printk("--- Begin of message from %s , len %d (from %d) ----\n", str, msglen, skb->len); -- -+ printk("DumpMsg: PhysPage: %p\n", -+ page_address(virt_to_page(skb->data))); -+ printk("--- Begin of message from %s , len %d (from %d) ----\n", -+ str, msglen, skb->len); - DumpData((char *)skb->data, msglen); -- - printk("------- End of message ---------\n"); - } /* DumpMsg */ - -- -- - /***************************************************************************** - * - * DumpData - print a data area -@@ -5215,23 +6133,22 @@ static void DumpMsg(struct sk_buff *skb, - * Returns: N/A - * - */ --static void DumpData(char *p, int size) --{ --register int i; --int haddr, addr; --char hex_buffer[180]; --char asc_buffer[180]; --char HEXCHAR[] = "0123456789ABCDEF"; -- -- addr = 0; -- haddr = 0; -- hex_buffer[0] = 0; -- asc_buffer[0] = 0; -+static void DumpData( -+char *p, /* pointer to area containing the data */ -+int size) /* the size of that data area in bytes */ -+{ -+ register int i; -+ int haddr = 0, addr = 0; -+ char hex_buffer[180] = { '\0' }; -+ char asc_buffer[180] = { '\0' }; -+ char HEXCHAR[] = "0123456789ABCDEF"; -+ - for (i=0; i < size; ) { -- if (*p >= '0' && *p <='z') -+ if (*p >= '0' && *p <='z') { - asc_buffer[addr] = *p; -- else -+ } else { - asc_buffer[addr] = '.'; -+ } - addr++; - asc_buffer[addr] = 0; - hex_buffer[haddr] = HEXCHAR[(*p & 0xf0) >> 4]; -@@ -5257,27 +6174,24 @@ char HEXCHAR[] = "0123456789ABCDEF"; - * DumpLong - print a data area as long values - * - * Description: -- * This function prints a area of data to the system logfile/to the -+ * This function prints a long variable to the system logfile/to the - * console. - * - * Returns: N/A - * - */ --static void DumpLong(char *pc, int size) --{ --register int i; --int haddr, addr; --char hex_buffer[180]; --char asc_buffer[180]; --char HEXCHAR[] = "0123456789ABCDEF"; --long *p; --int l; -- -- addr = 0; -- haddr = 0; -- hex_buffer[0] = 0; -- asc_buffer[0] = 0; -- p = (long*) pc; -+static void DumpLong( -+char *pc, /* location of the variable to print */ -+int size) /* how large is the variable? */ -+{ -+ register int i; -+ int haddr = 0, addr = 0; -+ char hex_buffer[180] = { '\0' }; -+ char asc_buffer[180] = { '\0' }; -+ char HEXCHAR[] = "0123456789ABCDEF"; -+ long *p = (long*) pc; -+ int l; -+ - for (i=0; i < size; ) { - l = (long) *p; - hex_buffer[haddr] = HEXCHAR[(l >> 28) & 0xf]; -@@ -5316,3 +6230,4 @@ int l; - * End of file - * - ******************************************************************************/ -+ ---- ./drivers/net/sk98lin/skgehwt.c.skn 2006-04-04 13:11:05.000000000 +0400 -+++ ./drivers/net/sk98lin/skgehwt.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skgehwt.c - * Project: Gigabit Ethernet Adapters, Event Scheduler Module -- * Version: $Revision: 1.15 $ -- * Date: $Date: 2003/09/16 13:41:23 $ -+ * Version: $Revision: 2.2 $ -+ * Date: $Date: 2004/05/28 13:39:04 $ - * Purpose: Hardware Timer - * - ******************************************************************************/ -@@ -11,7 +11,7 @@ - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2004 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -27,7 +27,7 @@ - */ - #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: skgehwt.c,v 1.15 2003/09/16 13:41:23 rschmidt Exp $ (C) Marvell."; -+ "@(#) $Id: skgehwt.c,v 2.2 2004/05/28 13:39:04 rschmidt Exp $ (C) Marvell."; - #endif - - #include "h/skdrv1st.h" /* Driver Specific Definitions */ -@@ -44,10 +44,10 @@ intro() - /* - * Prototypes of local functions. - */ --#define SK_HWT_MAX (65000) -+#define SK_HWT_MAX 65000UL * 160 /* ca. 10 sec. */ - - /* correction factor */ --#define SK_HWT_FAC (1000 * (SK_U32)pAC->GIni.GIHstClkFact / 100) -+#define SK_HWT_FAC (10 * (SK_U32)pAC->GIni.GIHstClkFact / 16) - - /* - * Initialize hardware timer. -@@ -73,29 +73,21 @@ SK_IOC Ioc) /* IoContext */ - void SkHwtStart( - SK_AC *pAC, /* Adapters context */ - SK_IOC Ioc, /* IoContext */ --SK_U32 Time) /* Time in units of 16us to load the timer with. */ -+SK_U32 Time) /* Time in usec to load the timer */ - { -- SK_U32 Cnt; -- - if (Time > SK_HWT_MAX) - Time = SK_HWT_MAX; - - pAC->Hwt.TStart = Time; - pAC->Hwt.TStop = 0L; - -- Cnt = Time; -- -- /* -- * if time < 16 us -- * time = 16 us -- */ -- if (!Cnt) { -- Cnt++; -+ if (!Time) { -+ Time = 1L; - } - -- SK_OUT32(Ioc, B2_TI_INI, Cnt * SK_HWT_FAC); -- -- SK_OUT16(Ioc, B2_TI_CTRL, TIM_START); /* Start timer. */ -+ SK_OUT32(Ioc, B2_TI_INI, Time * SK_HWT_FAC); -+ -+ SK_OUT16(Ioc, B2_TI_CTRL, TIM_START); /* Start timer */ - - pAC->Hwt.TActive = SK_TRUE; - } -@@ -109,13 +101,12 @@ SK_AC *pAC, /* Adapters context */ - SK_IOC Ioc) /* IoContext */ - { - SK_OUT16(Ioc, B2_TI_CTRL, TIM_STOP); -- -+ - SK_OUT16(Ioc, B2_TI_CTRL, TIM_CLR_IRQ); - - pAC->Hwt.TActive = SK_FALSE; - } - -- - /* - * Stop hardware timer and read time elapsed since last start. - * -@@ -129,6 +120,9 @@ SK_IOC Ioc) /* IoContext */ - { - SK_U32 TRead; - SK_U32 IStatus; -+ SK_U32 TimerInt; -+ -+ TimerInt = CHIP_ID_YUKON_2(pAC) ? Y2_IS_TIMINT : IS_TIMINT; - - if (pAC->Hwt.TActive) { - -@@ -139,15 +133,15 @@ SK_IOC Ioc) /* IoContext */ - - SK_IN32(Ioc, B0_ISRC, &IStatus); - -- /* Check if timer expired (or wraped around) */ -- if ((TRead > pAC->Hwt.TStart) || (IStatus & IS_TIMINT)) { -- -+ /* Check if timer expired (or wrapped around) */ -+ if ((TRead > pAC->Hwt.TStart) || ((IStatus & TimerInt) != 0)) { -+ - SkHwtStop(pAC, Ioc); -- -+ - pAC->Hwt.TStop = pAC->Hwt.TStart; - } - else { -- -+ - pAC->Hwt.TStop = pAC->Hwt.TStart - TRead; - } - } -@@ -162,9 +156,9 @@ SK_AC *pAC, /* Adapters context */ - SK_IOC Ioc) /* IoContext */ - { - SkHwtStop(pAC, Ioc); -- -+ - pAC->Hwt.TStop = pAC->Hwt.TStart; -- -+ - SkTimerDone(pAC, Ioc); - } - ---- ./drivers/net/sk98lin/skgeinit.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skgeinit.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skgeinit.c - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.97 $ -- * Date: $Date: 2003/10/02 16:45:31 $ -+ * Version: $Revision: 2.93 $ -+ * Date: $Date: 2005/12/14 16:11:34 $ - * Purpose: Contains functions to initialize the adapter - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -31,7 +32,7 @@ - - #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: skgeinit.c,v 1.97 2003/10/02 16:45:31 rschmidt Exp $ (C) Marvell."; -+ "@(#) $Id: skgeinit.c,v 2.93 2005/12/14 16:11:34 ibrueder Exp $ (C) Marvell."; - #endif - - struct s_QOffTab { -@@ -39,6 +40,7 @@ struct s_QOffTab { - int XsQOff; /* Sync Tx Queue Address Offset */ - int XaQOff; /* Async Tx Queue Address Offset */ - }; -+ - static struct s_QOffTab QOffTab[] = { - {Q_R1, Q_XS1, Q_XA1}, {Q_R2, Q_XS2, Q_XA2} - }; -@@ -57,6 +59,97 @@ static struct s_Config OemConfig = { - #endif - }; - -+#ifndef SK_SLIM -+/****************************************************************************** -+ * -+ * SkGePortVlan() - Enable / Disable VLAN support -+ * -+ * Description: -+ * Enable or disable the VLAN support of the selected port. -+ * The new configuration is *not* saved over any SkGeStopPort() and -+ * SkGeInitPort() calls. -+ * Currently this function is only supported on Yukon-2/EC adapters. -+ * -+ * Returns: -+ * nothing -+ */ -+void SkGePortVlan( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port number */ -+SK_BOOL Enable) /* Flag */ -+{ -+ SK_U32 RxCtrl; -+ SK_U32 TxCtrl; -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ if (Enable) { -+ RxCtrl = RX_VLAN_STRIP_ON; -+ TxCtrl = TX_VLAN_TAG_ON; -+ } -+ else { -+ RxCtrl = RX_VLAN_STRIP_OFF; -+ TxCtrl = TX_VLAN_TAG_OFF; -+ } -+ -+ SK_OUT32(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), RxCtrl); -+ SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), TxCtrl); -+ } -+} /* SkGePortVlan */ -+ -+ -+/****************************************************************************** -+ * -+ * SkGeRxRss() - Enable / Disable RSS Hash Calculation -+ * -+ * Description: -+ * Enable or disable the RSS hash calculation of the selected port. -+ * The new configuration is *not* saved over any SkGeStopPort() and -+ * SkGeInitPort() calls. -+ * Currently this function is only supported on Yukon-2/EC adapters. -+ * -+ * Returns: -+ * nothing -+ */ -+void SkGeRxRss( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port number */ -+SK_BOOL Enable) /* Flag */ -+{ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SK_OUT32(IoC, Q_ADDR(pAC->GIni.GP[Port].PRxQOff, Q_CSR), -+ Enable ? BMU_ENA_RX_RSS_HASH : BMU_DIS_RX_RSS_HASH); -+ } -+} /* SkGeRxRss */ -+ -+ -+/****************************************************************************** -+ * -+ * SkGeRxCsum() - Enable / Disable Receive Checksum -+ * -+ * Description: -+ * Enable or disable the checksum of the selected port. -+ * The new configuration is *not* saved over any SkGeStopPort() and -+ * SkGeInitPort() calls. -+ * Currently this function is only supported on Yukon-2/EC adapters. -+ * -+ * Returns: -+ * nothing -+ */ -+void SkGeRxCsum( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port number */ -+SK_BOOL Enable) /* Flag */ -+{ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ SK_OUT32(IoC, Q_ADDR(pAC->GIni.GP[Port].PRxQOff, Q_CSR), -+ Enable ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM); -+ } -+} /* SkGeRxCsum */ -+#endif /* !SK_SLIM */ -+ - /****************************************************************************** - * - * SkGePollRxD() - Enable / Disable Descriptor Polling of RxD Ring -@@ -71,8 +164,8 @@ static struct s_Config OemConfig = { - * nothing - */ - void SkGePollRxD( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL PollRxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */ - { -@@ -80,8 +173,8 @@ SK_BOOL PollRxD) /* SK_TRUE (enable pol. - - pPrt = &pAC->GIni.GP[Port]; - -- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (PollRxD) ? -- CSR_ENA_POL : CSR_DIS_POL); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (SK_U32)((PollRxD) ? -+ CSR_ENA_POL : CSR_DIS_POL)); - } /* SkGePollRxD */ - - -@@ -99,8 +192,8 @@ SK_BOOL PollRxD) /* SK_TRUE (enable pol. - * nothing - */ - void SkGePollTxD( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL PollTxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */ - { -@@ -114,13 +207,13 @@ SK_BOOL PollTxD) /* SK_TRUE (enable pol. - if (pPrt->PXSQSize != 0) { - SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), DWord); - } -- -+ - if (pPrt->PXAQSize != 0) { - SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), DWord); - } - } /* SkGePollTxD */ - -- -+#ifndef SK_SLIM - /****************************************************************************** - * - * SkGeYellowLED() - Switch the yellow LED on or off. -@@ -135,20 +228,30 @@ SK_BOOL PollTxD) /* SK_TRUE (enable pol. - * nothing - */ - void SkGeYellowLED( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int State) /* yellow LED state, 0 = OFF, 0 != ON */ - { -+ int LedReg; -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ /* different mapping on Yukon-2 */ -+ LedReg = B0_CTST + 1; -+ } -+ else { -+ LedReg = B0_LED; -+ } -+ - if (State == 0) { -- /* Switch yellow LED OFF */ -- SK_OUT8(IoC, B0_LED, LED_STAT_OFF); -+ /* Switch state LED OFF */ -+ SK_OUT8(IoC, LedReg, LED_STAT_OFF); - } - else { -- /* Switch yellow LED ON */ -- SK_OUT8(IoC, B0_LED, LED_STAT_ON); -+ /* Switch state LED ON */ -+ SK_OUT8(IoC, LedReg, LED_STAT_ON); - } - } /* SkGeYellowLED */ -- -+#endif /* !SK_SLIM */ - - #if (!defined(SK_SLIM) || defined(GENESIS)) - /****************************************************************************** -@@ -169,8 +272,8 @@ int State) /* yellow LED state, 0 = OF - * nothing - */ - void SkGeXmitLED( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Led, /* offset to the LED Init Value register */ - int Mode) /* Mode may be SK_LED_DIS, SK_LED_ENA, SK_LED_TST */ - { -@@ -195,18 +298,17 @@ int Mode) /* Mode may be SK_LED_DIS, S - */ - SK_OUT32(IoC, Led + XMIT_LED_CNT, 0); - SK_OUT8(IoC, Led + XMIT_LED_TST, LED_T_OFF); -- break; - } -- -+ - /* -- * 1000BT: The Transmit LED is driven by the PHY. -+ * 1000BT: the Transmit LED is driven by the PHY. - * But the default LED configuration is used for - * Level One and Broadcom PHYs. -- * (Broadcom: It may be that PHY_B_PEC_EN_LTR has to be set.) -- * (In this case it has to be added here. But we will see. XXX) -+ * (Broadcom: It may be that PHY_B_PEC_EN_LTR has to be set. -+ * In this case it has to be added here.) - */ - } /* SkGeXmitLED */ --#endif /* !SK_SLIM || GENESIS */ -+#endif /* !SK_SLIM || GENESIS */ - - - /****************************************************************************** -@@ -227,7 +329,7 @@ int Mode) /* Mode may be SK_LED_DIS, S - * 1: configuration error - */ - static int DoCalcAddr( --SK_AC *pAC, /* adapter context */ -+SK_AC *pAC, /* Adapter Context */ - SK_GEPORT SK_FAR *pPrt, /* port index */ - int QuSize, /* size of the queue to configure in kB */ - SK_U32 SK_FAR *StartVal, /* start value for address calculation */ -@@ -264,12 +366,35 @@ SK_U32 SK_FAR *QuEndAddr) /* end addres - - /****************************************************************************** - * -+ * SkGeRoundQueueSize() - Round the given queue size to the adpaters QZ units -+ * -+ * Description: -+ * This function rounds the given queue size in kBs to adapter specific -+ * queue size units (Genesis and Yukon: 8 kB, Yukon-2/EC: 1 kB). -+ * -+ * Returns: -+ * the rounded queue size in kB -+ */ -+static int SkGeRoundQueueSize( -+SK_AC *pAC, /* Adapter Context */ -+int QueueSizeKB) /* Queue size in kB */ -+{ -+ int QueueSizeSteps; -+ -+ QueueSizeSteps = (CHIP_ID_YUKON_2(pAC)) ? QZ_STEP_Y2 : QZ_STEP; -+ -+ return((QueueSizeKB + QueueSizeSteps - 1) & ~(QueueSizeSteps - 1)); -+} /* SkGeRoundQueueSize */ -+ -+ -+/****************************************************************************** -+ * - * SkGeInitAssignRamToQueues() - allocate default queue sizes - * - * Description: - * This function assigns the memory to the different queues and ports. - * When DualNet is set to SK_TRUE all ports get the same amount of memory. -- * Otherwise the first port gets most of the memory and all the -+ * Otherwise the first port gets most of the memory and all the - * other ports just the required minimum. - * This function can only be called when pAC->GIni.GIRamSize and - * pAC->GIni.GIMacsFound have been initialized, usually this happens -@@ -282,102 +407,146 @@ SK_U32 SK_FAR *QuEndAddr) /* end addres - */ - - int SkGeInitAssignRamToQueues( --SK_AC *pAC, /* Adapter context */ -+SK_AC *pAC, /* Adapter Context */ - int ActivePort, /* Active Port in RLMT mode */ --SK_BOOL DualNet) /* adapter context */ -+SK_BOOL DualNet) /* Dual Net active */ - { - int i; - int UsedKilobytes; /* memory already assigned */ - int ActivePortKilobytes; /* memory available for active port */ -- SK_GEPORT *pGePort; -- -- UsedKilobytes = 0; -+ int MinQueueSize; /* min. memory for queues */ -+ int TotalRamSize; /* total memory for queues */ -+ SK_BOOL DualPortYukon2; -+ SK_GEPORT *pPrt; - - if (ActivePort >= pAC->GIni.GIMacsFound) { -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, - ("SkGeInitAssignRamToQueues: ActivePort (%d) invalid\n", - ActivePort)); - return(1); - } -- if (((pAC->GIni.GIMacsFound * (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE)) + -- ((RAM_QUOTA_SYNC == 0) ? 0 : SK_MIN_TXQ_SIZE)) > pAC->GIni.GIRamSize) { -+ -+ DualPortYukon2 = (CHIP_ID_YUKON_2(pAC) && pAC->GIni.GIMacsFound == 2); -+ -+ TotalRamSize = pAC->GIni.GIRamSize; -+ -+ if (DualPortYukon2) { -+ TotalRamSize *= 2; -+ } -+ -+ MinQueueSize = SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE; -+ -+ if (MinQueueSize > pAC->GIni.GIRamSize) { -+ MinQueueSize = pAC->GIni.GIRamSize; -+ } -+ -+ if ((pAC->GIni.GIMacsFound * MinQueueSize + -+ RAM_QUOTA_SYNC * SK_MIN_TXQ_SIZE) > TotalRamSize) { -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, - ("SkGeInitAssignRamToQueues: Not enough memory (%d)\n", -- pAC->GIni.GIRamSize)); -+ TotalRamSize)); - return(2); - } - - if (DualNet) { - /* every port gets the same amount of memory */ -- ActivePortKilobytes = pAC->GIni.GIRamSize / pAC->GIni.GIMacsFound; -+ ActivePortKilobytes = TotalRamSize / pAC->GIni.GIMacsFound; -+ - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { - -- pGePort = &pAC->GIni.GP[i]; -- -+ pPrt = &pAC->GIni.GP[i]; -+ -+ if (DualPortYukon2) { -+ ActivePortKilobytes = pAC->GIni.GIRamSize; -+ } - /* take away the minimum memory for active queues */ -- ActivePortKilobytes -= (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE); -+ ActivePortKilobytes -= MinQueueSize; - - /* receive queue gets the minimum + 80% of the rest */ -- pGePort->PRxQSize = (int) (ROUND_QUEUE_SIZE_KB(( -- ActivePortKilobytes * (unsigned long) RAM_QUOTA_RX) / 100)) -+ pPrt->PRxQSize = SkGeRoundQueueSize(pAC, -+ (int)((long)ActivePortKilobytes * RAM_QUOTA_RX) / 100) - + SK_MIN_RXQ_SIZE; - -- ActivePortKilobytes -= (pGePort->PRxQSize - SK_MIN_RXQ_SIZE); -+ ActivePortKilobytes -= (pPrt->PRxQSize - SK_MIN_RXQ_SIZE); - - /* synchronous transmit queue */ -- pGePort->PXSQSize = 0; -+ pPrt->PXSQSize = 0; - - /* asynchronous transmit queue */ -- pGePort->PXAQSize = (int) ROUND_QUEUE_SIZE_KB(ActivePortKilobytes + -- SK_MIN_TXQ_SIZE); -+ pPrt->PXAQSize = SkGeRoundQueueSize(pAC, -+ ActivePortKilobytes + SK_MIN_TXQ_SIZE); - } - } -- else { -- /* Rlmt Mode or single link adapter */ -+ else { /* RLMT Mode or single link adapter */ -+ -+ UsedKilobytes = 0; - -- /* Set standby queue size defaults for all standby ports */ -+ /* set standby queue size defaults for all standby ports */ - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { - - if (i != ActivePort) { -- pGePort = &pAC->GIni.GP[i]; -+ pPrt = &pAC->GIni.GP[i]; - -- pGePort->PRxQSize = SK_MIN_RXQ_SIZE; -- pGePort->PXAQSize = SK_MIN_TXQ_SIZE; -- pGePort->PXSQSize = 0; -+ if (DualPortYukon2) { -+ pPrt->PRxQSize = SkGeRoundQueueSize(pAC, -+ (int)((long)(pAC->GIni.GIRamSize - MinQueueSize) * -+ RAM_QUOTA_RX) / 100) + SK_MIN_RXQ_SIZE; -+ -+ pPrt->PXAQSize = pAC->GIni.GIRamSize - pPrt->PRxQSize; -+ } -+ else { -+ pPrt->PRxQSize = SK_MIN_RXQ_SIZE; -+ pPrt->PXAQSize = SK_MIN_TXQ_SIZE; -+ } -+ pPrt->PXSQSize = 0; - - /* Count used RAM */ -- UsedKilobytes += pGePort->PRxQSize + pGePort->PXAQSize; -+ UsedKilobytes += pPrt->PRxQSize + pPrt->PXAQSize; - } - } - /* what's left? */ -- ActivePortKilobytes = pAC->GIni.GIRamSize - UsedKilobytes; -+ ActivePortKilobytes = TotalRamSize - UsedKilobytes; - - /* assign it to the active port */ - /* first take away the minimum memory */ -- ActivePortKilobytes -= (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE); -- pGePort = &pAC->GIni.GP[ActivePort]; -+ ActivePortKilobytes -= MinQueueSize; -+ pPrt = &pAC->GIni.GP[ActivePort]; -+ -+ /* receive queue gets 80% of the rest */ -+ pPrt->PRxQSize = SkGeRoundQueueSize(pAC, -+ (int)((long)ActivePortKilobytes * RAM_QUOTA_RX) / 100); - -- /* receive queue get's the minimum + 80% of the rest */ -- pGePort->PRxQSize = (int) (ROUND_QUEUE_SIZE_KB((ActivePortKilobytes * -- (unsigned long) RAM_QUOTA_RX) / 100)) + SK_MIN_RXQ_SIZE; -+ ActivePortKilobytes -= pPrt->PRxQSize; - -- ActivePortKilobytes -= (pGePort->PRxQSize - SK_MIN_RXQ_SIZE); -+ /* add the minimum memory for Rx queue */ -+ pPrt->PRxQSize += MinQueueSize/2; - - /* synchronous transmit queue */ -- pGePort->PXSQSize = 0; -+ pPrt->PXSQSize = 0; - -- /* asynchronous transmit queue */ -- pGePort->PXAQSize = (int) ROUND_QUEUE_SIZE_KB(ActivePortKilobytes) + -- SK_MIN_TXQ_SIZE; -+ /* asynchronous transmit queue gets 20% of the rest */ -+ pPrt->PXAQSize = SkGeRoundQueueSize(pAC, ActivePortKilobytes) + -+ /* add the minimum memory for Tx queue */ -+ MinQueueSize/2; - } --#ifdef VCPU -- VCPUprintf(0, "PRxQSize=%u, PXSQSize=%u, PXAQSize=%u\n", -- pGePort->PRxQSize, pGePort->PXSQSize, pGePort->PXAQSize); --#endif /* VCPU */ -+ -+#ifdef DEBUG -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ -+ pPrt = &pAC->GIni.GP[i]; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Port %d: RxQSize=%u, TxAQSize=%u, TxSQSize=%u\n", -+ i, pPrt->PRxQSize, pPrt->PXAQSize, pPrt->PXSQSize)); -+ } -+#endif /* DEBUG */ - - return(0); - } /* SkGeInitAssignRamToQueues */ - -+ - /****************************************************************************** - * - * SkGeCheckQSize() - Checks the Adapters Queue Size Configuration -@@ -388,12 +557,12 @@ SK_BOOL DualNet) /* adapter context */ - * used ports. - * This requirements must be fullfilled to have a valid configuration: - * - The size of all queues must not exceed GIRamSize. -- * - The queue sizes must be specified in units of 8 kB. -+ * - The queue sizes must be specified in units of 8 kB (Genesis & Yukon). - * - The size of Rx queues of available ports must not be -- * smaller than 16 kB. -+ * smaller than 16 kB (Genesis & Yukon) resp. 10 kB (Yukon-2). - * - The size of at least one Tx queue (synch. or asynch.) -- * of available ports must not be smaller than 16 kB -- * when Jumbo Frames are used. -+ * of available ports must not be smaller than 16 kB (Genesis & Yukon), -+ * resp. 10 kB (Yukon-2) when Jumbo Frames are used. - * - The RAM start and end addresses must not be changed - * for ports which are already initialized. - * Furthermore SkGeCheckQSize() defines the Start and End Addresses -@@ -404,7 +573,7 @@ SK_BOOL DualNet) /* adapter context */ - * 1: Queue Size Configuration invalid - */ - static int SkGeCheckQSize( --SK_AC *pAC, /* adapter context */ -+SK_AC *pAC, /* Adapter Context */ - int Port) /* port index */ - { - SK_GEPORT *pPrt; -@@ -414,55 +583,68 @@ int Port) /* port index */ - SK_U32 StartAddr; - #ifndef SK_SLIM - int UsedMem; /* total memory used (max. found ports) */ --#endif -+#endif - - Rtv = 0; -- -+ - #ifndef SK_SLIM - - UsedMem = 0; -+ - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { - pPrt = &pAC->GIni.GP[i]; - -- if ((pPrt->PRxQSize & QZ_UNITS) != 0 || -- (pPrt->PXSQSize & QZ_UNITS) != 0 || -- (pPrt->PXAQSize & QZ_UNITS) != 0) { -+ if (CHIP_ID_YUKON_2(pAC)) { -+ UsedMem = 0; -+ } -+ else if (((pPrt->PRxQSize & QZ_UNITS) != 0 || -+ (pPrt->PXSQSize & QZ_UNITS) != 0 || -+ (pPrt->PXAQSize & QZ_UNITS) != 0)) { - - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG); - return(1); - } - -- if (i == Port && pPrt->PRxQSize < SK_MIN_RXQ_SIZE) { -+#ifndef SK_DIAG -+ if (i == Port && pAC->GIni.GIRamSize > SK_MIN_RXQ_SIZE && -+ pPrt->PRxQSize < SK_MIN_RXQ_SIZE) { - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E011, SKERR_HWI_E011MSG); - return(1); - } -- -+ - /* - * the size of at least one Tx queue (synch. or asynch.) has to be > 0. - * if Jumbo Frames are used, this size has to be >= 16 kB. - */ - if ((i == Port && pPrt->PXSQSize == 0 && pPrt->PXAQSize == 0) || -- (pAC->GIni.GIPortUsage == SK_JUMBO_LINK && -- ((pPrt->PXSQSize > 0 && pPrt->PXSQSize < SK_MIN_TXQ_SIZE) || -+ (pPrt->PPortUsage == SK_JUMBO_LINK && -+ ((pPrt->PXSQSize > 0 && pPrt->PXSQSize < SK_MIN_TXQ_SIZE) || - (pPrt->PXAQSize > 0 && pPrt->PXAQSize < SK_MIN_TXQ_SIZE)))) { - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E023, SKERR_HWI_E023MSG); - return(1); - } -- -+#endif /* !SK_DIAG */ -+ - UsedMem += pPrt->PRxQSize + pPrt->PXSQSize + pPrt->PXAQSize; -+ -+ if (UsedMem > pAC->GIni.GIRamSize) { -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG); -+ return(1); -+ } - } -- -- if (UsedMem > pAC->GIni.GIRamSize) { -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG); -- return(1); -- } --#endif /* !SK_SLIM */ -+ -+#endif /* !SK_SLIM */ - - /* Now start address calculation */ - StartAddr = pAC->GIni.GIRamOffs; - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ - pPrt = &pAC->GIni.GP[i]; - -+ if (CHIP_ID_YUKON_2(pAC)) { -+ StartAddr = 0; -+ } -+ - /* Calculate/Check values for the receive queue */ - Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PRxQSize, &StartAddr, - &pPrt->PRxQRamStart, &pPrt->PRxQRamEnd); -@@ -502,8 +684,8 @@ int Port) /* port index */ - * nothing - */ - static void SkGeInitMacArb( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { - /* release local reset */ - SK_OUT16(IoC, B3_MA_TO_CTRL, MA_RST_CLR); -@@ -542,8 +724,8 @@ SK_IOC IoC) /* IO context */ - * nothing - */ - static void SkGeInitPktArb( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { - /* release local reset */ - SK_OUT16(IoC, B3_PA_CTRL, PA_RST_CLR); -@@ -559,7 +741,8 @@ SK_IOC IoC) /* IO context */ - * NOTE: the packet arbiter timeout interrupt is needed for - * half duplex hangup workaround - */ -- if (pAC->GIni.GIPortUsage != SK_JUMBO_LINK) { -+ if (pAC->GIni.GP[MAC_1].PPortUsage != SK_JUMBO_LINK && -+ pAC->GIni.GP[MAC_2].PPortUsage != SK_JUMBO_LINK) { - if (pAC->GIni.GIMacsFound == 1) { - SK_OUT16(IoC, B3_PA_CTRL, PA_ENA_TO_TX1); - } -@@ -582,14 +765,11 @@ SK_IOC IoC) /* IO context */ - * nothing - */ - static void SkGeInitMacFifo( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_U16 Word; --#ifdef VCPU -- SK_U32 DWord; --#endif /* VCPU */ - /* - * For each FIFO: - * - release local reset -@@ -597,63 +777,101 @@ int Port) /* Port Index (MAC_1 + n) */ - * - setup defaults for the control register - * - enable the FIFO - */ -- -+ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- /* Configure Rx MAC FIFO */ -+ /* configure Rx MAC FIFO */ - SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_CLR); - SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_RX_CTRL_DEF); - SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_ENA_OP_MD); -- -- /* Configure Tx MAC FIFO */ -+ -+ /* configure Tx MAC FIFO */ - SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_RST_CLR); - SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_TX_CTRL_DEF); - SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_ENA_OP_MD); -- -- /* Enable frame flushing if jumbo frames used */ -- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) { -+ -+ /* enable frame flushing if jumbo frames used */ -+ if (pAC->GIni.GP[Port].PPortUsage == SK_JUMBO_LINK) { - SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_ENA_FLUSH); - } - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- /* set Rx GMAC FIFO Flush Mask */ -- SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), (SK_U16)RX_FF_FL_DEF_MSK); -- -+ - Word = (SK_U16)GMF_RX_CTRL_DEF; - - /* disable Rx GMAC FIFO Flush for YUKON-Lite Rev. A0 only */ -- if (pAC->GIni.GIYukonLite && pAC->GIni.GIChipId == CHIP_ID_YUKON) { -+ if (pAC->GIni.GIYukonLite /* && pAC->GIni.GIChipId == CHIP_ID_YUKON */) { - - Word &= ~GMF_RX_F_FL_ON; - } -- -- /* Configure Rx MAC FIFO */ -+ -+ /* configure Rx GMAC FIFO */ - SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR); - SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), Word); -- -- /* set Rx GMAC FIFO Flush Threshold (default: 0x0a -> 56 bytes) */ -- SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF); -- -- /* Configure Tx MAC FIFO */ -+ -+ Word = RX_FF_FL_DEF_MSK; -+ -+#ifndef SK_DIAG -+ if (HW_FEATURE(pAC, HWF_WA_DEV_4115)) { -+ /* -+ * Flushing must be enabled (needed for ASF see dev. #4.29), -+ * but the flushing mask should be disabled (see dev. #4.115) -+ */ -+ Word = 0; -+ } -+#endif /* !SK_DIAG */ -+ -+ /* set Rx GMAC FIFO Flush Mask (after clearing reset) */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), Word); -+ -+ /* default: 0x0a -> 56 bytes on Yukon-1 and 64 bytes on Yukon-2 */ -+ Word = (SK_U16)RX_GMF_FL_THR_DEF; -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC && -+ pAC->GIni.GIAsfEnabled) { -+ /* WA for dev. #4.30 (reduce to 0x08 -> 48 bytes) */ -+ Word -= 2; -+ } -+ } -+ else { -+ /* -+ * because Pause Packet Truncation in GMAC is not working -+ * we have to increase the Flush Threshold to 64 bytes -+ * in order to flush pause packets in Rx FIFO on Yukon-1 -+ */ -+ Word++; -+ } -+ -+ /* set Rx GMAC FIFO Flush Threshold (after clearing reset) */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), Word); -+ -+ /* configure Tx GMAC FIFO */ - SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR); - SK_OUT16(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U16)GMF_TX_CTRL_DEF); -- --#ifdef VCPU -- SK_IN32(IoC, MR_ADDR(Port, RX_GMF_AF_THR), &DWord); -- SK_IN32(IoC, MR_ADDR(Port, TX_GMF_AE_THR), &DWord); --#endif /* VCPU */ -- -- /* set Tx GMAC FIFO Almost Empty Threshold */ --/* SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_AE_THR), 0); */ -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) { -+ /* set Rx Pause Threshold */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_LP_THR), (SK_U16)SK_ECU_LLPP); -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_UP_THR), (SK_U16)SK_ECU_ULPP); -+ -+ if (pAC->GIni.GP[Port].PPortUsage == SK_JUMBO_LINK) { -+ /* set Tx GMAC FIFO Almost Empty Threshold */ -+ SK_OUT16(IoC, MR_ADDR(Port, TX_GMF_AE_THR), -+ (SK_U16)SK_ECU_AE_THR); -+ /* disable Store & Forward mode for TX */ -+ SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), TX_STFW_DIS); -+ } -+ } - } - #endif /* YUKON */ - - } /* SkGeInitMacFifo */ - --#ifdef SK_LNK_SYNC_CNT -+#ifdef SK_LNK_SYNC_CNT - /****************************************************************************** - * - * SkGeLoadLnkSyncCnt() - Load the Link Sync Counter and starts counting -@@ -674,8 +892,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkGeLoadLnkSyncCnt( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_U32 CntVal) /* Counter value */ - { -@@ -685,7 +903,7 @@ SK_U32 CntVal) /* Counter value */ - SK_BOOL IrqPend; - - /* stop counter */ -- SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_STOP); -+ SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LNK_STOP); - - /* - * ASIC problem: -@@ -698,6 +916,7 @@ SK_U32 CntVal) /* Counter value */ - IrqPend = SK_FALSE; - SK_IN32(IoC, B0_ISRC, &ISrc); - SK_IN32(IoC, B0_IMSK, &OrgIMsk); -+ - if (Port == MAC_1) { - NewIMsk = OrgIMsk & ~IS_LNK_SYNC_M1; - if ((ISrc & IS_LNK_SYNC_M1) != 0) { -@@ -710,6 +929,7 @@ SK_U32 CntVal) /* Counter value */ - IrqPend = SK_TRUE; - } - } -+ - if (!IrqPend) { - SK_OUT32(IoC, B0_IMSK, NewIMsk); - } -@@ -718,15 +938,17 @@ SK_U32 CntVal) /* Counter value */ - SK_OUT32(IoC, MR_ADDR(Port, LNK_SYNC_INI), CntVal); - - /* start counter */ -- SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_START); -+ SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LNK_START); - - if (!IrqPend) { -- /* clear the unexpected IRQ, and restore the interrupt mask */ -- SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_CLR_IRQ); -+ /* clear the unexpected IRQ */ -+ SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LNK_CLR_IRQ); -+ -+ /* restore the interrupt mask */ - SK_OUT32(IoC, B0_IMSK, OrgIMsk); - } - } /* SkGeLoadLnkSyncCnt*/ --#endif /* SK_LNK_SYNC_CNT */ -+#endif /* SK_LNK_SYNC_CNT */ - - #if defined(SK_DIAG) || defined(SK_CFG_SYNC) - /****************************************************************************** -@@ -758,8 +980,8 @@ SK_U32 CntVal) /* Counter value */ - * synchronous queue is configured - */ - int SkGeCfgSync( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_U32 IntTime, /* Interval Timer Value in units of 8ns */ - SK_U32 LimCount, /* Number of bytes to transfer during IntTime */ -@@ -777,16 +999,16 @@ int SyncMode) /* Sync Mode: TXA_ENA_ALL - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG); - return(1); - } -- -+ - if (pAC->GIni.GP[Port].PXSQSize == 0) { - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E009, SKERR_HWI_E009MSG); - return(2); - } -- -+ - /* calculate register values */ - IntTime = (IntTime / 2) * pAC->GIni.GIHstClkFact / 100; - LimCount = LimCount / 8; -- -+ - if (IntTime > TXA_MAX_VAL || LimCount > TXA_MAX_VAL) { - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG); - return(1); -@@ -804,13 +1026,13 @@ int SyncMode) /* Sync Mode: TXA_ENA_ALL - */ - SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), - TXA_ENA_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC); -- -+ - SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), IntTime); - SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), LimCount); -- -+ - SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), - (SK_U8)(SyncMode & (TXA_ENA_ALLOC | TXA_DIS_ALLOC))); -- -+ - if (IntTime != 0 || LimCount != 0) { - SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), TXA_DIS_FSYNC | TXA_START_RC); - } -@@ -831,10 +1053,10 @@ int SyncMode) /* Sync Mode: TXA_ENA_ALL - * Returns: - * nothing - */ --static void DoInitRamQueue( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ --int QuIoOffs, /* Queue IO Address Offset */ -+void DoInitRamQueue( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int QuIoOffs, /* Queue I/O Address Offset */ - SK_U32 QuStartAddr, /* Queue Start Address */ - SK_U32 QuEndAddr, /* Queue End Address */ - int QuType) /* Queue Type (SK_RX_SRAM_Q|SK_RX_BRAM_Q|SK_TX_RAM_Q) */ -@@ -867,8 +1089,7 @@ int QuType) /* Queue Type (SK_RX_SRAM - - /* continue with SK_RX_BRAM_Q */ - case SK_RX_BRAM_Q: -- /* write threshold for Rx Queue */ -- -+ /* write threshold for Rx Queue (Pause packets) */ - SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RX_UTPP), RxUpThresVal); - SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RX_LTPP), RxLoThresVal); - -@@ -882,7 +1103,8 @@ int QuType) /* Queue Type (SK_RX_SRAM - * or YUKON is used ((GMAC Tx FIFO is only 1 kB) - * we NEED Store & Forward of the RAM buffer. - */ -- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK || -+ if (pAC->GIni.GP[MAC_1].PPortUsage == SK_JUMBO_LINK || -+ pAC->GIni.GP[MAC_2].PPortUsage == SK_JUMBO_LINK || - pAC->GIni.GIYukon) { - /* enable Store & Forward Mode for the Tx Side */ - SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_ENA_STFWD); -@@ -911,8 +1133,8 @@ int QuType) /* Queue Type (SK_RX_SRAM - * nothing - */ - static void SkGeInitRamBufs( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -920,8 +1142,8 @@ int Port) /* Port Index (MAC_1 + n) */ - - pPrt = &pAC->GIni.GP[Port]; - -- if (pPrt->PRxQSize == SK_MIN_RXQ_SIZE) { -- RxQType = SK_RX_SRAM_Q; /* small Rx Queue */ -+ if (pPrt->PRxQSize <= SK_MIN_RXQ_SIZE) { -+ RxQType = SK_RX_SRAM_Q; /* small Rx Queue */ - } - else { - RxQType = SK_RX_BRAM_Q; /* big Rx Queue */ -@@ -929,10 +1151,10 @@ int Port) /* Port Index (MAC_1 + n) */ - - DoInitRamQueue(pAC, IoC, pPrt->PRxQOff, pPrt->PRxQRamStart, - pPrt->PRxQRamEnd, RxQType); -- -+ - DoInitRamQueue(pAC, IoC, pPrt->PXsQOff, pPrt->PXsQRamStart, - pPrt->PXsQRamEnd, SK_TX_RAM_Q); -- -+ - DoInitRamQueue(pAC, IoC, pPrt->PXaQOff, pPrt->PXaQRamStart, - pPrt->PXaQRamEnd, SK_TX_RAM_Q); - -@@ -953,26 +1175,37 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkGeInitRamIface( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { -- /* release local reset */ -- SK_OUT16(IoC, B3_RI_CTRL, RI_RST_CLR); -+ int i; -+ int RamBuffers; - -- /* configure timeout values */ -- SK_OUT8(IoC, B3_RI_WTO_R1, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_WTO_XA1, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_WTO_XS1, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_RTO_R1, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_RTO_XA1, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_RTO_XS1, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_WTO_R2, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_WTO_XA2, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_WTO_XS2, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_RTO_R2, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_RTO_XA2, SK_RI_TO_53); -- SK_OUT8(IoC, B3_RI_RTO_XS2, SK_RI_TO_53); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ RamBuffers = pAC->GIni.GIMacsFound; -+ } -+ else { -+ RamBuffers = 1; -+ } -+ -+ for (i = 0; i < RamBuffers; i++) { -+ /* release local reset */ -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_CTRL), (SK_U8)RI_RST_CLR); - -+ /* configure timeout values */ -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_R1), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XA1), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XS1), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_R1), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XA1), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XS1), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_R2), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XA2), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XS2), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_R2), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XA2), SK_RI_TO_53); -+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53); -+ } - } /* SkGeInitRamIface */ - - -@@ -987,41 +1220,91 @@ SK_IOC IoC) /* IO context */ - * nothing - */ - static void SkGeInitBmu( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -- SK_U32 RxWm; -- SK_U32 TxWm; -+ SK_U16 RxWm; -+ SK_U16 TxWm; - - pPrt = &pAC->GIni.GP[Port]; - - RxWm = SK_BMU_RX_WM; - TxWm = SK_BMU_TX_WM; -- -- if (!pAC->GIni.GIPciSlot64 && !pAC->GIni.GIPciClock66) { -- /* for better performance */ -- RxWm /= 2; -- TxWm /= 2; -- } - -- /* Rx Queue: Release all local resets and set the watermark */ -- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_CLR_RESET); -- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), RxWm); -+ if (CHIP_ID_YUKON_2(pAC)) { - -- /* -- * Tx Queue: Release all local resets if the queue is used ! -- * set watermark -- */ -- if (pPrt->PXSQSize != 0) { -- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_CLR_RESET); -- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_F), TxWm); -+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) { -+ /* for better performance set it to 128 */ -+ RxWm = SK_BMU_RX_WM_PEX; -+ } -+ -+ /* Rx Queue: Release all local resets and set the watermark */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), BMU_CLR_RESET); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), BMU_OPER_INIT); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), BMU_FIFO_OP_ON); -+ -+ SK_OUT16(IoC, Q_ADDR(pPrt->PRxQOff, Q_WM), RxWm); -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U && -+ pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A1) { -+ /* MAC Rx RAM Read is controlled by hardware */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), F_M_RX_RAM_DIS); -+ } -+ -+ /* -+ * Tx Queue: Release all local resets if the queue is used ! -+ * set watermark -+ */ -+ if (pPrt->PXSQSize != 0 && HW_SYNC_TX_SUPPORTED(pAC)) { -+ /* Yukon-EC doesn't have a synchronous Tx queue */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), BMU_CLR_RESET); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), BMU_OPER_INIT); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), BMU_FIFO_OP_ON); -+ -+ SK_OUT16(IoC, Q_ADDR(pPrt->PXsQOff, Q_WM), TxWm); -+ } -+ -+ if (pPrt->PXAQSize != 0) { -+ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), BMU_CLR_RESET); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), BMU_OPER_INIT); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), BMU_FIFO_OP_ON); -+ -+ SK_OUT16(IoC, Q_ADDR(pPrt->PXaQOff, Q_WM), TxWm); -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U && -+ pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A0) { -+ /* fix for Yukon-EC Ultra: set BMU FIFO level */ -+ SK_OUT16(IoC, Q_ADDR(pPrt->PXaQOff, Q_AL), SK_ECU_TXFF_LEV); -+ } -+ } - } -- -- if (pPrt->PXAQSize != 0) { -- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_CLR_RESET); -- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_F), TxWm); -+ else { -+ if (!pAC->GIni.GIPciSlot64 && !pAC->GIni.GIPciClock66) { -+ /* for better performance */ -+ RxWm /= 2; -+ TxWm /= 2; -+ } -+ -+ /* Rx Queue: Release all local resets and set the watermark */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_CLR_RESET); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), RxWm); -+ -+ /* -+ * Tx Queue: Release all local resets if the queue is used ! -+ * set watermark -+ */ -+ if (pPrt->PXSQSize != 0) { -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_CLR_RESET); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_F), TxWm); -+ } -+ -+ if (pPrt->PXAQSize != 0) { -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_CLR_RESET); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_F), TxWm); -+ } - } - /* - * Do NOT enable the descriptor poll timers here, because -@@ -1045,20 +1328,29 @@ int Port) /* Port Index (MAC_1 + n) */ - */ - static SK_U32 TestStopBit( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int QuIoOffs) /* Queue IO Address Offset */ -+SK_IOC IoC, /* I/O Context */ -+int QuIoOffs) /* Queue I/O Address Offset */ - { - SK_U32 QuCsr; /* CSR contents */ - - SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr); -- -- if ((QuCsr & (CSR_STOP | CSR_SV_IDLE)) == 0) { -- /* Stop Descriptor overridden by start command */ -- SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), CSR_STOP); - -- SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ if ((QuCsr & (BMU_STOP | BMU_IDLE)) == 0) { -+ /* Stop Descriptor overridden by start command */ -+ SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), BMU_STOP); -+ -+ SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr); -+ } -+ } -+ else { -+ if ((QuCsr & (CSR_STOP | CSR_SV_IDLE)) == 0) { -+ /* Stop Descriptor overridden by start command */ -+ SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), CSR_STOP); -+ -+ SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr); -+ } - } -- - return(QuCsr); - } /* TestStopBit */ - -@@ -1082,8 +1374,8 @@ int QuIoOffs) /* Queue IO Address Offse - * has to be stopped once before. - * SK_STOP_ALL SK_STOP_TX + SK_STOP_RX - * -- * RstMode = SK_SOFT_RST Resets the MAC. The PHY is still alive. -- * SK_HARD_RST Resets the MAC and the PHY. -+ * RstMode = SK_SOFT_RST Resets the MAC, the PHY is still alive. -+ * SK_HARD_RST Resets the MAC and the PHY. - * - * Example: - * 1) A Link Down event was signaled for a port. Therefore the activity -@@ -1142,56 +1434,82 @@ int QuIoOffs) /* Queue IO Address Offse - * SWITCH_PORT. - */ - void SkGeStopPort( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* I/O context */ --int Port, /* port to stop (MAC_1 + n) */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port to stop (MAC_1 + n) */ - int Dir, /* Direction to Stop (SK_STOP_RX, SK_STOP_TX, SK_STOP_ALL) */ - int RstMode)/* Reset Mode (SK_SOFT_RST, SK_HARD_RST) */ - { --#ifndef SK_DIAG -- SK_EVPARA Para; --#endif /* !SK_DIAG */ - SK_GEPORT *pPrt; -- SK_U32 DWord; -+ SK_U32 RxCsr; - SK_U32 XsCsr; - SK_U32 XaCsr; - SK_U64 ToutStart; -+ SK_U32 CsrStart; -+ SK_U32 CsrStop; -+ SK_U32 CsrIdle; -+ SK_U32 CsrTest; -+ SK_U8 rsl; /* FIFO read shadow level */ -+ SK_U8 rl; /* FIFO read level */ - int i; - int ToutCnt; - - pPrt = &pAC->GIni.GP[Port]; - -+ /* set the proper values of Q_CSR register layout depending on the chip */ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ CsrStart = BMU_START; -+ CsrStop = BMU_STOP; -+ CsrIdle = BMU_IDLE; -+ CsrTest = BMU_IDLE; -+ } -+ else { -+ CsrStart = CSR_START; -+ CsrStop = CSR_STOP; -+ CsrIdle = CSR_SV_IDLE; -+ CsrTest = CSR_SV_IDLE | CSR_STOP; -+ } -+ - if ((Dir & SK_STOP_TX) != 0) { -- /* disable receiver and transmitter */ -- SkMacRxTxDisable(pAC, IoC, Port); -- -+ -+ if (!pAC->GIni.GIAsfEnabled) { -+ /* disable receiver and transmitter */ -+ SkMacRxTxDisable(pAC, IoC, Port); -+ } -+ - /* stop both transmit queues */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CsrStop); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CsrStop); - /* - * If the BMU is in the reset state CSR_STOP will terminate - * immediately. - */ -- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_STOP); -- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_STOP); - - ToutStart = SkOsGetTime(pAC); - ToutCnt = 0; - do { -- /* -- * Clear packet arbiter timeout to make sure -- * this loop will terminate. -- */ -- SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ? -- PA_CLR_TO_TX1 : PA_CLR_TO_TX2)); -- -- /* -- * If the transfer stucks at the MAC the STOP command will not -- * terminate if we don't flush the XMAC's transmit FIFO ! -- */ -- SkMacFlushTxFifo(pAC, IoC, Port); -+#ifdef GENESIS -+ if (pAC->GIni.GIGenesis) { -+ /* clear Tx packet arbiter timeout IRQ */ -+ SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ? -+ PA_CLR_TO_TX1 : PA_CLR_TO_TX2)); -+ /* -+ * If the transfer stucks at the XMAC the STOP command will not -+ * terminate if we don't flush the XMAC's transmit FIFO ! -+ */ -+ SkMacFlushTxFifo(pAC, IoC, Port); -+ } -+#endif /* GENESIS */ - -- XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff); - XaCsr = TestStopBit(pAC, IoC, pPrt->PXaQOff); - -+ if (HW_SYNC_TX_SUPPORTED(pAC)) { -+ XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff); -+ } -+ else { -+ XsCsr = XaCsr; -+ } -+ - if (SkOsGetTime(pAC) - ToutStart > (SK_TICKS_PER_SEC / 18)) { - /* - * Timeout of 1/18 second reached. -@@ -1199,67 +1517,115 @@ int RstMode)/* Reset Mode (SK_SOFT_RST, - */ - ToutCnt++; - if (ToutCnt > 1) { -- /* Might be a problem when the driver event handler -- * calls StopPort again. XXX. -+ /* -+ * If BMU stop doesn't terminate, we assume that -+ * we have a stable state and can reset the BMU, -+ * the Prefetch Unit, and RAM buffer now. - */ -- -- /* Fatal Error, Loop aborted */ -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E018, -- SKERR_HWI_E018MSG); --#ifndef SK_DIAG -- Para.Para64 = Port; -- SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); --#endif /* !SK_DIAG */ -- return; -+ break; /* ===> leave do/while loop here */ - } - /* -- * Cache incoherency workaround: Assume a start command -+ * Cache incoherency workaround: assume a start command - * has been lost while sending the frame. - */ - ToutStart = SkOsGetTime(pAC); - -- if ((XsCsr & CSR_STOP) != 0) { -- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_START); -+ if ((XsCsr & CsrStop) != 0) { -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CsrStart); - } -- if ((XaCsr & CSR_STOP) != 0) { -- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_START); -+ -+ if ((XaCsr & CsrStop) != 0) { -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CsrStart); - } -- } - -+ /* -+ * After the previous operations the X(s|a)Csr does no -+ * longer contain the proper values -+ */ -+ XaCsr = TestStopBit(pAC, IoC, pPrt->PXaQOff); -+ -+ if (HW_SYNC_TX_SUPPORTED(pAC)) { -+ XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff); -+ } -+ else { -+ XsCsr = XaCsr; -+ } -+ } - /* - * Because of the ASIC problem report entry from 21.08.1998 it is - * required to wait until CSR_STOP is reset and CSR_SV_IDLE is set. -+ * (valid for GENESIS only) - */ -- } while ((XsCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE || -- (XaCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE); -+ } while (((XsCsr & CsrTest) != CsrIdle || -+ (XaCsr & CsrTest) != CsrIdle)); -+ -+ if (pAC->GIni.GIAsfEnabled) { - -- /* Reset the MAC depending on the RstMode */ -- if (RstMode == SK_SOFT_RST) { -- SkMacSoftRst(pAC, IoC, Port); -+ pPrt->PState = (RstMode == SK_SOFT_RST) ? SK_PRT_STOP : -+ SK_PRT_RESET; - } - else { -- SkMacHardRst(pAC, IoC, Port); -- } -- -- /* Disable Force Sync bit and Enable Alloc bit */ -- SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), -+ /* Reset the MAC depending on the RstMode */ -+ if (RstMode == SK_SOFT_RST) { -+ -+ SkMacSoftRst(pAC, IoC, Port); -+ } -+ else { -+#ifdef SK_DIAG -+ if (HW_FEATURE(pAC, HWF_WA_DEV_472) && Port == MAC_1 && -+ pAC->GIni.GP[MAC_2].PState == SK_PRT_RUN) { -+ -+ pAC->GIni.GP[MAC_1].PState = SK_PRT_RESET; -+ -+ /* set GPHY Control reset */ -+ SK_OUT8(IoC, MR_ADDR(MAC_1, GPHY_CTRL), (SK_U8)GPC_RST_SET); -+ } -+ else { -+ -+ SkMacHardRst(pAC, IoC, Port); -+ } -+#else /* !SK_DIAG */ -+ SkMacHardRst(pAC, IoC, Port); -+#endif /* !SK_DIAG */ -+ } -+ } -+ -+ /* disable Force Sync bit and Enable Alloc bit */ -+ SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), - TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC); -- -+ - /* Stop Interval Timer and Limit Counter of Tx Arbiter */ - SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), 0L); - SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), 0L); - - /* Perform a local reset of the port's Tx path */ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ /* Reset the PCI FIFO of the async Tx queue */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), -+ BMU_RST_SET | BMU_FIFO_RST); -+ -+ /* Reset the PCI FIFO of the sync Tx queue */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), -+ BMU_RST_SET | BMU_FIFO_RST); -+ -+ /* Reset the Tx prefetch units */ -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(pPrt->PXaQOff, PREF_UNIT_CTRL_REG), -+ PREF_UNIT_RST_SET); -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(pPrt->PXsQOff, PREF_UNIT_CTRL_REG), -+ PREF_UNIT_RST_SET); -+ } -+ else { -+ /* Reset the PCI FIFO of the async Tx queue */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_SET_RESET); -+ /* Reset the PCI FIFO of the sync Tx queue */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_SET_RESET); -+ } - -- /* Reset the PCI FIFO of the async Tx queue */ -- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_SET_RESET); -- /* Reset the PCI FIFO of the sync Tx queue */ -- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_SET_RESET); - /* Reset the RAM Buffer async Tx queue */ - SK_OUT8(IoC, RB_ADDR(pPrt->PXaQOff, RB_CTRL), RB_RST_SET); - /* Reset the RAM Buffer sync Tx queue */ - SK_OUT8(IoC, RB_ADDR(pPrt->PXsQOff, RB_CTRL), RB_RST_SET); -- -+ - /* Reset Tx MAC FIFO */ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -@@ -1271,74 +1637,129 @@ int RstMode)/* Reset Mode (SK_SOFT_RST, - SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_DIS); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- /* Reset TX MAC FIFO */ -- SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_SET); -+ /* do the reset only if ASF is not enabled */ -+ if (!pAC->GIni.GIAsfEnabled) { -+ /* Reset Tx MAC FIFO */ -+ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_SET); -+ } -+ -+ /* set Pause Off */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_PAUSE_OFF); - } - #endif /* YUKON */ - } - - if ((Dir & SK_STOP_RX) != 0) { -- /* -- * The RX Stop Command will not terminate if no buffers -- * are queued in the RxD ring. But it will always reach -- * the Idle state. Therefore we can use this feature to -- * stop the transfer of received packets. -- */ -- /* stop the port's receive queue */ -- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_STOP); -- -- i = 100; -- do { -+ -+ if (CHIP_ID_YUKON_2(pAC)) { - /* -- * Clear packet arbiter timeout to make sure -- * this loop will terminate -+ * The RX Stop command will not work for Yukon-2 if the BMU does not -+ * reach the end of packet and since we can't make sure that we have -+ * incoming data, we must reset the BMU while it is not during a DMA -+ * transfer. Since it is possible that the RX path is still active, -+ * the RX RAM buffer will be stopped first, so any possible incoming -+ * data will not trigger a DMA. After the RAM buffer is stopped, the -+ * BMU is polled until any DMA in progress is ended and only then it -+ * will be reset. - */ -- SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ? -- PA_CLR_TO_RX1 : PA_CLR_TO_RX2)); - -- DWord = TestStopBit(pAC, IoC, pPrt->PRxQOff); -+ /* disable the RAM Buffer receive queue */ -+ SK_OUT8(IoC, RB_ADDR(pPrt->PRxQOff, RB_CTRL), RB_DIS_OP_MD); - -- /* timeout if i==0 (bug fix for #10748) */ -- if (--i == 0) { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E024, -- SKERR_HWI_E024MSG); -- break; -+ i = 0xffff; -+ while (--i) { -+ SK_IN8(IoC, RB_ADDR(pPrt->PRxQOff, Q_RX_RSL), &rsl); -+ SK_IN8(IoC, RB_ADDR(pPrt->PRxQOff, Q_RX_RL), &rl); -+ -+ if (rsl == rl) { -+ break; -+ } - } -+ - /* -- * because of the ASIC problem report entry from 21.08.98 -- * it is required to wait until CSR_STOP is reset and -- * CSR_SV_IDLE is set. -+ * If the Rx side is blocked, the above loop cannot terminate. -+ * But, if there was any traffic it should be terminated, now. -+ * However, stop the Rx BMU and the Prefetch Unit ! - */ -- } while ((DWord & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE); -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), -+ BMU_RST_SET | BMU_FIFO_RST); -+ /* reset the Rx prefetch unit */ -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(pPrt->PRxQOff, PREF_UNIT_CTRL_REG), -+ PREF_UNIT_RST_SET); -+ } -+ else { -+ /* -+ * The RX Stop Command will not terminate if no buffers -+ * are queued in the RxD ring. But it will always reach -+ * the Idle state. Therefore we can use this feature to -+ * stop the transfer of received packets. -+ */ -+ /* stop the port's receive queue */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CsrStop); - -- /* The path data transfer activity is fully stopped now */ -+ i = 100; -+ do { -+#ifdef GENESIS -+ if (pAC->GIni.GIGenesis) { -+ /* clear Rx packet arbiter timeout IRQ */ -+ SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ? -+ PA_CLR_TO_RX1 : PA_CLR_TO_RX2)); -+ } -+#endif /* GENESIS */ -+ -+ RxCsr = TestStopBit(pAC, IoC, pPrt->PRxQOff); -+ -+ /* timeout if i==0 (bug fix for #10748) */ -+ if (--i == 0) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E024, -+ SKERR_HWI_E024MSG); -+ break; -+ } -+ /* -+ * Because of the ASIC problem report entry from 21.08.1998 it is -+ * required to wait until CSR_STOP is reset and CSR_SV_IDLE is set. -+ * (valid for GENESIS only) -+ */ -+ } while ((RxCsr & CsrTest) != CsrIdle); -+ /* The path data transfer activity is fully stopped now */ - -- /* Perform a local reset of the port's Rx path */ -+ /* Perform a local reset of the port's Rx path */ -+ /* Reset the PCI FIFO of the Rx queue */ -+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_SET_RESET); -+ } - -- /* Reset the PCI FIFO of the Rx queue */ -- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_SET_RESET); - /* Reset the RAM Buffer receive queue */ - SK_OUT8(IoC, RB_ADDR(pPrt->PRxQOff, RB_CTRL), RB_RST_SET); - - /* Reset Rx MAC FIFO */ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_SET); - - /* switch Rx LED off, stop the LED counter */ - SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_DIS); - } - #endif /* GENESIS */ -- - #ifdef YUKON -- if (pAC->GIni.GIYukon) { -+ if (pAC->GIni.GIYukon && !pAC->GIni.GIAsfEnabled) { - /* Reset Rx MAC FIFO */ - SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_SET); - } -+ -+ if (((pAC->GIni.GIChipId == CHIP_ID_YUKON) || -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE)) && -+ (RstMode == SK_HARD_RST)) { -+ /* set Link Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_SET); -+ -+ /* clear Link Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_CLR); -+ } -+ - #endif /* YUKON */ - } - } /* SkGeStopPort */ -@@ -1355,8 +1776,8 @@ int RstMode)/* Reset Mode (SK_SOFT_RST, - * nothing - */ - static void SkGeInit0( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { - int i; - SK_GEPORT *pPrt; -@@ -1365,6 +1786,7 @@ SK_IOC IoC) /* IO context */ - pPrt = &pAC->GIni.GP[i]; - - pPrt->PState = SK_PRT_RESET; -+ pPrt->PPortUsage = SK_RED_LINK; - pPrt->PRxQOff = QOffTab[i].RxQOff; - pPrt->PXsQOff = QOffTab[i].XsQOff; - pPrt->PXaQOff = QOffTab[i].XaQOff; -@@ -1393,24 +1815,30 @@ SK_IOC IoC) /* IO context */ - pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN; - pPrt->PAutoNegFail = SK_FALSE; - pPrt->PHWLinkUp = SK_FALSE; -- pPrt->PLinkBroken = SK_TRUE; /* See WA code */ -+ pPrt->PLinkBroken = SK_TRUE; /* See WA code */ - pPrt->PPhyPowerState = PHY_PM_OPERATIONAL_MODE; - pPrt->PMacColThres = TX_COL_DEF; - pPrt->PMacJamLen = TX_JAM_LEN_DEF; - pPrt->PMacJamIpgVal = TX_JAM_IPG_DEF; - pPrt->PMacJamIpgData = TX_IPG_JAM_DEF; -+ pPrt->PMacBackOffLim = TX_BOF_LIM_DEF; -+ pPrt->PMacDataBlind = DATA_BLIND_DEF; - pPrt->PMacIpgData = IPG_DATA_DEF; - pPrt->PMacLimit4 = SK_FALSE; - } - -- pAC->GIni.GIPortUsage = SK_RED_LINK; - pAC->GIni.GILedBlinkCtrl = (SK_U16)OemConfig.Value; -- pAC->GIni.GIValIrqMask = IS_ALL_MSK; -+ pAC->GIni.GIChipCap = 0; -+ -+ for (i = 0; i < 4; i++) { -+ pAC->GIni.HwF.Features[i]= 0x00000000; -+ pAC->GIni.HwF.OnMask[i] = 0x00000000; -+ pAC->GIni.HwF.OffMask[i] = 0x00000000; -+ } - - } /* SkGeInit0*/ - - #ifdef SK_PCI_RESET -- - /****************************************************************************** - * - * SkGePciReset() - Reset PCI interface -@@ -1426,8 +1854,8 @@ SK_IOC IoC) /* IO context */ - * 1: Power state could not be changed to 3. - */ - static int SkGePciReset( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { - int i; - SK_U16 PmCtlSts; -@@ -1450,7 +1878,7 @@ SK_IOC IoC) /* IO context */ - /* We know the RAM Interface Arbiter is enabled. */ - SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D3); - SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts); -- -+ - if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D3) { - return(1); - } -@@ -1460,7 +1888,7 @@ SK_IOC IoC) /* IO context */ - - /* Check for D0 state. */ - SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts); -- -+ - if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D0) { - return(1); - } -@@ -1469,11 +1897,24 @@ SK_IOC IoC) /* IO context */ - SkPciReadCfgWord(pAC, PCI_COMMAND, &PciCmd); - SkPciReadCfgByte(pAC, PCI_CACHE_LSZ, &Cls); - SkPciReadCfgDWord(pAC, PCI_BASE_1ST, &Bp1); -- SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2); -+ -+ /* -+ * Compute the location in PCI config space of BAR2 -+ * relativ to the location of BAR1 -+ */ -+ if ((Bp1 & PCI_MEM_TYP_MSK) == PCI_MEM64BIT) { -+ /* BAR1 is 64 bits wide */ -+ i = 8; -+ } -+ else { -+ i = 4; -+ } -+ -+ SkPciReadCfgDWord(pAC, PCI_BASE_1ST + i, &Bp2); - SkPciReadCfgByte(pAC, PCI_LAT_TIM, &Lat); -- -- if (PciCmd != 0 || Cls != (SK_U8)0 || Lat != (SK_U8)0 || -- (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1) { -+ -+ if (PciCmd != 0 || Cls != 0 || (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1 || -+ Lat != 0) { - return(1); - } - -@@ -1484,9 +1925,115 @@ SK_IOC IoC) /* IO context */ - - return(0); - } /* SkGePciReset */ -- - #endif /* SK_PCI_RESET */ - -+ -+#ifndef SK_SLIM -+/****************************************************************************** -+ * -+ * SkGeSetUpSupFeatures() - Collect Feature List for HW_FEATURE Macro -+ * -+ * Description: -+ * This function collects the available features and required -+ * deviation services of the Adapter and provides these -+ * information in the GIHwF struct. This information is used as -+ * default value and may be overritten by the driver using the -+ * SET_HW_FEATURE_MASK() macro in its Init0 phase. -+ * -+ * Notice: -+ * Using the On and Off mask: Never switch on the same bit in both -+ * masks simultaneously. However, if doing the Off mask will win. -+ * -+ * Returns: -+ * nothing -+ */ -+static void SkGeSetUpSupFeatures( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ -+{ -+ int i; -+ SK_U16 Word; -+ -+ switch (pAC->GIni.GIChipId) { -+ case CHIP_ID_YUKON_EC: -+ if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_A1) { -+ /* A0/A1 */ -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_42 | HWF_WA_DEV_46 | HWF_WA_DEV_43_418 | -+ HWF_WA_DEV_420 | HWF_WA_DEV_423 | -+ HWF_WA_DEV_424 | HWF_WA_DEV_425 | HWF_WA_DEV_427 | -+ HWF_WA_DEV_428 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 | -+ HWF_WA_DEV_4152| HWF_WA_DEV_4167; -+ } -+ else { -+ /* A2/A3 */ -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_424 | HWF_WA_DEV_425 | HWF_WA_DEV_427 | -+ HWF_WA_DEV_428 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 | -+ HWF_WA_DEV_4152| HWF_WA_DEV_4167; -+ } -+ break; -+ case CHIP_ID_YUKON_FE: -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_427 | HWF_WA_DEV_4109 | -+ HWF_WA_DEV_4152| HWF_WA_DEV_4167; -+ break; -+ case CHIP_ID_YUKON_XL: -+ switch (pAC->GIni.GIChipRev) { -+ case CHIP_REV_YU_XL_A0: /* still needed for Diag */ -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_427 | HWF_WA_DEV_463 | HWF_WA_DEV_472 | -+ HWF_WA_DEV_479 | HWF_WA_DEV_483 | HWF_WA_DEV_4115 | -+ HWF_WA_DEV_4152| HWF_WA_DEV_4167; -+ break; -+ -+ case CHIP_REV_YU_XL_A1: -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 | -+ HWF_WA_DEV_4115| HWF_WA_DEV_4152| HWF_WA_DEV_4167; -+ break; -+ -+ case CHIP_REV_YU_XL_A2: -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 | -+ HWF_WA_DEV_4115 |HWF_WA_DEV_4167; -+ break; -+ -+ case CHIP_REV_YU_XL_A3: -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 | -+ HWF_WA_DEV_4115; -+ break; -+ } -+ break; -+ case CHIP_ID_YUKON_EC_U: -+ if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A0) { -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109; -+ } -+ else if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A1) { -+ pAC->GIni.HwF.Features[HW_DEV_LIST] = -+ HWF_WA_DEV_427 | HWF_WA_DEV_4109 | HWF_WA_DEV_4185; -+ -+ /* check for A1b */ -+ SK_IN16(IoC, Q_ADDR(Q_XA1, Q_WM), &Word); -+ if (Word == 0) { -+ pAC->GIni.HwF.Features[HW_DEV_LIST] |= -+ HWF_WA_DEV_4185CS | HWF_WA_DEV_4200; -+ } -+ } -+ break; -+ } -+ -+ for (i = 0; i < 4; i++) { -+ pAC->GIni.HwF.Features[i] = -+ (pAC->GIni.HwF.Features[i] | pAC->GIni.HwF.OnMask[i]) & -+ ~pAC->GIni.HwF.OffMask[i]; -+ } -+} /* SkGeSetUpSupFeatures */ -+#endif /* !SK_SLIM */ -+ -+ - /****************************************************************************** - * - * SkGeInit1() - Level 1 Initialization -@@ -1509,80 +2056,235 @@ SK_IOC IoC) /* IO context */ - * 6: HW self test failed - */ - static int SkGeInit1( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { - SK_U8 Byte; - SK_U16 Word; -- SK_U16 CtrlStat; -+ SK_U32 CtrlStat; -+ SK_U32 VauxAvail; - SK_U32 DWord; -+ SK_U32 Our1; -+ SK_U32 PowerDownBit; -+ SK_BOOL FiberType; -+ SK_GEPORT *pPrt; - int RetVal; -- int i; -+ int i, j; - - RetVal = 0; - -- /* save CLK_RUN bits (YUKON-Lite) */ -- SK_IN16(IoC, B0_CTST, &CtrlStat); -+ /* save CLK_RUN & ASF_ENABLE bits (YUKON-Lite, YUKON-EC) */ -+ SK_IN32(IoC, B0_CTST, &CtrlStat); - - #ifdef SK_PCI_RESET - (void)SkGePciReset(pAC, IoC); - #endif /* SK_PCI_RESET */ - -- /* do the SW-reset */ -- SK_OUT8(IoC, B0_CTST, CS_RST_SET); -- - /* release the SW-reset */ -+ /* Important: SW-reset has to be cleared here, to ensure -+ * the CHIP_ID can be read IO-mapped based, too - -+ * remember the RAP register can only be written if -+ * SW-reset is cleared. -+ */ - SK_OUT8(IoC, B0_CTST, CS_RST_CLR); - -+ /* read Chip Identification Number */ -+ SK_IN8(IoC, B2_CHIP_ID, &Byte); -+ pAC->GIni.GIChipId = Byte; -+ -+ pAC->GIni.GIAsfEnabled = SK_FALSE; -+ -+ /* ASF support only for Yukon-2 */ -+ if ((pAC->GIni.GIChipId >= CHIP_ID_YUKON_XL) && -+ (pAC->GIni.GIChipId <= CHIP_ID_YUKON_EC)) { -+#ifdef SK_ASF -+ if ((CtrlStat & Y2_ASF_ENABLE) != 0) { -+ /* do the SW-reset only if ASF is not enabled */ -+ pAC->GIni.GIAsfEnabled = SK_TRUE; -+ } -+#else /* !SK_ASF */ -+ -+ SK_IN8(IoC, B28_Y2_ASF_STAT_CMD, &Byte); -+ -+ pAC->GIni.GIAsfRunning = Byte & Y2_ASF_RUNNING; -+ -+ /* put ASF system in reset state */ -+ SK_OUT8(IoC, B28_Y2_ASF_STAT_CMD, (SK_U8)Y2_ASF_RESET); -+ -+ /* disable ASF Unit */ -+ SK_OUT16(IoC, B0_CTST, Y2_ASF_DISABLE); -+#endif /* !SK_ASF */ -+ } -+ -+ if (!pAC->GIni.GIAsfEnabled) { -+ /* Yukon-2: required for Diag and Power Management */ -+ /* set the SW-reset */ -+ SK_OUT8(IoC, B0_CTST, CS_RST_SET); -+ -+ /* release the SW-reset */ -+ SK_OUT8(IoC, B0_CTST, CS_RST_CLR); -+ } -+ -+ /* enable Config Write */ -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -+ - /* reset all error bits in the PCI STATUS register */ - /* - * Note: PCI Cfg cycles cannot be used, because they are not - * available on some platforms after 'boot time'. - */ -- SK_IN16(IoC, PCI_C(PCI_STATUS), &Word); -- -- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -- SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); -- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word); -+ -+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), Word | (SK_U16)PCI_ERRBITS); - - /* release Master Reset */ - SK_OUT8(IoC, B0_CTST, CS_MRST_CLR); - - #ifdef CLK_RUN - CtrlStat |= CS_CLK_RUN_ENA; --#endif /* CLK_RUN */ - - /* restore CLK_RUN bits */ - SK_OUT16(IoC, B0_CTST, (SK_U16)(CtrlStat & - (CS_CLK_RUN_HOT | CS_CLK_RUN_RST | CS_CLK_RUN_ENA))); -+#endif /* CLK_RUN */ -+ -+ if ((pAC->GIni.GIChipId >= CHIP_ID_YUKON_XL) && -+ (pAC->GIni.GIChipId <= CHIP_ID_YUKON_FE)) { -+ -+ pAC->GIni.GIYukon2 = SK_TRUE; -+ pAC->GIni.GIValIrqMask = Y2_IS_ALL_MSK; -+ pAC->GIni.GIValHwIrqMask = Y2_HWE_ALL_MSK; -+ -+ VauxAvail = Y2_VAUX_AVAIL; -+ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_STATUS), &DWord); -+ -+ if ((DWord & PCI_OS_PCI_X) != 0) { -+#ifndef SK_SLIM -+ /* this is a PCI / PCI-X bus */ -+ if ((DWord & PCI_OS_PCIX) != 0) { -+ /* this is a PCI-X bus */ -+ pAC->GIni.GIPciBus = SK_PCIX_BUS; -+ -+ /* PCI-X is always 64-bit wide */ -+ pAC->GIni.GIPciSlot64 = SK_TRUE; -+ -+ pAC->GIni.GIPciMode = (SK_U8)(PCI_OS_SPEED(DWord)); -+ } -+ else { -+ /* this is a conventional PCI bus */ -+ pAC->GIni.GIPciBus = SK_PCI_BUS; -+ -+ SK_IN16(IoC, PCI_C(pAC, PCI_OUR_REG_2), &Word); -+ -+ /* check if 64-bit width is used */ -+ pAC->GIni.GIPciSlot64 = (SK_BOOL) -+ (((DWord & PCI_OS_PCI64B) != 0) && -+ ((Word & PCI_USEDATA64) != 0)); -+ -+ /* check if 66 MHz PCI Clock is active */ -+ pAC->GIni.GIPciClock66 = (SK_BOOL)((DWord & PCI_OS_PCI66M) != 0); -+ } -+#endif /* !SK_SLIM */ -+ } -+ else { -+ /* this is a PEX bus */ -+ pAC->GIni.GIPciBus = SK_PEX_BUS; -+ -+ /* clear any PEX errors */ -+ SK_OUT32(IoC, PCI_C(pAC, PEX_UNC_ERR_STAT), 0xffffffffUL); -+ -+ SK_IN16(IoC, PCI_C(pAC, PEX_LNK_STAT), &Word); -+ -+ pAC->GIni.GIPexWidth = (SK_U8)((Word & PEX_LS_LINK_WI_MSK) >> 4); -+ } -+ /* -+ * Yukon-2 chips family has a different way of providing -+ * the number of MACs available -+ */ -+ pAC->GIni.GIMacsFound = 1; -+ -+ SK_IN8(IoC, B2_Y2_HW_RES, &Byte); -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ /* -+ * OEM config value is overwritten and should not -+ * be used for Yukon-2 -+ */ -+ pAC->GIni.GILedBlinkCtrl |= SK_ACT_LED_BLINK; -+ -+ if (CFG_LED_MODE(Byte) == CFG_LED_DUAL_ACT_LNK) { -+ -+ pAC->GIni.GILedBlinkCtrl |= SK_DUAL_LED_ACT_LNK; -+ } -+ } -+ -+ if ((Byte & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) { -+ -+ SK_IN8(IoC, B2_Y2_CLK_GATE, &Byte); -+ -+ if (!(Byte & Y2_STATUS_LNK2_INAC)) { -+ /* Link 2 activ */ -+ pAC->GIni.GIMacsFound++; -+ } -+ } -+ -+#ifdef VCPU -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL) { -+ /* temporary WA for reported number of links */ -+ pAC->GIni.GIMacsFound = 2; -+ } -+#endif /* VCPU */ -+ -+#ifdef REPLAY_TIMER -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) { -+ SK_OUT16(IoC, PCI_C(pAC, PEX_ACK_RPLY_TOX1), 0x2710); /* 40 us */ -+ } -+#endif -+ -+ /* read Chip Revision */ -+ SK_IN8(IoC, B2_MAC_CFG, &Byte); -+ -+ pAC->GIni.GIChipCap = Byte & 0x0f; -+ } -+ else { -+ pAC->GIni.GIYukon2 = SK_FALSE; -+ pAC->GIni.GIValIrqMask = IS_ALL_MSK; -+ pAC->GIni.GIValHwIrqMask = 0; /* not activated */ -+ -+ VauxAvail = CS_VAUX_AVAIL; -+ -+ /* read number of MACs and Chip Revision */ -+ SK_IN8(IoC, B2_MAC_CFG, &Byte); -+ -+ pAC->GIni.GIMacsFound = (Byte & CFG_SNG_MAC) ? 1 : 2; -+ } - -- /* read Chip Identification Number */ -- SK_IN8(IoC, B2_CHIP_ID, &Byte); -- pAC->GIni.GIChipId = Byte; -- -- /* read number of MACs */ -- SK_IN8(IoC, B2_MAC_CFG, &Byte); -- pAC->GIni.GIMacsFound = (Byte & CFG_SNG_MAC) ? 1 : 2; -- - /* get Chip Revision Number */ - pAC->GIni.GIChipRev = (SK_U8)((Byte & CFG_CHIP_R_MSK) >> 4); - -- /* get diff. PCI parameters */ -- SK_IN16(IoC, B0_CTST, &CtrlStat); -- -+#ifndef SK_DIAG -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL && -+ pAC->GIni.GIChipRev == CHIP_REV_YU_XL_A0) { -+ /* Yukon-2 Chip Rev. A0 */ -+ return(6); -+ } -+#endif /* !SK_DIAG */ -+ - /* read the adapters RAM size */ - SK_IN8(IoC, B2_E_0, &Byte); -- -+ - pAC->GIni.GIGenesis = SK_FALSE; - pAC->GIni.GIYukon = SK_FALSE; - pAC->GIni.GIYukonLite = SK_FALSE; -+ pAC->GIni.GIVauxAvail = SK_FALSE; - - #ifdef GENESIS - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { - - pAC->GIni.GIGenesis = SK_TRUE; - -- if (Byte == (SK_U8)3) { -+ if (Byte == (SK_U8)3) { - /* special case: 4 x 64k x 36, offset = 0x80000 */ - pAC->GIni.GIRamSize = 1024; - pAC->GIni.GIRamOffs = (SK_U32)512 * 1024; -@@ -1591,57 +2293,83 @@ SK_IOC IoC) /* IO context */ - pAC->GIni.GIRamSize = (int)Byte * 512; - pAC->GIni.GIRamOffs = 0; - } -- /* all GE adapters work with 53.125 MHz host clock */ -+ /* all GENESIS adapters work with 53.125 MHz host clock */ - pAC->GIni.GIHstClkFact = SK_FACT_53; -- -+ - /* set Descr. Poll Timer Init Value to 250 ms */ - pAC->GIni.GIPollTimerVal = - SK_DPOLL_DEF * (SK_U32)pAC->GIni.GIHstClkFact / 100; - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) { -- -+ - pAC->GIni.GIYukon = SK_TRUE; -- -+ - pAC->GIni.GIRamSize = (Byte == (SK_U8)0) ? 128 : (int)Byte * 4; -- -+ -+#ifndef SK_SLIM - pAC->GIni.GIRamOffs = 0; -- -- /* WA for chip Rev. A */ -+ -+ /* WA for Yukon chip Rev. A */ - pAC->GIni.GIWolOffs = (pAC->GIni.GIChipId == CHIP_ID_YUKON && - pAC->GIni.GIChipRev == 0) ? WOL_REG_OFFS : 0; -- -+ - /* get PM Capabilities of PCI config space */ -- SK_IN16(IoC, PCI_C(PCI_PM_CAP_REG), &Word); -+ SK_IN16(IoC, PCI_C(pAC, PCI_PM_CAP_REG), &Word); - - /* check if VAUX is available */ -- if (((CtrlStat & CS_VAUX_AVAIL) != 0) && -+ if (((CtrlStat & VauxAvail) != 0) && - /* check also if PME from D3cold is set */ - ((Word & PCI_PME_D3C_SUP) != 0)) { - /* set entry in GE init struct */ - pAC->GIni.GIVauxAvail = SK_TRUE; - } -- -- if (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) { -- /* this is Rev. A1 */ -- pAC->GIni.GIYukonLite = SK_TRUE; -- } -- else { -- /* save Flash-Address Register */ -- SK_IN32(IoC, B2_FAR, &DWord); -+#endif /* !SK_SLIM */ - -- /* test Flash-Address Register */ -- SK_OUT8(IoC, B2_FAR + 3, 0xff); -- SK_IN8(IoC, B2_FAR + 3, &Byte); -+ if (!CHIP_ID_YUKON_2(pAC)) { - -- if (Byte != 0) { -- /* this is Rev. A0 */ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) { -+ /* this is Rev. A1 */ - pAC->GIni.GIYukonLite = SK_TRUE; -+ } -+#ifndef SK_SLIM -+ else { -+ /* save Flash-Address Register */ -+ SK_IN32(IoC, B2_FAR, &DWord); - -- /* restore Flash-Address Register */ -- SK_OUT32(IoC, B2_FAR, DWord); -+ /* test Flash-Address Register */ -+ SK_OUT8(IoC, B2_FAR + 3, 0xff); -+ SK_IN8(IoC, B2_FAR + 3, &Byte); -+ -+ if (Byte != 0) { -+ /* this is Rev. A0 */ -+ pAC->GIni.GIYukonLite = SK_TRUE; -+ -+ /* restore Flash-Address Register */ -+ SK_OUT32(IoC, B2_FAR, DWord); -+ } -+ } -+#endif /* !SK_SLIM */ -+ } -+ else { -+ /* Check for CLS = 0 (dev. #4.55) */ -+ if (pAC->GIni.GIPciBus != SK_PEX_BUS) { -+ /* PCI and PCI-X */ -+ SK_IN8(IoC, PCI_C(pAC, PCI_CACHE_LSZ), &Byte); -+ -+ if (Byte == 0) { -+ /* set CLS to 2 if configured to 0 */ -+ SK_OUT8(IoC, PCI_C(pAC, PCI_CACHE_LSZ), 2); -+ } -+ -+ if (pAC->GIni.GIPciBus == SK_PCIX_BUS) { -+ /* set Cache Line Size opt. */ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &DWord); -+ DWord |= PCI_CLS_OPT; -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), DWord); -+ } - } - } - -@@ -1649,138 +2377,282 @@ SK_IOC IoC) /* IO context */ - SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA | - PC_VAUX_OFF | PC_VCC_ON)); - -- /* read the Interrupt source */ -- SK_IN32(IoC, B0_ISRC, &DWord); -- -- if ((DWord & IS_HW_ERR) != 0) { -- /* read the HW Error Interrupt source */ -- SK_IN32(IoC, B0_HWE_ISRC, &DWord); -- -- if ((DWord & IS_IRQ_SENSOR) != 0) { -- /* disable HW Error IRQ */ -- pAC->GIni.GIValIrqMask &= ~IS_HW_ERR; -+ Byte = 0; -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ switch (pAC->GIni.GIChipId) { -+ /* PEX adapters work with different host clock */ -+ case CHIP_ID_YUKON_EC: -+ case CHIP_ID_YUKON_EC_U: -+ /* Yukon-EC works with 125 MHz host clock */ -+ pAC->GIni.GIHstClkFact = SK_FACT_125; -+ break; -+ case CHIP_ID_YUKON_FE: -+ /* Yukon-FE works with 100 MHz host clock */ -+ pAC->GIni.GIHstClkFact = SK_FACT_100; -+ break; -+ case CHIP_ID_YUKON_XL: -+ /* all Yukon-2 adapters work with 156 MHz host clock */ -+ pAC->GIni.GIHstClkFact = 2 * SK_FACT_78; -+ -+ if (pAC->GIni.GIChipRev > CHIP_REV_YU_XL_A1) { -+ /* enable bits are inverted */ -+ Byte = (SK_U8)(Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS | -+ Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS | -+ Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS); -+ } -+ break; -+ default: -+ SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E006, -+ SKERR_HWI_E006MSG); -+ } -+ -+ pAC->GIni.GIPollTimerVal = -+ SK_DPOLL_DEF_Y2 * (SK_U32)pAC->GIni.GIHstClkFact / 100; -+ -+ /* set power down bit */ -+ PowerDownBit = PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD; -+ -+ /* disable Core Clock Division, set Clock Select to 0 (Yukon-2) */ -+ SK_OUT32(IoC, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS); -+ -+ /* enable MAC/PHY, PCI and Core Clock for both Links */ -+ SK_OUT8(IoC, B2_Y2_CLK_GATE, Byte); -+ } -+ else { -+ /* YUKON adapters work with 78 MHz host clock */ -+ pAC->GIni.GIHstClkFact = SK_FACT_78; -+ -+ pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX; /* 215 ms */ -+ -+ /* read the Interrupt source */ -+ SK_IN32(IoC, B0_ISRC, &DWord); -+ -+ if ((DWord & IS_HW_ERR) != 0) { -+ /* read the HW Error Interrupt source */ -+ SK_IN32(IoC, B0_HWE_ISRC, &DWord); -+ -+ if ((DWord & IS_IRQ_SENSOR) != 0) { -+ /* disable HW Error IRQ */ -+ pAC->GIni.GIValIrqMask &= ~IS_HW_ERR; -+ } - } -+ /* set power down bit */ -+ PowerDownBit = PCI_PHY_COMA; - } -- -- for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -- /* set GMAC Link Control reset */ -- SK_OUT16(IoC, MR_ADDR(i, GMAC_LINK_CTRL), GMLC_RST_SET); - -- /* clear GMAC Link Control reset */ -- SK_OUT16(IoC, MR_ADDR(i, GMAC_LINK_CTRL), GMLC_RST_CLR); -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &Our1); -+ -+ Our1 &= ~PowerDownBit; -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL && -+ pAC->GIni.GIChipRev > CHIP_REV_YU_XL_A1) { -+ /* deassert Low Power for 1st PHY */ -+ Our1 |= PCI_Y2_PHY1_COMA; -+ -+ if (pAC->GIni.GIMacsFound > 1) { -+ /* deassert Low Power for 2nd PHY */ -+ Our1 |= PCI_Y2_PHY2_COMA; -+ } -+ } -+ else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) { -+ /* enable HW WOL */ -+ SK_OUT16(IoC, B0_CTST, (SK_U16)Y2_HW_WOL_ON); -+ -+ /* enable all clocks */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_3), 0); -+ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord); -+ -+ DWord &= P_ASPM_CONTROL_MSK; -+ /* set all bits to 0 except bits 15..12 */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord); -+ -+ /* set to default value */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5), 0); -+ } -+ -+ /* release PHY from PowerDown/COMA Mode */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), Our1); -+ -+ if (!pAC->GIni.GIAsfEnabled) { -+ -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ /* set Link Control reset */ -+ SK_OUT8(IoC, MR_ADDR(i, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_SET); -+ -+ /* clear Link Control reset */ -+ SK_OUT8(IoC, MR_ADDR(i, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_CLR); -+ } - } -- /* all YU chips work with 78.125 MHz host clock */ -- pAC->GIni.GIHstClkFact = SK_FACT_78; -- -- pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX; /* 215 ms */ - } - #endif /* YUKON */ - -- /* check if 64-bit PCI Slot is present */ -- pAC->GIni.GIPciSlot64 = (SK_BOOL)((CtrlStat & CS_BUS_SLOT_SZ) != 0); -- -- /* check if 66 MHz PCI Clock is active */ -- pAC->GIni.GIPciClock66 = (SK_BOOL)((CtrlStat & CS_BUS_CLOCK) != 0); -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -+ -+#ifndef SK_SLIM -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ /* this is a conventional PCI bus */ -+ pAC->GIni.GIPciBus = SK_PCI_BUS; -+ -+ /* check if 64-bit PCI Slot is present */ -+ pAC->GIni.GIPciSlot64 = (SK_BOOL)((CtrlStat & CS_BUS_SLOT_SZ) != 0); -+ -+ /* check if 66 MHz PCI Clock is active */ -+ pAC->GIni.GIPciClock66 = (SK_BOOL)((CtrlStat & CS_BUS_CLOCK) != 0); -+ } - - /* read PCI HW Revision Id. */ -- SK_IN8(IoC, PCI_C(PCI_REV_ID), &Byte); -+ SK_IN8(IoC, PCI_C(pAC, PCI_REV_ID), &Byte); - pAC->GIni.GIPciHwRev = Byte; - -+ /* read connector type */ -+ SK_IN8(IoC, B2_CONN_TYP, &pAC->GIni.GIConTyp); -+#endif /* !SK_SLIM */ -+ - /* read the PMD type */ - SK_IN8(IoC, B2_PMD_TYP, &Byte); -- pAC->GIni.GICopperType = (SK_U8)(Byte == 'T'); - -- /* read the PHY type */ -+ pAC->GIni.GIPmdTyp = Byte; -+ -+ FiberType = (Byte == 'L' || Byte == 'S' || Byte == 'P'); -+ -+ pAC->GIni.GICopperType = (SK_BOOL)(Byte == 'T' || Byte == '1' || -+ (pAC->GIni.GIYukon2 && !FiberType)); -+ -+ /* read the PHY type (Yukon and Genesis) */ - SK_IN8(IoC, B2_E_1, &Byte); - - Byte &= 0x0f; /* the PHY type is stored in the lower nibble */ - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -- -+ -+ pPrt = &pAC->GIni.GP[i]; -+ -+ /* get the MAC addresses */ -+ for (j = 0; j < 3; j++) { -+ SK_IN16(IoC, B2_MAC_1 + i * 8 + j * 2, &pPrt->PMacAddr[j]); -+ } -+ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { - switch (Byte) { - case SK_PHY_XMAC: -- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_XMAC; -+ pPrt->PhyAddr = PHY_ADDR_XMAC; - break; - case SK_PHY_BCOM: -- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_BCOM; -- pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO | -+ pPrt->PhyAddr = PHY_ADDR_BCOM; -+ pPrt->PMSCap = (SK_U8)(SK_MS_CAP_AUTO | - SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE); - break; - #ifdef OTHER_PHY - case SK_PHY_LONE: -- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_LONE; -+ pPrt->PhyAddr = PHY_ADDR_LONE; - break; - case SK_PHY_NAT: -- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_NAT; -+ pPrt->PhyAddr = PHY_ADDR_NAT; - break; - #endif /* OTHER_PHY */ - default: - /* ERROR: unexpected PHY type detected */ - RetVal = 5; -- break; - } - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -- if (Byte < (SK_U8)SK_PHY_MARV_COPPER) { -+ -+ if (((Byte < (SK_U8)SK_PHY_MARV_COPPER) || pAC->GIni.GIYukon2) && -+ !FiberType) { - /* if this field is not initialized */ - Byte = (SK_U8)SK_PHY_MARV_COPPER; -- -+ - pAC->GIni.GICopperType = SK_TRUE; - } -- -- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_MARV; -- -+ -+ pPrt->PhyAddr = PHY_ADDR_MARV; -+ - if (pAC->GIni.GICopperType) { - -- pAC->GIni.GP[i].PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_AUTO | -- SK_LSPEED_CAP_10MBPS | SK_LSPEED_CAP_100MBPS | -- SK_LSPEED_CAP_1000MBPS); -- -- pAC->GIni.GP[i].PLinkSpeed = (SK_U8)SK_LSPEED_AUTO; -- -- pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO | -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE || -+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC && -+ pAC->GIni.GIChipCap == 2)) { -+ -+ pPrt->PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_100MBPS | -+ SK_LSPEED_CAP_10MBPS); -+ -+ pAC->GIni.GIRamSize = 4; -+ } -+ else { -+ pPrt->PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_1000MBPS | -+ SK_LSPEED_CAP_100MBPS | SK_LSPEED_CAP_10MBPS | -+ SK_LSPEED_CAP_AUTO); -+ } -+ -+ pPrt->PLinkSpeed = (SK_U8)SK_LSPEED_AUTO; -+ -+ pPrt->PMSCap = (SK_U8)(SK_MS_CAP_AUTO | - SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE); - } - else { - Byte = (SK_U8)SK_PHY_MARV_FIBER; - } - } -+ -+ /* clear TWSI IRQ */ -+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); -+ - #endif /* YUKON */ -- -- pAC->GIni.GP[i].PhyType = (int)Byte; -- -+ -+ pPrt->PhyType = (int)Byte; -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -- ("PHY type: %d PHY addr: %04x\n", Byte, -- pAC->GIni.GP[i].PhyAddr)); -+ ("PHY type: %d PHY addr: %04x\n", -+ Byte, pPrt->PhyAddr)); - } -- -+ - /* get MAC Type & set function pointers dependent on */ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - pAC->GIni.GIMacType = SK_MAC_XMAC; - - pAC->GIni.GIFunc.pFnMacUpdateStats = SkXmUpdateStats; - pAC->GIni.GIFunc.pFnMacStatistic = SkXmMacStatistic; - pAC->GIni.GIFunc.pFnMacResetCounter = SkXmResetCounter; - pAC->GIni.GIFunc.pFnMacOverflow = SkXmOverflowStatus; -+#ifdef SK_DIAG -+ pAC->GIni.GIFunc.pFnMacPhyRead = SkXmPhyRead; -+ pAC->GIni.GIFunc.pFnMacPhyWrite = SkXmPhyWrite; -+#else /* SK_DIAG */ -+ pAC->GIni.GIFunc.pSkGeSirqIsr = SkGeYuSirqIsr; -+#endif /* !SK_DIAG */ - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ -+#ifndef SK_SLIM - pAC->GIni.GIMacType = SK_MAC_GMAC; - - pAC->GIni.GIFunc.pFnMacUpdateStats = SkGmUpdateStats; - pAC->GIni.GIFunc.pFnMacStatistic = SkGmMacStatistic; - pAC->GIni.GIFunc.pFnMacResetCounter = SkGmResetCounter; - pAC->GIni.GIFunc.pFnMacOverflow = SkGmOverflowStatus; -+#endif /* !SK_SLIM */ -+ -+#ifdef SK_DIAG -+ pAC->GIni.GIFunc.pFnMacPhyRead = SkGmPhyRead; -+ pAC->GIni.GIFunc.pFnMacPhyWrite = SkGmPhyWrite; -+#else /* SK_DIAG */ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ pAC->GIni.GIFunc.pSkGeSirqIsr = SkYuk2SirqIsr; -+ } -+ else { -+ pAC->GIni.GIFunc.pSkGeSirqIsr = SkGeYuSirqIsr; -+ } -+#endif /* !SK_DIAG */ - - #ifdef SPECIAL_HANDLING - if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { -@@ -1793,7 +2665,13 @@ SK_IOC IoC) /* IO context */ - #endif - } - #endif /* YUKON */ -- -+ -+#ifndef SK_SLIM -+ -+ SkGeSetUpSupFeatures(pAC, IoC); -+ -+#endif /* !SK_SLIM */ -+ - return(RetVal); - } /* SkGeInit1 */ - -@@ -1814,9 +2692,12 @@ SK_IOC IoC) /* IO context */ - * nothing - */ - static void SkGeInit2( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { -+#ifdef YUKON -+ SK_U16 Word; -+#endif /* YUKON */ - #ifdef GENESIS - SK_U32 DWord; - #endif /* GENESIS */ -@@ -1850,13 +2731,13 @@ SK_IOC IoC) /* IO context */ - SkGeInitPktArb(pAC, IoC); - } - #endif /* GENESIS */ -- --#ifdef YUKON -+ -+#ifdef xSK_DIAG - if (pAC->GIni.GIYukon) { - /* start Time Stamp Timer */ - SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8)GMT_ST_START); - } --#endif /* YUKON */ -+#endif /* SK_DIAG */ - - /* enable the Tx Arbiters */ - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -@@ -1866,8 +2747,34 @@ SK_IOC IoC) /* IO context */ - /* enable the RAM Interface Arbiter */ - SkGeInitRamIface(pAC, IoC); - -+#ifdef YUKON -+ if (CHIP_ID_YUKON_2(pAC)) { -+ -+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) { -+ -+ SK_IN16(IoC, PCI_C(pAC, PEX_DEV_CTRL), &Word); -+ -+ /* change Max. Read Request Size to 2048 bytes */ -+ Word &= ~PEX_DC_MAX_RRS_MSK; -+ Word |= PEX_DC_MAX_RD_RQ_SIZE(4); -+ -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -+ -+ SK_OUT16(IoC, PCI_C(pAC, PEX_DEV_CTRL), Word); -+ -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -+ } -+ -+ /* -+ * Writing the HW Error Mask Reg. will not generate an IRQ -+ * as long as the B0_IMSK is not set by the driver. -+ */ -+ SK_OUT32(IoC, B0_HWE_IMSK, pAC->GIni.GIValHwIrqMask); -+ } -+#endif /* YUKON */ - } /* SkGeInit2 */ - -+ - /****************************************************************************** - * - * SkGeInit() - Initialize the GE Adapter with the specified level. -@@ -1889,7 +2796,7 @@ SK_IOC IoC) /* IO context */ - * if Number of MACs > SK_MAX_MACS - * - * After returning from Level 0 the adapter -- * may be accessed with IO operations. -+ * may be accessed with I/O operations. - * - * Level 2: start the Blink Source Counter - * -@@ -1898,14 +2805,14 @@ SK_IOC IoC) /* IO context */ - * 1: Number of MACs exceeds SK_MAX_MACS (after level 1) - * 2: Adapter not present or not accessible - * 3: Illegal initialization level -- * 4: Initialization Level 1 Call missing -+ * 4: Initialization level 1 call missing - * 5: Unexpected PHY type detected - * 6: HW self test failed - */ - int SkGeInit( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ --int Level) /* initialization level */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int Level) /* Initialization Level */ - { - int RetVal; /* return value */ - SK_U32 DWord; -@@ -1920,7 +2827,7 @@ int Level) /* initialization level */ - SkGeInit0(pAC, IoC); - pAC->GIni.GILevel = SK_INIT_DATA; - break; -- -+ - case SK_INIT_IO: - /* Initialization Level 1 */ - RetVal = SkGeInit1(pAC, IoC); -@@ -1932,22 +2839,24 @@ int Level) /* initialization level */ - SK_OUT32(IoC, B2_IRQM_INI, SK_TEST_VAL); - SK_IN32(IoC, B2_IRQM_INI, &DWord); - SK_OUT32(IoC, B2_IRQM_INI, 0L); -- -+ - if (DWord != SK_TEST_VAL) { - RetVal = 2; - break; - } - -+#ifdef DEBUG - /* check if the number of GIMacsFound matches SK_MAX_MACS */ - if (pAC->GIni.GIMacsFound > SK_MAX_MACS) { - RetVal = 1; - break; - } -+#endif /* DEBUG */ - - /* Level 1 successfully passed */ - pAC->GIni.GILevel = SK_INIT_IO; - break; -- -+ - case SK_INIT_RUN: - /* Initialization Level 2 */ - if (pAC->GIni.GILevel != SK_INIT_IO) { -@@ -1957,12 +2866,13 @@ int Level) /* initialization level */ - RetVal = 4; - break; - } -+ - SkGeInit2(pAC, IoC); - - /* Level 2 successfully passed */ - pAC->GIni.GILevel = SK_INIT_RUN; - break; -- -+ - default: - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E003, SKERR_HWI_E003MSG); - RetVal = 3; -@@ -1985,77 +2895,82 @@ int Level) /* initialization level */ - * nothing - */ - void SkGeDeInit( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC) /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ - { - int i; - SK_U16 Word; - --#ifdef SK_PHY_LP_MODE -- SK_U8 Byte; -+#ifdef SK_PHY_LP_MODE_DEEP_SLEEP - SK_U16 PmCtlSts; --#endif /* SK_PHY_LP_MODE */ -+#endif - - #if (!defined(SK_SLIM) && !defined(VCPU)) - /* ensure I2C is ready */ - SkI2cWaitIrq(pAC, IoC); --#endif -- -- /* stop all current transfer activity */ -- for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -- if (pAC->GIni.GP[i].PState != SK_PRT_STOP && -- pAC->GIni.GP[i].PState != SK_PRT_RESET) { -- -- SkGeStopPort(pAC, IoC, i, SK_STOP_ALL, SK_HARD_RST); -- } -- } -+#endif - --#ifdef SK_PHY_LP_MODE -- /* -+#ifdef SK_PHY_LP_MODE_DEEP_SLEEP -+ /* - * for power saving purposes within mobile environments -- * we set the PHY to coma mode and switch to D3 power state. -+ * we set the PHY to coma mode. - */ -- if (pAC->GIni.GIYukonLite && -- pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) { -+#ifdef XXX -+ if (pAC->GIni.GIVauxAvail) { -+ /* switch power to VAUX */ -+ SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA | -+ PC_VAUX_ON | PC_VCC_OFF)); -+ } -+#endif /* XXX */ -+ -+ if (CHIP_ID_YUKON_2(pAC) && /* pAC->GIni.GIMacsFound == 1 && */ -+ !pAC->GIni.GIAsfEnabled -+#ifdef XXX -+ || (pAC->GIni.GIYukonLite && pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) -+#endif /* XXX */ -+ ) { -+ -+ /* flag for SkGmEnterLowPowerMode() that the call was from here */ -+ pAC->GIni.GILevel = SK_INIT_IO; - - /* for all ports switch PHY to coma mode */ - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -- -- SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP); -- } -- -- if (pAC->GIni.GIVauxAvail) { -- /* switch power to VAUX */ -- Byte = PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF; - -- SK_OUT8(IoC, B0_POWER_CTRL, Byte); -+ (void)SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP); - } -- -- /* switch to D3 state */ -- SK_IN16(IoC, PCI_C(PCI_PM_CTL_STS), &PmCtlSts); -- -- PmCtlSts |= PCI_PM_STATE_D3; -+ } -+#else /* !SK_PHY_LP_MODE_DEEP_SLEEP */ - -- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -+ if (!pAC->GIni.GIAsfEnabled) { -+ /* stop all current transfer activity */ -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ if (pAC->GIni.GP[i].PState != SK_PRT_STOP && -+ pAC->GIni.GP[i].PState != SK_PRT_RESET) { - -- SK_OUT16(IoC, PCI_C(PCI_PM_CTL_STS), PmCtlSts); -+ SkGeStopPort(pAC, IoC, i, SK_STOP_ALL, SK_HARD_RST); -+ } -+ } - } --#endif /* SK_PHY_LP_MODE */ - -- /* Reset all bits in the PCI STATUS register */ -+ /* reset all bits in the PCI STATUS register */ - /* - * Note: PCI Cfg cycles cannot be used, because they are not - * available on some platforms after 'boot time'. - */ -- SK_IN16(IoC, PCI_C(PCI_STATUS), &Word); -- -+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word); -+ - SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -- SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); -+ -+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), Word | (SK_U16)PCI_ERRBITS); -+ - SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); - -- /* do the reset, all LEDs are switched off now */ -- SK_OUT8(IoC, B0_CTST, CS_RST_SET); -- -+ if (!pAC->GIni.GIAsfEnabled) { -+ /* set the SW-reset */ -+ SK_OUT8(IoC, B0_CTST, CS_RST_SET); -+ } -+#endif /* !SK_PHY_LP_MODE_DEEP_SLEEP */ -+ - pAC->GIni.GILevel = SK_INIT_DATA; - } /* SkGeDeInit */ - -@@ -2089,8 +3004,8 @@ SK_IOC IoC) /* IO context */ - * 2: The port has to be stopped before it can be initialized again. - */ - int SkGeInitPort( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port to configure */ - { - SK_GEPORT *pPrt; -@@ -2101,8 +3016,8 @@ int Port) /* Port to configure */ - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E004, SKERR_HWI_E004MSG); - return(1); - } -- -- if (pPrt->PState == SK_PRT_INIT || pPrt->PState == SK_PRT_RUN) { -+ -+ if (pPrt->PState >= SK_PRT_INIT) { - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E005, SKERR_HWI_E005MSG); - return(2); - } -@@ -2119,29 +3034,29 @@ int Port) /* Port to configure */ - SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_ENA); - SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_ENA); - /* The Link LED is initialized by RLMT or Diagnostics itself */ -- -+ - SkXmInitMac(pAC, IoC, Port); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - - SkGmInitMac(pAC, IoC, Port); - } - #endif /* YUKON */ -- -+ - /* do NOT initialize the Link Sync Counter */ - - SkGeInitMacFifo(pAC, IoC, Port); -- -+ - SkGeInitRamBufs(pAC, IoC, Port); -- -+ - if (pPrt->PXSQSize != 0) { - /* enable Force Sync bit if synchronous queue available */ - SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), TXA_ENA_FSYNC); - } -- -+ - SkGeInitBmu(pAC, IoC, Port); - - /* mark port as initialized */ -@@ -2149,3 +3064,192 @@ int Port) /* Port to configure */ - - return(0); - } /* SkGeInitPort */ -+ -+ -+#if (defined(YUK2) && !defined(SK_SLIM)) -+/****************************************************************************** -+ * -+ * SkGeRamWrite() - Writes One quadword to RAM -+ * -+ * Returns: -+ * 0 -+ */ -+static void SkGeRamWrite( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_U32 Addr, /* Address to be written to (in quadwords) */ -+SK_U32 LowDword, /* Lower Dword to be written */ -+SK_U32 HighDword, /* Upper Dword to be written */ -+int Port) /* Select RAM buffer (Yukon-2 has 2 RAM buffers) */ -+{ -+ SK_OUT32(IoC, SELECT_RAM_BUFFER(Port, B3_RAM_ADDR), Addr); -+ -+ /* Write Access is initiated by writing the upper Dword */ -+ SK_OUT32(IoC, SELECT_RAM_BUFFER(Port, B3_RAM_DATA_LO), LowDword); -+ SK_OUT32(IoC, SELECT_RAM_BUFFER(Port, B3_RAM_DATA_HI), HighDword); -+} -+ -+/****************************************************************************** -+ * -+ * SkYuk2RestartRxBmu() - Restart Receive BMU on Yukon-2 -+ * -+ * return: -+ * 0 o.k. -+ * 1 timeout -+ */ -+int SkYuk2RestartRxBmu( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int Port) /* Port Index (MAC_1 + n) */ -+{ -+ SK_U16 Word; -+ SK_U16 MacCtrl; -+ SK_U16 RxCtrl; -+ SK_U16 FlushMask; -+ SK_U16 FlushTrsh; -+ SK_U32 RamAdr; -+ SK_U32 StartTime; -+ SK_U32 CurrTime; -+ SK_U32 Delta; -+ SK_U32 TimeOut; -+ SK_GEPORT *pPrt; /* GIni Port struct pointer */ -+ int Rtv; -+ -+ Rtv = 0; -+ -+ pPrt = &pAC->GIni.GP[Port]; -+ -+/* -+ 1. save Rx MAC FIFO Flush Mask and Rx MAC FIFO Flush Threshold -+ 2. save GMAC Rx Control Register -+ 3. re-initialize MAC Rx FIFO, Rx RAM Buffer Queue, PCI Rx FIFO, -+ Rx BMU and Rx Prefetch Unit of the link. -+ 4. set Rx MAC FIFO Flush Mask to 0xffff -+ set Rx MAC FIFO Flush Threshold to a high value, e.g. 0x20 -+ 5. set GMAC to loopback mode and switch GMAC back to Rx/Tx enable -+ 6. clear Rx/Tx Frame Complete IRQ in Rx/T MAC FIFO Control Register -+ 7. send one packet with a size of 64bytes (size below flush threshold) -+ from TXA RAM Buffer Queue to set the rx_sop flop: -+ - set TxAQ Write Pointer to (packet size in qwords + 2) -+ - set TxAQ Level to (packet size in qwords + 2) -+ - write Internal Status Word 1 and 2 to TxAQ RAM Buffer Queue QWord 0,1 -+ according to figure 61 on page 330 of Yukon-2 Spec. -+ - write MAC header with Destination Address = own MAC address to -+ TxAQ RAM Buffer Queue QWords 2 and 3 -+ - set TxAQ Packet Counter to 1 -> packet is transmitted immediately -+ 8. poll GMAC IRQ Source Register for IRQ Rx/Tx Frame Complete -+ 9. restore GMAC Rx Control Register -+10. restore Rx MAC FIFO Flush Mask and Rx MAC FIFO Flush Threshold -+11. set GMAC back to GMII mode -+*/ -+ -+ /* save Rx GMAC FIFO Flush Mask */ -+ SK_IN16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), &FlushMask); -+ -+ /* save Rx GMAC FIFO Flush Threshold */ -+ SK_IN16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), &FlushTrsh); -+ -+ /* save GMAC Rx Control Register */ -+ GM_IN16(IoC, Port, GM_RX_CTRL, &RxCtrl); -+ -+ /* configure the GMAC FIFOs */ -+ SkGeInitMacFifo(pAC, IoC, Port); -+ -+ SkGeInitRamBufs(pAC, IoC, Port); -+ -+ SkGeInitBmu(pAC, IoC, Port); -+ -+ /* configure Rx GMAC FIFO */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), GMF_RX_CTRL_DEF); -+ -+ /* set Rx GMAC FIFO Flush Mask */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), 0xffff); -+ -+ /* set Rx GMAC FIFO Flush Threshold */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), 0x20); -+ -+ /* set to promiscuous mode */ -+ Word = RxCtrl & ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); -+ -+ /* set GMAC Rx Control Register */ -+ GM_OUT16(IoC, Port, GM_RX_CTRL, Word); -+ -+ /* get General Purpose Control */ -+ GM_IN16(IoC, Port, GM_GP_CTRL, &MacCtrl); -+ -+ /* enable MAC Loopback Mode*/ -+ GM_OUT16(IoC, Port, GM_GP_CTRL, MacCtrl | GM_GPCR_LOOP_ENA); -+ -+ /* enable MAC Loopback Mode and Rx/Tx */ -+ GM_OUT16(IoC, Port, GM_GP_CTRL, MacCtrl | GM_GPCR_LOOP_ENA | -+ GM_GPCR_RX_ENA | GM_GPCR_TX_ENA); -+ -+ /* clear GMAC IRQ Rx Frame Complete */ -+ SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_CLI_RX_FC); -+ -+ /* clear GMAC IRQ Tx Frame Complete */ -+ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_CLI_TX_FC); -+ -+ /* send one packet with a size of 64bytes from RAM buffer*/ -+ -+ RamAdr = pPrt->PXaQRamStart / 8; -+ -+ SK_OUT32(IoC, RB_ADDR(pPrt->PXaQOff, RB_WP), RamAdr + 10); -+ -+ SK_OUT32(IoC, RB_ADDR(pPrt->PXaQOff, RB_LEV), 10); -+ -+ /* write 1st status quad word (packet end address in RAM, packet length */ -+ SkGeRamWrite(pAC, IoC, RamAdr, (RamAdr + 9) << 16, 64, Port); -+ -+ /* write 2nd status quad word */ -+ SkGeRamWrite(pAC, IoC, RamAdr + 1, 0, 0, Port); -+ -+ /* write DA to MAC header */ -+ SkGeRamWrite(pAC, IoC, RamAdr + 2, *(SK_U32 *)&pPrt->PMacAddr[0], -+ *(SK_U32 *)&pPrt->PMacAddr[2], Port); -+ -+ SK_OUT32(IoC, RB_ADDR(pPrt->PXaQOff, RB_PC), 1); -+ -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &StartTime); -+ -+ /* set timeout to 10 ms */ -+ TimeOut = HW_MS_TO_TICKS(pAC, 10); -+ -+ do { -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime); -+ -+ if (CurrTime >= StartTime) { -+ Delta = CurrTime - StartTime; -+ } -+ else { -+ Delta = CurrTime + ~StartTime + 1; -+ } -+ -+ if (Delta > TimeOut) { -+ Rtv = 1; -+ break; -+ } -+ -+ /* read the GMAC Interrupt source register */ -+ SK_IN16(IoC, MR_ADDR(Port, GMAC_IRQ_SRC), &Word); -+ -+ } while ((Word & (GM_IS_TX_COMPL | GM_IS_RX_COMPL)) != -+ (GM_IS_TX_COMPL | GM_IS_RX_COMPL)); -+ -+ /* disable MAC Loopback Mode and Rx/Tx */ -+ GM_OUT16(IoC, Port, GM_GP_CTRL, MacCtrl); -+ -+ /* restore GMAC Rx Control Register */ -+ GM_OUT16(IoC, Port, GM_RX_CTRL, RxCtrl); -+ -+ /* restore Rx GMAC FIFO Flush Mask */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), FlushMask); -+ -+ /* restore Rx GMAC FIFO Flush Threshold */ -+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), FlushTrsh); -+ -+ return(Rtv); -+ -+} /* SkYuk2RestartRxBmu */ -+#endif /* YUK2 && !SK_SLIM */ -+ ---- ./drivers/net/sk98lin/skgemib.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skgemib.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skgemib.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.11 $ -- * Date: $Date: 2003/09/15 13:38:12 $ -+ * Version: $Revision: 2.7 $ -+ * Date: $Date: 2004/10/26 12:42:18 $ - * Purpose: Private Network Management Interface Management Database - * - ****************************************************************************/ -@@ -251,6 +251,183 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTa - 0, - SK_PNMI_RW, DiagActions, 0}, - #endif /* SK_DIAG_SUPPORT */ -+#ifdef SK_ASF -+ {OID_SKGE_ASF, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_STORE_CONFIG, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_ENA, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_RETRANS, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_RETRANS_INT, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_HB_ENA, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_HB_INT, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_WD_ENA, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_WD_TIME, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_IP_SOURCE, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_MAC_SOURCE, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_IP_DEST, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_MAC_DEST, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_COMMUNITY_NAME, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_RSP_ENA, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_RETRANS_COUNT_MIN, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_RETRANS_COUNT_MAX, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_RETRANS_INT_MIN, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_RETRANS_INT_MAX, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_HB_INT_MIN, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_HB_INT_MAX, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_WD_TIME_MIN, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_WD_TIME_MAX, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_HB_CAP, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_WD_TIMER_RES, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_GUID, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_KEY_OP, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_KEY_ADM, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_KEY_GEN, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_CAP, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_PAR_1, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_OVERALL_OID, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RW, Asf, 0}, -+ {OID_SKGE_ASF_FWVER_OID, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RO, Asf, 0}, -+ {OID_SKGE_ASF_ACPI_OID, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RO, Asf, 0}, -+ {OID_SKGE_ASF_SMBUS_OID, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RO, Asf, 0}, -+#endif /* SK_ASF */ - {OID_SKGE_MDB_VERSION, - 1, - 0, -@@ -1073,6 +1250,11 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTa - 0, - 0, - SK_PNMI_RO, Vct, 0}, -+ {OID_SKGE_VCT_CAPABILITIES, -+ 0, -+ 0, -+ 0, -+ SK_PNMI_RO, Vct, 0}, - {OID_SKGE_BOARDLEVEL, - 0, - 0, ---- ./drivers/net/sk98lin/skgepnmi.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skgepnmi.c 2006-04-04 13:13:34.000000000 +0400 -@@ -1,9 +1,9 @@ - /***************************************************************************** - * - * Name: skgepnmi.c -- * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.111 $ -- * Date: $Date: 2003/09/15 13:35:35 $ -+ * Project: Gigabit Ethernet Adapters, PNMI-Module -+ * Version: $Revision: 2.24 $ -+ * Date: $Date: 2005/10/21 09:54:35 $ - * Purpose: Private Network Management Interface - * - ****************************************************************************/ -@@ -22,11 +22,10 @@ - * - ******************************************************************************/ - -- --#ifndef _lint -+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: skgepnmi.c,v 1.111 2003/09/15 13:35:35 tschilli Exp $ (C) Marvell."; --#endif /* !_lint */ -+ "@(#) $Id: skgepnmi.c,v 2.24 2005/10/21 09:54:35 mkunz Exp $ (C) Marvell."; -+#endif - - #include "h/skdrv1st.h" - #include "h/sktypes.h" -@@ -38,12 +37,14 @@ static const char SysKonnectFileId[] = - #include "h/skcsum.h" - #include "h/skvpd.h" - #include "h/skgehw.h" -+#include "h/sky2le.h" - #include "h/skgeinit.h" - #include "h/skdrv2nd.h" - #include "h/skgepnm2.h" - #ifdef SK_POWER_MGMT - #include "h/skgepmgt.h" --#endif -+#endif /* SK_POWER_MGMT */ -+ - /* defines *******************************************************************/ - - #ifndef DEBUG -@@ -72,7 +73,6 @@ int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, - int SkPnmiGenIoctl(SK_AC *pAC, SK_IOC IoC, void * pBuf, - unsigned int * pLen, SK_U32 NetIndex); - -- - /* - * Private Function prototypes - */ -@@ -112,6 +112,12 @@ PNMI_STATIC void VirtualConf(SK_AC *pAC, - PNMI_STATIC int Vct(SK_AC *pAC, SK_IOC IoC, int Action, SK_U32 Id, char *pBuf, - unsigned int *pLen, SK_U32 Instance, unsigned int TableIndex, SK_U32 NetIndex); - PNMI_STATIC void CheckVctStatus(SK_AC *, SK_IOC, char *, SK_U32, SK_U32); -+PNMI_STATIC void VctGetResults(SK_AC *, SK_IOC, SK_U32); -+#ifdef SK_ASF -+PNMI_STATIC int Asf(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id, -+ char *pBuf, unsigned int *pLen, SK_U32 Instance, -+ unsigned int TableIndex, SK_U32 NetIndex); -+#endif /* SK_ASF */ - - /* - * Table to correlate OID with handler function and index to -@@ -353,17 +359,13 @@ PNMI_STATIC const SK_PNMI_STATADDR StatA - * Always 0 - */ - int SkPnmiInit( --SK_AC *pAC, /* Pointer to adapter context */ --SK_IOC IoC, /* IO context handle */ --int Level) /* Initialization level */ -+SK_AC *pAC, /* Pointer to adapter context */ -+SK_IOC IoC, /* IO context handle */ -+int Level) /* Initialization level */ - { - unsigned int PortMax; /* Number of ports */ - unsigned int PortIndex; /* Current port index in loop */ -- SK_U16 Val16; /* Multiple purpose 16 bit variable */ -- SK_U8 Val8; /* Mulitple purpose 8 bit variable */ -- SK_EVPARA EventParam; /* Event struct for timer event */ -- SK_PNMI_VCT *pVctBackupData; -- -+ SK_EVPARA EventParam; /* Event struct for timer event */ - - SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, - ("PNMI: SkPnmiInit: Called, level=%d\n", Level)); -@@ -372,13 +374,19 @@ int Level) /* Initialization level */ - - case SK_INIT_DATA: - SK_MEMSET((char *)&pAC->Pnmi, 0, sizeof(pAC->Pnmi)); -+ - pAC->Pnmi.TrapBufFree = SK_PNMI_TRAP_QUEUE_LEN; - pAC->Pnmi.StartUpTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC)); - pAC->Pnmi.RlmtChangeThreshold = SK_PNMI_DEF_RLMT_CHG_THRES; -+ - for (PortIndex = 0; PortIndex < SK_MAX_MACS; PortIndex ++) { - - pAC->Pnmi.Port[PortIndex].ActiveFlag = SK_FALSE; - pAC->Pnmi.DualNetActiveFlag = SK_FALSE; -+ -+ /* Initialize DSP variables for Vct() to 0xff => Never written! */ -+ pAC->GIni.GP[PortIndex].PCableLen = 0xff; -+ pAC->Pnmi.VctBackup[PortIndex].CableLen = 0xff; - } - - #ifdef SK_PNMI_CHECK -@@ -408,51 +416,36 @@ int Level) /* Initialization level */ - break; - - case SK_INIT_IO: -- /* -- * Reset MAC counters -- */ -+ -+ /* Reset MAC counters. */ - PortMax = pAC->GIni.GIMacsFound; - - for (PortIndex = 0; PortIndex < PortMax; PortIndex ++) { - - pAC->GIni.GIFunc.pFnMacResetCounter(pAC, IoC, PortIndex); - } -- -- /* Initialize DSP variables for Vct() to 0xff => Never written! */ -- for (PortIndex = 0; PortIndex < PortMax; PortIndex ++) { -- pAC->GIni.GP[PortIndex].PCableLen = 0xff; -- pVctBackupData = &pAC->Pnmi.VctBackup[PortIndex]; -- pVctBackupData->PCableLen = 0xff; -- } -- -- /* -- * Get pci bus speed -- */ -- SK_IN16(IoC, B0_CTST, &Val16); -- if ((Val16 & CS_BUS_CLOCK) == 0) { - -- pAC->Pnmi.PciBusSpeed = 33; -+ /* Get PCI bus speed. */ -+ if (pAC->GIni.GIPciClock66) { -+ -+ pAC->Pnmi.PciBusSpeed = 66; - } - else { -- pAC->Pnmi.PciBusSpeed = 66; -+ pAC->Pnmi.PciBusSpeed = 33; - } - -- /* -- * Get pci bus width -- */ -- SK_IN16(IoC, B0_CTST, &Val16); -- if ((Val16 & CS_BUS_SLOT_SZ) == 0) { -+ /* Get PCI bus width. */ -+ if (pAC->GIni.GIPciSlot64) { - -- pAC->Pnmi.PciBusWidth = 32; -+ pAC->Pnmi.PciBusWidth = 64; - } - else { -- pAC->Pnmi.PciBusWidth = 64; -+ pAC->Pnmi.PciBusWidth = 32; - } - -- /* -- * Get chipset -- */ -+ /* Get chipset. */ - switch (pAC->GIni.GIChipId) { -+ - case CHIP_ID_GENESIS: - pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_XMAC; - break; -@@ -461,57 +454,51 @@ int Level) /* Initialization level */ - pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON; - break; - -+ case CHIP_ID_YUKON_LITE: -+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_LITE; -+ break; -+ -+ case CHIP_ID_YUKON_LP: -+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_LP; -+ break; -+ -+ case CHIP_ID_YUKON_XL: -+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_XL; -+ break; -+ -+ case CHIP_ID_YUKON_EC: -+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_EC; -+ break; -+ -+ case CHIP_ID_YUKON_FE: -+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_FE; -+ break; -+ - default: - break; - } - -- /* -- * Get PMD and DeviceType -- */ -- SK_IN8(IoC, B2_PMD_TYP, &Val8); -- switch (Val8) { -+ /* Get PMD and Device Type. */ -+ switch (pAC->GIni.GIPmdTyp) { -+ - case 'S': - pAC->Pnmi.PMD = 3; -- if (pAC->GIni.GIMacsFound > 1) { -- -- pAC->Pnmi.DeviceType = 0x00020002; -- } -- else { -- pAC->Pnmi.DeviceType = 0x00020001; -- } -+ pAC->Pnmi.DeviceType = 0x00020001; - break; - - case 'L': - pAC->Pnmi.PMD = 2; -- if (pAC->GIni.GIMacsFound > 1) { -- -- pAC->Pnmi.DeviceType = 0x00020004; -- } -- else { -- pAC->Pnmi.DeviceType = 0x00020003; -- } -+ pAC->Pnmi.DeviceType = 0x00020003; - break; - - case 'C': - pAC->Pnmi.PMD = 4; -- if (pAC->GIni.GIMacsFound > 1) { -- -- pAC->Pnmi.DeviceType = 0x00020006; -- } -- else { -- pAC->Pnmi.DeviceType = 0x00020005; -- } -+ pAC->Pnmi.DeviceType = 0x00020005; - break; - - case 'T': - pAC->Pnmi.PMD = 5; -- if (pAC->GIni.GIMacsFound > 1) { -- -- pAC->Pnmi.DeviceType = 0x00020008; -- } -- else { -- pAC->Pnmi.DeviceType = 0x00020007; -- } -+ pAC->Pnmi.DeviceType = 0x00020007; - break; - - default : -@@ -520,11 +507,14 @@ int Level) /* Initialization level */ - break; - } - -- /* -- * Get connector -- */ -- SK_IN8(IoC, B2_CONN_TYP, &Val8); -- switch (Val8) { -+ if (pAC->GIni.GIMacsFound > 1) { -+ -+ pAC->Pnmi.DeviceType++; -+ } -+ -+ /* Get connector type. */ -+ switch (pAC->GIni.GIConTyp) { -+ - case 'C': - pAC->Pnmi.Connector = 2; - break; -@@ -552,17 +542,17 @@ int Level) /* Initialization level */ - break; - - case SK_INIT_RUN: -- /* -- * Start timer for RLMT change counter -- */ -+ -+ /* Start timer for RLMT change counter. */ - SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); -+ - SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer, -- 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER, -+ SK_PNMI_EVT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER, - EventParam); - break; - - default: -- break; /* Nothing todo */ -+ break; /* Nothing to do. */ - } - - return (0); -@@ -642,7 +632,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - ("PNMI: SkPnmiPreSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n", - Id, *pLen, Instance, NetIndex)); - -- - return (PnmiVar(pAC, IoC, SK_PNMI_PRESET, Id, (char *)pBuf, pLen, - Instance, NetIndex)); - } -@@ -724,7 +713,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - unsigned int TmpLen; - char KeyArr[SK_PNMI_VPD_ENTRIES][SK_PNMI_VPD_KEY_SIZE]; - -- - SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, - ("PNMI: SkPnmiGetStruct: Called, BufLen=%d, NetIndex=%d\n", - *pLen, NetIndex)); -@@ -733,22 +721,19 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) { - -- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT, -- (SK_U32)(-1)); -+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT, (SK_U32)(-1)); - } - - *pLen = SK_PNMI_STRUCT_SIZE; - return (SK_PNMI_ERR_TOO_SHORT); - } - -- /* -- * Check NetIndex -- */ -+ /* Check NetIndex. */ - if (NetIndex >= pAC->Rlmt.NumNets) { - return (SK_PNMI_ERR_UNKNOWN_NET); - } - -- /* Update statistic */ -+ /* Update statistics. */ - SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On call"); - - if ((Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1)) != -@@ -773,35 +758,37 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (Ret); - } - -- /* -- * Increment semaphores to indicate that an update was -- * already done -- */ -+ /* Increment semaphores to indicate that an update was already done. */ - pAC->Pnmi.MacUpdatedFlag ++; - pAC->Pnmi.RlmtUpdatedFlag ++; - pAC->Pnmi.SirqUpdatedFlag ++; - -- /* Get vpd keys for instance calculation */ -- Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &TmpLen); -- if (Ret != SK_PNMI_ERR_OK) { -+ /* -+ * Get VPD keys for instance calculation. -+ * Please read comment in Vpd(). -+ */ -+ if (pAC->Pnmi.VpdKeyReadError == SK_FALSE) { -+ Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &TmpLen); -+ if (Ret != SK_PNMI_ERR_OK) { - -- pAC->Pnmi.MacUpdatedFlag --; -- pAC->Pnmi.RlmtUpdatedFlag --; -- pAC->Pnmi.SirqUpdatedFlag --; -+ pAC->Pnmi.MacUpdatedFlag --; -+ pAC->Pnmi.RlmtUpdatedFlag --; -+ pAC->Pnmi.SirqUpdatedFlag --; - -- SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return"); -- SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1)); -- *pLen = SK_PNMI_MIN_STRUCT_SIZE; -- return (SK_PNMI_ERR_GENERAL); -+ SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return"); -+ SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1)); -+ *pLen = SK_PNMI_MIN_STRUCT_SIZE; -+ return (SK_PNMI_ERR_GENERAL); -+ } - } - -- /* Retrieve values */ -+ /* Retrieve values. */ - SK_MEMSET((char *)pBuf, 0, SK_PNMI_STRUCT_SIZE); -+ - for (TableIndex = 0; TableIndex < ID_TABLE_SIZE; TableIndex ++) { - - InstanceNo = IdTable[TableIndex].InstanceNo; -- for (InstanceCnt = 1; InstanceCnt <= InstanceNo; -- InstanceCnt ++) { -+ for (InstanceCnt = 1; InstanceCnt <= InstanceNo; InstanceCnt ++) { - - DstOffset = IdTable[TableIndex].Offset + - (InstanceCnt - 1) * -@@ -998,7 +985,6 @@ SK_EVPARA Param) /* Event dependent para - unsigned int PhysPortIndex; - unsigned int MaxNetNumber; - int CounterIndex; -- int Ret; - SK_U16 MacStatus; - SK_U64 OverflowStatus; - SK_U64 Mask; -@@ -1012,12 +998,7 @@ SK_EVPARA Param) /* Event dependent para - SK_U64 Delta; - SK_PNMI_ESTIMATE *pEst; - SK_U32 NetIndex; -- SK_GEPORT *pPrt; -- SK_PNMI_VCT *pVctBackupData; - SK_U32 RetCode; -- int i; -- SK_U32 CableLength; -- - - #ifdef DEBUG - if (Event != SK_PNMI_EVT_XMAC_RESET) { -@@ -1048,9 +1029,7 @@ SK_EVPARA Param) /* Event dependent para - #endif /* DEBUG */ - OverflowStatus = 0; - -- /* -- * Check which source caused an overflow interrupt. -- */ -+ /* Check which source caused an overflow interrupt. */ - if ((pAC->GIni.GIFunc.pFnMacOverflow(pAC, IoC, PhysPortIndex, - MacStatus, &OverflowStatus) != 0) || - (OverflowStatus == 0)) { -@@ -1068,7 +1047,6 @@ SK_EVPARA Param) /* Event dependent para - - Mask = (SK_U64)1 << CounterIndex; - if ((OverflowStatus & Mask) == 0) { -- - continue; - } - -@@ -1100,9 +1078,7 @@ SK_EVPARA Param) /* Event dependent para - case SK_PNMI_HRX_IRLENGTH: - case SK_PNMI_HRX_RESERVED: - -- /* -- * the following counters aren't be handled (id > 63) -- */ -+ /* The following counters aren't be handled (id > 63). */ - case SK_PNMI_HTX_SYNC: - case SK_PNMI_HTX_SYNC_OCTET: - break; -@@ -1189,7 +1165,7 @@ SK_EVPARA Param) /* Event dependent para - if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) { - - SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_ERR_UPP parameter wrong, SensorIndex=%d\n", -+ ("PNMI: ERR: SK_PNMI_EVT_SEN_ERR_UPP parameter wrong, SensorIndex=%d\n", - (unsigned int)Param.Para64)); - return (0); - } -@@ -1208,16 +1184,14 @@ SK_EVPARA Param) /* Event dependent para - case SK_PNMI_EVT_CHG_EST_TIMER: - /* - * Calculate port switch average on a per hour basis -- * Time interval for check : 28125 ms -+ * Time interval for check : 28125 ms (SK_PNMI_EVT_TIMER_CHECK) - * Number of values for average : 8 - * - * Be careful in changing these values, on change check - * - typedef of SK_PNMI_ESTIMATE (Size of EstValue - * array one less than value number) - * - Timer initialization SkTimerStart() in SkPnmiInit -- * - Delta value below must be multiplicated with -- * power of 2 -- * -+ * - Delta value below must be multiplicated with power of 2 - */ - pEst = &pAC->Pnmi.RlmtChangeEstimate; - CounterIndex = pEst->EstValueIndex + 1; -@@ -1240,7 +1214,7 @@ SK_EVPARA Param) /* Event dependent para - Delta = NewestValue - OldestValue; - } - else { -- /* Overflow situation */ -+ /* Overflow situation. */ - Delta = (SK_U64)(0 - OldestValue) + NewestValue; - } - -@@ -1266,8 +1240,9 @@ SK_EVPARA Param) /* Event dependent para - } - - SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); -+ - SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer, -- 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER, -+ SK_PNMI_EVT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER, - EventParam); - break; - -@@ -1311,29 +1286,25 @@ SK_EVPARA Param) /* Event dependent para - (unsigned int)Param.Para64)); - return (0); - } --#endif -+#endif /* DEBUG */ -+ - PhysPortIndex = (unsigned int)Param.Para64; - -- /* -- * Update XMAC statistic to get fresh values -- */ -- Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1); -- if (Ret != SK_PNMI_ERR_OK) { -+ /* Update XMAC statistic to get fresh values. */ -+ if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) != -+ SK_PNMI_ERR_OK) { - - SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return"); - return (0); - } -- /* -- * Increment semaphore to indicate that an update was -- * already done -- */ -+ -+ /* Increment semaphore to indicate that an update was already done. */ - pAC->Pnmi.MacUpdatedFlag ++; - - for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX; - CounterIndex ++) { - - if (!StatAddr[CounterIndex][MacType].GetOffset) { -- - continue; - } - -@@ -1366,14 +1337,15 @@ SK_EVPARA Param) /* Event dependent para - QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_UP, PhysPortIndex); - (void)SK_DRIVER_SENDEVENT(pAC, IoC); - -- /* Bugfix for XMAC errata (#10620)*/ -+ /* Bugfix for XMAC errata (#10620). */ - if (MacType == SK_MAC_XMAC) { -- /* Add incremental difference to offset (#10620)*/ -+ /* Add incremental difference to offset (#10620). */ - (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex, - XM_RXE_SHT_ERR, &Val32); - - Value = (((SK_U64)pAC->Pnmi.Port[PhysPortIndex]. - CounterHigh[SK_PNMI_HRX_SHORTS] << 32) | (SK_U64)Val32); -+ - pAC->Pnmi.Port[PhysPortIndex].CounterOffset[SK_PNMI_HRX_SHORTS] += - Value - pAC->Pnmi.Port[PhysPortIndex].RxShortZeroMark; - } -@@ -1403,7 +1375,7 @@ SK_EVPARA Param) /* Event dependent para - QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_DOWN, PhysPortIndex); - (void)SK_DRIVER_SENDEVENT(pAC, IoC); - -- /* Bugfix #10620 - get zero level for incremental difference */ -+ /* Bugfix #10620 - get zero level for incremental difference. */ - if (MacType == SK_MAC_XMAC) { - - (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex, -@@ -1435,17 +1407,13 @@ SK_EVPARA Param) /* Event dependent para - } - #endif /* DEBUG */ - -- /* -- * For now, ignore event if NetIndex != 0. -- */ -+ /* For now, ignore event if NetIndex != 0. */ - if (Param.Para32[1] != 0) { - - return (0); - } - -- /* -- * Nothing to do if port is already inactive -- */ -+ /* Nothing to do if port is already inactive. */ - if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { - - return (0); -@@ -1476,7 +1444,6 @@ SK_EVPARA Param) /* Event dependent para - CounterIndex ++) { - - if (!StatAddr[CounterIndex][MacType].GetOffset) { -- - continue; - } - -@@ -1485,9 +1452,7 @@ SK_EVPARA Param) /* Event dependent para - pAC->Pnmi.VirtualCounterOffset[CounterIndex] += Value; - } - -- /* -- * Set port to inactive -- */ -+ /* Set port to inactive. */ - pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_FALSE; - - pAC->Pnmi.MacUpdatedFlag --; -@@ -1513,25 +1478,19 @@ SK_EVPARA Param) /* Event dependent para - } - #endif /* DEBUG */ - -- /* -- * For now, ignore event if NetIndex != 0. -- */ -+ /* For now, ignore event if NetIndex != 0. */ - if (Param.Para32[1] != 0) { - - return (0); - } - -- /* -- * Nothing to do if port is already active -- */ -+ /* Nothing to do if port is already inactive. */ - if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { - - return (0); - } - -- /* -- * Statistic maintenance -- */ -+ /* Statistic maintenance. */ - pAC->Pnmi.RlmtChangeCts ++; - pAC->Pnmi.RlmtChangeTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC)); - -@@ -1565,7 +1524,6 @@ SK_EVPARA Param) /* Event dependent para - CounterIndex ++) { - - if (!StatAddr[CounterIndex][MacType].GetOffset) { -- - continue; - } - -@@ -1574,16 +1532,14 @@ SK_EVPARA Param) /* Event dependent para - pAC->Pnmi.VirtualCounterOffset[CounterIndex] -= Value; - } - -- /* Set port to active */ -+ /* Set port to active. */ - pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_TRUE; - - pAC->Pnmi.MacUpdatedFlag --; - break; - - case SK_PNMI_EVT_RLMT_SEGMENTATION: -- /* -- * Para.Para32[0] contains the NetIndex. -- */ -+ /* Para.Para32[0] contains the NetIndex. */ - - /* - * Store a trap message in the trap buffer and generate an event for -@@ -1598,71 +1554,53 @@ SK_EVPARA Param) /* Event dependent para - * Param.Para32[0] contains the number of Nets. - * Param.Para32[1] is reserved, contains -1. - */ -- /* -- * Check number of nets -- */ -+ /* Check number of nets. */ - MaxNetNumber = pAC->GIni.GIMacsFound; -- if (((unsigned int)Param.Para32[0] < 1) -- || ((unsigned int)Param.Para32[0] > MaxNetNumber)) { -+ -+ if (((unsigned int)Param.Para32[0] < 1) || -+ ((unsigned int)Param.Para32[0] > MaxNetNumber)) { -+ - return (SK_PNMI_ERR_UNKNOWN_NET); - } - -- if ((unsigned int)Param.Para32[0] == 1) { /* single net mode */ -+ if ((unsigned int)Param.Para32[0] == 1) { /* SingleNet mode. */ - pAC->Pnmi.DualNetActiveFlag = SK_FALSE; - } -- else { /* dual net mode */ -+ else { /* DualNet mode. */ - pAC->Pnmi.DualNetActiveFlag = SK_TRUE; - } - break; - - case SK_PNMI_EVT_VCT_RESET: - PhysPortIndex = Param.Para32[0]; -- pPrt = &pAC->GIni.GP[PhysPortIndex]; -- pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex]; - - if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING) { -+ - RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE); -+ - if (RetCode == 2) { - /* - * VCT test is still running. - * Start VCT timer counter again. - */ -- SK_MEMSET((char *) &Param, 0, sizeof(Param)); -+ SK_MEMSET((char *)&Param, 0, sizeof(Param)); -+ - Param.Para32[0] = PhysPortIndex; - Param.Para32[1] = -1; -- SkTimerStart(pAC, IoC, -- &pAC->Pnmi.VctTimeout[PhysPortIndex].VctTimer, -- 4000000, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Param); -+ -+ SkTimerStart(pAC, IoC, &pAC->Pnmi.VctTimeout[PhysPortIndex], -+ SK_PNMI_VCT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Param); -+ - break; - } -- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_PENDING; -- pAC->Pnmi.VctStatus[PhysPortIndex] |= -- (SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_TEST_DONE); - -- /* Copy results for later use to PNMI struct. */ -- for (i = 0; i < 4; i++) { -- if (pPrt->PMdiPairSts[i] == SK_PNMI_VCT_NORMAL_CABLE) { -- if ((pPrt->PMdiPairLen[i] > 35) && -- (pPrt->PMdiPairLen[i] < 0xff)) { -- pPrt->PMdiPairSts[i] = SK_PNMI_VCT_IMPEDANCE_MISMATCH; -- } -- } -- if ((pPrt->PMdiPairLen[i] > 35) && -- (pPrt->PMdiPairLen[i] != 0xff)) { -- CableLength = 1000 * -- (((175 * pPrt->PMdiPairLen[i]) / 210) - 28); -- } -- else { -- CableLength = 0; -- } -- pVctBackupData->PMdiPairLen[i] = CableLength; -- pVctBackupData->PMdiPairSts[i] = pPrt->PMdiPairSts[i]; -- } -+ VctGetResults(pAC, IoC, PhysPortIndex); - -- Param.Para32[0] = PhysPortIndex; -- Param.Para32[1] = -1; -- SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Param); -- SkEventDispatcher(pAC, IoC); -+ EventParam.Para32[0] = PhysPortIndex; -+ EventParam.Para32[1] = -1; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, EventParam); -+ -+ /* SkEventDispatcher(pAC, IoC); */ - } - - break; -@@ -1710,14 +1648,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - unsigned int TableIndex; - int Ret; - -- - if ((TableIndex = LookupId(Id)) == (unsigned int)(-1)) { - - *pLen = 0; - return (SK_PNMI_ERR_UNKNOWN_OID); - } - -- /* Check NetIndex */ -+ /* Check NetIndex. */ - if (NetIndex >= pAC->Rlmt.NumNets) { - return (SK_PNMI_ERR_UNKNOWN_NET); - } -@@ -1767,22 +1704,20 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 Instance; - SK_U32 Id; - -- -- /* Check if the passed buffer has the right size */ -+ /* Check if the passed buffer has the right size. */ - if (*pLen < SK_PNMI_STRUCT_SIZE) { - -- /* Check if we can return the error within the buffer */ -+ /* Check if we can return the error within the buffer. */ - if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) { - -- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT, -- (SK_U32)(-1)); -+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT, (SK_U32)(-1)); - } - - *pLen = SK_PNMI_STRUCT_SIZE; - return (SK_PNMI_ERR_TOO_SHORT); - } - -- /* Check NetIndex */ -+ /* Check NetIndex. */ - if (NetIndex >= pAC->Rlmt.NumNets) { - return (SK_PNMI_ERR_UNKNOWN_NET); - } -@@ -1810,12 +1745,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - pAC->Pnmi.RlmtUpdatedFlag ++; - pAC->Pnmi.SirqUpdatedFlag ++; - -- /* Preset/Set values */ -+ /* PRESET/SET values. */ - for (TableIndex = 0; TableIndex < ID_TABLE_SIZE; TableIndex ++) { - - if ((IdTable[TableIndex].Access != SK_PNMI_RW) && - (IdTable[TableIndex].Access != SK_PNMI_WO)) { -- - continue; - } - -@@ -1826,8 +1760,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - InstanceCnt ++) { - - DstOffset = IdTable[TableIndex].Offset + -- (InstanceCnt - 1) * -- IdTable[TableIndex].StructSize; -+ (InstanceCnt - 1) * IdTable[TableIndex].StructSize; - - /* - * Because VPD multiple instance variables are -@@ -1837,9 +1770,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - */ - Instance = (SK_U32)InstanceCnt; - -- /* -- * Evaluate needed buffer length -- */ -+ /* Evaluate needed buffer length. */ - Len = 0; - Ret = IdTable[TableIndex].Func(pAC, IoC, - SK_PNMI_GET, IdTable[TableIndex].Id, -@@ -1855,8 +1786,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - pAC->Pnmi.SirqUpdatedFlag --; - - SK_PNMI_CHECKFLAGS("PnmiStruct: On return"); -- SK_PNMI_SET_STAT(pBuf, -- SK_PNMI_ERR_GENERAL, DstOffset); -+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_GENERAL, DstOffset); - *pLen = SK_PNMI_MIN_STRUCT_SIZE; - return (SK_PNMI_ERR_GENERAL); - } -@@ -1878,7 +1808,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - -- /* Call the OID handler function */ -+ /* Call the OID handler function. */ - Ret = IdTable[TableIndex].Func(pAC, IoC, Action, - IdTable[TableIndex].Id, pBuf + DstOffset, - &Len, Instance, TableIndex, NetIndex); -@@ -1889,8 +1819,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - pAC->Pnmi.SirqUpdatedFlag --; - - SK_PNMI_CHECKFLAGS("PnmiStruct: On return"); -- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_BAD_VALUE, -- DstOffset); -+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_BAD_VALUE, DstOffset); - *pLen = SK_PNMI_MIN_STRUCT_SIZE; - return (SK_PNMI_ERR_BAD_VALUE); - } -@@ -1924,7 +1853,7 @@ SK_U32 Id) /* Object identifier to be s - - if (IdTable[i].Id == Id) { - -- return i; -+ return (i); - } - } - -@@ -1965,16 +1894,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - { - if (Id != OID_SKGE_ALL_DATA) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR003, -- SK_PNMI_ERR003MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR003, SK_PNMI_ERR003MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } - -- /* -- * Check instance. We only handle single instance variables -- */ -+ /* Check instance. We only handle single instance variables. */ - if (Instance != (SK_U32)(-1) && Instance != 1) { - - *pLen = 0; -@@ -2033,10 +1959,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - int Ret; - SK_U32 ActionOp; - -- -- /* -- * Check instance. We only handle single instance variables -- */ -+ /* Check instance. We only handle single instance variables. */ - if (Instance != (SK_U32)(-1) && Instance != 1) { - - *pLen = 0; -@@ -2049,10 +1972,10 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_TOO_SHORT); - } - -- /* Check if a get should be performed */ -+ /* Check if a GET should be performed. */ - if (Action == SK_PNMI_GET) { - -- /* A get is easy. We always return the same value */ -+ /* A GET is easy. We always return the same value. */ - ActionOp = (SK_U32)SK_PNMI_ACT_IDLE; - SK_PNMI_STORE_U32(pBuf, ActionOp); - *pLen = sizeof(SK_U32); -@@ -2060,13 +1983,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_OK); - } - -- /* Continue with PRESET/SET action */ -+ /* Continue with PRESET/SET action. */ - if (*pLen > sizeof(SK_U32)) { - - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* Check if the command is a known one */ -+ /* Check if the command is a known one. */ - SK_PNMI_READ_U32(pBuf, ActionOp); - if (*pLen > sizeof(SK_U32) || - (ActionOp != SK_PNMI_ACT_IDLE && -@@ -2078,7 +2001,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* A preset ends here */ -+ /* A PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - return (SK_PNMI_ERR_OK); -@@ -2087,19 +2010,15 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - switch (ActionOp) { - - case SK_PNMI_ACT_IDLE: -- /* Nothing to do */ -+ /* Nothing to do. */ - break; - - case SK_PNMI_ACT_RESET: -- /* -- * Perform a driver reset or something that comes near -- * to this. -- */ -+ /* Perform a driver reset or something that comes near to this. */ - Ret = SK_DRIVER_RESET(pAC, IoC); - if (Ret != 0) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR005, -- SK_PNMI_ERR005MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR005, SK_PNMI_ERR005MSG); - - return (SK_PNMI_ERR_GENERAL); - } -@@ -2116,13 +2035,12 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case SK_PNMI_ACT_RESETCNT: -- /* Set all counters and timestamps to zero */ -+ /* Set all counters and timestamps to zero. */ - ResetCounter(pAC, IoC, NetIndex); - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR006, -- SK_PNMI_ERR006MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR006, SK_PNMI_ERR006MSG); - - return (SK_PNMI_ERR_GENERAL); - } -@@ -2166,25 +2084,21 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 StatVal32; - SK_BOOL Is64BitReq = SK_FALSE; - -- /* -- * Only the active Mac is returned -- */ -+ /* Only the active MAC is returned. */ - if (Instance != (SK_U32)(-1) && Instance != 1) { - - *pLen = 0; - return (SK_PNMI_ERR_UNKNOWN_INST); - } - -- /* -- * Check action type -- */ -+ /* Check action type. */ - if (Action != SK_PNMI_GET) { - - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* Check length */ -+ /* Check length. */ - switch (Id) { - - case OID_802_3_PERMANENT_ADDRESS: -@@ -2205,12 +2119,12 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - #else /* SK_NDIS_64BIT_CTR */ - -- /* for compatibility, at least 32bit are required for OID */ -+ /* For compatibility, at least 32 bits are required for OID. */ - if (*pLen < sizeof(SK_U32)) { - /* -- * but indicate handling for 64bit values, -- * if insufficient space is provided -- */ -+ * Indicate handling for 64 bit values, -+ * if insufficient space is provided. -+ */ - *pLen = sizeof(SK_U64); - return (SK_PNMI_ERR_TOO_SHORT); - } -@@ -2226,16 +2140,14 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - * to indicate that an update was already done. - */ - Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1); -- if ( Ret != SK_PNMI_ERR_OK) { -+ if (Ret != SK_PNMI_ERR_OK) { - - *pLen = 0; - return (Ret); - } - pAC->Pnmi.MacUpdatedFlag ++; - -- /* -- * Get value (MAC Index 0 identifies the virtual MAC) -- */ -+ /* Get value (MAC index 0 identifies the virtual MAC). */ - switch (Id) { - - case OID_802_3_PERMANENT_ADDRESS: -@@ -2251,7 +2163,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - default: - StatVal = GetStatVal(pAC, IoC, 0, IdTable[TableIndex].Param, NetIndex); - -- /* by default 32bit values are evaluated */ -+ /* By default 32 bit values are evaluated. */ - if (!Is64BitReq) { - StatVal32 = (SK_U32)StatVal; - SK_PNMI_STORE_U32(pBuf, StatVal32); -@@ -2305,21 +2217,19 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - int MacType; - int Ret; - SK_U64 StatVal; -- -- - -- /* Calculate instance if wished. MAC index 0 is the virtual MAC */ -+ /* Calculate instance if wished. MAC index 0 is the virtual MAC. */ - PhysPortMax = pAC->GIni.GIMacsFound; - LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax); - - MacType = pAC->GIni.GIMacType; - -- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */ -+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */ - LogPortMax--; - } - -- if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */ -- /* Check instance range */ -+ if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried. */ -+ /* Check instance range. */ - if ((Instance < 1) || (Instance > LogPortMax)) { - - *pLen = 0; -@@ -2329,20 +2239,20 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Limit = LogPortIndex + 1; - } - -- else { /* Instance == (SK_U32)(-1), get all Instances of that OID */ -+ else { /* Instance == (SK_U32)(-1), get all Instances of that OID. */ - - LogPortIndex = 0; - Limit = LogPortMax; - } - -- /* Check action */ -+ /* Check action. */ - if (Action != SK_PNMI_GET) { - - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* Check length */ -+ /* Check length. */ - if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U64)) { - - *pLen = (Limit - LogPortIndex) * sizeof(SK_U64); -@@ -2361,7 +2271,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - pAC->Pnmi.MacUpdatedFlag ++; - -- /* Get value */ -+ /* Get value. */ - Offset = 0; - for (; LogPortIndex < Limit; LogPortIndex ++) { - -@@ -2467,19 +2377,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - unsigned int Limit; - unsigned int Offset = 0; - -- /* -- * Calculate instance if wished. MAC index 0 is the virtual -- * MAC. -- */ -+ /* Calculate instance if wished. MAC index 0 is the virtual MAC. */ - PhysPortMax = pAC->GIni.GIMacsFound; - LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax); - -- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */ -+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */ - LogPortMax--; - } - -- if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */ -- /* Check instance range */ -+ if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried. */ -+ /* Check instance range. */ - if ((Instance < 1) || (Instance > LogPortMax)) { - - *pLen = 0; -@@ -2488,27 +2395,23 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance); - Limit = LogPortIndex + 1; - } -- else { /* Instance == (SK_U32)(-1), get all Instances of that OID */ -+ else { /* Instance == (SK_U32)(-1), get all Instances of that OID. */ - - LogPortIndex = 0; - Limit = LogPortMax; - } - -- /* -- * Perform Action -- */ -+ /* Perform action. */ - if (Action == SK_PNMI_GET) { - -- /* Check length */ -+ /* Check length. */ - if (*pLen < (Limit - LogPortIndex) * 6) { - - *pLen = (Limit - LogPortIndex) * 6; - return (SK_PNMI_ERR_TOO_SHORT); - } - -- /* -- * Get value -- */ -+ /* Get value. */ - for (; LogPortIndex < Limit; LogPortIndex ++) { - - switch (Id) { -@@ -2532,8 +2435,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - &pAC->Addr.Net[NetIndex].PermanentMacAddress); - } - else { -- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( -- pAC, LogPortIndex); -+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); - - CopyMac(pBuf + Offset, - &pAC->Addr.Port[PhysPortIndex].PermanentMacAddress); -@@ -2542,8 +2444,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR008, -- SK_PNMI_ERR008MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR008, SK_PNMI_ERR008MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -2554,8 +2455,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - else { - /* -- * The logical MAC address may not be changed only -- * the physical ones -+ * The logical MAC address may not be changed, -+ * only the physical ones. - */ - if (Id == OID_SKGE_PHYS_FAC_ADDR) { - -@@ -2563,19 +2464,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* -- * Only the current address may be changed -- */ -+ /* Only the current address may be changed. */ - if (Id != OID_SKGE_PHYS_CUR_ADDR) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR009, -- SK_PNMI_ERR009MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR009, SK_PNMI_ERR009MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } - -- /* Check length */ -+ /* Check length. */ - if (*pLen < (Limit - LogPortIndex) * 6) { - - *pLen = (Limit - LogPortIndex) * 6; -@@ -2587,32 +2485,26 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* -- * Check Action -- */ -+ /* Check action. */ - if (Action == SK_PNMI_PRESET) { - - *pLen = 0; - return (SK_PNMI_ERR_OK); - } - -- /* -- * Set OID_SKGE_MAC_CUR_ADDR -- */ -+ /* Set OID_SKGE_MAC_CUR_ADDR. */ - for (; LogPortIndex < Limit; LogPortIndex ++, Offset += 6) { - - /* - * A set to virtual port and set of broadcast -- * address will be ignored -+ * address will be ignored. - */ - if (LogPortIndex == 0 || SK_MEMCMP(pBuf + Offset, - "\xff\xff\xff\xff\xff\xff", 6) == 0) { -- - continue; - } - -- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, -- LogPortIndex); -+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); - - Ret = SkAddrOverride(pAC, IoC, PhysPortIndex, - (SK_MAC_ADDR *)(pBuf + Offset), -@@ -2665,10 +2557,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - unsigned int Offset = 0; - SK_U64 StatVal; - -- -- /* -- * Calculate instance if wished -- */ -+ /* Calculate instance if wished. */ - if (Instance != (SK_U32)(-1)) { - - if ((Instance < 1) || (Instance > SKCS_NUM_PROTOCOLS)) { -@@ -2684,25 +2573,21 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Limit = SKCS_NUM_PROTOCOLS; - } - -- /* -- * Check action -- */ -+ /* Check action. */ - if (Action != SK_PNMI_GET) { - - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* Check length */ -+ /* Check length. */ - if (*pLen < (Limit - Index) * sizeof(SK_U64)) { - - *pLen = (Limit - Index) * sizeof(SK_U64); - return (SK_PNMI_ERR_TOO_SHORT); - } - -- /* -- * Get value -- */ -+ /* Get value. */ - for (; Index < Limit; Index ++) { - - switch (Id) { -@@ -2728,8 +2613,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR010, -- SK_PNMI_ERR010MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR010, SK_PNMI_ERR010MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -2739,9 +2623,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Offset += sizeof(SK_U64); - } - -- /* -- * Store used buffer space -- */ -+ /* Store used buffer space. */ - *pLen = Offset; - - return (SK_PNMI_ERR_OK); -@@ -2784,10 +2666,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 Val32; - SK_U64 Val64; - -- -- /* -- * Calculate instance if wished -- */ -+ /* Calculate instance if wished. */ - if ((Instance != (SK_U32)(-1))) { - - if ((Instance < 1) || (Instance > (SK_U32)pAC->I2c.MaxSens)) { -@@ -2804,16 +2683,14 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Limit = (unsigned int) pAC->I2c.MaxSens; - } - -- /* -- * Check action -- */ -+ /* Check action. */ - if (Action != SK_PNMI_GET) { - - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* Check length */ -+ /* Check length. */ - switch (Id) { - - case OID_SKGE_SENSOR_VALUE: -@@ -2872,38 +2749,33 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR012, -- SK_PNMI_ERR012MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR012, SK_PNMI_ERR012MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - - } - -- /* -- * Get value -- */ -+ /* Get value. */ - for (Offset = 0; Index < Limit; Index ++) { - - switch (Id) { - - case OID_SKGE_SENSOR_INDEX: - *(pBuf + Offset) = (char)Index; -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_SENSOR_DESCR: - Len = SK_STRLEN(pAC->I2c.SenTable[Index].SenDesc); -- SK_MEMCPY(pBuf + Offset + 1, -- pAC->I2c.SenTable[Index].SenDesc, Len); -+ SK_MEMCPY(pBuf + Offset + 1, pAC->I2c.SenTable[Index].SenDesc, Len); - *(pBuf + Offset) = (char)Len; - Offset += Len + 1; - break; - - case OID_SKGE_SENSOR_TYPE: -- *(pBuf + Offset) = -- (char)pAC->I2c.SenTable[Index].SenType; -- Offset += sizeof(char); -+ *(pBuf + Offset) = (char)pAC->I2c.SenTable[Index].SenType; -+ Offset ++; - break; - - case OID_SKGE_SENSOR_VALUE: -@@ -2940,9 +2812,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_SENSOR_STATUS: -- *(pBuf + Offset) = -- (char)pAC->I2c.SenTable[Index].SenErrFlag; -- Offset += sizeof(char); -+ *(pBuf + Offset) = (char)pAC->I2c.SenTable[Index].SenErrFlag; -+ Offset ++; - break; - - case OID_SKGE_SENSOR_WAR_CTS: -@@ -2979,9 +2850,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - -- /* -- * Store used buffer space -- */ -+ /* Store used buffer space. */ - *pLen = Offset; - - return (SK_PNMI_ERR_OK); -@@ -3036,8 +2905,29 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 Val32; - - /* -- * Get array of all currently stored VPD keys -- */ -+ * VpdKeyReadError will be set in GetVpdKeyArr() if an error occurs. -+ * Due to the fact that some drivers use SkPnmiGetStruct() to retrieve -+ * all statistical data, an error in GetVpdKeyArr() will generate a PNMI -+ * error and terminate SkPnmiGetStruct() without filling in statistical -+ * data into the PNMI struct. In this case the driver will get no values -+ * for statistical purposes (netstat, ifconfig etc.). GetVpdKeyArr() is -+ * the first function to be called in SkPnmiGetStruct(), so any error -+ * will terminate SkPnmiGetStruct() immediately. Hence, VpdKeyReadError will -+ * be set during the first call to GetVpdKeyArr() to make successful calls -+ * to SkPnmiGetStruct() possible. But there is another point to consider: -+ * When filling in the statistical data into the PNMI struct, the VPD -+ * handler Vpd() will also be called. If GetVpdKeyArr() in Vpd() would -+ * return with SK_PNMI_ERR_GENERAL, SkPnmiGetStruct() would fail again. -+ * For this reason VpdKeyReadError is checked here and, if set, Vpd() -+ * will return without doing anything and the return value SK_PNMI_ERR_OK. -+ * Therefore SkPnmiGetStruct() is able to continue and fill in all other -+ * statistical data. -+ */ -+ if (pAC->Pnmi.VpdKeyReadError == SK_TRUE) { -+ return (SK_PNMI_ERR_OK); -+ } -+ -+ /* Get array of all currently stored VPD keys. */ - Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &KeyNo); - if (Ret != SK_PNMI_ERR_OK) { - *pLen = 0; -@@ -3082,34 +2972,32 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - -- /* -- * Get value, if a query should be performed -- */ -+ /* Get value, if a query should be performed. */ - if (Action == SK_PNMI_GET) { - - switch (Id) { - - case OID_SKGE_VPD_FREE_BYTES: -- /* Check length of buffer */ -+ /* Check length of buffer. */ - if (*pLen < sizeof(SK_U32)) { - - *pLen = sizeof(SK_U32); - return (SK_PNMI_ERR_TOO_SHORT); - } -- /* Get number of free bytes */ -+ /* Get number of free bytes. */ - pVpdStatus = VpdStat(pAC, IoC); - if (pVpdStatus == NULL) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR017, -- SK_PNMI_ERR017MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR017MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } - if ((pVpdStatus->vpd_status & VPD_VALID) == 0) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR018, -- SK_PNMI_ERR018MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR018MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3121,7 +3009,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_VPD_ENTRIES_LIST: -- /* Check length */ -+ /* Check length. */ - for (Len = 0, Index = 0; Index < KeyNo; Index ++) { - - Len += SK_STRLEN(KeyArr[Index]) + 1; -@@ -3132,7 +3020,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_TOO_SHORT); - } - -- /* Get value */ -+ /* Get value. */ - *(pBuf) = (char)Len - 1; - for (Offset = 1, Index = 0; Index < KeyNo; Index ++) { - -@@ -3151,7 +3039,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_VPD_ENTRIES_NUMBER: -- /* Check length */ -+ /* Check length. */ - if (*pLen < sizeof(SK_U32)) { - - *pLen = sizeof(SK_U32); -@@ -3164,7 +3052,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_VPD_KEY: -- /* Check buffer length, if it is large enough */ -+ /* Check buffer length, if it is large enough. */ - for (Len = 0, Index = FirstIndex; - Index < LastIndex; Index ++) { - -@@ -3180,32 +3068,28 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - * Get the key to an intermediate buffer, because - * we have to prepend a length byte. - */ -- for (Offset = 0, Index = FirstIndex; -- Index < LastIndex; Index ++) { -+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) { - - Len = SK_STRLEN(KeyArr[Index]); - - *(pBuf + Offset) = (char)Len; -- SK_MEMCPY(pBuf + Offset + 1, KeyArr[Index], -- Len); -+ SK_MEMCPY(pBuf + Offset + 1, KeyArr[Index], Len); - Offset += Len + 1; - } - *pLen = Offset; - break; - - case OID_SKGE_VPD_VALUE: -- /* Check the buffer length if it is large enough */ -- for (Offset = 0, Index = FirstIndex; -- Index < LastIndex; Index ++) { -+ /* Check the buffer length if it is large enough. */ -+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) { - - BufLen = 256; - if (VpdRead(pAC, IoC, KeyArr[Index], Buf, - (int *)&BufLen) > 0 || - BufLen >= SK_PNMI_VPD_DATALEN) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, -- SK_PNMI_ERR021, -- SK_PNMI_ERR021MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR021MSG)); - - return (SK_PNMI_ERR_GENERAL); - } -@@ -3221,17 +3105,15 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - * Get the value to an intermediate buffer, because - * we have to prepend a length byte. - */ -- for (Offset = 0, Index = FirstIndex; -- Index < LastIndex; Index ++) { -+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) { - - BufLen = 256; - if (VpdRead(pAC, IoC, KeyArr[Index], Buf, - (int *)&BufLen) > 0 || - BufLen >= SK_PNMI_VPD_DATALEN) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, -- SK_PNMI_ERR022, -- SK_PNMI_ERR022MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR022MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3251,8 +3133,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_TOO_SHORT); - } - -- for (Offset = 0, Index = FirstIndex; -- Index < LastIndex; Index ++) { -+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) { - - if (VpdMayWrite(KeyArr[Index])) { - -@@ -3278,15 +3159,15 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR023, -- SK_PNMI_ERR023MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR023MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } - } - else { -- /* The only OID which can be set is VPD_ACTION */ -+ /* The only OID which can be set is VPD_ACTION. */ - if (Id != OID_SKGE_VPD_ACTION) { - - if (Id == OID_SKGE_VPD_FREE_BYTES || -@@ -3300,8 +3181,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_READ_ONLY); - } - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR024, -- SK_PNMI_ERR024MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR024MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3317,14 +3198,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_TOO_SHORT); - } - -- /* -- * The first byte contains the VPD action type we should -- * perform. -- */ -+ /* The first byte contains the VPD action type we should perform. */ - switch (*pBuf) { - - case SK_PNMI_VPD_IGNORE: -- /* Nothing to do */ -+ /* Nothing to do. */ - break; - - case SK_PNMI_VPD_CREATE: -@@ -3356,13 +3234,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_MEMCPY(Buf, pBuf + 4, Offset); - Buf[Offset] = 0; - -- /* A preset ends here */ -+ /* A PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - return (SK_PNMI_ERR_OK); - } - -- /* Write the new entry or modify an existing one */ -+ /* Write the new entry or modify an existing one .*/ - Ret = VpdWrite(pAC, IoC, KeyStr, Buf); - if (Ret == SK_PNMI_VPD_NOWRITE ) { - -@@ -3371,8 +3249,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - else if (Ret != SK_PNMI_VPD_OK) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR025, -- SK_PNMI_ERR025MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR025MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3385,8 +3263,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Ret = VpdUpdate(pAC, IoC); - if (Ret != SK_PNMI_VPD_OK) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR026, -- SK_PNMI_ERR026MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR026MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3394,7 +3272,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case SK_PNMI_VPD_DELETE: -- /* Check if the buffer size is plausible */ -+ /* Check if the buffer size is plausible. */ - if (*pLen < 3) { - - *pLen = 3; -@@ -3409,7 +3287,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - KeyStr[1] = pBuf[2]; - KeyStr[2] = 0; - -- /* Find the passed key in the array */ -+ /* Find the passed key in the array. */ - for (Index = 0; Index < KeyNo; Index ++) { - - if (SK_STRCMP(KeyStr, KeyArr[Index]) == 0) { -@@ -3417,6 +3295,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - } - } -+ - /* - * If we cannot find the key it is wrong, so we - * return an appropriate error value. -@@ -3432,12 +3311,12 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_OK); - } - -- /* Ok, you wanted it and you will get it */ -+ /* Ok, you wanted it and you will get it. */ - Ret = VpdDelete(pAC, IoC, KeyStr); - if (Ret != SK_PNMI_VPD_OK) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR027, -- SK_PNMI_ERR027MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR027MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3450,8 +3329,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Ret = VpdUpdate(pAC, IoC); - if (Ret != SK_PNMI_VPD_OK) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR028, -- SK_PNMI_ERR028MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR028MSG)); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3505,23 +3384,21 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 Val32; - SK_U64 Val64; - SK_U64 Val64RxHwErrs = 0; -+ SK_U64 Val64RxRunt = 0; -+ SK_U64 Val64RxFcs = 0; - SK_U64 Val64TxHwErrs = 0; - SK_BOOL Is64BitReq = SK_FALSE; - char Buf[256]; - int MacType; - -- /* -- * Check instance. We only handle single instance variables. -- */ -+ /* Check instance. We only handle single instance variables. */ - if (Instance != (SK_U32)(-1) && Instance != 1) { - - *pLen = 0; - return (SK_PNMI_ERR_UNKNOWN_INST); - } - -- /* -- * Check action. We only allow get requests. -- */ -+ /* Check action. We only allow get requests. */ - if (Action != SK_PNMI_GET) { - - *pLen = 0; -@@ -3530,9 +3407,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - MacType = pAC->GIni.GIMacType; - -- /* -- * Check length for the various supported OIDs -- */ -+ /* Check length for the various supported OIDs. */ - switch (Id) { - - case OID_GEN_XMIT_ERROR: -@@ -3546,14 +3421,12 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - #else /* SK_NDIS_64BIT_CTR */ - -- /* -- * for compatibility, at least 32bit are required for oid -- */ -+ /* For compatibility, at least 32bit are required for OID. */ - if (*pLen < sizeof(SK_U32)) { - /* -- * but indicate handling for 64bit values, -- * if insufficient space is provided -- */ -+ * Indicate handling for 64bit values, -+ * if insufficient space is provided. -+ */ - *pLen = sizeof(SK_U64); - return (SK_PNMI_ERR_TOO_SHORT); - } -@@ -3624,11 +3497,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- /* Checked later */ -+ /* Checked later. */ - break; - } - -- /* Update statistic */ -+ /* Update statistics. */ - if (Id == OID_SKGE_RX_HW_ERROR_CTS || - Id == OID_SKGE_TX_HW_ERROR_CTS || - Id == OID_SKGE_IN_ERRORS_CTS || -@@ -3636,7 +3509,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Id == OID_GEN_XMIT_ERROR || - Id == OID_GEN_RCV_ERROR) { - -- /* Force the XMAC to update its statistic counters and -+ /* -+ * Force the XMAC to update its statistic counters and - * Increment semaphore to indicate that an update was - * already done. - */ -@@ -3667,27 +3541,40 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_IRLENGTH, NetIndex) + - GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SYMBOL, NetIndex) + - GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SHORTS, NetIndex) + -- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_RUNT, NetIndex) + - GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_TOO_LONG, NetIndex) + -- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FCS, NetIndex) + - GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_CEXT, NetIndex); -- break; - -- case OID_SKGE_TX_HW_ERROR_CTS: -- case OID_SKGE_OUT_ERROR_CTS: -- case OID_GEN_XMIT_ERROR: -- Val64TxHwErrs = -- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_EXCESS_COL, NetIndex) + -- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_LATE_COL, NetIndex) + -- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_UNDERRUN, NetIndex) + -- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_CARRIER, NetIndex); -+ -+ /* -+ * In some cases the runt and fcs counters are incremented when collisions -+ * occur. We have to correct those counters here. -+ */ -+ Val64RxRunt = GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_RUNT, NetIndex); -+ Val64RxFcs = GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FCS, NetIndex); -+ -+ if (Val64RxRunt > Val64RxFcs) { -+ Val64RxRunt -= Val64RxFcs; -+ Val64RxHwErrs += Val64RxRunt; -+ } -+ else { -+ Val64RxFcs -= Val64RxRunt; -+ Val64RxHwErrs += Val64RxFcs; -+ } -+ break; -+ -+ case OID_SKGE_TX_HW_ERROR_CTS: -+ case OID_SKGE_OUT_ERROR_CTS: -+ case OID_GEN_XMIT_ERROR: -+ Val64TxHwErrs = -+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_EXCESS_COL, NetIndex) + -+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_LATE_COL, NetIndex) + -+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_UNDERRUN, NetIndex) + -+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_CARRIER, NetIndex); - break; - } - } - -- /* -- * Retrieve value -- */ -+ /* Retrieve value. */ - switch (Id) { - - case OID_SKGE_SUPPORTED_LIST: -@@ -3697,11 +3584,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - *pLen = Len; - return (SK_PNMI_ERR_TOO_SHORT); - } -- for (Offset = 0, Index = 0; Offset < Len; -- Offset += sizeof(SK_U32), Index ++) { -+ for (Offset = 0, Index = 0; Offset < Len; Index ++) { - - Val32 = (SK_U32)IdTable[Index].Id; - SK_PNMI_STORE_U32(pBuf + Offset, Val32); -+ Offset += sizeof(SK_U32); - } - *pLen = Len; - break; -@@ -3727,8 +3614,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - case OID_SKGE_DRIVER_DESCR: - if (pAC->Pnmi.pDriverDescription == NULL) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR007, -- SK_PNMI_ERR007MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR007, SK_PNMI_ERR007MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3737,8 +3623,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Len = SK_STRLEN(pAC->Pnmi.pDriverDescription) + 1; - if (Len > SK_PNMI_STRINGLEN1) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR029, -- SK_PNMI_ERR029MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR029, SK_PNMI_ERR029MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3757,8 +3642,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - case OID_SKGE_DRIVER_VERSION: - if (pAC->Pnmi.pDriverVersion == NULL) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030, -- SK_PNMI_ERR030MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030, SK_PNMI_ERR030MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3767,8 +3651,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Len = SK_STRLEN(pAC->Pnmi.pDriverVersion) + 1; - if (Len > SK_PNMI_STRINGLEN1) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031, -- SK_PNMI_ERR031MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031, SK_PNMI_ERR031MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3787,8 +3670,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - case OID_SKGE_DRIVER_RELDATE: - if (pAC->Pnmi.pDriverReleaseDate == NULL) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030, -- SK_PNMI_ERR053MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR053, SK_PNMI_ERR053MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3797,8 +3679,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Len = SK_STRLEN(pAC->Pnmi.pDriverReleaseDate) + 1; - if (Len > SK_PNMI_STRINGLEN1) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031, -- SK_PNMI_ERR054MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR054, SK_PNMI_ERR054MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3817,8 +3698,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - case OID_SKGE_DRIVER_FILENAME: - if (pAC->Pnmi.pDriverFileName == NULL) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030, -- SK_PNMI_ERR055MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR055, SK_PNMI_ERR055MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3827,8 +3707,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Len = SK_STRLEN(pAC->Pnmi.pDriverFileName) + 1; - if (Len > SK_PNMI_STRINGLEN1) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031, -- SK_PNMI_ERR056MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR056, SK_PNMI_ERR056MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3850,12 +3729,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - * query may move to the initialisation routine. But - * the VPD data is cached and therefore a call here - * will not make much difference. -+ * Please read comment in Vpd(). - */ -+ if (pAC->Pnmi.VpdKeyReadError == SK_TRUE) { -+ return (SK_PNMI_ERR_OK); -+ } -+ - Len = 256; - if (VpdRead(pAC, IoC, VPD_NAME, Buf, (int *)&Len) > 0) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR032, -- SK_PNMI_ERR032MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR032, SK_PNMI_ERR032MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3863,8 +3746,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Len ++; - if (Len > SK_PNMI_STRINGLEN1) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR033, -- SK_PNMI_ERR033MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR033, SK_PNMI_ERR033MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -3880,7 +3762,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_HW_VERSION: -- /* Oh, I love to do some string manipulation */ - if (*pLen < 5) { - - *pLen = 5; -@@ -3889,9 +3770,9 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Val8 = (SK_U8)pAC->GIni.GIPciHwRev; - pBuf[0] = 4; - pBuf[1] = 'v'; -- pBuf[2] = (char)(0x30 | ((Val8 >> 4) & 0x0F)); -+ pBuf[2] = (char)('0' | ((Val8 >> 4) & 0x0f)); - pBuf[3] = '.'; -- pBuf[4] = (char)(0x30 | (Val8 & 0x0F)); -+ pBuf[4] = (char)('0' | (Val8 & 0x0f)); - *pLen = 5; - break; - -@@ -3914,12 +3795,12 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_VAUXAVAIL: -- *pBuf = (char) pAC->GIni.GIVauxAvail; -+ *pBuf = (char)pAC->GIni.GIVauxAvail; - *pLen = sizeof(char); - break; - - case OID_SKGE_BUS_TYPE: -- *pBuf = (char) SK_PNMI_BUS_PCI; -+ *pBuf = (char)SK_PNMI_BUS_PCI; - *pLen = sizeof(char); - break; - -@@ -3968,31 +3849,31 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_RLMT_MONITOR_NUMBER: --/* XXX Not yet implemented by RLMT therefore we return zero elements */ -+ /* Not yet implemented by RLMT, therefore we return zero elements. */ - Val32 = 0; - SK_PNMI_STORE_U32(pBuf, Val32); - *pLen = sizeof(SK_U32); - break; - - case OID_SKGE_TX_SW_QUEUE_LEN: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].TxSwQueueLen; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].TxSwQueueLen + - pAC->Pnmi.BufPort[1].TxSwQueueLen; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].TxSwQueueLen; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].TxSwQueueLen + - pAC->Pnmi.Port[1].TxSwQueueLen; -@@ -4004,24 +3885,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - - case OID_SKGE_TX_SW_QUEUE_MAX: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].TxSwQueueMax; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].TxSwQueueMax + - pAC->Pnmi.BufPort[1].TxSwQueueMax; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].TxSwQueueMax; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].TxSwQueueMax + - pAC->Pnmi.Port[1].TxSwQueueMax; -@@ -4032,24 +3913,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_TX_RETRY: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].TxRetryCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].TxRetryCts + - pAC->Pnmi.BufPort[1].TxRetryCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].TxRetryCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].TxRetryCts + - pAC->Pnmi.Port[1].TxRetryCts; -@@ -4060,24 +3941,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_RX_INTR_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].RxIntrCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].RxIntrCts + - pAC->Pnmi.BufPort[1].RxIntrCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].RxIntrCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].RxIntrCts + - pAC->Pnmi.Port[1].RxIntrCts; -@@ -4088,24 +3969,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_TX_INTR_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].TxIntrCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].TxIntrCts + - pAC->Pnmi.BufPort[1].TxIntrCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].TxIntrCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].TxIntrCts + - pAC->Pnmi.Port[1].TxIntrCts; -@@ -4116,24 +3997,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_RX_NO_BUF_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].RxNoBufCts + - pAC->Pnmi.BufPort[1].RxNoBufCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].RxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].RxNoBufCts + - pAC->Pnmi.Port[1].RxNoBufCts; -@@ -4144,24 +4025,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_TX_NO_BUF_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].TxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].TxNoBufCts + - pAC->Pnmi.BufPort[1].TxNoBufCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].TxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].TxNoBufCts + - pAC->Pnmi.Port[1].TxNoBufCts; -@@ -4172,24 +4053,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_TX_USED_DESCR_NO: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].TxUsedDescrNo; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].TxUsedDescrNo + - pAC->Pnmi.BufPort[1].TxUsedDescrNo; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].TxUsedDescrNo; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].TxUsedDescrNo + - pAC->Pnmi.Port[1].TxUsedDescrNo; -@@ -4200,24 +4081,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_RX_DELIVERED_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].RxDeliveredCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].RxDeliveredCts + - pAC->Pnmi.BufPort[1].RxDeliveredCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].RxDeliveredCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].RxDeliveredCts + - pAC->Pnmi.Port[1].RxDeliveredCts; -@@ -4228,24 +4109,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_RX_OCTETS_DELIV_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].RxOctetsDeliveredCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].RxOctetsDeliveredCts + - pAC->Pnmi.BufPort[1].RxOctetsDeliveredCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].RxOctetsDeliveredCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].RxOctetsDeliveredCts + - pAC->Pnmi.Port[1].RxOctetsDeliveredCts; -@@ -4266,13 +4147,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_IN_ERRORS_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[NetIndex].RxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = Val64RxHwErrs + - pAC->Pnmi.BufPort[0].RxNoBufCts + -@@ -4280,11 +4161,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = Val64RxHwErrs + pAC->Pnmi.Port[NetIndex].RxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = Val64RxHwErrs + - pAC->Pnmi.Port[0].RxNoBufCts + -@@ -4296,13 +4177,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_OUT_ERROR_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[NetIndex].TxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = Val64TxHwErrs + - pAC->Pnmi.BufPort[0].TxNoBufCts + -@@ -4310,11 +4191,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = Val64TxHwErrs + pAC->Pnmi.Port[NetIndex].TxNoBufCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = Val64TxHwErrs + - pAC->Pnmi.Port[0].TxNoBufCts + -@@ -4326,24 +4207,24 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_ERR_RECOVERY_CTS: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.BufPort[NetIndex].ErrRecoveryCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.BufPort[0].ErrRecoveryCts + - pAC->Pnmi.BufPort[1].ErrRecoveryCts; - } - } - else { -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - Val64 = pAC->Pnmi.Port[NetIndex].ErrRecoveryCts; - } -- /* Single net mode */ -+ /* SingleNet mode. */ - else { - Val64 = pAC->Pnmi.Port[0].ErrRecoveryCts + - pAC->Pnmi.Port[1].ErrRecoveryCts; -@@ -4367,7 +4248,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_GEN_RCV_ERROR: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { - Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[NetIndex].RxNoBufCts; - } -@@ -4376,7 +4257,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - - /* -- * by default 32bit values are evaluated -+ * By default 32bit values are evaluated. - */ - if (!Is64BitReq) { - Val32 = (SK_U32)Val64; -@@ -4390,7 +4271,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_GEN_XMIT_ERROR: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { - Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[NetIndex].TxNoBufCts; - } -@@ -4399,7 +4280,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - - /* -- * by default 32bit values are evaluated -+ * By default 32bit values are evaluated. - */ - if (!Is64BitReq) { - Val32 = (SK_U32)Val64; -@@ -4413,16 +4294,19 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_GEN_RCV_NO_BUFFER: -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { -- Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts; -+ Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts + -+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex); -+ - } - else { -- Val64 = pAC->Pnmi.Port[NetIndex].RxNoBufCts; -+ Val64 = pAC->Pnmi.Port[NetIndex].RxNoBufCts + -+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex); - } - - /* -- * by default 32bit values are evaluated -+ * By default 32bit values are evaluated. - */ - if (!Is64BitReq) { - Val32 = (SK_U32)Val64; -@@ -4442,8 +4326,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR034, -- SK_PNMI_ERR034MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR034, SK_PNMI_ERR034MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -4500,25 +4383,17 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 Val32; - SK_U64 Val64; - -- -- /* -- * Check instance. Only single instance OIDs are allowed here. -- */ -+ /* Check instance. Only single instance OIDs are allowed here. */ - if (Instance != (SK_U32)(-1) && Instance != 1) { - - *pLen = 0; - return (SK_PNMI_ERR_UNKNOWN_INST); - } - -- /* -- * Perform the requested action. -- */ -+ /* Perform the requested action. */ - if (Action == SK_PNMI_GET) { - -- /* -- * Check if the buffer length is large enough. -- */ -- -+ /* Check if the buffer length is large enough. */ - switch (Id) { - - case OID_SKGE_RLMT_MODE: -@@ -4551,8 +4426,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR035, -- SK_PNMI_ERR035MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR035, SK_PNMI_ERR035MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -4571,9 +4445,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - pAC->Pnmi.RlmtUpdatedFlag ++; - -- /* -- * Retrieve Value -- */ -+ /* Retrieve value. */ - switch (Id) { - - case OID_SKGE_RLMT_MODE: -@@ -4651,17 +4523,17 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - pAC->Pnmi.RlmtUpdatedFlag --; - } - else { -- /* Perform a preset or set */ -+ /* Perform a PRESET or SET. */ - switch (Id) { - - case OID_SKGE_RLMT_MODE: -- /* Check if the buffer length is plausible */ -+ /* Check if the buffer length is plausible. */ - if (*pLen < sizeof(char)) { - - *pLen = sizeof(char); - return (SK_PNMI_ERR_TOO_SHORT); - } -- /* Check if the value range is correct */ -+ /* Check if the value range is correct. */ - if (*pLen != sizeof(char) || - (*pBuf & SK_PNMI_RLMT_MODE_CHK_LINK) == 0 || - *(SK_U8 *)pBuf > 15) { -@@ -4669,21 +4541,21 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - *pLen = 0; - return (SK_PNMI_ERR_OK); - } -- /* Send an event to RLMT to change the mode */ -+ /* Send an event to RLMT to change the mode. */ - SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); -+ - EventParam.Para32[0] |= (SK_U32)(*pBuf); - EventParam.Para32[1] = 0; - if (SkRlmtEvent(pAC, IoC, SK_RLMT_MODE_CHANGE, - EventParam) > 0) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR037, -- SK_PNMI_ERR037MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR037, SK_PNMI_ERR037MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -4691,20 +4563,25 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_RLMT_PORT_PREFERRED: -- /* Check if the buffer length is plausible */ -+ /* PRESET/SET action makes no sense in Dual Net mode. */ -+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { -+ break; -+ } -+ -+ /* Check if the buffer length is plausible. */ - if (*pLen < sizeof(char)) { - - *pLen = sizeof(char); - return (SK_PNMI_ERR_TOO_SHORT); - } -- /* Check if the value range is correct */ -+ /* Check if the value range is correct. */ - if (*pLen != sizeof(char) || *(SK_U8 *)pBuf > - (SK_U8)pAC->GIni.GIMacsFound) { - - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - *pLen = 0; -@@ -4717,13 +4594,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - * make the decision which is the preferred port. - */ - SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); -+ - EventParam.Para32[0] = (SK_U32)(*pBuf) - 1; - EventParam.Para32[1] = NetIndex; - if (SkRlmtEvent(pAC, IoC, SK_RLMT_PREFPORT_CHANGE, - EventParam) > 0) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR038, -- SK_PNMI_ERR038MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR038, SK_PNMI_ERR038MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -4731,22 +4608,20 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_SKGE_RLMT_CHANGE_THRES: -- /* Check if the buffer length is plausible */ -+ /* Check if the buffer length is plausible. */ - if (*pLen < sizeof(SK_U64)) { - - *pLen = sizeof(SK_U64); - return (SK_PNMI_ERR_TOO_SHORT); - } -- /* -- * There are not many restrictions to the -- * value range. -- */ -+ -+ /* There are not many restrictions to the value range. */ - if (*pLen != sizeof(SK_U64)) { - - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } -- /* A preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - *pLen = 0; -@@ -4761,7 +4636,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- /* The other OIDs are not be able for set */ -+ /* The other OIDs are not be able for set. */ - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } -@@ -4806,54 +4681,49 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 Val32; - SK_U64 Val64; - -- /* -- * Calculate the port indexes from the instance. -- */ -+ -+ /* Calculate the port indexes from the instance. */ - PhysPortMax = pAC->GIni.GIMacsFound; - - if ((Instance != (SK_U32)(-1))) { -- /* Check instance range */ -+ /* Check instance range. */ - if ((Instance < 1) || (Instance > PhysPortMax)) { - - *pLen = 0; - return (SK_PNMI_ERR_UNKNOWN_INST); - } - -- /* Single net mode */ -+ /* SingleNet mode. */ - PhysPortIndex = Instance - 1; - -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - PhysPortIndex = NetIndex; - } - -- /* Both net modes */ -+ /* Both net modes. */ - Limit = PhysPortIndex + 1; - } - else { -- /* Single net mode */ -+ /* SingleNet mode. */ - PhysPortIndex = 0; - Limit = PhysPortMax; - -- /* Dual net mode */ -+ /* DualNet mode. */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - PhysPortIndex = NetIndex; - Limit = PhysPortIndex + 1; - } - } - -- /* -- * Currently only get requests are allowed. -- */ -+ /* Currently only GET requests are allowed. */ - if (Action != SK_PNMI_GET) { - - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* -- * Check if the buffer length is large enough. -- */ -+ /* Check if the buffer length is large enough. */ - switch (Id) { - - case OID_SKGE_RLMT_PORT_INDEX: -@@ -4877,8 +4747,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR039, -- SK_PNMI_ERR039MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR039, SK_PNMI_ERR039MSG); - - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -4896,9 +4765,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - pAC->Pnmi.RlmtUpdatedFlag ++; - -- /* -- * Get value -- */ -+ /* Get value. */ - Offset = 0; - for (; PhysPortIndex < Limit; PhysPortIndex ++) { - -@@ -5011,19 +4878,21 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - int Ret; - SK_EVPARA EventParam; - SK_U32 Val32; -+#ifdef SK_PHY_LP_MODE -+ SK_U8 CurrentPhyPowerState; -+#endif /* SK_PHY_LP_MODE */ - -- /* -- * Calculate instance if wished. MAC index 0 is the virtual MAC. -- */ -+ -+ /* Calculate instance if wished. MAC index 0 is the virtual MAC. */ - PhysPortMax = pAC->GIni.GIMacsFound; - LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax); - -- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */ -+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */ - LogPortMax--; - } - -- if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */ -- /* Check instance range */ -+ if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried. */ -+ /* Check instance range. */ - if ((Instance < 1) || (Instance > LogPortMax)) { - - *pLen = 0; -@@ -5033,18 +4902,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Limit = LogPortIndex + 1; - } - -- else { /* Instance == (SK_U32)(-1), get all Instances of that OID */ -+ else { /* Instance == (SK_U32)(-1), get all Instances of that OID. */ - - LogPortIndex = 0; - Limit = LogPortMax; - } - -- /* -- * Perform action -- */ -+ /* Perform action. */ - if (Action == SK_PNMI_GET) { - -- /* Check length */ -+ /* Check length. */ - switch (Id) { - - case OID_SKGE_PMD: -@@ -5082,8 +4949,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR041, -- SK_PNMI_ERR041MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR041, SK_PNMI_ERR041MSG); - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } -@@ -5099,9 +4965,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - pAC->Pnmi.SirqUpdatedFlag ++; - -- /* -- * Get value -- */ -+ /* Get value. */ - Offset = 0; - for (; LogPortIndex < Limit; LogPortIndex ++) { - -@@ -5111,107 +4975,99 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - case OID_SKGE_PMD: - *pBufPtr = pAC->Pnmi.PMD; -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_CONNECTOR: - *pBufPtr = pAC->Pnmi.Connector; -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_PHY_TYPE: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { - continue; - } -- else { -- /* Get value for physical ports */ -- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( -- pAC, LogPortIndex); -- Val32 = pAC->GIni.GP[PhysPortIndex].PhyType; -- SK_PNMI_STORE_U32(pBufPtr, Val32); -- } -+ /* Get value for physical port. */ -+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); -+ Val32 = pAC->GIni.GP[PhysPortIndex].PhyType; - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - Val32 = pAC->GIni.GP[NetIndex].PhyType; -- SK_PNMI_STORE_U32(pBufPtr, Val32); - } -+ SK_PNMI_STORE_U32(pBufPtr, Val32); - Offset += sizeof(SK_U32); - break; - - #ifdef SK_PHY_LP_MODE - case OID_SKGE_PHY_LP_MODE: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { - continue; - } -- else { -- /* Get value for physical ports */ -- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); -- Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState; -- *pBufPtr = Val8; -- } -+ /* Get value for physical port. */ -+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); -+ *pBufPtr = (SK_U8)pAC->GIni.GP[PhysPortIndex].PPhyPowerState; - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - -- Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState; -- *pBufPtr = Val8; -+ *pBufPtr = (SK_U8)pAC->GIni.GP[NetIndex].PPhyPowerState; - } - Offset += sizeof(SK_U8); - break; - #endif - - case OID_SKGE_LINK_CAP: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical ports */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkCap; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PLinkCap; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_LINK_MODE: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical ports */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkModeConf; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PLinkModeConf; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_LINK_MODE_STATUS: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical port */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - -@@ -5219,147 +5075,147 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - CalculateLinkModeStatus(pAC, IoC, PhysPortIndex); - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = CalculateLinkModeStatus(pAC, IoC, NetIndex); - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_LINK_STATUS: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical ports */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = CalculateLinkStatus(pAC, IoC, PhysPortIndex); - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = CalculateLinkStatus(pAC, IoC, NetIndex); - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_FLOWCTRL_CAP: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical ports */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlCap; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlCap; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_FLOWCTRL_MODE: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical port */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlMode; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlMode; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_FLOWCTRL_STATUS: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical port */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlStatus; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlStatus; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_PHY_OPERATION_CAP: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet Mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical ports */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSCap; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PMSCap; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_PHY_OPERATION_MODE: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical port */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSMode; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PMSMode; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_PHY_OPERATION_STATUS: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical port */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - -@@ -5370,70 +5226,70 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - *pBufPtr = pAC->GIni.GP[NetIndex].PMSStatus; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_SPEED_CAP: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical ports */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedCap; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedCap; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_SPEED_MODE: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical port */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeed; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeed; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_SPEED_STATUS: -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { -- /* Get value for virtual port */ -+ /* Get value for virtual port. */ - VirtualConf(pAC, IoC, Id, pBufPtr); - } - else { -- /* Get value for physical port */ -+ /* Get value for physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( - pAC, LogPortIndex); - - *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed; - } - } -- else { /* DualNetMode */ -+ else { /* DualNet mode. */ - - *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedUsed; - } -- Offset += sizeof(char); -+ Offset ++; - break; - - case OID_SKGE_MTU: -@@ -5486,40 +5342,33 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_TOO_SHORT); - } - break; --#endif -+#endif /* SK_PHY_LP_MODE */ - - case OID_SKGE_MTU: -- if (*pLen < sizeof(SK_U32)) { -+ if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U32)) { - -- *pLen = sizeof(SK_U32); -+ *pLen = (Limit - LogPortIndex) * sizeof(SK_U32); - return (SK_PNMI_ERR_TOO_SHORT); - } -- if (*pLen != sizeof(SK_U32)) { -- -- *pLen = 0; -- return (SK_PNMI_ERR_BAD_VALUE); -- } - break; -- -+ - default: - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* -- * Perform preset or set -- */ -+ /* Perform PRESET or SET. */ - Offset = 0; - for (; LogPortIndex < Limit; LogPortIndex ++) { - -+ Val8 = *(pBuf + Offset); -+ - switch (Id) { - - case OID_SKGE_LINK_MODE: -- /* Check the value range */ -- Val8 = *(pBuf + Offset); -+ /* Check the value range. */ - if (Val8 == 0) { -- -- Offset += sizeof(char); -+ Offset++; - break; - } - if (Val8 < SK_LMODE_HALF || -@@ -5530,51 +5379,68 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - return (SK_PNMI_ERR_OK); - } - -- if (LogPortIndex == 0) { -- -- /* -- * The virtual port consists of all currently -- * active ports. Find them and send an event -- * with the new link mode to SIRQ. -- */ -- for (PhysPortIndex = 0; -- PhysPortIndex < PhysPortMax; -- PhysPortIndex ++) { -- -- if (!pAC->Pnmi.Port[PhysPortIndex]. -- ActiveFlag) { -- -- continue; -- } -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ -+ if (LogPortIndex == 0) { -+ /* -+ * The virtual port consists of all currently -+ * active ports. Find them and send an event -+ * with the new link mode to SIRQ. -+ */ -+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; -+ PhysPortIndex ++) { - -- EventParam.Para32[0] = PhysPortIndex; -+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { -+ continue; -+ } -+ -+ EventParam.Para32[0] = PhysPortIndex; -+ EventParam.Para32[1] = (SK_U32)Val8; -+ if (SkGeSirqEvent(pAC, IoC, -+ SK_HWEV_SET_LMODE, -+ EventParam) > 0) { -+ -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, -+ SK_PNMI_ERR043, -+ SK_PNMI_ERR043MSG); -+ -+ *pLen = 0; -+ return (SK_PNMI_ERR_GENERAL); -+ } -+ } /* for */ -+ } -+ else { -+ /* -+ * Send an event with the new link mode to -+ * the SIRQ module. -+ */ -+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -+ pAC, LogPortIndex); - EventParam.Para32[1] = (SK_U32)Val8; -- if (SkGeSirqEvent(pAC, IoC, -- SK_HWEV_SET_LMODE, -+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_LMODE, - EventParam) > 0) { -- -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW, - SK_PNMI_ERR043, - SK_PNMI_ERR043MSG); -- -+ - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } - } - } -- else { -+ else { /* DualNet mode. */ -+ - /* - * Send an event with the new link mode to - * the SIRQ module. - */ -- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -- pAC, LogPortIndex); -+ EventParam.Para32[0] = NetIndex; - EventParam.Para32[1] = (SK_U32)Val8; - if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_LMODE, - EventParam) > 0) { -@@ -5587,15 +5453,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_GENERAL); - } - } -- Offset += sizeof(char); -+ Offset++; - break; - - case OID_SKGE_FLOWCTRL_MODE: -- /* Check the value range */ -- Val8 = *(pBuf + Offset); -+ /* Check the value range. */ - if (Val8 == 0) { -- -- Offset += sizeof(char); -+ Offset++; - break; - } - if (Val8 < SK_FLOW_MODE_NONE || -@@ -5606,30 +5470,48 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - return (SK_PNMI_ERR_OK); - } - -- if (LogPortIndex == 0) { -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ -+ if (LogPortIndex == 0) { -+ /* -+ * The virtual port consists of all currently -+ * active ports. Find them and send an event -+ * with the new flow control mode to SIRQ. -+ */ -+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; -+ PhysPortIndex ++) { - -- /* -- * The virtual port consists of all currently -- * active ports. Find them and send an event -- * with the new flow control mode to SIRQ. -- */ -- for (PhysPortIndex = 0; -- PhysPortIndex < PhysPortMax; -- PhysPortIndex ++) { -+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { -+ continue; -+ } - -- if (!pAC->Pnmi.Port[PhysPortIndex]. -- ActiveFlag) { -+ EventParam.Para32[0] = PhysPortIndex; -+ EventParam.Para32[1] = (SK_U32)Val8; -+ if (SkGeSirqEvent(pAC, IoC, -+ SK_HWEV_SET_FLOWMODE, -+ EventParam) > 0) { -+ -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, -+ SK_PNMI_ERR044, -+ SK_PNMI_ERR044MSG); - -- continue; -+ *pLen = 0; -+ return (SK_PNMI_ERR_GENERAL); -+ } - } -- -- EventParam.Para32[0] = PhysPortIndex; -+ } -+ else { -+ /* -+ * Send an event with the new flow control -+ * mode to the SIRQ module. -+ */ -+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -+ pAC, LogPortIndex); - EventParam.Para32[1] = (SK_U32)Val8; - if (SkGeSirqEvent(pAC, IoC, - SK_HWEV_SET_FLOWMODE, -@@ -5644,17 +5526,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - } -- else { -+ else { /* DualNet mode. */ -+ - /* -- * Send an event with the new flow control -- * mode to the SIRQ module. -+ * Send an event with the new link mode to -+ * the SIRQ module. - */ -- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -- pAC, LogPortIndex); -+ EventParam.Para32[0] = NetIndex; - EventParam.Para32[1] = (SK_U32)Val8; -- if (SkGeSirqEvent(pAC, IoC, -- SK_HWEV_SET_FLOWMODE, EventParam) -- > 0) { -+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_FLOWMODE, -+ EventParam) > 0) { - - SK_ERR_LOG(pAC, SK_ERRCL_SW, - SK_PNMI_ERR044, -@@ -5664,15 +5545,14 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_GENERAL); - } - } -- Offset += sizeof(char); -+ Offset++; - break; - - case OID_SKGE_PHY_OPERATION_MODE : -- /* Check the value range */ -- Val8 = *(pBuf + Offset); -+ /* Check the value range. */ - if (Val8 == 0) { -- /* mode of this port remains unchanged */ -- Offset += sizeof(char); -+ /* Mode of this port remains unchanged. */ -+ Offset++; - break; - } - if (Val8 < SK_MS_MODE_AUTO || -@@ -5683,34 +5563,51 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - return (SK_PNMI_ERR_OK); - } - -- if (LogPortIndex == 0) { -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ -+ if (LogPortIndex == 0) { -+ /* -+ * The virtual port consists of all currently -+ * active ports. Find them and send an event -+ * with new master/slave (role) mode to SIRQ. -+ */ -+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; -+ PhysPortIndex ++) { - -- /* -- * The virtual port consists of all currently -- * active ports. Find them and send an event -- * with new master/slave (role) mode to SIRQ. -- */ -- for (PhysPortIndex = 0; -- PhysPortIndex < PhysPortMax; -- PhysPortIndex ++) { -+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { -+ continue; -+ } - -- if (!pAC->Pnmi.Port[PhysPortIndex]. -- ActiveFlag) { -+ EventParam.Para32[0] = PhysPortIndex; -+ EventParam.Para32[1] = (SK_U32)Val8; -+ if (SkGeSirqEvent(pAC, IoC, -+ SK_HWEV_SET_ROLE, -+ EventParam) > 0) { -+ -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, -+ SK_PNMI_ERR042, -+ SK_PNMI_ERR042MSG); - -- continue; -+ *pLen = 0; -+ return (SK_PNMI_ERR_GENERAL); -+ } - } -- -- EventParam.Para32[0] = PhysPortIndex; -+ } -+ else { -+ /* -+ * Send an event with the new master/slave -+ * (role) mode to the SIRQ module. -+ */ -+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -+ pAC, LogPortIndex); - EventParam.Para32[1] = (SK_U32)Val8; - if (SkGeSirqEvent(pAC, IoC, -- SK_HWEV_SET_ROLE, -- EventParam) > 0) { -+ SK_HWEV_SET_ROLE, EventParam) > 0) { - - SK_ERR_LOG(pAC, SK_ERRCL_SW, - SK_PNMI_ERR042, -@@ -5721,16 +5618,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - } -- else { -+ else { /* DualNet mode. */ -+ - /* -- * Send an event with the new master/slave -- * (role) mode to the SIRQ module. -+ * Send an event with the new link mode to -+ * the SIRQ module. - */ -- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -- pAC, LogPortIndex); -+ EventParam.Para32[0] = NetIndex; - EventParam.Para32[1] = (SK_U32)Val8; -- if (SkGeSirqEvent(pAC, IoC, -- SK_HWEV_SET_ROLE, EventParam) > 0) { -+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_ROLE, -+ EventParam) > 0) { - - SK_ERR_LOG(pAC, SK_ERRCL_SW, - SK_PNMI_ERR042, -@@ -5740,16 +5637,13 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_GENERAL); - } - } -- -- Offset += sizeof(char); -+ Offset++; - break; - - case OID_SKGE_SPEED_MODE: -- /* Check the value range */ -- Val8 = *(pBuf + Offset); -+ /* Check the value range. */ - if (Val8 == 0) { -- -- Offset += sizeof(char); -+ Offset++; - break; - } - if (Val8 < (SK_LSPEED_AUTO) || -@@ -5760,29 +5654,49 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - return (SK_PNMI_ERR_OK); - } - -- if (LogPortIndex == 0) { -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ -+ if (LogPortIndex == 0) { - -- /* -- * The virtual port consists of all currently -- * active ports. Find them and send an event -- * with the new flow control mode to SIRQ. -- */ -- for (PhysPortIndex = 0; -- PhysPortIndex < PhysPortMax; -- PhysPortIndex ++) { -+ /* -+ * The virtual port consists of all currently -+ * active ports. Find them and send an event -+ * with the new flow control mode to SIRQ. -+ */ -+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; -+ PhysPortIndex ++) { - -- if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { -+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { -+ continue; -+ } - -- continue; -- } -+ EventParam.Para32[0] = PhysPortIndex; -+ EventParam.Para32[1] = (SK_U32)Val8; -+ if (SkGeSirqEvent(pAC, IoC, -+ SK_HWEV_SET_SPEED, -+ EventParam) > 0) { -+ -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, -+ SK_PNMI_ERR045, -+ SK_PNMI_ERR045MSG); - -- EventParam.Para32[0] = PhysPortIndex; -+ *pLen = 0; -+ return (SK_PNMI_ERR_GENERAL); -+ } -+ } -+ } -+ else { -+ /* -+ * Send an event with the new flow control -+ * mode to the SIRQ module. -+ */ -+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -+ pAC, LogPortIndex); - EventParam.Para32[1] = (SK_U32)Val8; - if (SkGeSirqEvent(pAC, IoC, - SK_HWEV_SET_SPEED, -@@ -5797,16 +5711,15 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - } -- else { -+ else { /* DualNet mode. */ -+ - /* -- * Send an event with the new flow control -- * mode to the SIRQ module. -+ * Send an event with the new link mode to -+ * the SIRQ module. - */ -- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS( -- pAC, LogPortIndex); -+ EventParam.Para32[0] = NetIndex; - EventParam.Para32[1] = (SK_U32)Val8; -- if (SkGeSirqEvent(pAC, IoC, -- SK_HWEV_SET_SPEED, -+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_SPEED, - EventParam) > 0) { - - SK_ERR_LOG(pAC, SK_ERRCL_SW, -@@ -5817,23 +5730,25 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_GENERAL); - } - } -- Offset += sizeof(char); -+ Offset++; - break; - -- case OID_SKGE_MTU : -- /* Check the value range */ -- Val32 = *(SK_U32*)(pBuf + Offset); -+ case OID_SKGE_MTU: -+ /* Check the value range. */ -+ SK_PNMI_READ_U32((pBuf + Offset), Val32); -+ - if (Val32 == 0) { -- /* mtu of this port remains unchanged */ -+ /* MTU of this port remains unchanged. */ - Offset += sizeof(SK_U32); - break; - } -+ - if (SK_DRIVER_PRESET_MTU(pAC, IoC, NetIndex, Val32) != 0) { - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } - -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - return (SK_PNMI_ERR_OK); - } -@@ -5844,116 +5759,69 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - Offset += sizeof(SK_U32); - break; -- -+ - #ifdef SK_PHY_LP_MODE - case OID_SKGE_PHY_LP_MODE: -- /* The preset ends here */ -+ /* The PRESET ends here. */ - if (Action == SK_PNMI_PRESET) { - - return (SK_PNMI_ERR_OK); - } - -- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ -+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */ - if (LogPortIndex == 0) { - Offset = 0; - continue; - } -- else { -- /* Set value for physical ports */ -- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); -- -- switch (*(pBuf + Offset)) { -- case 0: -- /* If LowPowerMode is active, we can leave it. */ -- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { -- -- Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex); -- -- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) { -- -- SkDrvInitAdapter(pAC); -- } -- break; -- } -- else { -- *pLen = 0; -- return (SK_PNMI_ERR_GENERAL); -- } -- case 1: -- case 2: -- case 3: -- case 4: -- /* If no LowPowerMode is active, we can enter it. */ -- if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { -- -- if ((*(pBuf + Offset)) < 3) { -- -- SkDrvDeInitAdapter(pAC); -- } -- -- Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf); -- break; -- } -- else { -- *pLen = 0; -- return (SK_PNMI_ERR_GENERAL); -- } -- default: -- *pLen = 0; -- return (SK_PNMI_ERR_BAD_VALUE); -- } -- } - } -- else { /* DualNetMode */ -- -- switch (*(pBuf + Offset)) { -- case 0: -- /* If we are in a LowPowerMode, we can leave it. */ -- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { -+ /* Set value for physical port. */ -+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); -+ CurrentPhyPowerState = pAC->GIni.GP[PhysPortIndex].PPhyPowerState; - -- Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex); -- -- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) { -+ switch (Val8) { -+ case PHY_PM_OPERATIONAL_MODE: -+ /* If LowPowerMode is active, we can leave it. */ -+ if (CurrentPhyPowerState) { - -- SkDrvInitAdapter(pAC); -- } -- break; -- } -- else { -- *pLen = 0; -- return (SK_PNMI_ERR_GENERAL); -- } -- -- case 1: -- case 2: -- case 3: -- case 4: -- /* If we are not already in LowPowerMode, we can enter it. */ -- if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) { -- -- if ((*(pBuf + Offset)) < 3) { -- -- SkDrvDeInitAdapter(pAC); -- } -- else { -- -- Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf); -- } -- break; -- } -- else { -- *pLen = 0; -- return (SK_PNMI_ERR_GENERAL); -+ Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex); -+ -+ if ((CurrentPhyPowerState == PHY_PM_DEEP_SLEEP) || -+ (CurrentPhyPowerState == PHY_PM_IEEE_POWER_DOWN)) { -+ -+ SkDrvInitAdapter(pAC); - } -- -- default: -+ break; -+ } -+ else { - *pLen = 0; -- return (SK_PNMI_ERR_BAD_VALUE); -- } -+ return (SK_PNMI_ERR_GENERAL); -+ } -+ case PHY_PM_DEEP_SLEEP: -+ case PHY_PM_IEEE_POWER_DOWN: -+ /* If no LowPowerMode is active, we can enter it. */ -+ if (!CurrentPhyPowerState) { -+ SkDrvDeInitAdapter(pAC); -+ } -+ -+ case PHY_PM_ENERGY_DETECT: -+ case PHY_PM_ENERGY_DETECT_PLUS: -+ /* If no LowPowerMode is active, we can enter it. */ -+ if (!CurrentPhyPowerState) { -+ -+ Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf); -+ break; -+ } -+ else { -+ *pLen = 0; -+ return (SK_PNMI_ERR_GENERAL); -+ } -+ default: -+ *pLen = 0; -+ return (SK_PNMI_ERR_BAD_VALUE); - } -- Offset += sizeof(SK_U8); -+ Offset++; - break; --#endif -+#endif /* SK_PHY_LP_MODE */ - - default: - SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR, -@@ -6003,14 +5871,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - unsigned int Limit; - unsigned int Offset; - unsigned int Entries; -- - -- /* -- * Calculate instance if wished. -- */ -- /* XXX Not yet implemented. Return always an empty table. */ -+ /* Not implemented yet. Return always an empty table. */ - Entries = 0; - -+ /* Calculate instance if wished. */ - if ((Instance != (SK_U32)(-1))) { - - if ((Instance < 1) || (Instance > Entries)) { -@@ -6027,12 +5892,10 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - Limit = Entries; - } - -- /* -- * Get/Set value -- */ -+ /* GET/SET value. */ - if (Action == SK_PNMI_GET) { - -- for (Offset=0; Index < Limit; Index ++) { -+ for (Offset = 0; Index < Limit; Index ++) { - - switch (Id) { - -@@ -6054,32 +5917,29 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - *pLen = Offset; - } - else { -- /* Only MONITOR_ADMIN can be set */ -+ /* Only MONITOR_ADMIN can be set. */ - if (Id != OID_SKGE_RLMT_MONITOR_ADMIN) { - - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } - -- /* Check if the length is plausible */ -+ /* Check if the length is plausible. */ - if (*pLen < (Limit - Index)) { - - return (SK_PNMI_ERR_TOO_SHORT); - } -- /* Okay, we have a wide value range */ -+ /* Okay, we have a wide value range. */ - if (*pLen != (Limit - Index)) { - - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } --/* -- for (Offset=0; Index < Limit; Index ++) { -- } --*/ --/* -- * XXX Not yet implemented. Return always BAD_VALUE, because the table -- * is empty. -- */ -+ -+ /* -+ * Not yet implemented. Return always BAD_VALUE, -+ * because the table is empty. -+ */ - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } -@@ -6120,14 +5980,12 @@ char *pBuf) /* Buffer used for the mana - PortActiveFlag = SK_FALSE; - PhysPortMax = pAC->GIni.GIMacsFound; - -- for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; -- PhysPortIndex ++) { -+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; PhysPortIndex ++) { - - pPrt = &pAC->GIni.GP[PhysPortIndex]; - -- /* Check if the physical port is active */ -+ /* Check if the physical port is active. */ - if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { -- - continue; - } - -@@ -6136,12 +5994,13 @@ char *pBuf) /* Buffer used for the mana - switch (Id) { - - case OID_SKGE_PHY_TYPE: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - Val32 = pPrt->PhyType; - SK_PNMI_STORE_U32(pBuf, Val32); - continue; - } -+ break; - - case OID_SKGE_LINK_CAP: - -@@ -6155,7 +6014,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_LINK_MODE: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PLinkModeConf; -@@ -6163,9 +6022,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different link -- * mode than the first one we return a value that -- * indicates that the link mode is indeterminated. -+ * If we find an active port with a different link mode -+ * than the first one we return indeterminated. - */ - if (*pBuf != pPrt->PLinkModeConf) { - -@@ -6174,10 +6032,10 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_LINK_MODE_STATUS: -- /* Get the link mode of the physical port */ -+ /* Get the link mode of the physical port. */ - Val8 = CalculateLinkModeStatus(pAC, IoC, PhysPortIndex); - -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = Val8; -@@ -6185,10 +6043,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different link -- * mode status than the first one we return a value -- * that indicates that the link mode status is -- * indeterminated. -+ * If we find an active port with a different link mode status -+ * than the first one we return indeterminated. - */ - if (*pBuf != Val8) { - -@@ -6197,10 +6053,10 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_LINK_STATUS: -- /* Get the link status of the physical port */ -+ /* Get the link status of the physical port. */ - Val8 = CalculateLinkStatus(pAC, IoC, PhysPortIndex); - -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = Val8; -@@ -6208,10 +6064,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different link -- * status than the first one, we return a value -- * that indicates that the link status is -- * indeterminated. -+ * If we find an active port with a different link status -+ * than the first one we return indeterminated. - */ - if (*pBuf != Val8) { - -@@ -6220,7 +6074,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_FLOWCTRL_CAP: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PFlowCtrlCap; -@@ -6235,7 +6089,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_FLOWCTRL_MODE: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PFlowCtrlMode; -@@ -6243,9 +6097,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different flow -- * control mode than the first one, we return a value -- * that indicates that the mode is indeterminated. -+ * If we find an active port with a different flow-control mode -+ * than the first one we return indeterminated. - */ - if (*pBuf != pPrt->PFlowCtrlMode) { - -@@ -6254,7 +6107,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_FLOWCTRL_STATUS: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PFlowCtrlStatus; -@@ -6262,10 +6115,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different flow -- * control status than the first one, we return a -- * value that indicates that the status is -- * indeterminated. -+ * If we find an active port with a different flow-control status -+ * than the first one we return indeterminated. - */ - if (*pBuf != pPrt->PFlowCtrlStatus) { - -@@ -6274,7 +6125,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_PHY_OPERATION_CAP: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PMSCap; -@@ -6289,7 +6140,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_PHY_OPERATION_MODE: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PMSMode; -@@ -6297,9 +6148,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different master/ -- * slave mode than the first one, we return a value -- * that indicates that the mode is indeterminated. -+ * If we find an active port with a different master/slave mode -+ * than the first one we return indeterminated. - */ - if (*pBuf != pPrt->PMSMode) { - -@@ -6308,7 +6158,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_PHY_OPERATION_STATUS: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PMSStatus; -@@ -6316,10 +6166,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different master/ -- * slave status than the first one, we return a -- * value that indicates that the status is -- * indeterminated. -+ * If we find an active port with a different master/slave status -+ * than the first one we return indeterminated. - */ - if (*pBuf != pPrt->PMSStatus) { - -@@ -6328,7 +6176,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_SPEED_MODE: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PLinkSpeed; -@@ -6336,9 +6184,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different flow -- * control mode than the first one, we return a value -- * that indicates that the mode is indeterminated. -+ * If we find an active port with a different link speed -+ * than the first one we return indeterminated. - */ - if (*pBuf != pPrt->PLinkSpeed) { - -@@ -6347,7 +6194,7 @@ char *pBuf) /* Buffer used for the mana - break; - - case OID_SKGE_SPEED_STATUS: -- /* Check if it is the first active port */ -+ /* Check if it is the first active port. */ - if (*pBuf == 0) { - - *pBuf = pPrt->PLinkSpeedUsed; -@@ -6355,10 +6202,8 @@ char *pBuf) /* Buffer used for the mana - } - - /* -- * If we find an active port with a different flow -- * control status than the first one, we return a -- * value that indicates that the status is -- * indeterminated. -+ * If we find an active port with a different link speed used -+ * than the first one we return indeterminated. - */ - if (*pBuf != pPrt->PLinkSpeedUsed) { - -@@ -6368,9 +6213,7 @@ char *pBuf) /* Buffer used for the mana - } - } - -- /* -- * If no port is active return an indeterminated answer -- */ -+ /* If no port is active return an indeterminated answer. */ - if (!PortActiveFlag) { - - switch (Id) { -@@ -6487,16 +6330,15 @@ unsigned int PhysPortIndex) /* Physical - { - SK_U8 Result; - -- /* Get the current mode, which can be full or half duplex */ -+ /* Get the current mode, which can be full or half duplex. */ - Result = pAC->GIni.GP[PhysPortIndex].PLinkModeStatus; - -- /* Check if no valid mode could be found (link is down) */ -+ /* Check if no valid mode could be found (link is down). */ - if (Result < SK_LMODE_STAT_HALF) { - - Result = SK_LMODE_STAT_UNKNOWN; - } - else if (pAC->GIni.GP[PhysPortIndex].PLinkMode >= SK_LMODE_AUTOHALF) { -- - /* - * Auto-negotiation was used to bring up the link. Change - * the already found duplex status that it indicates -@@ -6541,22 +6383,22 @@ unsigned int *pKeyNo) /* Number of keys - int Index; - int Ret; - -- - SK_MEMSET(pKeyArr, 0, KeyArrLen); - -- /* -- * Get VPD key list -- */ -- Ret = VpdKeys(pAC, IoC, (char *)&BufKeys, (int *)&BufKeysLen, -+ /* Get VPD key list. */ -+ Ret = VpdKeys(pAC, IoC, BufKeys, (int *)&BufKeysLen, - (int *)pKeyNo); -+ - if (Ret > 0) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR014, -- SK_PNMI_ERR014MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR014MSG)); - -+ /* Please read comment in Vpd(). */ -+ pAC->Pnmi.VpdKeyReadError = SK_TRUE; - return (SK_PNMI_ERR_GENERAL); - } -- /* If no keys are available return now */ -+ /* If no keys are available return now. */ - if (*pKeyNo == 0 || BufKeysLen == 0) { - - return (SK_PNMI_ERR_OK); -@@ -6564,12 +6406,12 @@ unsigned int *pKeyNo) /* Number of keys - /* - * If the key list is too long for us trunc it and give a - * errorlog notification. This case should not happen because -- * the maximum number of keys is limited due to RAM limitations -+ * the maximum number of keys is limited due to RAM limitations. - */ - if (*pKeyNo > SK_PNMI_VPD_ENTRIES) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR015, -- SK_PNMI_ERR015MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR015MSG)); - - *pKeyNo = SK_PNMI_VPD_ENTRIES; - } -@@ -6582,14 +6424,14 @@ unsigned int *pKeyNo) /* Number of keys - Offset ++) { - - if (BufKeys[Offset] != 0) { -- - continue; - } - - if (Offset - StartOffset > SK_PNMI_VPD_KEY_SIZE) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR016, -- SK_PNMI_ERR016MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, -+ (SK_PNMI_ERR016MSG)); -+ - return (SK_PNMI_ERR_GENERAL); - } - -@@ -6600,7 +6442,7 @@ unsigned int *pKeyNo) /* Number of keys - StartOffset = Offset + 1; - } - -- /* Last key not zero terminated? Get it anyway */ -+ /* Last key not zero terminated? Get it anyway. */ - if (StartOffset < Offset) { - - SK_STRNCPY(pKeyArr + Index * SK_PNMI_VPD_KEY_SIZE, -@@ -6629,19 +6471,18 @@ SK_IOC IoC) /* IO context handle */ - { - SK_EVPARA EventParam; - -- - /* Was the module already updated during the current PNMI call? */ - if (pAC->Pnmi.SirqUpdatedFlag > 0) { - - return (SK_PNMI_ERR_OK); - } - -- /* Send an synchronuous update event to the module */ -+ /* Send an synchronuous update event to the module. */ - SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); -- if (SkGeSirqEvent(pAC, IoC, SK_HWEV_UPDATE_STAT, EventParam) > 0) { -+ -+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_UPDATE_STAT, EventParam)) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR047, -- SK_PNMI_ERR047MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR047, SK_PNMI_ERR047MSG); - - return (SK_PNMI_ERR_GENERAL); - } -@@ -6669,21 +6510,19 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - { - SK_EVPARA EventParam; - -- - /* Was the module already updated during the current PNMI call? */ - if (pAC->Pnmi.RlmtUpdatedFlag > 0) { - - return (SK_PNMI_ERR_OK); - } - -- /* Send an synchronuous update event to the module */ -+ /* Send an synchronuous update event to the module. */ - SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); - EventParam.Para32[0] = NetIndex; - EventParam.Para32[1] = (SK_U32)-1; - if (SkRlmtEvent(pAC, IoC, SK_RLMT_STATS_UPDATE, EventParam) > 0) { - -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR048, -- SK_PNMI_ERR048MSG); -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR048, SK_PNMI_ERR048MSG); - - return (SK_PNMI_ERR_GENERAL); - } -@@ -6721,20 +6560,20 @@ unsigned int LastMac) /* Index of the la - return (SK_PNMI_ERR_OK); - } - -- /* Send an update command to all MACs specified */ -+ /* Send an update command to all MACs specified. */ - for (MacIndex = FirstMac; MacIndex <= LastMac; MacIndex ++) { - - /* - * 2002-09-13 pweber: Freeze the current SW counters. - * (That should be done as close as - * possible to the update of the -- * HW counters) -+ * HW counters). - */ - if (pAC->GIni.GIMacType == SK_MAC_XMAC) { - pAC->Pnmi.BufPort[MacIndex] = pAC->Pnmi.Port[MacIndex]; - } - -- /* 2002-09-13 pweber: Update the HW counter */ -+ /* 2002-09-13 pweber: Update the HW counter. */ - if (pAC->GIni.GIFunc.pFnMacUpdateStats(pAC, IoC, MacIndex) != 0) { - - return (SK_PNMI_ERR_GENERAL); -@@ -6772,19 +6611,19 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U64 Val = 0; - - -- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */ -+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */ - - PhysPortIndex = NetIndex; - - Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex); - } -- else { /* Single Net mode */ -+ else { /* SingleNet mode. */ - - if (LogPortIndex == 0) { - - PhysPortMax = pAC->GIni.GIMacsFound; - -- /* Add counter of all active ports */ -+ /* Add counter of all active ports. */ - for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; - PhysPortIndex ++) { - -@@ -6794,11 +6633,11 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - } - -- /* Correct value because of port switches */ -+ /* Correct value because of port switches. */ - Val += pAC->Pnmi.VirtualCounterOffset[StatIndex]; - } - else { -- /* Get counter value of physical port */ -+ /* Get counter value of physical port. */ - PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); - - Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex); -@@ -6844,7 +6683,7 @@ unsigned int StatIndex) /* Index to sta - - MacType = pAC->GIni.GIMacType; - -- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ -+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */ - if (MacType == SK_MAC_XMAC) { - pPnmiPrt = &pAC->Pnmi.BufPort[PhysPortIndex]; - } -@@ -6912,7 +6751,7 @@ unsigned int StatIndex) /* Index to sta - case SK_PNMI_HTX_BURST: - case SK_PNMI_HTX_EXCESS_DEF: - case SK_PNMI_HTX_CARRIER: -- /* Not supported by GMAC */ -+ /* Not supported by GMAC. */ - if (MacType == SK_MAC_GMAC) { - return (Val); - } -@@ -6924,7 +6763,7 @@ unsigned int StatIndex) /* Index to sta - break; - - case SK_PNMI_HTX_MACC: -- /* GMAC only supports PAUSE MAC control frames */ -+ /* GMAC only supports PAUSE MAC control frames. */ - if (MacType == SK_MAC_GMAC) { - HelpIndex = SK_PNMI_HTX_PMACC; - } -@@ -6941,7 +6780,7 @@ unsigned int StatIndex) /* Index to sta - - case SK_PNMI_HTX_COL: - case SK_PNMI_HRX_UNDERSIZE: -- /* Not supported by XMAC */ -+ /* Not supported by XMAC. */ - if (MacType == SK_MAC_XMAC) { - return (Val); - } -@@ -6953,7 +6792,7 @@ unsigned int StatIndex) /* Index to sta - break; - - case SK_PNMI_HTX_DEFFERAL: -- /* Not supported by GMAC */ -+ /* Not supported by GMAC. */ - if (MacType == SK_MAC_GMAC) { - return (Val); - } -@@ -6971,7 +6810,7 @@ unsigned int StatIndex) /* Index to sta - HighVal = 0; - } - else { -- /* Otherwise get contents of hardware register */ -+ /* Otherwise get contents of hardware register. */ - (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, - StatAddr[StatIndex][MacType].Reg, - &LowVal); -@@ -6980,7 +6819,7 @@ unsigned int StatIndex) /* Index to sta - break; - - case SK_PNMI_HRX_BADOCTET: -- /* Not supported by XMAC */ -+ /* Not supported by XMAC. */ - if (MacType == SK_MAC_XMAC) { - return (Val); - } -@@ -6999,7 +6838,7 @@ unsigned int StatIndex) /* Index to sta - return (Val); - - case SK_PNMI_HRX_LONGFRAMES: -- /* For XMAC the SW counter is managed by PNMI */ -+ /* For XMAC the SW counter is managed by PNMI. */ - if (MacType == SK_MAC_XMAC) { - return (pPnmiPrt->StatRxLongFrameCts); - } -@@ -7019,7 +6858,7 @@ unsigned int StatIndex) /* Index to sta - Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal); - - if (MacType == SK_MAC_GMAC) { -- /* For GMAC the SW counter is additionally managed by PNMI */ -+ /* For GMAC the SW counter is additionally managed by PNMI. */ - Val += pPnmiPrt->StatRxFrameTooLongCts; - } - else { -@@ -7037,20 +6876,19 @@ unsigned int StatIndex) /* Index to sta - break; - - case SK_PNMI_HRX_SHORTS: -- /* Not supported by GMAC */ -+ /* Not supported by GMAC. */ - if (MacType == SK_MAC_GMAC) { - /* GM_RXE_FRAG?? */ - return (Val); - } - - /* -- * XMAC counts short frame errors even if link down (#10620) -- * -- * If link-down the counter remains constant -+ * XMAC counts short frame errors even if link down (#10620). -+ * If the link is down, the counter remains constant. - */ - if (pPrt->PLinkModeStatus != SK_LMODE_STAT_UNKNOWN) { - -- /* Otherwise get incremental difference */ -+ /* Otherwise get incremental difference. */ - (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, - StatAddr[StatIndex][MacType].Reg, - &LowVal); -@@ -7073,7 +6911,7 @@ unsigned int StatIndex) /* Index to sta - case SK_PNMI_HRX_IRLENGTH: - case SK_PNMI_HRX_SYMBOL: - case SK_PNMI_HRX_CEXT: -- /* Not supported by GMAC */ -+ /* Not supported by GMAC. */ - if (MacType == SK_MAC_GMAC) { - return (Val); - } -@@ -7085,7 +6923,7 @@ unsigned int StatIndex) /* Index to sta - break; - - case SK_PNMI_HRX_PMACC_ERR: -- /* For GMAC the SW counter is managed by PNMI */ -+ /* For GMAC the SW counter is managed by PNMI. */ - if (MacType == SK_MAC_GMAC) { - return (pPnmiPrt->StatRxPMaccErr); - } -@@ -7096,13 +6934,13 @@ unsigned int StatIndex) /* Index to sta - HighVal = pPnmiPrt->CounterHigh[StatIndex]; - break; - -- /* SW counter managed by PNMI */ -+ /* SW counter managed by PNMI. */ - case SK_PNMI_HTX_SYNC: - LowVal = (SK_U32)pPnmiPrt->StatSyncCts; - HighVal = (SK_U32)(pPnmiPrt->StatSyncCts >> 32); - break; - -- /* SW counter managed by PNMI */ -+ /* SW counter managed by PNMI. */ - case SK_PNMI_HTX_SYNC_OCTET: - LowVal = (SK_U32)pPnmiPrt->StatSyncOctetsCts; - HighVal = (SK_U32)(pPnmiPrt->StatSyncOctetsCts >> 32); -@@ -7110,17 +6948,19 @@ unsigned int StatIndex) /* Index to sta - - case SK_PNMI_HRX_FCS: - /* -- * Broadcom filters FCS errors and counts it in -- * Receive Error Counter register -+ * Broadcom filters FCS errors and counts them in -+ * Receive Error Counter register. - */ - if (pPrt->PhyType == SK_PHY_BCOM) { -- /* do not read while not initialized (PHY_READ hangs!)*/ -+#ifdef GENESIS -+ /* Do not read while not initialized (PHY_READ hangs!). */ - if (pPrt->PState != SK_PRT_RESET) { - SkXmPhyRead(pAC, IoC, PhysPortIndex, PHY_BCOM_RE_CTR, &Word); - - LowVal = Word; - } - HighVal = pPnmiPrt->CounterHigh[StatIndex]; -+#endif /* GENESIS */ - } - else { - (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, -@@ -7140,7 +6980,7 @@ unsigned int StatIndex) /* Index to sta - - Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal); - -- /* Correct value because of possible XMAC reset. XMAC Errata #2 */ -+ /* Correct value because of possible XMAC reset (XMAC Errata #2). */ - Val += pPnmiPrt->CounterOffset[StatIndex]; - - return (Val); -@@ -7165,22 +7005,21 @@ SK_U32 NetIndex) - unsigned int PhysPortIndex; - SK_EVPARA EventParam; - -- - SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); - -- /* Notify sensor module */ -+ /* Notify sensor module. */ - SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_CLEAR, EventParam); - -- /* Notify RLMT module */ -+ /* Notify RLMT module. */ - EventParam.Para32[0] = NetIndex; - EventParam.Para32[1] = (SK_U32)-1; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STATS_CLEAR, EventParam); - EventParam.Para32[1] = 0; - -- /* Notify SIRQ module */ -+ /* Notify SIRQ module. */ - SkEventQueue(pAC, SKGE_HWAC, SK_HWEV_CLEAR_STAT, EventParam); - -- /* Notify CSUM module */ -+ /* Notify CSUM module. */ - #ifdef SK_USE_CSUM - EventParam.Para32[0] = NetIndex; - EventParam.Para32[1] = (SK_U32)-1; -@@ -7188,7 +7027,7 @@ SK_U32 NetIndex) - EventParam); - #endif /* SK_USE_CSUM */ - -- /* Clear XMAC statistic */ -+ /* Clear XMAC statistics. */ - for (PhysPortIndex = 0; PhysPortIndex < - (unsigned int)pAC->GIni.GIMacsFound; PhysPortIndex ++) { - -@@ -7215,13 +7054,13 @@ SK_U32 NetIndex) - PhysPortIndex].StatRxPMaccErr)); - } - -- /* -- * Clear local statistics -- */ -+ /* Clear local statistics. */ - SK_MEMSET((char *)&pAC->Pnmi.VirtualCounterOffset, 0, - sizeof(pAC->Pnmi.VirtualCounterOffset)); -+ - pAC->Pnmi.RlmtChangeCts = 0; - pAC->Pnmi.RlmtChangeTime = 0; -+ - SK_MEMSET((char *)&pAC->Pnmi.RlmtChangeEstimate.EstValue[0], 0, - sizeof(pAC->Pnmi.RlmtChangeEstimate.EstValue)); - pAC->Pnmi.RlmtChangeEstimate.EstValueIndex = 0; -@@ -7258,23 +7097,21 @@ SK_AC *pAC, /* Pointer to adapter conte - SK_U32 TrapId, /* SNMP ID of the trap */ - unsigned int Size) /* Space needed for trap entry */ - { -- unsigned int BufPad = pAC->Pnmi.TrapBufPad; -- unsigned int BufFree = pAC->Pnmi.TrapBufFree; -- unsigned int Beg = pAC->Pnmi.TrapQueueBeg; -- unsigned int End = pAC->Pnmi.TrapQueueEnd; -+ unsigned int BufPad = pAC->Pnmi.TrapBufPad; -+ unsigned int BufFree = pAC->Pnmi.TrapBufFree; -+ unsigned int Beg = pAC->Pnmi.TrapQueueBeg; -+ unsigned int End = pAC->Pnmi.TrapQueueEnd; - char *pBuf = &pAC->Pnmi.TrapBuf[0]; - int Wrap; -- unsigned int NeededSpace; -- unsigned int EntrySize; -+ unsigned int NeededSpace; -+ unsigned int EntrySize; - SK_U32 Val32; - SK_U64 Val64; - -- -- /* Last byte of entry will get a copy of the entry length */ -+ /* Last byte of entry will get a copy of the entry length. */ - Size ++; - -- /* -- * Calculate needed buffer space */ -+ /* Calculate needed buffer space. */ - if (Beg >= Size) { - - NeededSpace = Size; -@@ -7289,7 +7126,7 @@ unsigned int Size) /* Space needed for t - * Check if enough buffer space is provided. Otherwise - * free some entries. Leave one byte space between begin - * and end of buffer to make it possible to detect whether -- * the buffer is full or empty -+ * the buffer is full or empty. - */ - while (BufFree < NeededSpace + 1) { - -@@ -7328,13 +7165,13 @@ unsigned int Size) /* Space needed for t - } - BufFree -= NeededSpace; - -- /* Save the current offsets */ -+ /* Save the current offsets. */ - pAC->Pnmi.TrapQueueBeg = Beg; - pAC->Pnmi.TrapQueueEnd = End; - pAC->Pnmi.TrapBufPad = BufPad; - pAC->Pnmi.TrapBufFree = BufFree; - -- /* Initialize the trap entry */ -+ /* Initialize the trap entry. */ - *(pBuf + Beg + Size - 1) = (char)Size; - *(pBuf + Beg) = (char)Size; - Val32 = (pAC->Pnmi.TrapUnique) ++; -@@ -7369,7 +7206,6 @@ char *pDstBuf) /* Buffer to which the q - unsigned int Len; - unsigned int DstOff = 0; - -- - while (Trap != End) { - - Len = (unsigned int)*(pBuf + Trap); -@@ -7414,7 +7250,6 @@ unsigned int *pEntries) /* Returns numbe - unsigned int Entries = 0; - unsigned int TotalLen = 0; - -- - while (Trap != End) { - - Len = (unsigned int)*(pBuf + Trap); -@@ -7471,14 +7306,14 @@ unsigned int SensorIndex) /* Index of se - unsigned int DescrLen; - SK_U32 Val32; - -- -- /* Get trap buffer entry */ -+ /* Get trap buffer entry. */ - DescrLen = SK_STRLEN(pAC->I2c.SenTable[SensorIndex].SenDesc); -+ - pBuf = GetTrapEntry(pAC, TrapId, - SK_PNMI_TRAP_SENSOR_LEN_BASE + DescrLen); - Offset = SK_PNMI_TRAP_SIMPLE_LEN; - -- /* Store additionally sensor trap related data */ -+ /* Store additionally sensor trap related data. */ - Val32 = OID_SKGE_SENSOR_INDEX; - SK_PNMI_STORE_U32(pBuf + Offset, Val32); - *(pBuf + Offset + 4) = 4; -@@ -7523,7 +7358,6 @@ unsigned int ActiveMac) /* Index (0..n) - char *pBuf; - SK_U32 Val32; - -- - pBuf = GetTrapEntry(pAC, OID_SKGE_TRAP_RLMT_CHANGE_PORT, - SK_PNMI_TRAP_RLMT_CHANGE_LEN); - -@@ -7551,7 +7385,6 @@ unsigned int PortIndex) /* Index of the - char *pBuf; - SK_U32 Val32; - -- - pBuf = GetTrapEntry(pAC, TrapId, SK_PNMI_TRAP_RLMT_PORT_LEN); - - Val32 = OID_SKGE_RLMT_PORT_INDEX; -@@ -7571,12 +7404,11 @@ unsigned int PortIndex) /* Index of the - * Nothing - */ - PNMI_STATIC void CopyMac( --char *pDst, /* Pointer to destination buffer */ -+char *pDst, /* Pointer to destination buffer */ - SK_MAC_ADDR *pMac) /* Pointer of Source */ - { - int i; - -- - for (i = 0; i < sizeof(SK_MAC_ADDR); i ++) { - - *(pDst + i) = pMac->a[i]; -@@ -7614,19 +7446,22 @@ unsigned int TableIndex, /* Index to the - SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ - { - -+ int i; -+ unsigned int HwPortIndex; -+ - SK_U32 RetCode = SK_PNMI_ERR_GENERAL; - -- /* -- * Check instance. We only handle single instance variables -- */ -- if (Instance != (SK_U32)(-1) && Instance != 1) { -+ /* Check instance. We only handle single instance variables. */ -+ if ((Instance != (SK_U32)(-1))) { - - *pLen = 0; - return (SK_PNMI_ERR_UNKNOWN_INST); - } -+ -+ /* Get hardware port index */ -+ HwPortIndex = NetIndex; - -- -- /* Check length */ -+ /* Check length. */ - switch (Id) { - - case OID_PNP_CAPABILITIES: -@@ -7664,14 +7499,10 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - } - -- /* -- * Perform action -- */ -+ /* Perform action. */ - if (Action == SK_PNMI_GET) { - -- /* -- * Get value -- */ -+ /* Get value. */ - switch (Id) { - - case OID_PNP_CAPABILITIES: -@@ -7679,18 +7510,21 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_PNP_QUERY_POWER: -- /* The Windows DDK describes: An OID_PNP_QUERY_POWER requests -- the miniport to indicate whether it can transition its NIC -- to the low-power state. -- A miniport driver must always return NDIS_STATUS_SUCCESS -- to a query of OID_PNP_QUERY_POWER. */ -+ /* -+ * The Windows DDK describes: An OID_PNP_QUERY_POWER requests -+ * the miniport to indicate whether it can transition its NIC -+ * to the low-power state. -+ * A miniport driver must always return NDIS_STATUS_SUCCESS -+ * to a query of OID_PNP_QUERY_POWER. -+ */ - *pLen = sizeof(SK_DEVICE_POWER_STATE); - RetCode = SK_PNMI_ERR_OK; - break; - -- /* NDIS handles these OIDs as write-only. -+ /* -+ * NDIS handles these OIDs as write-only. - * So in case of get action the buffer with written length = 0 -- * is returned -+ * is returned. - */ - case OID_PNP_SET_POWER: - case OID_PNP_ADD_WAKE_UP_PATTERN: -@@ -7700,7 +7534,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case OID_PNP_ENABLE_WAKE_UP: -- RetCode = SkPowerGetEnableWakeUp(pAC, IoC, pBuf, pLen); -+ RetCode = SkPowerGetEnableWakeUp(pAC, IoC, HwPortIndex, pBuf, pLen); - break; - - default: -@@ -7711,31 +7545,49 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (RetCode); - } - -- -- /* -- * Perform preset or set -- */ -+ /* Perform PRESET or SET. */ - -- /* POWER module does not support PRESET action */ -+ /* The POWER module does not support PRESET action. */ - if (Action == SK_PNMI_PRESET) { -+ - return (SK_PNMI_ERR_OK); - } - -+ /* */ -+ i= HwPortIndex; -+ - switch (Id) { - case OID_PNP_SET_POWER: -- RetCode = SkPowerSetPower(pAC, IoC, pBuf, pLen); -+ /* Dual net mode? */ -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ if (RetCode = SkPowerSetPower(pAC, IoC, i, pBuf, pLen)) { -+ break; -+ } -+ } - break; - - case OID_PNP_ADD_WAKE_UP_PATTERN: -- RetCode = SkPowerAddWakeUpPattern(pAC, IoC, pBuf, pLen); -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ if (RetCode = SkPowerAddWakeUpPattern(pAC, IoC, i, pBuf, pLen)) { -+ break; -+ } -+ } - break; - - case OID_PNP_REMOVE_WAKE_UP_PATTERN: -- RetCode = SkPowerRemoveWakeUpPattern(pAC, IoC, pBuf, pLen); -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ if (RetCode = SkPowerRemoveWakeUpPattern(pAC, IoC, i, pBuf, pLen)) { -+ break; -+ } -+ } - break; - - case OID_PNP_ENABLE_WAKE_UP: -- RetCode = SkPowerSetEnableWakeUp(pAC, IoC, pBuf, pLen); -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ if (RetCode = SkPowerSetEnableWakeUp(pAC, IoC, i, pBuf, pLen)) { -+ break; -+ } -+ } - break; - - default: -@@ -7749,7 +7601,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - #ifdef SK_DIAG_SUPPORT - /***************************************************************************** - * -- * DiagActions - OID handler function of Diagnostic driver -+ * DiagActions - OID handler function of Diagnostic driver - * - * Description: - * The code is simple. No description necessary. -@@ -7776,22 +7628,17 @@ SK_U32 Instance, /* Instance (1..n) that - unsigned int TableIndex, /* Index to the Id table */ - SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ - { -- - SK_U32 DiagStatus; - SK_U32 RetCode = SK_PNMI_ERR_GENERAL; - -- /* -- * Check instance. We only handle single instance variables. -- */ -+ /* Check instance. We only handle single instance variables. */ - if (Instance != (SK_U32)(-1) && Instance != 1) { - - *pLen = 0; - return (SK_PNMI_ERR_UNKNOWN_INST); - } - -- /* -- * Check length. -- */ -+ /* Check length. */ - switch (Id) { - - case OID_SKGE_DIAG_MODE: -@@ -7809,10 +7656,9 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - - /* Perform action. */ -- -- /* GET value. */ - if (Action == SK_PNMI_GET) { - -+ /* Get value. */ - switch (Id) { - - case OID_SKGE_DIAG_MODE: -@@ -7827,14 +7673,15 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - RetCode = SK_PNMI_ERR_GENERAL; - break; - } -- return (RetCode); -+ return (RetCode); - } - - /* From here SET or PRESET value. */ - - /* PRESET value is not supported. */ - if (Action == SK_PNMI_PRESET) { -- return (SK_PNMI_ERR_OK); -+ -+ return (SK_PNMI_ERR_OK); - } - - /* SET value. */ -@@ -7846,7 +7693,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - /* Attach the DIAG to this adapter. */ - case SK_DIAG_ATTACHED: -- /* Check if we come from running */ -+ /* Check if we come from running. */ - if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) { - - RetCode = SkDrvLeaveDiagMode(pAC); -@@ -7881,7 +7728,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - /* If DiagMode is not active, we can enter it. */ - if (!pAC->DiagModeActive) { - -- RetCode = SkDrvEnterDiagMode(pAC); -+ RetCode = SkDrvEnterDiagMode(pAC); - } - else { - -@@ -7900,7 +7747,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - break; - - case SK_DIAG_IDLE: -- /* Check if we come from running */ -+ /* Check if we come from running. */ - if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) { - - RetCode = SkDrvLeaveDiagMode(pAC); -@@ -7946,7 +7793,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - - /***************************************************************************** - * -- * Vct - OID handler function of OIDs -+ * Vct - OID handler function of OIDs for Virtual Cable Tester (VCT) - * - * Description: - * The code is simple. No description necessary. -@@ -7982,153 +7829,150 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - SK_U32 PhysPortIndex; - SK_U32 Limit; - SK_U32 Offset; -- SK_BOOL Link; -- SK_U32 RetCode = SK_PNMI_ERR_GENERAL; -- int i; -+ SK_U32 RetCode; -+ int i; - SK_EVPARA Para; -- SK_U32 CableLength; -- -- /* -- * Calculate the port indexes from the instance. -- */ -+ -+ RetCode = SK_PNMI_ERR_GENERAL; -+ -+ /* Calculate the port indexes from the instance. */ - PhysPortMax = pAC->GIni.GIMacsFound; - LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax); -- -+ - /* Dual net mode? */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - LogPortMax--; - } -- -+ - if ((Instance != (SK_U32) (-1))) { -- /* Check instance range. */ -- if ((Instance < 2) || (Instance > LogPortMax)) { -- *pLen = 0; -- return (SK_PNMI_ERR_UNKNOWN_INST); -- } -- -+ /* -+ * Get one instance of that OID, so check the instance range: -+ * There is no virtual port with an Instance == 1, so we get -+ * the values from one physical port only. -+ */ - if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { - PhysPortIndex = NetIndex; - } - else { -+ if ((Instance < 2) || (Instance > LogPortMax)) { -+ *pLen = 0; -+ return (SK_PNMI_ERR_UNKNOWN_INST); -+ } - PhysPortIndex = Instance - 2; - } - Limit = PhysPortIndex + 1; - } - else { - /* -- * Instance == (SK_U32) (-1), get all Instances of that OID. -- * -- * Not implemented yet. May be used in future releases. -+ * Instance == (SK_U32) (-1), so get all instances of that OID. -+ * There is no virtual port with an Instance == 1, so we get -+ * the values from all physical ports. - */ - PhysPortIndex = 0; - Limit = PhysPortMax; - } -- -- pPrt = &pAC->GIni.GP[PhysPortIndex]; -- if (pPrt->PHWLinkUp) { -- Link = SK_TRUE; -- } -- else { -- Link = SK_FALSE; -- } -- -- /* Check MAC type */ -- if (pPrt->PhyType != SK_PHY_MARV_COPPER) { -+ -+ /* Check MAC type. */ -+ if ((Id != OID_SKGE_VCT_CAPABILITIES) && -+ (pAC->GIni.GP[PhysPortIndex].PhyType != SK_PHY_MARV_COPPER)) { - *pLen = 0; -- return (SK_PNMI_ERR_GENERAL); -+ return (SK_PNMI_ERR_NOT_SUPPORTED); - } -- -- /* Initialize backup data pointer. */ -- pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex]; -- -- /* Check action type */ -+ -+ /* Check action type. */ - if (Action == SK_PNMI_GET) { -- /* Check length */ -+ /* Check length. */ - switch (Id) { -- -+ - case OID_SKGE_VCT_GET: - if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_PNMI_VCT)) { - *pLen = (Limit - PhysPortIndex) * sizeof(SK_PNMI_VCT); - return (SK_PNMI_ERR_TOO_SHORT); - } - break; -- -+ - case OID_SKGE_VCT_STATUS: -+ case OID_SKGE_VCT_CAPABILITIES: - if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U8)) { - *pLen = (Limit - PhysPortIndex) * sizeof(SK_U8); - return (SK_PNMI_ERR_TOO_SHORT); - } - break; -- -+ - default: - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } -- -- /* Get value */ -+ -+ /* Get value. */ - Offset = 0; - for (; PhysPortIndex < Limit; PhysPortIndex++) { -+ -+ pPrt = &pAC->GIni.GP[PhysPortIndex]; -+ - switch (Id) { -- -+ - case OID_SKGE_VCT_GET: -- if ((Link == SK_FALSE) && -+ if (!pPrt->PHWLinkUp && - (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING)) { -+ - RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE); -+ - if (RetCode == 0) { -- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_PENDING; -- pAC->Pnmi.VctStatus[PhysPortIndex] |= -- (SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_TEST_DONE); -- -- /* Copy results for later use to PNMI struct. */ -- for (i = 0; i < 4; i++) { -- if (pPrt->PMdiPairSts[i] == SK_PNMI_VCT_NORMAL_CABLE) { -- if ((pPrt->PMdiPairLen[i] > 35) && (pPrt->PMdiPairLen[i] < 0xff)) { -- pPrt->PMdiPairSts[i] = SK_PNMI_VCT_IMPEDANCE_MISMATCH; -- } -- } -- if ((pPrt->PMdiPairLen[i] > 35) && (pPrt->PMdiPairLen[i] != 0xff)) { -- CableLength = 1000 * (((175 * pPrt->PMdiPairLen[i]) / 210) - 28); -- } -- else { -- CableLength = 0; -- } -- pVctBackupData->PMdiPairLen[i] = CableLength; -- pVctBackupData->PMdiPairSts[i] = pPrt->PMdiPairSts[i]; -- } -+ -+ /* VCT test is finished, so save the data. */ -+ VctGetResults(pAC, IoC, PhysPortIndex); - - Para.Para32[0] = PhysPortIndex; - Para.Para32[1] = -1; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Para); -- SkEventDispatcher(pAC, IoC); -- } -- else { -- ; /* VCT test is running. */ -+ -+ /* SkEventDispatcher(pAC, IoC); */ - } - } -- -+ -+ /* Initialize backup data pointer. */ -+ pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex]; -+ - /* Get all results. */ - CheckVctStatus(pAC, IoC, pBuf, Offset, PhysPortIndex); -- Offset += sizeof(SK_U8); -+ -+ Offset++; - *(pBuf + Offset) = pPrt->PCableLen; -- Offset += sizeof(SK_U8); -+ Offset++; - for (i = 0; i < 4; i++) { -- SK_PNMI_STORE_U32((pBuf + Offset), pVctBackupData->PMdiPairLen[i]); -+ -+ SK_PNMI_STORE_U32((pBuf + Offset), pVctBackupData->MdiPairLen[i]); - Offset += sizeof(SK_U32); - } - for (i = 0; i < 4; i++) { -- *(pBuf + Offset) = pVctBackupData->PMdiPairSts[i]; -- Offset += sizeof(SK_U8); -+ -+ *(pBuf + Offset) = pVctBackupData->MdiPairSts[i]; -+ Offset++; - } -- -+ - RetCode = SK_PNMI_ERR_OK; - break; -- -+ - case OID_SKGE_VCT_STATUS: - CheckVctStatus(pAC, IoC, pBuf, Offset, PhysPortIndex); -- Offset += sizeof(SK_U8); -+ -+ Offset++; - RetCode = SK_PNMI_ERR_OK; - break; -- -+ -+ case OID_SKGE_VCT_CAPABILITIES: -+ if (pPrt->PhyType != SK_PHY_MARV_COPPER) { -+ *(pBuf + Offset) = SK_PNMI_VCT_NOT_SUPPORTED; -+ } -+ else { -+ *(pBuf + Offset) = SK_PNMI_VCT_SUPPORTED; -+ } -+ Offset++; -+ -+ RetCode = SK_PNMI_ERR_OK; -+ break; -+ - default: - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -8136,15 +7980,15 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } /* for */ - *pLen = Offset; - return (RetCode); -- -+ - } /* if SK_PNMI_GET */ -- -+ - /* - * From here SET or PRESET action. Check if the passed - * buffer length is plausible. - */ -- -- /* Check length */ -+ -+ /* Check length. */ - switch (Id) { - case OID_SKGE_VCT_SET: - if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U32)) { -@@ -8152,42 +7996,45 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - return (SK_PNMI_ERR_TOO_SHORT); - } - break; -- -+ - default: - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } -- -- /* -- * Perform preset or set. -- */ -- -+ -+ /* Perform PRESET or SET. */ -+ - /* VCT does not support PRESET action. */ - if (Action == SK_PNMI_PRESET) { -+ - return (SK_PNMI_ERR_OK); - } -- -+ - Offset = 0; - for (; PhysPortIndex < Limit; PhysPortIndex++) { -+ -+ pPrt = &pAC->GIni.GP[PhysPortIndex]; -+ - switch (Id) { - case OID_SKGE_VCT_SET: /* Start VCT test. */ -- if (Link == SK_FALSE) { -+ if (!pPrt->PHWLinkUp) { - SkGeStopPort(pAC, IoC, PhysPortIndex, SK_STOP_ALL, SK_SOFT_RST); -- -+ - RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_TRUE); -+ - if (RetCode == 0) { /* RetCode: 0 => Start! */ - pAC->Pnmi.VctStatus[PhysPortIndex] |= SK_PNMI_VCT_PENDING; -- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_NEW_VCT_DATA; -- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_LINK; -- -- /* -- * Start VCT timer counter. -- */ -- SK_MEMSET((char *) &Para, 0, sizeof(Para)); -+ pAC->Pnmi.VctStatus[PhysPortIndex] &= -+ ~(SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_LINK); -+ -+ /* Start VCT timer counter. */ -+ SK_MEMSET((char *)&Para, 0, sizeof(Para)); - Para.Para32[0] = PhysPortIndex; - Para.Para32[1] = -1; -- SkTimerStart(pAC, IoC, &pAC->Pnmi.VctTimeout[PhysPortIndex].VctTimer, -- 4000000, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Para); -+ -+ SkTimerStart(pAC, IoC, &pAC->Pnmi.VctTimeout[PhysPortIndex], -+ SK_PNMI_VCT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Para); -+ - SK_PNMI_STORE_U32((pBuf + Offset), RetCode); - RetCode = SK_PNMI_ERR_OK; - } -@@ -8203,7 +8050,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } - Offset += sizeof(SK_U32); - break; -- -+ - default: - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); -@@ -8215,6 +8062,65 @@ SK_U32 NetIndex) /* NetIndex (0..n), in - } /* Vct */ - - -+PNMI_STATIC void VctGetResults( -+SK_AC *pAC, -+SK_IOC IoC, -+SK_U32 Port) -+{ -+ SK_GEPORT *pPrt; -+ int i; -+ SK_U8 PairLen; -+ SK_U8 PairSts; -+ SK_U32 MinLength; -+ SK_U32 CableLength; -+ -+ pPrt = &pAC->GIni.GP[Port]; -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) { -+ MinLength = 25; -+ } -+ else { -+ MinLength = 35; -+ } -+ -+ /* Copy results for later use to PNMI struct. */ -+ for (i = 0; i < 4; i++) { -+ -+ PairLen = pPrt->PMdiPairLen[i]; -+ -+ if (((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) == 0) && (i > 1)) { -+ PairSts = SK_PNMI_VCT_NOT_PRESENT; -+ } -+ else { -+ PairSts = pPrt->PMdiPairSts[i]; -+ } -+ -+ if ((PairSts == SK_PNMI_VCT_NORMAL_CABLE) && -+ (PairLen > 28) && (PairLen < 0xff)) { -+ -+ PairSts = SK_PNMI_VCT_IMPEDANCE_MISMATCH; -+ } -+ -+ /* Ignore values <= MinLength, the linear factor is 4/5. */ -+ if ((PairLen > MinLength) && (PairLen < 0xff)) { -+ -+ CableLength = 1000UL * (PairLen - MinLength) * 4 / 5; -+ } -+ else { -+ /* No cable or short cable. */ -+ CableLength = 0; -+ } -+ -+ pAC->Pnmi.VctBackup[Port].MdiPairLen[i] = CableLength; -+ pAC->Pnmi.VctBackup[Port].MdiPairSts[i] = PairSts; -+ } -+ -+ pAC->Pnmi.VctStatus[Port] &= ~SK_PNMI_VCT_PENDING; -+ pAC->Pnmi.VctStatus[Port] |= (SK_PNMI_VCT_NEW_VCT_DATA | -+ SK_PNMI_VCT_TEST_DONE); -+ -+} /* GetVctResults */ -+ - PNMI_STATIC void CheckVctStatus( - SK_AC *pAC, - SK_IOC IoC, -@@ -8224,54 +8130,57 @@ SK_U32 PhysPortIndex) - { - SK_GEPORT *pPrt; - SK_PNMI_VCT *pVctData; -+ SK_U8 VctStatus; - SK_U32 RetCode; -- -+ - pPrt = &pAC->GIni.GP[PhysPortIndex]; -- -+ - pVctData = (SK_PNMI_VCT *) (pBuf + Offset); - pVctData->VctStatus = SK_PNMI_VCT_NONE; -- -+ -+ VctStatus = pAC->Pnmi.VctStatus[PhysPortIndex]; -+ - if (!pPrt->PHWLinkUp) { -- -+ - /* Was a VCT test ever made before? */ -- if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_TEST_DONE) { -- if ((pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_LINK)) { -+ if (VctStatus & SK_PNMI_VCT_TEST_DONE) { -+ if (VctStatus & SK_PNMI_VCT_LINK) { - pVctData->VctStatus |= SK_PNMI_VCT_OLD_VCT_DATA; - } - else { - pVctData->VctStatus |= SK_PNMI_VCT_NEW_VCT_DATA; - } - } -- -+ - /* Check VCT test status. */ - RetCode = SkGmCableDiagStatus(pAC,IoC, PhysPortIndex, SK_FALSE); -+ - if (RetCode == 2) { /* VCT test is running. */ - pVctData->VctStatus |= SK_PNMI_VCT_RUNNING; - } - else { /* VCT data was copied to pAC here. Check PENDING state. */ -- if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING) { -+ if (VctStatus & SK_PNMI_VCT_PENDING) { - pVctData->VctStatus |= SK_PNMI_VCT_NEW_VCT_DATA; - } - } -- -+ - if (pPrt->PCableLen != 0xff) { /* Old DSP value. */ - pVctData->VctStatus |= SK_PNMI_VCT_OLD_DSP_DATA; - } - } - else { -- - /* Was a VCT test ever made before? */ -- if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_TEST_DONE) { -+ if (VctStatus & SK_PNMI_VCT_TEST_DONE) { - pVctData->VctStatus &= ~SK_PNMI_VCT_NEW_VCT_DATA; - pVctData->VctStatus |= SK_PNMI_VCT_OLD_VCT_DATA; - } -- -+ - /* DSP only valid in 100/1000 modes. */ -- if (pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed != -- SK_LSPEED_STAT_10MBPS) { -+ if (pPrt->PLinkSpeedUsed != SK_LSPEED_STAT_10MBPS) { - pVctData->VctStatus |= SK_PNMI_VCT_NEW_DSP_DATA; - } - } -+ - } /* CheckVctStatus */ - - -@@ -8314,29 +8223,29 @@ int HeaderLength; /* Length of desired - ReturnCode = SK_PNMI_ERR_GENERAL; - - SK_MEMCPY(&Mode, pBuf, sizeof(SK_I32)); -- SK_MEMCPY(&Oid, (char *) pBuf + sizeof(SK_I32), sizeof(SK_U32)); -+ SK_MEMCPY(&Oid, (char *)pBuf + sizeof(SK_I32), sizeof(SK_U32)); - HeaderLength = sizeof(SK_I32) + sizeof(SK_U32); - *pLen = *pLen - HeaderLength; -- SK_MEMCPY((char *) pBuf + sizeof(SK_I32), (char *) pBuf + HeaderLength, *pLen); -+ SK_MEMCPY((char *)pBuf + sizeof(SK_I32), (char *)pBuf + HeaderLength, *pLen); - - switch(Mode) { - case SK_GET_SINGLE_VAR: -- ReturnCode = SkPnmiGetVar(pAC, IoC, Oid, -- (char *) pBuf + sizeof(SK_I32), pLen, -+ ReturnCode = SkPnmiGetVar(pAC, IoC, Oid, -+ (char *)pBuf + sizeof(SK_I32), pLen, - ((SK_U32) (-1)), NetIndex); - SK_PNMI_STORE_U32(pBuf, ReturnCode); - *pLen = *pLen + sizeof(SK_I32); - break; - case SK_PRESET_SINGLE_VAR: -- ReturnCode = SkPnmiPreSetVar(pAC, IoC, Oid, -- (char *) pBuf + sizeof(SK_I32), pLen, -+ ReturnCode = SkPnmiPreSetVar(pAC, IoC, Oid, -+ (char *)pBuf + sizeof(SK_I32), pLen, - ((SK_U32) (-1)), NetIndex); - SK_PNMI_STORE_U32(pBuf, ReturnCode); - *pLen = *pLen + sizeof(SK_I32); - break; - case SK_SET_SINGLE_VAR: -- ReturnCode = SkPnmiSetVar(pAC, IoC, Oid, -- (char *) pBuf + sizeof(SK_I32), pLen, -+ ReturnCode = SkPnmiSetVar(pAC, IoC, Oid, -+ (char *)pBuf + sizeof(SK_I32), pLen, - ((SK_U32) (-1)), NetIndex); - SK_PNMI_STORE_U32(pBuf, ReturnCode); - *pLen = *pLen + sizeof(SK_I32); -@@ -8357,3 +8266,86 @@ int HeaderLength; /* Length of desired - return (ReturnCode); - - } /* SkGeIocGen */ -+ -+#ifdef SK_ASF -+/***************************************************************************** -+ * -+ * Asf -+ * -+ * Description: -+ * The code is simple. No description necessary. -+ * -+ * Returns: -+ * SK_PNMI_ERR_OK The request was successfully performed. -+ * SK_PNMI_ERR_GENERAL A general severe internal error occured. -+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain -+ * the correct data (e.g. a 32bit value is -+ * needed, but a 16 bit value was passed). -+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't -+ * exist (e.g. port instance 3 on a two port -+ * adapter. -+ */ -+ -+PNMI_STATIC int Asf( -+SK_AC *pAC, /* Pointer to adapter context */ -+SK_IOC IoC, /* IO context handle */ -+int Action, /* GET/PRESET/SET action */ -+SK_U32 Id, /* Object ID that is to be processed */ -+char *pBuf, /* Buffer used for the management data transfer */ -+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ -+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ -+unsigned int TableIndex, /* Index to the Id table */ -+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ -+{ -+ SK_U32 RetCode = SK_PNMI_ERR_GENERAL; -+ -+ /* -+ * Check instance. We only handle single instance variables. -+ */ -+ if (Instance != (SK_U32)(-1) && Instance != 1) { -+ -+ *pLen = 0; -+ return (SK_PNMI_ERR_UNKNOWN_INST); -+ } -+ -+ /* Perform action. */ -+ /* GET value. */ -+ if (Action == SK_PNMI_GET) { -+ switch (Id) { -+ case OID_SKGE_ASF: -+ RetCode = SkAsfGet(pAC, IoC, (SK_U8 *) pBuf, pLen); -+ break; -+ default: -+ RetCode = SkAsfGetOid( pAC, IoC, Id, Instance, (SK_U8 *) pBuf, pLen ); -+ break; -+ } -+ -+ return (RetCode); -+ } -+ -+ /* PRESET value. */ -+ if (Action == SK_PNMI_PRESET) { -+ switch (Id) { -+ case OID_SKGE_ASF: -+ RetCode = SkAsfPreSet(pAC, IoC, (SK_U8 *) pBuf, pLen); -+ break; -+ default: -+ RetCode = SkAsfPreSetOid( pAC, IoC, Id, Instance, (SK_U8 *) pBuf, pLen ); -+ break; -+ } -+ } -+ -+ /* SET value. */ -+ if (Action == SK_PNMI_SET) { -+ switch (Id) { -+ case OID_SKGE_ASF: -+ RetCode = SkAsfSet(pAC, IoC, (SK_U8 *) pBuf, pLen); -+ break; -+ default: -+ RetCode = SkAsfSetOid( pAC, IoC, Id, Instance, (SK_U8 *) pBuf, pLen ); -+ break; -+ } -+ } -+ return (RetCode); -+} -+#endif /* SK_ASF */ ---- ./drivers/net/sk98lin/skgesirq.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skgesirq.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skgesirq.c - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.92 $ -- * Date: $Date: 2003/09/16 14:37:07 $ -+ * Version: $Revision: 2.26 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: Special IRQ module - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -38,7 +39,7 @@ - * right after this ISR. - * - * The Interrupt source register of the adapter is NOT read by this module. -- * SO if the drivers implementor needs a while loop around the -+ * SO if the drivers implementor needs a while loop around the - * slow data paths interrupt bits, he needs to call the SkGeSirqIsr() for - * each loop entered. - * -@@ -46,11 +47,6 @@ - * - */ - --#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) --static const char SysKonnectFileId[] = -- "@(#) $Id: skgesirq.c,v 1.92 2003/09/16 14:37:07 rschmidt Exp $ (C) Marvell."; --#endif -- - #include "h/skdrv1st.h" /* Driver Specific Definitions */ - #ifndef SK_SLIM - #include "h/skgepnmi.h" /* PNMI Definitions */ -@@ -58,6 +54,13 @@ static const char SysKonnectFileId[] = - #endif - #include "h/skdrv2nd.h" /* Adapter Control and Driver specific Def. */ - -+/* local variables ************************************************************/ -+ -+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) -+static const char SysKonnectFileId[] = -+ "@(#) $Id: skgesirq.c,v 2.26 2005/12/14 16:11:35 ibrueder Exp $ (C) Marvell."; -+#endif -+ - /* local function prototypes */ - #ifdef GENESIS - static int SkGePortCheckUpXmac(SK_AC*, SK_IOC, int, SK_BOOL); -@@ -86,7 +89,7 @@ static const SK_U16 SkGeRxRegs[]= { - XM_RXF_511B, - XM_RXF_1023B, - XM_RXF_MAX_SZ --} ; -+}; - #endif /* GENESIS */ - - #ifdef __C2MAN__ -@@ -109,8 +112,8 @@ intro() - * Returns: N/A - */ - static void SkHWInitDefSense( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -119,7 +122,7 @@ int Port) /* Port Index (MAC_1 + n) */ - - pPrt->PAutoNegTimeOut = 0; - -- if (pPrt->PLinkModeConf != SK_LMODE_AUTOSENSE) { -+ if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) { - pPrt->PLinkMode = pPrt->PLinkModeConf; - return; - } -@@ -145,8 +148,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * - */ - static SK_U8 SkHWSenseGetNext( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -155,18 +158,18 @@ int Port) /* Port Index (MAC_1 + n) */ - - pPrt->PAutoNegTimeOut = 0; - -- if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) { -+ if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) { - /* Leave all as configured */ - return(pPrt->PLinkModeConf); - } - -- if (pPrt->PLinkMode == (SK_U8)SK_LMODE_AUTOFULL) { -+ if (pPrt->PLinkMode == (SK_U8)SK_LMODE_AUTOFULL) { - /* Return next mode AUTOBOTH */ -- return ((SK_U8)SK_LMODE_AUTOBOTH); -+ return((SK_U8)SK_LMODE_AUTOBOTH); - } - - /* Return default autofull */ -- return ((SK_U8)SK_LMODE_AUTOFULL); -+ return((SK_U8)SK_LMODE_AUTOFULL); - } /* SkHWSenseGetNext */ - - -@@ -179,8 +182,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * Returns: N/A - */ - static void SkHWSenseSetNext( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_U8 NewMode) /* New Mode to be written in sense mode */ - { -@@ -190,7 +193,7 @@ SK_U8 NewMode) /* New Mode to be written - - pPrt->PAutoNegTimeOut = 0; - -- if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) { -+ if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) { - return; - } - -@@ -214,8 +217,8 @@ SK_U8 NewMode) /* New Mode to be written - * Returns: N/A - */ - void SkHWLinkDown( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -227,11 +230,11 @@ int Port) /* Port Index (MAC_1 + n) */ - - /* Disable Receiver and Transmitter */ - SkMacRxTxDisable(pAC, IoC, Port); -- -+ - /* Init default sense mode */ - SkHWInitDefSense(pAC, IoC, Port); - -- if (pPrt->PHWLinkUp == SK_FALSE) { -+ if (!pPrt->PHWLinkUp) { - return; - } - -@@ -241,10 +244,12 @@ int Port) /* Port Index (MAC_1 + n) */ - /* Set Link to DOWN */ - pPrt->PHWLinkUp = SK_FALSE; - -+#ifndef SK_SLIM - /* Reset Port stati */ -- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; -- pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE; -+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; -+ pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE; - pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_INDETERMINATED; -+#endif /* !SK_SLIM */ - - /* Re-init Phy especially when the AutoSense default is set now */ - SkMacInitPhy(pAC, IoC, Port, SK_FALSE); -@@ -266,8 +271,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * Returns: N/A - */ - void SkHWLinkUp( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -280,12 +285,14 @@ int Port) /* Port Index (MAC_1 + n) */ - } - - pPrt->PHWLinkUp = SK_TRUE; -+ -+#ifndef SK_SLIM - pPrt->PAutoNegFail = SK_FALSE; -- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; -+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; - -- if (pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOHALF && -- pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOFULL && -- pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOBOTH) { -+ if (pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOHALF && -+ pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOFULL && -+ pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOBOTH) { - /* Link is up and no Auto-negotiation should be done */ - - /* Link speed should be the configured one */ -@@ -293,7 +300,9 @@ int Port) /* Port Index (MAC_1 + n) */ - case SK_LSPEED_AUTO: - /* default is 1000 Mbps */ - case SK_LSPEED_1000MBPS: -- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS; -+ pPrt->PLinkSpeedUsed = -+ (SK_U8)((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) ? -+ SK_LSPEED_STAT_1000MBPS : SK_LSPEED_STAT_100MBPS; - break; - case SK_LSPEED_100MBPS: - pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS; -@@ -304,19 +313,22 @@ int Port) /* Port Index (MAC_1 + n) */ - } - - /* Set Link Mode Status */ -- if (pPrt->PLinkMode == SK_LMODE_FULL) { -+ if (pPrt->PLinkMode == (SK_U8)SK_LMODE_FULL) { - pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_FULL; - } - else { -- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_HALF; -+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_HALF; - } - - /* No flow control without auto-negotiation */ -- pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE; -+ pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE; -+#endif /* !SK_SLIM */ - - /* enable Rx/Tx */ -- (void)SkMacRxTxEnable(pAC, IoC, Port); -+ (void)SkMacRxTxEnable(pAC, IoC, Port); -+#ifndef SK_SLIM - } -+#endif /* !SK_SLIM */ - } /* SkHWLinkUp */ - - -@@ -329,14 +341,16 @@ int Port) /* Port Index (MAC_1 + n) */ - * Returns: N/A - */ - static void SkMacParity( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ --int Port) /* Port Index of the port failed */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ -+int Port) /* Port Index (MAC_1 + n) */ - { - SK_EVPARA Para; - SK_GEPORT *pPrt; /* GIni Port struct pointer */ - SK_U32 TxMax; /* Tx Max Size Counter */ - -+ TxMax = 0; -+ - pPrt = &pAC->GIni.GP[Port]; - - /* Clear IRQ Tx Parity Error */ -@@ -346,7 +360,7 @@ int Port) /* Port Index of the port fai - SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_CLR_PERR); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* HW-Bug #8: cleared by GMF_CLI_TX_FC instead of GMF_CLI_TX_PE */ -@@ -355,7 +369,7 @@ int Port) /* Port Index of the port fai - pAC->GIni.GIChipRev == 0) ? GMF_CLI_TX_FC : GMF_CLI_TX_PE)); - } - #endif /* YUKON */ -- -+ - if (pPrt->PCheckPar) { - - if (Port == MAC_1) { -@@ -366,7 +380,7 @@ int Port) /* Port Index of the port fai - } - Para.Para64 = Port; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); -- -+ - Para.Para32[0] = Port; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); - -@@ -378,18 +392,18 @@ int Port) /* Port Index of the port fai - if (pAC->GIni.GIGenesis) { - /* Snap statistic counters */ - (void)SkXmUpdateStats(pAC, IoC, Port); -- -+ - (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXF_MAX_SZ, &TxMax); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - - (void)SkGmMacStatistic(pAC, IoC, Port, GM_TXF_1518B, &TxMax); - } - #endif /* YUKON */ -- -+ - if (TxMax > 0) { - /* From now on check the parity */ - pPrt->PCheckPar = SK_TRUE; -@@ -399,15 +413,15 @@ int Port) /* Port Index of the port fai - - /****************************************************************************** - * -- * SkGeHwErr() - Hardware Error service routine -+ * SkGeYuHwErr() - Hardware Error service routine (Genesis and Yukon) - * - * Description: handles all HW Error interrupts - * - * Returns: N/A - */ --static void SkGeHwErr( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+static void SkGeYuHwErr( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ - SK_U32 HwStatus) /* Interrupt status word */ - { - SK_EVPARA Para; -@@ -423,10 +437,10 @@ SK_U32 HwStatus) /* Interrupt status wor - } - - /* Reset all bits in the PCI STATUS register */ -- SK_IN16(IoC, PCI_C(PCI_STATUS), &Word); -- -+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word); -+ - SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -- SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); -+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); - SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); - - Para.Para64 = 0; -@@ -461,7 +475,7 @@ SK_U32 HwStatus) /* Interrupt status wor - } - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* This is necessary only for Rx timing measurements */ -@@ -484,14 +498,18 @@ SK_U32 HwStatus) /* Interrupt status wor - #endif /* YUKON */ - - if ((HwStatus & IS_RAM_RD_PAR) != 0) { -+ - SK_OUT16(IoC, B3_RI_CTRL, RI_CLR_RD_PERR); -+ - SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E014, SKERR_SIRQ_E014MSG); - Para.Para64 = 0; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para); - } - - if ((HwStatus & IS_RAM_WR_PAR) != 0) { -+ - SK_OUT16(IoC, B3_RI_CTRL, RI_CLR_WR_PERR); -+ - SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E015, SKERR_SIRQ_E015MSG); - Para.Para64 = 0; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para); -@@ -512,7 +530,7 @@ SK_U32 HwStatus) /* Interrupt status wor - SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E018, SKERR_SIRQ_E018MSG); - Para.Para64 = MAC_1; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); -- -+ - Para.Para32[0] = MAC_1; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); - } -@@ -524,37 +542,288 @@ SK_U32 HwStatus) /* Interrupt status wor - SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E019, SKERR_SIRQ_E019MSG); - Para.Para64 = MAC_2; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); -- -+ - Para.Para32[0] = MAC_2; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); - } --} /* SkGeHwErr */ -+} /* SkGeYuHwErr */ -+ -+#ifdef YUK2 -+/****************************************************************************** -+ * -+ * SkYuk2HwPortErr() - Service HW Errors for specified port (Yukon-2 only) -+ * -+ * Description: handles the HW Error interrupts for a specific port. -+ * -+ * Returns: N/A -+ */ -+static void SkYuk2HwPortErr( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_U32 HwStatus, /* Interrupt status word */ -+int Port) /* Port Index (MAC_1 + n) */ -+{ -+ SK_EVPARA Para; -+ int Queue; -+ -+ if (Port == MAC_2) { -+ HwStatus >>= 8; -+ } -+ -+ if ((HwStatus & Y2_HWE_L1_MASK) == 0) { -+ return; -+ } - -+ if ((HwStatus & Y2_IS_PAR_RD1) != 0) { -+ /* Clear IRQ */ -+ SK_OUT16(IoC, SELECT_RAM_BUFFER(Port, B3_RI_CTRL), RI_CLR_RD_PERR); -+ -+ if (Port == MAC_1) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E028, SKERR_SIRQ_E028MSG); -+ } -+ else { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E030, SKERR_SIRQ_E030MSG); -+ } -+ } -+ -+ if ((HwStatus & Y2_IS_PAR_WR1) != 0) { -+ /* Clear IRQ */ -+ SK_OUT16(IoC, SELECT_RAM_BUFFER(Port, B3_RI_CTRL), RI_CLR_WR_PERR); -+ -+ if (Port == MAC_1) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E029, SKERR_SIRQ_E029MSG); -+ } -+ else { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E031, SKERR_SIRQ_E031MSG); -+ } -+ } -+ -+ if ((HwStatus & Y2_IS_PAR_MAC1) != 0) { -+ /* Clear IRQ */ -+ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), GMF_CLI_TX_PE); -+ -+ if (Port == MAC_1) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E016, SKERR_SIRQ_E016MSG); -+ } -+ else { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E017, SKERR_SIRQ_E017MSG); -+ } -+ } -+ -+ if ((HwStatus & Y2_IS_PAR_RX1) != 0) { -+ if (Port == MAC_1) { -+ Queue = Q_R1; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E018, SKERR_SIRQ_E018MSG); -+ } -+ else { -+ Queue = Q_R2; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E019, SKERR_SIRQ_E019MSG); -+ } -+ /* Clear IRQ */ -+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_PAR); -+ } -+ -+ if ((HwStatus & Y2_IS_TCP_TXS1) != 0) { -+ if (Port == MAC_1) { -+ Queue = Q_XS1; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E033, SKERR_SIRQ_E033MSG); -+ } -+ else { -+ Queue = Q_XS2; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E035, SKERR_SIRQ_E035MSG); -+ } -+ /* Clear IRQ */ -+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_TCP); -+ } -+ -+ if ((HwStatus & Y2_IS_TCP_TXA1) != 0) { -+ if (Port == MAC_1) { -+ Queue = Q_XA1; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E032, SKERR_SIRQ_E032MSG); -+ } -+ else { -+ Queue = Q_XA2; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E034, SKERR_SIRQ_E034MSG); -+ } -+ /* Clear IRQ */ -+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_TCP); -+ } -+ -+ Para.Para64 = Port; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); -+ -+ Para.Para32[0] = Port; -+ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); -+ -+} /* SkYuk2HwPortErr */ - - /****************************************************************************** - * -- * SkGeSirqIsr() - Special Interrupt Service Routine -+ * SkYuk2HwErr() - Hardware Error service routine (Yukon-2 only) - * -- * Description: handles all non data transfer specific interrupts (slow path) -+ * Description: handles all HW Error interrupts -+ * -+ * Returns: N/A -+ */ -+static void SkYuk2HwErr( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_U32 HwStatus) /* Interrupt status word */ -+{ -+ SK_EVPARA Para; -+ SK_U16 Word; -+ SK_U32 DWord; -+ SK_U32 TlpHead[4]; -+ int i; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -+ ("HW-Error Status: 0x%08lX\n", HwStatus)); -+ -+ /* This is necessary only for Rx timing measurements */ -+ if ((HwStatus & Y2_IS_TIST_OV) != 0) { -+ /* increment Time Stamp Timer counter (high) */ -+ pAC->GIni.GITimeStampCnt++; -+ -+ /* Clear Time Stamp Timer IRQ */ -+ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8)GMT_ST_CLR_IRQ); -+ } -+ -+ /* Evaluate Y2_IS_PCI_NEXP before Y2_IS_MST_ERR or Y2_IS_IRQ_STAT */ -+ if ((HwStatus & Y2_IS_PCI_NEXP) != 0) { -+ /* -+ * This error is also mapped either to Master Abort (Y2_IS_MST_ERR) -+ * or Target Abort (Y2_IS_IRQ_STAT) bit and can only be cleared there. -+ * Therefore handle this event just by printing an error log entry. -+ */ -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E027, SKERR_SIRQ_E027MSG); -+ } -+ -+ if ((HwStatus & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) != 0) { -+ /* PCI Errors occured */ -+ if ((HwStatus & Y2_IS_IRQ_STAT) != 0) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E013, SKERR_SIRQ_E013MSG); -+ } -+ else { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E012, SKERR_SIRQ_E012MSG); -+ } -+ -+ /* Reset all bits in the PCI STATUS register */ -+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word); -+ -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -+ -+ Para.Para64 = 0; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para); -+ } -+ -+ /* check for PCI-Express Uncorrectable Error */ -+ if ((HwStatus & Y2_IS_PCI_EXP) != 0) { -+ /* -+ * On PCI-Express bus bridges are called root complexes (RC). -+ * PCI-Express errors are recognized by the root complex too, -+ * which requests the system to handle the problem. After error -+ * occurence it may be that no access to the adapter may be performed -+ * any longer. -+ */ -+ -+ /* Get uncorrectable error status */ -+ SK_IN32(IoC, PCI_C(pAC, PEX_UNC_ERR_STAT), &DWord); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -+ ("PEX Uncorr.Error Status: 0x%08lX\n", DWord)); -+ -+ if (DWord != PEX_UNSUP_REQ) { -+ /* ignore Unsupported Request Errors */ -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E026, SKERR_SIRQ_E026MSG); -+ } -+ -+ if ((DWord & (PEX_FATAL_ERRORS | PEX_POIS_TLP)) != 0) { -+ /* -+ * Stop only, if the uncorrectable error is fatal or -+ * Poisoned TLP occured -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, ("Header Log:")); -+ -+ for (i = 0; i < 4; i++) { -+ /* get TLP Header from Log Registers */ -+ SK_IN32(IoC, PCI_C(pAC, PEX_HEADER_LOG + i*4), &TlpHead[i]); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -+ (" 0x%08lX", TlpHead[i])); -+ } -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, ("\n")); -+ -+ /* check for vendor defined broadcast message */ -+ if (TlpHead[0] == 0x73004001 && (SK_U8)TlpHead[1] == 0x7f) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -+ ("Vendor defined broadcast message\n")); -+ } -+ else { -+ Para.Para64 = 0; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para); -+ -+ pAC->GIni.GIValHwIrqMask &= ~Y2_IS_PCI_EXP; -+ /* Rewrite HW IRQ mask */ -+ SK_OUT32(IoC, B0_HWE_IMSK, pAC->GIni.GIValHwIrqMask); -+ } -+ } -+ /* clear the interrupt */ -+ SK_OUT32(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -+ SK_OUT32(IoC, PCI_C(pAC, PEX_UNC_ERR_STAT), 0xffffffffUL); -+ SK_OUT32(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -+ } -+ -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ -+ SkYuk2HwPortErr(pAC, IoC, HwStatus, i); -+ } -+ -+} /* SkYuk2HwErr */ -+#endif /* YUK2 */ -+ -+/****************************************************************************** -+ * -+ * SkGeSirqIsr() - Wrapper for Special Interrupt Service Routine -+ * -+ * Description: calls the preselected special ISR (slow path) - * - * Returns: N/A - */ - void SkGeSirqIsr( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O context */ -+SK_U32 Istatus) /* Interrupt status word */ -+{ -+ pAC->GIni.GIFunc.pSkGeSirqIsr(pAC, IoC, Istatus); -+} -+ -+/****************************************************************************** -+ * -+ * SkGeYuSirqIsr() - Special Interrupt Service Routine -+ * -+ * Description: handles all non data transfer specific interrupts (slow path) -+ * -+ * Returns: N/A -+ */ -+void SkGeYuSirqIsr( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - SK_U32 Istatus) /* Interrupt status word */ - { - SK_EVPARA Para; - SK_U32 RegVal32; /* Read register value */ - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -- SK_U16 PhyInt; -+ SK_U16 PhyInt; - int i; - - if (((Istatus & IS_HW_ERR) & pAC->GIni.GIValIrqMask) != 0) { - /* read the HW Error Interrupt source */ - SK_IN32(IoC, B0_HWE_ISRC, &RegVal32); -- -- SkGeHwErr(pAC, IoC, RegVal32); -+ -+ SkGeYuHwErr(pAC, IoC, RegVal32); - } - - /* -@@ -569,7 +838,7 @@ SK_U32 Istatus) /* Interrupt status word - } - - if (((Istatus & (IS_PA_TO_RX2 | IS_PA_TO_TX2)) != 0) && -- pAC->GIni.GP[MAC_2].PState == SK_PRT_RESET) { -+ pAC->GIni.GP[MAC_2].PState == SK_PRT_RESET) { - /* MAC 2 was not initialized but Packet timeout occured */ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E005, - SKERR_SIRQ_E005MSG); -@@ -590,8 +859,8 @@ SK_U32 Istatus) /* Interrupt status word - } - - if ((Istatus & IS_PA_TO_TX1) != 0) { -- -- pPrt = &pAC->GIni.GP[0]; -+ -+ pPrt = &pAC->GIni.GP[MAC_1]; - - /* May be a normal situation in a server with a slow network */ - SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX1); -@@ -612,25 +881,18 @@ SK_U32 Istatus) /* Interrupt status word - * we ignore those - */ - pPrt->HalfDupTimerActive = SK_TRUE; --#ifdef XXX -- Len = sizeof(SK_U64); -- SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, -- &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 0), -- pAC->Rlmt.Port[0].Net->NetNumber); -- -- pPrt->LastOctets = Octets; --#endif /* XXX */ -+ - /* Snap statistic counters */ - (void)SkXmUpdateStats(pAC, IoC, 0); - - (void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_HI, &RegVal32); - - pPrt->LastOctets = (SK_U64)RegVal32 << 32; -- -+ - (void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_LO, &RegVal32); - - pPrt->LastOctets += RegVal32; -- -+ - Para.Para32[0] = 0; - SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME, - SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para); -@@ -640,8 +902,8 @@ SK_U32 Istatus) /* Interrupt status word - } - - if ((Istatus & IS_PA_TO_TX2) != 0) { -- -- pPrt = &pAC->GIni.GP[1]; -+ -+ pPrt = &pAC->GIni.GP[MAC_2]; - - /* May be a normal situation in a server with a slow network */ - SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX2); -@@ -653,25 +915,18 @@ SK_U32 Istatus) /* Interrupt status word - pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) && - !pPrt->HalfDupTimerActive) { - pPrt->HalfDupTimerActive = SK_TRUE; --#ifdef XXX -- Len = sizeof(SK_U64); -- SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, -- &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 1), -- pAC->Rlmt.Port[1].Net->NetNumber); -- -- pPrt->LastOctets = Octets; --#endif /* XXX */ -+ - /* Snap statistic counters */ - (void)SkXmUpdateStats(pAC, IoC, 1); - - (void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_HI, &RegVal32); - - pPrt->LastOctets = (SK_U64)RegVal32 << 32; -- -+ - (void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_LO, &RegVal32); - - pPrt->LastOctets += RegVal32; -- -+ - Para.Para32[0] = 1; - SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME, - SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para); -@@ -684,6 +939,7 @@ SK_U32 Istatus) /* Interrupt status word - if ((Istatus & IS_R1_C) != 0) { - /* Clear IRQ */ - SK_OUT32(IoC, B0_R1_CSR, CSR_IRQ_CL_C); -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E006, - SKERR_SIRQ_E006MSG); - Para.Para64 = MAC_1; -@@ -695,6 +951,7 @@ SK_U32 Istatus) /* Interrupt status word - if ((Istatus & IS_R2_C) != 0) { - /* Clear IRQ */ - SK_OUT32(IoC, B0_R2_CSR, CSR_IRQ_CL_C); -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E007, - SKERR_SIRQ_E007MSG); - Para.Para64 = MAC_2; -@@ -706,6 +963,7 @@ SK_U32 Istatus) /* Interrupt status word - if ((Istatus & IS_XS1_C) != 0) { - /* Clear IRQ */ - SK_OUT32(IoC, B0_XS1_CSR, CSR_IRQ_CL_C); -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E008, - SKERR_SIRQ_E008MSG); - Para.Para64 = MAC_1; -@@ -717,6 +975,7 @@ SK_U32 Istatus) /* Interrupt status word - if ((Istatus & IS_XA1_C) != 0) { - /* Clear IRQ */ - SK_OUT32(IoC, B0_XA1_CSR, CSR_IRQ_CL_C); -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E009, - SKERR_SIRQ_E009MSG); - Para.Para64 = MAC_1; -@@ -728,6 +987,7 @@ SK_U32 Istatus) /* Interrupt status word - if ((Istatus & IS_XS2_C) != 0) { - /* Clear IRQ */ - SK_OUT32(IoC, B0_XS2_CSR, CSR_IRQ_CL_C); -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E010, - SKERR_SIRQ_E010MSG); - Para.Para64 = MAC_2; -@@ -739,6 +999,7 @@ SK_U32 Istatus) /* Interrupt status word - if ((Istatus & IS_XA2_C) != 0) { - /* Clear IRQ */ - SK_OUT32(IoC, B0_XA2_CSR, CSR_IRQ_CL_C); -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E011, - SKERR_SIRQ_E011MSG); - Para.Para64 = MAC_2; -@@ -751,39 +1012,37 @@ SK_U32 Istatus) /* Interrupt status word - if ((Istatus & IS_EXT_REG) != 0) { - /* Test IRQs from PHY */ - for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -- -+ - pPrt = &pAC->GIni.GP[i]; -- -+ - if (pPrt->PState == SK_PRT_RESET) { - continue; - } -- -+ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - switch (pPrt->PhyType) { -- -+ - case SK_PHY_XMAC: - break; -- -+ - case SK_PHY_BCOM: - SkXmPhyRead(pAC, IoC, i, PHY_BCOM_INT_STAT, &PhyInt); -- -+ - if ((PhyInt & ~PHY_B_DEF_MSK) != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -- ("Port %d Bcom Int: 0x%04X\n", -- i, PhyInt)); -+ ("Port %d PHY Int: 0x%04X\n", i, PhyInt)); - SkPhyIsrBcom(pAC, IoC, i, PhyInt); - } - break; - #ifdef OTHER_PHY - case SK_PHY_LONE: - SkXmPhyRead(pAC, IoC, i, PHY_LONE_INT_STAT, &PhyInt); -- -+ - if ((PhyInt & PHY_L_DEF_MSK) != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -- ("Port %d Lone Int: %x\n", -- i, PhyInt)); -+ ("Port %d PHY Int: 0x%04X\n", i, PhyInt)); - SkPhyIsrLone(pAC, IoC, i, PhyInt); - } - break; -@@ -791,7 +1050,7 @@ SK_U32 Istatus) /* Interrupt status word - } - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* Read PHY Interrupt Status */ -@@ -799,8 +1058,7 @@ SK_U32 Istatus) /* Interrupt status word - - if ((PhyInt & PHY_M_DEF_MSK) != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -- ("Port %d Marv Int: 0x%04X\n", -- i, PhyInt)); -+ ("Port %d PHY Int: 0x%04X\n", i, PhyInt)); - SkPhyIsrGmac(pAC, IoC, i, PhyInt); - } - } -@@ -808,13 +1066,13 @@ SK_U32 Istatus) /* Interrupt status word - } - } - -- /* I2C Ready interrupt */ -+ /* TWSI Ready interrupt */ - if ((Istatus & IS_I2C_READY) != 0) { - #ifdef SK_SLIM -- SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); --#else -+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); -+#else - SkI2cIsr(pAC, IoC); --#endif -+#endif - } - - /* SW forced interrupt */ -@@ -829,7 +1087,7 @@ SK_U32 Istatus) /* Interrupt status word - * us only a link going down. - */ - /* clear interrupt */ -- SK_OUT8(IoC, MR_ADDR(MAC_1, LNK_SYNC_CTRL), LED_CLR_IRQ); -+ SK_OUT8(IoC, MR_ADDR(MAC_1, LNK_SYNC_CTRL), LNK_CLR_IRQ); - } - - /* Check MAC after link sync counter */ -@@ -844,7 +1102,7 @@ SK_U32 Istatus) /* Interrupt status word - * us only a link going down. - */ - /* clear interrupt */ -- SK_OUT8(IoC, MR_ADDR(MAC_2, LNK_SYNC_CTRL), LED_CLR_IRQ); -+ SK_OUT8(IoC, MR_ADDR(MAC_2, LNK_SYNC_CTRL), LNK_CLR_IRQ); - } - - /* Check MAC after link sync counter */ -@@ -860,13 +1118,189 @@ SK_U32 Istatus) /* Interrupt status word - /* read the HW Error Interrupt source */ - SK_IN32(IoC, B0_HWE_ISRC, &RegVal32); - -- SkGeHwErr(pAC, IoC, RegVal32); -+ SkGeYuHwErr(pAC, IoC, RegVal32); -+ } -+ -+ SkHwtIsr(pAC, IoC); -+ } -+ -+} /* SkGeYuSirqIsr */ -+ -+#ifdef YUK2 -+/****************************************************************************** -+ * -+ * SkYuk2PortSirq() - Service HW Errors for specified port (Yukon-2 only) -+ * -+ * Description: handles the HW Error interrupts for a specific port. -+ * -+ * Returns: N/A -+ */ -+static void SkYuk2PortSirq( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_U32 IStatus, /* Interrupt status word */ -+int Port) /* Port Index (MAC_1 + n) */ -+{ -+ SK_EVPARA Para; -+ int Queue; -+ SK_U16 PhyInt; -+ -+ if (Port == MAC_2) { -+ IStatus >>= 8; -+ } -+ -+ /* Interrupt from PHY */ -+ if ((IStatus & Y2_IS_IRQ_PHY1) != 0) { -+ /* Read PHY Interrupt Status */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyInt); -+ -+ if ((PhyInt & PHY_M_DEF_MSK) != 0) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -+ ("Port %d PHY Int: 0x%04X\n", Port, PhyInt)); -+ SkPhyIsrGmac(pAC, IoC, Port, PhyInt); -+ } -+ } -+ -+ /* Interrupt from MAC */ -+ if ((IStatus & Y2_IS_IRQ_MAC1) != 0) { -+ SkMacIrq(pAC, IoC, Port); -+ } -+ -+ if ((IStatus & (Y2_IS_CHK_RX1 | Y2_IS_CHK_TXS1 | Y2_IS_CHK_TXA1)) != 0) { -+ if ((IStatus & Y2_IS_CHK_RX1) != 0) { -+ if (Port == MAC_1) { -+ Queue = Q_R1; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E006, -+ SKERR_SIRQ_E006MSG); -+ } -+ else { -+ Queue = Q_R2; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E007, -+ SKERR_SIRQ_E007MSG); -+ } -+ /* Clear IRQ */ -+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_CHK); -+ } -+ -+ if ((IStatus & Y2_IS_CHK_TXS1) != 0) { -+ if (Port == MAC_1) { -+ Queue = Q_XS1; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E008, -+ SKERR_SIRQ_E008MSG); -+ } -+ else { -+ Queue = Q_XS2; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E010, -+ SKERR_SIRQ_E010MSG); -+ } -+ /* Clear IRQ */ -+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_CHK); -+ } -+ -+ if ((IStatus & Y2_IS_CHK_TXA1) != 0) { -+ if (Port == MAC_1) { -+ Queue = Q_XA1; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E009, -+ SKERR_SIRQ_E009MSG); -+ } -+ else { -+ Queue = Q_XA2; -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E011, -+ SKERR_SIRQ_E011MSG); -+ } -+ /* Clear IRQ */ -+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_CHK); - } - -+ Para.Para64 = Port; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); -+ -+ Para.Para32[0] = Port; -+ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); -+ } -+} /* SkYuk2PortSirq */ -+#endif /* YUK2 */ -+ -+/****************************************************************************** -+ * -+ * SkYuk2SirqIsr() - Special Interrupt Service Routine (Yukon-2 only) -+ * -+ * Description: handles all non data transfer specific interrupts (slow path) -+ * -+ * Returns: N/A -+ */ -+void SkYuk2SirqIsr( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_U32 Istatus) /* Interrupt status word */ -+{ -+#ifdef YUK2 -+ SK_EVPARA Para; -+ SK_U32 RegVal32; /* Read register value */ -+ SK_U8 Value; -+ -+ /* HW Error indicated ? */ -+ if (((Istatus & Y2_IS_HW_ERR) & pAC->GIni.GIValIrqMask) != 0) { -+ /* read the HW Error Interrupt source */ -+ SK_IN32(IoC, B0_HWE_ISRC, &RegVal32); -+ -+ SkYuk2HwErr(pAC, IoC, RegVal32); -+ } -+ -+ /* Interrupt from ASF Subsystem */ -+ if ((Istatus & Y2_IS_ASF) != 0) { -+ /* clear IRQ */ -+ /* later on clearing should be done in ASF ISR handler */ -+ SK_IN8(IoC, B28_Y2_ASF_STAT_CMD, &Value); -+ Value |= Y2_ASF_CLR_HSTI; -+ SK_OUT8(IoC, B28_Y2_ASF_STAT_CMD, Value); -+ /* Call IRQ handler in ASF Module */ -+ /* TBD */ -+ } -+ -+ /* Check IRQ from polling unit */ -+ if ((Istatus & Y2_IS_POLL_CHK) != 0) { -+ /* Clear IRQ */ -+ SK_OUT32(IoC, POLL_CTRL, PC_CLR_IRQ_CHK); -+ -+ SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E036, -+ SKERR_SIRQ_E036MSG); -+ Para.Para64 = 0; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para); -+ } -+ -+ /* TWSI Ready interrupt */ -+ if ((Istatus & Y2_IS_TWSI_RDY) != 0) { -+#ifdef SK_SLIM -+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); -+#else -+ SkI2cIsr(pAC, IoC); -+#endif -+ } -+ -+ /* SW forced interrupt */ -+ if ((Istatus & Y2_IS_IRQ_SW) != 0) { -+ /* clear the software IRQ */ -+ SK_OUT8(IoC, B0_CTST, CS_CL_SW_IRQ); -+ } -+ -+ if ((Istatus & Y2_IS_L1_MASK) != 0) { -+ SkYuk2PortSirq(pAC, IoC, Istatus, MAC_1); -+ } -+ -+ if ((Istatus & Y2_IS_L2_MASK) != 0) { -+ SkYuk2PortSirq(pAC, IoC, Istatus, MAC_2); -+ } -+ -+ /* Timer interrupt (served last) */ -+ if ((Istatus & Y2_IS_TIMINT) != 0) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -+ ("Timer Int: 0x%08lX\n", Istatus)); - SkHwtIsr(pAC, IoC); - } -+#endif /* YUK2 */ - --} /* SkGeSirqIsr */ -+} /* SkYuk2SirqIsr */ - - - #ifdef GENESIS -@@ -880,8 +1314,8 @@ SK_U32 Istatus) /* Interrupt status word - */ - static int SkGePortCheckShorts( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int Port) /* Which port should be checked */ -+SK_IOC IoC, /* I/O Context */ -+int Port) /* Port Index (MAC_1 + n) */ - { - SK_U32 Shorts; /* Short Event Counter */ - SK_U32 CheckShorts; /* Check value for Short Event Counter */ -@@ -909,9 +1343,9 @@ int Port) /* Which port should be chec - RxCts = 0; - - for (i = 0; i < sizeof(SkGeRxRegs)/sizeof(SkGeRxRegs[0]); i++) { -- -+ - (void)SkXmMacStatistic(pAC, IoC, Port, SkGeRxRegs[i], &RxTmp); -- -+ - RxCts += (SK_U64)RxTmp; - } - -@@ -928,11 +1362,11 @@ int Port) /* Which port should be chec - CheckShorts = 2; - - (void)SkXmMacStatistic(pAC, IoC, Port, XM_RXF_FCS_ERR, &FcsErrCts); -- -- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE && -- pPrt->PLipaAutoNeg == SK_LIPA_UNKNOWN && -- (pPrt->PLinkMode == SK_LMODE_HALF || -- pPrt->PLinkMode == SK_LMODE_FULL)) { -+ -+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE && -+ pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_UNKNOWN && -+ (pPrt->PLinkMode == (SK_U8)SK_LMODE_HALF || -+ pPrt->PLinkMode == (SK_U8)SK_LMODE_FULL)) { - /* - * This is autosensing and we are in the fallback - * manual full/half duplex mode. -@@ -941,16 +1375,16 @@ int Port) /* Which port should be chec - /* Nothing received, restart link */ - pPrt->PPrevFcs = FcsErrCts; - pPrt->PPrevShorts = Shorts; -- -+ - return(SK_HW_PS_RESTART); - } - else { -- pPrt->PLipaAutoNeg = SK_LIPA_MANUAL; -+ pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_MANUAL; - } - } - - if (((RxCts - pPrt->PPrevRx) > pPrt->PRxLim) || -- (!(FcsErrCts - pPrt->PPrevFcs))) { -+ (!(FcsErrCts - pPrt->PPrevFcs))) { - /* - * Note: The compare with zero above has to be done the way shown, - * otherwise the Linux driver will have a problem. -@@ -995,29 +1429,25 @@ int Port) /* Which port should be chec - */ - static int SkGePortCheckUp( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int Port) /* Which port should be checked */ -+SK_IOC IoC, /* I/O Context */ -+int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ - SK_BOOL AutoNeg; /* Is Auto-negotiation used ? */ - int Rtv; /* Return value */ - - Rtv = SK_HW_PS_NONE; -- -+ - pPrt = &pAC->GIni.GP[Port]; - -- if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { -- AutoNeg = SK_FALSE; -- } -- else { -- AutoNeg = SK_TRUE; -- } -+ AutoNeg = pPrt->PLinkMode != SK_LMODE_HALF && -+ pPrt->PLinkMode != SK_LMODE_FULL; - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { - - switch (pPrt->PhyType) { -- -+ - case SK_PHY_XMAC: - Rtv = SkGePortCheckUpXmac(pAC, IoC, Port, AutoNeg); - break; -@@ -1035,15 +1465,15 @@ int Port) /* Which port should be chec - } - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - Rtv = SkGePortCheckUpGmac(pAC, IoC, Port, AutoNeg); - } - #endif /* YUKON */ - -- return(Rtv); -+ return(Rtv); - } /* SkGePortCheckUp */ - - -@@ -1059,8 +1489,8 @@ int Port) /* Which port should be chec - */ - static int SkGePortCheckUpXmac( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int Port, /* Which port should be checked */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ - { - SK_U32 Shorts; /* Short Event Counter */ -@@ -1098,7 +1528,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - XM_IN16(IoC, Port, XM_ISRC, &Isrc); - IsrcSum |= Isrc; - SkXmAutoNegLipaXmac(pAC, IoC, Port, IsrcSum); -- -+ - if ((Isrc & XM_IS_INP_ASS) == 0) { - /* It has been in sync since last time */ - /* Restart the PORT */ -@@ -1117,14 +1547,14 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - * Link Restart Workaround: - * it may be possible that the other Link side - * restarts its link as well an we detect -- * another LinkBroken. To prevent this -+ * another PLinkBroken. To prevent this - * happening we check for a maximum number - * of consecutive restart. If those happens, - * we do NOT restart the active link and - * check whether the link is now o.k. - */ - pPrt->PLinkResCt++; -- -+ - pPrt->PAutoNegTimeOut = 0; - - if (pPrt->PLinkResCt < SK_MAX_LRESTART) { -@@ -1132,13 +1562,13 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - } - - pPrt->PLinkResCt = 0; -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Do NOT restart on Port %d %x %x\n", Port, Isrc, IsrcSum)); - } - else { - pPrt->PIsave = (SK_U16)(IsrcSum & XM_IS_AND); -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Save Sync/nosync Port %d %x %x\n", Port, Isrc, IsrcSum)); - -@@ -1165,7 +1595,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - if ((Isrc & XM_IS_INP_ASS) != 0) { - pPrt->PLinkBroken = SK_TRUE; - /* Re-Init Link partner Autoneg flag */ -- pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN; -+ pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN; - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Link broken Port %d\n", Port)); - -@@ -1178,7 +1608,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - } - else { - SkXmAutoNegLipaXmac(pAC, IoC, Port, Isrc); -- -+ - if (SkGePortCheckShorts(pAC, IoC, Port) == SK_HW_PS_RESTART) { - return(SK_HW_PS_RESTART); - } -@@ -1194,7 +1624,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - IsrcSum |= Isrc; - - SkXmAutoNegLipaXmac(pAC, IoC, Port, IsrcSum); -- -+ - if ((GpReg & XM_GP_INP_ASS) != 0 || (IsrcSum & XM_IS_INP_ASS) != 0) { - if ((GpReg & XM_GP_INP_ASS) == 0) { - /* Save Auto-negotiation Done interrupt only if link is in sync */ -@@ -1210,17 +1640,21 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - } - - if (AutoNeg) { -+ /* Auto-Negotiation Done ? */ - if ((IsrcSum & XM_IS_AND) != 0) { -+ - SkHWLinkUp(pAC, IoC, Port); -+ - Done = SkMacAutoNegDone(pAC, IoC, Port); -+ - if (Done != SK_AND_OK) { - /* Get PHY parameters, for debugging only */ - SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LpAb); - SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_RES_ABI, &ResAb); -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNeg FAIL Port %d (LpAb %x, ResAb %x)\n", -- Port, LpAb, ResAb)); -- -+ Port, LpAb, ResAb)); -+ - /* Try next possible mode */ - NextMode = SkHWSenseGetNext(pAC, IoC, Port); - SkHWLinkDown(pAC, IoC, Port); -@@ -1236,42 +1670,41 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - * (clear Page Received bit if set) - */ - SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_EXP, &ExtStat); -- -+ - return(SK_HW_PS_LINK); - } -- -+ - /* AutoNeg not done, but HW link is up. Check for timeouts */ -- pPrt->PAutoNegTimeOut++; -- if (pPrt->PAutoNegTimeOut >= SK_AND_MAX_TO) { -+ if (pPrt->PAutoNegTimeOut++ >= SK_AND_MAX_TO) { - /* Increase the Timeout counter */ - pPrt->PAutoNegTOCt++; - - /* Timeout occured */ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("AutoNeg timeout Port %d\n", Port)); -- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE && -- pPrt->PLipaAutoNeg != SK_LIPA_AUTO) { -+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE && -+ pPrt->PLipaAutoNeg != (SK_U8)SK_LIPA_AUTO) { - /* Set Link manually up */ - SkHWSenseSetNext(pAC, IoC, Port, SK_LMODE_FULL); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Set manual full duplex Port %d\n", Port)); - } - -- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE && -- pPrt->PLipaAutoNeg == SK_LIPA_AUTO && -+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE && -+ pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO && - pPrt->PAutoNegTOCt >= SK_MAX_ANEG_TO) { - /* - * This is rather complicated. - * we need to check here whether the LIPA_AUTO - * we saw before is false alert. We saw at one -- * switch ( SR8800) that on boot time it sends -+ * switch (SR8800) that on boot time it sends - * just one auto-neg packet and does no further - * auto-negotiation. - * Solution: we restart the autosensing after - * a few timeouts. - */ - pPrt->PAutoNegTOCt = 0; -- pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN; -+ pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN; - SkHWInitDefSense(pAC, IoC, Port); - } - -@@ -1282,18 +1715,18 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - else { - /* Link is up and we don't need more */ - #ifdef DEBUG -- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("ERROR: Lipa auto detected on port %d\n", Port)); - } - #endif /* DEBUG */ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Link sync(GP), Port %d\n", Port)); - SkHWLinkUp(pAC, IoC, Port); -- -+ - /* -- * Link sync (GP) and so assume a good connection. But if not received -- * a bunch of frames received in a time slot (maybe broken tx cable) -+ * Link sync (GP) and so assume a good connection. But if no -+ * bunch of frames received in a time slot (maybe broken Tx cable) - * the port is restart. - */ - return(SK_HW_PS_LINK); -@@ -1314,8 +1747,8 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - */ - static int SkGePortCheckUpBcom( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int Port, /* Which port should be checked */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -1334,74 +1767,6 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - /* Check for No HCD Link events (#10523) */ - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_STAT, &Isrc); - --#ifdef xDEBUG -- if ((Isrc & ~(PHY_B_IS_HCT | PHY_B_IS_LCT) == -- (PHY_B_IS_SCR_S_ER | PHY_B_IS_RRS_CHANGE | PHY_B_IS_LRS_CHANGE)) { -- -- SK_U32 Stat1, Stat2, Stat3; -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_MASK, &Stat1); -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "CheckUp1 - Stat: %x, Mask: %x", -- (void *)Isrc, -- (void *)Stat1); -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_CTRL, &Stat1); -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &Stat2); -- Stat1 = Stat1 << 16 | Stat2; -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, &Stat2); -- Stat3 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &Stat3); -- Stat2 = Stat2 << 16 | Stat3; -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "Ctrl/Stat: %x, AN Adv/LP: %x", -- (void *)Stat1, -- (void *)Stat2); -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_EXP, &Stat1); -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_EXT_STAT, &Stat2); -- Stat1 = Stat1 << 16 | Stat2; -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, &Stat2); -- Stat3 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &Stat3); -- Stat2 = Stat2 << 16 | Stat3; -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "AN Exp/IEEE Ext: %x, 1000T Ctrl/Stat: %x", -- (void *)Stat1, -- (void *)Stat2); -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_CTRL, &Stat1); -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_STAT, &Stat2); -- Stat1 = Stat1 << 16 | Stat2; -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &Stat2); -- Stat3 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_STAT, &Stat3); -- Stat2 = Stat2 << 16 | Stat3; -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "PHY Ext Ctrl/Stat: %x, Aux Ctrl/Stat: %x", -- (void *)Stat1, -- (void *)Stat2); -- } --#endif /* DEBUG */ -- - if ((Isrc & (PHY_B_IS_NO_HDCL /* | PHY_B_IS_NO_HDC */)) != 0) { - /* - * Workaround BCom Errata: -@@ -1414,14 +1779,6 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - (SK_U16)(Ctrl & ~PHY_CT_LOOP)); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("No HCD Link event, Port %d\n", Port)); --#ifdef xDEBUG -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "No HCD link event, port %d.", -- (void *)Port, -- (void *)NULL); --#endif /* DEBUG */ - } - - /* Not obsolete: link status bit is latched to 0 and autoclearing! */ -@@ -1431,72 +1788,6 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - return(SK_HW_PS_NONE); - } - --#ifdef xDEBUG -- { -- SK_U32 Stat1, Stat2, Stat3; -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_MASK, &Stat1); -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "CheckUp1a - Stat: %x, Mask: %x", -- (void *)Isrc, -- (void *)Stat1); -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_CTRL, &Stat1); -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &PhyStat); -- Stat1 = Stat1 << 16 | PhyStat; -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, &Stat2); -- Stat3 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &Stat3); -- Stat2 = Stat2 << 16 | Stat3; -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "Ctrl/Stat: %x, AN Adv/LP: %x", -- (void *)Stat1, -- (void *)Stat2); -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_EXP, &Stat1); -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_EXT_STAT, &Stat2); -- Stat1 = Stat1 << 16 | Stat2; -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, &Stat2); -- Stat3 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ResAb); -- Stat2 = Stat2 << 16 | ResAb; -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "AN Exp/IEEE Ext: %x, 1000T Ctrl/Stat: %x", -- (void *)Stat1, -- (void *)Stat2); -- -- Stat1 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_CTRL, &Stat1); -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_STAT, &Stat2); -- Stat1 = Stat1 << 16 | Stat2; -- Stat2 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &Stat2); -- Stat3 = 0; -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_STAT, &Stat3); -- Stat2 = Stat2 << 16 | Stat3; -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "PHY Ext Ctrl/Stat: %x, Aux Ctrl/Stat: %x", -- (void *)Stat1, -- (void *)Stat2); -- } --#endif /* DEBUG */ -- - /* - * Here we usually can check whether the link is in sync and - * auto-negotiation is done. -@@ -1505,7 +1796,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &PhyStat); - - SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat); -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("CheckUp Port %d, PhyStat: 0x%04X\n", Port, PhyStat)); - -@@ -1513,88 +1804,62 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - - if ((ResAb & PHY_B_1000S_MSF) != 0) { - /* Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Master/Slave Fault port %d\n", Port)); -- -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("Master/Slave Fault, ResAb: 0x%04X\n", ResAb)); -+ - pPrt->PAutoNegFail = SK_TRUE; - pPrt->PMSStatus = SK_MS_STAT_FAULT; -- -+ - return(SK_HW_PS_RESTART); - } - - if ((PhyStat & PHY_ST_LSYNC) == 0) { - return(SK_HW_PS_NONE); - } -- -+ - pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ? - SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE; -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Port %d, ResAb: 0x%04X\n", Port, ResAb)); - - if (AutoNeg) { -+ /* Auto-Negotiation Over ? */ - if ((PhyStat & PHY_ST_AN_OVER) != 0) { -- -+ - SkHWLinkUp(pAC, IoC, Port); -- -+ - Done = SkMacAutoNegDone(pAC, IoC, Port); -- -+ - if (Done != SK_AND_OK) { - #ifdef DEBUG - /* Get PHY parameters, for debugging only */ - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &LpAb); - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ExtStat); -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNeg FAIL Port %d (LpAb %x, 1000TStat %x)\n", - Port, LpAb, ExtStat)); - #endif /* DEBUG */ - return(SK_HW_PS_RESTART); - } - else { --#ifdef xDEBUG -- /* Dummy read ISR to prevent extra link downs/ups */ -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_STAT, &ExtStat); -- -- if ((ExtStat & ~(PHY_B_IS_HCT | PHY_B_IS_LCT)) != 0) { -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "CheckUp2 - Stat: %x", -- (void *)ExtStat, -- (void *)NULL); -- } --#endif /* DEBUG */ - return(SK_HW_PS_LINK); - } - } - } - else { /* !AutoNeg */ -- /* Link is up and we don't need more. */ -+ /* Link is up and we don't need more */ - #ifdef DEBUG -- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("ERROR: Lipa auto detected on port %d\n", Port)); - } - #endif /* DEBUG */ - --#ifdef xDEBUG -- /* Dummy read ISR to prevent extra link downs/ups */ -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_STAT, &ExtStat); -- -- if ((ExtStat & ~(PHY_B_IS_HCT | PHY_B_IS_LCT)) != 0) { -- CMSMPrintString( -- pAC->pConfigTable, -- MSG_TYPE_RUNTIME_INFO, -- "CheckUp3 - Stat: %x", -- (void *)ExtStat, -- (void *)NULL); -- } --#endif /* DEBUG */ -- - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Link sync(GP), Port %d\n", Port)); - SkHWLinkUp(pAC, IoC, Port); -- -+ - return(SK_HW_PS_LINK); - } - -@@ -1615,17 +1880,18 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - */ - static int SkGePortCheckUpGmac( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int Port, /* Which port should be checked */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ - int Done; -- SK_U16 PhyIsrc; /* PHY Interrupt source */ -- SK_U16 PhyStat; /* PPY Status */ -+ SK_U16 PhyStat; /* PHY Status */ - SK_U16 PhySpecStat;/* PHY Specific Status */ - SK_U16 ResAb; /* Master/Slave resolution */ -+#ifndef SK_SLIM - SK_EVPARA Para; -+#endif /* !SK_SLIM */ - #ifdef DEBUG - SK_U16 Word; /* I/O helper */ - #endif /* DEBUG */ -@@ -1642,94 +1908,124 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("CheckUp Port %d, PhyStat: 0x%04X\n", Port, PhyStat)); - -- /* Read PHY Interrupt Status */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyIsrc); -+ SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat); - -- if ((PhyIsrc & PHY_M_IS_AN_COMPL) != 0) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Auto-Negotiation Completed, PhyIsrc: 0x%04X\n", PhyIsrc)); -- } -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) { - -- if ((PhyIsrc & PHY_M_IS_LSP_CHANGE) != 0) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Link Speed Changed, PhyIsrc: 0x%04X\n", PhyIsrc)); -- } -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb); - -- SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat); -- -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb); -+ if ((ResAb & PHY_B_1000S_MSF) != 0) { -+ /* Error */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("Master/Slave Fault, ResAb: 0x%04X\n", ResAb)); - -- if ((ResAb & PHY_B_1000S_MSF) != 0) { -- /* Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Master/Slave Fault port %d\n", Port)); -- -- pPrt->PAutoNegFail = SK_TRUE; -- pPrt->PMSStatus = SK_MS_STAT_FAULT; -- -- return(SK_HW_PS_RESTART); -+ pPrt->PAutoNegFail = SK_TRUE; -+ pPrt->PMSStatus = SK_MS_STAT_FAULT; -+ -+ return(SK_HW_PS_RESTART); -+ } - } - - /* Read PHY Specific Status */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpecStat); -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Phy1000BT: 0x%04X, PhySpecStat: 0x%04X\n", ResAb, PhySpecStat)); - - #ifdef DEBUG - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_EXP, &Word); - -- if ((PhyIsrc & PHY_M_IS_AN_PR) != 0 || (Word & PHY_ANE_RX_PG) != 0 || -- (PhySpecStat & PHY_M_PS_PAGE_REC) != 0) { -+ if ((Word & PHY_ANE_RX_PG) != 0 || -+ (PhySpecStat & PHY_M_PS_PAGE_REC) != 0) { - /* Read PHY Next Page Link Partner */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_NEPG_LP, &Word); - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Page Received, NextPage: 0x%04X\n", Word)); -+ ("Page received, NextPage: 0x%04X\n", Word)); - } - #endif /* DEBUG */ - - if ((PhySpecStat & PHY_M_PS_LINK_UP) == 0) { -+ /* Link down */ - return(SK_HW_PS_NONE); - } -- -- if ((PhySpecStat & PHY_M_PS_DOWNS_STAT) != 0 || -- (PhyIsrc & PHY_M_IS_DOWNSH_DET) != 0) { -- /* Downshift detected */ -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E025, SKERR_SIRQ_E025MSG); -- -- Para.Para64 = Port; -- SkEventQueue(pAC, SKGE_DRV, SK_DRV_DOWNSHIFT_DET, Para); -- -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Downshift detected, PhyIsrc: 0x%04X\n", PhyIsrc)); -+ -+#ifdef XXX -+ SK_U16 PhyInt; -+ /* Read PHY Interrupt Status */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyInt); -+ -+ /* cross check that the link is really up */ -+ if ((PhyInt & PHY_M_IS_LST_CHANGE) == 0) { -+ /* Link Status unchanged */ -+ return(SK_HW_PS_NONE); - } -+#endif /* XXX */ -+ -+#ifndef SK_SLIM -+ if (pAC->GIni.GICopperType) { -+ -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) { -+ -+ if ((PhySpecStat & PHY_M_PS_DOWNS_STAT) != 0) { -+ /* Downshift detected */ -+ Para.Para64 = Port; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_DOWNSHIFT_DET, Para); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Downshift detected, PhySpecStat: 0x%04X\n", PhySpecStat)); -+ -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E025, -+ SKERR_SIRQ_E025MSG); -+ } -+ -+ pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ? -+ SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE; -+ } -+ -+ if ((PhySpecStat & PHY_M_PS_MDI_X_STAT) != 0) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("MDI Xover detected, PhyStat: 0x%04X\n", PhySpecStat)); -+ } -+ -+ /* on PHY 88E1112 & 88E1145 cable length is in Reg. 26, Page 5 */ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL || -+ pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) { -+ /* select page 5 to access VCT DSP distance register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 5); -+ -+ /* get VCT DSP distance */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL_2, &PhySpecStat); -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0); -+ -+ pPrt->PCableLen = (SK_U8)(PhySpecStat & PHY_M_EC2_FO_AM_MSK); -+ } -+ else { -+ pPrt->PCableLen = (SK_U8)((PhySpecStat & PHY_M_PS_CABLE_MSK) >> 7); -+ } -+ } -+#endif /* !SK_SLIM */ - -- pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ? -- SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE; -- -- pPrt->PCableLen = (SK_U8)((PhySpecStat & PHY_M_PS_CABLE_MSK) >> 7); -- - if (AutoNeg) { -- /* Auto-Negotiation Over ? */ -+ /* Auto-Negotiation Complete ? */ - if ((PhyStat & PHY_ST_AN_OVER) != 0) { -- -+ - SkHWLinkUp(pAC, IoC, Port); -- -+ - Done = SkMacAutoNegDone(pAC, IoC, Port); -- -+ - if (Done != SK_AND_OK) { - return(SK_HW_PS_RESTART); - } -- -+ - return(SK_HW_PS_LINK); - } - } - else { /* !AutoNeg */ -- /* Link is up and we don't need more */ - #ifdef DEBUG -- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("ERROR: Lipa auto detected on port %d\n", Port)); - } - #endif /* DEBUG */ -@@ -1737,12 +2033,13 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Link sync, Port %d\n", Port)); - SkHWLinkUp(pAC, IoC, Port); -- -+ - return(SK_HW_PS_LINK); - } - - return(SK_HW_PS_NONE); - } /* SkGePortCheckUpGmac */ -+ - #endif /* YUKON */ - - -@@ -1758,8 +2055,8 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - */ - static int SkGePortCheckUpLone( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int Port, /* Which port should be checked */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -1788,7 +2085,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - StatSum |= PhyStat; - - SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat); -- -+ - if ((PhyStat & PHY_ST_LSYNC) == 0) { - /* Save Auto-negotiation Done bit */ - pPrt->PIsave = (SK_U16)(StatSum & PHY_ST_AN_OVER); -@@ -1802,17 +2099,21 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - } - - if (AutoNeg) { -+ /* Auto-Negotiation Over ? */ - if ((StatSum & PHY_ST_AN_OVER) != 0) { -+ - SkHWLinkUp(pAC, IoC, Port); -+ - Done = SkMacAutoNegDone(pAC, IoC, Port); -+ - if (Done != SK_AND_OK) { - /* Get PHY parameters, for debugging only */ - SkXmPhyRead(pAC, IoC, Port, PHY_LONE_AUNE_LP, &LpAb); - SkXmPhyRead(pAC, IoC, Port, PHY_LONE_1000T_STAT, &ExtStat); -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNeg FAIL Port %d (LpAb %x, 1000TStat %x)\n", - Port, LpAb, ExtStat)); -- -+ - /* Try next possible mode */ - NextMode = SkHWSenseGetNext(pAC, IoC, Port); - SkHWLinkDown(pAC, IoC, Port); -@@ -1833,15 +2134,14 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - return(SK_HW_PS_LINK); - } - } -- -+ - /* AutoNeg not done, but HW link is up. Check for timeouts */ -- pPrt->PAutoNegTimeOut++; -- if (pPrt->PAutoNegTimeOut >= SK_AND_MAX_TO) { -+ if (pPrt->PAutoNegTimeOut++ >= SK_AND_MAX_TO) { - /* Timeout occured */ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("AutoNeg timeout Port %d\n", Port)); -- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE && -- pPrt->PLipaAutoNeg != SK_LIPA_AUTO) { -+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE && -+ pPrt->PLipaAutoNeg != (SK_U8)SK_LIPA_AUTO) { - /* Set Link manually up */ - SkHWSenseSetNext(pAC, IoC, Port, SK_LMODE_FULL); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -@@ -1855,8 +2155,8 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - else { - /* Link is up and we don't need more */ - #ifdef DEBUG -- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("ERROR: Lipa auto detected on port %d\n", Port)); - } - #endif /* DEBUG */ -@@ -1866,11 +2166,12 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - * extra link down/ups - */ - SkXmPhyRead(pAC, IoC, Port, PHY_LONE_INT_STAT, &ExtStat); -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Link sync(GP), Port %d\n", Port)); -+ - SkHWLinkUp(pAC, IoC, Port); -- -+ - return(SK_HW_PS_LINK); - } - -@@ -1889,8 +2190,8 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - */ - static int SkGePortCheckUpNat( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO Context */ --int Port, /* Which port should be checked */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ - { - /* todo: National */ -@@ -1909,38 +2210,40 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation - */ - int SkGeSirqEvent( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* Io Context */ -+SK_IOC IoC, /* I/O Context */ - SK_U32 Event, /* Module specific Event */ - SK_EVPARA Para) /* Event specific Parameter */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -- SK_U32 Port; -+ int Port; - SK_U32 Val32; - int PortStat; -+#ifndef SK_SLIM - SK_U8 Val8; -+#endif - #ifdef GENESIS - SK_U64 Octets; - #endif /* GENESIS */ - -- Port = Para.Para32[0]; -+ Port = (int)Para.Para32[0]; - pPrt = &pAC->GIni.GP[Port]; - - switch (Event) { - case SK_HWEV_WATIM: - if (pPrt->PState == SK_PRT_RESET) { -- -+ - PortStat = SK_HW_PS_NONE; - } - else { - /* Check whether port came up */ -- PortStat = SkGePortCheckUp(pAC, IoC, (int)Port); -+ PortStat = SkGePortCheckUp(pAC, IoC, Port); - } - - switch (PortStat) { - case SK_HW_PS_RESTART: - if (pPrt->PHWLinkUp) { - /* Set Link to down */ -- SkHWLinkDown(pAC, IoC, (int)Port); -+ SkHWLinkDown(pAC, IoC, Port); - - /* - * Signal directly to RLMT to ensure correct -@@ -1958,22 +2261,28 @@ SK_EVPARA Para) /* Event specific Param - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_UP, Para); - break; - } -- -+ - /* Start again the check Timer */ - if (pPrt->PHWLinkUp) { -+ - Val32 = SK_WA_ACT_TIME; - } - else { - Val32 = SK_WA_INA_TIME; -- } - -- /* Todo: still needed for non-XMAC PHYs??? */ -+ if (pAC->GIni.GIYukon) { -+ Val32 *= 5; -+ } -+ } - /* Start workaround Errata #2 timer */ - SkTimerStart(pAC, IoC, &pPrt->PWaTimer, Val32, - SKGE_HWAC, SK_HWEV_WATIM, Para); -+ - break; - - case SK_HWEV_PORT_START: -+ -+#ifndef SK_SLIM - if (pPrt->PHWLinkUp) { - /* - * Signal directly to RLMT to ensure correct -@@ -1981,8 +2290,9 @@ SK_EVPARA Para) /* Event specific Param - */ - SkRlmtEvent(pAC, IoC, SK_RLMT_LINK_DOWN, Para); - } -+#endif /* !SK_SLIM */ - -- SkHWLinkDown(pAC, IoC, (int)Port); -+ SkHWLinkDown(pAC, IoC, Port); - - /* Schedule Port RESET */ - SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Para); -@@ -1990,9 +2300,11 @@ SK_EVPARA Para) /* Event specific Param - /* Start workaround Errata #2 timer */ - SkTimerStart(pAC, IoC, &pPrt->PWaTimer, SK_WA_INA_TIME, - SKGE_HWAC, SK_HWEV_WATIM, Para); -+ - break; - - case SK_HWEV_PORT_STOP: -+#ifndef SK_SLIM - if (pPrt->PHWLinkUp) { - /* - * Signal directly to RLMT to ensure correct -@@ -2000,20 +2312,22 @@ SK_EVPARA Para) /* Event specific Param - */ - SkRlmtEvent(pAC, IoC, SK_RLMT_LINK_DOWN, Para); - } -+#endif /* !SK_SLIM */ - - /* Stop Workaround Timer */ - SkTimerStop(pAC, IoC, &pPrt->PWaTimer); - -- SkHWLinkDown(pAC, IoC, (int)Port); -+ SkHWLinkDown(pAC, IoC, Port); - break; - -+#ifndef SK_SLIM - case SK_HWEV_UPDATE_STAT: - /* We do NOT need to update any statistics */ - break; - - case SK_HWEV_CLEAR_STAT: - /* We do NOT need to clear any statistics */ -- for (Port = 0; Port < (SK_U32)pAC->GIni.GIMacsFound; Port++) { -+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) { - pPrt->PPrevRx = 0; - pPrt->PPrevFcs = 0; - pPrt->PPrevShorts = 0; -@@ -2074,6 +2388,7 @@ SK_EVPARA Para) /* Event specific Param - SkEventQueue(pAC, SKGE_HWAC, SK_HWEV_PORT_START, Para); - } - break; -+#endif /* !SK_SLIM */ - - #ifdef GENESIS - case SK_HWEV_HALFDUP_CHK: -@@ -2085,23 +2400,18 @@ SK_EVPARA Para) /* Event specific Param - pPrt->HalfDupTimerActive = SK_FALSE; - if (pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || - pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) { --#ifdef XXX -- Len = sizeof(SK_U64); -- SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, -- &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, Port), -- pAC->Rlmt.Port[Port].Net->NetNumber); --#endif /* XXX */ -+ - /* Snap statistic counters */ - (void)SkXmUpdateStats(pAC, IoC, Port); - - (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXO_OK_HI, &Val32); - - Octets = (SK_U64)Val32 << 32; -- -+ - (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXO_OK_LO, &Val32); - - Octets += Val32; -- -+ - if (pPrt->LastOctets == Octets) { - /* Tx hanging, a FIFO flush restarts it */ - SkMacFlushTxFifo(pAC, IoC, Port); -@@ -2110,7 +2420,7 @@ SK_EVPARA Para) /* Event specific Param - } - break; - #endif /* GENESIS */ -- -+ - default: - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_SIRQ_E001, SKERR_SIRQ_E001MSG); - break; -@@ -2131,8 +2441,8 @@ SK_EVPARA Para) /* Event specific Param - */ - static void SkPhyIsrBcom( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* Io Context */ --int Port, /* Port Num = PHY Num */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_U16 IStatus) /* Interrupt Status */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -2145,7 +2455,7 @@ SK_U16 IStatus) /* Interrupt Status */ - SK_ERR_LOG(pAC, SK_ERRCL_HW | SK_ERRCL_INIT, SKERR_SIRQ_E022, - SKERR_SIRQ_E022MSG); - } -- -+ - if ((IStatus & (PHY_B_IS_AN_PR | PHY_B_IS_LST_CHANGE)) != 0) { - - SkHWLinkDown(pAC, IoC, Port); -@@ -2174,8 +2484,8 @@ SK_U16 IStatus) /* Interrupt Status */ - */ - static void SkPhyIsrGmac( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* Io Context */ --int Port, /* Port Num = PHY Num */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_U16 IStatus) /* Interrupt Status */ - { - SK_GEPORT *pPrt; /* GIni Port struct pointer */ -@@ -2184,37 +2494,69 @@ SK_U16 IStatus) /* Interrupt Status */ - - pPrt = &pAC->GIni.GP[Port]; - -- if ((IStatus & (PHY_M_IS_AN_PR | PHY_M_IS_LST_CHANGE)) != 0) { -- -- SkHWLinkDown(pAC, IoC, Port); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Port %d PHY IRQ, PhyIsrc: 0x%04X\n", Port, IStatus)); - -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &Word); -+ if ((IStatus & PHY_M_IS_LST_CHANGE) != 0) { - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("AutoNeg.Adv: 0x%04X\n", Word)); -- -- /* Set Auto-negotiation advertisement */ -- if (pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) { -- /* restore Asymmetric Pause bit */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV, -- (SK_U16)(Word | PHY_M_AN_ASP)); -- } -- -+ ("Link Status changed\n")); -+ - Para.Para32[0] = (SK_U32)Port; -- /* Signal to RLMT */ -- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); -+ -+ if (pPrt->PHWLinkUp) { -+ -+ SkHWLinkDown(pAC, IoC, Port); -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &Word); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("AutoNeg.Adv: 0x%04X\n", Word)); -+ -+ /* Set Auto-negotiation advertisement */ -+ if (pAC->GIni.GIChipId != CHIP_ID_YUKON_FE && -+ pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) { -+ /* restore Asymmetric Pause bit */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV, -+ (SK_U16)(Word | PHY_M_AN_ASP)); -+ } -+ -+ /* Signal to RLMT */ -+ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); -+ } -+ else { -+ if ((IStatus & PHY_M_IS_AN_COMPL) != 0) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Auto-Negotiation completed\n")); -+ } -+ -+ if ((IStatus & PHY_M_IS_LSP_CHANGE) != 0) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Link Speed changed\n")); -+ } -+ -+ SkEventQueue(pAC, SKGE_HWAC, SK_HWEV_WATIM, Para); -+ } - } -- -+ - if ((IStatus & PHY_M_IS_AN_ERROR) != 0) { -- /* Auto-Negotiation Error */ -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E023, SKERR_SIRQ_E023MSG); -+ /* the copper PHY makes 1 retry */ -+ if (pAC->GIni.GICopperType) { -+ /* not logged as error, it might be the first attempt */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Auto-Negotiation Error\n")); -+ } -+ else { -+ /* Auto-Negotiation Error */ -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E023, SKERR_SIRQ_E023MSG); -+ } - } -- -+ - if ((IStatus & PHY_M_IS_FIFO_ERROR) != 0) { - /* FIFO Overflow/Underrun Error */ - SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E024, SKERR_SIRQ_E024MSG); - } -- -+ - } /* SkPhyIsrGmac */ - #endif /* YUKON */ - -@@ -2230,14 +2572,14 @@ SK_U16 IStatus) /* Interrupt Status */ - */ - static void SkPhyIsrLone( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* Io Context */ --int Port, /* Port Num = PHY Num */ -+SK_IOC IoC, /* I/O Context */ -+int Port, /* Port Index (MAC_1 + n) */ - SK_U16 IStatus) /* Interrupt Status */ - { - SK_EVPARA Para; - - if (IStatus & (PHY_L_IS_DUP | PHY_L_IS_ISOL)) { -- -+ - SkHWLinkDown(pAC, IoC, Port); - - Para.Para32[0] = (SK_U32)Port; -@@ -2249,3 +2591,4 @@ SK_U16 IStatus) /* Interrupt Status */ - #endif /* OTHER_PHY */ - - /* End of File */ -+ ---- ./drivers/net/sk98lin/ski2c.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/ski2c.c 1970-01-01 03:00:00.000000000 +0300 -@@ -1,1296 +0,0 @@ --/****************************************************************************** -- * -- * Name: ski2c.c -- * Project: Gigabit Ethernet Adapters, TWSI-Module -- * Version: $Revision: 1.59 $ -- * Date: $Date: 2003/10/20 09:07:25 $ -- * Purpose: Functions to access Voltage and Temperature Sensor -- * -- ******************************************************************************/ -- --/****************************************************************************** -- * -- * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * The information in this file is provided "AS IS" without warranty. -- * -- ******************************************************************************/ -- --/* -- * I2C Protocol -- */ --#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) --static const char SysKonnectFileId[] = -- "@(#) $Id: ski2c.c,v 1.59 2003/10/20 09:07:25 rschmidt Exp $ (C) Marvell. "; --#endif -- --#include "h/skdrv1st.h" /* Driver Specific Definitions */ --#include "h/lm80.h" --#include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */ -- --#ifdef __C2MAN__ --/* -- I2C protocol implementation. -- -- General Description: -- -- The I2C protocol is used for the temperature sensors and for -- the serial EEPROM which hold the configuration. -- -- This file covers functions that allow to read write and do -- some bulk requests a specified I2C address. -- -- The Genesis has 2 I2C buses. One for the EEPROM which holds -- the VPD Data and one for temperature and voltage sensor. -- The following picture shows the I2C buses, I2C devices and -- their control registers. -- -- Note: The VPD functions are in skvpd.c --. --. PCI Config I2C Bus for VPD Data: --. --. +------------+ --. | VPD EEPROM | --. +------------+ --. | --. | <-- I2C --. | --. +-----------+-----------+ --. | | --. +-----------------+ +-----------------+ --. | PCI_VPD_ADR_REG | | PCI_VPD_DAT_REG | --. +-----------------+ +-----------------+ --. --. --. I2C Bus for LM80 sensor: --. --. +-----------------+ --. | Temperature and | --. | Voltage Sensor | --. | LM80 | --. +-----------------+ --. | --. | --. I2C --> | --. | --. +----+ --. +-------------->| OR |<--+ --. | +----+ | --. +------+------+ | --. | | | --. +--------+ +--------+ +----------+ --. | B2_I2C | | B2_I2C | | B2_I2C | --. | _CTRL | | _DATA | | _SW | --. +--------+ +--------+ +----------+ --. -- The I2C bus may be driven by the B2_I2C_SW or by the B2_I2C_CTRL -- and B2_I2C_DATA registers. -- For driver software it is recommended to use the I2C control and -- data register, because I2C bus timing is done by the ASIC and -- an interrupt may be received when the I2C request is completed. -- -- Clock Rate Timing: MIN MAX generated by -- VPD EEPROM: 50 kHz 100 kHz HW -- LM80 over I2C Ctrl/Data reg. 50 kHz 100 kHz HW -- LM80 over B2_I2C_SW register 0 400 kHz SW -- -- Note: The clock generated by the hardware is dependend on the -- PCI clock. If the PCI bus clock is 33 MHz, the I2C/VPD -- clock is 50 kHz. -- */ --intro() --{} --#endif -- --#ifdef SK_DIAG --/* -- * I2C Fast Mode timing values used by the LM80. -- * If new devices are added to the I2C bus the timing values have to be checked. -- */ --#ifndef I2C_SLOW_TIMING --#define T_CLK_LOW 1300L /* clock low time in ns */ --#define T_CLK_HIGH 600L /* clock high time in ns */ --#define T_DATA_IN_SETUP 100L /* data in Set-up Time */ --#define T_START_HOLD 600L /* start condition hold time */ --#define T_START_SETUP 600L /* start condition Set-up time */ --#define T_STOP_SETUP 600L /* stop condition Set-up time */ --#define T_BUS_IDLE 1300L /* time the bus must free after Tx */ --#define T_CLK_2_DATA_OUT 900L /* max. clock low to data output valid */ --#else /* I2C_SLOW_TIMING */ --/* I2C Standard Mode Timing */ --#define T_CLK_LOW 4700L /* clock low time in ns */ --#define T_CLK_HIGH 4000L /* clock high time in ns */ --#define T_DATA_IN_SETUP 250L /* data in Set-up Time */ --#define T_START_HOLD 4000L /* start condition hold time */ --#define T_START_SETUP 4700L /* start condition Set-up time */ --#define T_STOP_SETUP 4000L /* stop condition Set-up time */ --#define T_BUS_IDLE 4700L /* time the bus must free after Tx */ --#endif /* !I2C_SLOW_TIMING */ -- --#define NS2BCLK(x) (((x)*125)/10000) -- --/* -- * I2C Wire Operations -- * -- * About I2C_CLK_LOW(): -- * -- * The Data Direction bit (I2C_DATA_DIR) has to be set to input when setting -- * clock to low, to prevent the ASIC and the I2C data client from driving the -- * serial data line simultaneously (ASIC: last bit of a byte = '1', I2C client -- * send an 'ACK'). See also Concentrator Bugreport No. 10192. -- */ --#define I2C_DATA_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA) --#define I2C_DATA_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA) --#define I2C_DATA_OUT(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA_DIR) --#define I2C_DATA_IN(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA) --#define I2C_CLK_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_CLK) --#define I2C_CLK_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK | I2C_DATA_DIR) --#define I2C_START_COND(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK) -- --#define NS2CLKT(x) ((x*125L)/10000) -- --/*--------------- I2C Interface Register Functions --------------- */ -- --/* -- * sending one bit -- */ --void SkI2cSndBit( --SK_IOC IoC, /* I/O Context */ --SK_U8 Bit) /* Bit to send */ --{ -- I2C_DATA_OUT(IoC); -- if (Bit) { -- I2C_DATA_HIGH(IoC); -- } -- else { -- I2C_DATA_LOW(IoC); -- } -- SkDgWaitTime(IoC, NS2BCLK(T_DATA_IN_SETUP)); -- I2C_CLK_HIGH(IoC); -- SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH)); -- I2C_CLK_LOW(IoC); --} /* SkI2cSndBit*/ -- -- --/* -- * Signal a start to the I2C Bus. -- * -- * A start is signaled when data goes to low in a high clock cycle. -- * -- * Ends with Clock Low. -- * -- * Status: not tested -- */ --void SkI2cStart( --SK_IOC IoC) /* I/O Context */ --{ -- /* Init data and Clock to output lines */ -- /* Set Data high */ -- I2C_DATA_OUT(IoC); -- I2C_DATA_HIGH(IoC); -- /* Set Clock high */ -- I2C_CLK_HIGH(IoC); -- -- SkDgWaitTime(IoC, NS2BCLK(T_START_SETUP)); -- -- /* Set Data Low */ -- I2C_DATA_LOW(IoC); -- -- SkDgWaitTime(IoC, NS2BCLK(T_START_HOLD)); -- -- /* Clock low without Data to Input */ -- I2C_START_COND(IoC); -- -- SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW)); --} /* SkI2cStart */ -- -- --void SkI2cStop( --SK_IOC IoC) /* I/O Context */ --{ -- /* Init data and Clock to output lines */ -- /* Set Data low */ -- I2C_DATA_OUT(IoC); -- I2C_DATA_LOW(IoC); -- -- SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT)); -- -- /* Set Clock high */ -- I2C_CLK_HIGH(IoC); -- -- SkDgWaitTime(IoC, NS2BCLK(T_STOP_SETUP)); -- -- /* -- * Set Data High: Do it by setting the Data Line to Input. -- * Because of a pull up resistor the Data Line -- * floods to high. -- */ -- I2C_DATA_IN(IoC); -- -- /* -- * When I2C activity is stopped -- * o DATA should be set to input and -- * o CLOCK should be set to high! -- */ -- SkDgWaitTime(IoC, NS2BCLK(T_BUS_IDLE)); --} /* SkI2cStop */ -- -- --/* -- * Receive just one bit via the I2C bus. -- * -- * Note: Clock must be set to LOW before calling this function. -- * -- * Returns The received bit. -- */ --int SkI2cRcvBit( --SK_IOC IoC) /* I/O Context */ --{ -- int Bit; -- SK_U8 I2cSwCtrl; -- -- /* Init data as input line */ -- I2C_DATA_IN(IoC); -- -- SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT)); -- -- I2C_CLK_HIGH(IoC); -- -- SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH)); -- -- SK_I2C_GET_SW(IoC, &I2cSwCtrl); -- -- Bit = (I2cSwCtrl & I2C_DATA) ? 1 : 0; -- -- I2C_CLK_LOW(IoC); -- SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW-T_CLK_2_DATA_OUT)); -- -- return(Bit); --} /* SkI2cRcvBit */ -- -- --/* -- * Receive an ACK. -- * -- * returns 0 If acknowledged -- * 1 in case of an error -- */ --int SkI2cRcvAck( --SK_IOC IoC) /* I/O Context */ --{ -- /* -- * Received bit must be zero. -- */ -- return(SkI2cRcvBit(IoC) != 0); --} /* SkI2cRcvAck */ -- -- --/* -- * Send an NACK. -- */ --void SkI2cSndNAck( --SK_IOC IoC) /* I/O Context */ --{ -- /* -- * Received bit must be zero. -- */ -- SkI2cSndBit(IoC, 1); --} /* SkI2cSndNAck */ -- -- --/* -- * Send an ACK. -- */ --void SkI2cSndAck( --SK_IOC IoC) /* I/O Context */ --{ -- /* -- * Received bit must be zero. -- */ -- SkI2cSndBit(IoC, 0); --} /* SkI2cSndAck */ -- -- --/* -- * Send one byte to the I2C device and wait for ACK. -- * -- * Return acknowleged status. -- */ --int SkI2cSndByte( --SK_IOC IoC, /* I/O Context */ --int Byte) /* byte to send */ --{ -- int i; -- -- for (i = 0; i < 8; i++) { -- if (Byte & (1<<(7-i))) { -- SkI2cSndBit(IoC, 1); -- } -- else { -- SkI2cSndBit(IoC, 0); -- } -- } -- -- return(SkI2cRcvAck(IoC)); --} /* SkI2cSndByte */ -- -- --/* -- * Receive one byte and ack it. -- * -- * Return byte. -- */ --int SkI2cRcvByte( --SK_IOC IoC, /* I/O Context */ --int Last) /* Last Byte Flag */ --{ -- int i; -- int Byte = 0; -- -- for (i = 0; i < 8; i++) { -- Byte <<= 1; -- Byte |= SkI2cRcvBit(IoC); -- } -- -- if (Last) { -- SkI2cSndNAck(IoC); -- } -- else { -- SkI2cSndAck(IoC); -- } -- -- return(Byte); --} /* SkI2cRcvByte */ -- -- --/* -- * Start dialog and send device address -- * -- * Return 0 if acknowleged, 1 in case of an error -- */ --int SkI2cSndDev( --SK_IOC IoC, /* I/O Context */ --int Addr, /* Device Address */ --int Rw) /* Read / Write Flag */ --{ -- SkI2cStart(IoC); -- Rw = ~Rw; -- Rw &= I2C_WRITE; -- return(SkI2cSndByte(IoC, (Addr<<1) | Rw)); --} /* SkI2cSndDev */ -- --#endif /* SK_DIAG */ -- --/*----------------- I2C CTRL Register Functions ----------*/ -- --/* -- * waits for a completion of an I2C transfer -- * -- * returns 0: success, transfer completes -- * 1: error, transfer does not complete, I2C transfer -- * killed, wait loop terminated. -- */ --int SkI2cWait( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* I/O Context */ --int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */ --{ -- SK_U64 StartTime; -- SK_U64 CurrentTime; -- SK_U32 I2cCtrl; -- -- StartTime = SkOsGetTime(pAC); -- -- do { -- CurrentTime = SkOsGetTime(pAC); -- -- if (CurrentTime - StartTime > SK_TICKS_PER_SEC / 8) { -- -- SK_I2C_STOP(IoC); --#ifndef SK_DIAG -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG); --#endif /* !SK_DIAG */ -- return(1); -- } -- -- SK_I2C_GET_CTL(IoC, &I2cCtrl); -- --#ifdef xYUKON_DBG -- printf("StartTime=%lu, CurrentTime=%lu\n", -- StartTime, CurrentTime); -- if (kbhit()) { -- return(1); -- } --#endif /* YUKON_DBG */ -- -- } while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31); -- -- return(0); --} /* SkI2cWait */ -- -- --/* -- * waits for a completion of an I2C transfer -- * -- * Returns -- * Nothing -- */ --void SkI2cWaitIrq( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC) /* I/O Context */ --{ -- SK_SENSOR *pSen; -- SK_U64 StartTime; -- SK_U32 IrqSrc; -- -- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -- -- if (pSen->SenState == SK_SEN_IDLE) { -- return; -- } -- -- StartTime = SkOsGetTime(pAC); -- -- do { -- if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) { -- -- SK_I2C_STOP(IoC); --#ifndef SK_DIAG -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E016, SKERR_I2C_E016MSG); --#endif /* !SK_DIAG */ -- return; -- } -- -- SK_IN32(IoC, B0_ISRC, &IrqSrc); -- -- } while ((IrqSrc & IS_I2C_READY) == 0); -- -- pSen->SenState = SK_SEN_IDLE; -- return; --} /* SkI2cWaitIrq */ -- --/* -- * writes a single byte or 4 bytes into the I2C device -- * -- * returns 0: success -- * 1: error -- */ --int SkI2cWrite( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* I/O Context */ --SK_U32 I2cData, /* I2C Data to write */ --int I2cDev, /* I2C Device Address */ --int I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */ --int I2cReg, /* I2C Device Register Address */ --int I2cBurst) /* I2C Burst Flag */ --{ -- SK_OUT32(IoC, B2_I2C_DATA, I2cData); -- -- SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cDevSize, I2cReg, I2cBurst); -- -- return(SkI2cWait(pAC, IoC, I2C_WRITE)); --} /* SkI2cWrite*/ -- -- --#ifdef SK_DIAG --/* -- * reads a single byte or 4 bytes from the I2C device -- * -- * returns the word read -- */ --SK_U32 SkI2cRead( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* I/O Context */ --int I2cDev, /* I2C Device Address */ --int I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */ --int I2cReg, /* I2C Device Register Address */ --int I2cBurst) /* I2C Burst Flag */ --{ -- SK_U32 Data; -- -- SK_OUT32(IoC, B2_I2C_DATA, 0); -- SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cDevSize, I2cReg, I2cBurst); -- -- if (SkI2cWait(pAC, IoC, I2C_READ) != 0) { -- w_print("%s\n", SKERR_I2C_E002MSG); -- } -- -- SK_IN32(IoC, B2_I2C_DATA, &Data); -- -- return(Data); --} /* SkI2cRead */ --#endif /* SK_DIAG */ -- -- --/* -- * read a sensor's value -- * -- * This function reads a sensor's value from the I2C sensor chip. The sensor -- * is defined by its index into the sensors database in the struct pAC points -- * to. -- * Returns -- * 1 if the read is completed -- * 0 if the read must be continued (I2C Bus still allocated) -- */ --int SkI2cReadSensor( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* I/O Context */ --SK_SENSOR *pSen) /* Sensor to be read */ --{ -- if (pSen->SenRead != NULL) { -- return((*pSen->SenRead)(pAC, IoC, pSen)); -- } -- else { -- return(0); /* no success */ -- } --} /* SkI2cReadSensor */ -- --/* -- * Do the Init state 0 initialization -- */ --static int SkI2cInit0( --SK_AC *pAC) /* Adapter Context */ --{ -- int i; -- -- /* Begin with first sensor */ -- pAC->I2c.CurrSens = 0; -- -- /* Begin with timeout control for state machine */ -- pAC->I2c.TimerMode = SK_TIMER_WATCH_SM; -- -- /* Set sensor number to zero */ -- pAC->I2c.MaxSens = 0; -- --#ifndef SK_DIAG -- /* Initialize Number of Dummy Reads */ -- pAC->I2c.DummyReads = SK_MAX_SENSORS; --#endif -- -- for (i = 0; i < SK_MAX_SENSORS; i++) { -- pAC->I2c.SenTable[i].SenDesc = "unknown"; -- pAC->I2c.SenTable[i].SenType = SK_SEN_UNKNOWN; -- pAC->I2c.SenTable[i].SenThreErrHigh = 0; -- pAC->I2c.SenTable[i].SenThreErrLow = 0; -- pAC->I2c.SenTable[i].SenThreWarnHigh = 0; -- pAC->I2c.SenTable[i].SenThreWarnLow = 0; -- pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN; -- pAC->I2c.SenTable[i].SenInit = SK_SEN_DYN_INIT_NONE; -- pAC->I2c.SenTable[i].SenValue = 0; -- pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_NOT_PRESENT; -- pAC->I2c.SenTable[i].SenErrCts = 0; -- pAC->I2c.SenTable[i].SenBegErrTS = 0; -- pAC->I2c.SenTable[i].SenState = SK_SEN_IDLE; -- pAC->I2c.SenTable[i].SenRead = NULL; -- pAC->I2c.SenTable[i].SenDev = 0; -- } -- -- /* Now we are "INIT data"ed */ -- pAC->I2c.InitLevel = SK_INIT_DATA; -- return(0); --} /* SkI2cInit0*/ -- -- --/* -- * Do the init state 1 initialization -- * -- * initialize the following register of the LM80: -- * Configuration register: -- * - START, noINT, activeLOW, noINT#Clear, noRESET, noCI, noGPO#, noINIT -- * -- * Interrupt Mask Register 1: -- * - all interrupts are Disabled (0xff) -- * -- * Interrupt Mask Register 2: -- * - all interrupts are Disabled (0xff) Interrupt modi doesn't matter. -- * -- * Fan Divisor/RST_OUT register: -- * - Divisors set to 1 (bits 00), all others 0s. -- * -- * OS# Configuration/Temperature resolution Register: -- * - all 0s -- * -- */ --static int SkI2cInit1( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC) /* I/O Context */ --{ -- int i; -- SK_U8 I2cSwCtrl; -- SK_GEPORT *pPrt; /* GIni Port struct pointer */ -- -- if (pAC->I2c.InitLevel != SK_INIT_DATA) { -- /* ReInit not needed in I2C module */ -- return(0); -- } -- -- /* Set the Direction of I2C-Data Pin to IN */ -- SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA); -- /* Check for 32-Bit Yukon with Low at I2C-Data Pin */ -- SK_I2C_GET_SW(IoC, &I2cSwCtrl); -- -- if ((I2cSwCtrl & I2C_DATA) == 0) { -- /* this is a 32-Bit board */ -- pAC->GIni.GIYukon32Bit = SK_TRUE; -- return(0); -- } -- -- /* Check for 64 Bit Yukon without sensors */ -- if (SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_CFG, 0) != 0) { -- return(0); -- } -- -- (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_1, 0); -- -- (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_2, 0); -- -- (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_FAN_CTRL, 0); -- -- (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_TEMP_CTRL, 0); -- -- (void)SkI2cWrite(pAC, IoC, (SK_U32)LM80_CFG_START, LM80_ADDR, I2C_025K_DEV, -- LM80_CFG, 0); -- -- /* -- * MaxSens has to be updated here, because PhyType is not -- * set when performing Init Level 0 -- */ -- pAC->I2c.MaxSens = 5; -- -- pPrt = &pAC->GIni.GP[0]; -- -- if (pAC->GIni.GIGenesis) { -- if (pPrt->PhyType == SK_PHY_BCOM) { -- if (pAC->GIni.GIMacsFound == 1) { -- pAC->I2c.MaxSens += 1; -- } -- else { -- pAC->I2c.MaxSens += 3; -- } -- } -- } -- else { -- pAC->I2c.MaxSens += 3; -- } -- -- for (i = 0; i < pAC->I2c.MaxSens; i++) { -- switch (i) { -- case 0: -- pAC->I2c.SenTable[i].SenDesc = "Temperature"; -- pAC->I2c.SenTable[i].SenType = SK_SEN_TEMP; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_TEMP_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_TEMP_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_TEMP_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_TEMP_LOW_ERR; -- pAC->I2c.SenTable[i].SenReg = LM80_TEMP_IN; -- break; -- case 1: -- pAC->I2c.SenTable[i].SenDesc = "Voltage PCI"; -- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PCI_5V_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PCI_5V_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PCI_5V_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PCI_5V_LOW_ERR; -- pAC->I2c.SenTable[i].SenReg = LM80_VT0_IN; -- break; -- case 2: -- pAC->I2c.SenTable[i].SenDesc = "Voltage PCI-IO"; -- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PCI_IO_5V_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PCI_IO_5V_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PCI_IO_3V3_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PCI_IO_3V3_LOW_ERR; -- pAC->I2c.SenTable[i].SenReg = LM80_VT1_IN; -- pAC->I2c.SenTable[i].SenInit = SK_SEN_DYN_INIT_PCI_IO; -- break; -- case 3: -- pAC->I2c.SenTable[i].SenDesc = "Voltage ASIC"; -- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_VDD_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_VDD_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VDD_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VDD_LOW_ERR; -- pAC->I2c.SenTable[i].SenReg = LM80_VT2_IN; -- break; -- case 4: -- if (pAC->GIni.GIGenesis) { -- if (pPrt->PhyType == SK_PHY_BCOM) { -- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY A PLL"; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; -- } -- else { -- pAC->I2c.SenTable[i].SenDesc = "Voltage PMA"; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; -- } -- } -- else { -- pAC->I2c.SenTable[i].SenDesc = "Voltage VAUX"; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_VAUX_3V3_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_VAUX_3V3_HIGH_WARN; -- if (pAC->GIni.GIVauxAvail) { -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR; -- } -- else { -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VAUX_0V_WARN_ERR; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VAUX_0V_WARN_ERR; -- } -- } -- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; -- pAC->I2c.SenTable[i].SenReg = LM80_VT3_IN; -- break; -- case 5: -- if (pAC->GIni.GIGenesis) { -- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5"; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; -- } -- else { -- pAC->I2c.SenTable[i].SenDesc = "Voltage Core 1V5"; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR; -- } -- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; -- pAC->I2c.SenTable[i].SenReg = LM80_VT4_IN; -- break; -- case 6: -- if (pAC->GIni.GIGenesis) { -- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY B PLL"; -- } -- else { -- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 3V3"; -- } -- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; -- pAC->I2c.SenTable[i].SenReg = LM80_VT5_IN; -- break; -- case 7: -- if (pAC->GIni.GIGenesis) { -- pAC->I2c.SenTable[i].SenDesc = "Speed Fan"; -- pAC->I2c.SenTable[i].SenType = SK_SEN_FAN; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_FAN_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_FAN_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_FAN_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_FAN_LOW_ERR; -- pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN; -- } -- else { -- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5"; -- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; -- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; -- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; -- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; -- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; -- pAC->I2c.SenTable[i].SenReg = LM80_VT6_IN; -- } -- break; -- default: -- SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW, -- SKERR_I2C_E001, SKERR_I2C_E001MSG); -- break; -- } -- -- pAC->I2c.SenTable[i].SenValue = 0; -- pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK; -- pAC->I2c.SenTable[i].SenErrCts = 0; -- pAC->I2c.SenTable[i].SenBegErrTS = 0; -- pAC->I2c.SenTable[i].SenState = SK_SEN_IDLE; -- pAC->I2c.SenTable[i].SenRead = SkLm80ReadSensor; -- pAC->I2c.SenTable[i].SenDev = LM80_ADDR; -- } -- --#ifndef SK_DIAG -- pAC->I2c.DummyReads = pAC->I2c.MaxSens; --#endif /* !SK_DIAG */ -- -- /* Clear I2C IRQ */ -- SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); -- -- /* Now we are I/O initialized */ -- pAC->I2c.InitLevel = SK_INIT_IO; -- return(0); --} /* SkI2cInit1 */ -- -- --/* -- * Init level 2: Start first sensor read. -- */ --static int SkI2cInit2( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC) /* I/O Context */ --{ -- int ReadComplete; -- SK_SENSOR *pSen; -- -- if (pAC->I2c.InitLevel != SK_INIT_IO) { -- /* ReInit not needed in I2C module */ -- /* Init0 and Init2 not permitted */ -- return(0); -- } -- -- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -- ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); -- -- if (ReadComplete) { -- SK_ERR_LOG(pAC, SK_ERRCL_INIT, SKERR_I2C_E008, SKERR_I2C_E008MSG); -- } -- -- /* Now we are correctly initialized */ -- pAC->I2c.InitLevel = SK_INIT_RUN; -- -- return(0); --} /* SkI2cInit2*/ -- -- --/* -- * Initialize I2C devices -- * -- * Get the first voltage value and discard it. -- * Go into temperature read mode. A default pointer is not set. -- * -- * The things to be done depend on the init level in the parameter list: -- * Level 0: -- * Initialize only the data structures. Do NOT access hardware. -- * Level 1: -- * Initialize hardware through SK_IN / SK_OUT commands. Do NOT use interrupts. -- * Level 2: -- * Everything is possible. Interrupts may be used from now on. -- * -- * return: -- * 0 = success -- * other = error. -- */ --int SkI2cInit( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* I/O Context needed in levels 1 and 2 */ --int Level) /* Init Level */ --{ -- -- switch (Level) { -- case SK_INIT_DATA: -- return(SkI2cInit0(pAC)); -- case SK_INIT_IO: -- return(SkI2cInit1(pAC, IoC)); -- case SK_INIT_RUN: -- return(SkI2cInit2(pAC, IoC)); -- default: -- break; -- } -- -- return(0); --} /* SkI2cInit */ -- -- --#ifndef SK_DIAG -- --/* -- * Interrupt service function for the I2C Interface -- * -- * Clears the Interrupt source -- * -- * Reads the register and check it for sending a trap. -- * -- * Starts the timer if necessary. -- */ --void SkI2cIsr( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC) /* I/O Context */ --{ -- SK_EVPARA Para; -- -- /* Clear I2C IRQ */ -- SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); -- -- Para.Para64 = 0; -- SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_IRQ, Para); --} /* SkI2cIsr */ -- -- --/* -- * Check this sensors Value against the threshold and send events. -- */ --static void SkI2cCheckSensor( --SK_AC *pAC, /* Adapter Context */ --SK_SENSOR *pSen) --{ -- SK_EVPARA ParaLocal; -- SK_BOOL TooHigh; /* Is sensor too high? */ -- SK_BOOL TooLow; /* Is sensor too low? */ -- SK_U64 CurrTime; /* Current Time */ -- SK_BOOL DoTrapSend; /* We need to send a trap */ -- SK_BOOL DoErrLog; /* We need to log the error */ -- SK_BOOL IsError; /* We need to log the error */ -- -- /* Check Dummy Reads first */ -- if (pAC->I2c.DummyReads > 0) { -- pAC->I2c.DummyReads--; -- return; -- } -- -- /* Get the current time */ -- CurrTime = SkOsGetTime(pAC); -- -- /* Set para to the most useful setting: The current sensor. */ -- ParaLocal.Para64 = (SK_U64)pAC->I2c.CurrSens; -- -- /* Check the Value against the thresholds. First: Error Thresholds */ -- TooHigh = (pSen->SenValue > pSen->SenThreErrHigh); -- TooLow = (pSen->SenValue < pSen->SenThreErrLow); -- -- IsError = SK_FALSE; -- if (TooHigh || TooLow) { -- /* Error condition is satisfied */ -- DoTrapSend = SK_TRUE; -- DoErrLog = SK_TRUE; -- -- /* Now error condition is satisfied */ -- IsError = SK_TRUE; -- -- if (pSen->SenErrFlag == SK_SEN_ERR_ERR) { -- /* This state is the former one */ -- -- /* So check first whether we have to send a trap */ -- if (pSen->SenLastErrTrapTS + SK_SEN_ERR_TR_HOLD > -- CurrTime) { -- /* -- * Do NOT send the Trap. The hold back time -- * has to run out first. -- */ -- DoTrapSend = SK_FALSE; -- } -- -- /* Check now whether we have to log an Error */ -- if (pSen->SenLastErrLogTS + SK_SEN_ERR_LOG_HOLD > -- CurrTime) { -- /* -- * Do NOT log the error. The hold back time -- * has to run out first. -- */ -- DoErrLog = SK_FALSE; -- } -- } -- else { -- /* We came from a different state -> Set Begin Time Stamp */ -- pSen->SenBegErrTS = CurrTime; -- pSen->SenErrFlag = SK_SEN_ERR_ERR; -- } -- -- if (DoTrapSend) { -- /* Set current Time */ -- pSen->SenLastErrTrapTS = CurrTime; -- pSen->SenErrCts++; -- -- /* Queue PNMI Event */ -- SkEventQueue(pAC, SKGE_PNMI, (TooHigh ? -- SK_PNMI_EVT_SEN_ERR_UPP : -- SK_PNMI_EVT_SEN_ERR_LOW), -- ParaLocal); -- } -- -- if (DoErrLog) { -- /* Set current Time */ -- pSen->SenLastErrLogTS = CurrTime; -- -- if (pSen->SenType == SK_SEN_TEMP) { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E011, SKERR_I2C_E011MSG); -- } -- else if (pSen->SenType == SK_SEN_VOLT) { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E012, SKERR_I2C_E012MSG); -- } -- else { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E015, SKERR_I2C_E015MSG); -- } -- } -- } -- -- /* Check the Value against the thresholds */ -- /* 2nd: Warning thresholds */ -- TooHigh = (pSen->SenValue > pSen->SenThreWarnHigh); -- TooLow = (pSen->SenValue < pSen->SenThreWarnLow); -- -- if (!IsError && (TooHigh || TooLow)) { -- /* Error condition is satisfied */ -- DoTrapSend = SK_TRUE; -- DoErrLog = SK_TRUE; -- -- if (pSen->SenErrFlag == SK_SEN_ERR_WARN) { -- /* This state is the former one */ -- -- /* So check first whether we have to send a trap */ -- if (pSen->SenLastWarnTrapTS + SK_SEN_WARN_TR_HOLD > CurrTime) { -- /* -- * Do NOT send the Trap. The hold back time -- * has to run out first. -- */ -- DoTrapSend = SK_FALSE; -- } -- -- /* Check now whether we have to log an Error */ -- if (pSen->SenLastWarnLogTS + SK_SEN_WARN_LOG_HOLD > CurrTime) { -- /* -- * Do NOT log the error. The hold back time -- * has to run out first. -- */ -- DoErrLog = SK_FALSE; -- } -- } -- else { -- /* We came from a different state -> Set Begin Time Stamp */ -- pSen->SenBegWarnTS = CurrTime; -- pSen->SenErrFlag = SK_SEN_ERR_WARN; -- } -- -- if (DoTrapSend) { -- /* Set current Time */ -- pSen->SenLastWarnTrapTS = CurrTime; -- pSen->SenWarnCts++; -- -- /* Queue PNMI Event */ -- SkEventQueue(pAC, SKGE_PNMI, (TooHigh ? -- SK_PNMI_EVT_SEN_WAR_UPP : -- SK_PNMI_EVT_SEN_WAR_LOW), -- ParaLocal); -- } -- -- if (DoErrLog) { -- /* Set current Time */ -- pSen->SenLastWarnLogTS = CurrTime; -- -- if (pSen->SenType == SK_SEN_TEMP) { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E009, SKERR_I2C_E009MSG); -- } -- else if (pSen->SenType == SK_SEN_VOLT) { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E010, SKERR_I2C_E010MSG); -- } -- else { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E014, SKERR_I2C_E014MSG); -- } -- } -- } -- -- /* Check for NO error at all */ -- if (!IsError && !TooHigh && !TooLow) { -- /* Set o.k. Status if no error and no warning condition */ -- pSen->SenErrFlag = SK_SEN_ERR_OK; -- } -- -- /* End of check against the thresholds */ -- -- /* Bug fix AF: 16.Aug.2001: Correct the init base -- * of LM80 sensor. -- */ -- if (pSen->SenInit == SK_SEN_DYN_INIT_PCI_IO) { -- -- pSen->SenInit = SK_SEN_DYN_INIT_NONE; -- -- if (pSen->SenValue > SK_SEN_PCI_IO_RANGE_LIMITER) { -- /* 5V PCI-IO Voltage */ -- pSen->SenThreWarnLow = SK_SEN_PCI_IO_5V_LOW_WARN; -- pSen->SenThreErrLow = SK_SEN_PCI_IO_5V_LOW_ERR; -- } -- else { -- /* 3.3V PCI-IO Voltage */ -- pSen->SenThreWarnHigh = SK_SEN_PCI_IO_3V3_HIGH_WARN; -- pSen->SenThreErrHigh = SK_SEN_PCI_IO_3V3_HIGH_ERR; -- } -- } -- --#ifdef TEST_ONLY -- /* Dynamic thresholds also for VAUX of LM80 sensor */ -- if (pSen->SenInit == SK_SEN_DYN_INIT_VAUX) { -- -- pSen->SenInit = SK_SEN_DYN_INIT_NONE; -- -- /* 3.3V VAUX Voltage */ -- if (pSen->SenValue > SK_SEN_VAUX_RANGE_LIMITER) { -- pSen->SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN; -- pSen->SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR; -- } -- /* 0V VAUX Voltage */ -- else { -- pSen->SenThreWarnHigh = SK_SEN_VAUX_0V_WARN_ERR; -- pSen->SenThreErrHigh = SK_SEN_VAUX_0V_WARN_ERR; -- } -- } -- -- /* -- * Check initialization state: -- * The VIO Thresholds need adaption -- */ -- if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN && -- pSen->SenValue > SK_SEN_WARNLOW2C && -- pSen->SenValue < SK_SEN_WARNHIGH2) { -- pSen->SenThreErrLow = SK_SEN_ERRLOW2C; -- pSen->SenThreWarnLow = SK_SEN_WARNLOW2C; -- pSen->SenInit = SK_TRUE; -- } -- -- if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN && -- pSen->SenValue > SK_SEN_WARNLOW2 && -- pSen->SenValue < SK_SEN_WARNHIGH2C) { -- pSen->SenThreErrHigh = SK_SEN_ERRHIGH2C; -- pSen->SenThreWarnHigh = SK_SEN_WARNHIGH2C; -- pSen->SenInit = SK_TRUE; -- } --#endif -- -- if (pSen->SenInit != SK_SEN_DYN_INIT_NONE) { -- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E013, SKERR_I2C_E013MSG); -- } --} /* SkI2cCheckSensor */ -- -- --/* -- * The only Event to be served is the timeout event -- * -- */ --int SkI2cEvent( --SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* I/O Context */ --SK_U32 Event, /* Module specific Event */ --SK_EVPARA Para) /* Event specific Parameter */ --{ -- int ReadComplete; -- SK_SENSOR *pSen; -- SK_U32 Time; -- SK_EVPARA ParaLocal; -- int i; -- -- /* New case: no sensors */ -- if (pAC->I2c.MaxSens == 0) { -- return(0); -- } -- -- switch (Event) { -- case SK_I2CEV_IRQ: -- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -- ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); -- -- if (ReadComplete) { -- /* Check sensor against defined thresholds */ -- SkI2cCheckSensor(pAC, pSen); -- -- /* Increment Current sensor and set appropriate Timeout */ -- pAC->I2c.CurrSens++; -- if (pAC->I2c.CurrSens >= pAC->I2c.MaxSens) { -- pAC->I2c.CurrSens = 0; -- Time = SK_I2C_TIM_LONG; -- } -- else { -- Time = SK_I2C_TIM_SHORT; -- } -- -- /* Start Timer */ -- ParaLocal.Para64 = (SK_U64)0; -- -- pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; -- -- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, -- SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -- } -- else { -- /* Start Timer */ -- ParaLocal.Para64 = (SK_U64)0; -- -- pAC->I2c.TimerMode = SK_TIMER_WATCH_SM; -- -- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, SK_I2C_TIM_WATCH, -- SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -- } -- break; -- case SK_I2CEV_TIM: -- if (pAC->I2c.TimerMode == SK_TIMER_NEW_GAUGING) { -- -- ParaLocal.Para64 = (SK_U64)0; -- SkTimerStop(pAC, IoC, &pAC->I2c.SenTimer); -- -- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -- ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); -- -- if (ReadComplete) { -- /* Check sensor against defined thresholds */ -- SkI2cCheckSensor(pAC, pSen); -- -- /* Increment Current sensor and set appropriate Timeout */ -- pAC->I2c.CurrSens++; -- if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) { -- pAC->I2c.CurrSens = 0; -- Time = SK_I2C_TIM_LONG; -- } -- else { -- Time = SK_I2C_TIM_SHORT; -- } -- -- /* Start Timer */ -- ParaLocal.Para64 = (SK_U64)0; -- -- pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; -- -- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, -- SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -- } -- } -- else { -- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -- pSen->SenErrFlag = SK_SEN_ERR_FAULTY; -- SK_I2C_STOP(IoC); -- -- /* Increment Current sensor and set appropriate Timeout */ -- pAC->I2c.CurrSens++; -- if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) { -- pAC->I2c.CurrSens = 0; -- Time = SK_I2C_TIM_LONG; -- } -- else { -- Time = SK_I2C_TIM_SHORT; -- } -- -- /* Start Timer */ -- ParaLocal.Para64 = (SK_U64)0; -- -- pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; -- -- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, -- SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -- } -- break; -- case SK_I2CEV_CLEAR: -- for (i = 0; i < SK_MAX_SENSORS; i++) { -- pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK; -- pAC->I2c.SenTable[i].SenErrCts = 0; -- pAC->I2c.SenTable[i].SenWarnCts = 0; -- pAC->I2c.SenTable[i].SenBegErrTS = 0; -- pAC->I2c.SenTable[i].SenBegWarnTS = 0; -- pAC->I2c.SenTable[i].SenLastErrTrapTS = (SK_U64)0; -- pAC->I2c.SenTable[i].SenLastErrLogTS = (SK_U64)0; -- pAC->I2c.SenTable[i].SenLastWarnTrapTS = (SK_U64)0; -- pAC->I2c.SenTable[i].SenLastWarnLogTS = (SK_U64)0; -- } -- break; -- default: -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E006, SKERR_I2C_E006MSG); -- } -- -- return(0); --} /* SkI2cEvent*/ -- --#endif /* !SK_DIAG */ ---- ./drivers/net/sk98lin/sklm80.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/sklm80.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: sklm80.c - * Project: Gigabit Ethernet Adapters, TWSI-Module -- * Version: $Revision: 1.22 $ -- * Date: $Date: 2003/10/20 09:08:21 $ -+ * Version: $Revision: 1.1 $ -+ * Date: $Date: 2003/12/19 14:02:31 $ - * Purpose: Functions to access Voltage and Temperature Sensor (LM80) - * - ******************************************************************************/ -@@ -27,7 +27,7 @@ - */ - #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: sklm80.c,v 1.22 2003/10/20 09:08:21 rschmidt Exp $ (C) Marvell. "; -+ "@(#) $Id: sklm80.c,v 1.1 2003/12/19 14:02:31 mschmid Exp $ (C) Marvell. "; - #endif - - #include "h/skdrv1st.h" /* Driver Specific Definitions */ -@@ -111,12 +111,12 @@ int Reg) /* register to read */ - /* - * read a sensors value (LM80 specific) - * -- * This function reads a sensors value from the I2C sensor chip LM80. -+ * This function reads a sensors value from the TWSI sensor chip LM80. - * The sensor is defined by its index into the sensors database in the struct - * pAC points to. - * - * Returns 1 if the read is completed -- * 0 if the read must be continued (I2C Bus still allocated) -+ * 0 if the read must be continued (TWSI Bus still allocated) - */ - int SkLm80ReadSensor( - SK_AC *pAC, /* Adapter Context */ ---- ./drivers/net/sk98lin/skproc.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skproc.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,28 +2,34 @@ - * - * Name: skproc.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.11 $ -- * Date: $Date: 2003/12/11 16:03:57 $ -- * Purpose: Funktions to display statictic data -+ * Version: $Revision: 1.14.2.4 $ -+ * Date: $Date: 2005/05/23 13:47:33 $ -+ * Purpose: Functions to display statictic data - * - ******************************************************************************/ - - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. -+ * -+ * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet -+ * Server Adapters. -+ * -+ * Author: Ralph Roesler (rroesler@syskonnect.de) -+ * Mirko Lindner (mlindner@syskonnect.de) -+ * -+ * Address all question to: linux@syskonnect.de - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * -- * Created 22-Nov-2000 -- * Author: Mirko Lindner (mlindner@syskonnect.de) -- * - * The information in this file is provided "AS IS" without warranty. - * -- ******************************************************************************/ -+ *****************************************************************************/ -+ - #include <linux/proc_fs.h> - #include <linux/seq_file.h> - -@@ -32,9 +38,16 @@ - #include "h/skversion.h" - - extern struct SK_NET_DEVICE *SkGeRootDev; -+ -+/****************************************************************************** -+ * -+ * Local Function Prototypes and Local Variables -+ * -+ *****************************************************************************/ -+ - static int sk_proc_print(void *writePtr, char *format, ...); - static void sk_gen_browse(void *buffer); --int len; -+static int len; - - static int sk_seq_show(struct seq_file *seq, void *v); - static int sk_proc_open(struct inode *inode, struct file *file); -@@ -52,16 +65,18 @@ struct net_device *currDev = NULL; - * sk_gen_browse -generic print "summaries" entry - * - * Description: -- * This function fills the proc entry with statistic data about -- * the ethernet device. -+ * This function fills the proc entry with statistic data about -+ * the ethernet device. - * -- * Returns: - -+ * Returns: N/A - * - */ --static void sk_gen_browse(void *buffer) -+static void sk_gen_browse( -+void *buffer) /* buffer where the statistics will be stored in */ - { - struct SK_NET_DEVICE *SkgeProcDev = SkGeRootDev; - struct SK_NET_DEVICE *next; -+ SK_BOOL DisableStatistic = 0; - SK_PNMI_STRUCT_DATA *pPnmiStruct; - SK_PNMI_STAT *pPnmiStat; - unsigned long Flags; -@@ -69,6 +84,7 @@ static void sk_gen_browse(void *buffer) - DEV_NET *pNet; - SK_AC *pAC; - char sens_msg[50]; -+ int card_type; - int MaxSecurityCount = 0; - int t; - int i; -@@ -91,7 +107,7 @@ static void sk_gen_browse(void *buffer) - - spin_lock_irqsave(&pAC->SlowPathLock, Flags); - Size = SK_PNMI_STRUCT_SIZE; --#ifdef SK_DIAG_SUPPORT -+ DisableStatistic = 0; - if (pAC->BoardLevel == SK_INIT_DATA) { - SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA)); - if (pAC->DiagModeActive == DIAG_NOTACTIVE) { -@@ -100,13 +116,13 @@ static void sk_gen_browse(void *buffer) - } else { - SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); - } --#else -- SkPnmiGetStruct(pAC, pAC->IoBase, -- pPnmiStruct, &Size, t-1); --#endif - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -- - if (strcmp(pAC->dev[t-1]->name, currDev->name) == 0) { -+ if (!pAC->GIni.GIYukon32Bit) -+ card_type = 64; -+ else -+ card_type = 32; -+ - pPnmiStat = &pPnmiStruct->Stat[0]; - len = sk_proc_print(buffer, - "\nDetailed statistic for device %s\n", -@@ -118,6 +134,17 @@ static void sk_gen_browse(void *buffer) - len += sk_proc_print(buffer, - "\nBoard statistics\n\n"); - len += sk_proc_print(buffer, -+ "Card name %s\n", -+ pAC->DeviceStr); -+ len += sk_proc_print(buffer, -+ "Vendor/Device ID %x/%x\n", -+ pAC->PciDev->vendor, -+ pAC->PciDev->device); -+ len += sk_proc_print(buffer, -+ "Card type (Bit) %d\n", -+ card_type); -+ -+ len += sk_proc_print(buffer, - "Active Port %c\n", - 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt. - Net[t-1].PrefPort]->PortNumber); -@@ -126,177 +153,239 @@ static void sk_gen_browse(void *buffer) - 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt. - Net[t-1].PrefPort]->PortNumber); - -- len += sk_proc_print(buffer, -- "Bus speed (MHz) %d\n", -- pPnmiStruct->BusSpeed); -- -- len += sk_proc_print(buffer, -- "Bus width (Bit) %d\n", -- pPnmiStruct->BusWidth); -- len += sk_proc_print(buffer, -- "Driver version %s\n", -- VER_STRING); -- len += sk_proc_print(buffer, -- "Hardware revision v%d.%d\n", -- (pAC->GIni.GIPciHwRev >> 4) & 0x0F, -- pAC->GIni.GIPciHwRev & 0x0F); -- -- /* Print sensor informations */ -- for (i=0; i < pAC->I2c.MaxSens; i ++) { -- /* Check type */ -- switch (pAC->I2c.SenTable[i].SenType) { -- case 1: -- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -- strcat(sens_msg, " (C)"); -- len += sk_proc_print(buffer, -- "%-25s %d.%02d\n", -- sens_msg, -- pAC->I2c.SenTable[i].SenValue / 10, -- pAC->I2c.SenTable[i].SenValue % 10); -+ if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) { -+ len += sk_proc_print(buffer, -+ "Interrupt Moderation static (%d ints/sec)\n", -+ pAC->DynIrqModInfo.MaxModIntsPerSec); -+ } else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) { -+ len += sk_proc_print(buffer, -+ "Interrupt Moderation dynamic (%d ints/sec)\n", -+ pAC->DynIrqModInfo.MaxModIntsPerSec); -+ } else { -+ len += sk_proc_print(buffer, -+ "Interrupt Moderation disabled\n"); -+ } - -- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -- strcat(sens_msg, " (F)"); -+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) { -+ len += sk_proc_print(buffer, -+ "Bus type PCI-Express\n"); -+ len += sk_proc_print(buffer, -+ "Bus width (Lanes) %d\n", -+ pAC->GIni.GIPexWidth); -+ } else { -+ if (pAC->GIni.GIPciBus == SK_PCIX_BUS) { - len += sk_proc_print(buffer, -- "%-25s %d.%02d\n", -- sens_msg, -- ((((pAC->I2c.SenTable[i].SenValue) -- *10)*9)/5 + 3200)/100, -- ((((pAC->I2c.SenTable[i].SenValue) -- *10)*9)/5 + 3200) % 10); -- break; -- case 2: -- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -- strcat(sens_msg, " (V)"); -+ "Bus type PCI-X\n"); -+ if (pAC->GIni.GIPciMode == PCI_OS_SPD_X133) { -+ len += sk_proc_print(buffer, -+ "Bus speed (MHz) 133\n"); -+ } else if (pAC->GIni.GIPciMode == PCI_OS_SPD_X100) { -+ len += sk_proc_print(buffer, -+ "Bus speed (MHz) 100\n"); -+ } else if (pAC->GIni.GIPciMode == PCI_OS_SPD_X66) { -+ len += sk_proc_print(buffer, -+ "Bus speed (MHz) 66\n"); -+ } else { -+ len += sk_proc_print(buffer, -+ "Bus speed (MHz) 33\n"); -+ } -+ } else { - len += sk_proc_print(buffer, -- "%-25s %d.%03d\n", -- sens_msg, -- pAC->I2c.SenTable[i].SenValue / 1000, -- pAC->I2c.SenTable[i].SenValue % 1000); -- break; -- case 3: -- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -- strcat(sens_msg, " (rpm)"); -+ "Bus type PCI\n"); - len += sk_proc_print(buffer, -- "%-25s %d\n", -- sens_msg, -- pAC->I2c.SenTable[i].SenValue); -- break; -- default: -- break; -+ "Bus speed (MHz) %d\n", -+ pPnmiStruct->BusSpeed); - } -+ len += sk_proc_print(buffer, -+ "Bus width (Bit) %d\n", -+ pPnmiStruct->BusWidth); - } -- -- /*Receive statistics */ -- len += sk_proc_print(buffer, -- "\nReceive statistics\n\n"); - - len += sk_proc_print(buffer, -- "Received bytes %Lu\n", -- (unsigned long long) pPnmiStat->StatRxOctetsOkCts); -- len += sk_proc_print(buffer, -- "Received packets %Lu\n", -- (unsigned long long) pPnmiStat->StatRxOkCts); --#if 0 -- if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && -- pAC->HWRevision < 12) { -- pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - -- pPnmiStat->StatRxShortsCts; -- pPnmiStat->StatRxShortsCts = 0; -- } --#endif -- if (pNet->Mtu > 1500) -- pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - -- pPnmiStat->StatRxTooLongCts; -- -- len += sk_proc_print(buffer, -- "Receive errors %Lu\n", -- (unsigned long long) pPnmiStruct->InErrorsCts); -- len += sk_proc_print(buffer, -- "Receive dropped %Lu\n", -- (unsigned long long) pPnmiStruct->RxNoBufCts); -+ "Driver version %s (%s)\n", -+ VER_STRING, PATCHLEVEL); - len += sk_proc_print(buffer, -- "Received multicast %Lu\n", -- (unsigned long long) pPnmiStat->StatRxMulticastOkCts); -+ "Driver release date %s\n", -+ pAC->Pnmi.pDriverReleaseDate); - len += sk_proc_print(buffer, -- "Receive error types\n"); -- len += sk_proc_print(buffer, -- " length %Lu\n", -- (unsigned long long) pPnmiStat->StatRxRuntCts); -- len += sk_proc_print(buffer, -- " buffer overflow %Lu\n", -- (unsigned long long) pPnmiStat->StatRxFifoOverflowCts); -- len += sk_proc_print(buffer, -- " bad crc %Lu\n", -- (unsigned long long) pPnmiStat->StatRxFcsCts); -- len += sk_proc_print(buffer, -- " framing %Lu\n", -- (unsigned long long) pPnmiStat->StatRxFramingCts); -- len += sk_proc_print(buffer, -- " missed frames %Lu\n", -- (unsigned long long) pPnmiStat->StatRxMissedCts); -- -- if (pNet->Mtu > 1500) -- pPnmiStat->StatRxTooLongCts = 0; -+ "Hardware revision v%d.%d\n", -+ (pAC->GIni.GIPciHwRev >> 4) & 0x0F, -+ pAC->GIni.GIPciHwRev & 0x0F); - -- len += sk_proc_print(buffer, -- " too long %Lu\n", -- (unsigned long long) pPnmiStat->StatRxTooLongCts); -- len += sk_proc_print(buffer, -- " carrier extension %Lu\n", -- (unsigned long long) pPnmiStat->StatRxCextCts); -- len += sk_proc_print(buffer, -- " too short %Lu\n", -- (unsigned long long) pPnmiStat->StatRxShortsCts); -- len += sk_proc_print(buffer, -- " symbol %Lu\n", -- (unsigned long long) pPnmiStat->StatRxSymbolCts); -- len += sk_proc_print(buffer, -- " LLC MAC size %Lu\n", -- (unsigned long long) pPnmiStat->StatRxIRLengthCts); -- len += sk_proc_print(buffer, -- " carrier event %Lu\n", -- (unsigned long long) pPnmiStat->StatRxCarrierCts); -- len += sk_proc_print(buffer, -- " jabber %Lu\n", -- (unsigned long long) pPnmiStat->StatRxJabberCts); -+ if (!netif_running(pAC->dev[t-1])) { -+ len += sk_proc_print(buffer, -+ "\n Device %s is down.\n" -+ " Therefore no statistics are available.\n" -+ " After bringing the device up (ifconfig)" -+ " statistics will\n" -+ " be displayed.\n", -+ pAC->dev[t-1]->name); -+ DisableStatistic = 1; -+ } - -+ /* Display only if statistic info available */ -+ /* Print sensor informations */ -+ if (!DisableStatistic) { -+ for (i=0; i < pAC->I2c.MaxSens; i ++) { -+ /* Check type */ -+ switch (pAC->I2c.SenTable[i].SenType) { -+ case 1: -+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -+ strcat(sens_msg, " (C)"); -+ len += sk_proc_print(buffer, -+ "%-25s %d.%02d\n", -+ sens_msg, -+ pAC->I2c.SenTable[i].SenValue / 10, -+ pAC->I2c.SenTable[i].SenValue % -+ 10); -+ -+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -+ strcat(sens_msg, " (F)"); -+ len += sk_proc_print(buffer, -+ "%-25s %d.%02d\n", -+ sens_msg, -+ ((((pAC->I2c.SenTable[i].SenValue) -+ *10)*9)/5 + 3200)/100, -+ ((((pAC->I2c.SenTable[i].SenValue) -+ *10)*9)/5 + 3200) % 10); -+ break; -+ case 2: -+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -+ strcat(sens_msg, " (V)"); -+ len += sk_proc_print(buffer, -+ "%-25s %d.%03d\n", -+ sens_msg, -+ pAC->I2c.SenTable[i].SenValue / 1000, -+ pAC->I2c.SenTable[i].SenValue % 1000); -+ break; -+ case 3: -+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc); -+ strcat(sens_msg, " (rpm)"); -+ len += sk_proc_print(buffer, -+ "%-25s %d\n", -+ sens_msg, -+ pAC->I2c.SenTable[i].SenValue); -+ break; -+ default: -+ break; -+ } -+ } -+ -+ /*Receive statistics */ -+ len += sk_proc_print(buffer, -+ "\nReceive statistics\n\n"); -+ -+ len += sk_proc_print(buffer, -+ "Received bytes %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxOctetsOkCts); -+ len += sk_proc_print(buffer, -+ "Received packets %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxOkCts); -+#if 0 -+ if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && -+ pAC->HWRevision < 12) { -+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - -+ pPnmiStat->StatRxShortsCts; -+ pPnmiStat->StatRxShortsCts = 0; -+ } -+#endif -+ if (pAC->dev[t-1]->mtu > 1500) -+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts - -+ pPnmiStat->StatRxTooLongCts; -+ -+ len += sk_proc_print(buffer, -+ "Receive errors %Lu\n", -+ (unsigned long long) pPnmiStruct->InErrorsCts); -+ len += sk_proc_print(buffer, -+ "Receive dropped %Lu\n", -+ (unsigned long long) pPnmiStruct->RxNoBufCts); -+ len += sk_proc_print(buffer, -+ "Received multicast %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxMulticastOkCts); -+#ifdef ADVANCED_STATISTIC_OUTPUT -+ len += sk_proc_print(buffer, -+ "Receive error types\n"); -+ len += sk_proc_print(buffer, -+ " length %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxRuntCts); -+ len += sk_proc_print(buffer, -+ " buffer overflow %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxFifoOverflowCts); -+ len += sk_proc_print(buffer, -+ " bad crc %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxFcsCts); -+ len += sk_proc_print(buffer, -+ " framing %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxFramingCts); -+ len += sk_proc_print(buffer, -+ " missed frames %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxMissedCts); -+ -+ if (pAC->dev[t-1]->mtu > 1500) -+ pPnmiStat->StatRxTooLongCts = 0; -+ -+ len += sk_proc_print(buffer, -+ " too long %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxTooLongCts); -+ len += sk_proc_print(buffer, -+ " carrier extension %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxCextCts); -+ len += sk_proc_print(buffer, -+ " too short %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxShortsCts); -+ len += sk_proc_print(buffer, -+ " symbol %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxSymbolCts); -+ len += sk_proc_print(buffer, -+ " LLC MAC size %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxIRLengthCts); -+ len += sk_proc_print(buffer, -+ " carrier event %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxCarrierCts); -+ len += sk_proc_print(buffer, -+ " jabber %Lu\n", -+ (unsigned long long) pPnmiStat->StatRxJabberCts); -+#endif - -- /*Transmit statistics */ -- len += sk_proc_print(buffer, -- "\nTransmit statistics\n\n"); -+ /*Transmit statistics */ -+ len += sk_proc_print(buffer, -+ "\nTransmit statistics\n\n"); - -- len += sk_proc_print(buffer, -- "Transmited bytes %Lu\n", -- (unsigned long long) pPnmiStat->StatTxOctetsOkCts); -- len += sk_proc_print(buffer, -- "Transmited packets %Lu\n", -- (unsigned long long) pPnmiStat->StatTxOkCts); -- len += sk_proc_print(buffer, -- "Transmit errors %Lu\n", -- (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); -- len += sk_proc_print(buffer, -- "Transmit dropped %Lu\n", -- (unsigned long long) pPnmiStruct->TxNoBufCts); -- len += sk_proc_print(buffer, -- "Transmit collisions %Lu\n", -- (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); -- len += sk_proc_print(buffer, -- "Transmit error types\n"); -- len += sk_proc_print(buffer, -- " excessive collision %ld\n", -- pAC->stats.tx_aborted_errors); -- len += sk_proc_print(buffer, -- " carrier %Lu\n", -- (unsigned long long) pPnmiStat->StatTxCarrierCts); -- len += sk_proc_print(buffer, -- " fifo underrun %Lu\n", -- (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts); -- len += sk_proc_print(buffer, -- " heartbeat %Lu\n", -- (unsigned long long) pPnmiStat->StatTxCarrierCts); -- len += sk_proc_print(buffer, -- " window %ld\n", -- pAC->stats.tx_window_errors); -+ len += sk_proc_print(buffer, -+ "Transmitted bytes %Lu\n", -+ (unsigned long long) pPnmiStat->StatTxOctetsOkCts); -+ len += sk_proc_print(buffer, -+ "Transmitted packets %Lu\n", -+ (unsigned long long) pPnmiStat->StatTxOkCts); -+ len += sk_proc_print(buffer, -+ "Transmit errors %Lu\n", -+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); -+ len += sk_proc_print(buffer, -+ "Transmit dropped %Lu\n", -+ (unsigned long long) pPnmiStruct->TxNoBufCts); -+ len += sk_proc_print(buffer, -+ "Transmit collisions %Lu\n", -+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); -+#ifdef ADVANCED_STATISTIC_OUTPUT -+ len += sk_proc_print(buffer, -+ "Transmit error types\n"); -+ len += sk_proc_print(buffer, -+ " excessive collision %ld\n", -+ pAC->stats.tx_aborted_errors); -+ len += sk_proc_print(buffer, -+ " carrier %Lu\n", -+ (unsigned long long) pPnmiStat->StatTxCarrierCts); -+ len += sk_proc_print(buffer, -+ " fifo underrun %Lu\n", -+ (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts); -+ len += sk_proc_print(buffer, -+ " heartbeat %Lu\n", -+ (unsigned long long) pPnmiStat->StatTxCarrierCts); -+ len += sk_proc_print(buffer, -+ " window %ld\n", -+ pAC->stats.tx_window_errors); -+#endif -+ } /* if (!DisableStatistic) */ - - } /* if (strcmp(pACname, currDeviceName) == 0) */ - } -@@ -306,16 +395,20 @@ static void sk_gen_browse(void *buffer) - - /***************************************************************************** - * -- * sk_proc_print -generic line print -+ * sk_proc_print - generic line print - * - * Description: -- * This function fills the proc entry with statistic data about -- * the ethernet device. -+ * This function fills the proc entry with statistic data about the -+ * ethernet device. - * -- * Returns: number of bytes written -+ * Returns: -+ * the number of bytes written - * - */ --static int sk_proc_print(void *writePtr, char *format, ...) -+static int sk_proc_print( -+void *writePtr, /* the buffer pointer */ -+char *format, /* the format of the string */ -+...) /* variable list of arguments */ - { - #define MAX_LEN_SINGLE_LINE 256 - char str[MAX_LEN_SINGLE_LINE]; -@@ -341,19 +434,22 @@ static int sk_proc_print(void *writePtr, - * sk_seq_show - show proc information of a particular adapter - * - * Description: -- * This function fills the proc entry with statistic data about -- * the ethernet device. It invokes the generic sk_gen_browse() to -- * print out all items one per one. -+ * This function fills the proc entry with statistic data about the -+ * ethernet device. It invokes the generic sk_gen_browse() to print -+ * out all items one per one. - * -- * Returns: number of bytes written -+ * Returns: -+ * the number of bytes written - * - */ --static int sk_seq_show(struct seq_file *seq, void *v) -+static int sk_seq_show( -+struct seq_file *seq, /* the sequence pointer */ -+void *v) /* additional pointer */ - { -- void *castedBuffer = (void *) seq; -- currDev = seq->private; -- sk_gen_browse(castedBuffer); -- return 0; -+ void *castedBuffer = (void *) seq; -+ currDev = seq->private; -+ sk_gen_browse(castedBuffer); -+ return 0; - } - - /***************************************************************************** -@@ -361,14 +457,17 @@ static int sk_seq_show(struct seq_file * - * sk_proc_open - register the show function when proc is open'ed - * - * Description: -- * This function is called whenever a sk98lin proc file is queried. -+ * This function is called whenever a sk98lin proc file is queried. - * -- * Returns: the return value of single_open() -+ * Returns: -+ * the return value of single_open() - * - */ --static int sk_proc_open(struct inode *inode, struct file *file) -+static int sk_proc_open( -+struct inode *inode, /* the inode of the file */ -+struct file *file) /* the file pointer itself */ - { -- return single_open(file, sk_seq_show, PDE(inode)->data); -+ return single_open(file, sk_seq_show, PDE(inode)->data); - } - - /******************************************************************************* ---- ./drivers/net/sk98lin/skqueue.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skqueue.c 2006-04-04 13:13:34.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skqueue.c - * Project: Gigabit Ethernet Adapters, Event Scheduler Module -- * Version: $Revision: 1.20 $ -- * Date: $Date: 2003/09/16 13:44:00 $ -+ * Version: $Revision: 2.3 $ -+ * Date: $Date: 2004/05/14 13:28:18 $ - * Purpose: Management of an event queue. - * - ******************************************************************************/ -@@ -28,7 +28,7 @@ - */ - #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: skqueue.c,v 1.20 2003/09/16 13:44:00 rschmidt Exp $ (C) Marvell."; -+ "@(#) $Id: skqueue.c,v 2.3 2004/05/14 13:28:18 malthoff Exp $ (C) Marvell."; - #endif - - #include "h/skdrv1st.h" /* Driver Specific Definitions */ -@@ -48,10 +48,16 @@ intro() - - #define PRINTF(a,b,c) - --/* -- * init event queue management -+/****************************************************************************** -+ * -+ * SkEventInit() - init event queue management - * -- * Must be called during init level 0. -+ * Description: -+ * This function initializes event queue management. -+ * It must be called during init level 0. -+ * -+ * Returns: -+ * nothing - */ - void SkEventInit( - SK_AC *pAC, /* Adapter context */ -@@ -67,8 +73,17 @@ int Level) /* Init level */ - } - } - --/* -- * add event to queue -+/****************************************************************************** -+ * -+ * SkEventQueue() - add event to queue -+ * -+ * Description: -+ * This function adds an event to the event queue. -+ * At least Init Level 1 is required to queue events, -+ * but will be scheduled add Init Level 2. -+ * -+ * returns: -+ * nothing - */ - void SkEventQueue( - SK_AC *pAC, /* Adapters context */ -@@ -76,26 +91,45 @@ SK_U32 Class, /* Event Class */ - SK_U32 Event, /* Event to be queued */ - SK_EVPARA Para) /* Event parameter */ - { -- pAC->Event.EvPut->Class = Class; -- pAC->Event.EvPut->Event = Event; -- pAC->Event.EvPut->Para = Para; -+ -+ if (pAC->GIni.GILevel == SK_INIT_DATA) { -+ SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E003, SKERR_Q_E003MSG); -+ } -+ else { -+ pAC->Event.EvPut->Class = Class; -+ pAC->Event.EvPut->Event = Event; -+ pAC->Event.EvPut->Para = Para; - -- if (++pAC->Event.EvPut == &pAC->Event.EvQueue[SK_MAX_EVENT]) -- pAC->Event.EvPut = pAC->Event.EvQueue; -+ if (++pAC->Event.EvPut == &pAC->Event.EvQueue[SK_MAX_EVENT]) -+ pAC->Event.EvPut = pAC->Event.EvQueue; - -- if (pAC->Event.EvPut == pAC->Event.EvGet) { -- SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E001, SKERR_Q_E001MSG); -+ if (pAC->Event.EvPut == pAC->Event.EvGet) { -+ SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E001, SKERR_Q_E001MSG); -+ } - } - } - --/* -- * event dispatcher -- * while event queue is not empty -- * get event from queue -- * send command to state machine -- * end -- * return error reported by individual Event function -- * 0 if no error occured. -+/****************************************************************************** -+ * -+ * SkEventDispatcher() - Event Dispatcher -+ * -+ * Description: -+ * The event dispatcher performs the following operations: -+ * o while event queue is not empty -+ * - get event from queue -+ * - send event to state machine -+ * end -+ * -+ * CAUTION: -+ * The event functions MUST report an error if performing a reinitialization -+ * of the event queue, e.g. performing level Init 0..2 while in dispatcher -+ * call! -+ * ANY OTHER return value delays scheduling the other events in the -+ * queue. In this case the event blocks the queue until -+ * the error condition is cleared! -+ * -+ * Returns: -+ * The return value error reported by individual event function - */ - int SkEventDispatcher( - SK_AC *pAC, /* Adapters Context */ -@@ -105,6 +139,10 @@ SK_IOC Ioc) /* Io context */ - SK_U32 Class; - int Rtv; - -+ if (pAC->GIni.GILevel != SK_INIT_RUN) { -+ SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E005, SKERR_Q_E005MSG); -+ } -+ - pEv = pAC->Event.EvGet; - - PRINTF("dispatch get %x put %x\n", pEv, pAC->Event.ev_put); -@@ -152,6 +190,11 @@ SK_IOC Ioc) /* Io context */ - Rtv = SkFdEvent(pAC, Ioc, pEv->Event, pEv->Para); - break; - #endif /* SK_USE_LAC_EV */ -+#ifdef SK_ASF -+ case SKGE_ASF : -+ Rtv = SkAsfEvent(pAC,Ioc,pEv->Event,pEv->Para); -+ break ; -+#endif - #ifdef SK_USE_CSUM - case SKGE_CSUM : - Rtv = SkCsEvent(pAC, Ioc, pEv->Event, pEv->Para); -@@ -163,6 +206,20 @@ SK_IOC Ioc) /* Io context */ - } - - if (Rtv != 0) { -+ /* -+ * Special Case: See CAUTION statement above. -+ * We assume the event queue is reset. -+ */ -+ if (pAC->Event.EvGet != pAC->Event.EvQueue && -+ pAC->Event.EvGet != pEv) { -+ /* -+ * Create an error log entry if the -+ * event queue isn't reset. -+ * In this case it may be blocked. -+ */ -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_Q_E004, SKERR_Q_E004MSG); -+ } -+ - return(Rtv); - } - ---- ./drivers/net/sk98lin/skrlmt.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skrlmt.c 2006-04-04 13:13:35.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: skrlmt.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.69 $ -- * Date: $Date: 2003/04/15 09:39:22 $ -+ * Version: $Revision: 2.3 $ -+ * Date: $Date: 2005/05/04 09:47:53 $ - * Purpose: Manage links on SK-NET Adapters, esp. redundant ones. - * - ******************************************************************************/ -@@ -39,7 +39,7 @@ - - #ifndef lint - static const char SysKonnectFileId[] = -- "@(#) $Id: skrlmt.c,v 1.69 2003/04/15 09:39:22 tschilli Exp $ (C) Marvell."; -+ "@(#) $Id: skrlmt.c,v 2.3 2005/05/04 09:47:53 tschilli Exp $ (C) Marvell."; - #endif /* !defined(lint) */ - - #define __SKRLMT_C -@@ -350,7 +350,7 @@ int Level) /* Initialization Level */ - SK_BOOL PhysicalAMacAddressSet; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_INIT, -- ("RLMT Init level %d.\n", Level)) -+ ("RLMT Init level %d.\n", Level)); - - switch (Level) { - case SK_INIT_DATA: /* Initialize data structures. */ -@@ -390,7 +390,7 @@ int Level) /* Initialization Level */ - - case SK_INIT_IO: /* GIMacsFound first available here. */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_INIT, -- ("RLMT: %d MACs were detected.\n", pAC->GIni.GIMacsFound)) -+ ("RLMT: %d MACs were detected.\n", pAC->GIni.GIMacsFound)); - - pAC->Rlmt.Net[0].NumPorts = pAC->GIni.GIMacsFound; - -@@ -512,7 +512,7 @@ SK_U32 NetIdx) /* Net Number */ - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SkRlmtBuildCheckChain.\n")) -+ ("SkRlmtBuildCheckChain.\n")); - - NumMacsUp = 0; - -@@ -558,7 +558,7 @@ SK_U32 NetIdx) /* Net Number */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("Port %d checks %d other ports: %2X.\n", i, - pAC->Rlmt.Net[NetIdx].Port[i]->PortsChecked, -- pAC->Rlmt.Net[NetIdx].Port[i]->PortCheck[0].CheckAddr.a[5])) -+ pAC->Rlmt.Net[NetIdx].Port[i]->PortCheck[0].CheckAddr.a[5])); - } - #endif /* DEBUG */ - -@@ -604,7 +604,7 @@ SK_MAC_ADDR *DestAddr) /* Destination ad - if ((CheckSrc == 0) || (CheckDest == 0)) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_ERR, - ("SkRlmtBuildPacket: Invalid %s%saddr.\n", -- (CheckSrc == 0 ? "Src" : ""), (CheckDest == 0 ? "Dest" : ""))) -+ (CheckSrc == 0 ? "Src" : ""), (CheckDest == 0 ? "Dest" : ""))); - } - #endif - -@@ -796,7 +796,7 @@ SK_U32 PortNumber) /* Sending port */ - - SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_TX, -- ("SkRlmtSend: BPDU Packet on Port %u.\n", PortNumber)) -+ ("SkRlmtSend: BPDU Packet on Port %u.\n", PortNumber)); - } - } - return; -@@ -835,7 +835,7 @@ SK_U32 PortNumber) /* Port to check */ - * Bring it up. - */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Received on PortDown.\n")) -+ ("SkRlmtPacketReceive: Received on PortDown.\n")); - - pRPort->PortState = SK_RLMT_PS_GOING_UP; - pRPort->GuTimeStamp = SkOsGetTime(pAC); -@@ -849,7 +849,7 @@ SK_U32 PortNumber) /* Port to check */ - } /* PortDown && !SuspectTx */ - else if (pRPort->CheckingState & SK_RLMT_PCS_RX) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Stop bringing port down.\n")) -+ ("SkRlmtPacketReceive: Stop bringing port down.\n")); - SkTimerStop(pAC, IoC, &pRPort->DownRxTimer); - pRPort->CheckingState &= ~SK_RLMT_PCS_RX; - /* pAC->Rlmt.CheckSwitch = SK_TRUE; */ -@@ -896,7 +896,7 @@ SK_MBUF *pMb) /* Received packet */ - pRPort = &pAC->Rlmt.Port[PortNumber]; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: PortNumber == %d.\n", PortNumber)) -+ ("SkRlmtPacketReceive: PortNumber == %d.\n", PortNumber)); - - pRPacket = (SK_RLMT_PACKET*)pMb->pData; - pSPacket = (SK_SPTREE_PACKET*)pRPacket; -@@ -917,7 +917,7 @@ SK_MBUF *pMb) /* Received packet */ - - /* Not sent to current MAC or registered MC address => Trash it. */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Not for me.\n")) -+ ("SkRlmtPacketReceive: Not for me.\n")); - - SkDrvFreeRlmtMbuf(pAC, IoC, pMb); - return; -@@ -955,7 +955,7 @@ SK_MBUF *pMb) /* Received packet */ - pRPacket->Indicator[5] == SK_RLMT_INDICATOR5 && - pRPacket->Indicator[6] == SK_RLMT_INDICATOR6) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Duplicate MAC Address.\n")) -+ ("SkRlmtPacketReceive: Duplicate MAC Address.\n")); - - /* Error Log entry. */ - SK_ERR_LOG(pAC, SK_ERRCL_COMM, SKERR_RLMT_E006, SKERR_RLMT_E006_MSG); -@@ -963,7 +963,7 @@ SK_MBUF *pMb) /* Received packet */ - else { - /* Simply trash it. */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Sent by me.\n")) -+ ("SkRlmtPacketReceive: Sent by me.\n")); - } - - SkDrvFreeRlmtMbuf(pAC, IoC, pMb); -@@ -1007,7 +1007,7 @@ SK_MBUF *pMb) /* Received packet */ - #endif /* 0 */ - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Announce.\n")) -+ ("SkRlmtPacketReceive: Announce.\n")); - - SkDrvFreeRlmtMbuf(pAC, IoC, pMb); - break; -@@ -1015,7 +1015,7 @@ SK_MBUF *pMb) /* Received packet */ - case SK_PACKET_ALIVE: - if (pRPacket->SSap & LLC_COMMAND_RESPONSE_BIT) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Alive Reply.\n")) -+ ("SkRlmtPacketReceive: Alive Reply.\n")); - - if (!(pAC->Addr.Port[PortNumber].PromMode & SK_PROM_MODE_LLC) || - SK_ADDR_EQUAL( -@@ -1046,7 +1046,7 @@ SK_MBUF *pMb) /* Received packet */ - } - else { /* Alive Request Packet. */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Alive Request.\n")) -+ ("SkRlmtPacketReceive: Alive Request.\n")); - - pRPort->RxHelloCts++; - -@@ -1065,7 +1065,7 @@ SK_MBUF *pMb) /* Received packet */ - - case SK_PACKET_CHECK_TX: - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Check your tx line.\n")) -+ ("SkRlmtPacketReceive: Check your tx line.\n")); - - /* A port checking us requests us to check our tx line. */ - pRPort->CheckingState |= SK_RLMT_PCS_TX; -@@ -1088,7 +1088,7 @@ SK_MBUF *pMb) /* Received packet */ - - case SK_PACKET_ADDR_CHANGED: - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Address Change.\n")) -+ ("SkRlmtPacketReceive: Address Change.\n")); - - /* Build the check chain. */ - SkRlmtBuildCheckChain(pAC, pRPort->Net->NetNumber); -@@ -1097,7 +1097,7 @@ SK_MBUF *pMb) /* Received packet */ - - default: - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Unknown RLMT packet.\n")) -+ ("SkRlmtPacketReceive: Unknown RLMT packet.\n")); - - /* RA;:;: ??? */ - SkDrvFreeRlmtMbuf(pAC, IoC, pMb); -@@ -1107,7 +1107,7 @@ SK_MBUF *pMb) /* Received packet */ - pSPacket->Ctrl == SK_RLMT_SPT_CTRL && - (pSPacket->SSap & ~LLC_COMMAND_RESPONSE_BIT) == SK_RLMT_SPT_SSAP) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: BPDU Packet.\n")) -+ ("SkRlmtPacketReceive: BPDU Packet.\n")); - - /* Spanning Tree packet. */ - pRPort->RxSpHelloCts++; -@@ -1139,7 +1139,7 @@ SK_MBUF *pMb) /* Received packet */ - pRPort->Root.Id[0], pRPort->Root.Id[1], - pRPort->Root.Id[2], pRPort->Root.Id[3], - pRPort->Root.Id[4], pRPort->Root.Id[5], -- pRPort->Root.Id[6], pRPort->Root.Id[7])) -+ pRPort->Root.Id[6], pRPort->Root.Id[7])); - } - - SkDrvFreeRlmtMbuf(pAC, IoC, pMb); -@@ -1150,7 +1150,7 @@ SK_MBUF *pMb) /* Received packet */ - } - else { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX, -- ("SkRlmtPacketReceive: Unknown Packet Type.\n")) -+ ("SkRlmtPacketReceive: Unknown Packet Type.\n")); - - /* Unknown packet. */ - SkDrvFreeRlmtMbuf(pAC, IoC, pMb); -@@ -1232,7 +1232,7 @@ SK_U32 PortNumber) /* Port to check */ - if ((pRPort->PacketsPerTimeSlot - pRPort->BpduPacketsPerTimeSlot) == 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SkRlmtCheckPort %d: No (%d) receives in last time slot.\n", -- PortNumber, pRPort->PacketsPerTimeSlot)) -+ PortNumber, pRPort->PacketsPerTimeSlot)); - - /* - * Check segmentation if there was no receive at least twice -@@ -1249,7 +1249,7 @@ SK_U32 PortNumber) /* Port to check */ - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SkRlmtCheckPort: PortsSuspect %d, PcsRx %d.\n", -- pRPort->PortsSuspect, pRPort->CheckingState & SK_RLMT_PCS_RX)) -+ pRPort->PortsSuspect, pRPort->CheckingState & SK_RLMT_PCS_RX)); - - if (pRPort->PortState != SK_RLMT_PS_DOWN) { - NewTimeout = TO_SHORTEN(pAC->Rlmt.Port[PortNumber].Net->TimeoutValue); -@@ -1295,7 +1295,7 @@ SK_U32 PortNumber) /* Port to check */ - ("SkRlmtCheckPort %d: %d (%d) receives in last time slot.\n", - PortNumber, - pRPort->PacketsPerTimeSlot - pRPort->BpduPacketsPerTimeSlot, -- pRPort->PacketsPerTimeSlot)) -+ pRPort->PacketsPerTimeSlot)); - - SkRlmtPortReceives(pAC, IoC, PortNumber); - if (pAC->Rlmt.CheckSwitch) { -@@ -1345,7 +1345,7 @@ SK_U32 *pSelect) /* New active port */ - i, - pAC->Rlmt.Port[i].PortDown, pAC->Rlmt.Port[i].PortNoRx, - *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_HI32), -- *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_LO32))) -+ *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_LO32))); - - if (!pAC->Rlmt.Port[i].PortDown && !pAC->Rlmt.Port[i].PortNoRx) { - if (!PortFound || pAC->Rlmt.Port[i].BcTimeStamp > BcTimeStamp) { -@@ -1358,7 +1358,7 @@ SK_U32 *pSelect) /* New active port */ - - if (PortFound) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Port %d received the last broadcast.\n", *pSelect)) -+ ("Port %d received the last broadcast.\n", *pSelect)); - - /* Look if another port's time stamp is similar. */ - for (i = 0; i < (SK_U32)pAC->GIni.GIMacsFound; i++) { -@@ -1373,7 +1373,7 @@ SK_U32 *pSelect) /* New active port */ - PortFound = SK_FALSE; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Port %d received a broadcast at a similar time.\n", i)) -+ ("Port %d received a broadcast at a similar time.\n", i)); - break; - } - } -@@ -1385,7 +1385,7 @@ SK_U32 *pSelect) /* New active port */ - ("SK_RLMT_SELECT_BCRX found Port %d receiving the substantially " - "latest broadcast (%u).\n", - *pSelect, -- BcTimeStamp - pAC->Rlmt.Port[1 - *pSelect].BcTimeStamp)) -+ BcTimeStamp - pAC->Rlmt.Port[1 - *pSelect].BcTimeStamp)); - } - #endif /* DEBUG */ - -@@ -1434,7 +1434,7 @@ SK_U32 *pSelect) /* New active port */ - PortFound = SK_TRUE; - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SK_RLMT_SELECT_NOTSUSPECT found Port %d up and not check RX.\n", -- *pSelect)) -+ *pSelect)); - break; - } - } -@@ -1483,7 +1483,7 @@ SK_BOOL AutoNegDone) /* Successfully aut - } - PortFound = SK_TRUE; - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SELECT_UP found Port %d up.\n", *pSelect)) -+ ("SK_RLMT_SELECT_UP found Port %d up.\n", *pSelect)); - break; - } - } -@@ -1544,7 +1544,7 @@ SK_BOOL AutoNegDone) /* Successfully aut - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SELECT_GOINGUP found Port %d going up.\n", *pSelect)) -+ ("SK_RLMT_SELECT_GOINGUP found Port %d going up.\n", *pSelect)); - return (SK_TRUE); - } /* SkRlmtSelectGoingUp */ - -@@ -1590,7 +1590,7 @@ SK_BOOL AutoNegDone) /* Successfully aut - } - PortFound = SK_TRUE; - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SELECT_DOWN found Port %d down.\n", *pSelect)) -+ ("SK_RLMT_SELECT_DOWN found Port %d down.\n", *pSelect)); - break; - } - } -@@ -1680,16 +1680,19 @@ SK_U32 NetIdx) /* Net index */ - Para.Para32[1] = NetIdx; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_NET_UP, Para); - -- if ((pAC->Rlmt.Net[NetIdx].RlmtMode & SK_RLMT_TRANSPARENT) == 0 && -- (Para.pParaPtr = SkRlmtBuildPacket(pAC, IoC, -- pAC->Rlmt.Net[NetIdx].Port[i]->PortNumber, -- SK_PACKET_ANNOUNCE, &pAC->Addr.Net[NetIdx]. -- CurrentMacAddress, &SkRlmtMcAddr)) != NULL) { -- /* -- * Send announce packet to RLMT multicast address to force -- * switches to learn the new location of the logical MAC address. -- */ -- SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para); -+ if (pAC->Rlmt.NumNets == 1) { -+ if ((pAC->Rlmt.Net[NetIdx].RlmtMode & SK_RLMT_TRANSPARENT) == 0 && -+ (Para.pParaPtr = SkRlmtBuildPacket(pAC, IoC, -+ pAC->Rlmt.Net[NetIdx].Port[i]->PortNumber, -+ SK_PACKET_ANNOUNCE, &pAC->Addr.Net[NetIdx]. -+ CurrentMacAddress, &SkRlmtMcAddr)) != NULL) { -+ -+ /* -+ * Send announce packet to RLMT multicast address to force -+ * switches to learn the new location of the logical MAC address. -+ */ -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para); -+ } - } - } - else { -@@ -1788,7 +1791,7 @@ SK_U32 NetIdx) /* Net index */ - - if (Para.Para32[1] != Active) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Active: %d, Para1: %d.\n", Active, Para.Para32[1])) -+ ("Active: %d, Para1: %d.\n", Active, Para.Para32[1])); - pAC->Rlmt.Net[NetIdx].ActivePort = Para.Para32[1]; - Para.Para32[0] = pAC->Rlmt.Net[NetIdx]. - Port[Para.Para32[0]]->PortNumber; -@@ -1868,7 +1871,7 @@ SK_U32 NetIdx) /* Net number */ - pNet->Port[i]->Root.Id[0], pNet->Port[i]->Root.Id[1], - pNet->Port[i]->Root.Id[2], pNet->Port[i]->Root.Id[3], - pNet->Port[i]->Root.Id[4], pNet->Port[i]->Root.Id[5], -- pNet->Port[i]->Root.Id[6], pNet->Port[i]->Root.Id[7])) -+ pNet->Port[i]->Root.Id[6], pNet->Port[i]->Root.Id[7])); - - if (!pNet->RootIdSet) { - pNet->Root = pNet->Port[i]->Root; -@@ -1963,13 +1966,13 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - SK_U32 i; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTSTART_TIMEOUT Port %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_PORTSTART_TIMEOUT Port %d Event BEGIN.\n", Para.Para32[0])); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTSTART_TIMEOUT Event EMPTY.\n")) -+ ("SK_RLMT_PORTSTART_TIMEOUT Event EMPTY.\n")); - return; - } - -@@ -1990,7 +1993,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTSTART_TIMEOUT Event END.\n")) -+ ("SK_RLMT_PORTSTART_TIMEOUT Event END.\n")); - } /* SkRlmtEvtPortStartTim */ - - -@@ -2018,21 +2021,21 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - SK_EVPARA Para2; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_LINK_UP Port %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_LINK_UP Port %d Event BEGIN.\n", Para.Para32[0])); - - pRPort = &pAC->Rlmt.Port[Para.Para32[0]]; - if (!pRPort->PortStarted) { - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_RLMT_E008, SKERR_RLMT_E008_MSG); - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_LINK_UP Event EMPTY.\n")) -+ ("SK_RLMT_LINK_UP Event EMPTY.\n")); - return; - } - - if (!pRPort->LinkDown) { - /* RA;:;: Any better solution? */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_LINK_UP Event EMPTY.\n")) -+ ("SK_RLMT_LINK_UP Event EMPTY.\n")); - return; - } - -@@ -2082,16 +2085,19 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - Para2.Para32[1] = (SK_U32)-1; - SkTimerStart(pAC, IoC, &pRPort->UpTimer, SK_RLMT_PORTUP_TIM_VAL, - SKGE_RLMT, SK_RLMT_PORTUP_TIM, Para2); -- -+ - /* Later: if (pAC->Rlmt.RlmtMode & SK_RLMT_CHECK_LOC_LINK) && */ -- if ((pRPort->Net->RlmtMode & SK_RLMT_TRANSPARENT) == 0 && -- (pRPort->Net->RlmtMode & SK_RLMT_CHECK_LINK) != 0 && -- (Para2.pParaPtr = -- SkRlmtBuildPacket(pAC, IoC, Para.Para32[0], SK_PACKET_ANNOUNCE, -- &pAC->Addr.Port[Para.Para32[0]].CurrentMacAddress, &SkRlmtMcAddr) -- ) != NULL) { -- /* Send "new" packet to RLMT multicast address. */ -- SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para2); -+ if (pAC->Rlmt.NumNets == 1) { -+ if ((pRPort->Net->RlmtMode & SK_RLMT_TRANSPARENT) == 0 && -+ (pRPort->Net->RlmtMode & SK_RLMT_CHECK_LINK) != 0 && -+ (Para2.pParaPtr = -+ SkRlmtBuildPacket(pAC, IoC, Para.Para32[0], SK_PACKET_ANNOUNCE, -+ &pAC->Addr.Port[Para.Para32[0]].CurrentMacAddress, &SkRlmtMcAddr) -+ ) != NULL) { -+ -+ /* Send "new" packet to RLMT multicast address. */ -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para2); -+ } - } - - if (pRPort->Net->RlmtMode & SK_RLMT_CHECK_SEG) { -@@ -2110,7 +2116,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_LINK_UP Event END.\n")) -+ ("SK_RLMT_LINK_UP Event END.\n")); - } /* SkRlmtEvtLinkUp */ - - -@@ -2136,20 +2142,20 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - SK_RLMT_PORT *pRPort; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTUP_TIM Port %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_PORTUP_TIM Port %d Event BEGIN.\n", Para.Para32[0])); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTUP_TIM Event EMPTY.\n")) -+ ("SK_RLMT_PORTUP_TIM Event EMPTY.\n")); - return; - } - - pRPort = &pAC->Rlmt.Port[Para.Para32[0]]; - if (pRPort->LinkDown || (pRPort->PortState == SK_RLMT_PS_UP)) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTUP_TIM Port %d Event EMPTY.\n", Para.Para32[0])) -+ ("SK_RLMT_PORTUP_TIM Port %d Event EMPTY.\n", Para.Para32[0])); - return; - } - -@@ -2164,7 +2170,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTUP_TIM Event END.\n")) -+ ("SK_RLMT_PORTUP_TIM Event END.\n")); - } /* SkRlmtEvtPortUpTim */ - - -@@ -2192,13 +2198,13 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SK_RLMT_PORTDOWN* Port %d Event (%d) BEGIN.\n", -- Para.Para32[0], Event)) -+ Para.Para32[0], Event)); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTDOWN* Event EMPTY.\n")) -+ ("SK_RLMT_PORTDOWN* Event EMPTY.\n")); - return; - } - -@@ -2206,7 +2212,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - if (!pRPort->PortStarted || (Event == SK_RLMT_PORTDOWN_TX_TIM && - !(pRPort->CheckingState & SK_RLMT_PCS_TX))) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTDOWN* Event (%d) EMPTY.\n", Event)) -+ ("SK_RLMT_PORTDOWN* Event (%d) EMPTY.\n", Event)); - return; - } - -@@ -2243,7 +2249,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORTDOWN* Event (%d) END.\n", Event)) -+ ("SK_RLMT_PORTDOWN* Event (%d) END.\n", Event)); - } /* SkRlmtEvtPortDownX */ - - -@@ -2270,7 +2276,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - - pRPort = &pAC->Rlmt.Port[Para.Para32[0]]; - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_LINK_DOWN Port %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_LINK_DOWN Port %d Event BEGIN.\n", Para.Para32[0])); - - if (!pAC->Rlmt.Port[Para.Para32[0]].LinkDown) { - pRPort->Net->LinksUp--; -@@ -2289,7 +2295,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_LINK_DOWN Event END.\n")) -+ ("SK_RLMT_LINK_DOWN Event END.\n")); - } /* SkRlmtEvtLinkDown */ - - -@@ -2318,13 +2324,13 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - SK_MAC_ADDR *pNewMacAddr; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORT_ADDR Port %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_PORT_ADDR Port %d Event BEGIN.\n", Para.Para32[0])); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORT_ADDR Event EMPTY.\n")) -+ ("SK_RLMT_PORT_ADDR Event EMPTY.\n")); - return; - } - -@@ -2348,7 +2354,7 @@ SK_EVPARA Para) /* SK_U32 PortNumber; SK - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PORT_ADDR Event END.\n")) -+ ("SK_RLMT_PORT_ADDR Event END.\n")); - } /* SkRlmtEvtPortAddr */ - - -@@ -2376,35 +2382,35 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - SK_U32 PortNumber; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_START Net %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_START Net %d Event BEGIN.\n", Para.Para32[0])); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_START Event EMPTY.\n")) -+ ("SK_RLMT_START Event EMPTY.\n")); - return; - } - - if (Para.Para32[0] >= pAC->Rlmt.NumNets) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad NetNumber %d.\n", Para.Para32[0])) -+ ("Bad NetNumber %d.\n", Para.Para32[0])); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_START Event EMPTY.\n")) -+ ("SK_RLMT_START Event EMPTY.\n")); - return; - } - - if (pAC->Rlmt.Net[Para.Para32[0]].RlmtState != SK_RLMT_RS_INIT) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_START Event EMPTY.\n")) -+ ("SK_RLMT_START Event EMPTY.\n")); - return; - } - - if (pAC->Rlmt.NetsStarted >= pAC->Rlmt.NumNets) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("All nets should have been started.\n")) -+ ("All nets should have been started.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_START Event EMPTY.\n")) -+ ("SK_RLMT_START Event EMPTY.\n")); - return; - } - -@@ -2438,7 +2444,7 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - pAC->Rlmt.NetsStarted++; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_START Event END.\n")) -+ ("SK_RLMT_START Event END.\n")); - } /* SkRlmtEvtStart */ - - -@@ -2466,35 +2472,35 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - SK_U32 i; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STOP Net %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_STOP Net %d Event BEGIN.\n", Para.Para32[0])); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STOP Event EMPTY.\n")) -+ ("SK_RLMT_STOP Event EMPTY.\n")); - return; - } - - if (Para.Para32[0] >= pAC->Rlmt.NumNets) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad NetNumber %d.\n", Para.Para32[0])) -+ ("Bad NetNumber %d.\n", Para.Para32[0])); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STOP Event EMPTY.\n")) -+ ("SK_RLMT_STOP Event EMPTY.\n")); - return; - } - - if (pAC->Rlmt.Net[Para.Para32[0]].RlmtState == SK_RLMT_RS_INIT) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STOP Event EMPTY.\n")) -+ ("SK_RLMT_STOP Event EMPTY.\n")); - return; - } - - if (pAC->Rlmt.NetsStarted == 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("All nets are stopped.\n")) -+ ("All nets are stopped.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STOP Event EMPTY.\n")) -+ ("SK_RLMT_STOP Event EMPTY.\n")); - return; - } - -@@ -2529,7 +2535,7 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - pAC->Rlmt.NetsStarted--; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STOP Event END.\n")) -+ ("SK_RLMT_STOP Event END.\n")); - } /* SkRlmtEvtStop */ - - -@@ -2559,13 +2565,13 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - SK_U32 i; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_TIM Event BEGIN.\n")) -+ ("SK_RLMT_TIM Event BEGIN.\n")); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_TIM Event EMPTY.\n")) -+ ("SK_RLMT_TIM Event EMPTY.\n")); - return; - } - -@@ -2637,7 +2643,7 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_TIM Event END.\n")) -+ ("SK_RLMT_TIM Event END.\n")); - } /* SkRlmtEvtTim */ - - -@@ -2665,13 +2671,13 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - #endif /* DEBUG */ - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SEG_TIM Event BEGIN.\n")) -+ ("SK_RLMT_SEG_TIM Event BEGIN.\n")); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SEG_TIM Event EMPTY.\n")) -+ ("SK_RLMT_SEG_TIM Event EMPTY.\n")); - return; - } - -@@ -2695,7 +2701,7 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - InAddr8[3], InAddr8[4], InAddr8[5], - pAPort->Exact[k].a[0], pAPort->Exact[k].a[1], - pAPort->Exact[k].a[2], pAPort->Exact[k].a[3], -- pAPort->Exact[k].a[4], pAPort->Exact[k].a[5])) -+ pAPort->Exact[k].a[4], pAPort->Exact[k].a[5])); - } - } - #endif /* xDEBUG */ -@@ -2703,7 +2709,7 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - SkRlmtCheckSeg(pAC, IoC, Para.Para32[0]); - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SEG_TIM Event END.\n")) -+ ("SK_RLMT_SEG_TIM Event END.\n")); - } /* SkRlmtEvtSegTim */ - - -@@ -2732,18 +2738,18 @@ SK_EVPARA Para) /* SK_MBUF *pMb */ - - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PACKET_RECEIVED Event BEGIN.\n")) -+ ("SK_RLMT_PACKET_RECEIVED Event BEGIN.\n")); - - /* Should we ignore frames during port switching? */ - - #ifdef DEBUG - pMb = Para.pParaPtr; - if (pMb == NULL) { -- SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, ("No mbuf.\n")) -+ SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, ("No mbuf.\n")); - } - else if (pMb->pNext != NULL) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("More than one mbuf or pMb->pNext not set.\n")) -+ ("More than one mbuf or pMb->pNext not set.\n")); - } - #endif /* DEBUG */ - -@@ -2761,7 +2767,7 @@ SK_EVPARA Para) /* SK_MBUF *pMb */ - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PACKET_RECEIVED Event END.\n")) -+ ("SK_RLMT_PACKET_RECEIVED Event END.\n")); - } /* SkRlmtEvtPacketRx */ - - -@@ -2788,21 +2794,21 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - SK_RLMT_PORT *pRPort; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_CLEAR Event BEGIN.\n")) -+ ("SK_RLMT_STATS_CLEAR Event BEGIN.\n")); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_CLEAR Event EMPTY.\n")) -+ ("SK_RLMT_STATS_CLEAR Event EMPTY.\n")); - return; - } - - if (Para.Para32[0] >= pAC->Rlmt.NumNets) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad NetNumber %d.\n", Para.Para32[0])) -+ ("Bad NetNumber %d.\n", Para.Para32[0])); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_CLEAR Event EMPTY.\n")) -+ ("SK_RLMT_STATS_CLEAR Event EMPTY.\n")); - return; - } - -@@ -2817,7 +2823,7 @@ SK_EVPARA Para) /* SK_U32 NetNumber; SK_ - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_CLEAR Event END.\n")) -+ ("SK_RLMT_STATS_CLEAR Event END.\n")); - } /* SkRlmtEvtStatsClear */ - - -@@ -2841,28 +2847,28 @@ SK_IOC IoC, /* I/O Context */ - SK_EVPARA Para) /* SK_U32 NetNumber; SK_U32 -1 */ - { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_UPDATE Event BEGIN.\n")) -+ ("SK_RLMT_STATS_UPDATE Event BEGIN.\n")); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_UPDATE Event EMPTY.\n")) -+ ("SK_RLMT_STATS_UPDATE Event EMPTY.\n")); - return; - } - - if (Para.Para32[0] >= pAC->Rlmt.NumNets) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad NetNumber %d.\n", Para.Para32[0])) -+ ("Bad NetNumber %d.\n", Para.Para32[0])); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_UPDATE Event EMPTY.\n")) -+ ("SK_RLMT_STATS_UPDATE Event EMPTY.\n")); - return; - } - - /* Update statistics - currently always up-to-date. */ - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_STATS_UPDATE Event END.\n")) -+ ("SK_RLMT_STATS_UPDATE Event END.\n")); - } /* SkRlmtEvtStatsUpdate */ - - -@@ -2886,13 +2892,13 @@ SK_IOC IoC, /* I/O Context */ - SK_EVPARA Para) /* SK_U32 PortIndex; SK_U32 NetNumber */ - { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PREFPORT_CHANGE to Port %d Event BEGIN.\n", Para.Para32[0])) -+ ("SK_RLMT_PREFPORT_CHANGE to Port %d Event BEGIN.\n", Para.Para32[0])); - - if (Para.Para32[1] >= pAC->Rlmt.NumNets) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad NetNumber %d.\n", Para.Para32[1])) -+ ("Bad NetNumber %d.\n", Para.Para32[1])); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n")) -+ ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n")); - return; - } - -@@ -2905,7 +2911,7 @@ SK_EVPARA Para) /* SK_U32 PortIndex; SK_ - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_RLMT_E010, SKERR_RLMT_E010_MSG); - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n")) -+ ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n")); - return; - } - -@@ -2919,7 +2925,7 @@ SK_EVPARA Para) /* SK_U32 PortIndex; SK_ - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_PREFPORT_CHANGE Event END.\n")) -+ ("SK_RLMT_PREFPORT_CHANGE Event END.\n")); - } /* SkRlmtEvtPrefportChange */ - - -@@ -2945,37 +2951,37 @@ SK_EVPARA Para) /* SK_U32 NumNets; SK_U3 - int i; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SET_NETS Event BEGIN.\n")) -+ ("SK_RLMT_SET_NETS Event BEGIN.\n")); - - if (Para.Para32[1] != (SK_U32)-1) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad Parameter.\n")) -+ ("Bad Parameter.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SET_NETS Event EMPTY.\n")) -+ ("SK_RLMT_SET_NETS Event EMPTY.\n")); - return; - } - - if (Para.Para32[0] == 0 || Para.Para32[0] > SK_MAX_NETS || - Para.Para32[0] > (SK_U32)pAC->GIni.GIMacsFound) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad number of nets: %d.\n", Para.Para32[0])) -+ ("Bad number of nets: %d.\n", Para.Para32[0])); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SET_NETS Event EMPTY.\n")) -+ ("SK_RLMT_SET_NETS Event EMPTY.\n")); - return; - } - - if (Para.Para32[0] == pAC->Rlmt.NumNets) { /* No change. */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SET_NETS Event EMPTY.\n")) -+ ("SK_RLMT_SET_NETS Event EMPTY.\n")); - return; - } - - /* Entering and leaving dual mode only allowed while nets are stopped. */ - if (pAC->Rlmt.NetsStarted > 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Changing dual mode only allowed while all nets are stopped.\n")) -+ ("Changing dual mode only allowed while all nets are stopped.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SET_NETS Event EMPTY.\n")) -+ ("SK_RLMT_SET_NETS Event EMPTY.\n")); - return; - } - -@@ -3006,9 +3012,10 @@ SK_EVPARA Para) /* SK_U32 NumNets; SK_U3 - SkEventQueue(pAC, SKGE_PNMI, SK_PNMI_EVT_RLMT_SET_NETS, Para); - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("RLMT: Changed to one net with two ports.\n")) -+ ("RLMT: Changed to one net with two ports.\n")); - } - else if (Para.Para32[0] == 2) { -+ pAC->Rlmt.RlmtOff = SK_TRUE; - pAC->Rlmt.Port[1].Net= &pAC->Rlmt.Net[1]; - pAC->Rlmt.Net[1].NumPorts = pAC->GIni.GIMacsFound - 1; - pAC->Rlmt.Net[0].NumPorts = -@@ -3035,19 +3042,19 @@ SK_EVPARA Para) /* SK_U32 NumNets; SK_U3 - SkEventQueue(pAC, SKGE_PNMI, SK_PNMI_EVT_RLMT_SET_NETS, Para); - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("RLMT: Changed to two nets with one port each.\n")) -+ ("RLMT: Changed to two nets with one port each.\n")); - } - else { - /* Not implemented for more than two nets. */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SetNets not implemented for more than two nets.\n")) -+ ("SetNets not implemented for more than two nets.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SET_NETS Event EMPTY.\n")) -+ ("SK_RLMT_SET_NETS Event EMPTY.\n")); - return; - } - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_SET_NETS Event END.\n")) -+ ("SK_RLMT_SET_NETS Event END.\n")); - } /* SkRlmtSetNets */ - - -@@ -3075,13 +3082,13 @@ SK_EVPARA Para) /* SK_U32 NewMode; SK_U3 - SK_U32 PrevRlmtMode; - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_MODE_CHANGE Event BEGIN.\n")) -+ ("SK_RLMT_MODE_CHANGE Event BEGIN.\n")); - - if (Para.Para32[1] >= pAC->Rlmt.NumNets) { - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Bad NetNumber %d.\n", Para.Para32[1])) -+ ("Bad NetNumber %d.\n", Para.Para32[1])); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_MODE_CHANGE Event EMPTY.\n")) -+ ("SK_RLMT_MODE_CHANGE Event EMPTY.\n")); - return; - } - -@@ -3091,9 +3098,9 @@ SK_EVPARA Para) /* SK_U32 NewMode; SK_U3 - Para.Para32[0] != SK_RLMT_MODE_CLS) { - pAC->Rlmt.Net[Para.Para32[1]].RlmtMode = SK_RLMT_MODE_CLS; - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Forced RLMT mode to CLS on single port net.\n")) -+ ("Forced RLMT mode to CLS on single port net.\n")); - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_MODE_CHANGE Event EMPTY.\n")) -+ ("SK_RLMT_MODE_CHANGE Event EMPTY.\n")); - return; - } - -@@ -3159,7 +3166,7 @@ SK_EVPARA Para) /* SK_U32 NewMode; SK_U3 - } /* SK_RLMT_CHECK_SEG bit changed. */ - - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("SK_RLMT_MODE_CHANGE Event END.\n")) -+ ("SK_RLMT_MODE_CHANGE Event END.\n")); - } /* SkRlmtEvtModeChange */ - - -@@ -3245,7 +3252,7 @@ SK_EVPARA Para) /* Event-specific parame - - default: /* Create error log entry. */ - SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, -- ("Unknown RLMT Event %d.\n", Event)) -+ ("Unknown RLMT Event %d.\n", Event)); - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_RLMT_E003, SKERR_RLMT_E003_MSG); - break; - } /* switch() */ ---- ./drivers/net/sk98lin/sktimer.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/sktimer.c 2006-04-04 13:13:35.000000000 +0400 -@@ -2,8 +2,8 @@ - * - * Name: sktimer.c - * Project: Gigabit Ethernet Adapters, Event Scheduler Module -- * Version: $Revision: 1.14 $ -- * Date: $Date: 2003/09/16 13:46:51 $ -+ * Version: $Revision: 2.2 $ -+ * Date: $Date: 2004/05/28 13:44:39 $ - * Purpose: High level timer functions. - * - ******************************************************************************/ -@@ -11,7 +11,7 @@ - /****************************************************************************** - * - * (C)Copyright 1998-2002 SysKonnect GmbH. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2004 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -@@ -22,13 +22,12 @@ - * - ******************************************************************************/ - -- - /* - * Event queue and dispatcher - */ - #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: sktimer.c,v 1.14 2003/09/16 13:46:51 rschmidt Exp $ (C) Marvell."; -+ "@(#) $Id: sktimer.c,v 2.2 2004/05/28 13:44:39 rschmidt Exp $ (C) Marvell."; - #endif - - #include "h/skdrv1st.h" /* Driver Specific Definitions */ -@@ -62,7 +61,7 @@ int Level) /* Init Level */ - { - switch (Level) { - case SK_INIT_DATA: -- pAC->Tim.StQueue = NULL; -+ pAC->Tim.StQueue = 0; - break; - case SK_INIT_IO: - SkHwtInit(pAC, Ioc); -@@ -85,22 +84,20 @@ SK_TIMER *pTimer) /* Timer Pointer to be - SK_TIMER **ppTimPrev; - SK_TIMER *pTm; - -- /* -- * remove timer from queue -- */ -+ /* remove timer from queue */ - pTimer->TmActive = SK_FALSE; -- -+ - if (pAC->Tim.StQueue == pTimer && !pTimer->TmNext) { - SkHwtStop(pAC, Ioc); - } -- -+ - for (ppTimPrev = &pAC->Tim.StQueue; (pTm = *ppTimPrev); - ppTimPrev = &pTm->TmNext ) { -- -+ - if (pTm == pTimer) { - /* - * Timer found in queue -- * - dequeue it and -+ * - dequeue it - * - correct delta of the next timer - */ - *ppTimPrev = pTm->TmNext; -@@ -121,7 +118,7 @@ void SkTimerStart( - SK_AC *pAC, /* Adapters context */ - SK_IOC Ioc, /* IoContext */ - SK_TIMER *pTimer, /* Timer Pointer to be started */ --SK_U32 Time, /* Time value */ -+SK_U32 Time, /* Time Value (in microsec.) */ - SK_U32 Class, /* Event Class for this timer */ - SK_U32 Event, /* Event Value for this timer */ - SK_EVPARA Para) /* Event Parameter for this timer */ -@@ -130,11 +127,6 @@ SK_EVPARA Para) /* Event Parameter for - SK_TIMER *pTm; - SK_U32 Delta; - -- Time /= 16; /* input is uS, clock ticks are 16uS */ -- -- if (!Time) -- Time = 1; -- - SkTimerStop(pAC, Ioc, pTimer); - - pTimer->TmClass = Class; -@@ -143,31 +135,26 @@ SK_EVPARA Para) /* Event Parameter for - pTimer->TmActive = SK_TRUE; - - if (!pAC->Tim.StQueue) { -- /* First Timer to be started */ -+ /* first Timer to be started */ - pAC->Tim.StQueue = pTimer; -- pTimer->TmNext = NULL; -+ pTimer->TmNext = 0; - pTimer->TmDelta = Time; -- -+ - SkHwtStart(pAC, Ioc, Time); -- -+ - return; - } - -- /* -- * timer correction -- */ -+ /* timer correction */ - timer_done(pAC, Ioc, 0); - -- /* -- * find position in queue -- */ -+ /* find position in queue */ - Delta = 0; - for (ppTimPrev = &pAC->Tim.StQueue; (pTm = *ppTimPrev); - ppTimPrev = &pTm->TmNext ) { -- -+ - if (Delta + pTm->TmDelta > Time) { -- /* Position found */ -- /* Here the timer needs to be inserted. */ -+ /* the timer needs to be inserted here */ - break; - } - Delta += pTm->TmDelta; -@@ -179,9 +166,7 @@ SK_EVPARA Para) /* Event Parameter for - pTimer->TmDelta = Time - Delta; - - if (pTm) { -- /* There is a next timer -- * -> correct its Delta value. -- */ -+ /* there is a next timer: correct its Delta value */ - pTm->TmDelta -= pTimer->TmDelta; - } - -@@ -210,7 +195,7 @@ int Restart) /* Do we need to restart t - int Done = 0; - - Delta = SkHwtRead(pAC, Ioc); -- -+ - ppLast = &pAC->Tim.StQueue; - pTm = pAC->Tim.StQueue; - while (pTm && !Done) { -@@ -228,13 +213,13 @@ int Restart) /* Do we need to restart t - Done = 1; - } - } -- *ppLast = NULL; -+ *ppLast = 0; - /* - * pTm points to the first Timer that did not run out. - * StQueue points to the first Timer that run out. - */ - -- for ( pTComp = pAC->Tim.StQueue; pTComp; pTComp = pTComp->TmNext) { -+ for (pTComp = pAC->Tim.StQueue; pTComp; pTComp = pTComp->TmNext) { - SkEventQueue(pAC,pTComp->TmClass, pTComp->TmEvent, pTComp->TmPara); - } - ---- /dev/null 2006-03-09 09:48:23.770951496 +0300 -+++ ./drivers/net/sk98lin/sktwsi.c 2006-04-04 13:13:35.000000000 +0400 -@@ -0,0 +1,1359 @@ -+/****************************************************************************** -+ * -+ * Name: sktwsi.c -+ * Project: Gigabit Ethernet Adapters, TWSI-Module -+ * Version: $Revision: 1.10 $ -+ * Date: $Date: 2005/08/03 09:45:32 $ -+ * Purpose: Functions to access Voltage and Temperature Sensor -+ * -+ ******************************************************************************/ -+ -+/****************************************************************************** -+ * -+ * (C)Copyright 1998-2002 SysKonnect. -+ * (C)Copyright 2002-2005 Marvell. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * The information in this file is provided "AS IS" without warranty. -+ * -+ ******************************************************************************/ -+ -+/* -+ * TWSI Protocol -+ */ -+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) -+static const char SysKonnectFileId[] = -+ "@(#) $Id: sktwsi.c,v 1.10 2005/08/03 09:45:32 rschmidt Exp $ (C) Marvell."; -+#endif -+ -+#include "h/skdrv1st.h" /* Driver Specific Definitions */ -+#include "h/lm80.h" -+#include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */ -+ -+#ifdef __C2MAN__ -+/* -+ TWSI protocol implementation. -+ -+ General Description: -+ -+ The TWSI protocol is used for the temperature sensors and for -+ the serial EEPROM which hold the configuration. -+ -+ This file covers functions that allow to read write and do -+ some bulk requests a specified TWSI address. -+ -+ The Genesis has 2 TWSI buses. One for the EEPROM which holds -+ the VPD Data and one for temperature and voltage sensor. -+ The following picture shows the TWSI buses, TWSI devices and -+ their control registers. -+ -+ Note: The VPD functions are in skvpd.c -+. -+. PCI Config TWSI Bus for VPD Data: -+. -+. +------------+ -+. | VPD EEPROM | -+. +------------+ -+. | -+. | <-- TWSI -+. | -+. +-----------+-----------+ -+. | | -+. +-----------------+ +-----------------+ -+. | PCI_VPD_ADR_REG | | PCI_VPD_DAT_REG | -+. +-----------------+ +-----------------+ -+. -+. -+. TWSI Bus for LM80 sensor: -+. -+. +-----------------+ -+. | Temperature and | -+. | Voltage Sensor | -+. | LM80 | -+. +-----------------+ -+. | -+. | -+. TWSI --> | -+. | -+. +----+ -+. +-------------->| OR |<--+ -+. | +----+ | -+. +------+------+ | -+. | | | -+. +--------+ +--------+ +----------+ -+. | B2_I2C | | B2_I2C | | B2_I2C | -+. | _CTRL | | _DATA | | _SW | -+. +--------+ +--------+ +----------+ -+. -+ The TWSI bus may be driven by the B2_I2C_SW or by the B2_I2C_CTRL -+ and B2_I2C_DATA registers. -+ For driver software it is recommended to use the TWSI control and -+ data register, because TWSI bus timing is done by the ASIC and -+ an interrupt may be received when the TWSI request is completed. -+ -+ Clock Rate Timing: MIN MAX generated by -+ VPD EEPROM: 50 kHz 100 kHz HW -+ LM80 over TWSI Ctrl/Data reg. 50 kHz 100 kHz HW -+ LM80 over B2_I2C_SW register 0 400 kHz SW -+ -+ Note: The clock generated by the hardware is dependend on the -+ PCI clock. If the PCI bus clock is 33 MHz, the I2C/VPD -+ clock is 50 kHz. -+ */ -+intro() -+{} -+#endif -+ -+#ifdef SK_DIAG -+/* -+ * TWSI Fast Mode timing values used by the LM80. -+ * If new devices are added to the TWSI bus the timing values have to be checked. -+ */ -+#ifndef I2C_SLOW_TIMING -+#define T_CLK_LOW 1300L /* clock low time in ns */ -+#define T_CLK_HIGH 600L /* clock high time in ns */ -+#define T_DATA_IN_SETUP 100L /* data in Set-up Time */ -+#define T_START_HOLD 600L /* start condition hold time */ -+#define T_START_SETUP 600L /* start condition Set-up time */ -+#define T_STOP_SETUP 600L /* stop condition Set-up time */ -+#define T_BUS_IDLE 1300L /* time the bus must free after Tx */ -+#define T_CLK_2_DATA_OUT 900L /* max. clock low to data output valid */ -+#else /* I2C_SLOW_TIMING */ -+/* TWSI Standard Mode Timing */ -+#define T_CLK_LOW 4700L /* clock low time in ns */ -+#define T_CLK_HIGH 4000L /* clock high time in ns */ -+#define T_DATA_IN_SETUP 250L /* data in Set-up Time */ -+#define T_START_HOLD 4000L /* start condition hold time */ -+#define T_START_SETUP 4700L /* start condition Set-up time */ -+#define T_STOP_SETUP 4000L /* stop condition Set-up time */ -+#define T_BUS_IDLE 4700L /* time the bus must free after Tx */ -+#endif /* !I2C_SLOW_TIMING */ -+ -+#define NS2BCLK(x) (((x)*125)/10000) -+ -+/* -+ * TWSI Wire Operations -+ * -+ * About I2C_CLK_LOW(): -+ * -+ * The Data Direction bit (I2C_DATA_DIR) has to be set to input when setting -+ * clock to low, to prevent the ASIC and the TWSI data client from driving the -+ * serial data line simultaneously (ASIC: last bit of a byte = '1', TWSI client -+ * send an 'ACK'). See also Concentrator Bugreport No. 10192. -+ */ -+#define I2C_DATA_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA) -+#define I2C_DATA_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA) -+#define I2C_DATA_OUT(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA_DIR) -+#define I2C_DATA_IN(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA) -+#define I2C_CLK_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_CLK) -+#define I2C_CLK_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK | I2C_DATA_DIR) -+#define I2C_START_COND(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK) -+ -+#define NS2CLKT(x) ((x*125L)/10000) -+ -+/*--------------- TWSI Interface Register Functions --------------- */ -+ -+/* -+ * sending one bit -+ */ -+void SkI2cSndBit( -+SK_IOC IoC, /* I/O Context */ -+SK_U8 Bit) /* Bit to send */ -+{ -+ I2C_DATA_OUT(IoC); -+ if (Bit) { -+ I2C_DATA_HIGH(IoC); -+ } -+ else { -+ I2C_DATA_LOW(IoC); -+ } -+ SkDgWaitTime(IoC, NS2BCLK(T_DATA_IN_SETUP)); -+ I2C_CLK_HIGH(IoC); -+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH)); -+ I2C_CLK_LOW(IoC); -+} /* SkI2cSndBit*/ -+ -+ -+/* -+ * Signal a start to the TWSI Bus. -+ * -+ * A start is signaled when data goes to low in a high clock cycle. -+ * -+ * Ends with Clock Low. -+ * -+ * Status: not tested -+ */ -+void SkI2cStart( -+SK_IOC IoC) /* I/O Context */ -+{ -+ /* Init data and Clock to output lines */ -+ /* Set Data high */ -+ I2C_DATA_OUT(IoC); -+ I2C_DATA_HIGH(IoC); -+ /* Set Clock high */ -+ I2C_CLK_HIGH(IoC); -+ -+ SkDgWaitTime(IoC, NS2BCLK(T_START_SETUP)); -+ -+ /* Set Data Low */ -+ I2C_DATA_LOW(IoC); -+ -+ SkDgWaitTime(IoC, NS2BCLK(T_START_HOLD)); -+ -+ /* Clock low without Data to Input */ -+ I2C_START_COND(IoC); -+ -+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW)); -+} /* SkI2cStart */ -+ -+ -+void SkI2cStop( -+SK_IOC IoC) /* I/O Context */ -+{ -+ /* Init data and Clock to output lines */ -+ /* Set Data low */ -+ I2C_DATA_OUT(IoC); -+ I2C_DATA_LOW(IoC); -+ -+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT)); -+ -+ /* Set Clock high */ -+ I2C_CLK_HIGH(IoC); -+ -+ SkDgWaitTime(IoC, NS2BCLK(T_STOP_SETUP)); -+ -+ /* -+ * Set Data High: Do it by setting the Data Line to Input. -+ * Because of a pull up resistor the Data Line -+ * floods to high. -+ */ -+ I2C_DATA_IN(IoC); -+ -+ /* -+ * When TWSI activity is stopped -+ * o DATA should be set to input and -+ * o CLOCK should be set to high! -+ */ -+ SkDgWaitTime(IoC, NS2BCLK(T_BUS_IDLE)); -+} /* SkI2cStop */ -+ -+ -+/* -+ * Receive just one bit via the TWSI bus. -+ * -+ * Note: Clock must be set to LOW before calling this function. -+ * -+ * Returns The received bit. -+ */ -+int SkI2cRcvBit( -+SK_IOC IoC) /* I/O Context */ -+{ -+ int Bit; -+ SK_U8 I2cSwCtrl; -+ -+ /* Init data as input line */ -+ I2C_DATA_IN(IoC); -+ -+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT)); -+ -+ I2C_CLK_HIGH(IoC); -+ -+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH)); -+ -+ SK_I2C_GET_SW(IoC, &I2cSwCtrl); -+ -+ Bit = (I2cSwCtrl & I2C_DATA) ? 1 : 0; -+ -+ I2C_CLK_LOW(IoC); -+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW-T_CLK_2_DATA_OUT)); -+ -+ return(Bit); -+} /* SkI2cRcvBit */ -+ -+ -+/* -+ * Receive an ACK. -+ * -+ * returns 0 If acknowledged -+ * 1 in case of an error -+ */ -+int SkI2cRcvAck( -+SK_IOC IoC) /* I/O Context */ -+{ -+ /* -+ * Received bit must be zero. -+ */ -+ return(SkI2cRcvBit(IoC) != 0); -+} /* SkI2cRcvAck */ -+ -+ -+/* -+ * Send an NACK. -+ */ -+void SkI2cSndNAck( -+SK_IOC IoC) /* I/O Context */ -+{ -+ /* -+ * Received bit must be zero. -+ */ -+ SkI2cSndBit(IoC, 1); -+} /* SkI2cSndNAck */ -+ -+ -+/* -+ * Send an ACK. -+ */ -+void SkI2cSndAck( -+SK_IOC IoC) /* I/O Context */ -+{ -+ /* -+ * Received bit must be zero. -+ */ -+ SkI2cSndBit(IoC, 0); -+} /* SkI2cSndAck */ -+ -+ -+/* -+ * Send one byte to the TWSI device and wait for ACK. -+ * -+ * Return acknowleged status. -+ */ -+int SkI2cSndByte( -+SK_IOC IoC, /* I/O Context */ -+int Byte) /* byte to send */ -+{ -+ int i; -+ -+ for (i = 0; i < 8; i++) { -+ if (Byte & (1<<(7-i))) { -+ SkI2cSndBit(IoC, 1); -+ } -+ else { -+ SkI2cSndBit(IoC, 0); -+ } -+ } -+ -+ return(SkI2cRcvAck(IoC)); -+} /* SkI2cSndByte */ -+ -+ -+/* -+ * Receive one byte and ack it. -+ * -+ * Return byte. -+ */ -+int SkI2cRcvByte( -+SK_IOC IoC, /* I/O Context */ -+int Last) /* Last Byte Flag */ -+{ -+ int i; -+ int Byte = 0; -+ -+ for (i = 0; i < 8; i++) { -+ Byte <<= 1; -+ Byte |= SkI2cRcvBit(IoC); -+ } -+ -+ if (Last) { -+ SkI2cSndNAck(IoC); -+ } -+ else { -+ SkI2cSndAck(IoC); -+ } -+ -+ return(Byte); -+} /* SkI2cRcvByte */ -+ -+ -+/* -+ * Start dialog and send device address -+ * -+ * Return 0 if acknowleged, 1 in case of an error -+ */ -+int SkI2cSndDev( -+SK_IOC IoC, /* I/O Context */ -+int Addr, /* Device Address */ -+int Rw) /* Read / Write Flag */ -+{ -+ SkI2cStart(IoC); -+ Rw = ~Rw; -+ Rw &= I2C_WRITE; -+ return(SkI2cSndByte(IoC, (Addr << 1) | Rw)); -+} /* SkI2cSndDev */ -+ -+#endif /* SK_DIAG */ -+ -+/*----------------- TWSI CTRL Register Functions ----------*/ -+ -+/* -+ * waits for a completion of a TWSI transfer -+ * -+ * returns 0: success, transfer completes -+ * 1: error, transfer does not complete, TWSI transfer -+ * killed, wait loop terminated. -+ */ -+int SkI2cWait( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */ -+{ -+ SK_U64 StartTime; -+ SK_U64 CurrentTime; -+ SK_U32 I2cCtrl; -+ -+ StartTime = SkOsGetTime(pAC); -+ -+ do { -+ CurrentTime = SkOsGetTime(pAC); -+ -+ if (CurrentTime - StartTime > SK_TICKS_PER_SEC / 8) { -+ -+ SK_I2C_STOP(IoC); -+#ifndef SK_DIAG -+ if (pAC->I2c.InitLevel > SK_INIT_DATA) { -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG); -+ } -+#endif /* !SK_DIAG */ -+ return(1); -+ } -+ -+ SK_I2C_GET_CTL(IoC, &I2cCtrl); -+ -+#ifdef xYUKON_DBG -+ printf("StartTime=%lu, CurrentTime=%lu\n", -+ StartTime, CurrentTime); -+ if (kbhit()) { -+ return(1); -+ } -+#endif /* YUKON_DBG */ -+ -+ } while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31); -+ -+ return(0); -+} /* SkI2cWait */ -+ -+ -+/* -+ * waits for a completion of a TWSI transfer -+ * -+ * Returns -+ * Nothing -+ */ -+void SkI2cWaitIrq( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ -+{ -+ SK_SENSOR *pSen; -+ SK_U64 StartTime; -+ SK_U32 IrqSrc; -+ SK_U32 IsTwsiReadyBit; -+ -+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -+ -+ if (pSen->SenState == SK_SEN_IDLE) { -+ return; -+ } -+ -+ IsTwsiReadyBit = CHIP_ID_YUKON_2(pAC) ? Y2_IS_TWSI_RDY : IS_I2C_READY; -+ -+ StartTime = SkOsGetTime(pAC); -+ -+ do { -+ if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) { -+ -+ SK_I2C_STOP(IoC); -+#ifndef SK_DIAG -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E016, SKERR_I2C_E016MSG); -+#endif /* !SK_DIAG */ -+ return; -+ } -+ -+ SK_IN32(IoC, B0_ISRC, &IrqSrc); -+ -+ } while ((IrqSrc & IsTwsiReadyBit) == 0); -+ -+ pSen->SenState = SK_SEN_IDLE; -+ return; -+} /* SkI2cWaitIrq */ -+ -+/* -+ * writes a single byte or 4 bytes into the TWSI device -+ * -+ * returns 0: success -+ * 1: error -+ */ -+int SkI2cWrite( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_U32 I2cData, /* TWSI Data to write */ -+int I2cDev, /* TWSI Device Address */ -+int I2cDevSize, /* TWSI Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */ -+int I2cReg, /* TWSI Device Register Address */ -+int I2cBurst) /* TWSI Burst Flag */ -+{ -+ SK_OUT32(IoC, B2_I2C_DATA, I2cData); -+ -+ SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cDevSize, I2cReg, I2cBurst); -+ -+ return(SkI2cWait(pAC, IoC, I2C_WRITE)); -+} /* SkI2cWrite*/ -+ -+ -+#ifdef SK_DIAG -+/* -+ * reads a single byte or 4 bytes from the TWSI device -+ * -+ * returns the word read -+ */ -+SK_U32 SkI2cRead( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+int I2cDev, /* TWSI Device Address */ -+int I2cDevSize, /* TWSI Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */ -+int I2cReg, /* TWSI Device Register Address */ -+int I2cBurst) /* TWSI Burst Flag */ -+{ -+ SK_U32 Data; -+ -+ SK_OUT32(IoC, B2_I2C_DATA, 0); -+ -+ SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cDevSize, I2cReg, I2cBurst); -+ -+ if (SkI2cWait(pAC, IoC, I2C_READ) != 0) { -+ w_print("%s\n", SKERR_I2C_E002MSG); -+ } -+ -+ SK_IN32(IoC, B2_I2C_DATA, &Data); -+ -+ return(Data); -+} /* SkI2cRead */ -+#endif /* SK_DIAG */ -+ -+ -+/* -+ * read a sensor's value -+ * -+ * This function reads a sensor's value from the TWSI sensor chip. The sensor -+ * is defined by its index into the sensors database in the struct pAC points -+ * to. -+ * Returns -+ * 1 if the read is completed -+ * 0 if the read must be continued (TWSI Bus still allocated) -+ */ -+int SkI2cReadSensor( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_SENSOR *pSen) /* Sensor to be read */ -+{ -+ if (pSen->SenRead != NULL) { -+ return((*pSen->SenRead)(pAC, IoC, pSen)); -+ } -+ -+ return(0); /* no success */ -+} /* SkI2cReadSensor */ -+ -+/* -+ * Do the Init state 0 initialization -+ */ -+static int SkI2cInit0( -+SK_AC *pAC) /* Adapter Context */ -+{ -+ int i; -+ SK_SENSOR *pSen; -+ -+ /* Begin with first sensor */ -+ pAC->I2c.CurrSens = 0; -+ -+ /* Begin with timeout control for state machine */ -+ pAC->I2c.TimerMode = SK_TIMER_WATCH_SM; -+ -+ /* Set sensor number to zero */ -+ pAC->I2c.MaxSens = 0; -+ -+#ifndef SK_DIAG -+ /* Initialize Number of Dummy Reads */ -+ pAC->I2c.DummyReads = SK_MAX_SENSORS; -+#endif /* !SK_DIAG */ -+ -+ for (i = 0; i < SK_MAX_SENSORS; i++) { -+ pSen = &pAC->I2c.SenTable[i]; -+ -+ pSen->SenDesc = "unknown"; -+ pSen->SenType = SK_SEN_UNKNOWN; -+ pSen->SenThreErrHigh = 0; -+ pSen->SenThreErrLow = 0; -+ pSen->SenThreWarnHigh = 0; -+ pSen->SenThreWarnLow = 0; -+ pSen->SenReg = LM80_FAN2_IN; -+ pSen->SenInit = SK_SEN_DYN_INIT_NONE; -+ pSen->SenValue = 0; -+ pSen->SenErrFlag = SK_SEN_ERR_NOT_PRESENT; -+ pSen->SenErrCts = 0; -+ pSen->SenBegErrTS = 0; -+ pSen->SenState = SK_SEN_IDLE; -+ pSen->SenRead = NULL; -+ pSen->SenDev = 0; -+ } -+ -+ /* Now we are "INIT data"ed */ -+ pAC->I2c.InitLevel = SK_INIT_DATA; -+ return(0); -+} /* SkI2cInit0*/ -+ -+ -+/* -+ * Do the init state 1 initialization -+ * -+ * initialize the following register of the LM80: -+ * Configuration register: -+ * - START, noINT, activeLOW, noINT#Clear, noRESET, noCI, noGPO#, noINIT -+ * -+ * Interrupt Mask Register 1: -+ * - all interrupts are Disabled (0xff) -+ * -+ * Interrupt Mask Register 2: -+ * - all interrupts are Disabled (0xff) Interrupt modi doesn't matter. -+ * -+ * Fan Divisor/RST_OUT register: -+ * - Divisors set to 1 (bits 00), all others 0s. -+ * -+ * OS# Configuration/Temperature resolution Register: -+ * - all 0s -+ * -+ */ -+static int SkI2cInit1( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ -+{ -+ int i; -+ SK_U8 I2cSwCtrl; -+ SK_GEPORT *pPrt; /* GIni Port struct pointer */ -+ SK_SENSOR *pSen; -+ -+ if (pAC->I2c.InitLevel != SK_INIT_DATA) { -+ /* Re-init not needed in TWSI module */ -+ return(0); -+ } -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC || -+ pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) { -+ /* No sensors on Yukon-EC and Yukon-FE */ -+ return(0); -+ } -+ -+ /* Set the Direction of TWSI-Data Pin to IN */ -+ SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA); -+ -+ /* Check for 32-Bit Yukon with Low at TWSI-Data Pin */ -+ SK_I2C_GET_SW(IoC, &I2cSwCtrl); -+ -+ if ((I2cSwCtrl & I2C_DATA) == 0) { -+ /* this is a 32-Bit board */ -+ pAC->GIni.GIYukon32Bit = SK_TRUE; -+ return(0); -+ } -+ -+ /* Check for 64 Bit Yukon without sensors */ -+ if (SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_CFG, 0) != 0) { -+ return(0); -+ } -+ -+ (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_1, 0); -+ -+ (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_2, 0); -+ -+ (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_FAN_CTRL, 0); -+ -+ (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_TEMP_CTRL, 0); -+ -+ (void)SkI2cWrite(pAC, IoC, (SK_U32)LM80_CFG_START, LM80_ADDR, I2C_025K_DEV, -+ LM80_CFG, 0); -+ -+ /* -+ * MaxSens has to be updated here, because PhyType is not -+ * set when performing Init Level 0 -+ */ -+ pAC->I2c.MaxSens = 5; -+ -+ pPrt = &pAC->GIni.GP[0]; -+ -+ if (pAC->GIni.GIGenesis) { -+ if (pPrt->PhyType == SK_PHY_BCOM) { -+ if (pAC->GIni.GIMacsFound == 1) { -+ pAC->I2c.MaxSens += 1; -+ } -+ else { -+ pAC->I2c.MaxSens += 3; -+ } -+ } -+ } -+ else { -+ pAC->I2c.MaxSens += 3; -+ } -+ -+ for (i = 0; i < pAC->I2c.MaxSens; i++) { -+ pSen = &pAC->I2c.SenTable[i]; -+ switch (i) { -+ case 0: -+ pSen->SenDesc = "Temperature"; -+ pSen->SenType = SK_SEN_TEMP; -+ pSen->SenThreErrHigh = SK_SEN_TEMP_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_TEMP_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_TEMP_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_TEMP_LOW_ERR; -+ pSen->SenReg = LM80_TEMP_IN; -+ break; -+ case 1: -+ pSen->SenDesc = "Voltage PCI"; -+ pSen->SenType = SK_SEN_VOLT; -+ pSen->SenThreErrHigh = SK_SEN_PCI_5V_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_PCI_5V_HIGH_WARN; -+ if (pAC->GIni.GIPciBus != SK_PEX_BUS) { -+ pSen->SenThreWarnLow = SK_SEN_PCI_5V_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PCI_5V_LOW_ERR; -+ } -+ else { -+ pSen->SenThreWarnLow = 0; -+ pSen->SenThreErrLow = 0; -+ } -+ pSen->SenReg = LM80_VT0_IN; -+ break; -+ case 2: -+ pSen->SenDesc = "Voltage PCI-IO"; -+ pSen->SenType = SK_SEN_VOLT; -+ pSen->SenThreErrHigh = SK_SEN_PCI_IO_5V_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_PCI_IO_5V_HIGH_WARN; -+ if (pAC->GIni.GIPciBus != SK_PEX_BUS) { -+ pSen->SenThreWarnLow = SK_SEN_PCI_IO_3V3_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PCI_IO_3V3_LOW_ERR; -+ } -+ else { -+ pSen->SenThreWarnLow = 0; -+ pSen->SenThreErrLow = 0; -+ } -+ pSen->SenReg = LM80_VT1_IN; -+ pSen->SenInit = SK_SEN_DYN_INIT_PCI_IO; -+ break; -+ case 3: -+ if (pAC->GIni.GIGenesis) { -+ pSen->SenDesc = "Voltage ASIC"; -+ } -+ else { -+ pSen->SenDesc = "Voltage VMAIN"; -+ } -+ pSen->SenType = SK_SEN_VOLT; -+ pSen->SenThreErrHigh = SK_SEN_VDD_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_VDD_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_VDD_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_VDD_LOW_ERR; -+ pSen->SenReg = LM80_VT2_IN; -+ break; -+ case 4: -+ if (pAC->GIni.GIGenesis) { -+ if (pPrt->PhyType == SK_PHY_BCOM) { -+ pSen->SenDesc = "Voltage PHY A PLL"; -+ pSen->SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; -+ } -+ else { -+ pSen->SenDesc = "Voltage PMA"; -+ pSen->SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; -+ } -+ } -+ else { -+ pSen->SenDesc = "Voltage VAUX"; -+ pSen->SenThreErrHigh = SK_SEN_VAUX_3V3_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_VAUX_3V3_HIGH_WARN; -+ if (pAC->GIni.GIVauxAvail) { -+ pSen->SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR; -+ } -+ else { -+ pSen->SenThreErrLow = 0; -+ pSen->SenThreWarnLow = 0; -+ } -+ } -+ pSen->SenType = SK_SEN_VOLT; -+ pSen->SenReg = LM80_VT3_IN; -+ break; -+ case 5: -+ if (CHIP_ID_YUKON_2(pAC)) { -+ if (pAC->GIni.GIChipRev == 0) { -+ pSen->SenDesc = "Voltage Core 1V3"; -+ pSen->SenThreErrHigh = SK_SEN_CORE_1V3_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V3_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_CORE_1V3_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_CORE_1V3_LOW_ERR; -+ } -+ else { -+ pSen->SenDesc = "Voltage Core 1V2"; -+ pSen->SenThreErrHigh = SK_SEN_CORE_1V2_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V2_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_CORE_1V2_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_CORE_1V2_LOW_ERR; -+ } -+ } -+ else { -+ if (pAC->GIni.GIGenesis) { -+ pSen->SenDesc = "Voltage PHY 2V5"; -+ pSen->SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; -+ } -+ else { -+ pSen->SenDesc = "Voltage Core 1V5"; -+ pSen->SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR; -+ } -+ } -+ pSen->SenType = SK_SEN_VOLT; -+ pSen->SenReg = LM80_VT4_IN; -+ break; -+ case 6: -+ if (CHIP_ID_YUKON_2(pAC)) { -+ pSen->SenDesc = "Voltage PHY 1V5"; -+ pSen->SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN; -+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) { -+ pSen->SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR; -+ } -+ else { -+ pSen->SenThreWarnLow = 0; -+ pSen->SenThreErrLow = 0; -+ } -+ } -+ else { -+ if (pAC->GIni.GIGenesis) { -+ pSen->SenDesc = "Voltage PHY B PLL"; -+ } -+ else { -+ pSen->SenDesc = "Voltage PHY 3V3"; -+ } -+ pSen->SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; -+ } -+ pSen->SenType = SK_SEN_VOLT; -+ pSen->SenReg = LM80_VT5_IN; -+ break; -+ case 7: -+ if (pAC->GIni.GIGenesis) { -+ pSen->SenDesc = "Speed Fan"; -+ pSen->SenType = SK_SEN_FAN; -+ pSen->SenThreErrHigh = SK_SEN_FAN_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_FAN_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_FAN_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_FAN_LOW_ERR; -+ pSen->SenReg = LM80_FAN2_IN; -+ } -+ else { -+ pSen->SenDesc = "Voltage PHY 2V5"; -+ pSen->SenType = SK_SEN_VOLT; -+ pSen->SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; -+ pSen->SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; -+ pSen->SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; -+ pSen->SenReg = LM80_VT6_IN; -+ } -+ break; -+ default: -+ SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW, -+ SKERR_I2C_E001, SKERR_I2C_E001MSG); -+ break; -+ } -+ -+ pSen->SenValue = 0; -+ pSen->SenErrFlag = SK_SEN_ERR_OK; -+ pSen->SenErrCts = 0; -+ pSen->SenBegErrTS = 0; -+ pSen->SenState = SK_SEN_IDLE; -+ if (pSen->SenThreWarnLow != 0) { -+ pSen->SenRead = SkLm80ReadSensor; -+ } -+ pSen->SenDev = LM80_ADDR; -+ } -+ -+#ifndef SK_DIAG -+ pAC->I2c.DummyReads = pAC->I2c.MaxSens; -+#endif /* !SK_DIAG */ -+ -+ /* Clear TWSI IRQ */ -+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); -+ -+ /* Now we are I/O initialized */ -+ pAC->I2c.InitLevel = SK_INIT_IO; -+ return(0); -+} /* SkI2cInit1 */ -+ -+ -+/* -+ * Init level 2: Start first sensor read. -+ */ -+static int SkI2cInit2( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ -+{ -+ int ReadComplete; -+ SK_SENSOR *pSen; -+ -+ if (pAC->I2c.InitLevel != SK_INIT_IO) { -+ /* ReInit not needed in TWSI module */ -+ /* Init0 and Init2 not permitted */ -+ return(0); -+ } -+ -+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -+ -+ ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); -+ -+ if (ReadComplete) { -+ SK_ERR_LOG(pAC, SK_ERRCL_INIT, SKERR_I2C_E008, SKERR_I2C_E008MSG); -+ } -+ -+ /* Now we are correctly initialized */ -+ pAC->I2c.InitLevel = SK_INIT_RUN; -+ -+ return(0); -+} /* SkI2cInit2*/ -+ -+ -+/* -+ * Initialize TWSI devices -+ * -+ * Get the first voltage value and discard it. -+ * Go into temperature read mode. A default pointer is not set. -+ * -+ * The things to be done depend on the init level in the parameter list: -+ * Level 0: -+ * Initialize only the data structures. Do NOT access hardware. -+ * Level 1: -+ * Initialize hardware through SK_IN / SK_OUT commands. Do NOT use interrupts. -+ * Level 2: -+ * Everything is possible. Interrupts may be used from now on. -+ * -+ * return: -+ * 0 = success -+ * other = error. -+ */ -+int SkI2cInit( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context needed in levels 1 and 2 */ -+int Level) /* Init Level */ -+{ -+ -+ switch (Level) { -+ case SK_INIT_DATA: -+ return(SkI2cInit0(pAC)); -+ case SK_INIT_IO: -+ return(SkI2cInit1(pAC, IoC)); -+ case SK_INIT_RUN: -+ return(SkI2cInit2(pAC, IoC)); -+ default: -+ break; -+ } -+ -+ return(0); -+} /* SkI2cInit */ -+ -+ -+#ifndef SK_DIAG -+/* -+ * Interrupt service function for the TWSI Interface -+ * -+ * Clears the Interrupt source -+ * -+ * Reads the register and check it for sending a trap. -+ * -+ * Starts the timer if necessary. -+ */ -+void SkI2cIsr( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC) /* I/O Context */ -+{ -+ SK_EVPARA Para; -+ -+ /* Clear TWSI IRQ */ -+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); -+ -+ Para.Para64 = 0; -+ SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_IRQ, Para); -+} /* SkI2cIsr */ -+ -+ -+/* -+ * Check this sensors Value against the threshold and send events. -+ */ -+static void SkI2cCheckSensor( -+SK_AC *pAC, /* Adapter Context */ -+SK_SENSOR *pSen) -+{ -+ SK_EVPARA ParaLocal; -+ SK_BOOL TooHigh; /* Is sensor too high? */ -+ SK_BOOL TooLow; /* Is sensor too low? */ -+ SK_U64 CurrTime; /* Current Time */ -+ SK_BOOL DoTrapSend; /* We need to send a trap */ -+ SK_BOOL DoErrLog; /* We need to log the error */ -+ SK_BOOL IsError; /* Error occured */ -+ -+ /* Check Dummy Reads first */ -+ if (pAC->I2c.DummyReads > 0) { -+ pAC->I2c.DummyReads--; -+ return; -+ } -+ -+ /* Get the current time */ -+ CurrTime = SkOsGetTime(pAC); -+ -+ /* Set para to the most useful setting: The current sensor. */ -+ ParaLocal.Para64 = (SK_U64)pAC->I2c.CurrSens; -+ -+ /* Check the Value against the thresholds. First: Error Thresholds */ -+ TooHigh = pSen->SenValue > pSen->SenThreErrHigh; -+ TooLow = pSen->SenValue < pSen->SenThreErrLow; -+ -+ IsError = SK_FALSE; -+ -+ if (TooHigh || TooLow) { -+ /* Error condition is satisfied */ -+ DoTrapSend = SK_TRUE; -+ DoErrLog = SK_TRUE; -+ -+ /* Now error condition is satisfied */ -+ IsError = SK_TRUE; -+ -+ if (pSen->SenErrFlag == SK_SEN_ERR_ERR) { -+ /* This state is the former one */ -+ -+ /* So check first whether we have to send a trap */ -+ if (pSen->SenLastErrTrapTS + SK_SEN_ERR_TR_HOLD > CurrTime) { -+ /* -+ * Do NOT send the Trap. The hold back time -+ * has to run out first. -+ */ -+ DoTrapSend = SK_FALSE; -+ } -+ -+ /* Check now whether we have to log an Error */ -+ if (pSen->SenLastErrLogTS + SK_SEN_ERR_LOG_HOLD > CurrTime) { -+ /* -+ * Do NOT log the error. The hold back time -+ * has to run out first. -+ */ -+ DoErrLog = SK_FALSE; -+ } -+ } -+ else { -+ /* We came from a different state -> Set Begin Time Stamp */ -+ pSen->SenBegErrTS = CurrTime; -+ pSen->SenErrFlag = SK_SEN_ERR_ERR; -+ } -+ -+ if (DoTrapSend) { -+ /* Set current Time */ -+ pSen->SenLastErrTrapTS = CurrTime; -+ pSen->SenErrCts++; -+ -+ /* Queue PNMI Event */ -+ SkEventQueue(pAC, SKGE_PNMI, TooHigh ? -+ SK_PNMI_EVT_SEN_ERR_UPP : SK_PNMI_EVT_SEN_ERR_LOW, -+ ParaLocal); -+ } -+ -+ if (DoErrLog) { -+ /* Set current Time */ -+ pSen->SenLastErrLogTS = CurrTime; -+ -+ if (pSen->SenType == SK_SEN_TEMP) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E011, SKERR_I2C_E011MSG); -+ } -+ else if (pSen->SenType == SK_SEN_VOLT) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E012, SKERR_I2C_E012MSG); -+ } -+ else { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E015, SKERR_I2C_E015MSG); -+ } -+ } -+ } -+ -+ /* Check the Value against the thresholds */ -+ /* 2nd: Warning thresholds */ -+ TooHigh = pSen->SenValue > pSen->SenThreWarnHigh; -+ TooLow = pSen->SenValue < pSen->SenThreWarnLow; -+ -+ if (!IsError && (TooHigh || TooLow)) { -+ /* Error condition is satisfied */ -+ DoTrapSend = SK_TRUE; -+ DoErrLog = SK_TRUE; -+ -+ if (pSen->SenErrFlag == SK_SEN_ERR_WARN) { -+ /* This state is the former one */ -+ -+ /* So check first whether we have to send a trap */ -+ if (pSen->SenLastWarnTrapTS + SK_SEN_WARN_TR_HOLD > CurrTime) { -+ /* -+ * Do NOT send the Trap. The hold back time -+ * has to run out first. -+ */ -+ DoTrapSend = SK_FALSE; -+ } -+ -+ /* Check now whether we have to log an Error */ -+ if (pSen->SenLastWarnLogTS + SK_SEN_WARN_LOG_HOLD > CurrTime) { -+ /* -+ * Do NOT log the error. The hold back time -+ * has to run out first. -+ */ -+ DoErrLog = SK_FALSE; -+ } -+ } -+ else { -+ /* We came from a different state -> Set Begin Time Stamp */ -+ pSen->SenBegWarnTS = CurrTime; -+ pSen->SenErrFlag = SK_SEN_ERR_WARN; -+ } -+ -+ if (DoTrapSend) { -+ /* Set current Time */ -+ pSen->SenLastWarnTrapTS = CurrTime; -+ pSen->SenWarnCts++; -+ -+ /* Queue PNMI Event */ -+ SkEventQueue(pAC, SKGE_PNMI, TooHigh ? -+ SK_PNMI_EVT_SEN_WAR_UPP : SK_PNMI_EVT_SEN_WAR_LOW, ParaLocal); -+ } -+ -+ if (DoErrLog) { -+ /* Set current Time */ -+ pSen->SenLastWarnLogTS = CurrTime; -+ -+ if (pSen->SenType == SK_SEN_TEMP) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E009, SKERR_I2C_E009MSG); -+ } -+ else if (pSen->SenType == SK_SEN_VOLT) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E010, SKERR_I2C_E010MSG); -+ } -+ else { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E014, SKERR_I2C_E014MSG); -+ } -+ } -+ } -+ -+ /* Check for NO error at all */ -+ if (!IsError && !TooHigh && !TooLow) { -+ /* Set o.k. Status if no error and no warning condition */ -+ pSen->SenErrFlag = SK_SEN_ERR_OK; -+ } -+ -+ /* End of check against the thresholds */ -+ -+ if (pSen->SenInit == SK_SEN_DYN_INIT_PCI_IO) { -+ /* Bug fix AF: 16.Aug.2001: Correct the init base of LM80 sensor */ -+ pSen->SenInit = SK_SEN_DYN_INIT_NONE; -+ -+ if (pSen->SenValue > SK_SEN_PCI_IO_RANGE_LIMITER) { -+ /* 5V PCI-IO Voltage */ -+ pSen->SenThreWarnLow = SK_SEN_PCI_IO_5V_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_PCI_IO_5V_LOW_ERR; -+ } -+ else { -+ /* 3.3V PCI-IO Voltage */ -+ pSen->SenThreWarnHigh = SK_SEN_PCI_IO_3V3_HIGH_WARN; -+ pSen->SenThreErrHigh = SK_SEN_PCI_IO_3V3_HIGH_ERR; -+ } -+ } -+ -+#ifdef TEST_ONLY -+ /* Dynamic thresholds also for VAUX of LM80 sensor */ -+ if (pSen->SenInit == SK_SEN_DYN_INIT_VAUX) { -+ -+ pSen->SenInit = SK_SEN_DYN_INIT_NONE; -+ -+ /* 3.3V VAUX Voltage */ -+ if (pSen->SenValue > SK_SEN_VAUX_RANGE_LIMITER) { -+ pSen->SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN; -+ pSen->SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR; -+ } -+ /* 0V VAUX Voltage */ -+ else { -+ pSen->SenThreWarnHigh = SK_SEN_VAUX_0V_WARN_ERR; -+ pSen->SenThreErrHigh = SK_SEN_VAUX_0V_WARN_ERR; -+ } -+ } -+ -+ /* Check initialization state: the VIO Thresholds need adaption */ -+ if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN && -+ pSen->SenValue > SK_SEN_WARNLOW2C && -+ pSen->SenValue < SK_SEN_WARNHIGH2) { -+ -+ pSen->SenThreErrLow = SK_SEN_ERRLOW2C; -+ pSen->SenThreWarnLow = SK_SEN_WARNLOW2C; -+ pSen->SenInit = SK_TRUE; -+ } -+ -+ if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN && -+ pSen->SenValue > SK_SEN_WARNLOW2 && -+ pSen->SenValue < SK_SEN_WARNHIGH2C) { -+ -+ pSen->SenThreErrHigh = SK_SEN_ERRHIGH2C; -+ pSen->SenThreWarnHigh = SK_SEN_WARNHIGH2C; -+ pSen->SenInit = SK_TRUE; -+ } -+#endif -+ -+ if (pSen->SenInit != SK_SEN_DYN_INIT_NONE) { -+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E013, SKERR_I2C_E013MSG); -+ } -+} /* SkI2cCheckSensor */ -+ -+ -+/* -+ * The only Event to be served is the timeout event -+ * -+ */ -+int SkI2cEvent( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ -+SK_U32 Event, /* Module specific Event */ -+SK_EVPARA Para) /* Event specific Parameter */ -+{ -+ int ReadComplete; -+ SK_SENSOR *pSen; -+ SK_U32 Time; -+ SK_EVPARA ParaLocal; -+ int i; -+ -+ /* New case: no sensors */ -+ if (pAC->I2c.MaxSens == 0) { -+ return(0); -+ } -+ -+ switch (Event) { -+ case SK_I2CEV_IRQ: -+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -+ ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); -+ -+ if (ReadComplete) { -+ /* Check sensor against defined thresholds */ -+ SkI2cCheckSensor(pAC, pSen); -+ -+ /* Increment Current sensor and set appropriate Timeout */ -+ pAC->I2c.CurrSens++; -+ if (pAC->I2c.CurrSens >= pAC->I2c.MaxSens) { -+ pAC->I2c.CurrSens = 0; -+ Time = SK_I2C_TIM_LONG; -+ } -+ else { -+ Time = SK_I2C_TIM_SHORT; -+ } -+ -+ /* Start Timer */ -+ ParaLocal.Para64 = (SK_U64)0; -+ -+ pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; -+ -+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, -+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -+ } -+ else { -+ /* Start Timer */ -+ ParaLocal.Para64 = (SK_U64)0; -+ -+ pAC->I2c.TimerMode = SK_TIMER_WATCH_SM; -+ -+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, SK_I2C_TIM_WATCH, -+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -+ } -+ break; -+ case SK_I2CEV_TIM: -+ if (pAC->I2c.TimerMode == SK_TIMER_NEW_GAUGING) { -+ -+ ParaLocal.Para64 = (SK_U64)0; -+ SkTimerStop(pAC, IoC, &pAC->I2c.SenTimer); -+ -+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -+ ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); -+ -+ if (ReadComplete) { -+ /* Check sensor against defined thresholds */ -+ SkI2cCheckSensor(pAC, pSen); -+ -+ /* Increment Current sensor and set appropriate Timeout */ -+ pAC->I2c.CurrSens++; -+ if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) { -+ pAC->I2c.CurrSens = 0; -+ Time = SK_I2C_TIM_LONG; -+ } -+ else { -+ Time = SK_I2C_TIM_SHORT; -+ } -+ -+ /* Start Timer */ -+ ParaLocal.Para64 = (SK_U64)0; -+ -+ pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; -+ -+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, -+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -+ } -+ } -+ else { -+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; -+ pSen->SenErrFlag = SK_SEN_ERR_FAULTY; -+ SK_I2C_STOP(IoC); -+ -+ /* Increment Current sensor and set appropriate Timeout */ -+ pAC->I2c.CurrSens++; -+ if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) { -+ pAC->I2c.CurrSens = 0; -+ Time = SK_I2C_TIM_LONG; -+ } -+ else { -+ Time = SK_I2C_TIM_SHORT; -+ } -+ -+ /* Start Timer */ -+ ParaLocal.Para64 = (SK_U64)0; -+ -+ pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; -+ -+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, -+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal); -+ } -+ break; -+ case SK_I2CEV_CLEAR: -+ for (i = 0; i < SK_MAX_SENSORS; i++) { -+ pSen = &pAC->I2c.SenTable[i]; -+ -+ pSen->SenErrFlag = SK_SEN_ERR_OK; -+ pSen->SenErrCts = 0; -+ pSen->SenWarnCts = 0; -+ pSen->SenBegErrTS = 0; -+ pSen->SenBegWarnTS = 0; -+ pSen->SenLastErrTrapTS = (SK_U64)0; -+ pSen->SenLastErrLogTS = (SK_U64)0; -+ pSen->SenLastWarnTrapTS = (SK_U64)0; -+ pSen->SenLastWarnLogTS = (SK_U64)0; -+ } -+ break; -+ default: -+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E006, SKERR_I2C_E006MSG); -+ } -+ -+ return(0); -+} /* SkI2cEvent*/ -+ -+#endif /* !SK_DIAG */ -+ ---- ./drivers/net/sk98lin/skvpd.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skvpd.c 2006-04-04 13:13:35.000000000 +0400 -@@ -1,22 +1,22 @@ - /****************************************************************************** - * - * Name: skvpd.c -- * Project: GEnesis, PCI Gigabit Ethernet Adapter -- * Version: $Revision: 1.37 $ -- * Date: $Date: 2003/01/13 10:42:45 $ -- * Purpose: Shared software to read and write VPD data -+ * Project: Gigabit Ethernet Adapters, VPD-Module -+ * Version: $Revision: 2.6 $ -+ * Date: $Date: 2004/11/02 10:47:39 $ -+ * Purpose: Shared software to read and write VPD - * - ******************************************************************************/ - - /****************************************************************************** - * -- * (C)Copyright 1998-2003 SysKonnect GmbH. -+ * (C)Copyright 1998-2002 SysKonnect. -+ * (C)Copyright 2002-2004 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. - * - ******************************************************************************/ -@@ -25,7 +25,7 @@ - Please refer skvpd.txt for infomation how to include this module - */ - static const char SysKonnectFileId[] = -- "@(#)$Id: skvpd.c,v 1.37 2003/01/13 10:42:45 rschmidt Exp $ (C) SK"; -+ "@(#) $Id: skvpd.c,v 2.6 2004/11/02 10:47:39 rschmidt Exp $ (C) Marvell."; - - #include "h/skdrv1st.h" - #include "h/sktypes.h" -@@ -59,9 +59,10 @@ int event) /* event to wait for (VPD_RE - SK_U64 start_time; - SK_U16 state; - -- SK_DBG_MSG(pAC,SK_DBGMOD_VPD, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, - ("VPD wait for %s\n", event?"Write":"Read")); - start_time = SkOsGetTime(pAC); -+ - do { - if (SkOsGetTime(pAC) - start_time > SK_TICKS_PER_SEC) { - -@@ -81,17 +82,18 @@ int event) /* event to wait for (VPD_RE - ("ERROR:VPD wait timeout\n")); - return(1); - } -- -+ - VPD_IN16(pAC, IoC, PCI_VPD_ADR_REG, &state); -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, - ("state = %x, event %x\n",state,event)); -- } while((int)(state & PCI_VPD_FLAG) == event); -+ } while ((int)(state & PCI_VPD_FLAG) == event); - - return(0); - } - --#ifdef SKDIAG -+ -+#ifdef SK_DIAG - - /* - * Read the dword at address 'addr' from the VPD EEPROM. -@@ -124,16 +126,15 @@ int addr) /* VPD address */ - Rtv = 0; - - VPD_IN32(pAC, IoC, PCI_VPD_DAT_REG, &Rtv); -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, - ("VPD read dword data = 0x%x\n",Rtv)); - return(Rtv); - } -+#endif /* SK_DIAG */ - --#endif /* SKDIAG */ -- --#if 0 - -+#ifdef XXX - /* - Write the dword 'data' at address 'addr' into the VPD EEPROM, and - verify that the data is written. -@@ -151,7 +152,6 @@ int addr) /* VPD address */ - . over all 3.8 ms 13.2 ms - . - -- - Returns 0: success - 1: error, I2C transfer does not terminate - 2: error, data verify error -@@ -189,7 +189,8 @@ SK_U32 data) /* VPD data to write */ - return(0); - } /* VpdWriteDWord */ - --#endif /* 0 */ -+#endif /* XXX */ -+ - - /* - * Read one Stream of 'len' bytes of VPD data, starting at 'addr' from -@@ -215,7 +216,7 @@ int Len) /* number of bytes to read / t - pComp = (SK_U8 *) buf; - - for (i = 0; i < Len; i++, buf++) { -- if ((i%sizeof(SK_U32)) == 0) { -+ if ((i % SZ_LONG) == 0) { - /* - * At the begin of each cycle read the Data Reg - * So it is initialized even if only a few bytes -@@ -233,14 +234,13 @@ int Len) /* number of bytes to read / t - } - } - -- /* Write current Byte */ -- VPD_OUT8(pAC, IoC, PCI_VPD_DAT_REG + (i%sizeof(SK_U32)), -- *(SK_U8*)buf); -+ /* Write current byte */ -+ VPD_OUT8(pAC, IoC, PCI_VPD_DAT_REG + (i % SZ_LONG), *(SK_U8*)buf); - -- if (((i%sizeof(SK_U32)) == 3) || (i == (Len - 1))) { -+ if (((i % SZ_LONG) == 3) || (i == (Len - 1))) { - /* New Address needs to be written to VPD_ADDR reg */ - AdrReg = (SK_U16) Addr; -- Addr += sizeof(SK_U32); -+ Addr += SZ_LONG; - AdrReg |= VPD_WRITE; /* WRITE operation */ - - VPD_OUT16(pAC, IoC, PCI_VPD_ADR_REG, AdrReg); -@@ -250,7 +250,7 @@ int Len) /* number of bytes to read / t - if (Rtv != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, - ("Write Timed Out\n")); -- return(i - (i%sizeof(SK_U32))); -+ return(i - (i % SZ_LONG)); - } - - /* -@@ -265,18 +265,18 @@ int Len) /* number of bytes to read / t - if (Rtv != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, - ("Verify Timed Out\n")); -- return(i - (i%sizeof(SK_U32))); -+ return(i - (i % SZ_LONG)); - } - -- for (j = 0; j <= (int)(i%sizeof(SK_U32)); j++, pComp++) { -- -+ for (j = 0; j <= (int)(i % SZ_LONG); j++, pComp++) { -+ - VPD_IN8(pAC, IoC, PCI_VPD_DAT_REG + j, &Data); -- -+ - if (Data != *pComp) { - /* Verify Error */ - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, - ("WriteStream Verify Error\n")); -- return(i - (i%sizeof(SK_U32)) + j); -+ return(i - (i % SZ_LONG) + j); - } - } - } -@@ -284,7 +284,7 @@ int Len) /* number of bytes to read / t - - return(Len); - } -- -+ - - /* - * Read one Stream of 'len' bytes of VPD data, starting at 'addr' from -@@ -304,10 +304,10 @@ int Len) /* number of bytes to read / t - int Rtv; - - for (i = 0; i < Len; i++, buf++) { -- if ((i%sizeof(SK_U32)) == 0) { -+ if ((i % SZ_LONG) == 0) { - /* New Address needs to be written to VPD_ADDR reg */ - AdrReg = (SK_U16) Addr; -- Addr += sizeof(SK_U32); -+ Addr += SZ_LONG; - AdrReg &= ~VPD_WRITE; /* READ operation */ - - VPD_OUT16(pAC, IoC, PCI_VPD_ADR_REG, AdrReg); -@@ -318,13 +318,13 @@ int Len) /* number of bytes to read / t - return(i); - } - } -- VPD_IN8(pAC, IoC, PCI_VPD_DAT_REG + (i%sizeof(SK_U32)), -- (SK_U8 *)buf); -+ VPD_IN8(pAC, IoC, PCI_VPD_DAT_REG + (i % SZ_LONG), (SK_U8 *)buf); - } - - return(Len); - } - -+ - /* - * Read ore writes 'len' bytes of VPD data, starting at 'addr' from - * or to the I2C EEPROM. -@@ -350,14 +350,14 @@ int dir) /* transfer direction may be V - return(0); - - vpd_rom_size = pAC->vpd.rom_size; -- -+ - if (addr > vpd_rom_size - 4) { - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL, - ("Address error: 0x%x, exp. < 0x%x\n", - addr, vpd_rom_size - 4)); - return(0); - } -- -+ - if (addr + len > vpd_rom_size) { - len = vpd_rom_size - addr; - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, -@@ -374,8 +374,8 @@ int dir) /* transfer direction may be V - return(Rtv); - } - --#ifdef SKDIAG - -+#if defined (SK_DIAG) || defined (SK_ASF) - /* - * Read 'len' bytes of VPD data, starting at 'addr'. - * -@@ -391,6 +391,7 @@ int len) /* number of bytes to read */ - return(VpdTransferBlock(pAC, IoC, buf, addr, len, VPD_READ)); - } - -+ - /* - * Write 'len' bytes of *but to the VPD EEPROM, starting at 'addr'. - * -@@ -405,18 +406,27 @@ int len) /* number of bytes to write */ - { - return(VpdTransferBlock(pAC, IoC, buf, addr, len, VPD_WRITE)); - } --#endif /* SKDIAG */ -+#endif /* SK_DIAG */ - --/* -- * (re)initialize the VPD buffer -+ -+/****************************************************************************** - * -- * Reads the VPD data from the EEPROM into the VPD buffer. -- * Get the remaining read only and read / write space. -+ * VpdInit() - (re)initialize the VPD buffer - * -- * return 0: success -- * 1: fatal VPD error -+ * Description: -+ * Reads the VPD data from the EEPROM into the VPD buffer. -+ * Get the remaining read only and read / write space. -+ * -+ * Note: -+ * This is a local function and should be used locally only. -+ * However, the ASF module needs to use this function also. -+ * Therfore it has been published. -+ * -+ * Returns: -+ * 0: success -+ * 1: fatal VPD error - */ --static int VpdInit( -+int VpdInit( - SK_AC *pAC, /* Adapters context */ - SK_IOC IoC) /* IO Context */ - { -@@ -427,14 +437,14 @@ SK_IOC IoC) /* IO Context */ - SK_U16 dev_id; - SK_U32 our_reg2; - -- SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_INIT, ("VpdInit .. ")); -- -+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_INIT, ("VpdInit ... ")); -+ - VPD_IN16(pAC, IoC, PCI_DEVICE_ID, &dev_id); -- -+ - VPD_IN32(pAC, IoC, PCI_OUR_REG_2, &our_reg2); -- -+ - pAC->vpd.rom_size = 256 << ((our_reg2 & PCI_VPD_ROM_SZ) >> 14); -- -+ - /* - * this function might get used before the hardware is initialized - * therefore we cannot always trust in GIChipId -@@ -465,19 +475,15 @@ SK_IOC IoC) /* IO Context */ - ("Block Read Error\n")); - return(1); - } -- -+ - pAC->vpd.vpd_size = vpd_size; - - /* Asus K8V Se Deluxe bugfix. Correct VPD content */ -- /* MBo April 2004 */ -- if (((unsigned char)pAC->vpd.vpd_buf[0x3f] == 0x38) && -- ((unsigned char)pAC->vpd.vpd_buf[0x40] == 0x3c) && -- ((unsigned char)pAC->vpd.vpd_buf[0x41] == 0x45)) { -- printk("sk98lin: Asus mainboard with buggy VPD? " -- "Correcting data.\n"); -- pAC->vpd.vpd_buf[0x40] = 0x38; -- } -+ i = 62; -+ if (!SK_STRNCMP(pAC->vpd.vpd_buf + i, " 8<E", 4)) { - -+ pAC->vpd.vpd_buf[i + 2] = '8'; -+ } - - /* find the end tag of the RO area */ - if (!(r = vpd_find_para(pAC, VPD_RV, &rp))) { -@@ -485,9 +491,9 @@ SK_IOC IoC) /* IO Context */ - ("Encoding Error: RV Tag not found\n")); - return(1); - } -- -+ - if (r->p_val + r->p_len > pAC->vpd.vpd_buf + vpd_size/2) { -- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR | SK_DBGCAT_FATAL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD,SK_DBGCAT_ERR | SK_DBGCAT_FATAL, - ("Encoding Error: Invalid VPD struct size\n")); - return(1); - } -@@ -497,7 +503,7 @@ SK_IOC IoC) /* IO Context */ - for (i = 0, x = 0; (unsigned)i <= (unsigned)vpd_size/2 - r->p_len; i++) { - x += pAC->vpd.vpd_buf[i]; - } -- -+ - if (x != 0) { - /* checksum error */ - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL, -@@ -511,7 +517,7 @@ SK_IOC IoC) /* IO Context */ - ("Encoding Error: RV Tag not found\n")); - return(1); - } -- -+ - if (r->p_val < pAC->vpd.vpd_buf + vpd_size/2) { - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL, - ("Encoding Error: Invalid VPD struct size\n")); -@@ -531,6 +537,7 @@ SK_IOC IoC) /* IO Context */ - return(0); - } - -+ - /* - * find the Keyword 'key' in the VPD buffer and fills the - * parameter struct 'p' with it's values -@@ -541,7 +548,7 @@ SK_IOC IoC) /* IO Context */ - static SK_VPD_PARA *vpd_find_para( - SK_AC *pAC, /* common data base */ - const char *key, /* keyword to find (e.g. "MN") */ --SK_VPD_PARA *p) /* parameter description struct */ -+SK_VPD_PARA *p) /* parameter description struct */ - { - char *v ; /* points to VPD buffer */ - int max; /* Maximum Number of Iterations */ -@@ -556,10 +563,10 @@ SK_VPD_PARA *p) /* parameter descriptio - if (*v != (char)RES_ID) { - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL, - ("Error: 0x%x missing\n", RES_ID)); -- return NULL; -+ return(0); - } - -- if (strcmp(key, VPD_NAME) == 0) { -+ if (SK_STRCMP(key, VPD_NAME) == 0) { - p->p_len = VPD_GET_RES_LEN(v); - p->p_val = VPD_GET_VAL(v); - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, -@@ -569,7 +576,7 @@ SK_VPD_PARA *p) /* parameter descriptio - - v += 3 + VPD_GET_RES_LEN(v) + 3; - for (;; ) { -- if (SK_MEMCMP(key,v,2) == 0) { -+ if (SK_MEMCMP(key, v, 2) == 0) { - p->p_len = VPD_GET_VPD_LEN(v); - p->p_val = VPD_GET_VAL(v); - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, -@@ -579,11 +586,11 @@ SK_VPD_PARA *p) /* parameter descriptio - - /* exit when reaching the "RW" Tag or the maximum of itera. */ - max--; -- if (SK_MEMCMP(VPD_RW,v,2) == 0 || max == 0) { -+ if (SK_MEMCMP(VPD_RW, v, 2) == 0 || max == 0) { - break; - } - -- if (SK_MEMCMP(VPD_RV,v,2) == 0) { -+ if (SK_MEMCMP(VPD_RV, v, 2) == 0) { - v += 3 + VPD_GET_VPD_LEN(v) + 3; /* skip VPD-W */ - } - else { -@@ -600,9 +607,10 @@ SK_VPD_PARA *p) /* parameter descriptio - ("Key/Len Encoding error\n")); - } - #endif /* DEBUG */ -- return NULL; -+ return(0); - } - -+ - /* - * Move 'n' bytes. Begin with the last byte if 'n' is > 0, - * Start with the last byte if n is < 0. -@@ -637,6 +645,7 @@ int n) /* number of bytes the memory - } - } - -+ - /* - * setup the VPD keyword 'key' at 'ip'. - * -@@ -653,10 +662,11 @@ char *ip) /* inseration point */ - p = (SK_VPD_KEY *) ip; - p->p_key[0] = key[0]; - p->p_key[1] = key[1]; -- p->p_len = (unsigned char) len; -- SK_MEMCPY(&p->p_val,buf,len); -+ p->p_len = (unsigned char)len; -+ SK_MEMCPY(&p->p_val, buf, len); - } - -+ - /* - * Setup the VPD end tag "RV" / "RW". - * Also correct the remaining space variables vpd_free_ro / vpd_free_rw. -@@ -682,7 +692,7 @@ char *etp) /* end pointer input positio - - if (p->p_key[0] != 'R' || (p->p_key[1] != 'V' && p->p_key[1] != 'W')) { - /* something wrong here, encoding error */ -- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR | SK_DBGCAT_FATAL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL, - ("Encoding Error: invalid end tag\n")); - return(1); - } -@@ -714,6 +724,7 @@ char *etp) /* end pointer input positio - return(0); - } - -+ - /* - * Insert a VPD keyword into the VPD buffer. - * -@@ -747,11 +758,11 @@ int op) /* operation to do: ADD_KEY o - - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, - ("VPD setup para key = %s, val = %s\n",key,buf)); -- -+ - vpd_size = pAC->vpd.vpd_size; - - rtv = 0; -- ip = NULL; -+ ip = 0; - if (type == VPD_RW_KEY) { - /* end tag is "RW" */ - free = pAC->vpd.v.vpd_free_rw; -@@ -875,18 +886,18 @@ int *elements) /* number of keywords re - } - } - -- if ((signed)strlen(VPD_NAME) + 1 <= *len) { -+ if ((signed)SK_STRLEN(VPD_NAME) + 1 <= *len) { - v = pAC->vpd.vpd_buf; -- strcpy(buf,VPD_NAME); -- n = strlen(VPD_NAME) + 1; -+ SK_STRCPY(buf, VPD_NAME); -+ n = SK_STRLEN(VPD_NAME) + 1; - buf += n; - *elements = 1; - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_RX, -- ("'%c%c' ",v[0],v[1])); -+ ("'%c%c' ", v[0], v[1])); - } - else { - *len = 0; -- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR, -+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, - ("buffer overflow\n")); - return(2); - } -@@ -894,17 +905,17 @@ int *elements) /* number of keywords re - v += 3 + VPD_GET_RES_LEN(v) + 3; - for (;; ) { - /* exit when reaching the "RW" Tag */ -- if (SK_MEMCMP(VPD_RW,v,2) == 0) { -+ if (SK_MEMCMP(VPD_RW, v, 2) == 0) { - break; - } - -- if (SK_MEMCMP(VPD_RV,v,2) == 0) { -+ if (SK_MEMCMP(VPD_RV, v, 2) == 0) { - v += 3 + VPD_GET_VPD_LEN(v) + 3; /* skip VPD-W */ - continue; - } - - if (n+3 <= *len) { -- SK_MEMCPY(buf,v,2); -+ SK_MEMCPY(buf, v, 2); - buf += 2; - *buf++ = '\0'; - n += 3; -@@ -991,13 +1002,14 @@ char *key) /* keyword to write (allowed - { - if ((*key != 'Y' && *key != 'V') || - key[1] < '0' || key[1] > 'Z' || -- (key[1] > '9' && key[1] < 'A') || strlen(key) != 2) { -+ (key[1] > '9' && key[1] < 'A') || SK_STRLEN(key) != 2) { - - return(SK_FALSE); - } - return(SK_TRUE); - } - -+ - /* - * Read the contents of the VPD EEPROM and copy it to the VPD - * buffer if not already done. Insert/overwrite the keyword 'key' -@@ -1026,7 +1038,7 @@ const char *buf) /* buffer where the key - - if ((*key != 'Y' && *key != 'V') || - key[1] < '0' || key[1] > 'Z' || -- (key[1] > '9' && key[1] < 'A') || strlen(key) != 2) { -+ (key[1] > '9' && key[1] < 'A') || SK_STRLEN(key) != 2) { - - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, - ("illegal key tag, keyword not written\n")); -@@ -1042,13 +1054,13 @@ const char *buf) /* buffer where the key - } - - rtv = 0; -- len = strlen(buf); -+ len = SK_STRLEN(buf); - if (len > VPD_MAX_LEN) { - /* cut it */ - len = VPD_MAX_LEN; - rtv = 2; - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, -- ("keyword too long, cut after %d bytes\n",VPD_MAX_LEN)); -+ ("keyword too long, cut after %d bytes\n", VPD_MAX_LEN)); - } - if ((rtv2 = VpdSetupPara(pAC, key, buf, len, VPD_RW_KEY, OWR_KEY)) != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, -@@ -1059,6 +1071,7 @@ const char *buf) /* buffer where the key - return(rtv); - } - -+ - /* - * Read the contents of the VPD EEPROM and copy it to the - * VPD buffer if not already done. Remove the VPD keyword -@@ -1082,7 +1095,7 @@ char *key) /* keyword to read (e.g. "MN" - - vpd_size = pAC->vpd.vpd_size; - -- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_TX,("VPD delete key %s\n",key)); -+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("VPD delete key %s\n", key)); - if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { - if (VpdInit(pAC, IoC) != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, -@@ -1119,6 +1132,7 @@ char *key) /* keyword to read (e.g. "MN" - return(0); - } - -+ - /* - * If the VPD buffer contains valid data write the VPD - * read/write area back to the VPD EEPROM. -@@ -1149,7 +1163,6 @@ SK_IOC IoC) /* IO Context */ - } - - -- - /* - * Read the contents of the VPD EEPROM and copy it to the VPD buffer - * if not already done. If the keyword "VF" is not present it will be -@@ -1178,7 +1191,7 @@ char *msg) /* error log message */ - } - } - -- len = strlen(msg); -+ len = SK_STRLEN(msg); - if (len > VPD_MAX_LEN) { - /* cut it */ - len = VPD_MAX_LEN; ---- ./drivers/net/sk98lin/skxmac2.c.skn 2006-04-04 13:11:06.000000000 +0400 -+++ ./drivers/net/sk98lin/skxmac2.c 2006-04-04 13:13:35.000000000 +0400 -@@ -2,23 +2,24 @@ - * - * Name: skxmac2.c - * Project: Gigabit Ethernet Adapters, Common Modules -- * Version: $Revision: 1.102 $ -- * Date: $Date: 2003/10/02 16:53:58 $ -+ * Version: $Revision: 2.52 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ - * Purpose: Contains functions to initialize the MACs and PHYs - * - ******************************************************************************/ - - /****************************************************************************** - * -+ * LICENSE: - * (C)Copyright 1998-2002 SysKonnect. -- * (C)Copyright 2002-2003 Marvell. -+ * (C)Copyright 2002-2005 Marvell. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. -- * - * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE - * - ******************************************************************************/ - -@@ -37,7 +38,7 @@ typedef struct s_PhyHack { - - #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) - static const char SysKonnectFileId[] = -- "@(#) $Id: skxmac2.c,v 1.102 2003/10/02 16:53:58 rschmidt Exp $ (C) Marvell."; -+ "@(#) $Id: skxmac2.c,v 2.52 2005/12/14 16:11:35 ibrueder Exp $ (C) Marvell."; - #endif - - #ifdef GENESIS -@@ -83,7 +84,7 @@ static int SkXmAutoNegDoneNat (SK_AC*, S - * Returns: - * nothing - */ --void SkXmPhyRead( -+int SkXmPhyRead( - SK_AC *pAC, /* Adapter Context */ - SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ -@@ -94,13 +95,13 @@ SK_U16 SK_FAR *pVal) /* Pointer to Value - SK_GEPORT *pPrt; - - pPrt = &pAC->GIni.GP[Port]; -- -+ - /* write the PHY register's address */ - XM_OUT16(IoC, Port, XM_PHY_ADDR, PhyReg | pPrt->PhyAddr); -- -+ - /* get the PHY register's value */ - XM_IN16(IoC, Port, XM_PHY_DATA, pVal); -- -+ - if (pPrt->PhyType != SK_PHY_XMAC) { - do { - XM_IN16(IoC, Port, XM_MMU_CMD, &Mmu); -@@ -110,6 +111,8 @@ SK_U16 SK_FAR *pVal) /* Pointer to Value - /* get the PHY register's value */ - XM_IN16(IoC, Port, XM_PHY_DATA, pVal); - } -+ -+ return(0); - } /* SkXmPhyRead */ - - -@@ -122,7 +125,7 @@ SK_U16 SK_FAR *pVal) /* Pointer to Value - * Returns: - * nothing - */ --void SkXmPhyWrite( -+int SkXmPhyWrite( - SK_AC *pAC, /* Adapter Context */ - SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ -@@ -133,26 +136,28 @@ SK_U16 Val) /* Value */ - SK_GEPORT *pPrt; - - pPrt = &pAC->GIni.GP[Port]; -- -+ - if (pPrt->PhyType != SK_PHY_XMAC) { - do { - XM_IN16(IoC, Port, XM_MMU_CMD, &Mmu); - /* wait until 'Busy' is cleared */ - } while ((Mmu & XM_MMU_PHY_BUSY) != 0); - } -- -+ - /* write the PHY register's address */ - XM_OUT16(IoC, Port, XM_PHY_ADDR, PhyReg | pPrt->PhyAddr); -- -+ - /* write the PHY register's value */ - XM_OUT16(IoC, Port, XM_PHY_DATA, Val); -- -+ - if (pPrt->PhyType != SK_PHY_XMAC) { - do { - XM_IN16(IoC, Port, XM_MMU_CMD, &Mmu); - /* wait until 'Busy' is cleared */ - } while ((Mmu & XM_MMU_PHY_BUSY) != 0); - } -+ -+ return(0); - } /* SkXmPhyWrite */ - #endif /* GENESIS */ - -@@ -165,63 +170,97 @@ SK_U16 Val) /* Value */ - * Description: reads a 16-bit word from GPHY through MDIO - * - * Returns: -- * nothing -+ * 0 o.k. -+ * 1 error during MDIO read -+ * 2 timeout - */ --void SkGmPhyRead( -+int SkGmPhyRead( - SK_AC *pAC, /* Adapter Context */ - SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int PhyReg, /* Register Address (Offset) */ - SK_U16 SK_FAR *pVal) /* Pointer to Value */ - { -+ SK_U16 Word; - SK_U16 Ctrl; - SK_GEPORT *pPrt; --#ifdef VCPU -- u_long SimCyle; -- u_long SimLowTime; -- -- VCPUgetTime(&SimCyle, &SimLowTime); -- VCPUprintf(0, "SkGmPhyRead(%u), SimCyle=%u, SimLowTime=%u\n", -- PhyReg, SimCyle, SimLowTime); --#endif /* VCPU */ -- -+ SK_U32 StartTime; -+ SK_U32 CurrTime; -+ SK_U32 Delta; -+ SK_U32 TimeOut; -+ int Rtv; -+ -+ Rtv = 0; -+ -+ *pVal = 0xffff; -+ - pPrt = &pAC->GIni.GP[Port]; -- -+ - /* set PHY-Register offset and 'Read' OpCode (= 1) */ -- *pVal = (SK_U16)(GM_SMI_CT_PHY_AD(pPrt->PhyAddr) | -+ Word = (SK_U16)(GM_SMI_CT_PHY_AD(pPrt->PhyAddr) | - GM_SMI_CT_REG_AD(PhyReg) | GM_SMI_CT_OP_RD); - -- GM_OUT16(IoC, Port, GM_SMI_CTRL, *pVal); -+ GM_OUT16(IoC, Port, GM_SMI_CTRL, Word); - -- GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl); -- - /* additional check for MDC/MDIO activity */ -- if ((Ctrl & GM_SMI_CT_BUSY) == 0) { -- *pVal = 0; -- return; -+ GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl); -+ -+ if (Ctrl == 0xffff || (Ctrl & GM_SMI_CT_OP_RD) == 0) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("PHY read impossible on Port %d (Ctrl=0x%04x)\n", Port, Ctrl)); -+ -+ return(1); - } - -- *pVal |= GM_SMI_CT_BUSY; -- -- do { -+ Word |= GM_SMI_CT_BUSY; -+ -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &StartTime); -+ -+ /* set timeout to 10 ms */ -+ TimeOut = HW_MS_TO_TICKS(pAC, 10); -+ -+ do { /* wait until 'Busy' is cleared and 'ReadValid' is set */ - #ifdef VCPU - VCPUwaitTime(1000); - #endif /* VCPU */ - -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime); -+ -+ if (CurrTime >= StartTime) { -+ Delta = CurrTime - StartTime; -+ } -+ else { -+ Delta = CurrTime + ~StartTime + 1; -+ } -+ -+ if (Delta > TimeOut) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("PHY read timeout on Port %d (Ctrl=0x%04x)\n", Port, Ctrl)); -+ Rtv = 2; -+ break; -+ } -+ - GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl); - -- /* wait until 'ReadValid' is set */ -- } while (Ctrl == *pVal); -- -- /* get the PHY register's value */ -+ /* Error on reading SMI Control Register */ -+ if (Ctrl == 0xffff) { -+ return(1); -+ } -+ -+ } while ((Ctrl ^ Word) != (GM_SMI_CT_RD_VAL | GM_SMI_CT_BUSY)); -+ - GM_IN16(IoC, Port, GM_SMI_DATA, pVal); - --#ifdef VCPU -- VCPUgetTime(&SimCyle, &SimLowTime); -- VCPUprintf(0, "VCPUgetTime(), SimCyle=%u, SimLowTime=%u\n", -- SimCyle, SimLowTime); --#endif /* VCPU */ -+ /* dummy read after GM_IN16() */ -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime); - -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("SkGmPhyRead Port:%d, Reg=%d, Val = 0x%04X\n", -+ Port, PhyReg, *pVal)); -+ -+ return(Rtv); - } /* SkGmPhyRead */ - - -@@ -232,9 +271,11 @@ SK_U16 SK_FAR *pVal) /* Pointer to Value - * Description: writes a 16-bit word to GPHY through MDIO - * - * Returns: -- * nothing -+ * 0 o.k. -+ * 1 error during MDIO read -+ * 2 timeout - */ --void SkGmPhyWrite( -+int SkGmPhyWrite( - SK_AC *pAC, /* Adapter Context */ - SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ -@@ -243,54 +284,78 @@ SK_U16 Val) /* Value */ - { - SK_U16 Ctrl; - SK_GEPORT *pPrt; --#ifdef VCPU -- SK_U32 DWord; -- u_long SimCyle; -- u_long SimLowTime; -- -- VCPUgetTime(&SimCyle, &SimLowTime); -- VCPUprintf(0, "SkGmPhyWrite(Reg=%u, Val=0x%04x), SimCyle=%u, SimLowTime=%u\n", -- PhyReg, Val, SimCyle, SimLowTime); --#endif /* VCPU */ -- -+ SK_U32 StartTime; -+ SK_U32 CurrTime; -+ SK_U32 Delta; -+ SK_U32 TimeOut; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("SkGmPhyWrite Port:%d, Reg=%d, Val = 0x%04X\n", -+ Port, PhyReg, Val)); -+ - pPrt = &pAC->GIni.GP[Port]; -- -+ - /* write the PHY register's value */ - GM_OUT16(IoC, Port, GM_SMI_DATA, Val); -- -- /* set PHY-Register offset and 'Write' OpCode (= 0) */ -- Val = GM_SMI_CT_PHY_AD(pPrt->PhyAddr) | GM_SMI_CT_REG_AD(PhyReg); - -- GM_OUT16(IoC, Port, GM_SMI_CTRL, Val); -- -- GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl); -- -+#ifdef DEBUG - /* additional check for MDC/MDIO activity */ -- if ((Ctrl & GM_SMI_CT_BUSY) == 0) { -- return; -+ GM_IN16(IoC, Port, GM_SMI_DATA, &Ctrl); -+ -+ if (Ctrl != Val) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("PHY write impossible on Port %d (Val=0x%04x)\n", Port, Ctrl)); -+ -+ return(1); - } -- -- Val |= GM_SMI_CT_BUSY; -+#endif /* DEBUG */ - -- do { --#ifdef VCPU -- /* read Timer value */ -- SK_IN32(IoC, B2_TI_VAL, &DWord); -+ /* set PHY-Register offset and 'Write' OpCode (= 0) */ -+ Ctrl = (SK_U16)(GM_SMI_CT_PHY_AD(pPrt->PhyAddr) | -+ GM_SMI_CT_REG_AD(PhyReg)); - -+ GM_OUT16(IoC, Port, GM_SMI_CTRL, Ctrl); -+ -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &StartTime); -+ -+ /* set timeout to 10 ms */ -+ TimeOut = HW_MS_TO_TICKS(pAC, 10); -+ -+ do { /* wait until 'Busy' is cleared */ -+#ifdef VCPU - VCPUwaitTime(1000); - #endif /* VCPU */ - -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime); -+ -+ if (CurrTime >= StartTime) { -+ Delta = CurrTime - StartTime; -+ } -+ else { -+ Delta = CurrTime + ~StartTime + 1; -+ } -+ -+ if (Delta > TimeOut) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("PHY write timeout on Port %d (Ctrl=0x%04x)\n", Port, Ctrl)); -+ return(2); -+ } -+ - GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl); - -- /* wait until 'Busy' is cleared */ -- } while (Ctrl == Val); -- --#ifdef VCPU -- VCPUgetTime(&SimCyle, &SimLowTime); -- VCPUprintf(0, "VCPUgetTime(), SimCyle=%u, SimLowTime=%u\n", -- SimCyle, SimLowTime); --#endif /* VCPU */ -+ /* Error on reading SMI Control Register */ -+ if (Ctrl == 0xffff) { -+ return(1); -+ } - -+ } while ((Ctrl & GM_SMI_CT_BUSY) != 0); -+ -+ /* dummy read after GM_IN16() */ -+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime); -+ -+ return(0); - } /* SkGmPhyWrite */ - #endif /* YUKON */ - -@@ -312,16 +377,8 @@ int Port, /* Port Index (MAC_1 + n) */ - int PhyReg, /* Register Address (Offset) */ - SK_U16 *pVal) /* Pointer to Value */ - { -- void (*r_func)(SK_AC *pAC, SK_IOC IoC, int Port, int Reg, SK_U16 *pVal); - -- if (pAC->GIni.GIGenesis) { -- r_func = SkXmPhyRead; -- } -- else { -- r_func = SkGmPhyRead; -- } -- -- r_func(pAC, IoC, Port, PhyReg, pVal); -+ pAC->GIni.GIFunc.pFnMacPhyRead(pAC, IoC, Port, PhyReg, pVal); - } /* SkGePhyRead */ - - -@@ -341,16 +398,8 @@ int Port, /* Port Index (MAC_1 + n) */ - int PhyReg, /* Register Address (Offset) */ - SK_U16 Val) /* Value */ - { -- void (*w_func)(SK_AC *pAC, SK_IOC IoC, int Port, int Reg, SK_U16 Val); - -- if (pAC->GIni.GIGenesis) { -- w_func = SkXmPhyWrite; -- } -- else { -- w_func = SkGmPhyWrite; -- } -- -- w_func(pAC, IoC, Port, PhyReg, Val); -+ pAC->GIni.GIFunc.pFnMacPhyWrite(pAC, IoC, Port, PhyReg, Val); - } /* SkGePhyWrite */ - #endif /* SK_DIAG */ - -@@ -360,15 +409,15 @@ SK_U16 Val) /* Value */ - * SkMacPromiscMode() - Enable / Disable Promiscuous Mode - * - * Description: -- * enables / disables promiscuous mode by setting Mode Register (XMAC) or -- * Receive Control Register (GMAC) dep. on board type -+ * enables / disables promiscuous mode by setting Mode Register (XMAC) or -+ * Receive Control Register (GMAC) dep. on board type - * - * Returns: - * nothing - */ - void SkMacPromiscMode( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL Enable) /* Enable / Disable */ - { -@@ -377,11 +426,11 @@ SK_BOOL Enable) /* Enable / Disable */ - #endif - #ifdef GENESIS - SK_U32 MdReg; --#endif -+#endif - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - XM_IN32(IoC, Port, XM_MODE, &MdReg); - /* enable or disable promiscuous mode */ - if (Enable) { -@@ -394,12 +443,12 @@ SK_BOOL Enable) /* Enable / Disable */ - XM_OUT32(IoC, Port, XM_MODE, MdReg); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - GM_IN16(IoC, Port, GM_RX_CTRL, &RcReg); -- -+ - /* enable or disable unicast and multicast filtering */ - if (Enable) { - RcReg &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); -@@ -420,28 +469,28 @@ SK_BOOL Enable) /* Enable / Disable */ - * SkMacHashing() - Enable / Disable Hashing - * - * Description: -- * enables / disables hashing by setting Mode Register (XMAC) or -- * Receive Control Register (GMAC) dep. on board type -+ * enables / disables hashing by setting Mode Register (XMAC) or -+ * Receive Control Register (GMAC) dep. on board type - * - * Returns: - * nothing - */ - void SkMacHashing( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL Enable) /* Enable / Disable */ - { - #ifdef YUKON - SK_U16 RcReg; --#endif -+#endif - #ifdef GENESIS - SK_U32 MdReg; - #endif - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - XM_IN32(IoC, Port, XM_MODE, &MdReg); - /* enable or disable hashing */ - if (Enable) { -@@ -454,12 +503,12 @@ SK_BOOL Enable) /* Enable / Disable */ - XM_OUT32(IoC, Port, XM_MODE, MdReg); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - GM_IN16(IoC, Port, GM_RX_CTRL, &RcReg); -- -+ - /* enable or disable multicast filtering */ - if (Enable) { - RcReg |= GM_RXCR_MCF_ENA; -@@ -487,8 +536,8 @@ SK_BOOL Enable) /* Enable / Disable */ - * - don't set XMR_FS_ERR in status SK_LENERR_OK_ON/OFF - * for inrange length error frames - * - don't set XMR_FS_ERR in status SK_BIG_PK_OK_ON/OFF -- * for frames > 1514 bytes -- * - enable Rx of own packets SK_SELF_RX_ON/OFF -+ * for frames > 1514 bytes -+ * - enable Rx of own packets SK_SELF_RX_ON/OFF - * - * for incoming packets may be enabled/disabled by this function. - * Additional modes may be added later. -@@ -499,11 +548,11 @@ SK_BOOL Enable) /* Enable / Disable */ - * nothing - */ - static void SkXmSetRxCmd( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int Mode) /* Mode is SK_STRIP_FCS_ON/OFF, SK_STRIP_PAD_ON/OFF, -- SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */ -+ SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */ - { - SK_U16 OldRxCmd; - SK_U16 RxCmd; -@@ -511,7 +560,7 @@ int Mode) /* Mode is SK_STRIP_FCS_ON/O - XM_IN16(IoC, Port, XM_RX_CMD, &OldRxCmd); - - RxCmd = OldRxCmd; -- -+ - switch (Mode & (SK_STRIP_FCS_ON | SK_STRIP_FCS_OFF)) { - case SK_STRIP_FCS_ON: - RxCmd |= XM_RX_STRIP_FCS; -@@ -572,8 +621,8 @@ int Mode) /* Mode is SK_STRIP_FCS_ON/O - * The features - * - FCS (CRC) stripping, SK_STRIP_FCS_ON/OFF - * - don't set GMR_FS_LONG_ERR SK_BIG_PK_OK_ON/OFF -- * for frames > 1514 bytes -- * - enable Rx of own packets SK_SELF_RX_ON/OFF -+ * for frames > 1514 bytes -+ * - enable Rx of own packets SK_SELF_RX_ON/OFF - * - * for incoming packets may be enabled/disabled by this function. - * Additional modes may be added later. -@@ -584,20 +633,17 @@ int Mode) /* Mode is SK_STRIP_FCS_ON/O - * nothing - */ - static void SkGmSetRxCmd( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int Mode) /* Mode is SK_STRIP_FCS_ON/OFF, SK_STRIP_PAD_ON/OFF, -- SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */ -+ SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */ - { -- SK_U16 OldRxCmd; - SK_U16 RxCmd; - - if ((Mode & (SK_STRIP_FCS_ON | SK_STRIP_FCS_OFF)) != 0) { -- -- GM_IN16(IoC, Port, GM_RX_CTRL, &OldRxCmd); - -- RxCmd = OldRxCmd; -+ GM_IN16(IoC, Port, GM_RX_CTRL, &RxCmd); - - if ((Mode & SK_STRIP_FCS_ON) != 0) { - RxCmd |= GM_RXCR_CRC_DIS; -@@ -605,17 +651,13 @@ int Mode) /* Mode is SK_STRIP_FCS_ON/O - else { - RxCmd &= ~GM_RXCR_CRC_DIS; - } -- /* Write the new mode to the Rx control register if required */ -- if (OldRxCmd != RxCmd) { -- GM_OUT16(IoC, Port, GM_RX_CTRL, RxCmd); -- } -+ /* Write the new mode to the Rx Control register */ -+ GM_OUT16(IoC, Port, GM_RX_CTRL, RxCmd); - } - - if ((Mode & (SK_BIG_PK_OK_ON | SK_BIG_PK_OK_OFF)) != 0) { -- -- GM_IN16(IoC, Port, GM_SERIAL_MODE, &OldRxCmd); - -- RxCmd = OldRxCmd; -+ GM_IN16(IoC, Port, GM_SERIAL_MODE, &RxCmd); - - if ((Mode & SK_BIG_PK_OK_ON) != 0) { - RxCmd |= GM_SMOD_JUMBO_ENA; -@@ -623,10 +665,8 @@ int Mode) /* Mode is SK_STRIP_FCS_ON/O - else { - RxCmd &= ~GM_SMOD_JUMBO_ENA; - } -- /* Write the new mode to the Rx control register if required */ -- if (OldRxCmd != RxCmd) { -- GM_OUT16(IoC, Port, GM_SERIAL_MODE, RxCmd); -- } -+ /* Write the new mode to the Serial Mode register */ -+ GM_OUT16(IoC, Port, GM_SERIAL_MODE, RxCmd); - } - } /* SkGmSetRxCmd */ - -@@ -641,17 +681,17 @@ int Mode) /* Mode is SK_STRIP_FCS_ON/O - * nothing - */ - void SkMacSetRxCmd( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int Mode) /* Rx Mode */ - { - if (pAC->GIni.GIGenesis) { -- -+ - SkXmSetRxCmd(pAC, IoC, Port, Mode); - } - else { -- -+ - SkGmSetRxCmd(pAC, IoC, Port, Mode); - } - -@@ -668,15 +708,15 @@ int Mode) /* Rx Mode */ - * nothing - */ - void SkMacCrcGener( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL Enable) /* Enable / Disable */ - { - SK_U16 Word; - - if (pAC->GIni.GIGenesis) { -- -+ - XM_IN16(IoC, Port, XM_TX_CMD, &Word); - - if (Enable) { -@@ -689,9 +729,9 @@ SK_BOOL Enable) /* Enable / Disable */ - XM_OUT16(IoC, Port, XM_TX_CMD, Word); - } - else { -- -+ - GM_IN16(IoC, Port, GM_TX_CTRL, &Word); -- -+ - if (Enable) { - Word &= ~GM_TXCR_CRC_DIS; - } -@@ -721,14 +761,14 @@ SK_BOOL Enable) /* Enable / Disable */ - * nothing - */ - void SkXmClrExactAddr( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int StartNum, /* Begin with this Address Register Index (0..15) */ - int StopNum) /* Stop after finished with this Register Idx (0..15) */ - { - int i; -- SK_U16 ZeroAddr[3] = {0x0000, 0x0000, 0x0000}; -+ SK_U16 ZeroAddr[3] = {0, 0, 0}; - - if ((unsigned)StartNum > 15 || (unsigned)StopNum > 15 || - StartNum > StopNum) { -@@ -738,7 +778,7 @@ int StopNum) /* Stop after finished wit - } - - for (i = StartNum; i <= StopNum; i++) { -- XM_OUTADDR(IoC, Port, XM_EXM(i), &ZeroAddr[0]); -+ XM_OUTADDR(IoC, Port, XM_EXM(i), ZeroAddr); - } - } /* SkXmClrExactAddr */ - #endif /* GENESIS */ -@@ -755,21 +795,21 @@ int StopNum) /* Stop after finished wit - * nothing - */ - void SkMacFlushTxFifo( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - #ifdef GENESIS - SK_U32 MdReg; - - if (pAC->GIni.GIGenesis) { -- -+ - XM_IN32(IoC, Port, XM_MODE, &MdReg); - - XM_OUT32(IoC, Port, XM_MODE, MdReg | XM_MD_FTF); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* no way to flush the FIFO we have to issue a reset */ -@@ -791,8 +831,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkMacFlushRxFifo( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - #ifdef GENESIS -@@ -805,7 +845,7 @@ int Port) /* Port Index (MAC_1 + n) */ - XM_OUT32(IoC, Port, XM_MODE, MdReg | XM_MD_FRF); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* no way to flush the FIFO we have to issue a reset */ -@@ -853,23 +893,23 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - static void SkXmSoftRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { -- SK_U16 ZeroAddr[4] = {0x0000, 0x0000, 0x0000, 0x0000}; -- -+ SK_U16 ZeroAddr[4] = {0, 0, 0, 0}; -+ - /* reset the statistics module */ - XM_OUT32(IoC, Port, XM_GP_PORT, XM_GP_RES_STAT); - - /* disable all XMAC IRQs */ - XM_OUT16(IoC, Port, XM_IMSK, 0xffff); -- -+ - XM_OUT32(IoC, Port, XM_MODE, 0); /* clear Mode Reg */ -- -+ - XM_OUT16(IoC, Port, XM_TX_CMD, 0); /* reset TX CMD Reg */ - XM_OUT16(IoC, Port, XM_RX_CMD, 0); /* reset RX CMD Reg */ -- -+ - /* disable all PHY IRQs */ - switch (pAC->GIni.GP[Port].PhyType) { - case SK_PHY_BCOM: -@@ -887,13 +927,13 @@ int Port) /* Port Index (MAC_1 + n) */ - } - - /* clear the Hash Register */ -- XM_OUTHASH(IoC, Port, XM_HSM, &ZeroAddr); -+ XM_OUTHASH(IoC, Port, XM_HSM, ZeroAddr); - - /* clear the Exact Match Address registers */ - SkXmClrExactAddr(pAC, IoC, Port, 0, 15); -- -+ - /* clear the Source Check Address registers */ -- XM_OUTHASH(IoC, Port, XM_SRC_CHK, &ZeroAddr); -+ XM_OUTHASH(IoC, Port, XM_SRC_CHK, ZeroAddr); - - } /* SkXmSoftRst */ - -@@ -916,8 +956,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - static void SkXmHardRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_U32 Reg; -@@ -940,19 +980,19 @@ int Port) /* Port Index (MAC_1 + n) */ - } - - SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_SET_MAC_RST); -- -+ - SK_IN16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), &Word); -- -+ - } while ((Word & MFF_SET_MAC_RST) == 0); - } - - /* For external PHYs there must be special handling */ - if (pAC->GIni.GP[Port].PhyType != SK_PHY_XMAC) { -- -+ - SK_IN32(IoC, B2_GP_IO, &Reg); -- -+ - if (Port == 0) { -- Reg |= GP_DIR_0; /* set to output */ -+ Reg |= GP_DIR_0; /* set to output */ - Reg &= ~GP_IO_0; /* set PHY reset (active low) */ - } - else { -@@ -978,12 +1018,12 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - static void SkXmClearRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_U32 DWord; -- -+ - /* clear HW reset */ - SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_CLR_MAC_RST); - -@@ -1000,7 +1040,7 @@ int Port) /* Port Index (MAC_1 + n) */ - /* Clear PHY reset */ - SK_OUT32(IoC, B2_GP_IO, DWord); - -- /* Enable GMII interface */ -+ /* enable GMII interface */ - XM_OUT16(IoC, Port, XM_HW_CFG, XM_HW_GMII_MD); - } - } /* SkXmClearRst */ -@@ -1020,29 +1060,28 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - static void SkGmSoftRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { -- SK_U16 EmptyHash[4] = {0x0000, 0x0000, 0x0000, 0x0000}; -- SK_U16 RxCtrl; -+ SK_U16 EmptyHash[4] = { 0x0000, 0x0000, 0x0000, 0x0000 }; -+ SK_U16 RxCtrl; - - /* reset the statistics module */ - - /* disable all GMAC IRQs */ -- SK_OUT8(IoC, GMAC_IRQ_MSK, 0); -- -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_IRQ_MSK), 0); -+ - /* disable all PHY IRQs */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, 0); -- -+ - /* clear the Hash Register */ - GM_OUTHASH(IoC, Port, GM_MC_ADDR_H1, EmptyHash); - -- /* Enable Unicast and Multicast filtering */ -+ /* enable Unicast and Multicast filtering */ - GM_IN16(IoC, Port, GM_RX_CTRL, &RxCtrl); -- -- GM_OUT16(IoC, Port, GM_RX_CTRL, -- (SK_U16)(RxCtrl | GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA)); -+ -+ GM_OUT16(IoC, Port, GM_RX_CTRL, RxCtrl | GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); - - } /* SkGmSoftRst */ - -@@ -1057,16 +1096,16 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - static void SkGmHardRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_U32 DWord; -- -+ - /* WA code for COMA mode */ - if (pAC->GIni.GIYukonLite && -- pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) { -- -+ pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) { -+ - SK_IN32(IoC, B2_GP_IO, &DWord); - - DWord |= (GP_DIR_9 | GP_IO_9); -@@ -1076,10 +1115,10 @@ int Port) /* Port Index (MAC_1 + n) */ - } - - /* set GPHY Control reset */ -- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), GPC_RST_SET); -+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_SET); - - /* set GMAC Control reset */ -- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET); -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_SET); - - } /* SkGmHardRst */ - -@@ -1094,24 +1133,29 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - static void SkGmClearRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_U32 DWord; -- -+#ifndef SK_SLIM -+ SK_U16 PhyId0; -+ SK_U16 PhyId1; -+ SK_U16 Word; -+#endif -+ - #ifdef XXX -- /* clear GMAC Control reset */ -- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_CLR); -+ /* clear GMAC Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR); - -- /* set GMAC Control reset */ -- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET); -+ /* set GMAC Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_SET); - #endif /* XXX */ - - /* WA code for COMA mode */ - if (pAC->GIni.GIYukonLite && -- pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) { -- -+ pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) { -+ - SK_IN32(IoC, B2_GP_IO, &DWord); - - DWord |= GP_DIR_9; /* set to output */ -@@ -1121,30 +1165,87 @@ int Port) /* Port Index (MAC_1 + n) */ - SK_OUT32(IoC, B2_GP_IO, DWord); - } - -- /* set HWCFG_MODE */ -- DWord = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP | -- GPC_ENA_XC | GPC_ANEG_ADV_ALL_M | GPC_ENA_PAUSE | -- (pAC->GIni.GICopperType ? GPC_HWCFG_GMII_COP : -- GPC_HWCFG_GMII_FIB); -+#ifdef VCPU -+ /* set MAC Reset before PHY reset is set */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_SET); -+#endif /* VCPU */ -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ /* set GPHY Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_SET); - -- /* set GPHY Control reset */ -- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_SET); -+ /* release GPHY Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_CLR); - -- /* release GPHY Control reset */ -- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_CLR); -+#ifdef DEBUG -+ /* additional check for PEX */ -+ SK_IN16(IoC, GPHY_CTRL, &Word); -+ -+ if (pAC->GIni.GIPciBus == SK_PEX_BUS && Word != GPC_RST_CLR) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("Error on PEX-bus after GPHY reset\n")); -+ } -+#endif /* DEBUG */ -+ } -+ else { -+ /* set HWCFG_MODE */ -+ DWord = GPC_INT_POL | GPC_DIS_FC | GPC_DIS_SLEEP | -+ GPC_ENA_XC | GPC_ANEG_ADV_ALL_M | GPC_ENA_PAUSE | -+ (pAC->GIni.GICopperType ? GPC_HWCFG_GMII_COP : -+ GPC_HWCFG_GMII_FIB); -+ -+ /* set GPHY Control reset */ -+ SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_SET); -+ -+ /* release GPHY Control reset */ -+ SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_CLR); -+ } - - #ifdef VCPU -+ /* wait for internal initialization of GPHY */ -+ VCPUprintf(0, "Waiting until PHY %d is ready to initialize\n", Port); -+ VCpuWait(10000); -+ -+ /* release GMAC reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR); -+ -+ /* wait for stable GMAC clock */ - VCpuWait(9000); - #endif /* VCPU */ - - /* clear GMAC Control reset */ -- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_ON | GMC_RST_CLR); -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR); -+ -+#ifdef SK_DIAG -+ if (HW_FEATURE(pAC, HWF_WA_DEV_472) && Port == MAC_2) { -+ -+ /* clear GMAC 1 Control reset */ -+ SK_OUT8(IoC, MR_ADDR(MAC_1, GMAC_CTRL), (SK_U8)GMC_RST_CLR); -+ -+ do { -+ /* set GMAC 2 Control reset */ -+ SK_OUT8(IoC, MR_ADDR(MAC_2, GMAC_CTRL), (SK_U8)GMC_RST_SET); -+ -+ /* clear GMAC 2 Control reset */ -+ SK_OUT8(IoC, MR_ADDR(MAC_2, GMAC_CTRL), (SK_U8)GMC_RST_CLR); -+ -+ SkGmPhyRead(pAC, IoC, MAC_2, PHY_MARV_ID0, &PhyId0); -+ -+ SkGmPhyRead(pAC, IoC, MAC_2, PHY_MARV_ID1, &PhyId1); -+ -+ SkGmPhyRead(pAC, IoC, MAC_2, PHY_MARV_INT_MASK, &Word); -+ -+ } while (Word != 0 || PhyId0 != PHY_MARV_ID0_VAL || -+ PhyId1 != PHY_MARV_ID1_Y2); -+ } -+#endif /* SK_DIAG */ - - #ifdef VCPU - VCpuWait(2000); -- -+ - SK_IN32(IoC, MR_ADDR(Port, GPHY_CTRL), &DWord); -- -+ - SK_IN32(IoC, B0_ISRC, &DWord); - #endif /* VCPU */ - -@@ -1162,37 +1263,33 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkMacSoftRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { -- SK_GEPORT *pPrt; -- -- pPrt = &pAC->GIni.GP[Port]; -- - /* disable receiver and transmitter */ - SkMacRxTxDisable(pAC, IoC, Port); - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - SkXmSoftRst(pAC, IoC, Port); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - SkGmSoftRst(pAC, IoC, Port); - } - #endif /* YUKON */ - - /* flush the MAC's Rx and Tx FIFOs */ - SkMacFlushTxFifo(pAC, IoC, Port); -- -+ - SkMacFlushRxFifo(pAC, IoC, Port); - -- pPrt->PState = SK_PRT_STOP; -+ pAC->GIni.GP[Port].PState = SK_PRT_STOP; - - } /* SkMacSoftRst */ - -@@ -1207,30 +1304,32 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkMacHardRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { -- -+ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - SkXmHardRst(pAC, IoC, Port); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - SkGmHardRst(pAC, IoC, Port); - } - #endif /* YUKON */ - -+ pAC->GIni.GP[Port].PHWLinkUp = SK_FALSE; -+ - pAC->GIni.GP[Port].PState = SK_PRT_RESET; - - } /* SkMacHardRst */ - -- -+#ifndef SK_SLIM - /****************************************************************************** - * - * SkMacClearRst() - Clear the MAC reset -@@ -1241,27 +1340,27 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkMacClearRst( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { -- -+ - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - SkXmClearRst(pAC, IoC, Port); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - SkGmClearRst(pAC, IoC, Port); - } - #endif /* YUKON */ - - } /* SkMacClearRst */ -- -+#endif /* !SK_SLIM */ - - #ifdef GENESIS - /****************************************************************************** -@@ -1279,8 +1378,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkXmInitMac( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -1290,13 +1389,13 @@ int Port) /* Port Index (MAC_1 + n) */ - pPrt = &pAC->GIni.GP[Port]; - - if (pPrt->PState == SK_PRT_STOP) { -- /* Port State: SK_PRT_STOP */ - /* Verify that the reset bit is cleared */ - SK_IN16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), &SWord); - - if ((SWord & MFF_SET_MAC_RST) != 0) { - /* PState does not match HW state */ -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E006, SKERR_HWI_E006MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("SkXmInitMac: PState does not match HW state")); - /* Correct it */ - pPrt->PState = SK_PRT_RESET; - } -@@ -1315,7 +1414,7 @@ int Port) /* Port Index (MAC_1 + n) */ - * Must be done AFTER first access to BCOM chip. - */ - XM_IN16(IoC, Port, XM_MMU_CMD, &SWord); -- -+ - XM_OUT16(IoC, Port, XM_MMU_CMD, SWord | XM_MMU_NO_PRE); - - if (pPrt->PhyId1 == PHY_BCOM_ID1_C0) { -@@ -1348,7 +1447,7 @@ int Port) /* Port Index (MAC_1 + n) */ - * Disable Power Management after reset. - */ - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &SWord); -- -+ - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, - (SK_U16)(SWord | PHY_B_AC_DIS_PM)); - -@@ -1357,7 +1456,7 @@ int Port) /* Port Index (MAC_1 + n) */ - - /* Dummy read the Interrupt source register */ - XM_IN16(IoC, Port, XM_ISRC, &SWord); -- -+ - /* - * The auto-negotiation process starts immediately after - * clearing the reset. The auto-negotiation process should be -@@ -1383,7 +1482,7 @@ int Port) /* Port Index (MAC_1 + n) */ - * independent. Remember this when changing. - */ - SK_IN16(IoC, (B2_MAC_2 + Port * 8 + i * 2), &SWord); -- -+ - XM_OUT16(IoC, Port, (XM_SA + i * 2), SWord); - } - -@@ -1401,7 +1500,7 @@ int Port) /* Port Index (MAC_1 + n) */ - SWord = SK_XM_THR_SL; /* for single port */ - - if (pAC->GIni.GIMacsFound > 1) { -- switch (pAC->GIni.GIPortUsage) { -+ switch (pPrt->PPortUsage) { - case SK_RED_LINK: - SWord = SK_XM_THR_REDL; /* redundant link */ - break; -@@ -1424,7 +1523,7 @@ int Port) /* Port Index (MAC_1 + n) */ - /* setup register defaults for the Rx Command Register */ - SWord = XM_RX_STRIP_FCS | XM_RX_LENERR_OK; - -- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) { -+ if (pPrt->PPortUsage == SK_JUMBO_LINK) { - SWord |= XM_RX_BIG_PK_OK; - } - -@@ -1436,7 +1535,7 @@ int Port) /* Port Index (MAC_1 + n) */ - */ - SWord |= XM_RX_DIS_CEXT; - } -- -+ - XM_OUT16(IoC, Port, XM_RX_CMD, SWord); - - /* -@@ -1493,8 +1592,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkGmInitMac( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -1505,24 +1604,29 @@ int Port) /* Port Index (MAC_1 + n) */ - pPrt = &pAC->GIni.GP[Port]; - - if (pPrt->PState == SK_PRT_STOP) { -- /* Port State: SK_PRT_STOP */ - /* Verify that the reset bit is cleared */ - SK_IN32(IoC, MR_ADDR(Port, GMAC_CTRL), &DWord); -- -+ - if ((DWord & GMC_RST_SET) != 0) { - /* PState does not match HW state */ -- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E006, SKERR_HWI_E006MSG); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("SkGmInitMac: PState does not match HW state")); - /* Correct it */ - pPrt->PState = SK_PRT_RESET; - } -+ else { -+ /* enable PHY interrupts */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, -+ (SK_U16)PHY_M_DEF_MSK); -+ } - } - - if (pPrt->PState == SK_PRT_RESET) { -- -+ - SkGmHardRst(pAC, IoC, Port); - - SkGmClearRst(pAC, IoC, Port); -- -+ - /* Auto-negotiation ? */ - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - /* Auto-negotiation disabled */ -@@ -1532,10 +1636,10 @@ int Port) /* Port Index (MAC_1 + n) */ - - /* disable auto-update for speed, duplex and flow-control */ - SWord |= GM_GPCR_AU_ALL_DIS; -- -+ - /* setup General Purpose Control Register */ - GM_OUT16(IoC, Port, GM_GP_CTRL, SWord); -- -+ - SWord = GM_GPCR_AU_ALL_DIS; - } - else { -@@ -1546,7 +1650,10 @@ int Port) /* Port Index (MAC_1 + n) */ - switch (pPrt->PLinkSpeed) { - case SK_LSPEED_AUTO: - case SK_LSPEED_1000MBPS: -- SWord |= GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100; -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) { -+ -+ SWord |= GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100; -+ } - break; - case SK_LSPEED_100MBPS: - SWord |= GM_GPCR_SPEED_100; -@@ -1564,8 +1671,6 @@ int Port) /* Port Index (MAC_1 + n) */ - /* flow-control settings */ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: -- /* set Pause Off */ -- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_OFF); - /* disable Tx & Rx flow-control */ - SWord |= GM_GPCR_FC_TX_DIS | GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS; - break; -@@ -1583,24 +1688,22 @@ int Port) /* Port Index (MAC_1 + n) */ - GM_OUT16(IoC, Port, GM_GP_CTRL, SWord); - - /* dummy read the Interrupt Source Register */ -- SK_IN16(IoC, GMAC_IRQ_SRC, &SWord); -- -+ SK_IN16(IoC, MR_ADDR(Port, GMAC_IRQ_SRC), &SWord); -+ - #ifndef VCPU -- /* read Id from PHY */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_ID1, &pPrt->PhyId1); -- - SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE); --#endif /* VCPU */ -+#endif /* !VCPU */ - } - - (void)SkGmResetCounter(pAC, IoC, Port); - - /* setup Transmit Control Register */ -- GM_OUT16(IoC, Port, GM_TX_CTRL, TX_COL_THR(pPrt->PMacColThres)); -+ GM_OUT16(IoC, Port, GM_TX_CTRL, (SK_U16)TX_COL_THR(pPrt->PMacColThres)); - - /* setup Receive Control Register */ -- GM_OUT16(IoC, Port, GM_RX_CTRL, GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA | -- GM_RXCR_CRC_DIS); -+ SWord = GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA | GM_RXCR_CRC_DIS; -+ -+ GM_OUT16(IoC, Port, GM_RX_CTRL, SWord); - - /* setup Transmit Flow Control Register */ - GM_OUT16(IoC, Port, GM_TX_FLOW_CTRL, 0xffff); -@@ -1610,31 +1713,29 @@ int Port) /* Port Index (MAC_1 + n) */ - GM_IN16(IoC, Port, GM_TX_PARAM, &SWord); - #endif /* VCPU */ - -- SWord = TX_JAM_LEN_VAL(pPrt->PMacJamLen) | -- TX_JAM_IPG_VAL(pPrt->PMacJamIpgVal) | -- TX_IPG_JAM_DATA(pPrt->PMacJamIpgData); -- -+ SWord = (SK_U16)(TX_JAM_LEN_VAL(pPrt->PMacJamLen) | -+ TX_JAM_IPG_VAL(pPrt->PMacJamIpgVal) | -+ TX_IPG_JAM_DATA(pPrt->PMacJamIpgData) | -+ TX_BACK_OFF_LIM(pPrt->PMacBackOffLim)); -+ - GM_OUT16(IoC, Port, GM_TX_PARAM, SWord); - - /* configure the Serial Mode Register */ --#ifdef VCPU -- GM_IN16(IoC, Port, GM_SERIAL_MODE, &SWord); --#endif /* VCPU */ -- -- SWord = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(pPrt->PMacIpgData); -+ SWord = (SK_U16)(DATA_BLIND_VAL(pPrt->PMacDataBlind) | -+ GM_SMOD_VLAN_ENA | IPG_DATA_VAL(pPrt->PMacIpgData)); - - if (pPrt->PMacLimit4) { - /* reset of collision counter after 4 consecutive collisions */ - SWord |= GM_SMOD_LIMIT_4; - } - -- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) { -+ if (pPrt->PPortUsage == SK_JUMBO_LINK) { - /* enable jumbo mode (Max. Frame Length = 9018) */ - SWord |= GM_SMOD_JUMBO_ENA; - } -- -+ - GM_OUT16(IoC, Port, GM_SERIAL_MODE, SWord); -- -+ - /* - * configure the GMACs Station Addresses - * in PROM you can find our addresses at: -@@ -1663,17 +1764,17 @@ int Port) /* Port Index (MAC_1 + n) */ - else { - GM_OUT16(IoC, Port, (GM_SRC_ADDR_1L + i * 4), SWord); - } --#else -+#else - GM_OUT16(IoC, Port, (GM_SRC_ADDR_1L + i * 4), SWord); - #endif /* WA_DEV_16 */ -- -+ - /* virtual address: will be used for data */ - SK_IN16(IoC, (B2_MAC_1 + Port * 8 + i * 2), &SWord); - - GM_OUT16(IoC, Port, (GM_SRC_ADDR_2L + i * 4), SWord); -- -+ - /* reset Multicast filtering Hash registers 1-3 */ -- GM_OUT16(IoC, Port, GM_MC_ADDR_H1 + 4*i, 0); -+ GM_OUT16(IoC, Port, GM_MC_ADDR_H1 + i * 4, 0); - } - - /* reset Multicast filtering Hash register 4 */ -@@ -1684,18 +1785,6 @@ int Port) /* Port Index (MAC_1 + n) */ - GM_OUT16(IoC, Port, GM_RX_IRQ_MSK, 0); - GM_OUT16(IoC, Port, GM_TR_IRQ_MSK, 0); - --#if defined(SK_DIAG) || defined(DEBUG) -- /* read General Purpose Status */ -- GM_IN16(IoC, Port, GM_GP_STAT, &SWord); -- -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("MAC Stat Reg.=0x%04X\n", SWord)); --#endif /* SK_DIAG || DEBUG */ -- --#ifdef SK_DIAG -- c_print("MAC Stat Reg=0x%04X\n", SWord); --#endif /* SK_DIAG */ -- - } /* SkGmInitMac */ - #endif /* YUKON */ - -@@ -1714,8 +1803,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkXmInitDupMd( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - switch (pAC->GIni.GP[Port].PLinkModeStatus) { -@@ -1762,8 +1851,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkXmInitPauseMd( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -1773,11 +1862,11 @@ int Port) /* Port Index (MAC_1 + n) */ - pPrt = &pAC->GIni.GP[Port]; - - XM_IN16(IoC, Port, XM_MMU_CMD, &Word); -- -+ - if (pPrt->PFlowCtrlStatus == SK_FLOW_STAT_NONE || - pPrt->PFlowCtrlStatus == SK_FLOW_STAT_LOC_SEND) { - -- /* Disable Pause Frame Reception */ -+ /* disable Pause Frame Reception */ - Word |= XM_MMU_IGN_PF; - } - else { -@@ -1785,10 +1874,10 @@ int Port) /* Port Index (MAC_1 + n) */ - * enabling pause frame reception is required for 1000BT - * because the XMAC is not reset if the link is going down - */ -- /* Enable Pause Frame Reception */ -+ /* enable Pause Frame Reception */ - Word &= ~XM_MMU_IGN_PF; -- } -- -+ } -+ - XM_OUT16(IoC, Port, XM_MMU_CMD, Word); - - XM_IN32(IoC, Port, XM_MODE, &DWord); -@@ -1811,10 +1900,10 @@ int Port) /* Port Index (MAC_1 + n) */ - /* remember this value is defined in big endian (!) */ - XM_OUT16(IoC, Port, XM_MAC_PTIME, 0xffff); - -- /* Set Pause Mode in Mode Register */ -+ /* set Pause Mode in Mode Register */ - DWord |= XM_PAUSE_MODE; - -- /* Set Pause Mode in MAC Rx FIFO */ -+ /* set Pause Mode in MAC Rx FIFO */ - SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_ENA_PAUSE); - } - else { -@@ -1822,13 +1911,13 @@ int Port) /* Port Index (MAC_1 + n) */ - * disable pause frame generation is required for 1000BT - * because the XMAC is not reset if the link is going down - */ -- /* Disable Pause Mode in Mode Register */ -+ /* disable Pause Mode in Mode Register */ - DWord &= ~XM_PAUSE_MODE; - -- /* Disable Pause Mode in MAC Rx FIFO */ -+ /* disable Pause Mode in MAC Rx FIFO */ - SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_DIS_PAUSE); - } -- -+ - XM_OUT32(IoC, Port, XM_MODE, DWord); - } /* SkXmInitPauseMd*/ - -@@ -1845,8 +1934,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - static void SkXmInitPhyXmac( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */ - { -@@ -1855,12 +1944,12 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - - pPrt = &pAC->GIni.GP[Port]; - Ctrl = 0; -- -+ - /* Auto-negotiation ? */ - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyXmac: no auto-negotiation Port %d\n", Port)); -- /* Set DuplexMode in Config register */ -+ /* set DuplexMode in Config register */ - if (pPrt->PLinkMode == SK_LMODE_FULL) { - Ctrl |= PHY_CT_DUP_MD; - } -@@ -1873,9 +1962,9 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - else { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyXmac: with auto-negotiation Port %d\n", Port)); -- /* Set Auto-negotiation advertisement */ -+ /* set Auto-negotiation advertisement */ - -- /* Set Full/half duplex capabilities */ -+ /* set Full/half duplex capabilities */ - switch (pPrt->PLinkMode) { - case SK_LMODE_AUTOHALF: - Ctrl |= PHY_X_AN_HD; -@@ -1891,7 +1980,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - SKERR_HWI_E015MSG); - } - -- /* Set Flow-control capabilities */ -+ /* set Flow-control capabilities */ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: - Ctrl |= PHY_X_P_NO_PAUSE; -@@ -1918,7 +2007,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - } - - if (DoLoop) { -- /* Set the Phy Loopback bit, too */ -+ /* set the Phy Loopback bit, too */ - Ctrl |= PHY_CT_LOOP; - } - -@@ -1939,8 +2028,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - * nothing - */ - static void SkXmInitPhyBcom( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */ - { -@@ -1962,7 +2051,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - /* manually Master/Slave ? */ - if (pPrt->PMSMode != SK_MS_MODE_AUTO) { - Ctrl2 |= PHY_B_1000C_MSE; -- -+ - if (pPrt->PMSMode == SK_MS_MODE_MASTER) { - Ctrl2 |= PHY_B_1000C_MSC; - } -@@ -1971,7 +2060,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyBcom: no auto-negotiation Port %d\n", Port)); -- /* Set DuplexMode in Config register */ -+ /* set DuplexMode in Config register */ - if (pPrt->PLinkMode == SK_LMODE_FULL) { - Ctrl1 |= PHY_CT_DUP_MD; - } -@@ -1989,7 +2078,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - else { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyBcom: with auto-negotiation Port %d\n", Port)); -- /* Set Auto-negotiation advertisement */ -+ /* set Auto-negotiation advertisement */ - - /* - * Workaround BCOM Errata #1 for the C5 type. -@@ -1997,8 +2086,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - * Set Repeater/DTE bit 10 of the 1000Base-T Control Register - */ - Ctrl2 |= PHY_B_1000C_RD; -- -- /* Set Full/half duplex capabilities */ -+ -+ /* set Full/half duplex capabilities */ - switch (pPrt->PLinkMode) { - case SK_LMODE_AUTOHALF: - Ctrl2 |= PHY_B_1000C_AHD; -@@ -2014,7 +2103,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - SKERR_HWI_E015MSG); - } - -- /* Set Flow-control capabilities */ -+ /* set Flow-control capabilities */ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: - Ctrl3 |= PHY_B_P_NO_PAUSE; -@@ -2036,27 +2125,27 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - /* Restart Auto-negotiation */ - Ctrl1 |= PHY_CT_ANE | PHY_CT_RE_CFG; - } -- -+ - /* Initialize LED register here? */ - /* No. Please do it in SkDgXmitLed() (if required) and swap -- init order of LEDs and XMAC. (MAl) */ -- -+ init order of LEDs and XMAC. (MAl) */ -+ - /* Write 1000Base-T Control Register */ - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, Ctrl2); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Set 1000B-T Ctrl Reg=0x%04X\n", Ctrl2)); -- -+ ("Set 1000B-T Ctrl Reg = 0x%04X\n", Ctrl2)); -+ - /* Write AutoNeg Advertisement Register */ - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, Ctrl3); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Set Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3)); -- -+ ("Set Auto-Neg.Adv.Reg = 0x%04X\n", Ctrl3)); -+ - if (DoLoop) { -- /* Set the Phy Loopback bit, too */ -+ /* set the Phy Loopback bit, too */ - Ctrl1 |= PHY_CT_LOOP; - } - -- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) { -+ if (pPrt->PPortUsage == SK_JUMBO_LINK) { - /* configure FIFO to high latency for transmission of ext. packets */ - Ctrl4 |= PHY_B_PEC_HIGH_LA; - -@@ -2068,45 +2157,41 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - - /* Configure LED Traffic Mode and Jumbo Frame usage if specified */ - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_P_EXT_CTRL, Ctrl4); -- -+ - /* Write to the Phy control register */ - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_CTRL, Ctrl1); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("PHY Control Reg=0x%04X\n", Ctrl1)); -+ ("PHY Control Reg = 0x%04X\n", Ctrl1)); - } /* SkXmInitPhyBcom */ - #endif /* GENESIS */ - - - #ifdef YUKON --#ifndef SK_SLIM -+#ifdef SK_PHY_LP_MODE - /****************************************************************************** - * - * SkGmEnterLowPowerMode() - * -- * Description: -+ * Description: - * This function sets the Marvell Alaska PHY to the low power mode - * given by parameter mode. - * The following low power modes are available: -- * -- * - Coma Mode (Deep Sleep): -- * Power consumption: ~15 - 30 mW -+ * -+ * - COMA Mode (Deep Sleep): - * The PHY cannot wake up on its own. - * - * - IEEE 22.2.4.1.5 compatible power down mode -- * Power consumption: ~240 mW - * The PHY cannot wake up on its own. - * - * - energy detect mode -- * Power consumption: ~160 mW - * The PHY can wake up on its own by detecting activity - * on the CAT 5 cable. - * - * - energy detect plus mode -- * Power consumption: ~150 mW - * The PHY can wake up on its own by detecting activity - * on the CAT 5 cable. - * Connected devices can be woken up by sending normal link -- * pulses every one second. -+ * pulses every second. - * - * Note: - * -@@ -2115,113 +2200,298 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - * 1: error - */ - int SkGmEnterLowPowerMode( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (e.g. MAC_1) */ - SK_U8 Mode) /* low power mode */ - { -+ SK_U8 LastMode; -+ SK_U8 Byte; - SK_U16 Word; -+ SK_U16 ClkDiv; - SK_U32 DWord; -- SK_U8 LastMode; -+ SK_U32 PowerDownBit; -+ int ChipId; - int Ret = 0; - -- if (pAC->GIni.GIYukonLite && -- pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) { -+ if (!(CHIP_ID_YUKON_2(pAC) || (pAC->GIni.GIYukonLite && -+ pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3))) { - -- /* save current power mode */ -- LastMode = pAC->GIni.GP[Port].PPhyPowerState; -- pAC->GIni.GP[Port].PPhyPowerState = Mode; -- -- switch (Mode) { -- /* coma mode (deep sleep) */ -- case PHY_PM_DEEP_SLEEP: -- /* setup General Purpose Control Register */ -- GM_OUT16(IoC, 0, GM_GP_CTRL, GM_GPCR_FL_PASS | -- GM_GPCR_SPEED_100 | GM_GPCR_AU_ALL_DIS); -- -- /* apply COMA mode workaround */ -- SkGmPhyWrite(pAC, IoC, Port, 29, 0x001f); -- SkGmPhyWrite(pAC, IoC, Port, 30, 0xfff3); -- -- SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord); -- -- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -- -- /* Set PHY to Coma Mode */ -- SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord | PCI_PHY_COMA); -- -- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -- -- break; -- -- /* IEEE 22.2.4.1.5 compatible power down mode */ -- case PHY_PM_IEEE_POWER_DOWN: -- /* -- * - disable MAC 125 MHz clock -- * - allow MAC power down -- */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -- Word |= PHY_M_PC_DIS_125CLK; -- Word &= ~PHY_M_PC_MAC_POW_UP; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ return(1); -+ } - -- /* -- * register changes must be followed by a software -- * reset to take effect -- */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -- Word |= PHY_CT_RESET; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -- -- /* switch IEEE compatible power down mode on */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -- Word |= PHY_CT_PDOWN; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -- break; -+ /* save current power mode */ -+ LastMode = pAC->GIni.GP[Port].PPhyPowerState; -+ pAC->GIni.GP[Port].PPhyPowerState = Mode; - -- /* energy detect and energy detect plus mode */ -- case PHY_PM_ENERGY_DETECT: -- case PHY_PM_ENERGY_DETECT_PLUS: -- /* -- * - disable MAC 125 MHz clock -- */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -- Word |= PHY_M_PC_DIS_125CLK; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -- -- /* activate energy detect mode 1 */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -- -- /* energy detect mode */ -- if (Mode == PHY_PM_ENERGY_DETECT) { -- Word |= PHY_M_PC_EN_DET; -+ ChipId = pAC->GIni.GIChipId; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_POWM, SK_DBGCAT_CTRL, -+ ("SkGmEnterLowPowerMode: %u\n", Mode)); -+ -+ /* release GPHY Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_CLR); -+ -+ /* release GMAC reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR); -+ -+ if (ChipId == CHIP_ID_YUKON_EC_U) { -+ /* select page 2 to access MAC control register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 2); -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -+ /* allow GMII Power Down */ -+ Word &= ~PHY_M_MAC_GMIF_PUP; -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0); -+ } -+ -+ switch (Mode) { -+ /* COMA mode (deep sleep) */ -+ case PHY_PM_DEEP_SLEEP: -+ /* setup General Purpose Control Register */ -+ GM_OUT16(IoC, Port, GM_GP_CTRL, GM_GPCR_FL_PASS | -+ GM_GPCR_SPEED_100 | GM_GPCR_AU_ALL_DIS); -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ /* set power down bit */ -+ PowerDownBit = (Port == MAC_1) ? PCI_Y2_PHY1_POWD : -+ PCI_Y2_PHY2_POWD; -+ -+ if (ChipId != CHIP_ID_YUKON_EC) { -+ -+ if (ChipId == CHIP_ID_YUKON_EC_U) { -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -+ /* enable Power Down */ -+ Word |= PHY_M_PC_POW_D_ENA; -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ } -+ -+ /* set IEEE compatible Power Down Mode (dev. #4.99) */ -+ Ret = SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PHY_CT_PDOWN); -+ } -+ } -+ else { -+ /* apply COMA mode workaround */ -+ (void)SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_ADDR, 0x001f); -+ -+ Ret = SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xfff3); -+ -+ PowerDownBit = PCI_PHY_COMA; -+ } -+ -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -+ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &DWord); -+ -+ /* set PHY to PowerDown/COMA Mode */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), DWord | PowerDownBit); -+ -+ /* check if this routine was called from a for() loop */ -+ if (pAC->GIni.GIMacsFound == 1 || Port == MAC_2) { -+ -+ /* ASF system clock stopped */ -+ SK_OUT8(IoC, B28_Y2_ASF_STAT_CMD, (SK_U8)Y2_ASF_CLK_HALT); -+ -+ if (ChipId == CHIP_ID_YUKON_EC_U) { -+ /* set GPHY Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_SET); -+ -+ /* additional power saving measurements */ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord); -+ -+ /* set gating core clock for LTSSM in L1 state */ -+ DWord |= (P_PEX_LTSSM_STAT(P_PEX_LTSSM_L1_STAT) | -+ /* auto clock gated scheme controlled by CLKREQ */ -+ P_ASPM_A1_MODE_SELECT | -+ /* enable Gate Root Core Clock */ -+ P_CLK_GATE_ROOT_COR_ENA); -+ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_4200)) { -+ /* Enable Clock Power Management (CLKREQ) */ -+ SK_IN16(IoC, PCI_C(pAC, PEX_LNK_CTRL), &Word); -+ Word |= PEX_LC_CLK_PM_ENA; -+ SK_OUT16(IoC, PCI_C(pAC, PEX_LNK_CTRL), Word); - } -- /* energy detect plus mode */ - else { -- Word |= PHY_M_PC_EN_DET_PLUS; -+ /* Force CLKREQ Enable in Our4 (A1b only) */ -+ DWord |= P_ASPM_FORCE_CLKREQ_ENA; - } - -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord); - -- /* -- * reinitialize the PHY to force a software reset -- * which is necessary after the register settings -- * for the energy detect modes. -- * Furthermore reinitialisation prevents that the -- * PHY is running out of a stable state. -- */ -- SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE); -- break; -+ /* set Mask Register for Release/Gate Clock */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5), -+ P_REL_PCIE_EXIT_L1_ST | P_GAT_PCIE_ENTER_L1_ST | -+ P_REL_PCIE_RX_EX_IDLE | P_GAT_PCIE_RX_EL_IDLE | -+ P_REL_GPHY_LINK_UP | P_GAT_GPHY_LINK_DOWN); -+ } - -- /* don't change current power mode */ -- default: -- pAC->GIni.GP[Port].PPhyPowerState = LastMode; -- Ret = 1; -- break; -+ if (HW_FEATURE(pAC, HWF_RED_CORE_CLK_SUP)) { -+ /* divide clock by 4 only for Yukon-EC */ -+ ClkDiv = (ChipId == CHIP_ID_YUKON_EC) ? 1 : 0; -+ -+ /* on Yukon-2 clock select value is 31 */ -+ DWord = (ChipId == CHIP_ID_YUKON_XL) ? -+ (Y2_CLK_DIV_VAL_2(0) | Y2_CLK_SEL_VAL_2(31)) : -+ Y2_CLK_DIV_VAL(ClkDiv); -+ -+ /* check for Yukon-2 dual port PCI-Express adapter */ -+ if (!(pAC->GIni.GIMacsFound == 2 && -+ pAC->GIni.GIPciBus == SK_PEX_BUS)) { -+ /* enable Core Clock Division */ -+ DWord |= Y2_CLK_DIV_ENA; -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Set Core Clock: 0x%08X\n", DWord)); -+ -+ /* reduce Core Clock Frequency */ -+ SK_OUT32(IoC, B2_Y2_CLK_CTRL, DWord); -+ } -+ -+ if (HW_FEATURE(pAC, HWF_CLK_GATING_ENABLE)) { -+ /* check for Yukon-2 Rev. A2 */ -+ if (ChipId == CHIP_ID_YUKON_XL && -+ pAC->GIni.GIChipRev > CHIP_REV_YU_XL_A1) { -+ /* enable bits are inverted */ -+ Byte = 0; -+ } -+ else { -+ Byte = (SK_U8)(Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS | -+ Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS | -+ Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS); -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Set Clock Gating: 0x%02X\n", Byte)); -+ -+ /* disable MAC/PHY, PCI and Core Clock for both Links */ -+ SK_OUT8(IoC, B2_Y2_CLK_GATE, Byte); -+ } -+ -+ if (pAC->GIni.GIVauxAvail) { -+ /* switch power to VAUX */ -+ SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA | -+ PC_VAUX_ON | PC_VCC_OFF)); -+ } -+#ifdef DEBUG -+ SK_IN32(IoC, B0_CTST, &DWord); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Ctrl/Stat & Switch: 0x%08x\n", DWord)); -+#endif /* DEBUG */ -+ -+ if (pAC->GIni.GILevel != SK_INIT_IO && -+ pAC->GIni.GIMacsFound == 1 && -+ pAC->GIni.GIPciBus == SK_PEX_BUS) { -+ -+ if (ChipId == CHIP_ID_YUKON_EC_U) { -+ -+#ifdef PCI_E_L1_STATE -+ SK_IN16(IoC, PCI_C(pAC, PCI_OUR_REG_1), &Word); -+ /* force to PCIe L1 */ -+ Word |= (SK_U16)PCI_FORCE_PEX_L1; -+ SK_OUT16(IoC, PCI_C(pAC, PCI_OUR_REG_1), Word); -+#endif /* PCI_E_L1_STATE */ -+ } -+ else { -+ /* switch to D1 state */ -+ SK_OUT8(IoC, PCI_C(pAC, PCI_PM_CTL_STS), PCI_PM_STATE_D1); -+ } -+ } - } -- } -- /* low power modes are not supported by this chip */ -- else { -+ -+ break; -+ -+ /* IEEE 22.2.4.1.5 compatible power down mode */ -+ case PHY_PM_IEEE_POWER_DOWN: -+ -+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -+ -+ Word |= PHY_M_PC_POL_R_DIS; -+ -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ /* disable MAC 125 MHz clock */ -+ Word |= PHY_M_PC_DIS_125CLK; -+ Word &= ~PHY_M_PC_MAC_POW_UP; -+ } -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ -+ /* these register changes must be followed by a software reset */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word | PHY_CT_RESET); -+ -+ /* switch IEEE compatible power down mode on */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word | PHY_CT_PDOWN); -+ -+ break; -+ -+ /* energy detect and energy detect plus mode */ -+ case PHY_PM_ENERGY_DETECT: -+ case PHY_PM_ENERGY_DETECT_PLUS: -+ -+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -+ -+ Word |= PHY_M_PC_POL_R_DIS; -+ -+ if (!CHIP_ID_YUKON_2(pAC)) { -+ /* disable MAC 125 MHz clock */ -+ Word |= PHY_M_PC_DIS_125CLK; -+ } -+ -+ if (ChipId == CHIP_ID_YUKON_FE) { -+ /* enable Energy Detect (sense & pulse) */ -+ Word |= PHY_M_PC_ENA_ENE_DT; -+ } -+ else { -+ /* clear energy detect mode bits */ -+ Word &= ~PHY_M_PC_EN_DET_MSK; -+ -+ Word |= (Mode == PHY_PM_ENERGY_DETECT) ? PHY_M_PC_EN_DET : -+ PHY_M_PC_EN_DET_PLUS; -+ } -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ -+ /* these register changes must be followed by a software reset */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -+ Word |= PHY_CT_RESET; -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -+ -+ if (ChipId == CHIP_ID_YUKON_EC_U) { -+ /* additional power saving measurements */ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord); -+ -+ /* set gating core clock for LTSSM in L1 state */ -+ DWord |= (P_PEX_LTSSM_STAT(P_PEX_LTSSM_L1_STAT) | -+ /* Enable Gate Root Core Clock */ -+ P_CLK_GATE_ROOT_COR_ENA); -+ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord); -+ -+ /* set Mask Register for Release/Gate Clock */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5), -+ P_REL_PCIE_EXIT_L1_ST | P_GAT_PCIE_ENTER_L1_ST | -+ P_REL_PCIE_RX_EX_IDLE | P_GAT_PCIE_RX_EL_IDLE | -+ P_REL_GPHY_LINK_UP | P_GAT_GPHY_LINK_DOWN); -+ -+#ifdef PCI_E_L1_STATE -+ SK_IN16(IoC, PCI_C(pAC, PCI_OUR_REG_1), &Word); -+ /* enable PCIe L1 on GPHY link down */ -+ Word |= (SK_U16)PCI_ENA_GPHY_LNK; -+ SK_OUT16(IoC, PCI_C(pAC, PCI_OUR_REG_1), Word); -+#endif /* PCI_E_L1_STATE */ -+ } -+ -+ break; -+ -+ /* don't change current power mode */ -+ default: -+ pAC->GIni.GP[Port].PPhyPowerState = LastMode; - Ret = 1; - } - -@@ -2233,7 +2503,7 @@ SK_U8 Mode) /* low power mode */ - * - * SkGmLeaveLowPowerMode() - * -- * Description: -+ * Description: - * Leave the current low power mode and switch to normal mode - * - * Note: -@@ -2243,115 +2513,169 @@ SK_U8 Mode) /* low power mode */ - * 1: error - */ - int SkGmLeaveLowPowerMode( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (e.g. MAC_1) */ - { - SK_U32 DWord; -+ SK_U32 PowerDownBit; - SK_U16 Word; - SK_U8 LastMode; -+ int ChipId; - int Ret = 0; - -- if (pAC->GIni.GIYukonLite && -- pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) { -+ if (!(CHIP_ID_YUKON_2(pAC) || (pAC->GIni.GIYukonLite && -+ pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3))) { - -- /* save current power mode */ -- LastMode = pAC->GIni.GP[Port].PPhyPowerState; -- pAC->GIni.GP[Port].PPhyPowerState = PHY_PM_OPERATIONAL_MODE; -- -- switch (LastMode) { -- /* coma mode (deep sleep) */ -- case PHY_PM_DEEP_SLEEP: -- SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord); -- -- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -- -- /* Release PHY from Coma Mode */ -- SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord & ~PCI_PHY_COMA); -- -- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -- -- SK_IN32(IoC, B2_GP_IO, &DWord); -- -- /* set to output */ -- DWord |= (GP_DIR_9 | GP_IO_9); -- -- /* set PHY reset */ -- SK_OUT32(IoC, B2_GP_IO, DWord); -- -- DWord &= ~GP_IO_9; /* clear PHY reset (active high) */ -- -- /* clear PHY reset */ -- SK_OUT32(IoC, B2_GP_IO, DWord); -- break; -- -- /* IEEE 22.2.4.1.5 compatible power down mode */ -- case PHY_PM_IEEE_POWER_DOWN: -- /* -- * - enable MAC 125 MHz clock -- * - set MAC power up -- */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -- Word &= ~PHY_M_PC_DIS_125CLK; -- Word |= PHY_M_PC_MAC_POW_UP; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ return(1); -+ } - -- /* -- * register changes must be followed by a software -- * reset to take effect -- */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -- Word |= PHY_CT_RESET; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -- -- /* switch IEEE compatible power down mode off */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -- Word &= ~PHY_CT_PDOWN; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -- break; -+ /* save current power mode */ -+ LastMode = pAC->GIni.GP[Port].PPhyPowerState; -+ pAC->GIni.GP[Port].PPhyPowerState = PHY_PM_OPERATIONAL_MODE; - -- /* energy detect and energy detect plus mode */ -- case PHY_PM_ENERGY_DETECT: -- case PHY_PM_ENERGY_DETECT_PLUS: -- /* -- * - enable MAC 125 MHz clock -- */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -- Word &= ~PHY_M_PC_DIS_125CLK; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -- -- /* disable energy detect mode */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -- Word &= ~PHY_M_PC_EN_DET_MSK; -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ ChipId = pAC->GIni.GIChipId; - -- /* -- * reinitialize the PHY to force a software reset -- * which is necessary after the register settings -- * for the energy detect modes. -- * Furthermore reinitialisation prevents that the -- * PHY is running out of a stable state. -- */ -- SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE); -- break; -+ SK_DBG_MSG(pAC, SK_DBGMOD_POWM, SK_DBGCAT_CTRL, -+ ("SkGmLeaveLowPowerMode: %u\n", LastMode)); - -- /* don't change current power mode */ -- default: -- pAC->GIni.GP[Port].PPhyPowerState = LastMode; -- Ret = 1; -- break; -+ switch (LastMode) { -+ /* COMA mode (deep sleep) */ -+ case PHY_PM_DEEP_SLEEP: -+ -+ if (ChipId == CHIP_ID_YUKON_EC_U) { -+#ifdef PCI_E_L1_STATE -+ /* set to default value (leave PCIe L1) */ -+ SkPciWriteCfgWord(pAC, PCI_OUR_REG_1, 0); -+#endif /* PCI_E_L1_STATE */ -+ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord); -+ -+ DWord &= P_ASPM_CONTROL_MSK; -+ /* set all bits to 0 except bits 15..12 */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord); -+ -+ /* set to default value */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5), 0); - } -- } -- /* low power modes are not supported by this chip */ -- else { -+ else { -+ SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &Word); -+ -+ /* reset all DState bits */ -+ Word &= ~(PCI_PM_STATE_MSK); -+ -+ /* switch to D0 state */ -+ SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, Word); -+ } -+ -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ /* disable Core Clock Division */ -+ SK_OUT32(IoC, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS); -+ -+ /* set power down bit */ -+ PowerDownBit = (Port == MAC_1) ? PCI_Y2_PHY1_POWD : -+ PCI_Y2_PHY2_POWD; -+ } -+ else { -+ PowerDownBit = PCI_PHY_COMA; -+ } -+ -+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &DWord); -+ -+ /* Release PHY from PowerDown/COMA Mode */ -+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), DWord & ~PowerDownBit); -+ -+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); -+ -+ if (CHIP_ID_YUKON_2(pAC)) { -+ -+ if (ChipId == CHIP_ID_YUKON_FE) { -+ /* release IEEE compatible Power Down Mode */ -+ Ret = SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PHY_CT_ANE); -+ } -+ else if (ChipId == CHIP_ID_YUKON_EC_U) { -+ /* release GPHY Control reset */ -+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_CLR); -+ } -+ } -+ else { -+ SK_IN32(IoC, B2_GP_IO, &DWord); -+ -+ /* set to output */ -+ DWord |= (GP_DIR_9 | GP_IO_9); -+ -+ /* set PHY reset */ -+ SK_OUT32(IoC, B2_GP_IO, DWord); -+ -+ DWord &= ~GP_IO_9; /* clear PHY reset (active high) */ -+ -+ /* clear PHY reset */ -+ SK_OUT32(IoC, B2_GP_IO, DWord); -+ } -+ -+ break; -+ -+ /* IEEE 22.2.4.1.5 compatible power down mode */ -+ case PHY_PM_IEEE_POWER_DOWN: -+ -+ if (ChipId != CHIP_ID_YUKON_XL) { -+ -+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -+ Word &= ~PHY_M_PC_DIS_125CLK; /* enable MAC 125 MHz clock */ -+ Word |= PHY_M_PC_MAC_POW_UP; /* set MAC power up */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ -+ /* these register changes must be followed by a software reset */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -+ Word |= PHY_CT_RESET; -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -+ } -+ -+ /* switch IEEE compatible power down mode off */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -+ Word &= ~PHY_CT_PDOWN; -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -+ -+ break; -+ -+ /* energy detect and energy detect plus mode */ -+ case PHY_PM_ENERGY_DETECT: -+ case PHY_PM_ENERGY_DETECT_PLUS: -+ -+ if (ChipId != CHIP_ID_YUKON_XL) { -+ -+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word); -+ -+ if (ChipId == CHIP_ID_YUKON_FE) { -+ /* disable Energy Detect */ -+ Word &= ~PHY_M_PC_ENA_ENE_DT; -+ } -+ else { -+ /* disable energy detect mode & enable MAC 125 MHz clock */ -+ Word &= ~(PHY_M_PC_EN_DET_MSK | PHY_M_PC_DIS_125CLK); -+ } -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word); -+ -+ /* these register changes must be followed by a software reset */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word); -+ Word |= PHY_CT_RESET; -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word); -+ } -+ break; -+ -+ /* don't change current power mode */ -+ default: -+ pAC->GIni.GP[Port].PPhyPowerState = LastMode; - Ret = 1; - } - - return(Ret); - - } /* SkGmLeaveLowPowerMode */ --#endif /* !SK_SLIM */ -- -+#endif /* SK_PHY_LP_MODE */ - - /****************************************************************************** - * -@@ -2365,107 +2689,242 @@ int Port) /* Port Index (e.g. MAC_1) * - * nothing - */ - static void SkGmInitPhyMarv( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */ - { - SK_GEPORT *pPrt; -+ SK_BOOL AutoNeg; - SK_U16 PhyCtrl; - SK_U16 C1000BaseT; - SK_U16 AutoNegAdv; -+ SK_U8 PauseMode; -+ int ChipId; -+#ifndef VCPU -+ SK_U16 SWord; -+ SK_U16 PageReg; -+#ifndef SK_SLIM -+ SK_U16 LoopSpeed; -+#endif /* !SK_SLIM */ - SK_U16 ExtPhyCtrl; - SK_U16 LedCtrl; -- SK_BOOL AutoNeg; -+ SK_U16 LedOver; -+#ifndef SK_DIAG -+ SK_EVPARA Para; -+#endif /* !SK_DIAG */ - #if defined(SK_DIAG) || defined(DEBUG) - SK_U16 PhyStat; - SK_U16 PhyStat1; - SK_U16 PhySpecStat; - #endif /* SK_DIAG || DEBUG */ -+#endif /* !VCPU */ -+ -+ /* set Pause On */ -+ PauseMode = (SK_U8)GMC_PAUSE_ON; - - pPrt = &pAC->GIni.GP[Port]; - -+ ChipId = pAC->GIni.GIChipId; -+ - /* Auto-negotiation ? */ -- if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { -- AutoNeg = SK_FALSE; -+ AutoNeg = pPrt->PLinkMode != SK_LMODE_HALF && -+ pPrt->PLinkMode != SK_LMODE_FULL; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("InitPhyMarv: Port %d, Auto-neg. %s, LMode %d, LSpeed %d, FlowC %d\n", -+ Port, AutoNeg ? "ON" : "OFF", -+ pPrt->PLinkMode, pPrt->PLinkSpeed, pPrt->PFlowCtrlMode)); -+ -+#ifndef VCPU -+ /* read Id from PHY */ -+ if (SkGmPhyRead(pAC, IoC, Port, PHY_MARV_ID1, &pPrt->PhyId1) != 0) { -+ -+#ifndef SK_DIAG -+ Para.Para64 = Port; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); -+#endif /* !SK_DIAG */ -+ -+ return; - } -- else { -- AutoNeg = SK_TRUE; -+ -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) { -+ -+#ifndef SK_SLIM -+ if (DoLoop) { -+ /* special setup for PHY 88E1112 */ -+ if (ChipId == CHIP_ID_YUKON_XL) { -+ -+ LoopSpeed = pPrt->PLinkSpeed; -+ -+ if (LoopSpeed == SK_LSPEED_AUTO) { -+ /* force 1000 Mbps */ -+ LoopSpeed = SK_LSPEED_1000MBPS; -+ } -+ LoopSpeed += 2; -+ -+ /* save page register */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_ADR, &PageReg); -+ -+ /* select page 2 to access MAC control register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 2); -+ -+ /* set MAC interface speed */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, LoopSpeed << 4); -+ -+ /* restore page register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, PageReg); -+ -+ /* disable link pulses */ -+ SWord = PHY_M_PC_DIS_LINK_P; -+ } -+ else { -+ /* set 'MAC Power up'-bit, set Manual MDI configuration */ -+ SWord = PHY_M_PC_MAC_POW_UP; -+ } -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, SWord); -+ } -+ else -+#endif /* !SK_SLIM */ -+ if (AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_AUTO && -+ !(ChipId == CHIP_ID_YUKON_XL || ChipId == CHIP_ID_YUKON_EC_U)) { -+ /* Read Ext. PHY Specific Control */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl); -+ -+ ExtPhyCtrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK | -+ PHY_M_EC_MAC_S_MSK); -+ -+ ExtPhyCtrl |= PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ); -+ -+ /* on PHY 88E1040 Rev.D0 (and newer) downshift control changed */ -+ if (pAC->GIni.GIYukonLite || ChipId == CHIP_ID_YUKON_EC) { -+ /* set downshift counter to 3x and enable downshift */ -+ ExtPhyCtrl |= PHY_M_EC_DSC_2(2) | PHY_M_EC_DOWN_S_ENA; -+ } -+ else { -+ /* set master & slave downshift counter to 1x */ -+ ExtPhyCtrl |= PHY_M_EC_M_DSC(0) | PHY_M_EC_S_DSC(1); -+ } -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, ExtPhyCtrl); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Set Ext. PHY Ctrl = 0x%04X\n", ExtPhyCtrl)); -+ } - } -- -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("InitPhyMarv: Port %d, auto-negotiation %s\n", -- Port, AutoNeg ? "ON" : "OFF")); - --#ifdef VCPU -- VCPUprintf(0, "SkGmInitPhyMarv(), Port=%u, DoLoop=%u\n", -- Port, DoLoop); --#else /* VCPU */ -- if (DoLoop) { -- /* Set 'MAC Power up'-bit, set Manual MDI configuration */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, -- PHY_M_PC_MAC_POW_UP); -+ if (CHIP_ID_YUKON_2(pAC)) { -+ /* Read PHY Specific Control */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &PhyCtrl); -+ -+ if (!DoLoop && pAC->GIni.GICopperType) { -+ -+ if (ChipId == CHIP_ID_YUKON_FE) { -+ /* enable Automatic Crossover (!!! Bits 5..4) */ -+ PhyCtrl |= (SK_U16)(PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1); -+ } -+ else { -+ /* disable Energy Detect Mode */ -+ PhyCtrl &= ~PHY_M_PC_EN_DET_MSK; -+ -+ /* enable Automatic Crossover */ -+ PhyCtrl |= (SK_U16)PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO); -+ -+ /* downshift on PHY 88E1112 and 88E1149 is changed */ -+ if (AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_AUTO && -+ (ChipId == CHIP_ID_YUKON_XL || -+ ChipId == CHIP_ID_YUKON_EC_U)) { -+ /* set downshift counter to 3x and enable downshift */ -+ PhyCtrl &= ~PHY_M_PC_DSC_MSK; -+ PhyCtrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA; -+ } -+ } -+ } -+ /* workaround for deviation #4.88 (CRC errors) */ -+ else { -+ /* disable Automatic Crossover */ -+ PhyCtrl &= ~PHY_M_PC_MDIX_MSK; -+ } -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PhyCtrl); - } -- else if (AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_AUTO) { -- /* Read Ext. PHY Specific Control */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl); -- -- ExtPhyCtrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK | -- PHY_M_EC_MAC_S_MSK); -- -- ExtPhyCtrl |= PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ) | -- PHY_M_EC_M_DSC(0) | PHY_M_EC_S_DSC(1); -- -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, ExtPhyCtrl); -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Set Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl)); -+ -+ /* special setup for PHY 88E1112 Fiber */ -+ if (ChipId == CHIP_ID_YUKON_XL && !pAC->GIni.GICopperType) { -+ /* select 1000BASE-X only mode in MAC Specific Ctrl Reg. */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 2); -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &SWord); -+ -+ SWord &= ~PHY_M_MAC_MD_MSK; -+ SWord |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX); -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, SWord); -+ -+ /* select page 1 to access Fiber registers */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 1); -+ -+ if (pAC->GIni.GIPmdTyp == 'P') { -+ /* for SFP-module set SIGDET polarity to low */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &SWord); -+ -+ SWord |= PHY_M_FIB_SIGD_POL; -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, SWord); -+ } - } - - /* Read PHY Control */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl); - -+#ifndef SK_SLIM - if (!AutoNeg) { -- /* Disable Auto-negotiation */ -+ /* disable Auto-negotiation */ - PhyCtrl &= ~PHY_CT_ANE; - } -+#endif /* !SK_SLIM */ - - PhyCtrl |= PHY_CT_RESET; -- /* Assert software reset */ -+ /* assert software reset */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl); --#endif /* VCPU */ -+#endif /* !VCPU */ - - PhyCtrl = 0 /* PHY_CT_COL_TST */; - C1000BaseT = 0; - AutoNegAdv = PHY_SEL_TYPE; - -+#ifndef SK_SLIM - /* manually Master/Slave ? */ - if (pPrt->PMSMode != SK_MS_MODE_AUTO) { - /* enable Manual Master/Slave */ - C1000BaseT |= PHY_M_1000C_MSE; -- -+ - if (pPrt->PMSMode == SK_MS_MODE_MASTER) { - C1000BaseT |= PHY_M_1000C_MSC; /* set it to Master */ - } - } -- -+#endif /* !SK_SLIM */ -+ - /* Auto-negotiation ? */ - if (!AutoNeg) { -- -+ -+#ifndef SK_SLIM - if (pPrt->PLinkMode == SK_LMODE_FULL) { -- /* Set Full Duplex Mode */ -+ /* set Full Duplex Mode */ - PhyCtrl |= PHY_CT_DUP_MD; - } - -- /* Set Master/Slave manually if not already done */ -+ /* set Master/Slave manually if not already done */ - if (pPrt->PMSMode == SK_MS_MODE_AUTO) { - C1000BaseT |= PHY_M_1000C_MSE; /* set it to Slave */ - } - -- /* Set Speed */ -+ /* set Speed */ - switch (pPrt->PLinkSpeed) { - case SK_LSPEED_AUTO: - case SK_LSPEED_1000MBPS: -- PhyCtrl |= PHY_CT_SP1000; -+ PhyCtrl |= (((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) ? -+ PHY_CT_SP1000 : PHY_CT_SP100); - break; - case SK_LSPEED_100MBPS: - PhyCtrl |= PHY_CT_SP100; -@@ -2477,38 +2936,67 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - SKERR_HWI_E019MSG); - } - -+ if ((pPrt->PFlowCtrlMode == SK_FLOW_STAT_NONE) || -+ /* disable Pause also for 10/100 Mbps in half duplex mode */ -+ ((ChipId != CHIP_ID_YUKON_EC_U) && -+ (pPrt->PLinkMode == SK_LMODE_HALF) && -+ ((pPrt->PLinkSpeed == SK_LSPEED_STAT_100MBPS) || -+ (pPrt->PLinkSpeed == SK_LSPEED_STAT_10MBPS)))) { -+ -+ /* set Pause Off */ -+ PauseMode = (SK_U8)GMC_PAUSE_OFF; -+ } -+ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), PauseMode); -+ - if (!DoLoop) { -+ /* assert software reset */ - PhyCtrl |= PHY_CT_RESET; - } -+#endif /* !SK_SLIM */ - } - else { -- /* Set Auto-negotiation advertisement */ -- -+ /* set Auto-negotiation advertisement */ -+ - if (pAC->GIni.GICopperType) { -- /* Set Speed capabilities */ -+ /* set Speed capabilities */ - switch (pPrt->PLinkSpeed) { - case SK_LSPEED_AUTO: -- C1000BaseT |= PHY_M_1000C_AHD | PHY_M_1000C_AFD; -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) { -+ C1000BaseT |= PHY_M_1000C_AFD; -+#ifdef xSK_DIAG -+ C1000BaseT |= PHY_M_1000C_AHD; -+#endif /* SK_DIAG */ -+ } - AutoNegAdv |= PHY_M_AN_100_FD | PHY_M_AN_100_HD | - PHY_M_AN_10_FD | PHY_M_AN_10_HD; - break; - case SK_LSPEED_1000MBPS: -- C1000BaseT |= PHY_M_1000C_AHD | PHY_M_1000C_AFD; -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) { -+ C1000BaseT |= PHY_M_1000C_AFD; -+#ifdef xSK_DIAG -+ C1000BaseT |= PHY_M_1000C_AHD; -+#endif /* SK_DIAG */ -+ } - break; - case SK_LSPEED_100MBPS: -- AutoNegAdv |= PHY_M_AN_100_FD | PHY_M_AN_100_HD | -- /* advertise 10Base-T also */ -- PHY_M_AN_10_FD | PHY_M_AN_10_HD; -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_100MBPS) != 0) { -+ AutoNegAdv |= PHY_M_AN_100_FD | PHY_M_AN_100_HD | -+ /* advertise 10Base-T also */ -+ PHY_M_AN_10_FD | PHY_M_AN_10_HD; -+ } - break; - case SK_LSPEED_10MBPS: -- AutoNegAdv |= PHY_M_AN_10_FD | PHY_M_AN_10_HD; -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_10MBPS) != 0) { -+ AutoNegAdv |= PHY_M_AN_10_FD | PHY_M_AN_10_HD; -+ } - break; - default: - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E019, - SKERR_HWI_E019MSG); - } - -- /* Set Full/half duplex capabilities */ -+ /* set Full/half duplex capabilities */ - switch (pPrt->PLinkMode) { - case SK_LMODE_AUTOHALF: - C1000BaseT &= ~PHY_M_1000C_AFD; -@@ -2524,8 +3012,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E015, - SKERR_HWI_E015MSG); - } -- -- /* Set Flow-control capabilities */ -+ -+ /* set Flow-control capabilities */ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: - AutoNegAdv |= PHY_B_P_NO_PAUSE; -@@ -2544,9 +3032,9 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - SKERR_HWI_E016MSG); - } - } -- else { /* special defines for FIBER (88E1011S only) */ -- -- /* Set Full/half duplex capabilities */ -+ else { /* special defines for FIBER (88E1040S only) */ -+ -+ /* set Full/half duplex capabilities */ - switch (pPrt->PLinkMode) { - case SK_LMODE_AUTOHALF: - AutoNegAdv |= PHY_M_AN_1000X_AHD; -@@ -2561,8 +3049,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E015, - SKERR_HWI_E015MSG); - } -- -- /* Set Flow-control capabilities */ -+ -+ /* set Flow-control capabilities */ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: - AutoNegAdv |= PHY_M_P_NO_PAUSE_X; -@@ -2587,138 +3075,228 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - PhyCtrl |= PHY_CT_ANE | PHY_CT_RE_CFG; - } - } -- -+ - #ifdef VCPU - /* - * E-mail from Gu Lin (08-03-2002): - */ -- -+ - /* Program PHY register 30 as 16'h0708 for simulation speed up */ - SkGmPhyWrite(pAC, IoC, Port, 30, 0x0700 /* 0x0708 */); -- -+ - VCpuWait(2000); - --#else /* VCPU */ -- -- /* Write 1000Base-T Control Register */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_1000T_CTRL, C1000BaseT); -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Set 1000B-T Ctrl =0x%04X\n", C1000BaseT)); -- -+#else /* !VCPU */ -+ -+ if (ChipId != CHIP_ID_YUKON_FE) { -+ /* Write 1000Base-T Control Register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_1000T_CTRL, C1000BaseT); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Set 1000B-T Ctrl = 0x%04X\n", C1000BaseT)); -+ } -+ - /* Write AutoNeg Advertisement Register */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV, AutoNegAdv); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Set Auto-Neg.Adv.=0x%04X\n", AutoNegAdv)); --#endif /* VCPU */ -- -+ ("Set Auto-Neg.Adv. = 0x%04X\n", AutoNegAdv)); -+#endif /* !VCPU */ -+ -+#ifndef SK_SLIM - if (DoLoop) { -- /* Set the PHY Loopback bit */ -+ /* set the PHY Loopback bit */ - PhyCtrl |= PHY_CT_LOOP; - - #ifdef XXX - /* Program PHY register 16 as 16'h0400 to force link good */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PHY_M_PC_FL_GOOD); --#endif /* XXX */ - --#ifndef VCPU - if (pPrt->PLinkSpeed != SK_LSPEED_AUTO) { - /* Write Ext. PHY Specific Control */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, - (SK_U16)((pPrt->PLinkSpeed + 2) << 4)); - } --#endif /* VCPU */ -+#endif /* XXX */ - } - #ifdef TEST_ONLY - else if (pPrt->PLinkSpeed == SK_LSPEED_10MBPS) { -- /* Write PHY Specific Control */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, -- PHY_M_PC_EN_DET_MSK); -+ /* Write PHY Specific Control */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PHY_M_PC_EN_DET_MSK); - } - #endif -+#endif /* !SK_SLIM */ - - /* Write to the PHY Control register */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Set PHY Ctrl Reg.=0x%04X\n", PhyCtrl)); -+ ("Set PHY Ctrl Reg. = 0x%04X\n", PhyCtrl)); - - #ifdef VCPU - VCpuWait(2000); --#else -+#else /* !VCPU */ - -- LedCtrl = PHY_M_LED_PULS_DUR(PULS_170MS) | PHY_M_LED_BLINK_RT(BLINK_84MS); -+ LedCtrl = PHY_M_LED_PULS_DUR(PULS_170MS); -+ -+ LedOver = 0; - - if ((pAC->GIni.GILedBlinkCtrl & SK_ACT_LED_BLINK) != 0) { -- LedCtrl |= PHY_M_LEDC_RX_CTRL | PHY_M_LEDC_TX_CTRL; -+ -+ if (ChipId == CHIP_ID_YUKON_FE) { -+ /* on 88E3082 these bits are at 11..9 (shifted left) */ -+ LedCtrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) << 1; -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_FE_LED_PAR, &SWord); -+ -+ /* delete ACT LED control bits */ -+ SWord &= ~PHY_M_FELP_LED1_MSK; -+ /* change ACT LED control to blink mode */ -+ SWord |= PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_ACT_BL); -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_FE_LED_PAR, SWord); -+ } -+ else if (ChipId == CHIP_ID_YUKON_XL || ChipId == CHIP_ID_YUKON_EC_U) { -+ /* save page register */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_ADR, &PageReg); -+ -+ /* select page 3 to access LED control register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 3); -+ -+ /* set LED Function Control register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, (SK_U16) -+ (PHY_M_LEDC_LOS_CTRL(1) | /* LINK/ACT */ -+ PHY_M_LEDC_INIT_CTRL( -+ ChipId == CHIP_ID_YUKON_XL ? 7 : 8) | /* 10 Mbps */ -+ PHY_M_LEDC_STA1_CTRL(7) | /* 100 Mbps */ -+ PHY_M_LEDC_STA0_CTRL(7))); /* 1000 Mbps */ -+ -+ if (ChipId == CHIP_ID_YUKON_XL) { -+ /* set Polarity Control register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_STAT, (SK_U16) -+ (PHY_M_POLC_LS1_P_MIX(4) | PHY_M_POLC_IS0_P_MIX(4) | -+ PHY_M_POLC_LOS_CTRL(2) | PHY_M_POLC_INIT_CTRL(2) | -+ PHY_M_POLC_STA1_CTRL(2) | PHY_M_POLC_STA0_CTRL(2))); -+ } -+ else if (ChipId == CHIP_ID_YUKON_EC_U) { -+ /* set Blink Rate in LED Timer Control Register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, -+ LedCtrl | (SK_U16)PHY_M_LED_BLINK_RT(BLINK_84MS)); -+ } -+ /* restore page register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, PageReg); -+ } -+ else { -+ /* set Tx LED (LED_TX) to blink mode on Rx OR Tx activity */ -+ LedCtrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) | PHY_M_LEDC_TX_CTRL; -+ -+ /* on PHY 88E1111 there is a change for LED control */ -+ if (ChipId == CHIP_ID_YUKON_EC && -+ (pAC->GIni.GILedBlinkCtrl & SK_DUAL_LED_ACT_LNK) != 0) { -+ /* Yukon-EC needs setting of 2 bits: 0,6=11) */ -+ LedCtrl |= PHY_M_LEDC_TX_C_LSB; -+ } -+ /* turn off the Rx LED (LED_RX) */ -+ LedOver |= PHY_M_LED_MO_RX(MO_LED_OFF); -+ } - } - - if ((pAC->GIni.GILedBlinkCtrl & SK_DUP_LED_NORMAL) != 0) { -+ /* disable blink mode (LED_DUPLEX) on collisions */ - LedCtrl |= PHY_M_LEDC_DP_CTRL; - } -- -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_CTRL, LedCtrl); - -- if ((pAC->GIni.GILedBlinkCtrl & SK_LED_LINK100_ON) != 0) { -- /* only in forced 100 Mbps mode */ -- if (!AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_100MBPS) { -+ if (ChipId == CHIP_ID_YUKON_EC_U && -+ pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A1) { - -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_OVER, -- PHY_M_LED_MO_100(MO_LED_ON)); -+ /* apply fixes in PHY AFE */ -+ SkGmPhyWrite(pAC, IoC, Port, 22, 255); -+ /* increase differential signal amplitude in 10BASE-T */ -+ SkGmPhyWrite(pAC, IoC, Port, 24, 0xaa99); -+ SkGmPhyWrite(pAC, IoC, Port, 23, 0x2011); -+ -+ /* fix for IEEE A/B Symmetry failure in 1000BASE-T */ -+ SkGmPhyWrite(pAC, IoC, Port, 24, 0xa204); -+ SkGmPhyWrite(pAC, IoC, Port, 23, 0x2002); -+ -+ /* set page register to 0 */ -+ SkGmPhyWrite(pAC, IoC, Port, 22, 0); -+ } -+ else { -+ /* no effect on Yukon-XL and Yukon-EC Ultra */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_CTRL, LedCtrl); -+ -+#ifndef SK_SLIM -+ if ((pAC->GIni.GILedBlinkCtrl & SK_LED_LINK100_ON) != 0) { -+ /* only in forced 100 Mbps mode */ -+ if (!AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_100MBPS) { -+ /* turn on 100 Mbps LED (LED_LINK100) */ -+ LedOver |= PHY_M_LED_MO_100(MO_LED_ON); -+ } -+ } -+#endif /* !SK_SLIM */ -+ -+ if (LedOver != 0) { -+ /* set Manual LED Override */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_OVER, LedOver); - } - } - - #ifdef SK_DIAG -- c_print("Set PHY Ctrl=0x%04X\n", PhyCtrl); -- c_print("Set 1000 B-T=0x%04X\n", C1000BaseT); -- c_print("Set Auto-Neg=0x%04X\n", AutoNegAdv); -- c_print("Set Ext Ctrl=0x%04X\n", ExtPhyCtrl); -+ c_print("Set PHY Ctrl = 0x%04X\n", PhyCtrl); -+ c_print("Set 1000 B-T = 0x%04X\n", C1000BaseT); -+ c_print("Set Auto-Neg = 0x%04X\n", AutoNegAdv); -+ c_print("Set Ext Ctrl = 0x%04X\n", ExtPhyCtrl); - #endif /* SK_DIAG */ - - #if defined(SK_DIAG) || defined(DEBUG) - /* Read PHY Control */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("PHY Ctrl Reg.=0x%04X\n", PhyCtrl)); -- -- /* Read 1000Base-T Control Register */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_CTRL, &C1000BaseT); -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("1000B-T Ctrl =0x%04X\n", C1000BaseT)); -- -+ ("PHY Ctrl Reg. = 0x%04X\n", PhyCtrl)); -+ - /* Read AutoNeg Advertisement Register */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &AutoNegAdv); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Auto-Neg.Adv.=0x%04X\n", AutoNegAdv)); -- -- /* Read Ext. PHY Specific Control */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl); -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl)); -- -+ ("Auto-Neg.Adv. = 0x%04X\n", AutoNegAdv)); -+ -+ if (ChipId != CHIP_ID_YUKON_FE) { -+ /* Read 1000Base-T Control Register */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_CTRL, &C1000BaseT); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("1000B-T Ctrl = 0x%04X\n", C1000BaseT)); -+ -+ /* Read Ext. PHY Specific Control */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Ext. PHY Ctrl = 0x%04X\n", ExtPhyCtrl)); -+ } -+ - /* Read PHY Status */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("PHY Stat Reg.=0x%04X\n", PhyStat)); -+ ("PHY Stat Reg. = 0x%04X\n", PhyStat)); -+ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat1); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("PHY Stat Reg.=0x%04X\n", PhyStat1)); -- -+ ("PHY Stat Reg. = 0x%04X\n", PhyStat1)); -+ - /* Read PHY Specific Status */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpecStat); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("PHY Spec Stat=0x%04X\n", PhySpecStat)); -+ ("PHY Spec Stat = 0x%04X\n", PhySpecStat)); - #endif /* SK_DIAG || DEBUG */ - - #ifdef SK_DIAG -- c_print("PHY Ctrl Reg=0x%04X\n", PhyCtrl); -- c_print("PHY 1000 Reg=0x%04X\n", C1000BaseT); -- c_print("PHY AnAd Reg=0x%04X\n", AutoNegAdv); -- c_print("Ext Ctrl Reg=0x%04X\n", ExtPhyCtrl); -- c_print("PHY Stat Reg=0x%04X\n", PhyStat); -- c_print("PHY Stat Reg=0x%04X\n", PhyStat1); -- c_print("PHY Spec Reg=0x%04X\n", PhySpecStat); -+ c_print("PHY Ctrl Reg = 0x%04X\n", PhyCtrl); -+ c_print("PHY 1000 Reg = 0x%04X\n", C1000BaseT); -+ c_print("PHY AnAd Reg = 0x%04X\n", AutoNegAdv); -+ c_print("Ext Ctrl Reg = 0x%04X\n", ExtPhyCtrl); -+ c_print("PHY Stat Reg = 0x%04X\n", PhyStat); -+ c_print("PHY Stat Reg = 0x%04X\n", PhyStat1); -+ c_print("PHY Spec Reg = 0x%04X\n", PhySpecStat); - #endif /* SK_DIAG */ - --#endif /* VCPU */ -+ /* enable PHY interrupts */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, (SK_U16)PHY_M_DEF_MSK); -+#endif /* !VCPU */ - - } /* SkGmInitPhyMarv */ - #endif /* YUKON */ -@@ -2737,8 +3315,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - * nothing - */ - static void SkXmInitPhyLone( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */ - { -@@ -2756,7 +3334,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - /* manually Master/Slave ? */ - if (pPrt->PMSMode != SK_MS_MODE_AUTO) { - Ctrl2 |= PHY_L_1000C_MSE; -- -+ - if (pPrt->PMSMode == SK_MS_MODE_MASTER) { - Ctrl2 |= PHY_L_1000C_MSC; - } -@@ -2769,7 +3347,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - */ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyLone: no auto-negotiation Port %d\n", Port)); -- /* Set DuplexMode in Config register */ -+ /* set DuplexMode in Config register */ - if (pPrt->PLinkMode == SK_LMODE_FULL) { - Ctrl1 |= PHY_CT_DUP_MD; - } -@@ -2778,7 +3356,6 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - if (pPrt->PMSMode == SK_MS_MODE_AUTO) { - Ctrl2 |= PHY_L_1000C_MSE; /* set it to Slave */ - } -- - /* - * Do NOT enable Auto-negotiation here. This would hold - * the link down because no IDLES are transmitted -@@ -2787,9 +3364,9 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - else { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyLone: with auto-negotiation Port %d\n", Port)); -- /* Set Auto-negotiation advertisement */ -+ /* set Auto-negotiation advertisement */ - -- /* Set Full/half duplex capabilities */ -+ /* set Full/half duplex capabilities */ - switch (pPrt->PLinkMode) { - case SK_LMODE_AUTOHALF: - Ctrl2 |= PHY_L_1000C_AHD; -@@ -2805,7 +3382,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - SKERR_HWI_E015MSG); - } - -- /* Set Flow-control capabilities */ -+ /* set Flow-control capabilities */ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: - Ctrl3 |= PHY_L_P_NO_PAUSE; -@@ -2827,26 +3404,26 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - /* Restart Auto-negotiation */ - Ctrl1 = PHY_CT_ANE | PHY_CT_RE_CFG; - } -- -+ - /* Write 1000Base-T Control Register */ - SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_1000T_CTRL, Ctrl2); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("1000B-T Ctrl Reg=0x%04X\n", Ctrl2)); -- -+ ("1000B-T Ctrl Reg = 0x%04X\n", Ctrl2)); -+ - /* Write AutoNeg Advertisement Register */ - SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_AUNE_ADV, Ctrl3); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3)); -+ ("Auto-Neg.Adv.Reg = 0x%04X\n", Ctrl3)); - - if (DoLoop) { -- /* Set the Phy Loopback bit, too */ -+ /* set the Phy Loopback bit, too */ - Ctrl1 |= PHY_CT_LOOP; - } - - /* Write to the Phy control register */ - SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_CTRL, Ctrl1); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("PHY Control Reg=0x%04X\n", Ctrl1)); -+ ("PHY Control Reg = 0x%04X\n", Ctrl1)); - } /* SkXmInitPhyLone */ - - -@@ -2862,8 +3439,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - * nothing - */ - static void SkXmInitPhyNat( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */ - { -@@ -2884,8 +3461,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - * nothing - */ - void SkMacInitPhy( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */ - { -@@ -2895,7 +3472,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - switch (pPrt->PhyType) { - case SK_PHY_XMAC: - SkXmInitPhyXmac(pAC, IoC, Port, DoLoop); -@@ -2914,10 +3491,10 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - } - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - SkGmInitPhyMarv(pAC, IoC, Port, DoLoop); - } - #endif /* YUKON */ -@@ -2935,17 +3512,17 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac - * - * Returns: - * SK_AND_OK o.k. -- * SK_AND_DUP_CAP Duplex capability error happened -- * SK_AND_OTHER Other error happened -+ * SK_AND_DUP_CAP Duplex capability error happened -+ * SK_AND_OTHER Other error happened - */ - static int SkXmAutoNegDoneXmac( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; - SK_U16 ResAb; /* Resolved Ability */ -- SK_U16 LPAb; /* Link Partner Ability */ -+ SK_U16 LinkPartAb; /* Link Partner Ability */ - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegDoneXmac, Port %d\n", Port)); -@@ -2953,15 +3530,15 @@ int Port) /* Port Index (MAC_1 + n) */ - pPrt = &pAC->GIni.GP[Port]; - - /* Get PHY parameters */ -- SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LPAb); -+ SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LinkPartAb); - SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_RES_ABI, &ResAb); - -- if ((LPAb & PHY_X_AN_RFB) != 0) { -+ if ((LinkPartAb & PHY_X_AN_RFB) != 0) { - /* At least one of the remote fault bit is set */ -- /* Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNegFail: Remote fault bit set Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; -+ - return(SK_AND_OTHER); - } - -@@ -2974,9 +3551,10 @@ int Port) /* Port Index (MAC_1 + n) */ - } - else { - /* Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNegFail: Duplex mode mismatch Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; -+ - return(SK_AND_DUP_CAP); - } - -@@ -2984,19 +3562,19 @@ int Port) /* Port Index (MAC_1 + n) */ - /* We are NOT using chapter 4.23 of the Xaqti manual */ - /* We are using IEEE 802.3z/D5.0 Table 37-4 */ - if ((pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC || -- pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) && -- (LPAb & PHY_X_P_SYM_MD) != 0) { -+ pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) && -+ (LinkPartAb & PHY_X_P_SYM_MD) != 0) { - /* Symmetric PAUSE */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC; - } - else if (pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM && -- (LPAb & PHY_X_RS_PAUSE) == PHY_X_P_ASYM_MD) { -- /* Enable PAUSE receive, disable PAUSE transmit */ -+ (LinkPartAb & PHY_X_RS_PAUSE) == PHY_X_P_ASYM_MD) { -+ /* enable PAUSE receive, disable PAUSE transmit */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND; - } - else if (pPrt->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND && -- (LPAb & PHY_X_RS_PAUSE) == PHY_X_P_BOTH_MD) { -- /* Disable PAUSE receive, enable PAUSE transmit */ -+ (LinkPartAb & PHY_X_RS_PAUSE) == PHY_X_P_BOTH_MD) { -+ /* disable PAUSE receive, enable PAUSE transmit */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND; - } - else { -@@ -3018,41 +3596,40 @@ int Port) /* Port Index (MAC_1 + n) */ - * - * Returns: - * SK_AND_OK o.k. -- * SK_AND_DUP_CAP Duplex capability error happened -- * SK_AND_OTHER Other error happened -+ * SK_AND_DUP_CAP Duplex capability error happened -+ * SK_AND_OTHER Other error happened - */ - static int SkXmAutoNegDoneBcom( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -- SK_U16 LPAb; /* Link Partner Ability */ -- SK_U16 AuxStat; /* Auxiliary Status */ -- - #ifdef TEST_ONLY --01-Sep-2000 RA;:;: - SK_U16 ResAb; /* Resolved Ability */ --#endif /* 0 */ -+#endif -+ SK_U16 LinkPartAb; /* Link Partner Ability */ -+ SK_U16 AuxStat; /* Auxiliary Status */ -+ - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegDoneBcom, Port %d\n", Port)); - pPrt = &pAC->GIni.GP[Port]; - - /* Get PHY parameters */ -- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &LPAb); -+ SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &LinkPartAb); - #ifdef TEST_ONLY --01-Sep-2000 RA;:;: - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ResAb); --#endif /* 0 */ -- -+#endif -+ - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_STAT, &AuxStat); - -- if ((LPAb & PHY_B_AN_RF) != 0) { -+ if ((LinkPartAb & PHY_B_AN_RF) != 0) { - /* Remote fault bit is set: Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNegFail: Remote fault bit set Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; -+ - return(SK_AND_OTHER); - } - -@@ -3065,26 +3642,26 @@ int Port) /* Port Index (MAC_1 + n) */ - } - else { - /* Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNegFail: Duplex mode mismatch Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; -+ - return(SK_AND_DUP_CAP); - } -- -+ - #ifdef TEST_ONLY --01-Sep-2000 RA;:;: - /* Check Master/Slave resolution */ - if ((ResAb & PHY_B_1000S_MSF) != 0) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("Master/Slave Fault Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; - pPrt->PMSStatus = SK_MS_STAT_FAULT; - return(SK_AND_OTHER); - } -- -+ - pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ? - SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE; --#endif /* 0 */ -+#endif - - /* Check PAUSE mismatch ??? */ - /* We are using IEEE 802.3z/D5.0 Table 37-4 */ -@@ -3093,11 +3670,11 @@ int Port) /* Port Index (MAC_1 + n) */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC; - } - else if ((AuxStat & PHY_B_AS_PAUSE_MSK) == PHY_B_AS_PRR) { -- /* Enable PAUSE receive, disable PAUSE transmit */ -+ /* enable PAUSE receive, disable PAUSE transmit */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND; - } - else if ((AuxStat & PHY_B_AS_PAUSE_MSK) == PHY_B_AS_PRT) { -- /* Disable PAUSE receive, enable PAUSE transmit */ -+ /* disable PAUSE receive, enable PAUSE transmit */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND; - } - else { -@@ -3111,6 +3688,7 @@ int Port) /* Port Index (MAC_1 + n) */ - #endif /* GENESIS */ - - -+#ifndef SK_SLIM - #ifdef YUKON - /****************************************************************************** - * -@@ -3121,102 +3699,148 @@ int Port) /* Port Index (MAC_1 + n) */ - * - * Returns: - * SK_AND_OK o.k. -- * SK_AND_DUP_CAP Duplex capability error happened -- * SK_AND_OTHER Other error happened -+ * SK_AND_DUP_CAP Duplex capability error happened -+ * SK_AND_OTHER Other error happened - */ - static int SkGmAutoNegDoneMarv( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -- SK_U16 LPAb; /* Link Partner Ability */ - SK_U16 ResAb; /* Resolved Ability */ -+ SK_U16 LinkPartAb; /* Link Partner Ability */ - SK_U16 AuxStat; /* Auxiliary Status */ -+ SK_U8 PauseMode; /* Pause Mode */ -+ -+ /* set Pause On */ -+ PauseMode = (SK_U8)GMC_PAUSE_ON; - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegDoneMarv, Port %d\n", Port)); -+ - pPrt = &pAC->GIni.GP[Port]; - - /* Get PHY parameters */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_LP, &LPAb); -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_LP, &LinkPartAb); - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Link P.Abil.=0x%04X\n", LPAb)); -- -- if ((LPAb & PHY_M_AN_RF) != 0) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ ("Link P.Abil. = 0x%04X\n", LinkPartAb)); -+ -+ if ((LinkPartAb & PHY_M_AN_RF) != 0) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNegFail: Remote fault bit set Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; -+ - return(SK_AND_OTHER); - } - -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb); -- -- /* Check Master/Slave resolution */ -- if ((ResAb & PHY_B_1000S_MSF) != 0) { -+ /* Read PHY Auto-Negotiation Expansion */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_EXP, &LinkPartAb); -+ -+ if ((LinkPartAb & PHY_ANE_LP_CAP) == 0) { -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("Master/Slave Fault Port %d\n", Port)); -- pPrt->PAutoNegFail = SK_TRUE; -- pPrt->PMSStatus = SK_MS_STAT_FAULT; -- return(SK_AND_OTHER); -+ ("Link Partner not Auto-Neg. able, AN Exp.: 0x%04X\n", LinkPartAb)); -+ } -+ -+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) { -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb); -+ -+ /* Check Master/Slave resolution */ -+ if ((ResAb & PHY_B_1000S_MSF) != 0) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("Master/Slave Fault Port %d\n", Port)); -+ pPrt->PAutoNegFail = SK_TRUE; -+ pPrt->PMSStatus = SK_MS_STAT_FAULT; -+ return(SK_AND_OTHER); -+ } -+ -+ pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ? -+ (SK_U8)SK_MS_STAT_MASTER : (SK_U8)SK_MS_STAT_SLAVE; - } -- -- pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ? -- (SK_U8)SK_MS_STAT_MASTER : (SK_U8)SK_MS_STAT_SLAVE; -- -+ - /* Read PHY Specific Status */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &AuxStat); -- -+ - /* Check Speed & Duplex resolved */ - if ((AuxStat & PHY_M_PS_SPDUP_RES) == 0) { -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNegFail: Speed & Duplex not resolved, Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; - pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; -+ - return(SK_AND_DUP_CAP); - } -- -- if ((AuxStat & PHY_M_PS_FULL_DUP) != 0) { -- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOFULL; -- } -- else { -- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF; -- } -- -- /* Check PAUSE mismatch ??? */ -- /* We are using IEEE 802.3z/D5.0 Table 37-4 */ -- if ((AuxStat & PHY_M_PS_PAUSE_MSK) == PHY_M_PS_PAUSE_MSK) { -- /* Symmetric PAUSE */ -- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC; -- } -- else if ((AuxStat & PHY_M_PS_PAUSE_MSK) == PHY_M_PS_RX_P_EN) { -- /* Enable PAUSE receive, disable PAUSE transmit */ -- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND; -- } -- else if ((AuxStat & PHY_M_PS_PAUSE_MSK) == PHY_M_PS_TX_P_EN) { -- /* Disable PAUSE receive, enable PAUSE transmit */ -- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND; -+ -+ pPrt->PLinkModeStatus = (SK_U8)(((AuxStat & PHY_M_PS_FULL_DUP) != 0) ? -+ SK_LMODE_STAT_AUTOFULL : SK_LMODE_STAT_AUTOHALF); -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) { -+ /* set used link speed */ -+ pPrt->PLinkSpeedUsed = (SK_U8)(((AuxStat & PHY_M_PS_SPEED_100) != 0) ? -+ SK_LSPEED_STAT_100MBPS : SK_LSPEED_STAT_10MBPS); - } - else { -- /* PAUSE mismatch -> no PAUSE */ -- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE; -+ /* set used link speed */ -+ switch ((unsigned)(AuxStat & PHY_M_PS_SPEED_MSK)) { -+ case (unsigned)PHY_M_PS_SPEED_1000: -+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS; -+ break; -+ case PHY_M_PS_SPEED_100: -+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS; -+ break; -+ default: -+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_10MBPS; -+ } -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL || -+ pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) { -+ /* Tx & Rx Pause Enabled bits are at 9..8 */ -+ AuxStat >>= 6; -+ -+ if (!pAC->GIni.GICopperType) { -+ /* always 1000 Mbps on fiber */ -+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS; -+ } -+ } -+ -+ AuxStat &= PHY_M_PS_PAUSE_MSK; -+ /* We are using IEEE 802.3z/D5.0 Table 37-4 */ -+ if (AuxStat == PHY_M_PS_PAUSE_MSK) { -+ /* Symmetric PAUSE */ -+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC; -+ } -+ else if (AuxStat == PHY_M_PS_RX_P_EN) { -+ /* enable PAUSE receive, disable PAUSE transmit */ -+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND; -+ } -+ else if (AuxStat == PHY_M_PS_TX_P_EN) { -+ /* disable PAUSE receive, enable PAUSE transmit */ -+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND; -+ } -+ else { -+ /* PAUSE mismatch -> no PAUSE */ -+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE; -+ } - } -- -- /* set used link speed */ -- switch ((unsigned)(AuxStat & PHY_M_PS_SPEED_MSK)) { -- case (unsigned)PHY_M_PS_SPEED_1000: -- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS; -- break; -- case PHY_M_PS_SPEED_100: -- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS; -- break; -- default: -- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_10MBPS; -+ -+ if ((pPrt->PFlowCtrlStatus == SK_FLOW_STAT_NONE) || -+ /* disable Pause also for 10/100 Mbps in half duplex mode */ -+ ((pAC->GIni.GIChipId != CHIP_ID_YUKON_EC_U) && -+ (pPrt->PLinkSpeedUsed < (SK_U8)SK_LSPEED_STAT_1000MBPS) && -+ pPrt->PLinkModeStatus == (SK_U8)SK_LMODE_STAT_AUTOHALF)) { -+ -+ /* set Pause Off */ -+ PauseMode = (SK_U8)GMC_PAUSE_OFF; - } - -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), PauseMode); -+ - return(SK_AND_OK); - } /* SkGmAutoNegDoneMarv */ - #endif /* YUKON */ -+#endif /* !SK_SLIM */ - - - #ifdef OTHER_PHY -@@ -3229,17 +3853,17 @@ int Port) /* Port Index (MAC_1 + n) */ - * - * Returns: - * SK_AND_OK o.k. -- * SK_AND_DUP_CAP Duplex capability error happened -- * SK_AND_OTHER Other error happened -+ * SK_AND_DUP_CAP Duplex capability error happened -+ * SK_AND_OTHER Other error happened - */ - static int SkXmAutoNegDoneLone( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; - SK_U16 ResAb; /* Resolved Ability */ -- SK_U16 LPAb; /* Link Partner Ability */ -+ SK_U16 LinkPartAb; /* Link Partner Ability */ - SK_U16 QuickStat; /* Auxiliary Status */ - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -@@ -3247,16 +3871,16 @@ int Port) /* Port Index (MAC_1 + n) */ - pPrt = &pAC->GIni.GP[Port]; - - /* Get PHY parameters */ -- SkXmPhyRead(pAC, IoC, Port, PHY_LONE_AUNE_LP, &LPAb); -+ SkXmPhyRead(pAC, IoC, Port, PHY_LONE_AUNE_LP, &LinkPartAb); - SkXmPhyRead(pAC, IoC, Port, PHY_LONE_1000T_STAT, &ResAb); - SkXmPhyRead(pAC, IoC, Port, PHY_LONE_Q_STAT, &QuickStat); - -- if ((LPAb & PHY_L_AN_RF) != 0) { -+ if ((LinkPartAb & PHY_L_AN_RF) != 0) { - /* Remote fault bit is set */ -- /* Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("AutoNegFail: Remote fault bit set Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; -+ - return(SK_AND_OTHER); - } - -@@ -3267,28 +3891,25 @@ int Port) /* Port Index (MAC_1 + n) */ - else { - pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF; - } -- -+ - /* Check Master/Slave resolution */ - if ((ResAb & PHY_L_1000S_MSF) != 0) { - /* Error */ -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("Master/Slave Fault Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; - pPrt->PMSStatus = SK_MS_STAT_FAULT; - return(SK_AND_OTHER); - } -- else if (ResAb & PHY_L_1000S_MSR) { -- pPrt->PMSStatus = SK_MS_STAT_MASTER; -- } -- else { -- pPrt->PMSStatus = SK_MS_STAT_SLAVE; -- } -+ -+ pPrt->PMSStatus = ((ResAb & PHY_L_1000S_MSR) != 0) ? -+ (SK_U8)SK_MS_STAT_MASTER : (SK_U8)SK_MS_STAT_SLAVE; - - /* Check PAUSE mismatch */ - /* We are using IEEE 802.3z/D5.0 Table 37-4 */ - /* we must manually resolve the abilities here */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE; -- -+ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: - /* default */ -@@ -3296,7 +3917,7 @@ int Port) /* Port Index (MAC_1 + n) */ - case SK_FLOW_MODE_LOC_SEND: - if ((QuickStat & (PHY_L_QS_PAUSE | PHY_L_QS_AS_PAUSE)) == - (PHY_L_QS_PAUSE | PHY_L_QS_AS_PAUSE)) { -- /* Disable PAUSE receive, enable PAUSE transmit */ -+ /* disable PAUSE receive, enable PAUSE transmit */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND; - } - break; -@@ -3309,7 +3930,7 @@ int Port) /* Port Index (MAC_1 + n) */ - case SK_FLOW_MODE_SYM_OR_REM: - if ((QuickStat & (PHY_L_QS_PAUSE | PHY_L_QS_AS_PAUSE)) == - PHY_L_QS_AS_PAUSE) { -- /* Enable PAUSE receive, disable PAUSE transmit */ -+ /* enable PAUSE receive, disable PAUSE transmit */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND; - } - else if ((QuickStat & PHY_L_QS_PAUSE) != 0) { -@@ -3321,7 +3942,7 @@ int Port) /* Port Index (MAC_1 + n) */ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E016, - SKERR_HWI_E016MSG); - } -- -+ - return(SK_AND_OK); - } /* SkXmAutoNegDoneLone */ - -@@ -3335,12 +3956,12 @@ int Port) /* Port Index (MAC_1 + n) */ - * - * Returns: - * SK_AND_OK o.k. -- * SK_AND_DUP_CAP Duplex capability error happened -- * SK_AND_OTHER Other error happened -+ * SK_AND_DUP_CAP Duplex capability error happened -+ * SK_AND_OTHER Other error happened - */ - static int SkXmAutoNegDoneNat( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - /* todo: National */ -@@ -3357,12 +3978,12 @@ int Port) /* Port Index (MAC_1 + n) */ - * - * Returns: - * SK_AND_OK o.k. -- * SK_AND_DUP_CAP Duplex capability error happened -- * SK_AND_OTHER Other error happened -+ * SK_AND_DUP_CAP Duplex capability error happened -+ * SK_AND_OTHER Other error happened - */ --int SkMacAutoNegDone( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+int SkMacAutoNegDone( -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -3374,9 +3995,9 @@ int Port) /* Port Index (MAC_1 + n) */ - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - switch (pPrt->PhyType) { -- -+ - case SK_PHY_XMAC: - Rtv = SkXmAutoNegDoneXmac(pAC, IoC, Port); - break; -@@ -3396,30 +4017,33 @@ int Port) /* Port Index (MAC_1 + n) */ - } - } - #endif /* GENESIS */ -- -+ -+#ifndef SK_SLIM - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - Rtv = SkGmAutoNegDoneMarv(pAC, IoC, Port); - } - #endif /* YUKON */ -- -+ - if (Rtv != SK_AND_OK) { - return(Rtv); - } - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNeg done Port %d\n", Port)); -- -+ - /* We checked everything and may now enable the link */ - pPrt->PAutoNegFail = SK_FALSE; -+#endif /* !SK_SLIM */ - - SkMacRxTxEnable(pAC, IoC, Port); -- -+ - return(SK_AND_OK); - } /* SkMacAutoNegDone */ - - -+#ifndef SK_SLIM - #ifdef GENESIS - /****************************************************************************** - * -@@ -3433,7 +4057,7 @@ int Port) /* Port Index (MAC_1 + n) */ - */ - static void SkXmSetRxTxEn( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int Para) /* Parameter to set: MAC or PHY LoopBack, Duplex Mode */ - { -@@ -3458,7 +4082,7 @@ int Para) /* Parameter to set: MAC or - Word &= ~XM_MMU_GMII_LOOP; - break; - } -- -+ - switch (Para & (SK_PHY_FULLD_ON | SK_PHY_FULLD_OFF)) { - case SK_PHY_FULLD_ON: - Word |= XM_MMU_GMII_FD; -@@ -3467,7 +4091,7 @@ int Para) /* Parameter to set: MAC or - Word &= ~XM_MMU_GMII_FD; - break; - } -- -+ - XM_OUT16(IoC, Port, XM_MMU_CMD, Word | XM_MMU_ENA_RX | XM_MMU_ENA_TX); - - /* dummy read to ensure writing */ -@@ -3490,12 +4114,12 @@ int Para) /* Parameter to set: MAC or - */ - static void SkGmSetRxTxEn( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int Para) /* Parameter to set: MAC LoopBack, Duplex Mode */ - { - SK_U16 Ctrl; -- -+ - GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl); - - switch (Para & (SK_MAC_LOOPB_ON | SK_MAC_LOOPB_OFF)) { -@@ -3515,18 +4139,18 @@ int Para) /* Parameter to set: MAC Loo - Ctrl &= ~GM_GPCR_DUP_FULL; - break; - } -- -- GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Ctrl | GM_GPCR_RX_ENA | -- GM_GPCR_TX_ENA)); - -+ GM_OUT16(IoC, Port, GM_GP_CTRL, Ctrl | GM_GPCR_RX_ENA | GM_GPCR_TX_ENA); -+ -+#ifdef XXX - /* dummy read to ensure writing */ - GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl); -+#endif /* XXX */ - - } /* SkGmSetRxTxEn */ - #endif /* YUKON */ - - --#ifndef SK_SLIM - /****************************************************************************** - * - * SkMacSetRxTxEn() - Special Set Rx/Tx Enable and parameters -@@ -3537,20 +4161,20 @@ int Para) /* Parameter to set: MAC Loo - */ - void SkMacSetRxTxEn( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - int Para) - { - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - SkXmSetRxTxEn(pAC, IoC, Port, Para); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - SkGmSetRxTxEn(pAC, IoC, Port, Para); - } - #endif /* YUKON */ -@@ -3570,8 +4194,8 @@ int Para) - * != 0 Error happened - */ - int SkMacRxTxEnable( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -3589,9 +4213,9 @@ int Port) /* Port Index (MAC_1 + n) */ - } - - if ((pPrt->PLinkMode == SK_LMODE_AUTOHALF || -- pPrt->PLinkMode == SK_LMODE_AUTOFULL || -- pPrt->PLinkMode == SK_LMODE_AUTOBOTH) && -- pPrt->PAutoNegFail) { -+ pPrt->PLinkMode == SK_LMODE_AUTOFULL || -+ pPrt->PLinkMode == SK_LMODE_AUTOBOTH) && -+ pPrt->PAutoNegFail) { - /* Auto-negotiation is not done or failed */ - return(0); - } -@@ -3600,9 +4224,9 @@ int Port) /* Port Index (MAC_1 + n) */ - if (pAC->GIni.GIGenesis) { - /* set Duplex Mode and Pause Mode */ - SkXmInitDupMd(pAC, IoC, Port); -- -+ - SkXmInitPauseMd(pAC, IoC, Port); -- -+ - /* - * Initialize the Interrupt Mask Register. Default IRQs are... - * - Link Asynchronous Event -@@ -3618,23 +4242,23 @@ int Port) /* Port Index (MAC_1 + n) */ - /* add IRQ for Receive FIFO Overflow */ - IntMask &= ~XM_IS_RXF_OV; - #endif /* DEBUG */ -- -+ - if (pPrt->PhyType != SK_PHY_XMAC) { - /* disable GP0 interrupt bit */ - IntMask |= XM_IS_INP_ASS; - } - XM_OUT16(IoC, Port, XM_IMSK, IntMask); -- -+ - /* get MMU Command Reg. */ - XM_IN16(IoC, Port, XM_MMU_CMD, &Reg); -- -+ - if (pPrt->PhyType != SK_PHY_XMAC && - (pPrt->PLinkModeStatus == SK_LMODE_STAT_FULL || - pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOFULL)) { - /* set to Full Duplex */ - Reg |= XM_MMU_GMII_FD; - } -- -+ - switch (pPrt->PhyType) { - case SK_PHY_BCOM: - /* -@@ -3644,7 +4268,7 @@ int Port) /* Port Index (MAC_1 + n) */ - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &SWord); - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, - (SK_U16)(SWord & ~PHY_B_AC_DIS_PM)); -- SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_INT_MASK, -+ SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_INT_MASK, - (SK_U16)PHY_B_DEF_MSK); - break; - #ifdef OTHER_PHY -@@ -3658,12 +4282,12 @@ int Port) /* Port Index (MAC_1 + n) */ - break; - #endif /* OTHER_PHY */ - } -- -+ - /* enable Rx/Tx */ - XM_OUT16(IoC, Port, XM_MMU_CMD, Reg | XM_MMU_ENA_RX | XM_MMU_ENA_TX); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* -@@ -3674,34 +4298,34 @@ int Port) /* Port Index (MAC_1 + n) */ - */ - IntMask = GMAC_DEF_MSK; - --#ifdef DEBUG -+#if (defined(DEBUG) || defined(YUK2)) && (!defined(SK_SLIM)) - /* add IRQ for Receive FIFO Overrun */ - IntMask |= GM_IS_RX_FF_OR; --#endif /* DEBUG */ -- -- SK_OUT8(IoC, GMAC_IRQ_MSK, (SK_U8)IntMask); -- -+#endif -+ -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_IRQ_MSK), (SK_U8)IntMask); -+ - /* get General Purpose Control */ - GM_IN16(IoC, Port, GM_GP_CTRL, &Reg); -- -+ - if (pPrt->PLinkModeStatus == SK_LMODE_STAT_FULL || - pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOFULL) { - /* set to Full Duplex */ - Reg |= GM_GPCR_DUP_FULL; - } -- -+ - /* enable Rx/Tx */ -- GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Reg | GM_GPCR_RX_ENA | -- GM_GPCR_TX_ENA)); -+ GM_OUT16(IoC, Port, GM_GP_CTRL, Reg | GM_GPCR_RX_ENA | GM_GPCR_TX_ENA); - --#ifndef VCPU -- /* Enable all PHY interrupts */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, -- (SK_U16)PHY_M_DEF_MSK); --#endif /* VCPU */ -+#ifdef XXX -+ /* dummy read to ensure writing */ -+ GM_IN16(IoC, Port, GM_GP_CTRL, &Reg); -+#endif /* XXX */ - } - #endif /* YUKON */ -- -+ -+ pAC->GIni.GP[Port].PState = SK_PRT_RUN; -+ - return(0); - - } /* SkMacRxTxEnable */ -@@ -3717,33 +4341,38 @@ int Port) /* Port Index (MAC_1 + n) */ - */ - void SkMacRxTxDisable( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_U16 Word; - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - XM_IN16(IoC, Port, XM_MMU_CMD, &Word); -- -- XM_OUT16(IoC, Port, XM_MMU_CMD, Word & ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX)); -- -+ -+ Word &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX); -+ -+ XM_OUT16(IoC, Port, XM_MMU_CMD, Word); -+ - /* dummy read to ensure writing */ - XM_IN16(IoC, Port, XM_MMU_CMD, &Word); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { -- -+ - GM_IN16(IoC, Port, GM_GP_CTRL, &Word); - -- GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Word & ~(GM_GPCR_RX_ENA | -- GM_GPCR_TX_ENA))); -+ Word &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA); - -+ GM_OUT16(IoC, Port, GM_GP_CTRL, Word); -+ -+#ifdef XXX - /* dummy read to ensure writing */ - GM_IN16(IoC, Port, GM_GP_CTRL, &Word); -+#endif /* XXX */ - } - #endif /* YUKON */ - -@@ -3760,7 +4389,7 @@ int Port) /* Port Index (MAC_1 + n) */ - */ - void SkMacIrqDisable( - SK_AC *pAC, /* Adapter Context */ --SK_IOC IoC, /* IO context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -3772,18 +4401,18 @@ int Port) /* Port Index (MAC_1 + n) */ - - #ifdef GENESIS - if (pAC->GIni.GIGenesis) { -- -+ - /* disable all XMAC IRQs */ -- XM_OUT16(IoC, Port, XM_IMSK, 0xffff); -- -- /* Disable all PHY interrupts */ -+ XM_OUT16(IoC, Port, XM_IMSK, 0xffff); -+ -+ /* disable all PHY interrupts */ - switch (pPrt->PhyType) { - case SK_PHY_BCOM: - /* Make sure that PHY is initialized */ - if (pPrt->PState != SK_PRT_RESET) { - /* NOT allowed if BCOM is in RESET state */ - /* Workaround BCOM Errata (#10523) all BCom */ -- /* Disable Power Management if link is down */ -+ /* disable Power Management if link is down */ - SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &Word); - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, - (SK_U16)(Word | PHY_B_AC_DIS_PM)); -@@ -3802,16 +4431,16 @@ int Port) /* Port Index (MAC_1 + n) */ - } - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* disable all GMAC IRQs */ -- SK_OUT8(IoC, GMAC_IRQ_MSK, 0); -- -+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_IRQ_MSK), 0); -+ - #ifndef VCPU -- /* Disable all PHY interrupts */ -+ /* disable all PHY interrupts */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, 0); --#endif /* VCPU */ -+#endif /* !VCPU */ - } - #endif /* YUKON */ - -@@ -3823,29 +4452,72 @@ int Port) /* Port Index (MAC_1 + n) */ - * - * SkXmSendCont() - Enable / Disable Send Continuous Mode - * -- * Description: enable / disable Send Continuous Mode on XMAC -+ * Description: enable / disable Send Continuous Mode on XMAC resp. -+ * Packet Generation on GPHY - * - * Returns: - * nothing - */ - void SkXmSendCont( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL Enable) /* Enable / Disable */ - { -+ SK_U16 Reg; -+ SK_U16 Save; - SK_U32 MdReg; - -- XM_IN32(IoC, Port, XM_MODE, &MdReg); -+ if (pAC->GIni.GIGenesis) { -+ XM_IN32(IoC, Port, XM_MODE, &MdReg); - -- if (Enable) { -- MdReg |= XM_MD_TX_CONT; -+ if (Enable) { -+ MdReg |= XM_MD_TX_CONT; -+ } -+ else { -+ MdReg &= ~XM_MD_TX_CONT; -+ } -+ /* setup Mode Register */ -+ XM_OUT32(IoC, Port, XM_MODE, MdReg); - } - else { -- MdReg &= ~XM_MD_TX_CONT; -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) { -+ /* select page 18 */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_ADDR, 18); -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PAGE_DATA, &Reg); -+ -+ Reg &= ~0x003c; /* clear bits 5..2 */ -+ -+ if (Enable) { -+ /* enable packet generation, 1518 byte length */ -+ Reg |= (BIT_5S | BIT_3S); -+ } -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, Reg); -+ } -+ else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL) { -+ /* save page register */ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_ADR, &Save); -+ -+ /* select page 6 to access Packet Generation register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 6); -+ -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Reg); -+ -+ Reg &= ~0x003f; /* clear bits 5..0 */ -+ -+ if (Enable) { -+ /* enable packet generation, 1518 byte length */ -+ Reg |= (BIT_3S | BIT_1S); -+ } -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Reg); -+ -+ /* restore page register */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, Save); -+ } - } -- /* setup Mode Register */ -- XM_OUT32(IoC, Port, XM_MODE, MdReg); - - } /* SkXmSendCont */ - -@@ -3860,8 +4532,8 @@ SK_BOOL Enable) /* Enable / Disable */ - * nothing - */ - void SkMacTimeStamp( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL Enable) /* Enable / Disable */ - { -@@ -3906,8 +4578,8 @@ SK_BOOL Enable) /* Enable / Disable */ - * is set true. - */ - void SkXmAutoNegLipaXmac( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_U16 IStatus) /* Interrupt Status word to analyse */ - { -@@ -3919,8 +4591,9 @@ SK_U16 IStatus) /* Interrupt Status word - (IStatus & (XM_IS_LIPA_RC | XM_IS_RX_PAGE | XM_IS_AND)) != 0) { - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("AutoNegLipa: AutoNeg detected on Port %d, IStatus=0x%04X\n", -+ ("AutoNegLipa: AutoNeg detected on Port %d, IStatus = 0x%04X\n", - Port, IStatus)); -+ - pPrt->PLipaAutoNeg = SK_LIPA_AUTO; - } - } /* SkXmAutoNegLipaXmac */ -@@ -3936,8 +4609,8 @@ SK_U16 IStatus) /* Interrupt Status word - * is set true. - */ - void SkMacAutoNegLipaPhy( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_U16 PhyStat) /* PHY Status word to analyse */ - { -@@ -3949,8 +4622,9 @@ SK_U16 PhyStat) /* PHY Status word to an - (PhyStat & PHY_ST_AN_OVER) != 0) { - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("AutoNegLipa: AutoNeg detected on Port %d, PhyStat=0x%04X\n", -+ ("AutoNegLipa: AutoNeg detected on Port %d, PhyStat = 0x%04X\n", - Port, PhyStat)); -+ - pPrt->PLipaAutoNeg = SK_LIPA_AUTO; - } - } /* SkMacAutoNegLipaPhy */ -@@ -3965,7 +4639,7 @@ SK_U16 PhyStat) /* PHY Status word to an - * - * Note: - * With an external PHY, some interrupt bits are not meaningfull any more: -- * - LinkAsyncEvent (bit #14) XM_IS_LNK_AE -+ * - LinkAsyncEvent (bit #14) XM_IS_LNK_AE - * - LinkPartnerReqConfig (bit #10) XM_IS_LIPA_RC - * - Page Received (bit #9) XM_IS_RX_PAGE - * - NextPageLoadedForXmt (bit #8) XM_IS_TX_PAGE -@@ -3977,22 +4651,23 @@ SK_U16 PhyStat) /* PHY Status word to an - * nothing - */ - void SkXmIrq( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -- SK_EVPARA Para; - SK_U16 IStatus; /* Interrupt status read from the XMAC */ - SK_U16 IStatus2; - #ifdef SK_SLIM -- SK_U64 OverflowStatus; --#endif -+ SK_U64 OverflowStatus; -+#else -+ SK_EVPARA Para; -+#endif /* SK_SLIM */ - - pPrt = &pAC->GIni.GP[Port]; -- -+ - XM_IN16(IoC, Port, XM_ISRC, &IStatus); -- -+ - /* LinkPartner Auto-negable? */ - if (pPrt->PhyType == SK_PHY_XMAC) { - SkXmAutoNegLipaXmac(pAC, IoC, Port, IStatus); -@@ -4003,7 +4678,7 @@ int Port) /* Port Index (MAC_1 + n) */ - XM_IS_RX_PAGE | XM_IS_TX_PAGE | - XM_IS_AND | XM_IS_INP_ASS); - } -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("XmacIrq Port %d Isr 0x%04X\n", Port, IStatus)); - -@@ -4113,49 +4788,55 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkGmIrq( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; - SK_U8 IStatus; /* Interrupt status */ - #ifdef SK_SLIM -- SK_U64 OverflowStatus; -+ SK_U64 OverflowStatus; - #else - SK_EVPARA Para; --#endif -+#endif /* SK_SLIM */ - - pPrt = &pAC->GIni.GP[Port]; -- -- SK_IN8(IoC, GMAC_IRQ_SRC, &IStatus); -- -+ -+ SK_IN8(IoC, MR_ADDR(Port, GMAC_IRQ_SRC), &IStatus); -+ - #ifdef XXX - /* LinkPartner Auto-negable? */ - SkMacAutoNegLipaPhy(pAC, IoC, Port, IStatus); - #endif /* XXX */ -- -+ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, -- ("GmacIrq Port %d Isr 0x%04X\n", Port, IStatus)); -+ ("GmacIrq Port %d Isr 0x%02X\n", Port, IStatus)); - - /* Combined Tx & Rx Counter Overflow SIRQ Event */ - if (IStatus & (GM_IS_RX_CO_OV | GM_IS_TX_CO_OV)) { - /* these IRQs will be cleared by reading GMACs register */ - #ifdef SK_SLIM -- SkGmOverflowStatus(pAC, IoC, Port, IStatus, &OverflowStatus); -+ SkGmOverflowStatus(pAC, IoC, Port, (SK_U16)IStatus, &OverflowStatus); - #else - Para.Para32[0] = (SK_U32)Port; - Para.Para32[1] = (SK_U32)IStatus; - SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_SIRQ_OVERFLOW, Para); --#endif -+#endif /* SK_SLIM */ - } - -+#ifndef SK_SLIM - if (IStatus & GM_IS_RX_FF_OR) { - /* clear GMAC Rx FIFO Overrun IRQ */ - SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_CLI_RX_FO); -+ -+ Para.Para64 = Port; -+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_RX_OVERFLOW, Para); -+ - #ifdef DEBUG - pPrt->PRxOverCnt++; - #endif /* DEBUG */ - } -+#endif /* !SK_SLIM */ - - if (IStatus & GM_IS_TX_FF_UR) { - /* clear GMAC Tx FIFO Underrun IRQ */ -@@ -4185,8 +4866,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * nothing - */ - void SkMacIrq( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port) /* Port Index (MAC_1 + n) */ - { - #ifdef GENESIS -@@ -4195,7 +4876,7 @@ int Port) /* Port Index (MAC_1 + n) */ - SkXmIrq(pAC, IoC, Port); - } - #endif /* GENESIS */ -- -+ - #ifdef YUKON - if (pAC->GIni.GIYukon) { - /* IRQ from GMAC */ -@@ -4222,8 +4903,8 @@ int Port) /* Port Index (MAC_1 + n) */ - * 1: something went wrong - */ - int SkXmUpdateStats( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port) /* Port Index (MAC_1 + n) */ - { - SK_GEPORT *pPrt; -@@ -4245,7 +4926,7 @@ unsigned int Port) /* Port Index (MAC_1 - do { - - XM_IN16(IoC, Port, XM_STAT_CMD, &StatReg); -- -+ - if (++WaitIndex > 10) { - - SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E021, SKERR_HWI_E021MSG); -@@ -4253,7 +4934,7 @@ unsigned int Port) /* Port Index (MAC_1 - return(1); - } - } while ((StatReg & (XM_SC_SNP_TXC | XM_SC_SNP_RXC)) != 0); -- -+ - return(0); - } /* SkXmUpdateStats */ - -@@ -4272,19 +4953,19 @@ unsigned int Port) /* Port Index (MAC_1 - * 1: something went wrong - */ - int SkXmMacStatistic( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port, /* Port Index (MAC_1 + n) */ - SK_U16 StatAddr, /* MIB counter base address */ --SK_U32 SK_FAR *pVal) /* ptr to return statistic value */ -+SK_U32 SK_FAR *pVal) /* Pointer to return statistic value */ - { - if ((StatAddr < XM_TXF_OK) || (StatAddr > XM_RXF_MAX_SZ)) { -- -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E022, SKERR_HWI_E022MSG); -- -+ - return(1); - } -- -+ - XM_IN32(IoC, Port, StatAddr, pVal); - - return(0); -@@ -4303,12 +4984,12 @@ SK_U32 SK_FAR *pVal) /* ptr to return st - * 1: something went wrong - */ - int SkXmResetCounter( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port) /* Port Index (MAC_1 + n) */ - { - XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC); -- /* Clear two times according to Errata #3 */ -+ /* Clear two times according to XMAC Errata #3 */ - XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC); - - return(0); -@@ -4335,11 +5016,11 @@ unsigned int Port) /* Port Index (MAC_1 - * 1: something went wrong - */ - int SkXmOverflowStatus( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port, /* Port Index (MAC_1 + n) */ --SK_U16 IStatus, /* Interupt Status from MAC */ --SK_U64 SK_FAR *pStatus) /* ptr for return overflow status value */ -+SK_U16 IStatus, /* Interrupt Status from MAC */ -+SK_U64 SK_FAR *pStatus) /* Pointer for return overflow status value */ - { - SK_U64 Status; /* Overflow status */ - SK_U32 RegVal; -@@ -4351,7 +5032,7 @@ SK_U64 SK_FAR *pStatus) /* ptr for retur - XM_IN32(IoC, Port, XM_RX_CNT_EV, &RegVal); - Status |= (SK_U64)RegVal << 32; - } -- -+ - if ((IStatus & XM_IS_TXC_OV) != 0) { - - XM_IN32(IoC, Port, XM_TX_CNT_EV, &RegVal); -@@ -4378,8 +5059,8 @@ SK_U64 SK_FAR *pStatus) /* ptr for retur - * 1: something went wrong - */ - int SkGmUpdateStats( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port) /* Port Index (MAC_1 + n) */ - { - return(0); -@@ -4400,24 +5081,27 @@ unsigned int Port) /* Port Index (MAC_1 - * 1: something went wrong - */ - int SkGmMacStatistic( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port, /* Port Index (MAC_1 + n) */ - SK_U16 StatAddr, /* MIB counter base address */ --SK_U32 SK_FAR *pVal) /* ptr to return statistic value */ -+SK_U32 SK_FAR *pVal) /* Pointer to return statistic value */ - { - - if ((StatAddr < GM_RXF_UC_OK) || (StatAddr > GM_TXE_FIFO_UR)) { -- -+ - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E022, SKERR_HWI_E022MSG); -- -- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, - ("SkGmMacStat: wrong MIB counter 0x%04X\n", StatAddr)); - return(1); - } -- -+ - GM_IN32(IoC, Port, StatAddr, pVal); - -+ /* dummy read after GM_IN32() */ -+ SK_IN16(IoC, B0_RAP, &StatAddr); -+ - return(0); - } /* SkGmMacStatistic */ - -@@ -4434,8 +5118,8 @@ SK_U32 SK_FAR *pVal) /* ptr to return st - * 1: something went wrong - */ - int SkGmResetCounter( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port) /* Port Index (MAC_1 + n) */ - { - SK_U16 Reg; /* Phy Address Register */ -@@ -4446,16 +5130,16 @@ unsigned int Port) /* Port Index (MAC_1 - - /* set MIB Clear Counter Mode */ - GM_OUT16(IoC, Port, GM_PHY_ADDR, Reg | GM_PAR_MIB_CLR); -- -+ - /* read all MIB Counters with Clear Mode set */ - for (i = 0; i < GM_MIB_CNT_SIZE; i++) { - /* the reset is performed only when the lower 16 bits are read */ - GM_IN16(IoC, Port, GM_MIB_CNT_BASE + 8*i, &Word); - } -- -+ - /* clear MIB Clear Counter Mode */ - GM_OUT16(IoC, Port, GM_PHY_ADDR, Reg); -- -+ - return(0); - } /* SkGmResetCounter */ - -@@ -4469,48 +5153,62 @@ unsigned int Port) /* Port Index (MAC_1 - * resulting counter overflow status is written to <pStatus>, whereas the - * the following bit coding is used: - * 63:56 - unused -- * 55:48 - TxRx interrupt register bit7:0 -- * 32:47 - Rx interrupt register -+ * 55:48 - TxRx interrupt register bit 7:0 -+ * 47:32 - Rx interrupt register - * 31:24 - unused -- * 23:16 - TxRx interrupt register bit15:8 -- * 15:0 - Tx interrupt register -+ * 23:16 - TxRx interrupt register bit 15:8 -+ * 15: 0 - Tx interrupt register - * - * Returns: - * 0: success - * 1: something went wrong - */ - int SkGmOverflowStatus( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - unsigned int Port, /* Port Index (MAC_1 + n) */ --SK_U16 IStatus, /* Interupt Status from MAC */ --SK_U64 SK_FAR *pStatus) /* ptr for return overflow status value */ -+SK_U16 IStatus, /* Interrupt Status from MAC */ -+SK_U64 SK_FAR *pStatus) /* Pointer for return overflow status value */ - { -- SK_U64 Status; /* Overflow status */ - SK_U16 RegVal; -+#ifndef SK_SLIM -+ SK_U64 Status; /* Overflow status */ - - Status = 0; -+#endif /* !SK_SLIM */ - - if ((IStatus & GM_IS_RX_CO_OV) != 0) { - /* this register is self-clearing after read */ - GM_IN16(IoC, Port, GM_RX_IRQ_SRC, &RegVal); -+ -+#ifndef SK_SLIM - Status |= (SK_U64)RegVal << 32; -+#endif /* !SK_SLIM */ - } -- -+ - if ((IStatus & GM_IS_TX_CO_OV) != 0) { - /* this register is self-clearing after read */ - GM_IN16(IoC, Port, GM_TX_IRQ_SRC, &RegVal); -+ -+#ifndef SK_SLIM - Status |= (SK_U64)RegVal; -+#endif /* !SK_SLIM */ - } -- -+ - /* this register is self-clearing after read */ - GM_IN16(IoC, Port, GM_TR_IRQ_SRC, &RegVal); -+ -+#ifndef SK_SLIM - /* Rx overflow interrupt register bits (LoByte)*/ - Status |= (SK_U64)((SK_U8)RegVal) << 48; - /* Tx overflow interrupt register bits (HiByte)*/ - Status |= (SK_U64)(RegVal >> 8) << 16; - - *pStatus = Status; -+#endif /* !SK_SLIM */ -+ -+ /* dummy read after GM_IN16() */ -+ SK_IN16(IoC, B0_RAP, &RegVal); - - return(0); - } /* SkGmOverflowStatus */ -@@ -4526,60 +5224,118 @@ SK_U64 SK_FAR *pStatus) /* ptr for retur - * gets the results if 'StartTest' is true - * - * NOTE: this test is meaningful only when link is down -- * -+ * - * Returns: - * 0: success - * 1: no YUKON copper - * 2: test in progress - */ - int SkGmCableDiagStatus( --SK_AC *pAC, /* adapter context */ --SK_IOC IoC, /* IO context */ -+SK_AC *pAC, /* Adapter Context */ -+SK_IOC IoC, /* I/O Context */ - int Port, /* Port Index (MAC_1 + n) */ - SK_BOOL StartTest) /* flag for start / get result */ - { - int i; -+ int CableDiagOffs; -+ int MdiPairs; -+ SK_BOOL FastEthernet; -+ SK_BOOL Yukon2; - SK_U16 RegVal; - SK_GEPORT *pPrt; - - pPrt = &pAC->GIni.GP[Port]; - - if (pPrt->PhyType != SK_PHY_MARV_COPPER) { -- -+ - return(1); - } - -+ Yukon2 = pAC->GIni.GIChipId == CHIP_ID_YUKON_XL || -+ pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U; -+ -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) { -+ -+ CableDiagOffs = PHY_MARV_FE_VCT_TX; -+ FastEthernet = SK_TRUE; -+ MdiPairs = 2; -+ } -+ else { -+ CableDiagOffs = Yukon2 ? PHY_MARV_PHY_CTRL : PHY_MARV_CABLE_DIAG; -+ FastEthernet = SK_FALSE; -+ MdiPairs = 4; -+ } -+ - if (StartTest) { -+ -+ /* set to RESET to avoid PortCheckUp */ -+ pPrt->PState = SK_PRT_RESET; -+ - /* only start the cable test */ -- if ((pPrt->PhyId1 & PHY_I1_REV_MSK) < 4) { -- /* apply TDR workaround from Marvell */ -- SkGmPhyWrite(pAC, IoC, Port, 29, 0x001e); -- -- SkGmPhyWrite(pAC, IoC, Port, 30, 0xcc00); -- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc800); -- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc400); -- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc000); -- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc100); -+ if (!FastEthernet) { -+ -+ if ((((pPrt->PhyId1 & PHY_I1_MOD_NUM) >> 4) == 2) && -+ ((pPrt->PhyId1 & PHY_I1_REV_MSK) < 4)) { -+ /* apply TDR workaround for model 2, rev. < 4 */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_ADDR, 0x001e); -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xcc00); -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc800); -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc400); -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc000); -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc100); -+ } -+ -+#ifdef YUKON_DBG -+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) { -+ /* set address to 1 for page 1 */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 1); -+ -+ /* disable waiting period */ -+ SkGmPhyWrite(pAC, IoC, Port, CableDiagOffs, -+ PHY_M_CABD_DIS_WAIT); -+ } -+#endif -+ if (Yukon2) { -+ /* set address to 5 for page 5 */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 5); -+ -+#ifdef YUKON_DBG -+ /* disable waiting period */ -+ SkGmPhyWrite(pAC, IoC, Port, CableDiagOffs + 1, -+ PHY_M_CABD_DIS_WAIT); -+#endif -+ } -+ else { -+ /* set address to 0 for MDI[0] (Page 0) */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0); -+ } - } -+ else { -+ RegVal = PHY_CT_RESET | PHY_CT_SP100; - -- /* set address to 0 for MDI[0] */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0); -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, RegVal); - -- /* Read Cable Diagnostic Reg */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, &RegVal); -+#ifdef xYUKON_DBG -+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_FE_SPEC_2, &RegVal); -+ /* disable waiting period */ -+ RegVal |= PHY_M_FESC_DIS_WAIT; -+ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_FE_SPEC_2, RegVal); -+#endif -+ } - - /* start Cable Diagnostic Test */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, -- (SK_U16)(RegVal | PHY_M_CABD_ENA_TEST)); -- -+ SkGmPhyWrite(pAC, IoC, Port, CableDiagOffs, PHY_M_CABD_ENA_TEST); -+ - return(0); - } -- -+ - /* Read Cable Diagnostic Reg */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, &RegVal); -+ SkGmPhyRead(pAC, IoC, Port, CableDiagOffs, &RegVal); - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, -- ("PHY Cable Diag.=0x%04X\n", RegVal)); -+ ("PHY Cable Diag. = 0x%04X\n", RegVal)); - - if ((RegVal & PHY_M_CABD_ENA_TEST) != 0) { - /* test is running */ -@@ -4587,16 +5343,24 @@ SK_BOOL StartTest) /* flag for start / g - } - - /* get the test results */ -- for (i = 0; i < 4; i++) { -- /* set address to i for MDI[i] */ -- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, (SK_U16)i); -+ for (i = 0; i < MdiPairs; i++) { -+ -+ if (!FastEthernet && !Yukon2) { -+ /* set address to i for MDI[i] */ -+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, (SK_U16)i); -+ } - - /* get Cable Diagnostic values */ -- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, &RegVal); -+ SkGmPhyRead(pAC, IoC, Port, CableDiagOffs, &RegVal); - - pPrt->PMdiPairLen[i] = (SK_U8)(RegVal & PHY_M_CABD_DIST_MSK); - - pPrt->PMdiPairSts[i] = (SK_U8)((RegVal & PHY_M_CABD_STAT_MSK) >> 13); -+ -+ if (FastEthernet || Yukon2) { -+ /* get next register */ -+ CableDiagOffs++; -+ } - } - - return(0); -@@ -4605,3 +5369,4 @@ SK_BOOL StartTest) /* flag for start / g - #endif /* YUKON */ - - /* End of file */ -+ ---- /dev/null 2006-03-09 09:48:23.770951496 +0300 -+++ ./drivers/net/sk98lin/sky2.c 2006-04-04 13:13:35.000000000 +0400 -@@ -0,0 +1,2717 @@ -+/****************************************************************************** -+ * -+ * Name: sky2.c -+ * Project: Yukon2 specific functions and implementations -+ * Version: $Revision: 1.35.2.39 $ -+ * Date: $Date: 2005/09/05 08:59:54 $ -+ * Purpose: The main driver source module -+ * -+ *****************************************************************************/ -+ -+/****************************************************************************** -+ * -+ * (C)Copyright 1998-2002 SysKonnect GmbH. -+ * (C)Copyright 2002-2005 Marvell. -+ * -+ * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet -+ * Server Adapters. -+ * -+ * Author: Ralph Roesler (rroesler@syskonnect.de) -+ * Mirko Lindner (mlindner@syskonnect.de) -+ * -+ * Address all question to: linux@syskonnect.de -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * The information in this file is provided "AS IS" without warranty. -+ * -+ *****************************************************************************/ -+ -+#include "h/skdrv1st.h" -+#include "h/skdrv2nd.h" -+#include <linux/tcp.h> -+ -+/****************************************************************************** -+ * -+ * Local Function Prototypes -+ * -+ *****************************************************************************/ -+ -+static void InitPacketQueues(SK_AC *pAC,int Port); -+static void GiveTxBufferToHw(SK_AC *pAC,SK_IOC IoC,int Port); -+static void GiveRxBufferToHw(SK_AC *pAC,SK_IOC IoC,int Port,SK_PACKET *pPacket); -+static SK_BOOL HandleReceives(SK_AC *pAC,int Port,SK_U16 Len,SK_U32 FrameStatus,SK_U16 Tcp1,SK_U16 Tcp2,SK_U32 Tist,SK_U16 Vlan); -+static void CheckForSendComplete(SK_AC *pAC,SK_IOC IoC,int Port,SK_PKT_QUEUE *pPQ,SK_LE_TABLE *pLETab,unsigned int Done); -+static void UnmapAndFreeTxPktBuffer(SK_AC *pAC,SK_PACKET *pSkPacket,int TxPort); -+static SK_BOOL AllocateAndInitLETables(SK_AC *pAC); -+static SK_BOOL AllocatePacketBuffersYukon2(SK_AC *pAC); -+static void FreeLETables(SK_AC *pAC); -+static void FreePacketBuffers(SK_AC *pAC); -+static SK_BOOL AllocAndMapRxBuffer(SK_AC *pAC,SK_PACKET *pSkPacket,int Port); -+#ifdef CONFIG_SK98LIN_NAPI -+static SK_BOOL HandleStatusLEs(SK_AC *pAC,int *WorkDone,int WorkToDo); -+#else -+static SK_BOOL HandleStatusLEs(SK_AC *pAC); -+#endif -+ -+extern void SkGeCheckTimer (DEV_NET *pNet); -+extern void SkLocalEventQueue( SK_AC *pAC, -+ SK_U32 Class, -+ SK_U32 Event, -+ SK_U32 Param1, -+ SK_U32 Param2, -+ SK_BOOL Flag); -+extern void SkLocalEventQueue64( SK_AC *pAC, -+ SK_U32 Class, -+ SK_U32 Event, -+ SK_U64 Param, -+ SK_BOOL Flag); -+ -+/****************************************************************************** -+ * -+ * Local Variables -+ * -+ *****************************************************************************/ -+ -+#define MAX_NBR_RX_BUFFERS_IN_HW 0x15 -+static SK_U8 NbrRxBuffersInHW; -+#define FLUSH_OPC(le) -+ -+/****************************************************************************** -+ * -+ * Global Functions -+ * -+ *****************************************************************************/ -+ -+int SkY2Xmit( struct sk_buff *skb, struct SK_NET_DEVICE *dev); -+void FillReceiveTableYukon2(SK_AC *pAC,SK_IOC IoC,int Port); -+ -+/***************************************************************************** -+ * -+ * SkY2RestartStatusUnit - restarts teh status unit -+ * -+ * Description: -+ * Reenables the status unit after any De-Init (e.g. when altering -+ * the sie of the MTU via 'ifconfig a.b.c.d mtu xxx') -+ * -+ * Returns: N/A -+ */ -+void SkY2RestartStatusUnit( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> SkY2RestartStatusUnit\n")); -+ -+ /* -+ ** It might be that the TX timer is not started. Therefore -+ ** it is initialized here -> to be more investigated! -+ */ -+ SK_OUT32(pAC->IoBase, STAT_TX_TIMER_INI, HW_MS_TO_TICKS(pAC,10)); -+ -+ pAC->StatusLETable.Done = 0; -+ pAC->StatusLETable.Put = 0; -+ pAC->StatusLETable.HwPut = 0; -+ SkGeY2InitStatBmu(pAC, pAC->IoBase, &pAC->StatusLETable); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== SkY2RestartStatusUnit\n")); -+} -+ -+/***************************************************************************** -+ * -+ * SkY2RlmtSend - sends out a single RLMT notification -+ * -+ * Description: -+ * This function sends out an RLMT frame -+ * -+ * Returns: -+ * > 0 - on succes: the number of bytes in the message -+ * = 0 - on resource shortage: this frame sent or dropped, now -+ * the ring is full ( -> set tbusy) -+ * < 0 - on failure: other problems ( -> return failure to upper layers) -+ */ -+int SkY2RlmtSend ( -+SK_AC *pAC, /* pointer to adapter control context */ -+int PortNr, /* index of port the packet(s) shall be send to */ -+struct sk_buff *pMessage) /* pointer to send-message */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("=== SkY2RlmtSend\n")); -+#if 0 -+ return -1; // temporarily do not send out RLMT frames -+#endif -+ skb_shinfo(pMessage)->nr_frags = (2*MAX_SKB_FRAGS) + PortNr; -+ return(SkY2Xmit(pMessage, pAC->dev[PortNr])); // SkY2Xmit needs device -+} -+ -+/***************************************************************************** -+ * -+ * SkY2AllocateResources - Allocates all required resources for Yukon2 -+ * -+ * Description: -+ * This function allocates all memory needed for the Yukon2. -+ * It maps also RX buffers to the LETables and initializes the -+ * status list element table. -+ * -+ * Returns: -+ * SK_TRUE, if all resources could be allocated and setup succeeded -+ * SK_FALSE, if an error -+ */ -+SK_BOOL SkY2AllocateResources ( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ int CurrMac; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("==> SkY2AllocateResources\n")); -+ -+ /* -+ ** Initialize the packet queue variables first -+ */ -+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) { -+ InitPacketQueues(pAC, CurrMac); -+ } -+ -+ /* -+ ** Get sufficient memory for the LETables -+ */ -+ if (!AllocateAndInitLETables(pAC)) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR, -+ ("No memory for LETable.\n")); -+ return(SK_FALSE); -+ } -+ -+ /* -+ ** Allocate and intialize memory for both RX and TX -+ ** packet and fragment buffers. On an error, free -+ ** previously allocated LETable memory and quit. -+ */ -+ if (!AllocatePacketBuffersYukon2(pAC)) { -+ FreeLETables(pAC); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR, -+ ("No memory for Packetbuffers.\n")); -+ return(SK_FALSE); -+ } -+ -+ /* -+ ** Rx and Tx LE tables will be initialized in SkGeOpen() -+ ** -+ ** It might be that the TX timer is not started. Therefore -+ ** it is initialized here -> to be more investigated! -+ */ -+ SK_OUT32(pAC->IoBase, STAT_TX_TIMER_INI, HW_MS_TO_TICKS(pAC,10)); -+ SkGeY2InitStatBmu(pAC, pAC->IoBase, &pAC->StatusLETable); -+ -+ pAC->MaxUnusedRxLeWorking = MAX_UNUSED_RX_LE_WORKING; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("<== SkY2AllocateResources\n")); -+ -+ return (SK_TRUE); -+} -+ -+/***************************************************************************** -+ * -+ * SkY2FreeResources - Frees previously allocated resources of Yukon2 -+ * -+ * Description: -+ * This function frees all previously allocated memory of the Yukon2. -+ * -+ * Returns: N/A -+ */ -+void SkY2FreeResources ( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> SkY2FreeResources\n")); -+ -+ FreeLETables(pAC); -+ FreePacketBuffers(pAC); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== SkY2FreeResources\n")); -+} -+ -+/***************************************************************************** -+ * -+ * SkY2AllocateRxBuffers - Allocates the receive buffers for a port -+ * -+ * Description: -+ * This function allocated all the RX buffers of the Yukon2. -+ * -+ * Returns: N/A -+ */ -+void SkY2AllocateRxBuffers ( -+SK_AC *pAC, /* pointer to adapter control context */ -+SK_IOC IoC, /* I/O control context */ -+int Port) /* port index of RX */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("==> SkY2AllocateRxBuffers (Port %c)\n", Port)); -+ -+ FillReceiveTableYukon2(pAC, IoC, Port); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("<== SkY2AllocateRxBuffers\n")); -+} -+ -+/***************************************************************************** -+ * -+ * SkY2FreeRxBuffers - Free's all allocates RX buffers of -+ * -+ * Description: -+ * This function frees all RX buffers of the Yukon2 for a single port -+ * -+ * Returns: N/A -+ */ -+void SkY2FreeRxBuffers ( -+SK_AC *pAC, /* pointer to adapter control context */ -+SK_IOC IoC, /* I/O control context */ -+int Port) /* port index of RX */ -+{ -+ SK_PACKET *pSkPacket; -+ unsigned long Flags; /* for POP/PUSH macros */ -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> SkY2FreeRxBuffers (Port %c)\n", Port)); -+ -+ if (pAC->RxPort[Port].ReceivePacketTable != NULL) { -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket); -+ while (pSkPacket != NULL) { -+ if ((pSkPacket->pFrag) != NULL) { -+ pci_unmap_page(pAC->PciDev, -+ (dma_addr_t) pSkPacket->pFrag->pPhys, -+ pSkPacket->pFrag->FragLen - 2, -+ PCI_DMA_FROMDEVICE); -+ -+ /* wipe out any rubbish data that may interfere */ -+ skb_shinfo(pSkPacket->pMBuf)->nr_frags = 0; -+ skb_shinfo(pSkPacket->pMBuf)->frag_list = NULL; -+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf); -+ pSkPacket->pMBuf = NULL; -+ pSkPacket->pFrag->pPhys = (SK_U64) 0; -+ pSkPacket->pFrag->pVirt = NULL; -+ } -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket); -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket); -+ } -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== SkY2FreeRxBuffers\n")); -+} -+ -+/***************************************************************************** -+ * -+ * SkY2FreeTxBuffers - Free's any currently maintained Tx buffer -+ * -+ * Description: -+ * This function frees the TX buffers of the Yukon2 for a single port -+ * which might be in use by a transmit action -+ * -+ * Returns: N/A -+ */ -+void SkY2FreeTxBuffers ( -+SK_AC *pAC, /* pointer to adapter control context */ -+SK_IOC IoC, /* I/O control context */ -+int Port) /* port index of TX */ -+{ -+ SK_PACKET *pSkPacket; -+ SK_FRAG *pSkFrag; -+ unsigned long Flags; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> SkY2FreeTxBuffers (Port %c)\n", Port)); -+ -+ if (pAC->TxPort[Port][0].TransmitPacketTable != NULL) { -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxAQ_working, pSkPacket); -+ while (pSkPacket != NULL) { -+ if ((pSkFrag = pSkPacket->pFrag) != NULL) { -+ UnmapAndFreeTxPktBuffer(pAC, pSkPacket, Port); -+ } -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->TxPort[Port][0].TxQ_free, pSkPacket); -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxAQ_working, pSkPacket); -+ } -+#if USE_SYNC_TX_QUEUE -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxSQ_working, pSkPacket); -+ while (pSkPacket != NULL) { -+ if ((pSkFrag = pSkPacket->pFrag) != NULL) { -+ UnmapAndFreeTxPktBuffer(pAC, pSkPacket, Port); -+ } -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->TxPort[Port][0].TxQ_free, pSkPacket); -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxSQ_working, pSkPacket); -+ } -+#endif -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== SkY2FreeTxBuffers\n")); -+} -+ -+/***************************************************************************** -+ * -+ * SkY2Isr - handle a receive IRQ for all yukon2 cards -+ * -+ * Description: -+ * This function is called when a receive IRQ is set. (only for yukon2) -+ * HandleReceives does the deferred processing of all outstanding -+ * interrupt operations. -+ * -+ * Returns: N/A -+ */ -+SkIsrRetVar SkY2Isr ( -+int irq, /* the irq we have received (might be shared!) */ -+void *dev_id, /* current device id */ -+struct pt_regs *ptregs) /* not used by our driver */ -+{ -+ struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id; -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ SK_U32 IntSrc; -+ unsigned long Flags; -+#ifndef CONFIG_SK98LIN_NAPI -+ SK_BOOL handledStatLE = SK_FALSE; -+#else -+ SK_BOOL SetIntMask = SK_FALSE; -+#endif -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("==> SkY2Isr\n")); -+ -+ SK_IN32(pAC->IoBase, B0_Y2_SP_ISRC2, &IntSrc); -+ -+ if ((IntSrc == 0) && (!pNet->NetConsoleMode)){ -+ SK_OUT32(pAC->IoBase, B0_Y2_SP_ICR, 2); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("No Interrupt\n ==> SkY2Isr\n")); -+ return SkIsrRetNone; -+ -+ } -+ -+#ifdef Y2_RECOVERY -+ if (pNet->InRecover) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Already in recover\n ==> SkY2Isr\n")); -+ SK_OUT32(pAC->IoBase, B0_Y2_SP_ICR, 2); -+ return SkIsrRetNone; -+ } -+#endif -+ -+#ifdef CONFIG_SK98LIN_NAPI -+ if (netif_rx_schedule_prep(pAC->dev[0])) { -+ pAC->GIni.GIValIrqMask &= ~(Y2_IS_STAT_BMU); -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ SetIntMask = SK_TRUE; -+ __netif_rx_schedule(pAC->dev[0]); -+ } -+ -+ if (netif_rx_schedule_prep(pAC->dev[1])) { -+ if (!SetIntMask) { -+ pAC->GIni.GIValIrqMask &= ~(Y2_IS_STAT_BMU); -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ } -+ __netif_rx_schedule(pAC->dev[1]); -+ } -+#else -+ handledStatLE = HandleStatusLEs(pAC); -+#endif -+ -+ /* -+ ** Check for Special Interrupts -+ */ -+ if ((IntSrc & ~Y2_IS_STAT_BMU) || pAC->CheckQueue || pNet->TimerExpired) { -+ pAC->CheckQueue = SK_FALSE; -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); -+ SkGeSirqIsr(pAC, pAC->IoBase, IntSrc); -+ SkEventDispatcher(pAC, pAC->IoBase); -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+ } -+ -+ /* Speed enhancement for a2 chipsets */ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_42)) { -+ spin_lock_irqsave(&pAC->SetPutIndexLock, Flags); -+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_XA1,0), &pAC->TxPort[0][0].TxALET); -+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_R1,0), &pAC->RxPort[0].RxLET); -+ spin_unlock_irqrestore(&pAC->SetPutIndexLock, Flags); -+ } -+ -+ /* -+ ** Reenable interrupts and signal end of ISR -+ */ -+ SK_OUT32(pAC->IoBase, B0_Y2_SP_ICR, 2); -+ -+ /* -+ ** Stop and restart TX timer in case a Status LE was handled -+ */ -+#ifndef CONFIG_SK98LIN_NAPI -+ if ((HW_FEATURE(pAC, HWF_WA_DEV_43_418)) && (handledStatLE)) { -+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_STOP); -+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_START); -+ } -+#endif -+ -+ if (!(IS_Q_EMPTY(&(pAC->TxPort[0][TX_PRIO_LOW].TxAQ_waiting)))) { -+ GiveTxBufferToHw(pAC, pAC->IoBase, 0); -+ } -+ if (!(IS_Q_EMPTY(&(pAC->TxPort[1][TX_PRIO_LOW].TxAQ_waiting)))) { -+ GiveTxBufferToHw(pAC, pAC->IoBase, 1); -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("<== SkY2Isr\n")); -+ -+ return SkIsrRetHandled; -+} /* SkY2Isr */ -+ -+/***************************************************************************** -+ * -+ * SkY2Xmit - Linux frame transmit function for Yukon2 -+ * -+ * Description: -+ * The system calls this function to send frames onto the wire. -+ * It puts the frame in the tx descriptor ring. If the ring is -+ * full then, the 'tbusy' flag is set. -+ * -+ * Returns: -+ * 0, if everything is ok -+ * !=0, on error -+ * -+ * WARNING: -+ * returning 1 in 'tbusy' case caused system crashes (double -+ * allocated skb's) !!! -+ */ -+int SkY2Xmit( -+struct sk_buff *skb, /* socket buffer to be sent */ -+struct SK_NET_DEVICE *dev) /* via which device? */ -+{ -+ DEV_NET *pNet = (DEV_NET*) dev->priv; -+ SK_AC *pAC = pNet->pAC; -+ SK_U8 FragIdx = 0; -+ SK_PACKET *pSkPacket; -+ SK_FRAG *PrevFrag; -+ SK_FRAG *CurrFrag; -+ SK_PKT_QUEUE *pWorkQueue; /* corresponding TX queue */ -+ SK_PKT_QUEUE *pWaitQueue; -+ SK_PKT_QUEUE *pFreeQueue; -+ SK_LE_TABLE *pLETab; /* corresponding LETable */ -+ skb_frag_t *sk_frag; -+ SK_U64 PhysAddr; -+ unsigned long Flags; -+ unsigned int Port; -+ int CurrFragCtr; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("==> SkY2Xmit\n")); -+ -+ /* -+ ** Get port and return if no free packet is available -+ */ -+ if (skb_shinfo(skb)->nr_frags > MAX_SKB_FRAGS) { -+ Port = skb_shinfo(skb)->nr_frags - (2*MAX_SKB_FRAGS); -+ skb_shinfo(skb)->nr_frags = 0; -+ } else { -+ Port = (pAC->RlmtNets == 2) ? pNet->PortNr : pAC->ActivePort; -+ } -+ -+ if (IS_Q_EMPTY(&(pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free))) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("Not free packets available for send\n")); -+ return 1; /* zero bytes sent! */ -+ } -+ -+ /* -+ ** Put any new packet to be sent in the waiting queue and -+ ** handle also any possible fragment of that packet. -+ */ -+ pWorkQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working); -+ pWaitQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting); -+ pFreeQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free); -+ pLETab = &(pAC->TxPort[Port][TX_PRIO_LOW].TxALET); -+ -+ /* -+ ** Normal send operations require only one fragment, because -+ ** only one sk_buff data area is passed. -+ ** In contradiction to this, scatter-gather (zerocopy) send -+ ** operations might pass one or more additional fragments -+ ** where each fragment needs a separate fragment info packet. -+ */ -+ if (((skb_shinfo(skb)->nr_frags + 1) * MAX_FRAG_OVERHEAD) > -+ NUM_FREE_LE_IN_TABLE(pLETab)) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("Not enough LE available for send\n")); -+ return 1; /* zero bytes sent! */ -+ } -+ -+ if ((skb_shinfo(skb)->nr_frags + 1) > MAX_NUM_FRAGS) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("Not even one fragment available for send\n")); -+ return 1; /* zero bytes sent! */ -+ } -+ -+ /* -+ ** Get first packet from free packet queue -+ */ -+ POP_FIRST_PKT_FROM_QUEUE(pFreeQueue, pSkPacket); -+ if(pSkPacket == NULL) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("Could not obtain free packet used for xmit\n")); -+ return 1; /* zero bytes sent! */ -+ } -+ -+ pSkPacket->pFrag = &(pSkPacket->FragArray[FragIdx]); -+ -+ /* -+ ** map the sk_buff to be available for the adapter -+ */ -+ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev, -+ virt_to_page(skb->data), -+ ((unsigned long) skb->data & ~PAGE_MASK), -+ skb_headlen(skb), -+ PCI_DMA_TODEVICE); -+ pSkPacket->pMBuf = skb; -+ pSkPacket->pFrag->pPhys = PhysAddr; -+ pSkPacket->pFrag->FragLen = skb_headlen(skb); -+ pSkPacket->pFrag->pNext = NULL; /* initial has no next default */ -+ pSkPacket->NumFrags = skb_shinfo(skb)->nr_frags + 1; -+ -+ PrevFrag = pSkPacket->pFrag; -+ -+ /* -+ ** Each scatter-gather fragment need to be mapped... -+ */ -+ for ( CurrFragCtr = 0; -+ CurrFragCtr < skb_shinfo(skb)->nr_frags; -+ CurrFragCtr++) { -+ FragIdx++; -+ sk_frag = &skb_shinfo(skb)->frags[CurrFragCtr]; -+ CurrFrag = &(pSkPacket->FragArray[FragIdx]); -+ -+ /* -+ ** map the sk_buff to be available for the adapter -+ */ -+ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev, -+ sk_frag->page, -+ sk_frag->page_offset, -+ sk_frag->size, -+ PCI_DMA_TODEVICE); -+ -+ CurrFrag->pPhys = PhysAddr; -+ CurrFrag->FragLen = sk_frag->size; -+ CurrFrag->pNext = NULL; -+ -+ /* -+ ** Add the new fragment to the list of fragments -+ */ -+ PrevFrag->pNext = CurrFrag; -+ PrevFrag = CurrFrag; -+ } -+ -+ /* -+ ** Add packet to waiting packets queue -+ */ -+ PUSH_PKT_AS_LAST_IN_QUEUE(pWaitQueue, pSkPacket); -+ GiveTxBufferToHw(pAC, pAC->IoBase, Port); -+ dev->trans_start = jiffies; -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("<== SkY2Xmit(return 0)\n")); -+ return (0); -+} /* SkY2Xmit */ -+ -+#ifdef CONFIG_SK98LIN_NAPI -+/***************************************************************************** -+ * -+ * SkY2Poll - NAPI Rx polling callback for Yukon2 chipsets -+ * -+ * Description: -+ * Called by the Linux system in case NAPI polling is activated -+ * -+ * Returns -+ * The number of work data still to be handled -+ * -+ * Notes -+ * The slowpath lock needs to be set because HW accesses may -+ * interfere with slowpath events (e.g. TWSI) -+ */ -+int SkY2Poll( -+struct net_device *dev, /* device that needs to be polled */ -+int *budget) /* how many budget do we have? */ -+{ -+ SK_AC *pAC = ((DEV_NET*)(dev->priv))->pAC; -+ int WorkToDo = min(*budget, dev->quota); -+ int WorkDone = 0; -+ SK_BOOL handledStatLE = SK_FALSE; -+ unsigned long Flags; -+ -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); -+ handledStatLE = HandleStatusLEs(pAC, &WorkDone, WorkToDo); -+ -+ *budget -= WorkDone; -+ dev->quota -= WorkDone; -+ -+ if(WorkDone < WorkToDo) { -+ netif_rx_complete(dev); -+ pAC->GIni.GIValIrqMask |= (Y2_IS_STAT_BMU); -+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); -+ if ((HW_FEATURE(pAC, HWF_WA_DEV_43_418)) && (handledStatLE)) { -+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_STOP); -+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_START); -+ } -+ } -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+ return (WorkDone >= WorkToDo); -+} /* SkY2Poll */ -+#endif -+ -+/****************************************************************************** -+ * -+ * SkY2PortStop - stop a port on Yukon2 -+ * -+ * Description: -+ * This function stops a port of the Yukon2 chip. This stop -+ * stop needs to be performed in a specific order: -+ * -+ * a) Stop the Prefetch unit -+ * b) Stop the Port (MAC, PHY etc.) -+ * -+ * Returns: N/A -+ */ -+void SkY2PortStop( -+SK_AC *pAC, /* adapter control context */ -+SK_IOC IoC, /* I/O control context (address of adapter registers) */ -+int Port, /* port to stop (MAC_1 + n) */ -+int Dir, /* StopDirection (SK_STOP_RX, SK_STOP_TX, SK_STOP_ALL) */ -+int RstMode) /* Reset Mode (SK_SOFT_RST, SK_HARD_RST) */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> SkY2PortStop (Port %c)\n", 'A' + Port)); -+ -+ /* -+ ** Stop the HW -+ */ -+ SkGeStopPort(pAC, IoC, Port, Dir, RstMode); -+ -+ /* -+ ** Move any TX packet from work queues into the free queue again -+ ** and initialize the TX LETable variables -+ */ -+ SkY2FreeTxBuffers(pAC, pAC->IoBase, Port); -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Bmu.RxTx.TcpWp = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Bmu.RxTx.MssValue = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.BufHighAddr = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Done = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Put = 0; -+ // pAC->GIni.GP[Port].PState = SK_PRT_STOP; -+ -+ /* -+ ** Move any RX packet from work queue into the waiting queue -+ ** and initialize the RX LETable variables -+ */ -+ SkY2FreeRxBuffers(pAC, pAC->IoBase, Port); -+ pAC->RxPort[Port].RxLET.BufHighAddr = 0; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== SkY2PortStop()\n")); -+} -+ -+/****************************************************************************** -+ * -+ * SkY2PortStart - start a port on Yukon2 -+ * -+ * Description: -+ * This function starts a port of the Yukon2 chip. This start -+ * action needs to be performed in a specific order: -+ * -+ * a) Initialize the LET indices (PUT/GET to 0) -+ * b) Initialize the LET in HW (enables also prefetch unit) -+ * c) Move all RX buffers from waiting queue to working queue -+ * which involves also setting up of RX list elements -+ * d) Initialize the FIFO settings of Yukon2 (Watermark etc.) -+ * e) Initialize the Port (MAC, PHY etc.) -+ * f) Initialize the MC addresses -+ * -+ * Returns: N/A -+ */ -+void SkY2PortStart( -+SK_AC *pAC, /* adapter control context */ -+SK_IOC IoC, /* I/O control context (address of adapter registers) */ -+int Port) /* port to start */ -+{ -+ // SK_GEPORT *pPrt = &pAC->GIni.GP[Port]; -+ SK_HWLE *pLE; -+ SK_U32 DWord; -+ SK_U32 PrefetchReg; /* register for Put index */ -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> SkY2PortStart (Port %c)\n", 'A' + Port)); -+ -+ /* -+ ** Initialize the LET indices -+ */ -+ pAC->RxPort[Port].RxLET.Done = 0; -+ pAC->RxPort[Port].RxLET.Put = 0; -+ pAC->RxPort[Port].RxLET.HwPut = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Done = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Put = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.HwPut = 0; -+ if (HW_SYNC_TX_SUPPORTED(pAC)) { -+ pAC->TxPort[Port][TX_PRIO_LOW].TxSLET.Done = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxSLET.Put = 0; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxSLET.HwPut = 0; -+ } -+ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) { -+ /* -+ ** It might be that we have to limit the RX buffers -+ ** effectively passed to HW. Initialize the start -+ ** value in that case... -+ */ -+ NbrRxBuffersInHW = 0; -+ } -+ -+ /* -+ ** TODO on dual net adapters we need to check if -+ ** StatusLETable need to be set... -+ ** -+ ** pAC->StatusLETable.Done = 0; -+ ** pAC->StatusLETable.Put = 0; -+ ** pAC->StatusLETable.HwPut = 0; -+ ** SkGeY2InitPrefetchUnit(pAC, pAC->IoBase, Q_ST, &pAC->StatusLETable); -+ */ -+ -+ /* -+ ** Initialize the LET in HW (enables also prefetch unit) -+ */ -+ SkGeY2InitPrefetchUnit(pAC, IoC,(Port == 0) ? Q_R1 : Q_R2, -+ &pAC->RxPort[Port].RxLET); -+ SkGeY2InitPrefetchUnit( pAC, IoC,(Port == 0) ? Q_XA1 : Q_XA2, -+ &pAC->TxPort[Port][TX_PRIO_LOW].TxALET); -+ if (HW_SYNC_TX_SUPPORTED(pAC)) { -+ SkGeY2InitPrefetchUnit( pAC, IoC, (Port == 0) ? Q_XS1 : Q_XS2, -+ &pAC->TxPort[Port][TX_PRIO_HIGH].TxSLET); -+ } -+ -+ -+ /* -+ ** Using new values for the watermarks and the timer for -+ ** low latency optimization -+ */ -+ if (pAC->LowLatency) { -+ SK_OUT8(IoC, STAT_FIFO_WM, 1); -+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 1); -+ SK_OUT32(IoC, STAT_LEV_TIMER_INI, 50); -+ SK_OUT32(IoC, STAT_ISR_TIMER_INI, 10); -+ } -+ -+ -+ /* -+ ** Initialize the Port (MAC, PHY etc.) -+ */ -+ if (SkGeInitPort(pAC, IoC, Port)) { -+ if (Port == 0) { -+ printk("%s: SkGeInitPort A failed.\n",pAC->dev[0]->name); -+ } else { -+ printk("%s: SkGeInitPort B failed.\n",pAC->dev[1]->name); -+ } -+ } -+ -+ if (IS_GMAC(pAC)) { -+ /* disable Rx GMAC FIFO Flush Mode */ -+ SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8) GMF_RX_F_FL_OFF); -+ } -+ -+ /* -+ ** Initialize the MC addresses -+ */ -+ SkAddrMcUpdate(pAC,IoC, Port); -+ -+ SkMacRxTxEnable(pAC, IoC,Port); -+ -+ if (pAC->RxPort[Port].UseRxCsum) { -+ SkGeRxCsum(pAC, IoC, Port, SK_TRUE); -+ -+ GET_RX_LE(pLE, &pAC->RxPort[Port].RxLET); -+ RXLE_SET_STACS1(pLE, pAC->CsOfs1); -+ RXLE_SET_STACS2(pLE, pAC->CsOfs2); -+ RXLE_SET_CTRL(pLE, 0); -+ -+ RXLE_SET_OPC(pLE, OP_TCPSTART | HW_OWNER); -+ FLUSH_OPC(pLE); -+ if (Port == 0) { -+ PrefetchReg=Y2_PREF_Q_ADDR(Q_R1,PREF_UNIT_PUT_IDX_REG); -+ } else { -+ PrefetchReg=Y2_PREF_Q_ADDR(Q_R2,PREF_UNIT_PUT_IDX_REG); -+ } -+ DWord = GET_PUT_IDX(&pAC->RxPort[Port].RxLET); -+ SK_OUT32(IoC, PrefetchReg, DWord); -+ UPDATE_HWPUT_IDX(&pAC->RxPort[Port].RxLET); -+ } -+ -+ pAC->GIni.GP[Port].PState = SK_PRT_RUN; -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== SkY2PortStart()\n")); -+} -+ -+/****************************************************************************** -+ * -+ * Local Functions -+ * -+ *****************************************************************************/ -+ -+/***************************************************************************** -+ * -+ * InitPacketQueues - initialize SW settings of packet queues -+ * -+ * Description: -+ * This function will initialize the packet queues for a port. -+ * -+ * Returns: N/A -+ */ -+static void InitPacketQueues( -+SK_AC *pAC, /* pointer to adapter control context */ -+int Port) /* index of port to be initialized */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("==> InitPacketQueues(Port %c)\n", 'A' + Port)); -+ -+ pAC->RxPort[Port].RxQ_working.pHead = NULL; -+ pAC->RxPort[Port].RxQ_working.pTail = NULL; -+ spin_lock_init(&pAC->RxPort[Port].RxQ_working.QueueLock); -+ -+ pAC->RxPort[Port].RxQ_waiting.pHead = NULL; -+ pAC->RxPort[Port].RxQ_waiting.pTail = NULL; -+ spin_lock_init(&pAC->RxPort[Port].RxQ_waiting.QueueLock); -+ -+ pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free.pHead = NULL; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free.pTail = NULL; -+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free.QueueLock); -+ -+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working.pHead = NULL; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working.pTail = NULL; -+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working.QueueLock); -+ -+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting.pHead = NULL; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting.pTail = NULL; -+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting.QueueLock); -+ -+#if USE_SYNC_TX_QUEUE -+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_working.pHead = NULL; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_working.pTail = NULL; -+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_working.QueueLock); -+ -+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_waiting.pHead = NULL; -+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_waiting.pTail = NULL; -+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_waiting.QueueLock); -+#endif -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("<== InitPacketQueues(Port %c)\n", 'A' + Port)); -+} /* InitPacketQueues */ -+ -+/***************************************************************************** -+ * -+ * GiveTxBufferToHw - commits a previously allocated DMA area to HW -+ * -+ * Description: -+ * This functions gives transmit buffers to HW. If no list elements -+ * are available the buffers will be queued. -+ * -+ * Notes: -+ * This function can run only once in a system at one time. -+ * -+ * Returns: N/A -+ */ -+static void GiveTxBufferToHw( -+SK_AC *pAC, /* pointer to adapter control context */ -+SK_IOC IoC, /* I/O control context (address of registers) */ -+int Port) /* port index for which the buffer is used */ -+{ -+ SK_HWLE *pLE; -+ SK_PACKET *pSkPacket; -+ SK_FRAG *pFrag; -+ SK_PKT_QUEUE *pWorkQueue; /* corresponding TX queue */ -+ SK_PKT_QUEUE *pWaitQueue; -+ SK_LE_TABLE *pLETab; /* corresponding LETable */ -+ SK_BOOL SetOpcodePacketFlag; -+ SK_U32 HighAddress; -+ SK_U32 LowAddress; -+ SK_U16 TcpSumStart; -+ SK_U16 TcpSumWrite; -+ SK_U8 OpCode; -+ SK_U8 Ctrl; -+ unsigned long Flags; -+ unsigned long LockFlag; -+ int Protocol; -+#ifdef NETIF_F_TSO -+ SK_U16 Mss; -+ int TcpOptLen; -+ int IpTcpLen; -+#endif -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("==> GiveTxBufferToHw\n")); -+ -+ if (IS_Q_EMPTY(&(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting))) { -+ return; -+ } -+ -+ spin_lock_irqsave(&pAC->TxQueueLock, LockFlag); -+ -+ /* -+ ** Initialize queue settings -+ */ -+ pWorkQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working); -+ pWaitQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting); -+ pLETab = &(pAC->TxPort[Port][TX_PRIO_LOW].TxALET); -+ -+ POP_FIRST_PKT_FROM_QUEUE(pWaitQueue, pSkPacket); -+ while (pSkPacket != NULL) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("\tWe have a packet to send %p\n", pSkPacket)); -+ -+ /* -+ ** the first frag of a packet gets opcode OP_PACKET -+ */ -+ SetOpcodePacketFlag = SK_TRUE; -+ pFrag = pSkPacket->pFrag; -+ -+ /* -+ ** fill list elements with data from fragments -+ */ -+ while (pFrag != NULL) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("\tGet LE\n")); -+#ifdef NETIF_F_TSO -+ Mss = skb_shinfo(pSkPacket->pMBuf)->tso_size; -+ if (Mss) { -+ TcpOptLen = ((pSkPacket->pMBuf->h.th->doff - 5) * 4); -+ IpTcpLen = ((pSkPacket->pMBuf->nh.iph->ihl * 4) + -+ sizeof(struct tcphdr)); -+ Mss += (TcpOptLen + IpTcpLen + C_LEN_ETHERMAC_HEADER); -+ } -+ if (pLETab->Bmu.RxTx.MssValue != Mss) { -+ pLETab->Bmu.RxTx.MssValue = Mss; -+ /* Take a new LE for TSO from the table */ -+ GET_TX_LE(pLE, pLETab); -+ -+#if 0 -+ if(pSkPacket->VlanId) { -+ TXLE_SET_OPC(pLE, OP_LRGLENVLAN | HW_OWNER); -+ TXLE_SET_VLAN(pLE, pSkPacket->VlanId); -+ pSkPacket->VlanId = 0; -+ Ctrl |= INS_VLAN; -+ } else { -+#endif -+ TXLE_SET_OPC(pLE, OP_LRGLEN | HW_OWNER); -+#if 0 -+ } -+#endif -+ /* set maximum segment size for new packet */ -+ TXLE_SET_LSLEN(pLE, pLETab->Bmu.RxTx.MssValue); -+ FLUSH_OPC(pLE) ; -+ } -+#endif -+ GET_TX_LE(pLE, pLETab); -+ Ctrl = 0; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("\tGot empty LE %p idx %d\n", pLE, GET_PUT_IDX(pLETab))); -+ -+ SK_DBG_DUMP_TX_LE(pLE); -+ -+ LowAddress = (SK_U32) (pFrag->pPhys & 0xffffffff); -+ HighAddress = (SK_U32) (pFrag->pPhys >> 32); -+ -+ if (HighAddress != pLETab->BufHighAddr) { -+ /* set opcode high part of the address in one LE */ -+ OpCode = OP_ADDR64 | HW_OWNER; -+ -+ /* Set now the 32 high bits of the address */ -+ TXLE_SET_ADDR( pLE, HighAddress); -+ -+ /* Set the opcode into the LE */ -+ TXLE_SET_OPC(pLE, OpCode); -+ -+ /* Flush the LE to memory */ -+ FLUSH_OPC(pLE); -+ -+ /* remember the HighAddress we gave to the Hardware */ -+ pLETab->BufHighAddr = HighAddress; -+ -+ /* get a new LE because we filled one with high address */ -+ GET_TX_LE(pLE, pLETab); -+ } -+ -+ /* -+ ** TCP checksum offload -+ */ -+ if ((pSkPacket->pMBuf->ip_summed == CHECKSUM_HW) && -+ (SetOpcodePacketFlag == SK_TRUE)) { -+ Protocol = ((SK_U8)pSkPacket->pMBuf->data[C_OFFSET_IPPROTO] & 0xff); -+ /* if (Protocol & C_PROTO_ID_IP) { Ctrl = 0; } */ -+ if (Protocol & C_PROTO_ID_TCP) { -+ Ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; -+ /* TCP Checksum Calculation Start Position */ -+ TcpSumStart = C_LEN_ETHERMAC_HEADER + IP_HDR_LEN; -+ /* TCP Checksum Write Position */ -+ TcpSumWrite = TcpSumStart + TCP_CSUM_OFFS; -+ } else { -+ Ctrl = UDPTCP | CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; -+ /* TCP Checksum Calculation Start Position */ -+ TcpSumStart = ETHER_MAC_HDR_LEN + IP_HDR_LEN; -+ /* UDP Checksum Write Position */ -+ TcpSumWrite = TcpSumStart + UDP_CSUM_OFFS; -+ } -+ -+ if ((Ctrl) && (pLETab->Bmu.RxTx.TcpWp != TcpSumWrite)) { -+ /* Update the last value of the write position */ -+ pLETab->Bmu.RxTx.TcpWp = TcpSumWrite; -+ -+ /* Set the Lock field for this LE: */ -+ /* Checksum calculation for one packet only */ -+ TXLE_SET_LCKCS(pLE, 1); -+ -+ /* Set the start position for checksum. */ -+ TXLE_SET_STACS(pLE, TcpSumStart); -+ -+ /* Set the position where the checksum will be writen */ -+ TXLE_SET_WRICS(pLE, TcpSumWrite); -+ -+ /* Set the initial value for checksum */ -+ /* PseudoHeader CS passed from Linux -> 0! */ -+ TXLE_SET_INICS(pLE, 0); -+ -+ /* Set the opcode for tcp checksum */ -+ TXLE_SET_OPC(pLE, OP_TCPLISW | HW_OWNER); -+ -+ /* Flush the LE to memory */ -+ FLUSH_OPC(pLE); -+ -+ /* get a new LE because we filled one with data for checksum */ -+ GET_TX_LE(pLE, pLETab); -+ } -+ } /* end TCP offload handling */ -+ -+ TXLE_SET_ADDR(pLE, LowAddress); -+ TXLE_SET_LEN(pLE, pFrag->FragLen); -+ -+ if (SetOpcodePacketFlag){ -+#ifdef NETIF_F_TSO -+ if (Mss) { -+ OpCode = OP_LARGESEND | HW_OWNER; -+ } else { -+#endif -+ OpCode = OP_PACKET| HW_OWNER; -+#ifdef NETIF_F_TSO -+ } -+#endif -+ SetOpcodePacketFlag = SK_FALSE; -+ } else { -+ /* Follow packet in a sequence has always OP_BUFFER */ -+ OpCode = OP_BUFFER | HW_OWNER; -+ } -+ -+ /* Check if the low address is near the upper limit. */ -+ CHECK_LOW_ADDRESS(pLETab->BufHighAddr, LowAddress, pFrag->FragLen); -+ -+ pFrag = pFrag->pNext; -+ if (pFrag == NULL) { -+ /* mark last fragment */ -+ Ctrl |= EOP; -+ } -+ TXLE_SET_CTRL(pLE, Ctrl); -+ TXLE_SET_OPC(pLE, OpCode); -+ FLUSH_OPC(pLE); -+ -+ SK_DBG_DUMP_TX_LE(pLE); -+ } -+ -+ /* -+ ** Remember next LE for tx complete -+ */ -+ pSkPacket->NextLE = GET_PUT_IDX(pLETab); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("\tNext LE for pkt %p is %d\n", pSkPacket, pSkPacket->NextLE)); -+ -+ /* -+ ** Add packet to working packets queue -+ */ -+ PUSH_PKT_AS_LAST_IN_QUEUE(pWorkQueue, pSkPacket); -+ -+ /* -+ ** give transmit start command -+ */ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_42)) { -+ spin_lock(&pAC->SetPutIndexLock); -+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_XA1,0), &pAC->TxPort[0][0].TxALET); -+ spin_unlock(&pAC->SetPutIndexLock); -+ } else { -+ /* write put index */ -+ if (Port == 0) { -+ SK_OUT32(pAC->IoBase, -+ Y2_PREF_Q_ADDR(Q_XA1,PREF_UNIT_PUT_IDX_REG), -+ GET_PUT_IDX(&pAC->TxPort[0][0].TxALET)); -+ UPDATE_HWPUT_IDX(&pAC->TxPort[0][0].TxALET); -+ } else { -+ SK_OUT32(pAC->IoBase, -+ Y2_PREF_Q_ADDR(Q_XA2, PREF_UNIT_PUT_IDX_REG), -+ GET_PUT_IDX(&pAC->TxPort[1][0].TxALET)); -+ UPDATE_HWPUT_IDX(&pAC->TxPort[1][0].TxALET); -+ } -+ } -+ -+ if (IS_Q_EMPTY(&(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting))) { -+ break; /* get out of while */ -+ } -+ POP_FIRST_PKT_FROM_QUEUE(pWaitQueue, pSkPacket); -+ } /* while (pSkPacket != NULL) */ -+ -+ spin_unlock_irqrestore(&pAC->TxQueueLock, LockFlag); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("<== GiveTxBufferToHw\n")); -+ return; -+} /* GiveTxBufferToHw */ -+ -+/*********************************************************************** -+ * -+ * GiveRxBufferToHw - commits a previously allocated DMA area to HW -+ * -+ * Description: -+ * This functions gives receive buffers to HW. If no list elements -+ * are available the buffers will be queued. -+ * -+ * Notes: -+ * This function can run only once in a system at one time. -+ * -+ * Returns: N/A -+ */ -+static void GiveRxBufferToHw( -+SK_AC *pAC, /* pointer to adapter control context */ -+SK_IOC IoC, /* I/O control context (address of registers) */ -+int Port, /* port index for which the buffer is used */ -+SK_PACKET *pPacket) /* receive buffer(s) */ -+{ -+ SK_HWLE *pLE; -+ SK_LE_TABLE *pLETab; -+ SK_BOOL Done = SK_FALSE; /* at least on LE changed? */ -+ SK_U32 LowAddress; -+ SK_U32 HighAddress; -+ SK_U32 PrefetchReg; /* register for Put index */ -+ unsigned NumFree; -+ unsigned Required; -+ unsigned long Flags; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("==> GiveRxBufferToHw(Port %c, Packet %p)\n", 'A' + Port, pPacket)); -+ -+ pLETab = &pAC->RxPort[Port].RxLET; -+ -+ if (Port == 0) { -+ PrefetchReg = Y2_PREF_Q_ADDR(Q_R1, PREF_UNIT_PUT_IDX_REG); -+ } else { -+ PrefetchReg = Y2_PREF_Q_ADDR(Q_R2, PREF_UNIT_PUT_IDX_REG); -+ } -+ -+ if (pPacket != NULL) { -+ /* -+ ** For the time being, we have only one packet passed -+ ** to this function which might be changed in future! -+ */ -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket); -+ } -+ -+ /* -+ ** now pPacket contains the very first waiting packet -+ */ -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket); -+ while (pPacket != NULL) { -+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) { -+ if (NbrRxBuffersInHW >= MAX_NBR_RX_BUFFERS_IN_HW) { -+ PUSH_PKT_AS_FIRST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<== GiveRxBufferToHw()\n")); -+ return; -+ } -+ NbrRxBuffersInHW++; -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("Try to add packet %p\n", pPacket)); -+ -+ /* -+ ** Check whether we have enough listelements: -+ ** -+ ** we have to take into account that each fragment -+ ** may need an additional list element for the high -+ ** part of the address here I simplified it by -+ ** using MAX_FRAG_OVERHEAD maybe it's worth to split -+ ** this constant for Rx and Tx or to calculate the -+ ** real number of needed LE's -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("\tNum %d Put %d Done %d Free %d %d\n", -+ pLETab->Num, pLETab->Put, pLETab->Done, -+ NUM_FREE_LE_IN_TABLE(pLETab), -+ (NUM_FREE_LE_IN_TABLE(pLETab)))); -+ -+ Required = pPacket->NumFrags + MAX_FRAG_OVERHEAD; -+ NumFree = NUM_FREE_LE_IN_TABLE(pLETab); -+ if (NumFree) { -+ NumFree--; -+ } -+ -+ if (Required > NumFree ) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("\tOut of LEs have %d need %d\n", -+ NumFree, Required)); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("\tWaitQueue starts with packet %p\n", pPacket)); -+ PUSH_PKT_AS_FIRST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket); -+ if (Done) { -+ /* -+ ** write Put index to BMU or Polling Unit and make the LE's -+ ** available for the hardware -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("\tWrite new Put Idx\n")); -+ -+ SK_OUT32(IoC, PrefetchReg, GET_PUT_IDX(pLETab)); -+ UPDATE_HWPUT_IDX(pLETab); -+ } -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<== GiveRxBufferToHw()\n")); -+ return; -+ } else { -+ if (!AllocAndMapRxBuffer(pAC, pPacket, Port)) { -+ /* -+ ** Failure while allocating sk_buff might -+ ** be due to temporary short of resources -+ ** Maybe next time buffers are available. -+ ** Until this, the packet remains in the -+ ** RX waiting queue... -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("Failed to allocate Rx buffer\n")); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("WaitQueue starts with packet %p\n", pPacket)); -+ PUSH_PKT_AS_FIRST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket); -+ if (Done) { -+ /* -+ ** write Put index to BMU or Polling -+ ** Unit and make the LE's -+ ** available for the hardware -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("\tWrite new Put Idx\n")); -+ -+ SK_OUT32(IoC, PrefetchReg, GET_PUT_IDX(pLETab)); -+ UPDATE_HWPUT_IDX(pLETab); -+ } -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<== GiveRxBufferToHw()\n")); -+ return; -+ } -+ } -+ Done = SK_TRUE; -+ -+ LowAddress = (SK_U32) (pPacket->pFrag->pPhys & 0xffffffff); -+ HighAddress = (SK_U32) (pPacket->pFrag->pPhys >> 32); -+ if (HighAddress != pLETab->BufHighAddr) { -+ /* get a new LE for high address */ -+ GET_RX_LE(pLE, pLETab); -+ -+ /* Set now the 32 high bits of the address */ -+ RXLE_SET_ADDR(pLE, HighAddress); -+ -+ /* Set the control bits of the address */ -+ RXLE_SET_CTRL(pLE, 0); -+ -+ /* Set the opcode into the LE */ -+ RXLE_SET_OPC(pLE, (OP_ADDR64 | HW_OWNER)); -+ -+ /* Flush the LE to memory */ -+ FLUSH_OPC(pLE); -+ -+ /* remember the HighAddress we gave to the Hardware */ -+ pLETab->BufHighAddr = HighAddress; -+ } -+ -+ /* -+ ** Fill data into listelement -+ */ -+ GET_RX_LE(pLE, pLETab); -+ RXLE_SET_ADDR(pLE, LowAddress); -+ RXLE_SET_LEN(pLE, pPacket->pFrag->FragLen); -+ RXLE_SET_CTRL(pLE, 0); -+ RXLE_SET_OPC(pLE, (OP_PACKET | HW_OWNER)); -+ FLUSH_OPC(pLE); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("=== LE filled\n")); -+ -+ SK_DBG_DUMP_RX_LE(pLE); -+ -+ /* -+ ** Remember next LE for rx complete -+ */ -+ pPacket->NextLE = GET_PUT_IDX(pLETab); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("\tPackets Next LE is %d\n", pPacket->NextLE)); -+ -+ /* -+ ** Add packet to working receive buffer queue and get -+ ** any next packet out of the waiting queue -+ */ -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_working, pPacket); -+ if (IS_Q_EMPTY(&(pAC->RxPort[Port].RxQ_waiting))) { -+ break; /* get out of while processing */ -+ } -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket); -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("\tWaitQueue is empty\n")); -+ -+ if (Done) { -+ /* -+ ** write Put index to BMU or Polling Unit and make the LE's -+ ** available for the hardware -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("\tWrite new Put Idx\n")); -+ -+ /* Speed enhancement for a2 chipsets */ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_42)) { -+ spin_lock_irqsave(&pAC->SetPutIndexLock, Flags); -+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_R1,0), pLETab); -+ spin_unlock_irqrestore(&pAC->SetPutIndexLock, Flags); -+ } else { -+ /* write put index */ -+ if (Port == 0) { -+ SK_OUT32(IoC, -+ Y2_PREF_Q_ADDR(Q_R1, PREF_UNIT_PUT_IDX_REG), -+ GET_PUT_IDX(pLETab)); -+ } else { -+ SK_OUT32(IoC, -+ Y2_PREF_Q_ADDR(Q_R2, PREF_UNIT_PUT_IDX_REG), -+ GET_PUT_IDX(pLETab)); -+ } -+ -+ /* Update put index */ -+ UPDATE_HWPUT_IDX(pLETab); -+ } -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<== GiveRxBufferToHw()\n")); -+} /* GiveRxBufferToHw */ -+ -+/*********************************************************************** -+ * -+ * FillReceiveTableYukon2 - map any waiting RX buffers to HW -+ * -+ * Description: -+ * If the list element table contains more empty elements than -+ * specified this function tries to refill them. -+ * -+ * Notes: -+ * This function can run only once per port in a system at one time. -+ * -+ * Returns: N/A -+ */ -+void FillReceiveTableYukon2( -+SK_AC *pAC, /* pointer to adapter control context */ -+SK_IOC IoC, /* I/O control context */ -+int Port) /* port index of RX */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("==> FillReceiveTableYukon2 (Port %c)\n", 'A' + Port)); -+ -+ if (NUM_FREE_LE_IN_TABLE(&pAC->RxPort[Port].RxLET) > -+ pAC->MaxUnusedRxLeWorking) { -+ -+ /* -+ ** Give alle waiting receive buffers down -+ ** The queue holds all RX packets that -+ ** need a fresh allocation of the sk_buff. -+ */ -+ if (pAC->RxPort[Port].RxQ_waiting.pHead != NULL) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("Waiting queue is not empty -> give it to HW")); -+ GiveRxBufferToHw(pAC, IoC, Port, NULL); -+ } -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<== FillReceiveTableYukon2 ()\n")); -+} /* FillReceiveTableYukon2 */ -+ -+/****************************************************************************** -+ * -+ * -+ * HandleReceives - will pass any ready RX packet to kernel -+ * -+ * Description: -+ * This functions handles a received packet. It checks wether it is -+ * valid, updates the receive list element table and gives the receive -+ * buffer to Linux -+ * -+ * Notes: -+ * This function can run only once per port at one time in the system. -+ * -+ * Returns: N/A -+ */ -+static SK_BOOL HandleReceives( -+SK_AC *pAC, /* adapter control context */ -+int Port, /* port on which a packet has been received */ -+SK_U16 Len, /* number of bytes which was actually received */ -+SK_U32 FrameStatus, /* MAC frame status word */ -+SK_U16 Tcp1, /* first hw checksum */ -+SK_U16 Tcp2, /* second hw checksum */ -+SK_U32 Tist, /* timestamp */ -+SK_U16 Vlan) /* Vlan Id */ -+{ -+ -+ SK_PACKET *pSkPacket; -+ SK_LE_TABLE *pLETab; -+ SK_MBUF *pRlmtMbuf; /* buffer for giving RLMT frame */ -+ struct sk_buff *pMsg; /* ptr to message holding frame */ -+#ifdef __ia64__ -+ struct sk_buff *pNewMsg; /* used when IP aligning */ -+#endif -+ -+#ifdef CONFIG_SK98LIN_NAPI -+ SK_BOOL SlowPathLock = SK_FALSE; -+#else -+ SK_BOOL SlowPathLock = SK_TRUE; -+#endif -+ SK_BOOL IsGoodPkt; -+ SK_BOOL IsBc; -+ SK_BOOL IsMc; -+ SK_EVPARA EvPara; /* an event parameter union */ -+ SK_I16 LenToFree; /* must be signed integer */ -+ -+ unsigned long Flags; /* for spin lock */ -+ unsigned int RlmtNotifier; -+ unsigned short Type; -+ int IpFrameLength; -+ int FrameLength; /* total length of recvd frame */ -+ int HeaderLength; -+ int NumBytes; -+ int Result; -+ int Offset = 0; -+ -+#ifdef Y2_SYNC_CHECK -+ SK_U16 MyTcp; -+#endif -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("==> HandleReceives (Port %c)\n", 'A' + Port)); -+ -+ /* -+ ** initialize vars for selected port -+ */ -+ pLETab = &pAC->RxPort[Port].RxLET; -+ -+ /* -+ ** check whether we want to receive this packet -+ */ -+ SK_Y2_RXSTAT_CHECK_PKT(Len, FrameStatus, IsGoodPkt); -+ -+ /* -+ ** Remember length to free (in case of RxBuffer overruns; -+ ** unlikely, but might happen once in a while) -+ */ -+ LenToFree = (SK_I16) Len; -+ -+ /* -+ ** maybe we put these two checks into the SK_RXDESC_CHECK_PKT macro too -+ */ -+ if (Len > pAC->RxPort[Port].RxBufSize) { -+ IsGoodPkt = SK_FALSE; -+ } -+ -+ /* -+ ** take first receive buffer out of working queue -+ */ -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket); -+ if (pSkPacket == NULL) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_ERROR, -+ ("Packet not available. NULL pointer.\n")); -+ return(SK_TRUE); -+ } -+ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) { -+ NbrRxBuffersInHW--; -+ } -+ -+ /* -+ ** Verify the received length of the frame! Note that having -+ ** multiple RxBuffers being aware of one single receive packet -+ ** (one packet spread over multiple RxBuffers) is not supported -+ ** by this driver! -+ */ -+ if ((Len > pAC->RxPort[Port].RxBufSize) || -+ (Len > (SK_U16) pSkPacket->PacketLen)) { -+ IsGoodPkt = SK_FALSE; -+ } -+ -+ /* -+ ** Reset own bit in LE's between old and new Done index -+ ** This is not really necessary but makes debugging easier -+ */ -+ CLEAR_LE_OWN_FROM_DONE_TO(pLETab, pSkPacket->NextLE); -+ -+ /* -+ ** Free the list elements for new Rx buffers -+ */ -+ SET_DONE_INDEX(pLETab, pSkPacket->NextLE); -+ pMsg = pSkPacket->pMBuf; -+ FrameLength = Len; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("Received frame of length %d on port %d\n",FrameLength, Port)); -+ -+ if (!IsGoodPkt) { -+ /* -+ ** release the DMA mapping -+ */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) -+ pci_dma_sync_single(pAC->PciDev, -+ (dma_addr_t) pSkPacket->pFrag->pPhys, -+ pSkPacket->pFrag->FragLen, -+ PCI_DMA_FROMDEVICE); -+ -+#else -+ pci_dma_sync_single_for_cpu(pAC->PciDev, -+ (dma_addr_t) pSkPacket->pFrag->pPhys, -+ pSkPacket->pFrag->FragLen, -+ PCI_DMA_FROMDEVICE); -+#endif -+ -+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf); -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<== HandleReceives (Port %c)\n", 'A' + Port)); -+ -+ /* -+ ** Sanity check for RxBuffer overruns... -+ */ -+ LenToFree = LenToFree - (pSkPacket->pFrag->FragLen); -+ while (LenToFree > 0) { -+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket); -+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) { -+ NbrRxBuffersInHW--; -+ } -+ CLEAR_LE_OWN_FROM_DONE_TO(pLETab, pSkPacket->NextLE); -+ SET_DONE_INDEX(pLETab, pSkPacket->NextLE); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) -+ pci_dma_sync_single(pAC->PciDev, -+ (dma_addr_t) pSkPacket->pFrag->pPhys, -+ pSkPacket->pFrag->FragLen, -+ PCI_DMA_FROMDEVICE); -+#else -+ pci_dma_sync_single_for_device(pAC->PciDev, -+ (dma_addr_t) pSkPacket->pFrag->pPhys, -+ pSkPacket->pFrag->FragLen, -+ PCI_DMA_FROMDEVICE); -+#endif -+ -+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf); -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket); -+ LenToFree = LenToFree - ((SK_I16)(pSkPacket->pFrag->FragLen)); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("<==HandleReceives (Port %c) drop faulty len pkt(2)\n",'A'+Port)); -+ } -+ return(SK_TRUE); -+ } else { -+ /* -+ ** Release the DMA mapping -+ */ -+ pci_unmap_single(pAC->PciDev, -+ pSkPacket->pFrag->pPhys, -+ pAC->RxPort[Port].RxBufSize, -+ PCI_DMA_FROMDEVICE); -+ -+ skb_put(pMsg, FrameLength); /* set message len */ -+ pMsg->ip_summed = CHECKSUM_NONE; /* initial default */ -+ -+#ifdef Y2_SYNC_CHECK -+ pAC->FramesWithoutSyncCheck++; -+ if (pAC->FramesWithoutSyncCheck > Y2_RESYNC_WATERMARK) { -+ if ((Tcp1 != 1) || (Tcp2 != 0)) { -+ pAC->FramesWithoutSyncCheck = 0; -+ MyTcp = (SK_U16) SkCsCalculateChecksum( -+ &pMsg->data[14], -+ FrameLength - 14); -+ if (MyTcp != Tcp1) { -+ /* Queue port reset event */ -+ SkLocalEventQueue(pAC, SKGE_DRV, -+ SK_DRV_RECOVER,Port,-1,SK_FALSE); -+ } -+ } -+ } -+#endif -+ -+ if (pAC->RxPort[Port].UseRxCsum) { -+ Type = ntohs(*((short*)&pMsg->data[12])); -+ if (Type == 0x800) { -+ *((char *)&(IpFrameLength)) = pMsg->data[16]; -+ *(((char *)&(IpFrameLength))+1) = pMsg->data[17]; -+ IpFrameLength = ntohs(IpFrameLength); -+ HeaderLength = FrameLength - IpFrameLength; -+ if (HeaderLength == 0xe) { -+ Result = -+ SkCsGetReceiveInfo(pAC,&pMsg->data[14],Tcp1,Tcp2, Port); -+ if ((Result == SKCS_STATUS_IP_FRAGMENT) || -+ (Result == SKCS_STATUS_IP_CSUM_OK) || -+ (Result == SKCS_STATUS_TCP_CSUM_OK) || -+ (Result == SKCS_STATUS_UDP_CSUM_OK)) { -+ pMsg->ip_summed = CHECKSUM_UNNECESSARY; -+ } else if ((Result == SKCS_STATUS_TCP_CSUM_ERROR) || -+ (Result == SKCS_STATUS_UDP_CSUM_ERROR) || -+ (Result == SKCS_STATUS_IP_CSUM_ERROR_UDP) || -+ (Result == SKCS_STATUS_IP_CSUM_ERROR_TCP) || -+ (Result == SKCS_STATUS_IP_CSUM_ERROR)) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("skge: CRC error. Frame dropped!\n")); -+ DEV_KFREE_SKB_ANY(pMsg); -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket); -+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<==HandleReceives(Port %c)\n",'A'+Port)); -+ return(SK_TRUE); -+ } else { -+ pMsg->ip_summed = CHECKSUM_NONE; -+ } -+ } /* end if (HeaderLength == valid) */ -+ } /* end if (Type == 0x800) -> IP frame */ -+ } /* end if (pRxPort->UseRxCsum) */ -+ -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS,("V")); -+ RlmtNotifier = SK_RLMT_RX_PROTOCOL; -+ -+ IsBc = (FrameStatus & GMR_FS_BC) ? SK_TRUE : SK_FALSE; -+ SK_RLMT_PRE_LOOKAHEAD(pAC,Port,FrameLength, -+ IsBc,&Offset,&NumBytes); -+ if (NumBytes != 0) { -+ IsMc = (FrameStatus & GMR_FS_MC) ? SK_TRUE : SK_FALSE; -+ SK_RLMT_LOOKAHEAD(pAC,Port,&pMsg->data[Offset], -+ IsBc,IsMc,&RlmtNotifier); -+ } -+ -+ if (RlmtNotifier == SK_RLMT_RX_PROTOCOL) { -+ SK_DBG_MSG(NULL,SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS,("W")); -+ if ((Port == pAC->ActivePort)||(pAC->RlmtNets == 2)) { -+ /* send up only frames from active port */ -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS,("U")); -+#ifdef xDEBUG -+ DumpMsg(pMsg, "Rx"); -+#endif -+ SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC, -+ FrameLength, Port); -+#ifdef __ia64__ -+ pNewMsg = alloc_skb(pMsg->len, GFP_ATOMIC); -+ skb_reserve(pNewMsg, 2); /* to align IP */ -+ SK_MEMCPY(pNewMsg->data,pMsg->data,pMsg->len); -+ pNewMsg->ip_summed = pMsg->ip_summed; -+ skb_put(pNewMsg, pMsg->len); -+ DEV_KFREE_SKB_ANY(pMsg); -+ pMsg = pNewMsg; -+#endif -+ pMsg->dev = pAC->dev[Port]; -+ pMsg->protocol = eth_type_trans(pMsg, -+ pAC->dev[Port]); -+ netif_rx(pMsg); -+ pAC->dev[Port]->last_rx = jiffies; -+ } else { /* drop frame */ -+ SK_DBG_MSG(NULL,SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS,("D")); -+ DEV_KFREE_SKB_ANY(pMsg); -+ } -+ } else { /* This is an RLMT-packet! */ -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS,("R")); -+ pRlmtMbuf = SkDrvAllocRlmtMbuf(pAC, -+ pAC->IoBase, FrameLength); -+ if (pRlmtMbuf != NULL) { -+ pRlmtMbuf->pNext = NULL; -+ pRlmtMbuf->Length = FrameLength; -+ pRlmtMbuf->PortIdx = Port; -+ EvPara.pParaPtr = pRlmtMbuf; -+ SK_MEMCPY((char*)(pRlmtMbuf->pData), -+ (char*)(pMsg->data),FrameLength); -+ -+ if (SlowPathLock == SK_TRUE) { -+ spin_lock_irqsave(&pAC->SlowPathLock, Flags); -+ SkEventQueue(pAC, SKGE_RLMT, -+ SK_RLMT_PACKET_RECEIVED, -+ EvPara); -+ pAC->CheckQueue = SK_TRUE; -+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -+ } else { -+ SkEventQueue(pAC, SKGE_RLMT, -+ SK_RLMT_PACKET_RECEIVED, -+ EvPara); -+ pAC->CheckQueue = SK_TRUE; -+ } -+ -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS,("Q")); -+ } -+ if (pAC->dev[Port]->flags & (IFF_PROMISC | IFF_ALLMULTI)) { -+#ifdef __ia64__ -+ pNewMsg = alloc_skb(pMsg->len, GFP_ATOMIC); -+ skb_reserve(pNewMsg, 2); /* to align IP */ -+ SK_MEMCPY(pNewMsg->data,pMsg->data,pMsg->len); -+ pNewMsg->ip_summed = pMsg->ip_summed; -+ pNewMsg->len = pMsg->len; -+ DEV_KFREE_SKB_ANY(pMsg); -+ pMsg = pNewMsg; -+#endif -+ pMsg->dev = pAC->dev[Port]; -+ pMsg->protocol = eth_type_trans(pMsg,pAC->dev[Port]); -+ netif_rx(pMsg); -+ pAC->dev[Port]->last_rx = jiffies; -+ } else { -+ DEV_KFREE_SKB_ANY(pMsg); -+ } -+ } /* if packet for rlmt */ -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket); -+ } /* end if-else (IsGoodPkt) */ -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<== HandleReceives (Port %c)\n", 'A' + Port)); -+ return(SK_TRUE); -+ -+} /* HandleReceives */ -+ -+/*********************************************************************** -+ * -+ * CheckForSendComplete - Frees any freeable Tx bufffer -+ * -+ * Description: -+ * This function checks the queues of a port for completed send -+ * packets and returns these packets back to the OS. -+ * -+ * Notes: -+ * This function can run simultaneously for both ports if -+ * the OS function OSReturnPacket() can handle this, -+ * -+ * Such a send complete does not mean, that the packet is really -+ * out on the wire. We just know that the adapter has copied it -+ * into its internal memory and the buffer in the systems memory -+ * is no longer needed. -+ * -+ * Returns: N/A -+ */ -+static void CheckForSendComplete( -+SK_AC *pAC, /* pointer to adapter control context */ -+SK_IOC IoC, /* I/O control context */ -+int Port, /* port index */ -+SK_PKT_QUEUE *pPQ, /* tx working packet queue to check */ -+SK_LE_TABLE *pLETab, /* corresponding list element table */ -+unsigned int Done) /* done index reported for this LET */ -+{ -+ SK_PACKET *pSkPacket; -+ SK_PKT_QUEUE SendCmplPktQ = { NULL, NULL, SPIN_LOCK_UNLOCKED }; -+ SK_BOOL DoWakeQueue = SK_FALSE; -+ unsigned long Flags; -+ unsigned Put; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("==> CheckForSendComplete(Port %c)\n", 'A' + Port)); -+ -+ /* -+ ** Reset own bit in LE's between old and new Done index -+ ** This is not really necessairy but makes debugging easier -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Clear Own Bits in TxTable from %d to %d\n", -+ pLETab->Done, (Done == 0) ? -+ NUM_LE_IN_TABLE(pLETab) : -+ (Done - 1))); -+ -+ spin_lock_irqsave(&(pPQ->QueueLock), Flags); -+ -+ CLEAR_LE_OWN_FROM_DONE_TO(pLETab, Done); -+ -+ Put = GET_PUT_IDX(pLETab); -+ -+ /* -+ ** Check whether some packets have been completed -+ */ -+ PLAIN_POP_FIRST_PKT_FROM_QUEUE(pPQ, pSkPacket); -+ while (pSkPacket != NULL) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Check Completion of Tx packet %p\n", pSkPacket)); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Put %d NewDone %d NextLe of Packet %d\n", Put, Done, -+ pSkPacket->NextLE)); -+ -+ if ((Put > Done) && -+ ((pSkPacket->NextLE > Put) || (pSkPacket->NextLE <= Done))) { -+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Packet finished (a)\n")); -+ } else if ((Done > Put) && -+ (pSkPacket->NextLE > Put) && (pSkPacket->NextLE <= Done)) { -+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Packet finished (b)\n")); -+ } else if ((Done == TXA_MAX_LE-1) && (Put == 0) && (pSkPacket->NextLE == 0)) { -+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Packet finished (b)\n")); -+ DoWakeQueue = SK_TRUE; -+ } else if (Done == Put) { -+ /* all packets have been sent */ -+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Packet finished (c)\n")); -+ } else { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("Packet not yet finished\n")); -+ PLAIN_PUSH_PKT_AS_FIRST_IN_QUEUE(pPQ, pSkPacket); -+ break; -+ } -+ PLAIN_POP_FIRST_PKT_FROM_QUEUE(pPQ, pSkPacket); -+ } -+ spin_unlock_irqrestore(&(pPQ->QueueLock), Flags); -+ -+ /* -+ ** Set new done index in list element table -+ */ -+ SET_DONE_INDEX(pLETab, Done); -+ -+ /* -+ ** All TX packets that are send complete should be added to -+ ** the free queue again for new sents to come -+ */ -+ pSkPacket = SendCmplPktQ.pHead; -+ while (pSkPacket != NULL) { -+ while (pSkPacket->pFrag != NULL) { -+ pci_unmap_page(pAC->PciDev, -+ (dma_addr_t) pSkPacket->pFrag->pPhys, -+ pSkPacket->pFrag->FragLen, -+ PCI_DMA_FROMDEVICE); -+ pSkPacket->pFrag = pSkPacket->pFrag->pNext; -+ } -+ -+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf); -+ pSkPacket->pMBuf = NULL; -+ pSkPacket = pSkPacket->pNext; /* get next packet */ -+ } -+ -+ /* -+ ** Append the available TX packets back to free queue -+ */ -+ if (SendCmplPktQ.pHead != NULL) { -+ spin_lock_irqsave(&(pAC->TxPort[Port][0].TxQ_free.QueueLock), Flags); -+ if (pAC->TxPort[Port][0].TxQ_free.pTail != NULL) { -+ pAC->TxPort[Port][0].TxQ_free.pTail->pNext = SendCmplPktQ.pHead; -+ pAC->TxPort[Port][0].TxQ_free.pTail = SendCmplPktQ.pTail; -+ if (pAC->TxPort[Port][0].TxQ_free.pHead->pNext == NULL) { -+ netif_wake_queue(pAC->dev[Port]); -+ } -+ } else { -+ pAC->TxPort[Port][0].TxQ_free.pHead = SendCmplPktQ.pHead; -+ pAC->TxPort[Port][0].TxQ_free.pTail = SendCmplPktQ.pTail; -+ netif_wake_queue(pAC->dev[Port]); -+ } -+ if (Done == Put) { -+ netif_wake_queue(pAC->dev[Port]); -+ } -+ if (DoWakeQueue) { -+ netif_wake_queue(pAC->dev[Port]); -+ DoWakeQueue = SK_FALSE; -+ } -+ spin_unlock_irqrestore(&pAC->TxPort[Port][0].TxQ_free.QueueLock, Flags); -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("<== CheckForSendComplete()\n")); -+ -+ return; -+} /* CheckForSendComplete */ -+ -+/***************************************************************************** -+ * -+ * UnmapAndFreeTxPktBuffer -+ * -+ * Description: -+ * This function free any allocated space of receive buffers -+ * -+ * Arguments: -+ * pAC - A pointer to the adapter context struct. -+ * -+ */ -+static void UnmapAndFreeTxPktBuffer( -+SK_AC *pAC, /* pointer to adapter context */ -+SK_PACKET *pSkPacket, /* pointer to port struct of ring to fill */ -+int TxPort) /* TX port index */ -+{ -+ SK_FRAG *pFrag = pSkPacket->pFrag; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("--> UnmapAndFreeTxPktBuffer\n")); -+ -+ while (pFrag != NULL) { -+ pci_unmap_page(pAC->PciDev, -+ (dma_addr_t) pFrag->pPhys, -+ pFrag->FragLen, -+ PCI_DMA_FROMDEVICE); -+ pFrag = pFrag->pNext; -+ } -+ -+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf); -+ pSkPacket->pMBuf = NULL; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, -+ ("<-- UnmapAndFreeTxPktBuffer\n")); -+} -+ -+/***************************************************************************** -+ * -+ * HandleStatusLEs -+ * -+ * Description: -+ * This function checks for any new status LEs that may have been -+ * received. Those status LEs may either be Rx or Tx ones. -+ * -+ * Returns: N/A -+ */ -+static SK_BOOL HandleStatusLEs( -+#ifdef CONFIG_SK98LIN_NAPI -+SK_AC *pAC, /* pointer to adapter context */ -+int *WorkDone, /* Done counter needed for NAPI */ -+int WorkToDo) /* ToDo counter for NAPI */ -+#else -+SK_AC *pAC) /* pointer to adapter context */ -+#endif -+{ -+ int DoneTxA[SK_MAX_MACS]; -+ int DoneTxS[SK_MAX_MACS]; -+ int Port; -+ SK_BOOL handledStatLE = SK_FALSE; -+ SK_BOOL NewDone = SK_FALSE; -+ SK_HWLE *pLE; -+ SK_U16 HighVal; -+ SK_U32 LowVal; -+ SK_U8 OpCode; -+ int i; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("==> HandleStatusLEs\n")); -+ -+ do { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Check next Own Bit of ST-LE[%d]: 0x%li \n", -+ (pAC->StatusLETable.Done + 1) % NUM_LE_IN_TABLE(&pAC->StatusLETable), -+ OWN_OF_FIRST_LE(&pAC->StatusLETable))); -+ -+ while (OWN_OF_FIRST_LE(&pAC->StatusLETable) == HW_OWNER) { -+ GET_ST_LE(pLE, &pAC->StatusLETable); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Working on finished status LE[%d]:\n", -+ GET_DONE_INDEX(&pAC->StatusLETable))); -+ SK_DBG_DUMP_ST_LE(pLE); -+ handledStatLE = SK_TRUE; -+ OpCode = STLE_GET_OPC(pLE) & ~HW_OWNER; -+ Port = STLE_GET_LINK(pLE); -+ -+#ifdef USE_TIST_FOR_RESET -+ if (SK_ADAPTER_WAITING_FOR_TIST(pAC)) { -+ /* do we just have a tist LE ? */ -+ if ((OpCode & OP_RXTIMESTAMP) == OP_RXTIMESTAMP) { -+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { -+ if (SK_PORT_WAITING_FOR_ANY_TIST(pAC, i)) { -+ /* if a port is waiting for any tist it is done */ -+ SK_CLR_STATE_FOR_PORT(pAC, i); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Got any Tist on port %c (now 0x%X!!!)\n", -+ 'A' + i, pAC->AdapterResetState)); -+ } -+ if (SK_PORT_WAITING_FOR_SPECIFIC_TIST(pAC, i)) { -+ Y2_GET_TIST_LOW_VAL(pAC->IoBase, &LowVal); -+ if ((pAC->MinTistHi != pAC->GIni.GITimeStampCnt) || -+ (pAC->MinTistLo < LowVal)) { -+ /* time is up now */ -+ SK_CLR_STATE_FOR_PORT(pAC, i); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Got expected Tist on Port %c (now 0x%X)!!!\n", -+ 'A' + i, pAC->AdapterResetState)); -+#ifdef Y2_SYNC_CHECK -+ pAC->FramesWithoutSyncCheck = -+ Y2_RESYNC_WATERMARK; -+#endif -+ } else { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Got Tist %l:%l on Port %c but still waiting\n", -+ pAC->GIni.GITimeStampCnt, pAC->MinTistLo, -+ 'A' + i)); -+ } -+ } -+ } -+#ifndef Y2_RECOVERY -+ if (!SK_ADAPTER_WAITING_FOR_TIST(pAC)) { -+ /* nobody needs tist anymore - turn it off */ -+ Y2_DISABLE_TIST(pAC->IoBase); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Turn off Tist !!!\n")); -+ } -+#endif -+ } else if (OpCode == OP_TXINDEXLE) { -+ /* -+ * change OpCode to notify the folowing code -+ * to ignore the done index from this LE -+ * unfortunately tist LEs will be generated only -+ * for RxStat LEs -+ * so in order to get a safe Done index for a -+ * port currently waiting for a tist we have to -+ * get the done index directly from the BMU -+ */ -+ OpCode = OP_MOD_TXINDEX; -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Mark unusable TX_INDEX LE!!!\n")); -+ } else { -+ if (SK_PORT_WAITING_FOR_TIST(pAC, Port)) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Ignore LE 0x%X on Port %c!!!\n", -+ OpCode, 'A' + Port)); -+ OpCode = OP_MOD_LE; -+#ifdef Y2_LE_CHECK -+ /* mark entries invalid */ -+ pAC->LastOpc = 0xFF; -+ pAC->LastPort = 3; -+#endif -+ } -+ } -+ } /* if (SK_ADAPTER_WAITING_FOR_TIST(pAC)) */ -+#endif -+ -+ -+ -+ -+ -+#ifdef Y2_LE_CHECK -+ if (pAC->LastOpc != 0xFF) { -+ /* last opc is valid -+ * check if current opcode follows last opcode -+ */ -+ if ((((OpCode & OP_RXTIMESTAMP) == OP_RXTIMESTAMP) && (pAC->LastOpc != OP_RXSTAT)) || -+ (((OpCode & OP_RXCHKS) == OP_RXCHKS) && (pAC->LastOpc != OP_RXTIMESTAMP)) || -+ ((OpCode == OP_RXSTAT) && (pAC->LastOpc != OP_RXCHKS))) { -+ -+ /* opcode sequence broken -+ * current LE is invalid -+ */ -+ -+ if (pAC->LastOpc == OP_RXTIMESTAMP) { -+ /* force invalid checksum */ -+ pLE->St.StUn.StRxTCPCSum.RxTCPSum1 = 1; -+ pLE->St.StUn.StRxTCPCSum.RxTCPSum2 = 0; -+ OpCode = pAC->LastOpc = OP_RXCHKS; -+ Port = pAC->LastPort; -+ } else if (pAC->LastOpc == OP_RXCHKS) { -+ /* force invalid frame */ -+ Port = pAC->LastPort; -+ pLE->St.Stat.BufLen = 64; -+ pLE->St.StUn.StRxStatWord = GMR_FS_CRC_ERR; -+ OpCode = pAC->LastOpc = OP_RXSTAT; -+#ifdef Y2_SYNC_CHECK -+ /* force rx sync check */ -+ pAC->FramesWithoutSyncCheck = Y2_RESYNC_WATERMARK; -+#endif -+ } else if (pAC->LastOpc == OP_RXSTAT) { -+ /* create dont care tist */ -+ pLE->St.StUn.StRxTimeStamp = 0; -+ OpCode = pAC->LastOpc = OP_RXTIMESTAMP; -+ /* dont know the port yet */ -+ } else { -+#ifdef DEBUG -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Unknown LastOpc %X for Timestamp on port %c.\n", -+ pAC->LastOpc, Port)); -+#endif -+ } -+ } -+ } -+#endif -+ -+ switch (OpCode) { -+ case OP_RXSTAT: -+#ifdef Y2_RECOVERY -+ pAC->LastOpc = OP_RXSTAT; -+#endif -+ /* -+ ** This is always the last Status LE belonging -+ ** to a received packet -> handle it... -+ */ -+ if ((Port != 0) && (Port != 1)) { -+ /* Unknown port */ -+ panic("sk98lin: Unknown port %d\n", -+ Port); -+ } -+ -+ HandleReceives( -+ pAC, -+ Port, -+ STLE_GET_LEN(pLE), -+ STLE_GET_FRSTATUS(pLE), -+ pAC->StatusLETable.Bmu.Stat.TcpSum1, -+ pAC->StatusLETable.Bmu.Stat.TcpSum2, -+ pAC->StatusLETable.Bmu.Stat.RxTimeStamp, -+ pAC->StatusLETable.Bmu.Stat.VlanId); -+#ifdef CONFIG_SK98LIN_NAPI -+ if (*WorkDone >= WorkToDo) { -+ break; -+ } -+ (*WorkDone)++; -+#endif -+ break; -+ case OP_RXVLAN: -+ /* this value will be used for next RXSTAT */ -+ pAC->StatusLETable.Bmu.Stat.VlanId = STLE_GET_VLAN(pLE); -+ break; -+ case OP_RXTIMEVLAN: -+ /* this value will be used for next RXSTAT */ -+ pAC->StatusLETable.Bmu.Stat.VlanId = STLE_GET_VLAN(pLE); -+ /* fall through */ -+ case OP_RXTIMESTAMP: -+ /* this value will be used for next RXSTAT */ -+ pAC->StatusLETable.Bmu.Stat.RxTimeStamp = STLE_GET_TIST(pLE); -+#ifdef Y2_RECOVERY -+ pAC->LastOpc = OP_RXTIMESTAMP; -+ pAC->LastPort = Port; -+#endif -+ break; -+ case OP_RXCHKSVLAN: -+ /* this value will be used for next RXSTAT */ -+ pAC->StatusLETable.Bmu.Stat.VlanId = STLE_GET_VLAN(pLE); -+ /* fall through */ -+ case OP_RXCHKS: -+ /* this value will be used for next RXSTAT */ -+ pAC->StatusLETable.Bmu.Stat.TcpSum1 = STLE_GET_TCP1(pLE); -+ pAC->StatusLETable.Bmu.Stat.TcpSum2 = STLE_GET_TCP2(pLE); -+#ifdef Y2_RECOVERY -+ pAC->LastPort = Port; -+ pAC->LastOpc = OP_RXCHKS; -+#endif -+ break; -+ case OP_RSS_HASH: -+ /* this value will be used for next RXSTAT */ -+#if 0 -+ pAC->StatusLETable.Bmu.Stat.RssHashValue = STLE_GET_RSS(pLE); -+#endif -+ break; -+ case OP_TXINDEXLE: -+ /* -+ ** :;:; TODO -+ ** it would be possible to check for which queues -+ ** the index has been changed and call -+ ** CheckForSendComplete() only for such queues -+ */ -+ STLE_GET_DONE_IDX(pLE,LowVal,HighVal); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("LowVal: 0x%x HighVal: 0x%x\n", LowVal, HighVal)); -+ -+ /* -+ ** It would be possible to check whether we really -+ ** need the values for second port or sync queue, -+ ** but I think checking whether we need them is -+ ** more expensive than the calculation -+ */ -+ DoneTxA[0] = STLE_GET_DONE_IDX_TXA1(LowVal,HighVal); -+ DoneTxS[0] = STLE_GET_DONE_IDX_TXS1(LowVal,HighVal); -+ DoneTxA[1] = STLE_GET_DONE_IDX_TXA2(LowVal,HighVal); -+ DoneTxS[1] = STLE_GET_DONE_IDX_TXS2(LowVal,HighVal); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("DoneTxa1 0x%x DoneTxS1: 0x%x DoneTxa2 0x%x DoneTxS2: 0x%x\n", -+ DoneTxA[0], DoneTxS[0], DoneTxA[1], DoneTxS[1])); -+ -+ NewDone = SK_TRUE; -+ break; -+#ifdef USE_TIST_FOR_RESET -+ case OP_MOD_TXINDEX: -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("OP_MOD_TXINDEX\n")); -+ SK_IN16(pAC->IoBase, Q_ADDR(Q_XA1, Q_DONE), &DoneTxA[0]); -+ if (pAC->GIni.GIMacsFound > 1) { -+ SK_IN16(pAC->IoBase, Q_ADDR(Q_XA2, Q_DONE), &DoneTxA[1]); -+ } -+ NewDone = SK_TRUE; -+ break; -+ case OP_MOD_LE: -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP, -+ ("Ignore marked LE on port in Reset\n")); -+ break; -+#endif -+ -+ default: -+ /* -+ ** Have to handle the illegal Opcode in Status LE -+ */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Unexpected OpCode\n")); -+ break; -+ } -+ -+#ifdef Y2_RECOVERY -+ OpCode = STLE_GET_OPC(pLE) & ~HW_OWNER; -+ STLE_SET_OPC(pLE, OpCode); -+#else -+ /* -+ ** Reset own bit we have to do this in order to detect a overflow -+ */ -+ STLE_SET_OPC(pLE, SW_OWNER); -+#endif -+ } /* while (OWN_OF_FIRST_LE(&pAC->StatusLETable) == HW_OWNER) */ -+ -+ /* -+ ** Now handle any new transmit complete -+ */ -+ if (NewDone) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Done Index for Tx BMU has been changed\n")); -+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) { -+ /* -+ ** Do we have a new Done idx ? -+ */ -+ if (DoneTxA[Port] != GET_DONE_INDEX(&pAC->TxPort[Port][0].TxALET)) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Check TxA%d\n", Port + 1)); -+ CheckForSendComplete(pAC, pAC->IoBase, Port, -+ &(pAC->TxPort[Port][0].TxAQ_working), -+ &pAC->TxPort[Port][0].TxALET, -+ DoneTxA[Port]); -+ } else { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("No changes for TxA%d\n", Port + 1)); -+ } -+#if USE_SYNC_TX_QUEUE -+ if (HW_SYNC_TX_SUPPORTED(pAC)) { -+ /* -+ ** Do we have a new Done idx ? -+ */ -+ if (DoneTxS[Port] != -+ GET_DONE_INDEX(&pAC->TxPort[Port][0].TxSLET)) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_INT_SRC, -+ ("Check TxS%d\n", Port)); -+ CheckForSendComplete(pAC, pAC->IoBase, Port, -+ &(pAC->TxPort[Port][0].TxSQ_working), -+ &pAC->TxPort[Port][0].TxSLET, -+ DoneTxS[Port]); -+ } else { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_INT_SRC, -+ ("No changes for TxS%d\n", Port)); -+ } -+ } -+#endif -+ } -+ } -+ NewDone = SK_FALSE; -+ -+ /* -+ ** Check whether we have to refill our RX table -+ */ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) { -+ if (NbrRxBuffersInHW < MAX_NBR_RX_BUFFERS_IN_HW) { -+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Check for refill of RxBuffers on Port %c\n", 'A' + Port)); -+ FillReceiveTableYukon2(pAC, pAC->IoBase, Port); -+ } -+ } -+ } else { -+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, -+ ("Check for refill of RxBuffers on Port %c\n", 'A' + Port)); -+ if (NUM_FREE_LE_IN_TABLE(&pAC->RxPort[Port].RxLET) >= 64) { -+ FillReceiveTableYukon2(pAC, pAC->IoBase, Port); -+ } -+ } -+ } -+#ifdef CONFIG_SK98LIN_NAPI -+ if (*WorkDone >= WorkToDo) { -+ break; -+ } -+#endif -+ } while (OWN_OF_FIRST_LE(&pAC->StatusLETable) == HW_OWNER); -+ -+ /* -+ ** Clear status BMU -+ */ -+ SK_OUT32(pAC->IoBase, STAT_CTRL, SC_STAT_CLR_IRQ); -+ -+ return(handledStatLE); -+} /* HandleStatusLEs */ -+ -+/***************************************************************************** -+ * -+ * AllocateAndInitLETables - allocate memory for the LETable and init -+ * -+ * Description: -+ * This function will allocate space for the LETable and will also -+ * initialize them. The size of the tables must have been specified -+ * before. -+ * -+ * Arguments: -+ * pAC - A pointer to the adapter context struct. -+ * -+ * Returns: -+ * SK_TRUE - all LETables initialized -+ * SK_FALSE - failed -+ */ -+static SK_BOOL AllocateAndInitLETables( -+SK_AC *pAC) /* pointer to adapter context */ -+{ -+ char *pVirtMemAddr; -+ dma_addr_t pPhysMemAddr = 0; -+ SK_U32 CurrMac; -+ unsigned Size; -+ unsigned Aligned; -+ unsigned Alignment; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("==> AllocateAndInitLETables()\n")); -+ -+ /* -+ ** Determine how much memory we need with respect to alignment -+ */ -+ Alignment = MAX_LEN_OF_LE_TAB; -+ Size = 0; -+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) { -+ SK_ALIGN_SIZE(LE_TAB_SIZE(RX_MAX_LE), Alignment, Aligned); -+ Size += Aligned; -+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXA_MAX_LE), Alignment, Aligned); -+ Size += Aligned; -+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXS_MAX_LE), Alignment, Aligned); -+ Size += Aligned; -+ } -+ SK_ALIGN_SIZE(LE_TAB_SIZE(ST_MAX_LE), Alignment, Aligned); -+ Size += Aligned; -+ Size += Alignment; -+ pAC->SizeOfAlignedLETables = Size; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("Need %08x bytes in total\n", Size)); -+ -+ /* -+ ** Allocate the memory -+ */ -+ pVirtMemAddr = pci_alloc_consistent(pAC->PciDev, Size, &pPhysMemAddr); -+ if (pVirtMemAddr == NULL) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, -+ SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR, -+ ("AllocateAndInitLETables: kernel malloc failed!\n")); -+ return (SK_FALSE); -+ } -+ -+ /* -+ ** Initialize the memory -+ */ -+ SK_MEMSET(pVirtMemAddr, 0, Size); -+ ALIGN_ADDR(pVirtMemAddr, Alignment); /* Macro defined in skgew.h */ -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("Virtual address of LETab is %8p!\n", pVirtMemAddr)); -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("Phys address of LETab is %8p!\n", (void *) pPhysMemAddr)); -+ -+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("RxLeTable for Port %c", 'A' + CurrMac)); -+ SkGeY2InitSingleLETable( -+ pAC, -+ &pAC->RxPort[CurrMac].RxLET, -+ RX_MAX_LE, -+ pVirtMemAddr, -+ (SK_U32) (pPhysMemAddr & 0xffffffff), -+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32)); -+ -+ SK_ALIGN_SIZE(LE_TAB_SIZE(RX_MAX_LE), Alignment, Aligned); -+ pVirtMemAddr += Aligned; -+ pPhysMemAddr += Aligned; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("TxALeTable for Port %c", 'A' + CurrMac)); -+ SkGeY2InitSingleLETable( -+ pAC, -+ &pAC->TxPort[CurrMac][0].TxALET, -+ TXA_MAX_LE, -+ pVirtMemAddr, -+ (SK_U32) (pPhysMemAddr & 0xffffffff), -+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32)); -+ -+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXA_MAX_LE), Alignment, Aligned); -+ pVirtMemAddr += Aligned; -+ pPhysMemAddr += Aligned; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("TxSLeTable for Port %c", 'A' + CurrMac)); -+ SkGeY2InitSingleLETable( -+ pAC, -+ &pAC->TxPort[CurrMac][0].TxSLET, -+ TXS_MAX_LE, -+ pVirtMemAddr, -+ (SK_U32) (pPhysMemAddr & 0xffffffff), -+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32)); -+ -+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXS_MAX_LE), Alignment, Aligned); -+ pVirtMemAddr += Aligned; -+ pPhysMemAddr += Aligned; -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,("StLeTable")); -+ -+ SkGeY2InitSingleLETable( -+ pAC, -+ &pAC->StatusLETable, -+ ST_MAX_LE, -+ pVirtMemAddr, -+ (SK_U32) (pPhysMemAddr & 0xffffffff), -+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32)); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("<== AllocateAndInitLETables(OK)\n")); -+ return(SK_TRUE); -+} /* AllocateAndInitLETables */ -+ -+/***************************************************************************** -+ * -+ * AllocatePacketBuffersYukon2 - allocate packet and fragment buffers -+ * -+ * Description: -+ * This function will allocate space for the packets and fragments -+ * -+ * Arguments: -+ * pAC - A pointer to the adapter context struct. -+ * -+ * Returns: -+ * SK_TRUE - Memory was allocated correctly -+ * SK_FALSE - An error occured -+ */ -+static SK_BOOL AllocatePacketBuffersYukon2( -+SK_AC *pAC) /* pointer to adapter context */ -+{ -+ SK_PACKET *pRxPacket; -+ SK_PACKET *pTxPacket; -+ SK_U32 CurrBuff; -+ SK_U32 CurrMac; -+ unsigned long Flags; /* needed for POP/PUSH functions */ -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("==> AllocatePacketBuffersYukon2()")); -+ -+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) { -+ /* -+ ** Allocate RX packet space, initialize the packets and -+ ** add them to the RX waiting queue. Waiting queue means -+ ** that packet and fragment are initialized, but no sk_buff -+ ** has been assigned to it yet. -+ */ -+ pAC->RxPort[CurrMac].ReceivePacketTable = -+ kmalloc((RX_MAX_NBR_BUFFERS * sizeof(SK_PACKET)), GFP_KERNEL); -+ -+ if (pAC->RxPort[CurrMac].ReceivePacketTable == NULL) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR, -+ ("AllocatePacketBuffersYukon2: no mem RxPkts (port %i)",CurrMac)); -+ break; -+ } else { -+ SK_MEMSET(pAC->RxPort[CurrMac].ReceivePacketTable, 0, -+ (RX_MAX_NBR_BUFFERS * sizeof(SK_PACKET))); -+ -+ pRxPacket = pAC->RxPort[CurrMac].ReceivePacketTable; -+ -+ for (CurrBuff=0;CurrBuff<RX_MAX_NBR_BUFFERS;CurrBuff++) { -+ pRxPacket->pFrag = &(pRxPacket->FragArray[0]); -+ pRxPacket->NumFrags = 1; -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[CurrMac].RxQ_waiting, pRxPacket); -+ pRxPacket++; -+ } -+ } -+ -+ /* -+ ** Allocate TX packet space, initialize the packets and -+ ** add them to the TX free queue. Free queue means that -+ ** packet is available and initialized, but no fragment -+ ** has been assigned to it. (Must be done at TX side) -+ */ -+ pAC->TxPort[CurrMac][0].TransmitPacketTable = -+ kmalloc((TX_MAX_NBR_BUFFERS * sizeof(SK_PACKET)), GFP_KERNEL); -+ -+ if (pAC->TxPort[CurrMac][0].TransmitPacketTable == NULL) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR, -+ ("AllocatePacketBuffersYukon2: no mem TxPkts (port %i)",CurrMac)); -+ kfree(pAC->RxPort[CurrMac].ReceivePacketTable); -+ return(SK_FALSE); -+ } else { -+ SK_MEMSET(pAC->TxPort[CurrMac][0].TransmitPacketTable, 0, -+ (TX_MAX_NBR_BUFFERS * sizeof(SK_PACKET))); -+ -+ pTxPacket = pAC->TxPort[CurrMac][0].TransmitPacketTable; -+ -+ for (CurrBuff=0;CurrBuff<TX_MAX_NBR_BUFFERS;CurrBuff++) { -+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->TxPort[CurrMac][0].TxQ_free, pTxPacket); -+ pTxPacket++; -+ } -+ } -+ } /* end for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) */ -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT, -+ ("<== AllocatePacketBuffersYukon2 (OK)\n")); -+ return(SK_TRUE); -+ -+} /* AllocatePacketBuffersYukon2 */ -+ -+/***************************************************************************** -+ * -+ * FreeLETables - release allocated memory of LETables -+ * -+ * Description: -+ * This function will free all resources of the LETables -+ * -+ * Arguments: -+ * pAC - A pointer to the adapter context struct. -+ * -+ * Returns: N/A -+ */ -+static void FreeLETables( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ dma_addr_t pPhysMemAddr; -+ char *pVirtMemAddr; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> FreeLETables()\n")); -+ -+ /* -+ ** The RxLETable is the first of all LET. -+ ** Therefore we can use its address for the input -+ ** of the free function. -+ */ -+ pVirtMemAddr = (char *) pAC->RxPort[0].RxLET.pLETab; -+ pPhysMemAddr = (((SK_U64) pAC->RxPort[0].RxLET.pPhyLETABHigh << (SK_U64) 32) | -+ ((SK_U64) pAC->RxPort[0].RxLET.pPhyLETABLow)); -+ -+ /* free continuous memory */ -+ pci_free_consistent(pAC->PciDev, pAC->SizeOfAlignedLETables, -+ pVirtMemAddr, pPhysMemAddr); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== FreeLETables()\n")); -+} /* FreeLETables */ -+ -+/***************************************************************************** -+ * -+ * FreePacketBuffers - free's all packet buffers of an adapter -+ * -+ * Description: -+ * This function will free all previously allocated memory of the -+ * packet buffers. -+ * -+ * Arguments: -+ * pAC - A pointer to the adapter context struct. -+ * -+ * Returns: N/A -+ */ -+static void FreePacketBuffers( -+SK_AC *pAC) /* pointer to adapter control context */ -+{ -+ int Port; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("==> FreePacketBuffers()\n")); -+ -+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) { -+ kfree(pAC->RxPort[Port].ReceivePacketTable); -+ kfree(pAC->TxPort[Port][0].TransmitPacketTable); -+ } -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG, -+ ("<== FreePacketBuffers()\n")); -+} /* FreePacketBuffers */ -+ -+/***************************************************************************** -+ * -+ * AllocAndMapRxBuffer - fill one buffer into the receive packet/fragment -+ * -+ * Description: -+ * The function allocates a new receive buffer and assigns it to the -+ * the passsed receive packet/fragment -+ * -+ * Returns: -+ * SK_TRUE - a buffer was allocated and assigned -+ * SK_FALSE - a buffer could not be added -+ */ -+static SK_BOOL AllocAndMapRxBuffer( -+SK_AC *pAC, /* pointer to the adapter control context */ -+SK_PACKET *pSkPacket, /* pointer to packet that is to fill */ -+int Port) /* port the packet belongs to */ -+{ -+ struct sk_buff *pMsgBlock; /* pointer to a new message block */ -+ SK_U64 PhysAddr; /* physical address of a rx buffer */ -+ -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("--> AllocAndMapRxBuffer (Port: %i)\n", Port)); -+ -+ pMsgBlock = alloc_skb(pAC->RxPort[Port].RxBufSize, GFP_ATOMIC); -+ if (pMsgBlock == NULL) { -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, -+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR, -+ ("%s: Allocation of rx buffer failed !\n", -+ pAC->dev[Port]->name)); -+ SK_PNMI_CNT_NO_RX_BUF(pAC, pAC->RxPort[Port].PortIndex); -+ return(SK_FALSE); -+ } -+ skb_reserve(pMsgBlock, 8); -+ -+ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev, -+ virt_to_page(pMsgBlock->data), -+ ((unsigned long) pMsgBlock->data & -+ ~PAGE_MASK), -+ pAC->RxPort[Port].RxBufSize, -+ PCI_DMA_FROMDEVICE); -+ -+ pSkPacket->pFrag->pVirt = pMsgBlock->data; -+ pSkPacket->pFrag->pPhys = PhysAddr; -+ pSkPacket->pFrag->FragLen = pAC->RxPort[Port].RxBufSize; /* for correct unmap */ -+ pSkPacket->pMBuf = pMsgBlock; -+ pSkPacket->PacketLen = pAC->RxPort[Port].RxBufSize; -+ -+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, -+ ("<-- AllocAndMapRxBuffer\n")); -+ -+ return (SK_TRUE); -+} /* AllocAndMapRxBuffer */ -+ -+/******************************************************************************* -+ * -+ * End of file -+ * -+ ******************************************************************************/ ---- /dev/null 2006-03-09 09:48:23.770951496 +0300 -+++ ./drivers/net/sk98lin/sky2le.c 2006-04-04 13:13:35.000000000 +0400 -@@ -0,0 +1,512 @@ -+/***************************************************************************** -+ * -+ * Name: sky2le.c -+ * Project: Gigabit Ethernet Adapters, Common Modules -+ * Version: $Revision: 1.12 $ -+ * Date: $Date: 2005/12/14 16:11:35 $ -+ * Purpose: Functions for handling List Element Tables -+ * -+ *****************************************************************************/ -+ -+/****************************************************************************** -+ * -+ * LICENSE: -+ * (C)Copyright 2002-2004 Marvell. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * The information in this file is provided "AS IS" without warranty. -+ * /LICENSE -+ * -+ ******************************************************************************/ -+ -+/***************************************************************************** -+ * -+ * Description: -+ * -+ * This module contains the code necessary for handling List Elements. -+ * -+ * Supported Gigabit Ethernet Chipsets: -+ * Yukon-2 (PCI, PCI-X, PCI-Express) -+ * -+ * Include File Hierarchy: -+ * -+ * -+ *****************************************************************************/ -+#include "h/skdrv1st.h" -+#include "h/skdrv2nd.h" -+ -+/* defines *******************************************************************/ -+/* typedefs ******************************************************************/ -+/* global variables **********************************************************/ -+/* local variables ***********************************************************/ -+ -+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) -+static const char SysKonnectFileId[] = -+ "@(#) $Id: sky2le.c,v 1.12 2005/12/14 16:11:35 ibrueder Exp $ (C) Marvell."; -+#endif /* DEBUG || (!LINT && !SK_SLIM) */ -+ -+/* function prototypes *******************************************************/ -+ -+/***************************************************************************** -+ * -+ * SkGeY2InitSingleLETable() - initializes a list element table -+ * -+ * Description: -+ * This function will initialize the selected list element table. -+ * Should be called once during DriverInit. No InitLevel required. -+ * -+ * Arguments: -+ * pAC - pointer to the adapter context struct. -+ * pLETab - pointer to list element table structure -+ * NumLE - number of list elements in this table -+ * pVMem - virtual address of memory allocated for this LE table -+ * PMemLowAddr - physical address of memory to be used for the LE table -+ * PMemHighAddr -+ * -+ * Returns: -+ * nothing -+ */ -+void SkGeY2InitSingleLETable( -+SK_AC *pAC, /* pointer to adapter context */ -+SK_LE_TABLE *pLETab, /* pointer to list element table to be initialized */ -+unsigned int NumLE, /* number of list elements to be filled in tab */ -+void *pVMem, /* virtual address of memory used for list elements */ -+SK_U32 PMemLowAddr, /* physical addr of mem used for LE */ -+SK_U32 PMemHighAddr) -+{ -+ unsigned int i; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("==> SkGeY2InitSingleLETable()\n")); -+ -+#ifdef DEBUG -+ if (NumLE != 2) { /* not table for polling unit */ -+ if ((NumLE % MIN_LEN_OF_LE_TAB) != 0 || NumLE > MAX_LEN_OF_LE_TAB) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("ERROR: Illegal number of list elements %d\n", NumLE)); -+ } -+ } -+#endif /* DEBUG */ -+ -+ /* special case: unused list element table */ -+ if (NumLE == 0) { -+ PMemLowAddr = 0; -+ PMemHighAddr = 0; -+ pVMem = 0; -+ } -+ -+ /* -+ * in order to get the best possible performance the macros to access -+ * list elements use & instead of % -+ * this requires the length of LE tables to be a power of 2 -+ */ -+ -+ /* -+ * this code guarantees that we use the next power of 2 below the -+ * value specified for NumLe - this way some LEs in the table may -+ * not be used but the macros work correctly -+ * this code does not check for bad values below 128 because in such a -+ * case we cannot do anything here -+ */ -+ -+ if ((NumLE != 2) && (NumLE != 0)) { -+ /* no check for polling unit and unused sync Tx */ -+ i = MIN_LEN_OF_LE_TAB; -+ while (NumLE > i) { -+ i *= 2; -+ if (i > MAX_LEN_OF_LE_TAB) { -+ break; -+ } -+ } -+ if (NumLE != i) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("ERROR: Illegal number of list elements %d adjusted to %d\n", -+ NumLE, (i / 2))); -+ NumLE = i / 2; -+ } -+ } -+ -+ /* set addresses */ -+ pLETab->pPhyLETABLow = PMemLowAddr; -+ pLETab->pPhyLETABHigh = PMemHighAddr; -+ pLETab->pLETab = pVMem; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("contains %d LEs", NumLE)); -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ (" and starts at virt %08lx and phys %08lx:%08lx\n", -+ pVMem, PMemHighAddr, PMemLowAddr)); -+ -+ /* initialize indexes */ -+ pLETab->Done = 0; -+ pLETab->Put = 0; -+ pLETab->HwPut = 0; -+ /* initialize size */ -+ pLETab->Num = NumLE; -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("<== SkGeY2InitSingleLETable()\n")); -+} /* SkGeY2InitSingleLETable */ -+ -+/***************************************************************************** -+ * -+ * SkGeY2InitPrefetchUnit() - Initialize a Prefetch Unit -+ * -+ * Description: -+ * Calling this function requires an already configured list element -+ * table. The prefetch unit to be configured is specified in the parameter -+ * 'Queue'. The function is able to initialze the prefetch units of -+ * the following queues: Q_R1, Q_R2, Q_XS1, Q_XS2, Q_XA1, Q_XA2. -+ * The funcution should be called before SkGeInitPort(). -+ * -+ * Arguments: -+ * pAC - pointer to the adapter context struct. -+ * IoC - I/O context. -+ * Queue - I/O offset of queue e.g. Q_XA1. -+ * pLETab - pointer to list element table to be initialized -+ * -+ * Returns: N/A -+ */ -+void SkGeY2InitPrefetchUnit( -+SK_AC *pAC, /* pointer to adapter context */ -+SK_IOC IoC, /* I/O context */ -+unsigned int Queue, /* Queue offset for finding the right registers */ -+SK_LE_TABLE *pLETab) /* pointer to list element table to be initialized */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("==> SkGeY2InitPrefetchUnit()\n")); -+ -+#ifdef DEBUG -+ if (Queue != Q_R1 && Queue != Q_R2 && Queue != Q_XS1 && -+ Queue != Q_XS2 && Queue != Q_XA1 && Queue != Q_XA2) { -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR, -+ ("ERROR: Illegal queue identifier %x\n", Queue)); -+ } -+#endif /* DEBUG */ -+ -+ /* disable the prefetch unit */ -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_SET); -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_CLR); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Base address: %08lx:%08lx\n", pLETab->pPhyLETABHigh, -+ pLETab->pPhyLETABLow)); -+ -+ /* Set the list base address high part*/ -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_ADDR_HI_REG), -+ pLETab->pPhyLETABHigh); -+ -+ /* Set the list base address low part */ -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_ADDR_LOW_REG), -+ pLETab->pPhyLETABLow); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Last index: %d\n", pLETab->Num-1)); -+ -+ /* Set the list last index */ -+ SK_OUT16(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_LAST_IDX_REG), -+ (SK_U16)(pLETab->Num - 1)); -+ -+ /* turn on prefetch unit */ -+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_CTRL_REG), PREF_UNIT_OP_ON); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("<== SkGeY2InitPrefetchUnit()\n")); -+} /* SkGeY2InitPrefetchUnit */ -+ -+ -+/***************************************************************************** -+ * -+ * SkGeY2InitStatBmu() - Initialize the Status BMU -+ * -+ * Description: -+ * Calling this function requires an already configured list element -+ * table. Ensure the status BMU is only initialized once during -+ * DriverInit - InitLevel2 required. -+ * -+ * Arguments: -+ * pAC - pointer to the adapter context struct. -+ * IoC - I/O context. -+ * pLETab - pointer to status LE table to be initialized -+ * -+ * Returns: N/A -+ */ -+void SkGeY2InitStatBmu( -+SK_AC *pAC, /* pointer to adapter context */ -+SK_IOC IoC, /* I/O context */ -+SK_LE_TABLE *pLETab) /* pointer to status LE table */ -+{ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("==> SkGeY2InitStatBmu()\n")); -+ -+ /* disable the prefetch unit */ -+ SK_OUT32(IoC, STAT_CTRL, SC_STAT_RST_SET); -+ SK_OUT32(IoC, STAT_CTRL, SC_STAT_RST_CLR); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Base address Low: %08lX\n", pLETab->pPhyLETABLow)); -+ -+ /* Set the list base address */ -+ SK_OUT32(IoC, STAT_LIST_ADDR_LO, pLETab->pPhyLETABLow); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Base address High: %08lX\n", pLETab->pPhyLETABHigh)); -+ -+ SK_OUT32(IoC, STAT_LIST_ADDR_HI, pLETab->pPhyLETABHigh); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Last index: %d\n", pLETab->Num - 1)); -+ -+ /* Set the list last index */ -+ SK_OUT16(IoC, STAT_LAST_IDX, (SK_U16)(pLETab->Num - 1)); -+ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_43_418)) { -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Set Tx index threshold\n")); -+ /* WA for dev. #4.3 */ -+ SK_OUT16(IoC, STAT_TX_IDX_TH, ST_TXTH_IDX_MASK); -+ -+ /* set Status-FIFO watermark */ -+ SK_OUT8(IoC, STAT_FIFO_WM, 0x21); /* WA for dev. #4.18 */ -+ -+ /* set Status-FIFO ISR watermark */ -+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 0x07); /* WA for dev. #4.18 */ -+ -+ /* WA for dev. #4.3 and #4.18 */ -+ /* set Status-FIFO Tx timer init value */ -+ SK_OUT32(IoC, STAT_TX_TIMER_INI, HW_MS_TO_TICKS(pAC, 10)); -+ } -+ else { -+ /* -+ * Further settings may be added if required... -+ * 1) Status-FIFO watermark (STAT_FIFO_WM, STAT_FIFO_ISR_WM) -+ * 2) Status-FIFO timer values (STAT_TX_TIMER_INI, -+ * STAT_LEV_TIMER_INI and STAT_ISR_TIMER_INI) -+ * but tests shows that the default values give the best results, -+ * therefore the defaults are used. -+ */ -+ -+ /* -+ * Theses settings should avoid the -+ * temporary hanging of the status BMU. -+ * May be not all required... still under investigation... -+ */ -+ SK_OUT16(IoC, STAT_TX_IDX_TH, 0x000a); -+ -+ /* set Status-FIFO watermark */ -+ SK_OUT8(IoC, STAT_FIFO_WM, 0x10); -+ -+ -+ /* set Status-FIFO ISR watermark */ -+ if (HW_FEATURE(pAC, HWF_WA_DEV_4109)) { -+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 0x10); -+ } -+ else { -+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 0x04); -+ } -+ -+ SK_OUT32(IoC, STAT_ISR_TIMER_INI, 0x0190); -+ } -+ -+ /* start Status-FIFO timer */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Start Status FiFo timer\n")); -+ -+ /* enable the prefetch unit */ -+ /* operational bit not functional for Yukon-EC, but fixed in Yukon-2 */ -+ SK_OUT32(IoC, STAT_CTRL, SC_STAT_OP_ON); -+ -+ /* start Status-FIFO timer */ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Start Status FiFo timer\n")); -+ -+ SK_OUT8(IoC, STAT_TX_TIMER_CTRL, TIM_START); -+ SK_OUT8(IoC, STAT_LEV_TIMER_CTRL, TIM_START); -+ SK_OUT8(IoC, STAT_ISR_TIMER_CTRL, TIM_START); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("<== SkGeY2InitStatBmu()\n")); -+} /* SkGeY2InitStatBmu */ -+ -+#ifdef USE_POLLING_UNIT -+/***************************************************************************** -+ * -+ * SkGeY2InitPollUnit() - Initialize the Polling Unit -+ * -+ * Description: -+ * This function will write the data of one polling LE table into the -+ * adapter. -+ * -+ * Arguments: -+ * pAC - pointer to the adapter context struct. -+ * IoC - I/O context. -+ * pLETab - pointer to polling LE table to be initialized -+ * -+ * Returns: N/A -+ */ -+void SkGeY2InitPollUnit( -+SK_AC *pAC, /* pointer to adapter context */ -+SK_IOC IoC, /* I/O context */ -+SK_LE_TABLE *pLETab) /* pointer to polling LE table */ -+{ -+ SK_HWLE *pLE; -+ int i; -+#ifdef VCPU -+ VCPU_VARS(); -+#endif /* VCPU */ -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("==> SkGeY2InitPollUnit()\n")); -+ -+#ifdef VCPU -+ for (i = 0; i < SK_MAX_MACS; i++) { -+ GET_PO_LE(pLE, pLETab, i); -+ VCPU_START_AND_COPY_LE(); -+ /* initialize polling LE but leave indexes invalid */ -+ POLE_SET_OPC(pLE, OP_PUTIDX | HW_OWNER); -+ POLE_SET_LINK(pLE, i); -+ POLE_SET_RXIDX(pLE, 0); -+ POLE_SET_TXAIDX(pLE, 0); -+ POLE_SET_TXSIDX(pLE, 0); -+ VCPU_WRITE_LE(); -+ SK_DBG_DUMP_PO_LE(pLE); -+ } -+#endif /* VCPU */ -+ -+ /* disable the polling unit */ -+ SK_OUT32(IoC, POLL_CTRL, PC_POLL_RST_SET); -+ SK_OUT32(IoC, POLL_CTRL, PC_POLL_RST_CLR); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Base address Low: %08lX\n", pLETab->pPhyLETABLow)); -+ -+ /* Set the list base address */ -+ SK_OUT32(IoC, POLL_LIST_ADDR_LO, pLETab->pPhyLETABLow); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("Base address High: %08lX\n", pLETab->pPhyLETABHigh)); -+ -+ SK_OUT32(IoC, POLL_LIST_ADDR_HI, pLETab->pPhyLETABHigh); -+ -+ /* we don't need to write the last index - it is hardwired to 1 */ -+ -+ /* enable the prefetch unit */ -+ SK_OUT32(IoC, POLL_CTRL, PC_POLL_OP_ON); -+ -+ /* -+ * now we have to start the descriptor poll timer because it triggers -+ * the polling unit -+ */ -+ -+ /* -+ * still playing with the value (timer runs at 125 MHz) -+ * descriptor poll timer is enabled by GeInit -+ */ -+ SK_OUT32(IoC, B28_DPT_INI, -+ (SK_DPOLL_DEF_Y2 * (SK_U32)pAC->GIni.GIHstClkFact / 100)); -+ -+ SK_OUT8(IoC, B28_DPT_CTRL, TIM_START); -+ -+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, -+ ("<== SkGeY2InitPollUnit()\n")); -+} /* SkGeY2InitPollUnit */ -+#endif /* USE_POLLING_UNIT */ -+ -+ -+/****************************************************************************** -+ * -+ * SkGeY2SetPutIndex -+ * -+ * Description: -+ * This function is writing the Done index of a transmit -+ * list element table. -+ * -+ * Notes: -+ * Dev. Issue 4.2 -+ * -+ * Returns: N/A -+ */ -+void SkGeY2SetPutIndex( -+SK_AC *pAC, /* pointer to adapter context */ -+SK_IOC IoC, /* pointer to the IO context */ -+SK_U32 StartAddrPrefetchUnit, /* start address of the prefetch unit */ -+SK_LE_TABLE *pLETab) /* list element table to work with */ -+{ -+ unsigned int Put; -+ SK_U16 EndOfListIndex; -+ SK_U16 HwGetIndex; -+ SK_U16 HwPutIndex; -+ -+ /* set put index we would like to write */ -+ Put = GET_PUT_IDX(pLETab); -+ -+ /* -+ * in this case we wrap around -+ * new put is lower than last put given to hw -+ */ -+ if (Put < pLETab->HwPut) { -+ -+ /* set put index = last index of list */ -+ EndOfListIndex = (NUM_LE_IN_TABLE(pLETab)-1); -+ -+ /* read get index of hw prefetch unit */ -+ SK_IN16(IoC, (StartAddrPrefetchUnit + PREF_UNIT_GET_IDX_REG), -+ &HwGetIndex); -+ -+ /* read put index of hw prefetch unit */ -+ SK_IN16(IoC, (StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG), -+ &HwPutIndex); -+ -+ /* prefetch unit reached end of list */ -+ /* prefetch unit reached first list element */ -+ if (HwGetIndex == 0) { -+ /* restore watermark */ -+ SK_OUT8(IoC, StartAddrPrefetchUnit + PREF_UNIT_FIFO_WM_REG, 0xe0U); -+ /* write put index */ -+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG, -+ (SK_U16)Put); -+ -+ /* remember put index we wrote to hw */ -+ pLETab->HwPut = Put; -+ } -+ else if (HwGetIndex == EndOfListIndex) { -+ /* set watermark to one list element */ -+ SK_OUT8(IoC, StartAddrPrefetchUnit + PREF_UNIT_FIFO_WM_REG, 8); -+ /* set put index to first list element */ -+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG, 0); -+ } -+ /* prefetch unit did not reach end of list yet */ -+ /* and we did not write put index to end of list yet */ -+ else if ((HwPutIndex != EndOfListIndex) && -+ (HwGetIndex != EndOfListIndex)) { -+ /* write put index */ -+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG, -+ EndOfListIndex); -+ } -+ else { -+ /* do nothing */ -+ } -+ } -+ else { -+#ifdef XXX /* leads in to problems in the Windows Driver */ -+ if (Put != pLETab->HwPut) { -+ /* write put index */ -+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG, -+ (SK_U16)Put); -+ /* update put index */ -+ UPDATE_HWPUT_IDX(pLETab); -+ } -+#else -+ /* write put index */ -+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG, -+ (SK_U16)Put); -+ /* update put index */ -+ UPDATE_HWPUT_IDX(pLETab); -+#endif -+ } -+} /* SkGeY2SetPutIndex */ -+ |