]> git.pld-linux.org Git - packages/kernel.git/blame - linux-2.6-sk98lin-8.31.2.3.patch
- updated for 2.6.25.4
[packages/kernel.git] / linux-2.6-sk98lin-8.31.2.3.patch
CommitLineData
5902d8ee 1diff -ruN linux/drivers/net/sk98lin/Makefile linux-new/drivers/net/sk98lin/Makefile
2--- linux/drivers/net/sk98lin/Makefile 2006-04-11 19:19:28.000000000 +0200
3+++ linux-new/drivers/net/sk98lin/Makefile 2006-04-12 18:59:11.861752000 +0200
4@@ -1,6 +1,59 @@
5+#******************************************************************************
6 #
7-# Makefile for the SysKonnect SK-98xx device driver.
8+# Name: skge.c
9+# Project: GEnesis, PCI Gigabit Ethernet Adapter
10+# Version: $Revision$
11+# Date: $Date$
12+# Purpose: The main driver source module
13 #
14+#******************************************************************************
15+
16+#******************************************************************************
17+#
18+# (C)Copyright 1998-2002 SysKonnect GmbH.
19+# (C)Copyright 2002-2005 Marvell.
20+#
21+# Makefile for Marvell Yukon chipset and SysKonnect Gigabit Ethernet
22+# Server Adapter driver. (Kernel 2.6)
23+#
24+# Author: Mirko Lindner (mlindner@syskonnect.de)
25+# Ralph Roesler (rroesler@syskonnect.de)
26+#
27+# Address all question to: linux@syskonnect.de
28+#
29+# This program is free software; you can redistribute it and/or modify
30+# it under the terms of the GNU General Public License as published by
31+# the Free Software Foundation; either version 2 of the License, or
32+# (at your option) any later version.
33+#
34+# The information in this file is provided "AS IS" without warranty.
35+#
36+#******************************************************************************
37+
38+#******************************************************************************
39+#
40+# History:
41+#
42+# $Log$
43+# Revision 1.9.2.1 2005/04/11 09:01:18 mlindner
44+# Fix: Copyright year changed
45+#
46+# Revision 1.9 2004/07/13 15:54:50 rroesler
47+# Add: file skethtool.c
48+# Fix: corrected header regarding copyright
49+# Fix: minor typos corrected
50+#
51+# Revision 1.8 2004/06/08 08:39:38 mlindner
52+# Fix: Add CONFIG_SK98LIN_ZEROCOPY as default
53+#
54+# Revision 1.7 2004/06/03 16:06:56 mlindner
55+# Fix: Added compile flag SK_DIAG_SUPPORT
56+#
57+# Revision 1.6 2004/06/02 08:02:59 mlindner
58+# Add: Changed header information and inserted a GPL statement
59+#
60+#
61+#******************************************************************************
62
63
64 #
65@@ -13,20 +66,24 @@
66 obj-$(CONFIG_SK98LIN) += sk98lin.o
67 sk98lin-objs := \
68 skge.o \
69+ sky2.o \
70 skethtool.o \
71+ sky2le.o \
72 skdim.o \
73 skaddr.o \
74 skgehwt.o \
75 skgeinit.o \
76 skgepnmi.o \
77 skgesirq.o \
78- ski2c.o \
79+ sktwsi.o \
80 sklm80.o \
81 skqueue.o \
82 skrlmt.o \
83 sktimer.o \
84 skvpd.o \
85- skxmac2.o
86+ skxmac2.o \
87+ skproc.o \
88+ skcsum.o
89
90 # DBGDEF = \
91 # -DDEBUG
92@@ -75,13 +132,11 @@
93 # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources
94 # SK_DBGCAT_DRV_EVENT 0x08000000 driver events
95
96-EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM)
97+EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_USE_CSUM -DSK_DIAG_SUPPORT \
98+ -DGENESIS -DYUKON -DYUK2 -DCONFIG_SK98LIN_ZEROCOPY \
99+ $(DBGDEF) $(SKPARAM)
100
101 clean:
102 rm -f core *.o *.a *.s
103
104
105-
106-
107-
108-
109diff -ruN linux/drivers/net/sk98lin/h/lm80.h linux-new/drivers/net/sk98lin/h/lm80.h
110--- linux/drivers/net/sk98lin/h/lm80.h 2006-04-11 19:19:28.000000000 +0200
111+++ linux-new/drivers/net/sk98lin/h/lm80.h 2006-01-18 14:37:24.000000000 +0100
112@@ -2,8 +2,8 @@
113 *
114 * Name: lm80.h
115 * Project: Gigabit Ethernet Adapters, Common Modules
116- * Version: $Revision$
117- * Date: $Date$
118+ * Version: $Revision$
119+ * Date: $Date$
120 * Purpose: Contains all defines for the LM80 Chip
121 * (National Semiconductor).
122 *
123@@ -11,6 +11,7 @@
124
125 /******************************************************************************
126 *
127+ * LICENSE:
128 * (C)Copyright 1998-2002 SysKonnect.
129 * (C)Copyright 2002-2003 Marvell.
130 *
131@@ -20,6 +21,7 @@
132 * (at your option) any later version.
133 *
134 * The information in this file is provided "AS IS" without warranty.
135+ * /LICENSE
136 *
137 ******************************************************************************/
138
139diff -ruN linux/drivers/net/sk98lin/h/skaddr.h linux-new/drivers/net/sk98lin/h/skaddr.h
140--- linux/drivers/net/sk98lin/h/skaddr.h 2006-04-11 19:19:28.000000000 +0200
141+++ linux-new/drivers/net/sk98lin/h/skaddr.h 2006-01-18 14:37:24.000000000 +0100
142@@ -2,8 +2,8 @@
143 *
144 * Name: skaddr.h
145 * Project: Gigabit Ethernet Adapters, ADDR-Modul
146- * Version: $Revision$
147- * Date: $Date$
148+ * Version: $Revision$
149+ * Date: $Date$
150 * Purpose: Header file for Address Management (MC, UC, Prom).
151 *
152 ******************************************************************************/
153diff -ruN linux/drivers/net/sk98lin/h/skcsum.h linux-new/drivers/net/sk98lin/h/skcsum.h
154--- linux/drivers/net/sk98lin/h/skcsum.h 2006-04-11 19:19:28.000000000 +0200
155+++ linux-new/drivers/net/sk98lin/h/skcsum.h 2006-01-18 14:37:24.000000000 +0100
156@@ -2,8 +2,8 @@
157 *
158 * Name: skcsum.h
159 * Project: GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx)
160- * Version: $Revision$
161- * Date: $Date$
162+ * Version: $Revision$
163+ * Date: $Date$
164 * Purpose: Store/verify Internet checksum in send/receive packets.
165 *
166 ******************************************************************************/
167@@ -157,9 +157,7 @@
168 typedef struct s_Csum {
169 /* Enabled receive SK_PROTO_XXX bit flags. */
170 unsigned ReceiveFlags[SK_MAX_NETS];
171-#ifdef TX_CSUM
172 unsigned TransmitFlags[SK_MAX_NETS];
173-#endif /* TX_CSUM */
174
175 /* The protocol statistics structure; one per supported protocol. */
176 SKCS_PROTO_STATS ProtoStats[SK_MAX_NETS][SKCS_NUM_PROTOCOLS];
177diff -ruN linux/drivers/net/sk98lin/h/skdebug.h linux-new/drivers/net/sk98lin/h/skdebug.h
178--- linux/drivers/net/sk98lin/h/skdebug.h 2006-04-11 19:19:28.000000000 +0200
179+++ linux-new/drivers/net/sk98lin/h/skdebug.h 2006-01-18 14:37:24.000000000 +0100
180@@ -2,23 +2,24 @@
181 *
182 * Name: skdebug.h
183 * Project: Gigabit Ethernet Adapters, Common Modules
184- * Version: $Revision$
185- * Date: $Date$
186+ * Version: $Revision$
187+ * Date: $Date$
188 * Purpose: SK specific DEBUG support
189 *
190 ******************************************************************************/
191
192 /******************************************************************************
193 *
194+ * LICENSE:
195 * (C)Copyright 1998-2002 SysKonnect.
196- * (C)Copyright 2002-2003 Marvell.
197+ * (C)Copyright 2002-2005 Marvell.
198 *
199 * This program is free software; you can redistribute it and/or modify
200 * it under the terms of the GNU General Public License as published by
201 * the Free Software Foundation; either version 2 of the License, or
202 * (at your option) any later version.
203- *
204 * The information in this file is provided "AS IS" without warranty.
205+ * /LICENSE
206 *
207 ******************************************************************************/
208
209@@ -28,9 +29,9 @@
210 #ifdef DEBUG
211 #ifndef SK_DBG_MSG
212 #define SK_DBG_MSG(pAC,comp,cat,arg) \
213- if ( ((comp) & SK_DBG_CHKMOD(pAC)) && \
214- ((cat) & SK_DBG_CHKCAT(pAC)) ) { \
215- SK_DBG_PRINTF arg ; \
216+ if ( ((comp) & SK_DBG_CHKMOD(pAC)) && \
217+ ((cat) & SK_DBG_CHKCAT(pAC)) ) { \
218+ SK_DBG_PRINTF arg; \
219 }
220 #endif
221 #else
222@@ -58,6 +59,13 @@
223 #define SK_DBGMOD_ADDR 0x00000080L /* ADDR module */
224 #define SK_DBGMOD_PECP 0x00000100L /* PECP module */
225 #define SK_DBGMOD_POWM 0x00000200L /* Power Management module */
226+#ifdef SK_ASF
227+#define SK_DBGMOD_ASF 0x00000400L /* ASF module */
228+#endif
229+#ifdef SK_LBFO
230+#define SK_DBGMOD_LACP 0x00000800L /* link aggregation control protocol */
231+#define SK_DBGMOD_FD 0x00001000L /* frame distributor (link aggregation) */
232+#endif /* SK_LBFO */
233
234 /* Debug events */
235
236diff -ruN linux/drivers/net/sk98lin/h/skdrv1st.h linux-new/drivers/net/sk98lin/h/skdrv1st.h
237--- linux/drivers/net/sk98lin/h/skdrv1st.h 2006-04-11 19:19:28.000000000 +0200
238+++ linux-new/drivers/net/sk98lin/h/skdrv1st.h 2006-01-18 14:37:24.000000000 +0100
239@@ -2,8 +2,8 @@
240 *
241 * Name: skdrv1st.h
242 * Project: GEnesis, PCI Gigabit Ethernet Adapter
243- * Version: $Revision$
244- * Date: $Date$
245+ * Version: $Revision$
246+ * Date: $Date$
247 * Purpose: First header file for driver and all other modules
248 *
249 ******************************************************************************/
250@@ -11,7 +11,7 @@
251 /******************************************************************************
252 *
253 * (C)Copyright 1998-2002 SysKonnect GmbH.
254- * (C)Copyright 2002-2003 Marvell.
255+ * (C)Copyright 2002-2005 Marvell.
256 *
257 * This program is free software; you can redistribute it and/or modify
258 * it under the terms of the GNU General Public License as published by
259@@ -22,23 +22,12 @@
260 *
261 ******************************************************************************/
262
263-/******************************************************************************
264- *
265- * Description:
266- *
267- * This is the first include file of the driver, which includes all
268- * neccessary system header files and some of the GEnesis header files.
269- * It also defines some basic items.
270- *
271- * Include File Hierarchy:
272- *
273- * see skge.c
274- *
275- ******************************************************************************/
276-
277 #ifndef __INC_SKDRV1ST_H
278 #define __INC_SKDRV1ST_H
279
280+/* Check kernel version */
281+#include <linux/version.h>
282+
283 typedef struct s_AC SK_AC;
284
285 /* Set card versions */
286@@ -55,6 +44,9 @@
287
288 #define SK_ADDR_EQUAL(a1,a2) (!memcmp(a1,a2,6))
289
290+#define SK_STRNCMP(s1,s2,len) strncmp(s1,s2,len)
291+#define SK_STRCPY(dest,src) strcpy(dest,src)
292+
293 #include <linux/types.h>
294 #include <linux/kernel.h>
295 #include <linux/string.h>
296@@ -63,10 +55,9 @@
297 #include <linux/slab.h>
298 #include <linux/interrupt.h>
299 #include <linux/pci.h>
300-#include <linux/bitops.h>
301 #include <asm/byteorder.h>
302+#include <asm/bitops.h>
303 #include <asm/io.h>
304-#include <asm/irq.h>
305 #include <linux/netdevice.h>
306 #include <linux/etherdevice.h>
307 #include <linux/skbuff.h>
308@@ -76,11 +67,7 @@
309 #include <net/checksum.h>
310
311 #define SK_CS_CALCULATE_CHECKSUM
312-#ifndef CONFIG_X86_64
313-#define SkCsCalculateChecksum(p,l) ((~ip_compute_csum(p, l)) & 0xffff)
314-#else
315-#define SkCsCalculateChecksum(p,l) ((~ip_fast_csum(p, l)) & 0xffff)
316-#endif
317+#define SkCsCalculateChecksum(p,l) (~csum_fold(csum_partial(p, l, 0)))
318
319 #include "h/sktypes.h"
320 #include "h/skerror.h"
321@@ -88,10 +75,15 @@
322 #include "h/lm80.h"
323 #include "h/xmac_ii.h"
324
325+#ifndef SK_BMU_RX_WM_PEX
326+#define SK_BMU_RX_WM_PEX 0x80
327+#endif
328+
329 #ifdef __LITTLE_ENDIAN
330 #define SK_LITTLE_ENDIAN
331 #else
332 #define SK_BIG_ENDIAN
333+#define SK_USE_REV_DESC
334 #endif
335
336 #define SK_NET_DEVICE net_device
337@@ -107,7 +99,7 @@
338 #define SK_MAX_MACS 2
339 #define SK_MAX_NETS 2
340
341-#define SK_IOC char __iomem *
342+#define SK_IOC char*
343
344 typedef struct s_DrvRlmtMbuf SK_MBUF;
345
346@@ -186,3 +178,8 @@
347
348 #endif
349
350+/*******************************************************************************
351+ *
352+ * End of file
353+ *
354+ ******************************************************************************/
355diff -ruN linux/drivers/net/sk98lin/h/skdrv2nd.h linux-new/drivers/net/sk98lin/h/skdrv2nd.h
356--- linux/drivers/net/sk98lin/h/skdrv2nd.h 2006-04-11 19:19:28.000000000 +0200
357+++ linux-new/drivers/net/sk98lin/h/skdrv2nd.h 2006-01-18 14:37:24.000000000 +0100
358@@ -1,17 +1,17 @@
359 /******************************************************************************
360 *
361- * Name: skdrv2nd.h
362- * Project: GEnesis, PCI Gigabit Ethernet Adapter
363- * Version: $Revision$
364- * Date: $Date$
365- * Purpose: Second header file for driver and all other modules
366+ * Name: skdrv2nd.h
367+ * Project: GEnesis, PCI Gigabit Ethernet Adapter
368+ * Version: $Revision$
369+ * Date: $Date$
370+ * Purpose: Second header file for driver and all other modules
371 *
372 ******************************************************************************/
373
374 /******************************************************************************
375 *
376 * (C)Copyright 1998-2002 SysKonnect GmbH.
377- * (C)Copyright 2002-2003 Marvell.
378+ * (C)Copyright 2002-2005 Marvell.
379 *
380 * This program is free software; you can redistribute it and/or modify
381 * it under the terms of the GNU General Public License as published by
382@@ -42,10 +42,11 @@
383 #include "h/skqueue.h"
384 #include "h/skgehwt.h"
385 #include "h/sktimer.h"
386-#include "h/ski2c.h"
387+#include "h/sktwsi.h"
388 #include "h/skgepnmi.h"
389 #include "h/skvpd.h"
390 #include "h/skgehw.h"
391+#include "h/sky2le.h"
392 #include "h/skgeinit.h"
393 #include "h/skaddr.h"
394 #include "h/skgesirq.h"
395@@ -53,103 +54,191 @@
396 #include "h/skrlmt.h"
397 #include "h/skgedrv.h"
398
399+/* Defines for the poll cotroller */
400+#define SK_NETDUMP_POLL
401
402-extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned);
403-extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*);
404-extern SK_U64 SkOsGetTime(SK_AC*);
405-extern int SkPciReadCfgDWord(SK_AC*, int, SK_U32*);
406-extern int SkPciReadCfgWord(SK_AC*, int, SK_U16*);
407-extern int SkPciReadCfgByte(SK_AC*, int, SK_U8*);
408-extern int SkPciWriteCfgWord(SK_AC*, int, SK_U16);
409-extern int SkPciWriteCfgByte(SK_AC*, int, SK_U8);
410-extern int SkDrvEvent(SK_AC*, SK_IOC IoC, SK_U32, SK_EVPARA);
411-
412-#ifdef SK_DIAG_SUPPORT
413-extern int SkDrvEnterDiagMode(SK_AC *pAc);
414-extern int SkDrvLeaveDiagMode(SK_AC *pAc);
415+#ifdef SK_NETDUMP_POLL
416+#ifdef HAVE_POLL_CONTROLLER
417+#define SK_POLL_CONTROLLER
418+#define CONFIG_SK98LIN_NAPI
419+#elif CONFIG_NET_POLL_CONTROLLER
420+#define SK_POLL_CONTROLLER
421+#define CONFIG_SK98LIN_NAPI
422 #endif
423+#endif
424+
425+
426+/******************************************************************************
427+ *
428+ * Generic driver defines
429+ *
430+ ******************************************************************************/
431+
432+#define USE_TIST_FOR_RESET /* Use timestamp for reset */
433+#define Y2_RECOVERY /* use specific recovery yukon2 functions */
434+#define Y2_LE_CHECK /* activate check for LE order */
435+#define Y2_SYNC_CHECK /* activate check for receiver in sync */
436+#define SK_YUKON2 /* Enable Yukon2 dual net support */
437+#define USE_SK_TX_CHECKSUM /* use the tx hw checksum driver functionality */
438+#define USE_SK_RX_CHECKSUM /* use the rx hw checksum driver functionality */
439+#define USE_SK_TSO_FEATURE /* use TCP segmentation offload if possible */
440+#define SK_COPY_THRESHOLD 50 /* threshold for copying small RX frames;
441+ * 0 avoids copying, 9001 copies all */
442+#define SK_MAX_CARD_PARAM 16 /* number of adapters that can be configured via
443+ * command line params */
444+//#define USE_TX_COMPLETE /* use of a transmit complete interrupt */
445+#define Y2_RX_CHECK /* RX Check timestamp */
446+
447+/*
448+ * use those defines for a compile-in version of the driver instead
449+ * of command line parameters
450+ */
451+// #define LINK_SPEED_A {"Auto",}
452+// #define LINK_SPEED_B {"Auto",}
453+// #define AUTO_NEG_A {"Sense",}
454+// #define AUTO_NEG_B {"Sense"}
455+// #define DUP_CAP_A {"Both",}
456+// #define DUP_CAP_B {"Both",}
457+// #define FLOW_CTRL_A {"SymOrRem",}
458+// #define FLOW_CTRL_B {"SymOrRem",}
459+// #define ROLE_A {"Auto",}
460+// #define ROLE_B {"Auto",}
461+// #define PREF_PORT {"A",}
462+// #define CON_TYPE {"Auto",}
463+// #define RLMT_MODE {"CheckLinkState",}
464+
465+#ifdef Y2_RECOVERY
466+#define CHECK_TRANSMIT_TIMEOUT
467+#define Y2_RESYNC_WATERMARK 1000000L
468+#endif
469+
470+
471+/******************************************************************************
472+ *
473+ * Generic ISR defines
474+ *
475+ ******************************************************************************/
476+
477+#define SkIsrRetVar irqreturn_t
478+#define SkIsrRetNone IRQ_NONE
479+#define SkIsrRetHandled IRQ_HANDLED
480+
481+#define DEV_KFREE_SKB(skb) dev_kfree_skb(skb)
482+#define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb)
483+#define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb)
484+
485+/******************************************************************************
486+ *
487+ * Global function prototypes
488+ *
489+ ******************************************************************************/
490+
491+extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned);
492+extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*);
493+extern SK_U64 SkOsGetTime(SK_AC*);
494+extern int SkPciReadCfgDWord(SK_AC*, int, SK_U32*);
495+extern int SkPciReadCfgWord(SK_AC*, int, SK_U16*);
496+extern int SkPciReadCfgByte(SK_AC*, int, SK_U8*);
497+extern int SkPciWriteCfgDWord(SK_AC*, int, SK_U32);
498+extern int SkPciWriteCfgWord(SK_AC*, int, SK_U16);
499+extern int SkPciWriteCfgByte(SK_AC*, int, SK_U8);
500+extern int SkDrvEvent(SK_AC*, SK_IOC IoC, SK_U32, SK_EVPARA);
501+extern int SkDrvEnterDiagMode(SK_AC *pAc);
502+extern int SkDrvLeaveDiagMode(SK_AC *pAc);
503+
504+/******************************************************************************
505+ *
506+ * Linux specific RLMT buffer structure (SK_MBUF typedef in skdrv1st)!
507+ *
508+ ******************************************************************************/
509
510 struct s_DrvRlmtMbuf {
511- SK_MBUF *pNext; /* Pointer to next RLMT Mbuf. */
512- SK_U8 *pData; /* Data buffer (virtually contig.). */
513- unsigned Size; /* Data buffer size. */
514- unsigned Length; /* Length of packet (<= Size). */
515- SK_U32 PortIdx; /* Receiving/transmitting port. */
516+ SK_MBUF *pNext; /* Pointer to next RLMT Mbuf. */
517+ SK_U8 *pData; /* Data buffer (virtually contig.). */
518+ unsigned Size; /* Data buffer size. */
519+ unsigned Length; /* Length of packet (<= Size). */
520+ SK_U32 PortIdx; /* Receiving/transmitting port. */
521 #ifdef SK_RLMT_MBUF_PRIVATE
522- SK_RLMT_MBUF Rlmt; /* Private part for RLMT. */
523-#endif /* SK_RLMT_MBUF_PRIVATE */
524- struct sk_buff *pOs; /* Pointer to message block */
525+ SK_RLMT_MBUF Rlmt; /* Private part for RLMT. */
526+#endif
527+ struct sk_buff *pOs; /* Pointer to message block */
528 };
529
530+/******************************************************************************
531+ *
532+ * Linux specific TIME defines
533+ *
534+ ******************************************************************************/
535
536-/*
537- * Time macros
538- */
539 #if SK_TICKS_PER_SEC == 100
540 #define SK_PNMI_HUNDREDS_SEC(t) (t)
541 #else
542-#define SK_PNMI_HUNDREDS_SEC(t) ((((unsigned long)t) * 100) / \
543- (SK_TICKS_PER_SEC))
544+#define SK_PNMI_HUNDREDS_SEC(t) ((((unsigned long)t)*100)/(SK_TICKS_PER_SEC))
545 #endif
546
547-/*
548- * New SkOsGetTime
549- */
550 #define SkOsGetTimeCurrent(pAC, pUsec) {\
551+ static struct timeval prev_t; \
552 struct timeval t;\
553 do_gettimeofday(&t);\
554- *pUsec = ((((t.tv_sec) * 1000000L)+t.tv_usec)/10000);\
555+ if (prev_t.tv_sec == t.tv_sec) { \
556+ if (prev_t.tv_usec > t.tv_usec) { \
557+ t.tv_usec = prev_t.tv_usec; \
558+ } else { \
559+ prev_t.tv_usec = t.tv_usec; \
560+ } \
561+ } else { \
562+ prev_t = t; \
563+ } \
564+ *pUsec = ((t.tv_sec*100L)+(t.tv_usec/10000));\
565 }
566
567+/******************************************************************************
568+ *
569+ * Linux specific IOCTL defines and typedefs
570+ *
571+ ******************************************************************************/
572
573-/*
574- * ioctl definitions
575- */
576-#define SK_IOCTL_BASE (SIOCDEVPRIVATE)
577-#define SK_IOCTL_GETMIB (SK_IOCTL_BASE + 0)
578-#define SK_IOCTL_SETMIB (SK_IOCTL_BASE + 1)
579-#define SK_IOCTL_PRESETMIB (SK_IOCTL_BASE + 2)
580-#define SK_IOCTL_GEN (SK_IOCTL_BASE + 3)
581-#define SK_IOCTL_DIAG (SK_IOCTL_BASE + 4)
582-
583-typedef struct s_IOCTL SK_GE_IOCTL;
584+#define SK_IOCTL_BASE (SIOCDEVPRIVATE)
585+#define SK_IOCTL_GETMIB (SK_IOCTL_BASE + 0)
586+#define SK_IOCTL_SETMIB (SK_IOCTL_BASE + 1)
587+#define SK_IOCTL_PRESETMIB (SK_IOCTL_BASE + 2)
588+#define SK_IOCTL_GEN (SK_IOCTL_BASE + 3)
589+#define SK_IOCTL_DIAG (SK_IOCTL_BASE + 4)
590
591+typedef struct s_IOCTL SK_GE_IOCTL;
592 struct s_IOCTL {
593 char __user * pData;
594 unsigned int Len;
595 };
596
597+/******************************************************************************
598+ *
599+ * Generic sizes and length definitions
600+ *
601+ ******************************************************************************/
602
603-/*
604- * define sizes of descriptor rings in bytes
605- */
606-
607-#define TX_RING_SIZE (8*1024)
608-#define RX_RING_SIZE (24*1024)
609-
610-/*
611- * Buffer size for ethernet packets
612- */
613-#define ETH_BUF_SIZE 1540
614-#define ETH_MAX_MTU 1514
615-#define ETH_MIN_MTU 60
616-#define ETH_MULTICAST_BIT 0x01
617-#define SK_JUMBO_MTU 9000
618-
619-/*
620- * transmit priority selects the queue: LOW=asynchron, HIGH=synchron
621- */
622-#define TX_PRIO_LOW 0
623-#define TX_PRIO_HIGH 1
624+#define TX_RING_SIZE (24*1024) /* GEnesis/Yukon */
625+#define RX_RING_SIZE (24*1024) /* GEnesis/Yukon */
626+#define RX_MAX_NBR_BUFFERS 128 /* Yukon-EC/-II */
627+#define TX_MAX_NBR_BUFFERS 128 /* Yukon-EC/-II */
628+#define MAXIMUM_LOW_ADDRESS 0xFFFFFFFF /* Max. low address */
629+
630+#define ETH_BUF_SIZE 1560 /* multiples of 8 bytes */
631+#define ETH_MAX_MTU 1514
632+#define ETH_MIN_MTU 60
633+#define ETH_MULTICAST_BIT 0x01
634+#define SK_JUMBO_MTU 9000
635+
636+#define TX_PRIO_LOW 0 /* asynchronous queue */
637+#define TX_PRIO_HIGH 1 /* synchronous queue */
638+#define DESCR_ALIGN 64 /* alignment of Rx/Tx descriptors */
639
640-/*
641- * alignment of rx/tx descriptors
642- */
643-#define DESCR_ALIGN 64
644+/******************************************************************************
645+ *
646+ * PNMI related definitions
647+ *
648+ ******************************************************************************/
649
650-/*
651- * definitions for pnmi. TODO
652- */
653 #define SK_DRIVER_RESET(pAC, IoC) 0
654 #define SK_DRIVER_SENDEVENT(pAC, IoC) 0
655 #define SK_DRIVER_SELFTEST(pAC, IoC) 0
656@@ -158,20 +247,16 @@
657 #define SK_DRIVER_SET_MTU(pAc,IoC,i,v) 0
658 #define SK_DRIVER_PRESET_MTU(pAc,IoC,i,v) 0
659
660-/*
661-** Interim definition of SK_DRV_TIMER placed in this file until
662-** common modules have boon finallized
663-*/
664-#define SK_DRV_TIMER 11
665-#define SK_DRV_MODERATION_TIMER 1
666-#define SK_DRV_MODERATION_TIMER_LENGTH 1000000 /* 1 second */
667-#define SK_DRV_RX_CLEANUP_TIMER 2
668-#define SK_DRV_RX_CLEANUP_TIMER_LENGTH 1000000 /* 100 millisecs */
669
670-/*
671-** Definitions regarding transmitting frames
672-** any calculating any checksum.
673-*/
674+/******************************************************************************
675+ *
676+ * Various offsets and sizes
677+ *
678+ ******************************************************************************/
679+
680+#define SK_DRV_MODERATION_TIMER 1 /* id */
681+#define SK_DRV_MODERATION_TIMER_LENGTH 1 /* 1 second */
682+
683 #define C_LEN_ETHERMAC_HEADER_DEST_ADDR 6
684 #define C_LEN_ETHERMAC_HEADER_SRC_ADDR 6
685 #define C_LEN_ETHERMAC_HEADER_LENTYPE 2
686@@ -197,112 +282,445 @@
687 #define C_PROTO_ID_UDP 17 /* refer to RFC 790 or Stevens' */
688 #define C_PROTO_ID_TCP 6 /* TCP/IP illustrated for details */
689
690-/* TX and RX descriptors *****************************************************/
691+/******************************************************************************
692+ *
693+ * Tx and Rx descriptor definitions
694+ *
695+ ******************************************************************************/
696
697 typedef struct s_RxD RXD; /* the receive descriptor */
698-
699 struct s_RxD {
700- volatile SK_U32 RBControl; /* Receive Buffer Control */
701- SK_U32 VNextRxd; /* Next receive descriptor,low dword */
702- SK_U32 VDataLow; /* Receive buffer Addr, low dword */
703- SK_U32 VDataHigh; /* Receive buffer Addr, high dword */
704- SK_U32 FrameStat; /* Receive Frame Status word */
705- SK_U32 TimeStamp; /* Time stamp from XMAC */
706- SK_U32 TcpSums; /* TCP Sum 2 / TCP Sum 1 */
707- SK_U32 TcpSumStarts; /* TCP Sum Start 2 / TCP Sum Start 1 */
708- RXD *pNextRxd; /* Pointer to next Rxd */
709- struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */
710+ volatile SK_U32 RBControl; /* Receive Buffer Control */
711+ SK_U32 VNextRxd; /* Next receive descriptor,low dword */
712+ SK_U32 VDataLow; /* Receive buffer Addr, low dword */
713+ SK_U32 VDataHigh; /* Receive buffer Addr, high dword */
714+ SK_U32 FrameStat; /* Receive Frame Status word */
715+ SK_U32 TimeStamp; /* Time stamp from XMAC */
716+ SK_U32 TcpSums; /* TCP Sum 2 / TCP Sum 1 */
717+ SK_U32 TcpSumStarts; /* TCP Sum Start 2 / TCP Sum Start 1 */
718+ RXD *pNextRxd; /* Pointer to next Rxd */
719+ struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */
720 };
721
722 typedef struct s_TxD TXD; /* the transmit descriptor */
723-
724 struct s_TxD {
725- volatile SK_U32 TBControl; /* Transmit Buffer Control */
726- SK_U32 VNextTxd; /* Next transmit descriptor,low dword */
727- SK_U32 VDataLow; /* Transmit Buffer Addr, low dword */
728- SK_U32 VDataHigh; /* Transmit Buffer Addr, high dword */
729- SK_U32 FrameStat; /* Transmit Frame Status Word */
730- SK_U32 TcpSumOfs; /* Reserved / TCP Sum Offset */
731- SK_U16 TcpSumSt; /* TCP Sum Start */
732- SK_U16 TcpSumWr; /* TCP Sum Write */
733- SK_U32 TcpReserved; /* not used */
734- TXD *pNextTxd; /* Pointer to next Txd */
735- struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */
736+ volatile SK_U32 TBControl; /* Transmit Buffer Control */
737+ SK_U32 VNextTxd; /* Next transmit descriptor,low dword */
738+ SK_U32 VDataLow; /* Transmit Buffer Addr, low dword */
739+ SK_U32 VDataHigh; /* Transmit Buffer Addr, high dword */
740+ SK_U32 FrameStat; /* Transmit Frame Status Word */
741+ SK_U32 TcpSumOfs; /* Reserved / TCP Sum Offset */
742+ SK_U16 TcpSumSt; /* TCP Sum Start */
743+ SK_U16 TcpSumWr; /* TCP Sum Write */
744+ SK_U32 TcpReserved; /* not used */
745+ TXD *pNextTxd; /* Pointer to next Txd */
746+ struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */
747+};
748+
749+/******************************************************************************
750+ *
751+ * Generic Yukon-II defines
752+ *
753+ ******************************************************************************/
754+
755+#define LE_SIZE sizeof(SK_HWLE)
756+#define MAX_NUM_FRAGS (MAX_SKB_FRAGS + 1)
757+#define MIN_LEN_OF_LE_TAB 128
758+#define MAX_LEN_OF_LE_TAB 4096
759+#define MAX_UNUSED_RX_LE_WORKING 8
760+#ifdef MAX_FRAG_OVERHEAD
761+#undef MAX_FRAG_OVERHEAD
762+#define MAX_FRAG_OVERHEAD 4
763+#endif
764+// as we have a maximum of 16 physical fragments,
765+// maximum 1 ADDR64 per physical fragment
766+// maximum 4 LEs for VLAN, Csum, LargeSend, Packet
767+#define MIN_LE_FREE_REQUIRED ((16*2) + 4)
768+#define IS_GMAC(pAc) (!pAc->GIni.GIGenesis)
769+#ifdef USE_SYNC_TX_QUEUE
770+#define TXS_MAX_LE 256
771+#else /* !USE_SYNC_TX_QUEUE */
772+#define TXS_MAX_LE 0
773+#endif
774+
775+#define ETHER_MAC_HDR_LEN (6+6+2) // MAC SRC ADDR, MAC DST ADDR, TYPE
776+#define IP_HDR_LEN 20
777+#define TCP_CSUM_OFFS 0x10
778+#define UDP_CSUM_OFFS 0x06
779+#define TXA_MAX_LE 256
780+#define RX_MAX_LE 256
781+#define ST_MAX_LE (SK_MAX_MACS)*((3*RX_MAX_LE)+(TXA_MAX_LE)+(TXS_MAX_LE))
782+
783+#if (defined (Y2_RECOVERY) || defined (Y2_LE_CHECK))
784+/* event for recovery from tx hang or rx out of sync */
785+#define SK_DRV_RECOVER 17
786+#endif
787+/******************************************************************************
788+ *
789+ * Structures specific for Yukon-II
790+ *
791+ ******************************************************************************/
792+
793+typedef struct s_frag SK_FRAG;
794+struct s_frag {
795+ SK_FRAG *pNext;
796+ char *pVirt;
797+ SK_U64 pPhys;
798+ unsigned int FragLen;
799 };
800
801-/* Used interrupt bits in the interrupts source register *********************/
802+typedef struct s_packet SK_PACKET;
803+struct s_packet {
804+ /* Common infos: */
805+ SK_PACKET *pNext; /* pointer for packet queues */
806+ unsigned int PacketLen; /* length of packet */
807+ unsigned int NumFrags; /* nbr of fragments (for Rx always 1) */
808+ SK_FRAG *pFrag; /* fragment list */
809+ SK_FRAG FragArray[MAX_NUM_FRAGS]; /* TX fragment array */
810+ unsigned int NextLE; /* next LE to use for the next packet */
811+
812+ /* Private infos: */
813+ struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */
814+};
815+
816+typedef struct s_queue SK_PKT_QUEUE;
817+struct s_queue {
818+ SK_PACKET *pHead;
819+ SK_PACKET *pTail;
820+ spinlock_t QueueLock; /* serialize packet accesses */
821+};
822+
823+/*******************************************************************************
824+ *
825+ * Macros specific for Yukon-II queues
826+ *
827+ ******************************************************************************/
828+
829+#define IS_Q_EMPTY(pQueue) ((pQueue)->pHead != NULL) ? SK_FALSE : SK_TRUE
830+#define IS_Q_LOCKED(pQueue) spin_is_locked(&((pQueue)->QueueLock))
831+
832+#define PLAIN_POP_FIRST_PKT_FROM_QUEUE(pQueue, pPacket) { \
833+ if ((pQueue)->pHead != NULL) { \
834+ (pPacket) = (pQueue)->pHead; \
835+ (pQueue)->pHead = (pPacket)->pNext; \
836+ if ((pQueue)->pHead == NULL) { \
837+ (pQueue)->pTail = NULL; \
838+ } \
839+ (pPacket)->pNext = NULL; \
840+ } else { \
841+ (pPacket) = NULL; \
842+ } \
843+}
844+
845+#define PLAIN_PUSH_PKT_AS_FIRST_IN_QUEUE(pQueue, pPacket) { \
846+ if ((pQueue)->pHead != NULL) { \
847+ (pPacket)->pNext = (pQueue)->pHead; \
848+ } else { \
849+ (pPacket)->pNext = NULL; \
850+ (pQueue)->pTail = (pPacket); \
851+ } \
852+ (pQueue)->pHead = (pPacket); \
853+}
854+
855+#define PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(pQueue, pPacket) { \
856+ (pPacket)->pNext = NULL; \
857+ if ((pQueue)->pTail != NULL) { \
858+ (pQueue)->pTail->pNext = (pPacket); \
859+ } else { \
860+ (pQueue)->pHead = (pPacket); \
861+ } \
862+ (pQueue)->pTail = (pPacket); \
863+}
864+
865+#define PLAIN_PUSH_MULTIPLE_PKT_AS_LAST_IN_QUEUE(pQueue,pPktGrpStart,pPktGrpEnd) { \
866+ if ((pPktGrpStart) != NULL) { \
867+ if ((pQueue)->pTail != NULL) { \
868+ (pQueue)->pTail->pNext = (pPktGrpStart); \
869+ } else { \
870+ (pQueue)->pHead = (pPktGrpStart); \
871+ } \
872+ (pQueue)->pTail = (pPktGrpEnd); \
873+ } \
874+}
875+
876+/* Required: 'Flags' */
877+#define POP_FIRST_PKT_FROM_QUEUE(pQueue, pPacket) { \
878+ spin_lock_irqsave(&((pQueue)->QueueLock), Flags); \
879+ if ((pQueue)->pHead != NULL) { \
880+ (pPacket) = (pQueue)->pHead; \
881+ (pQueue)->pHead = (pPacket)->pNext; \
882+ if ((pQueue)->pHead == NULL) { \
883+ (pQueue)->pTail = NULL; \
884+ } \
885+ (pPacket)->pNext = NULL; \
886+ } else { \
887+ (pPacket) = NULL; \
888+ } \
889+ spin_unlock_irqrestore(&((pQueue)->QueueLock), Flags); \
890+}
891+
892+/* Required: 'Flags' */
893+#define PUSH_PKT_AS_FIRST_IN_QUEUE(pQueue, pPacket) { \
894+ spin_lock_irqsave(&(pQueue)->QueueLock, Flags); \
895+ if ((pQueue)->pHead != NULL) { \
896+ (pPacket)->pNext = (pQueue)->pHead; \
897+ } else { \
898+ (pPacket)->pNext = NULL; \
899+ (pQueue)->pTail = (pPacket); \
900+ } \
901+ (pQueue)->pHead = (pPacket); \
902+ spin_unlock_irqrestore(&(pQueue)->QueueLock, Flags); \
903+}
904+
905+/* Required: 'Flags' */
906+#define PUSH_PKT_AS_LAST_IN_QUEUE(pQueue, pPacket) { \
907+ (pPacket)->pNext = NULL; \
908+ spin_lock_irqsave(&(pQueue)->QueueLock, Flags); \
909+ if ((pQueue)->pTail != NULL) { \
910+ (pQueue)->pTail->pNext = (pPacket); \
911+ } else { \
912+ (pQueue)->pHead = (pPacket); \
913+ } \
914+ (pQueue)->pTail = (pPacket); \
915+ spin_unlock_irqrestore(&(pQueue)->QueueLock, Flags); \
916+}
917+
918+/* Required: 'Flags' */
919+#define PUSH_MULTIPLE_PKT_AS_LAST_IN_QUEUE(pQueue,pPktGrpStart,pPktGrpEnd) { \
920+ if ((pPktGrpStart) != NULL) { \
921+ spin_lock_irqsave(&(pQueue)->QueueLock, Flags); \
922+ if ((pQueue)->pTail != NULL) { \
923+ (pQueue)->pTail->pNext = (pPktGrpStart); \
924+ } else { \
925+ (pQueue)->pHead = (pPktGrpStart); \
926+ } \
927+ (pQueue)->pTail = (pPktGrpEnd); \
928+ spin_unlock_irqrestore(&(pQueue)->QueueLock, Flags); \
929+ } \
930+}
931+
932+/*
933+ *Check if the low address (32 bit) is near the 4G limit or over it.
934+ * Set the high address to a wrong value.
935+ * Doing so we force to write the ADDR64 LE.
936+ */
937+#define CHECK_LOW_ADDRESS( _HighAddress, _LowAddress , _Length) { \
938+ if ((~0-_LowAddress) <_Length) { \
939+ _HighAddress= MAXIMUM_LOW_ADDRESS; \
940+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, \
941+ ("High Address must be set for HW. LowAddr = %d Length = %d\n", \
942+ _LowAddress, _Length)); \
943+ } \
944+}
945+
946+/*******************************************************************************
947+ *
948+ * Macros specific for Yukon-II queues (tist)
949+ *
950+ ******************************************************************************/
951+
952+#ifdef USE_TIST_FOR_RESET
953+/* port is fully operational */
954+#define SK_PSTATE_NOT_WAITING_FOR_TIST 0
955+/* port in reset until any tist LE */
956+#define SK_PSTATE_WAITING_FOR_ANY_TIST BIT_0
957+/* port in reset until timer reaches pAC->MinTistLo */
958+#define SK_PSTATE_WAITING_FOR_SPECIFIC_TIST BIT_1
959+#define SK_PSTATE_PORT_SHIFT 4
960+#define SK_PSTATE_PORT_MASK ((1 << SK_PSTATE_PORT_SHIFT) - 1)
961+
962+/* use this + Port to build OP_MOD_TXINDEX_NO_PORT_A|B */
963+#define OP_MOD_TXINDEX 0x71
964+/* opcode for a TX_INDEX LE in which Port A has to be ignored */
965+#define OP_MOD_TXINDEX_NO_PORT_A 0x71
966+/* opcode for a TX_INDEX LE in which Port B has to be ignored */
967+#define OP_MOD_TXINDEX_NO_PORT_B 0x72
968+/* opcode for LE to be ignored because port is still in reset */
969+#define OP_MOD_LE 0x7F
970+
971+/* set tist wait mode Bit for port */
972+#define SK_SET_WAIT_BIT_FOR_PORT(pAC, Bit, Port) \
973+ { \
974+ (pAC)->AdapterResetState |= ((Bit) << (SK_PSTATE_PORT_SHIFT * Port)); \
975+ }
976+
977+/* reset tist waiting for specified port */
978+#define SK_CLR_STATE_FOR_PORT(pAC, Port) \
979+ { \
980+ (pAC)->AdapterResetState &= \
981+ ~(SK_PSTATE_PORT_MASK << (SK_PSTATE_PORT_SHIFT * Port)); \
982+ }
983+
984+/* return SK_TRUE when port is in reset waiting for tist */
985+#define SK_PORT_WAITING_FOR_TIST(pAC, Port) \
986+ ((((pAC)->AdapterResetState >> (SK_PSTATE_PORT_SHIFT * Port)) & \
987+ SK_PSTATE_PORT_MASK) != SK_PSTATE_NOT_WAITING_FOR_TIST)
988+
989+/* return SK_TRUE when port is in reset waiting for any tist */
990+#define SK_PORT_WAITING_FOR_ANY_TIST(pAC, Port) \
991+ ((((pAC)->AdapterResetState >> (SK_PSTATE_PORT_SHIFT * Port)) & \
992+ SK_PSTATE_WAITING_FOR_ANY_TIST) == SK_PSTATE_WAITING_FOR_ANY_TIST)
993+
994+/* return SK_TRUE when port is in reset waiting for a specific tist */
995+#define SK_PORT_WAITING_FOR_SPECIFIC_TIST(pAC, Port) \
996+ ((((pAC)->AdapterResetState >> (SK_PSTATE_PORT_SHIFT * Port)) & \
997+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST) == \
998+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST)
999+
1000+/* return whether adapter is expecting a tist LE */
1001+#define SK_ADAPTER_WAITING_FOR_TIST(pAC) ((pAC)->AdapterResetState != 0)
1002+
1003+/* enable timestamp timer and force creation of tist LEs */
1004+#define Y2_ENABLE_TIST(IoC) \
1005+ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8) GMT_ST_START)
1006+
1007+/* disable timestamp timer and stop creation of tist LEs */
1008+#define Y2_DISABLE_TIST(IoC) \
1009+ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8) GMT_ST_STOP)
1010+
1011+/* get current value of timestamp timer */
1012+#define Y2_GET_TIST_LOW_VAL(IoC, pVal) \
1013+ SK_IN32(IoC, GMAC_TI_ST_VAL, pVal)
1014
1015-#define DRIVER_IRQS ((IS_IRQ_SW) | \
1016- (IS_R1_F) |(IS_R2_F) | \
1017- (IS_XS1_F) |(IS_XA1_F) | \
1018- (IS_XS2_F) |(IS_XA2_F))
1019-
1020-#define SPECIAL_IRQS ((IS_HW_ERR) |(IS_I2C_READY) | \
1021- (IS_EXT_REG) |(IS_TIMINT) | \
1022- (IS_PA_TO_RX1) |(IS_PA_TO_RX2) | \
1023- (IS_PA_TO_TX1) |(IS_PA_TO_TX2) | \
1024- (IS_MAC1) |(IS_LNK_SYNC_M1)| \
1025- (IS_MAC2) |(IS_LNK_SYNC_M2)| \
1026- (IS_R1_C) |(IS_R2_C) | \
1027- (IS_XS1_C) |(IS_XA1_C) | \
1028- (IS_XS2_C) |(IS_XA2_C))
1029-
1030-#define IRQ_MASK ((IS_IRQ_SW) | \
1031- (IS_R1_B) |(IS_R1_F) |(IS_R2_B) |(IS_R2_F) | \
1032- (IS_XS1_B) |(IS_XS1_F) |(IS_XA1_B)|(IS_XA1_F)| \
1033- (IS_XS2_B) |(IS_XS2_F) |(IS_XA2_B)|(IS_XA2_F)| \
1034- (IS_HW_ERR) |(IS_I2C_READY)| \
1035- (IS_EXT_REG) |(IS_TIMINT) | \
1036- (IS_PA_TO_RX1) |(IS_PA_TO_RX2)| \
1037- (IS_PA_TO_TX1) |(IS_PA_TO_TX2)| \
1038- (IS_MAC1) |(IS_MAC2) | \
1039- (IS_R1_C) |(IS_R2_C) | \
1040- (IS_XS1_C) |(IS_XA1_C) | \
1041- (IS_XS2_C) |(IS_XA2_C))
1042+#endif
1043
1044-#define IRQ_HWE_MASK (IS_ERR_MSK) /* enable all HW irqs */
1045+
1046+/*******************************************************************************
1047+ *
1048+ * Used interrupt bits in the interrupts source register
1049+ *
1050+ ******************************************************************************/
1051+
1052+#define DRIVER_IRQS ((IS_IRQ_SW) | \
1053+ (IS_R1_F) | (IS_R2_F) | \
1054+ (IS_XS1_F) | (IS_XA1_F) | \
1055+ (IS_XS2_F) | (IS_XA2_F))
1056+
1057+#define TX_COMPL_IRQS ((IS_XS1_B) | (IS_XS1_F) | \
1058+ (IS_XA1_B) | (IS_XA1_F) | \
1059+ (IS_XS2_B) | (IS_XS2_F) | \
1060+ (IS_XA2_B) | (IS_XA2_F))
1061+
1062+#define NAPI_DRV_IRQS ((IS_R1_F) | (IS_R2_F) | \
1063+ (IS_XS1_F) | (IS_XA1_F)| \
1064+ (IS_XS2_F) | (IS_XA2_F))
1065+
1066+#define Y2_DRIVER_IRQS ((Y2_IS_STAT_BMU) | (Y2_IS_IRQ_SW) | (Y2_IS_POLL_CHK))
1067+
1068+#define SPECIAL_IRQS ((IS_HW_ERR) |(IS_I2C_READY) | \
1069+ (IS_EXT_REG) |(IS_TIMINT) | \
1070+ (IS_PA_TO_RX1) |(IS_PA_TO_RX2) | \
1071+ (IS_PA_TO_TX1) |(IS_PA_TO_TX2) | \
1072+ (IS_MAC1) |(IS_LNK_SYNC_M1)| \
1073+ (IS_MAC2) |(IS_LNK_SYNC_M2)| \
1074+ (IS_R1_C) |(IS_R2_C) | \
1075+ (IS_XS1_C) |(IS_XA1_C) | \
1076+ (IS_XS2_C) |(IS_XA2_C))
1077+
1078+#define Y2_SPECIAL_IRQS ((Y2_IS_HW_ERR) |(Y2_IS_ASF) | \
1079+ (Y2_IS_TWSI_RDY) |(Y2_IS_TIMINT) | \
1080+ (Y2_IS_IRQ_PHY2) |(Y2_IS_IRQ_MAC2) | \
1081+ (Y2_IS_CHK_RX2) |(Y2_IS_CHK_TXS2) | \
1082+ (Y2_IS_CHK_TXA2) |(Y2_IS_IRQ_PHY1) | \
1083+ (Y2_IS_IRQ_MAC1) |(Y2_IS_CHK_RX1) | \
1084+ (Y2_IS_CHK_TXS1) |(Y2_IS_CHK_TXA1))
1085+
1086+#define IRQ_MASK ((IS_IRQ_SW) | \
1087+ (IS_R1_F) |(IS_R2_F) | \
1088+ (IS_XS1_F) |(IS_XA1_F) | \
1089+ (IS_XS2_F) |(IS_XA2_F) | \
1090+ (IS_HW_ERR) |(IS_I2C_READY)| \
1091+ (IS_EXT_REG) |(IS_TIMINT) | \
1092+ (IS_PA_TO_RX1) |(IS_PA_TO_RX2)| \
1093+ (IS_PA_TO_TX1) |(IS_PA_TO_TX2)| \
1094+ (IS_MAC1) |(IS_MAC2) | \
1095+ (IS_R1_C) |(IS_R2_C) | \
1096+ (IS_XS1_C) |(IS_XA1_C) | \
1097+ (IS_XS2_C) |(IS_XA2_C))
1098+
1099+#define Y2_IRQ_MASK ((Y2_DRIVER_IRQS) | (Y2_SPECIAL_IRQS))
1100+
1101+#define IRQ_HWE_MASK (IS_ERR_MSK) /* enable all HW irqs */
1102+#define Y2_IRQ_HWE_MASK (Y2_HWE_ALL_MSK) /* enable all HW irqs */
1103
1104 typedef struct s_DevNet DEV_NET;
1105
1106 struct s_DevNet {
1107- int PortNr;
1108- int NetNr;
1109- SK_AC *pAC;
1110+ struct proc_dir_entry *proc;
1111+ int PortNr;
1112+ int NetNr;
1113+ char InitialDevName[20];
1114+ SK_BOOL NetConsoleMode;
1115+#ifdef Y2_RECOVERY
1116+ struct timer_list KernelTimer; /* Kernel timer struct */
1117+ int TransmitTimeoutTimer; /* Transmit timer */
1118+ SK_BOOL TimerExpired; /* Transmit timer */
1119+ SK_BOOL InRecover; /* Recover flag */
1120+#ifdef Y2_RX_CHECK
1121+ SK_U32 PreviousMACFifoRP; /* Backup of the FRP */
1122+ SK_U32 PreviousMACFifoRLev; /* Backup of the FRL */
1123+ SK_U32 PreviousRXFifoRP; /* Backup of the RX FRP */
1124+ SK_U8 PreviousRXFifoRLev; /* Backup of the RX FRL */
1125+ SK_U32 LastJiffies; /* Backup of the jiffies*/
1126+#endif
1127+#endif
1128+ SK_AC *pAC;
1129 };
1130
1131-typedef struct s_TxPort TX_PORT;
1132+/*******************************************************************************
1133+ *
1134+ * Rx/Tx Port structures
1135+ *
1136+ ******************************************************************************/
1137
1138-struct s_TxPort {
1139- /* the transmit descriptor rings */
1140- caddr_t pTxDescrRing; /* descriptor area memory */
1141- SK_U64 VTxDescrRing; /* descr. area bus virt. addr. */
1142- TXD *pTxdRingHead; /* Head of Tx rings */
1143- TXD *pTxdRingTail; /* Tail of Tx rings */
1144- TXD *pTxdRingPrev; /* descriptor sent previously */
1145- int TxdRingFree; /* # of free entrys */
1146- spinlock_t TxDesRingLock; /* serialize descriptor accesses */
1147- SK_IOC HwAddr; /* bmu registers address */
1148- int PortIndex; /* index number of port (0 or 1) */
1149+typedef struct s_TxPort TX_PORT;
1150+struct s_TxPort { /* the transmit descriptor rings */
1151+ caddr_t pTxDescrRing; /* descriptor area memory */
1152+ SK_U64 VTxDescrRing; /* descr. area bus virt. addr. */
1153+ TXD *pTxdRingHead; /* Head of Tx rings */
1154+ TXD *pTxdRingTail; /* Tail of Tx rings */
1155+ TXD *pTxdRingPrev; /* descriptor sent previously */
1156+ int TxdRingPrevFree;/* previously # of free entrys */
1157+ int TxdRingFree; /* # of free entrys */
1158+ spinlock_t TxDesRingLock; /* serialize descriptor accesses */
1159+ caddr_t HwAddr; /* bmu registers address */
1160+ int PortIndex; /* index number of port (0 or 1) */
1161+ SK_PACKET *TransmitPacketTable;
1162+ SK_LE_TABLE TxALET; /* tx (async) list element table */
1163+ SK_LE_TABLE TxSLET; /* tx (sync) list element table */
1164+ SK_PKT_QUEUE TxQ_free;
1165+ SK_PKT_QUEUE TxAQ_waiting;
1166+ SK_PKT_QUEUE TxSQ_waiting;
1167+ SK_PKT_QUEUE TxAQ_working;
1168+ SK_PKT_QUEUE TxSQ_working;
1169+ unsigned LastDone;
1170 };
1171
1172-typedef struct s_RxPort RX_PORT;
1173-
1174-struct s_RxPort {
1175- /* the receive descriptor rings */
1176- caddr_t pRxDescrRing; /* descriptor area memory */
1177- SK_U64 VRxDescrRing; /* descr. area bus virt. addr. */
1178- RXD *pRxdRingHead; /* Head of Rx rings */
1179- RXD *pRxdRingTail; /* Tail of Rx rings */
1180- RXD *pRxdRingPrev; /* descriptor given to BMU previously */
1181- int RxdRingFree; /* # of free entrys */
1182- int RxCsum; /* use receive checksum hardware */
1183- spinlock_t RxDesRingLock; /* serialize descriptor accesses */
1184- int RxFillLimit; /* limit for buffers in ring */
1185- SK_IOC HwAddr; /* bmu registers address */
1186- int PortIndex; /* index number of port (0 or 1) */
1187+typedef struct s_RxPort RX_PORT;
1188+struct s_RxPort { /* the receive descriptor rings */
1189+ caddr_t pRxDescrRing; /* descriptor area memory */
1190+ SK_U64 VRxDescrRing; /* descr. area bus virt. addr. */
1191+ RXD *pRxdRingHead; /* Head of Rx rings */
1192+ RXD *pRxdRingTail; /* Tail of Rx rings */
1193+ RXD *pRxdRingPrev; /* descr given to BMU previously */
1194+ int RxdRingFree; /* # of free entrys */
1195+ spinlock_t RxDesRingLock; /* serialize descriptor accesses */
1196+ int RxFillLimit; /* limit for buffers in ring */
1197+ caddr_t HwAddr; /* bmu registers address */
1198+ int PortIndex; /* index number of port (0 or 1) */
1199+ SK_BOOL UseRxCsum; /* use Rx checksumming (yes/no) */
1200+ SK_PACKET *ReceivePacketTable;
1201+ SK_LE_TABLE RxLET; /* rx list element table */
1202+ SK_PKT_QUEUE RxQ_working;
1203+ SK_PKT_QUEUE RxQ_waiting;
1204+ int RxBufSize;
1205 };
1206
1207-/* Definitions needed for interrupt moderation *******************************/
1208+/*******************************************************************************
1209+ *
1210+ * Interrupt masks used in combination with interrupt moderation
1211+ *
1212+ ******************************************************************************/
1213
1214 #define IRQ_EOF_AS_TX ((IS_XA1_F) | (IS_XA2_F))
1215 #define IRQ_EOF_SY_TX ((IS_XS1_F) | (IS_XS2_F))
1216@@ -314,134 +732,151 @@
1217 #define IRQ_MASK_SP_TX ((SPECIAL_IRQS) | (IRQ_MASK_TX_ONLY))
1218 #define IRQ_MASK_RX_TX_SP ((SPECIAL_IRQS) | (IRQ_MASK_TX_RX))
1219
1220-#define C_INT_MOD_NONE 1
1221-#define C_INT_MOD_STATIC 2
1222-#define C_INT_MOD_DYNAMIC 4
1223-
1224-#define C_CLK_FREQ_GENESIS 53215000 /* shorter: 53.125 MHz */
1225-#define C_CLK_FREQ_YUKON 78215000 /* shorter: 78.125 MHz */
1226-
1227-#define C_INTS_PER_SEC_DEFAULT 2000
1228-#define C_INT_MOD_ENABLE_PERCENTAGE 50 /* if higher 50% enable */
1229-#define C_INT_MOD_DISABLE_PERCENTAGE 50 /* if lower 50% disable */
1230-#define C_INT_MOD_IPS_LOWER_RANGE 30
1231-#define C_INT_MOD_IPS_UPPER_RANGE 40000
1232-
1233-
1234-typedef struct s_DynIrqModInfo DIM_INFO;
1235-struct s_DynIrqModInfo {
1236- unsigned long PrevTimeVal;
1237- unsigned int PrevSysLoad;
1238- unsigned int PrevUsedTime;
1239- unsigned int PrevTotalTime;
1240- int PrevUsedDescrRatio;
1241- int NbrProcessedDescr;
1242- SK_U64 PrevPort0RxIntrCts;
1243- SK_U64 PrevPort1RxIntrCts;
1244- SK_U64 PrevPort0TxIntrCts;
1245- SK_U64 PrevPort1TxIntrCts;
1246- SK_BOOL ModJustEnabled; /* Moderation just enabled yes/no */
1247-
1248- int MaxModIntsPerSec; /* Moderation Threshold */
1249- int MaxModIntsPerSecUpperLimit; /* Upper limit for DIM */
1250- int MaxModIntsPerSecLowerLimit; /* Lower limit for DIM */
1251-
1252- long MaskIrqModeration; /* ModIrqType (eg. 'TxRx') */
1253- SK_BOOL DisplayStats; /* Stats yes/no */
1254- SK_BOOL AutoSizing; /* Resize DIM-timer on/off */
1255- int IntModTypeSelect; /* EnableIntMod (eg. 'dynamic') */
1256+#define IRQ_MASK_Y2_TX_ONLY (Y2_IS_STAT_BMU)
1257+#define IRQ_MASK_Y2_RX_ONLY (Y2_IS_STAT_BMU)
1258+#define IRQ_MASK_Y2_SP_ONLY (SPECIAL_IRQS)
1259+#define IRQ_MASK_Y2_TX_RX ((IRQ_MASK_TX_ONLY)| (IRQ_MASK_RX_ONLY))
1260+#define IRQ_MASK_Y2_SP_RX ((SPECIAL_IRQS) | (IRQ_MASK_RX_ONLY))
1261+#define IRQ_MASK_Y2_SP_TX ((SPECIAL_IRQS) | (IRQ_MASK_TX_ONLY))
1262+#define IRQ_MASK_Y2_RX_TX_SP ((SPECIAL_IRQS) | (IRQ_MASK_TX_RX))
1263
1264- SK_TIMER ModTimer; /* just some timer */
1265-};
1266+/*******************************************************************************
1267+ *
1268+ * Defines and typedefs regarding interrupt moderation
1269+ *
1270+ ******************************************************************************/
1271
1272-typedef struct s_PerStrm PER_STRM;
1273+#define C_INT_MOD_NONE 1
1274+#define C_INT_MOD_STATIC 2
1275+#define C_INT_MOD_DYNAMIC 4
1276+
1277+#define C_CLK_FREQ_GENESIS 53215000 /* or: 53.125 MHz */
1278+#define C_CLK_FREQ_YUKON 78215000 /* or: 78.125 MHz */
1279+#define C_CLK_FREQ_YUKON_EC 125000000 /* or: 125.000 MHz */
1280+
1281+#define C_Y2_INTS_PER_SEC_DEFAULT 5000
1282+#define C_INTS_PER_SEC_DEFAULT 2000
1283+#define C_INT_MOD_IPS_LOWER_RANGE 30 /* in IRQs/second */
1284+#define C_INT_MOD_IPS_UPPER_RANGE 40000 /* in IRQs/second */
1285+
1286+typedef struct s_DynIrqModInfo {
1287+ SK_U64 PrevPort0RxIntrCts;
1288+ SK_U64 PrevPort1RxIntrCts;
1289+ SK_U64 PrevPort0TxIntrCts;
1290+ SK_U64 PrevPort1TxIntrCts;
1291+ SK_U64 PrevPort0StatusLeIntrCts;
1292+ SK_U64 PrevPort1StatusLeIntrCts;
1293+ int MaxModIntsPerSec; /* Moderation Threshold */
1294+ int MaxModIntsPerSecUpperLimit; /* Upper limit for DIM */
1295+ int MaxModIntsPerSecLowerLimit; /* Lower limit for DIM */
1296+ long MaskIrqModeration; /* IRQ Mask (eg. 'TxRx') */
1297+ int IntModTypeSelect; /* Type (eg. 'dynamic') */
1298+ int DynIrqModSampleInterval; /* expressed in seconds! */
1299+ SK_TIMER ModTimer; /* Timer for dynamic mod. */
1300+} DIM_INFO;
1301
1302-#define SK_ALLOC_IRQ 0x00000001
1303+/*******************************************************************************
1304+ *
1305+ * Defines and typedefs regarding wake-on-lan
1306+ *
1307+ ******************************************************************************/
1308+
1309+typedef struct s_WakeOnLanInfo {
1310+ SK_U32 SupportedWolOptions; /* e.g. WAKE_PHY... */
1311+ SK_U32 ConfiguredWolOptions; /* e.g. WAKE_PHY... */
1312+} WOL_INFO;
1313
1314-#ifdef SK_DIAG_SUPPORT
1315+#define SK_ALLOC_IRQ 0x00000001
1316 #define DIAG_ACTIVE 1
1317 #define DIAG_NOTACTIVE 0
1318-#endif
1319
1320 /****************************************************************************
1321+ *
1322 * Per board structure / Adapter Context structure:
1323- * Allocated within attach(9e) and freed within detach(9e).
1324- * Contains all 'per device' necessary handles, flags, locks etc.:
1325- */
1326+ * Contains all 'per device' necessary handles, flags, locks etc.:
1327+ *
1328+ ******************************************************************************/
1329+
1330 struct s_AC {
1331- SK_GEINIT GIni; /* GE init struct */
1332- SK_PNMI Pnmi; /* PNMI data struct */
1333- SK_VPD vpd; /* vpd data struct */
1334- SK_QUEUE Event; /* Event queue */
1335- SK_HWT Hwt; /* Hardware Timer control struct */
1336- SK_TIMCTRL Tim; /* Software Timer control struct */
1337- SK_I2C I2c; /* I2C relevant data structure */
1338- SK_ADDR Addr; /* for Address module */
1339- SK_CSUM Csum; /* for checksum module */
1340- SK_RLMT Rlmt; /* for rlmt module */
1341- spinlock_t SlowPathLock; /* Normal IRQ lock */
1342- struct timer_list BlinkTimer; /* for LED blinking */
1343- int LedsOn;
1344- SK_PNMI_STRUCT_DATA PnmiStruct; /* structure to get all Pnmi-Data */
1345- int RlmtMode; /* link check mode to set */
1346- int RlmtNets; /* Number of nets */
1347-
1348- SK_IOC IoBase; /* register set of adapter */
1349- int BoardLevel; /* level of active hw init (0-2) */
1350-
1351- SK_U32 AllocFlag; /* flag allocation of resources */
1352- struct pci_dev *PciDev; /* for access to pci config space */
1353- struct SK_NET_DEVICE *dev[2]; /* pointer to device struct */
1354-
1355- int RxBufSize; /* length of receive buffers */
1356- struct net_device_stats stats; /* linux 'netstat -i' statistics */
1357- int Index; /* internal board index number */
1358-
1359- /* adapter RAM sizes for queues of active port */
1360- int RxQueueSize; /* memory used for receive queue */
1361- int TxSQueueSize; /* memory used for sync. tx queue */
1362- int TxAQueueSize; /* memory used for async. tx queue */
1363-
1364- int PromiscCount; /* promiscuous mode counter */
1365- int AllMultiCount; /* allmulticast mode counter */
1366- int MulticCount; /* number of different MC */
1367- /* addresses for this board */
1368- /* (may be more than HW can)*/
1369-
1370- int HWRevision; /* Hardware revision */
1371- int ActivePort; /* the active XMAC port */
1372- int MaxPorts; /* number of activated ports */
1373- int TxDescrPerRing; /* # of descriptors per tx ring */
1374- int RxDescrPerRing; /* # of descriptors per rx ring */
1375-
1376- caddr_t pDescrMem; /* Pointer to the descriptor area */
1377- dma_addr_t pDescrMemDMA; /* PCI DMA address of area */
1378-
1379- /* the port structures with descriptor rings */
1380- TX_PORT TxPort[SK_MAX_MACS][2];
1381- RX_PORT RxPort[SK_MAX_MACS];
1382-
1383- SK_BOOL CheckQueue; /* check event queue soon */
1384- SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */
1385- DIM_INFO DynIrqModInfo; /* all data related to DIM */
1386-
1387- /* Only for tests */
1388- int PortDown;
1389- int ChipsetType; /* Chipset family type
1390- * 0 == Genesis family support
1391- * 1 == Yukon family support
1392- */
1393-#ifdef SK_DIAG_SUPPORT
1394- SK_U32 DiagModeActive; /* is diag active? */
1395- SK_BOOL DiagFlowCtrl; /* for control purposes */
1396- SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for all Pnmi-Data */
1397- SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while
1398- * DIAG is busy with NIC
1399- */
1400+ SK_GEINIT GIni; /* GE init struct */
1401+ SK_PNMI Pnmi; /* PNMI data struct */
1402+ SK_VPD vpd; /* vpd data struct */
1403+ SK_QUEUE Event; /* Event queue */
1404+ SK_HWT Hwt; /* Hardware Timer ctrl struct */
1405+ SK_TIMCTRL Tim; /* Software Timer ctrl struct */
1406+ SK_I2C I2c; /* I2C relevant data structure*/
1407+ SK_ADDR Addr; /* for Address module */
1408+ SK_CSUM Csum; /* for checksum module */
1409+ SK_RLMT Rlmt; /* for rlmt module */
1410+ spinlock_t SlowPathLock; /* Normal IRQ lock */
1411+ spinlock_t InitLock; /* Init lock */
1412+ spinlock_t TxQueueLock; /* TX Queue lock */
1413+ SK_PNMI_STRUCT_DATA PnmiStruct; /* struct for all Pnmi-Data */
1414+ int RlmtMode; /* link check mode to set */
1415+ int RlmtNets; /* Number of nets */
1416+ SK_IOC IoBase; /* register set of adapter */
1417+ int BoardLevel; /* level of hw init (0-2) */
1418+ char DeviceStr[80]; /* adapter string from vpd */
1419+ SK_U32 AllocFlag; /* alloc flag of resources */
1420+ struct pci_dev *PciDev; /* for access to pci cfg space*/
1421+ SK_U32 PciDevId; /* pci device id */
1422+ struct SK_NET_DEVICE *dev[2]; /* pointer to device struct */
1423+ char Name[30]; /* driver name */
1424+ struct SK_NET_DEVICE *Next; /* link all devs for cleanup */
1425+ struct net_device_stats stats; /* linux 'netstat -i' stats */
1426+ int Index; /* internal board idx number */
1427+ int RxQueueSize; /* memory used for RX queue */
1428+ int TxSQueueSize; /* memory used for TXS queue */
1429+ int TxAQueueSize; /* memory used for TXA queue */
1430+ int PromiscCount; /* promiscuous mode counter */
1431+ int AllMultiCount; /* allmulticast mode counter */
1432+ int MulticCount; /* number of MC addresses used*/
1433+ int HWRevision; /* Hardware revision */
1434+ int ActivePort; /* the active XMAC port */
1435+ int MaxPorts; /* number of activated ports */
1436+ int TxDescrPerRing;/* # of descriptors TX ring */
1437+ int RxDescrPerRing;/* # of descriptors RX ring */
1438+ caddr_t pDescrMem; /* Ptr to the descriptor area */
1439+ dma_addr_t pDescrMemDMA; /* PCI DMA address of area */
1440+ SK_U32 PciState[16]; /* PCI state */
1441+ TX_PORT TxPort[SK_MAX_MACS][2];
1442+ RX_PORT RxPort[SK_MAX_MACS];
1443+ SK_LE_TABLE StatusLETable;
1444+ unsigned SizeOfAlignedLETables;
1445+ spinlock_t SetPutIndexLock;
1446+ int MaxUnusedRxLeWorking;
1447+ unsigned int CsOfs1; /* for checksum calculation */
1448+ unsigned int CsOfs2; /* for checksum calculation */
1449+ SK_U32 CsOfs; /* for checksum calculation */
1450+ SK_BOOL CheckQueue; /* check event queue soon */
1451+ DIM_INFO DynIrqModInfo; /* all data related to IntMod */
1452+ WOL_INFO WolInfo; /* all info regarding WOL */
1453+ int ChipsetType; /* 0=GENESIS; 1=Yukon */
1454+ SK_BOOL LowLatency; /* LowLatency optimization on?*/
1455+ SK_U32 DiagModeActive;/* is diag active? */
1456+ SK_BOOL DiagFlowCtrl; /* for control purposes */
1457+ SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for PNMI */
1458+ SK_BOOL WasIfUp[SK_MAX_MACS];
1459+#ifdef USE_TIST_FOR_RESET
1460+ int AdapterResetState;
1461+ SK_U32 MinTistLo;
1462+ SK_U32 MinTistHi;
1463+#endif
1464+#ifdef Y2_RECOVERY
1465+ int LastPort; /* port for curr. handled rx */
1466+ int LastOpc; /* last rx LEs opcode */
1467+#endif
1468+#ifdef Y2_SYNC_CHECK
1469+ unsigned long FramesWithoutSyncCheck; /* since last check */
1470 #endif
1471-
1472 };
1473
1474
1475-#endif /* __INC_SKDRV2ND_H */
1476
1477+#endif
1478+
1479+/*******************************************************************************
1480+ *
1481+ * End of file
1482+ *
1483+ ******************************************************************************/
1484diff -ruN linux/drivers/net/sk98lin/h/skerror.h linux-new/drivers/net/sk98lin/h/skerror.h
1485--- linux/drivers/net/sk98lin/h/skerror.h 2006-04-11 19:19:28.000000000 +0200
1486+++ linux-new/drivers/net/sk98lin/h/skerror.h 2006-01-18 14:37:24.000000000 +0100
1487@@ -2,23 +2,24 @@
1488 *
1489 * Name: skerror.h
1490 * Project: Gigabit Ethernet Adapters, Common Modules
1491- * Version: $Revision$
1492- * Date: $Date$
1493+ * Version: $Revision$
1494+ * Date: $Date$
1495 * Purpose: SK specific Error log support
1496 *
1497 ******************************************************************************/
1498
1499 /******************************************************************************
1500 *
1501+ * LICENSE:
1502 * (C)Copyright 1998-2002 SysKonnect.
1503- * (C)Copyright 2002-2003 Marvell.
1504+ * (C)Copyright 2002-2004 Marvell.
1505 *
1506 * This program is free software; you can redistribute it and/or modify
1507 * it under the terms of the GNU General Public License as published by
1508 * the Free Software Foundation; either version 2 of the License, or
1509 * (at your option) any later version.
1510- *
1511 * The information in this file is provided "AS IS" without warranty.
1512+ * /LICENSE
1513 *
1514 ******************************************************************************/
1515
1516@@ -36,7 +37,6 @@
1517 #define SK_ERRCL_HW (1L<<4) /* Hardware Failure */
1518 #define SK_ERRCL_COMM (1L<<5) /* Communication error */
1519
1520-
1521 /*
1522 * Define Error Code Bases
1523 */
1524@@ -49,7 +49,9 @@
1525 #define SK_ERRBASE_I2C 700 /* Base Error number for I2C module */
1526 #define SK_ERRBASE_QUEUE 800 /* Base Error number for Scheduler */
1527 #define SK_ERRBASE_ADDR 900 /* Base Error number for Address module */
1528-#define SK_ERRBASE_PECP 1000 /* Base Error number for PECP */
1529+#define SK_ERRBASE_PECP 1000 /* Base Error number for PECP */
1530 #define SK_ERRBASE_DRV 1100 /* Base Error number for Driver */
1531+#define SK_ERRBASE_ASF 1200 /* Base Error number for ASF */
1532
1533 #endif /* _INC_SKERROR_H_ */
1534+
1535diff -ruN linux/drivers/net/sk98lin/h/skgedrv.h linux-new/drivers/net/sk98lin/h/skgedrv.h
1536--- linux/drivers/net/sk98lin/h/skgedrv.h 2006-04-11 19:19:28.000000000 +0200
1537+++ linux-new/drivers/net/sk98lin/h/skgedrv.h 2006-01-18 14:37:24.000000000 +0100
1538@@ -2,23 +2,24 @@
1539 *
1540 * Name: skgedrv.h
1541 * Project: Gigabit Ethernet Adapters, Common Modules
1542- * Version: $Revision$
1543- * Date: $Date$
1544+ * Version: $Revision$
1545+ * Date: $Date$
1546 * Purpose: Interface with the driver
1547 *
1548 ******************************************************************************/
1549
1550 /******************************************************************************
1551 *
1552+ * LICENSE:
1553 * (C)Copyright 1998-2002 SysKonnect.
1554- * (C)Copyright 2002-2003 Marvell.
1555+ * (C)Copyright 2002-2005 Marvell.
1556 *
1557 * This program is free software; you can redistribute it and/or modify
1558 * it under the terms of the GNU General Public License as published by
1559 * the Free Software Foundation; either version 2 of the License, or
1560 * (at your option) any later version.
1561- *
1562 * The information in this file is provided "AS IS" without warranty.
1563+ * /LICENSE
1564 *
1565 ******************************************************************************/
1566
1567@@ -33,7 +34,7 @@
1568 * In case of the driver we put the definition of the events here.
1569 */
1570 #define SK_DRV_PORT_RESET 1 /* The port needs to be reset */
1571-#define SK_DRV_NET_UP 2 /* The net is operational */
1572+#define SK_DRV_NET_UP 2 /* The net is operational */
1573 #define SK_DRV_NET_DOWN 3 /* The net is down */
1574 #define SK_DRV_SWITCH_SOFT 4 /* Ports switch with both links connected */
1575 #define SK_DRV_SWITCH_HARD 5 /* Port switch due to link failure */
1576@@ -44,8 +45,9 @@
1577 #define SK_DRV_POWER_DOWN 10 /* Power down mode */
1578 #define SK_DRV_TIMER 11 /* Timer for free use */
1579 #ifdef SK_NO_RLMT
1580-#define SK_DRV_LINK_UP 12 /* Link Up event for driver */
1581+#define SK_DRV_LINK_UP 12 /* Link Up event for driver */
1582 #define SK_DRV_LINK_DOWN 13 /* Link Down event for driver */
1583 #endif
1584 #define SK_DRV_DOWNSHIFT_DET 14 /* Downshift 4-Pair / 2-Pair (YUKON only) */
1585+#define SK_DRV_RX_OVERFLOW 15 /* Receive Overflow */
1586 #endif /* __INC_SKGEDRV_H_ */
1587diff -ruN linux/drivers/net/sk98lin/h/skgehw.h linux-new/drivers/net/sk98lin/h/skgehw.h
1588--- linux/drivers/net/sk98lin/h/skgehw.h 2006-04-11 19:19:28.000000000 +0200
1589+++ linux-new/drivers/net/sk98lin/h/skgehw.h 2006-01-18 14:37:24.000000000 +0100
1590@@ -2,23 +2,24 @@
1591 *
1592 * Name: skgehw.h
1593 * Project: Gigabit Ethernet Adapters, Common Modules
1594- * Version: $Revision$
1595- * Date: $Date$
1596+ * Version: $Revision$
1597+ * Date: $Date$
1598 * Purpose: Defines and Macros for the Gigabit Ethernet Adapter Product Family
1599 *
1600 ******************************************************************************/
1601
1602 /******************************************************************************
1603 *
1604+ * LICENSE:
1605 * (C)Copyright 1998-2002 SysKonnect.
1606- * (C)Copyright 2002-2003 Marvell.
1607+ * (C)Copyright 2002-2005 Marvell.
1608 *
1609 * This program is free software; you can redistribute it and/or modify
1610 * it under the terms of the GNU General Public License as published by
1611 * the Free Software Foundation; either version 2 of the License, or
1612 * (at your option) any later version.
1613- *
1614 * The information in this file is provided "AS IS" without warranty.
1615+ * /LICENSE
1616 *
1617 ******************************************************************************/
1618
1619@@ -114,6 +115,16 @@
1620 #define SHIFT1(x) ((x) << 1)
1621 #define SHIFT0(x) ((x) << 0)
1622
1623+/* Macro for arbitrary alignment of a given pointer */
1624+#define ALIGN_ADDR( ADDRESS, GRANULARITY ) { \
1625+ SK_UPTR addr = (SK_UPTR)(ADDRESS); \
1626+ if (addr & ((GRANULARITY)-1)) { \
1627+ addr += (GRANULARITY); \
1628+ addr &= ~(SK_UPTR)((GRANULARITY)-1); \
1629+ ADDRESS = (void *)addr; \
1630+ }\
1631+}
1632+
1633 /*
1634 * Configuration Space header
1635 * Since this module is used for different OS', those may be
1636@@ -132,34 +143,81 @@
1637 #define PCI_BIST 0x0f /* 8 bit Built-in selftest */
1638 #define PCI_BASE_1ST 0x10 /* 32 bit 1st Base address */
1639 #define PCI_BASE_2ND 0x14 /* 32 bit 2nd Base address */
1640- /* Byte 0x18..0x2b: reserved */
1641+ /* Bytes 0x18..0x2b: reserved */
1642 #define PCI_SUB_VID 0x2c /* 16 bit Subsystem Vendor ID */
1643 #define PCI_SUB_ID 0x2e /* 16 bit Subsystem ID */
1644 #define PCI_BASE_ROM 0x30 /* 32 bit Expansion ROM Base Address */
1645-#define PCI_CAP_PTR 0x34 /* 8 bit Capabilities Ptr */
1646- /* Byte 0x35..0x3b: reserved */
1647+#define PCI_CAP_PTR 0x34 /* 8 bit Capabilities Pointer */
1648+ /* Bytes 0x35..0x3b: reserved */
1649 #define PCI_IRQ_LINE 0x3c /* 8 bit Interrupt Line */
1650 #define PCI_IRQ_PIN 0x3d /* 8 bit Interrupt Pin */
1651 #define PCI_MIN_GNT 0x3e /* 8 bit Min_Gnt */
1652 #define PCI_MAX_LAT 0x3f /* 8 bit Max_Lat */
1653 /* Device Dependent Region */
1654-#define PCI_OUR_REG_1 0x40 /* 32 bit Our Register 1 */
1655-#define PCI_OUR_REG_2 0x44 /* 32 bit Our Register 2 */
1656+#define PCI_OUR_REG_1 0x40 /* 32 bit Our Register 1 */
1657+#define PCI_OUR_REG_2 0x44 /* 32 bit Our Register 2 */
1658 /* Power Management Region */
1659-#define PCI_PM_CAP_ID 0x48 /* 8 bit Power Management Cap. ID */
1660-#define PCI_PM_NITEM 0x49 /* 8 bit Next Item Ptr */
1661-#define PCI_PM_CAP_REG 0x4a /* 16 bit Power Management Capabilities */
1662-#define PCI_PM_CTL_STS 0x4c /* 16 bit Power Manag. Control/Status */
1663+#define PCI_PM_CAP_ID 0x48 /* 8 bit Power Management Cap. ID */
1664+#define PCI_PM_NITEM 0x49 /* 8 bit PM Next Item Pointer */
1665+#define PCI_PM_CAP_REG 0x4a /* 16 bit Power Management Capabilities */
1666+#define PCI_PM_CTL_STS 0x4c /* 16 bit Power Manag. Control/Status */
1667 /* Byte 0x4e: reserved */
1668-#define PCI_PM_DAT_REG 0x4f /* 8 bit Power Manag. Data Register */
1669+#define PCI_PM_DAT_REG 0x4f /* 8 bit Power Manag. Data Register */
1670 /* VPD Region */
1671-#define PCI_VPD_CAP_ID 0x50 /* 8 bit VPD Cap. ID */
1672-#define PCI_VPD_NITEM 0x51 /* 8 bit Next Item Ptr */
1673-#define PCI_VPD_ADR_REG 0x52 /* 16 bit VPD Address Register */
1674-#define PCI_VPD_DAT_REG 0x54 /* 32 bit VPD Data Register */
1675- /* Byte 0x58..0x59: reserved */
1676-#define PCI_SER_LD_CTRL 0x5a /* 16 bit SEEPROM Loader Ctrl (YUKON only) */
1677- /* Byte 0x5c..0xff: reserved */
1678+#define PCI_VPD_CAP_ID 0x50 /* 8 bit VPD Cap. ID */
1679+#define PCI_VPD_NITEM 0x51 /* 8 bit VPD Next Item Pointer */
1680+#define PCI_VPD_ADR_REG 0x52 /* 16 bit VPD Address Register */
1681+#define PCI_VPD_DAT_REG 0x54 /* 32 bit VPD Data Register */
1682+ /* Bytes 0x58..0x59: reserved */
1683+#define PCI_SER_LD_CTRL 0x5a /* 16 bit SEEPROM Loader Ctrl (YUKON only) */
1684+ /* Bytes 0x5c..0xfc: used by Yukon-2 */
1685+#define PCI_MSI_CAP_ID 0x5c /* 8 bit MSI Capability ID Register */
1686+#define PCI_MSI_NITEM 0x5d /* 8 bit MSI Next Item Pointer */
1687+#define PCI_MSI_CTRL 0x5e /* 16 bit MSI Message Control */
1688+#define PCI_MSI_ADR_LO 0x60 /* 32 bit MSI Message Address (Lower) */
1689+#define PCI_MSI_ADR_HI 0x64 /* 32 bit MSI Message Address (Upper) */
1690+#define PCI_MSI_DATA 0x68 /* 16 bit MSI Message Data */
1691+ /* Bytes 0x6a..0x6b: reserved */
1692+#define PCI_X_CAP_ID 0x6c /* 8 bit PCI-X Capability ID Register */
1693+#define PCI_X_NITEM 0x6d /* 8 bit PCI-X Next Item Pointer */
1694+#define PCI_X_COMMAND 0x6e /* 16 bit PCI-X Command */
1695+#define PCI_X_PE_STAT 0x70 /* 32 bit PCI-X / PE Status */
1696+#define PCI_CAL_CTRL 0x74 /* 16 bit PCI Calibration Control Register */
1697+#define PCI_CAL_STAT 0x76 /* 16 bit PCI Calibration Status Register */
1698+#define PCI_DISC_CNT 0x78 /* 16 bit PCI Discard Counter */
1699+#define PCI_RETRY_CNT 0x7a /* 8 bit PCI Retry Counter */
1700+ /* Byte 0x7b: reserved */
1701+#define PCI_OUR_STATUS 0x7c /* 32 bit Adapter Status Register */
1702+#define PCI_OUR_REG_3 0x80 /* 32 bit Our Register 3 (Yukon-ECU only) */
1703+#define PCI_OUR_REG_4 0x84 /* 32 bit Our Register 4 (Yukon-ECU only) */
1704+#define PCI_OUR_REG_5 0x88 /* 32 bit Our Register 5 (Yukon-ECU only) */
1705+ /* Bytes 0x8c..0xdf: reserved */
1706+
1707+/* PCI Express Capability */
1708+#define PEX_CAP_ID 0xe0 /* 8 bit PEX Capability ID */
1709+#define PEX_NITEM 0xe1 /* 8 bit PEX Next Item Pointer */
1710+#define PEX_CAP_REG 0xe2 /* 16 bit PEX Capability Register */
1711+#define PEX_DEV_CAP 0xe4 /* 32 bit PEX Device Capabilities */
1712+#define PEX_DEV_CTRL 0xe8 /* 16 bit PEX Device Control */
1713+#define PEX_DEV_STAT 0xea /* 16 bit PEX Device Status */
1714+#define PEX_LNK_CAP 0xec /* 32 bit PEX Link Capabilities */
1715+#define PEX_LNK_CTRL 0xf0 /* 16 bit PEX Link Control */
1716+#define PEX_LNK_STAT 0xf2 /* 16 bit PEX Link Status */
1717+ /* Bytes 0xf4..0xff: reserved */
1718+
1719+/* PCI Express Extended Capabilities */
1720+#define PEX_ADV_ERR_REP 0x100 /* 32 bit PEX Advanced Error Reporting */
1721+#define PEX_UNC_ERR_STAT 0x104 /* 32 bit PEX Uncorr. Errors Status */
1722+#define PEX_UNC_ERR_MASK 0x108 /* 32 bit PEX Uncorr. Errors Mask */
1723+#define PEX_UNC_ERR_SEV 0x10c /* 32 bit PEX Uncorr. Errors Severity */
1724+#define PEX_COR_ERR_STAT 0x110 /* 32 bit PEX Correc. Errors Status */
1725+#define PEX_COR_ERR_MASK 0x114 /* 32 bit PEX Correc. Errors Mask */
1726+#define PEX_ADV_ERR_CAP_C 0x118 /* 32 bit PEX Advanced Error Cap./Ctrl */
1727+#define PEX_HEADER_LOG 0x11c /* 4x32 bit PEX Header Log Register */
1728+
1729+/* PCI Express Ack Timer for 1x Link */
1730+#define PEX_ACK_LAT_TOX1 0x228 /* 16 bit PEX Ack Latency Timeout x1 */
1731+#define PEX_ACK_RPLY_TOX1 0x22a /* 16 bit PEX Ack Reply Timeout val x1 */
1732
1733 /*
1734 * I2C Address (PCI Config)
1735@@ -180,13 +238,13 @@
1736 #define PCI_ADSTEP BIT_7S /* Address Stepping */
1737 #define PCI_PERREN BIT_6S /* Parity Report Response enable */
1738 #define PCI_VGA_SNOOP BIT_5S /* VGA palette snoop */
1739-#define PCI_MWIEN BIT_4S /* Memory write an inv cycl ena */
1740+#define PCI_MWIEN BIT_4S /* Memory write an inv cycl enable */
1741 #define PCI_SCYCEN BIT_3S /* Special Cycle enable */
1742 #define PCI_BMEN BIT_2S /* Bus Master enable */
1743 #define PCI_MEMEN BIT_1S /* Memory Space Access enable */
1744 #define PCI_IOEN BIT_0S /* I/O Space Access enable */
1745
1746-#define PCI_COMMAND_VAL (PCI_FBTEN | PCI_SERREN | PCI_PERREN | PCI_MWIEN |\
1747+#define PCI_COMMAND_VAL (PCI_INT_DIS | PCI_SERREN | PCI_PERREN | \
1748 PCI_BMEN | PCI_MEMEN | PCI_IOEN)
1749
1750 /* PCI_STATUS 16 bit Status */
1751@@ -220,7 +278,7 @@
1752
1753 /* PCI_HEADER_T 8 bit Header Type */
1754 #define PCI_HD_MF_DEV BIT_7S /* 0= single, 1= multi-func dev */
1755-#define PCI_HD_TYPE 0x7f /* Bit 6..0: Header Layout 0= normal */
1756+#define PCI_HD_TYPE 0x7f /* Bit 6..0: Header Layout (0=normal) */
1757
1758 /* PCI_BIST 8 bit Built-in selftest */
1759 /* Built-in Self test not supported (optional) */
1760@@ -229,33 +287,42 @@
1761 #define PCI_MEMSIZE 0x4000L /* use 16 kB Memory Base */
1762 #define PCI_MEMBASE_MSK 0xffffc000L /* Bit 31..14: Memory Base Address */
1763 #define PCI_MEMSIZE_MSK 0x00003ff0L /* Bit 13.. 4: Memory Size Req. */
1764-#define PCI_PREFEN BIT_3 /* Prefetchable */
1765-#define PCI_MEM_TYP (3L<<2) /* Bit 2.. 1: Memory Type */
1766+#define PCI_PREFEN BIT_3 /* Prefetch enable */
1767+#define PCI_MEM_TYP_MSK (3L<<1) /* Bit 2.. 1: Memory Type Mask */
1768+#define PCI_MEMSPACE BIT_0 /* Memory Space Indicator */
1769+
1770 #define PCI_MEM32BIT (0L<<1) /* Base addr anywhere in 32 Bit range */
1771 #define PCI_MEM1M (1L<<1) /* Base addr below 1 MegaByte */
1772 #define PCI_MEM64BIT (2L<<1) /* Base addr anywhere in 64 Bit range */
1773-#define PCI_MEMSPACE BIT_0 /* Memory Space Indicator */
1774
1775 /* PCI_BASE_2ND 32 bit 2nd Base address */
1776 #define PCI_IOBASE 0xffffff00L /* Bit 31.. 8: I/O Base address */
1777 #define PCI_IOSIZE 0x000000fcL /* Bit 7.. 2: I/O Size Requirements */
1778- /* Bit 1: reserved */
1779+ /* Bit 1: reserved */
1780 #define PCI_IOSPACE BIT_0 /* I/O Space Indicator */
1781
1782 /* PCI_BASE_ROM 32 bit Expansion ROM Base Address */
1783 #define PCI_ROMBASE_MSK 0xfffe0000L /* Bit 31..17: ROM Base address */
1784 #define PCI_ROMBASE_SIZ (0x1cL<<14) /* Bit 16..14: Treat as Base or Size */
1785 #define PCI_ROMSIZE (0x38L<<11) /* Bit 13..11: ROM Size Requirements */
1786- /* Bit 10.. 1: reserved */
1787+ /* Bit 10.. 1: reserved */
1788 #define PCI_ROMEN BIT_0 /* Address Decode enable */
1789
1790 /* Device Dependent Region */
1791 /* PCI_OUR_REG_1 32 bit Our Register 1 */
1792- /* Bit 31..29: reserved */
1793+ /* Bit 31..29: reserved */
1794 #define PCI_PHY_COMA BIT_28 /* Set PHY to Coma Mode (YUKON only) */
1795 #define PCI_TEST_CAL BIT_27 /* Test PCI buffer calib. (YUKON only) */
1796 #define PCI_EN_CAL BIT_26 /* Enable PCI buffer calib. (YUKON only) */
1797 #define PCI_VIO BIT_25 /* PCI I/O Voltage, 0 = 3.3V, 1 = 5V */
1798+/* Yukon-2 */
1799+#define PCI_Y2_PIG_ENA BIT_31 /* Enable Plug-in-Go (YUKON-2) */
1800+#define PCI_Y2_DLL_DIS BIT_30 /* Disable PCI DLL (YUKON-2) */
1801+#define PCI_Y2_PHY2_COMA BIT_29 /* Set PHY 2 to Coma Mode (YUKON-2) */
1802+#define PCI_Y2_PHY1_COMA BIT_28 /* Set PHY 1 to Coma Mode (YUKON-2) */
1803+#define PCI_Y2_PHY2_POWD BIT_27 /* Set PHY 2 to Power Down (YUKON-2) */
1804+#define PCI_Y2_PHY1_POWD BIT_26 /* Set PHY 1 to Power Down (YUKON-2) */
1805+ /* Bit 25: reserved */
1806 #define PCI_DIS_BOOT BIT_24 /* Disable BOOT via ROM */
1807 #define PCI_EN_IO BIT_23 /* Mapping to I/O space */
1808 #define PCI_EN_FPROM BIT_22 /* Enable FLASH mapping to memory */
1809@@ -266,9 +333,10 @@
1810 #define PCI_PAGE_32K (1L<<20) /* 32 k pages */
1811 #define PCI_PAGE_64K (2L<<20) /* 64 k pages */
1812 #define PCI_PAGE_128K (3L<<20) /* 128 k pages */
1813- /* Bit 19: reserved */
1814-#define PCI_PAGEREG (7L<<16) /* Bit 18..16: Page Register */
1815+ /* Bit 19: reserved */
1816+#define PCI_PAGEREG (7L<<16) /* Bit 18..16: Page Register */
1817 #define PCI_NOTAR BIT_15 /* No turnaround cycle */
1818+#define PCI_PEX_LEGNAT BIT_15 /* PEX PM legacy/native mode (YUKON-2) */
1819 #define PCI_FORCE_BE BIT_14 /* Assert all BEs on MR */
1820 #define PCI_DIS_MRL BIT_13 /* Disable Mem Read Line */
1821 #define PCI_DIS_MRM BIT_12 /* Disable Mem Read Multiple */
1822@@ -278,13 +346,21 @@
1823 #define PCI_DIS_PCI_CLK BIT_8 /* Disable PCI clock driving */
1824 #define PCI_SKEW_DAS (0xfL<<4) /* Bit 7.. 4: Skew Ctrl, DAS Ext */
1825 #define PCI_SKEW_BASE 0xfL /* Bit 3.. 0: Skew Ctrl, Base */
1826+#define PCI_CLS_OPT BIT_3 /* Cache Line Size opt. PCI-X (YUKON-2) */
1827
1828+/* Yukon-EC Ultra only */
1829+ /* Bit 14..10: reserved */
1830+#define PCI_PHY_LNK_TIM_MSK (3L<<8) /* Bit 9.. 8: GPHY Link Trigger Timer */
1831+#define PCI_ENA_L1_EVENT BIT_7 /* Enable PEX L1 Event */
1832+#define PCI_ENA_GPHY_LNK BIT_6 /* Enable PEX L1 on GPHY Link down */
1833+#define PCI_FORCE_PEX_L1 BIT_5 /* Force to PEX L1 */
1834+ /* Bit 4.. 0: reserved */
1835
1836 /* PCI_OUR_REG_2 32 bit Our Register 2 */
1837 #define PCI_VPD_WR_THR (0xffL<<24) /* Bit 31..24: VPD Write Threshold */
1838 #define PCI_DEV_SEL (0x7fL<<17) /* Bit 23..17: EEPROM Device Select */
1839 #define PCI_VPD_ROM_SZ (7L<<14) /* Bit 16..14: VPD ROM Size */
1840- /* Bit 13..12: reserved */
1841+ /* Bit 13..12: reserved */
1842 #define PCI_PATCH_DIR (0xfL<<8) /* Bit 11.. 8: Ext Patches dir 3..0 */
1843 #define PCI_PATCH_DIR_3 BIT_11
1844 #define PCI_PATCH_DIR_2 BIT_10
1845@@ -296,22 +372,21 @@
1846 #define PCI_EXT_PATCH_1 BIT_5
1847 #define PCI_EXT_PATCH_0 BIT_4
1848 #define PCI_EN_DUMMY_RD BIT_3 /* Enable Dummy Read */
1849-#define PCI_REV_DESC BIT_2 /* Reverse Desc. Bytes */
1850- /* Bit 1: reserved */
1851+#define PCI_REV_DESC BIT_2 /* Reverse Descriptor Bytes */
1852+ /* Bit 1: reserved */
1853 #define PCI_USEDATA64 BIT_0 /* Use 64Bit Data bus ext */
1854
1855-
1856-/* Power Management Region */
1857+/* Power Management (PM) Region */
1858 /* PCI_PM_CAP_REG 16 bit Power Management Capabilities */
1859-#define PCI_PME_SUP_MSK (0x1f<<11) /* Bit 15..11: PM Event Support Mask */
1860-#define PCI_PME_D3C_SUP BIT_15S /* PME from D3cold Support (if Vaux) */
1861+#define PCI_PME_SUP_MSK (0x1f<<11) /* Bit 15..11: PM Event (PME) Supp. Mask */
1862+#define PCI_PME_D3C_SUP BIT_15S /* PME from D3cold Support (if VAUX) */
1863 #define PCI_PME_D3H_SUP BIT_14S /* PME from D3hot Support */
1864 #define PCI_PME_D2_SUP BIT_13S /* PME from D2 Support */
1865 #define PCI_PME_D1_SUP BIT_12S /* PME from D1 Support */
1866 #define PCI_PME_D0_SUP BIT_11S /* PME from D0 Support */
1867 #define PCI_PM_D2_SUP BIT_10S /* D2 Support in 33 MHz mode */
1868 #define PCI_PM_D1_SUP BIT_9S /* D1 Support */
1869- /* Bit 8.. 6: reserved */
1870+ /* Bit 8.. 6: reserved */
1871 #define PCI_PM_DSI BIT_5S /* Device Specific Initialization */
1872 #define PCI_PM_APS BIT_4S /* Auxialiary Power Source */
1873 #define PCI_PME_CLOCK BIT_3S /* PM Event Clock */
1874@@ -322,7 +397,7 @@
1875 #define PCI_PM_DAT_SCL (3<<13) /* Bit 14..13: Data Reg. scaling factor */
1876 #define PCI_PM_DAT_SEL (0xf<<9) /* Bit 12.. 9: PM data selector field */
1877 #define PCI_PME_EN BIT_8S /* Enable PME# generation (YUKON only) */
1878- /* Bit 7.. 2: reserved */
1879+ /* Bit 7.. 2: reserved */
1880 #define PCI_PM_STATE_MSK 3 /* Bit 1.. 0: Power Management State */
1881
1882 #define PCI_PM_STATE_D0 0 /* D0: Operational (default) */
1883@@ -333,7 +408,144 @@
1884 /* VPD Region */
1885 /* PCI_VPD_ADR_REG 16 bit VPD Address Register */
1886 #define PCI_VPD_FLAG BIT_15S /* starts VPD rd/wr cycle */
1887-#define PCI_VPD_ADR_MSK 0x7fffL /* Bit 14.. 0: VPD address mask */
1888+#define PCI_VPD_ADR_MSK 0x7fffL /* Bit 14.. 0: VPD Address Mask */
1889+
1890+/* PCI_OUR_STATUS 32 bit Adapter Status Register (Yukon-2) */
1891+#define PCI_OS_PCI64B BIT_31 /* Conventional PCI 64 bits Bus */
1892+#define PCI_OS_PCIX BIT_30 /* PCI-X Bus */
1893+#define PCI_OS_MODE_MSK (3L<<28) /* Bit 29..28: PCI-X Bus Mode Mask */
1894+#define PCI_OS_PCI66M BIT_27 /* PCI 66 MHz Bus */
1895+#define PCI_OS_PCI_X BIT_26 /* PCI/PCI-X Bus (0 = PEX) */
1896+#define PCI_OS_DLLE_MSK (3L<<24) /* Bit 25..24: DLL Status Indication */
1897+#define PCI_OS_DLLR_MSK (0xfL<<20) /* Bit 23..20: DLL Row Counters Values */
1898+#define PCI_OS_DLLC_MSK (0xfL<<16) /* Bit 19..16: DLL Col. Counters Values */
1899+ /* Bit 15.. 8: reserved */
1900+
1901+#define PCI_OS_SPEED(val) ((val & PCI_OS_MODE_MSK) >> 28) /* PCI-X Speed */
1902+/* possible values for the speed field of the register */
1903+#define PCI_OS_SPD_PCI 0 /* PCI Conventional Bus */
1904+#define PCI_OS_SPD_X66 1 /* PCI-X 66MHz Bus */
1905+#define PCI_OS_SPD_X100 2 /* PCI-X 100MHz Bus */
1906+#define PCI_OS_SPD_X133 3 /* PCI-X 133MHz Bus */
1907+
1908+/* PCI_OUR_REG_3 32 bit Our Register 3 (Yukon-ECU only) */
1909+ /* Bit 31..18: reserved */
1910+#define P_CLK_COR_REGS_D0_DIS BIT_17 /* Disable Clock Core Regs in D0 */
1911+#define P_CLK_PCI_REGS_D0_DIS BIT_16 /* Disable Clock PCI Regs in D0 */
1912+#define P_CLK_COR_YTB_ARB_DIS BIT_15 /* Disable Clock YTB Arbiter */
1913+#define P_CLK_MAC_LNK1_D3_DIS BIT_14 /* Disable Clock MAC Link1 in D3 */
1914+#define P_CLK_COR_LNK1_D0_DIS BIT_13 /* Disable Clock Core Link1 in D0 */
1915+#define P_CLK_MAC_LNK1_D0_DIS BIT_12 /* Disable Clock MAC Link1 in D0 */
1916+#define P_CLK_COR_LNK1_D3_DIS BIT_11 /* Disable Clock Core Link1 in D3 */
1917+#define P_CLK_PCI_MST_ARB_DIS BIT_10 /* Disable Clock PCI Master Arb. */
1918+#define P_CLK_COR_REGS_D3_DIS BIT_9 /* Disable Clock Core Regs in D3 */
1919+#define P_CLK_PCI_REGS_D3_DIS BIT_8 /* Disable Clock PCI Regs in D3 */
1920+#define P_CLK_REF_LNK1_GM_DIS BIT_7 /* Disable Clock Ref. Link1 GMAC */
1921+#define P_CLK_COR_LNK1_GM_DIS BIT_6 /* Disable Clock Core Link1 GMAC */
1922+#define P_CLK_PCI_COMMON_DIS BIT_5 /* Disable Clock PCI Common */
1923+#define P_CLK_COR_COMMON_DIS BIT_4 /* Disable Clock Core Common */
1924+#define P_CLK_PCI_LNK1_BMU_DIS BIT_3 /* Disable Clock PCI Link1 BMU */
1925+#define P_CLK_COR_LNK1_BMU_DIS BIT_2 /* Disable Clock Core Link1 BMU */
1926+#define P_CLK_PCI_LNK1_BIU_DIS BIT_1 /* Disable Clock PCI Link1 BIU */
1927+#define P_CLK_COR_LNK1_BIU_DIS BIT_0 /* Disable Clock Core Link1 BIU */
1928+
1929+/* PCI_OUR_REG_4 32 bit Our Register 4 (Yukon-ECU only) */
1930+#define P_PEX_LTSSM_STAT_MSK (0x7fL<<25) /* Bit 31..25: PEX LTSSM Mask */
1931+ /* (Link Training & Status State Machine) */
1932+ /* Bit 24: reserved */
1933+#define P_TIMER_VALUE_MSK (0xffL<<16) /* Bit 23..16: Timer Value Mask */
1934+#define P_FORCE_ASPM_REQUEST BIT_15 /* Force ASPM Request (A1 only) */
1935+ /* (Active State Power Management) */
1936+ /* Bit 14..12: Force ASPM on Event */
1937+#define P_ASPM_GPHY_LINK_DOWN BIT_14 /* GPHY Link Down (A1 only) */
1938+#define P_ASPM_INT_FIFO_EMPTY BIT_13 /* Internal FIFO Empty (A1 only) */
1939+#define P_ASPM_CLKRUN_REQUEST BIT_12 /* CLKRUN Request (A1 only) */
1940+ /* Bit 11.. 4: reserved */
1941+#define P_ASPM_FORCE_CLKREQ_ENA BIT_4 /* Force CLKREQ Enable (A1b only) */
1942+#define P_ASPM_CLKREQ_PAD_CTL BIT_3 /* CLKREQ PAD Control (A1 only) */
1943+#define P_ASPM_A1_MODE_SELECT BIT_2 /* A1 Mode Select (A1 only) */
1944+#define P_CLK_GATE_PEX_UNIT_ENA BIT_1 /* Enable Gate PEX Unit Clock */
1945+#define P_CLK_GATE_ROOT_COR_ENA BIT_0 /* Enable Gate Root Core Clock */
1946+
1947+#define P_PEX_LTSSM_STAT(x) (SHIFT25(x) & P_PEX_LTSSM_STAT_MSK)
1948+#define P_PEX_LTSSM_L1_STAT 0x34
1949+#define P_PEX_LTSSM_DET_STAT 0x01
1950+
1951+#define P_ASPM_CONTROL_MSK (P_FORCE_ASPM_REQUEST | P_ASPM_GPHY_LINK_DOWN | \
1952+ P_ASPM_CLKRUN_REQUEST | P_ASPM_INT_FIFO_EMPTY)
1953+
1954+/* PCI_OUR_REG_5 32 bit Our Register 5 (Yukon-ECU only) */
1955+ /* Bit 31..27: reserved */
1956+ /* Bit 26..16: Release Clock on Event */
1957+#define P_REL_PCIE_RST_DE_ASS BIT_26 /* PCIe Reset De-Asserted */
1958+#define P_REL_GPHY_REC_PACKET BIT_25 /* GPHY Received Packet */
1959+#define P_REL_INT_FIFO_N_EMPTY BIT_24 /* Internal FIFO Not Empty */
1960+#define P_REL_MAIN_PWR_AVAIL BIT_23 /* Main Power Available */
1961+#define P_REL_CLKRUN_REQ_REL BIT_22 /* CLKRUN Request Release */
1962+#define P_REL_PCIE_RESET_ASS BIT_21 /* PCIe Reset Asserted */
1963+#define P_REL_PME_ASSERTED BIT_20 /* PME Asserted */
1964+#define P_REL_PCIE_EXIT_L1_ST BIT_19 /* PCIe Exit L1 State */
1965+#define P_REL_LOADER_NOT_FIN BIT_18 /* EPROM Loader Not Finished */
1966+#define P_REL_PCIE_RX_EX_IDLE BIT_17 /* PCIe Rx Exit Electrical Idle State */
1967+#define P_REL_GPHY_LINK_UP BIT_16 /* GPHY Link Up */
1968+ /* Bit 15..11: reserved */
1969+ /* Bit 10.. 0: Mask for Gate Clock */
1970+#define P_GAT_PCIE_RST_DE_ASS BIT_10 /* PCIe Reset De-Asserted */
1971+#define P_GAT_GPHY_N_REC_PACKET BIT_9 /* GPHY Not Received Packet */
1972+#define P_GAT_INT_FIFO_EMPTY BIT_8 /* Internal FIFO Empty */
1973+#define P_GAT_MAIN_PWR_N_AVAIL BIT_7 /* Main Power Not Available */
1974+#define P_GAT_CLKRUN_REQ_REL BIT_6 /* CLKRUN Not Requested */
1975+#define P_GAT_PCIE_RESET_ASS BIT_5 /* PCIe Reset Asserted */
1976+#define P_GAT_PME_DE_ASSERTED BIT_4 /* PME De-Asserted */
1977+#define P_GAT_PCIE_ENTER_L1_ST BIT_3 /* PCIe Enter L1 State */
1978+#define P_GAT_LOADER_FINISHED BIT_2 /* EPROM Loader Finished */
1979+#define P_GAT_PCIE_RX_EL_IDLE BIT_1 /* PCIe Rx Electrical Idle State */
1980+#define P_GAT_GPHY_LINK_DOWN BIT_0 /* GPHY Link Down */
1981+
1982+/* PEX_DEV_CTRL 16 bit PEX Device Control (Yukon-2) */
1983+ /* Bit 15 reserved */
1984+#define PEX_DC_MAX_RRS_MSK (7<<12) /* Bit 14..12: Max. Read Request Size */
1985+#define PEX_DC_EN_NO_SNOOP BIT_11S /* Enable No Snoop */
1986+#define PEX_DC_EN_AUX_POW BIT_10S /* Enable AUX Power */
1987+#define PEX_DC_EN_PHANTOM BIT_9S /* Enable Phantom Functions */
1988+#define PEX_DC_EN_EXT_TAG BIT_8S /* Enable Extended Tag Field */
1989+#define PEX_DC_MAX_PLS_MSK (7<<5) /* Bit 7.. 5: Max. Payload Size Mask */
1990+#define PEX_DC_EN_REL_ORD BIT_4S /* Enable Relaxed Ordering */
1991+#define PEX_DC_EN_UNS_RQ_RP BIT_3S /* Enable Unsupported Request Reporting */
1992+#define PEX_DC_EN_FAT_ER_RP BIT_2S /* Enable Fatal Error Reporting */
1993+#define PEX_DC_EN_NFA_ER_RP BIT_1S /* Enable Non-Fatal Error Reporting */
1994+#define PEX_DC_EN_COR_ER_RP BIT_0S /* Enable Correctable Error Reporting */
1995+
1996+#define PEX_DC_MAX_RD_RQ_SIZE(x) (SHIFT12(x) & PEX_DC_MAX_RRS_MSK)
1997+
1998+/* PEX_LNK_CTRL 16 bit PEX Link Control (Yukon-2) */
1999+#define PEX_LC_CLK_PM_ENA BIT_8S /* Enable Clock Power Management (CLKREQ) */
2000+
2001+/* PEX_LNK_STAT 16 bit PEX Link Status (Yukon-2) */
2002+ /* Bit 15..13 reserved */
2003+#define PEX_LS_SLOT_CLK_CFG BIT_12S /* Slot Clock Config */
2004+#define PEX_LS_LINK_TRAIN BIT_11S /* Link Training */
2005+#define PEX_LS_TRAIN_ERROR BIT_10S /* Training Error */
2006+#define PEX_LS_LINK_WI_MSK (0x3f<<4) /* Bit 9.. 4: Neg. Link Width Mask */
2007+#define PEX_LS_LINK_SP_MSK 0x0f /* Bit 3.. 0: Link Speed Mask */
2008+
2009+/* PEX_UNC_ERR_STAT 16 bit PEX Uncorrectable Errors Status (Yukon-2) */
2010+ /* Bit 31..21 reserved */
2011+#define PEX_UNSUP_REQ BIT_20 /* Unsupported Request Error */
2012+ /* ECRC Error (not supported) */
2013+#define PEX_MALFOR_TLP BIT_18 /* Malformed TLP */
2014+ /* Receiver Overflow (not supported) */
2015+#define PEX_UNEXP_COMP BIT_16 /* Unexpected Completion */
2016+ /* Completer Abort (not supported) */
2017+#define PEX_COMP_TO BIT_14 /* Completion Timeout */
2018+#define PEX_FLOW_CTRL_P BIT_13 /* Flow Control Protocol Error */
2019+#define PEX_POIS_TLP BIT_12 /* Poisoned TLP */
2020+ /* Bit 11.. 5: reserved */
2021+#define PEX_DATA_LINK_P BIT_4 /* Data Link Protocol Error */
2022+ /* Bit 3.. 1: reserved */
2023+ /* Training Error (not supported) */
2024+
2025+#define PEX_FATAL_ERRORS (PEX_MALFOR_TLP | PEX_FLOW_CTRL_P | PEX_DATA_LINK_P)
2026
2027 /* Control Register File (Address Map) */
2028
2029@@ -349,8 +561,14 @@
2030 #define B0_IMSK 0x000c /* 32 bit Interrupt Mask Register */
2031 #define B0_HWE_ISRC 0x0010 /* 32 bit HW Error Interrupt Src Reg */
2032 #define B0_HWE_IMSK 0x0014 /* 32 bit HW Error Interrupt Mask Reg */
2033-#define B0_SP_ISRC 0x0018 /* 32 bit Special Interrupt Source Reg */
2034- /* 0x001c: reserved */
2035+#define B0_SP_ISRC 0x0018 /* 32 bit Special Interrupt Source Reg 1 */
2036+
2037+/* Special ISR registers (Yukon-2 only) */
2038+#define B0_Y2_SP_ISRC2 0x001c /* 32 bit Special Interrupt Source Reg 2 */
2039+#define B0_Y2_SP_ISRC3 0x0020 /* 32 bit Special Interrupt Source Reg 3 */
2040+#define B0_Y2_SP_EISR 0x0024 /* 32 bit Enter ISR Reg */
2041+#define B0_Y2_SP_LISR 0x0028 /* 32 bit Leave ISR Reg */
2042+#define B0_Y2_SP_ICR 0x002c /* 32 bit Interrupt Control Reg */
2043
2044 /* B0 XMAC 1 registers (GENESIS only) */
2045 #define B0_XM1_IMSK 0x0020 /* 16 bit r/w XMAC 1 Interrupt Mask Register*/
2046@@ -372,7 +590,7 @@
2047 #define B0_XM2_PHY_DATA 0x0054 /* 16 bit r/w XMAC 2 PHY Data Register */
2048 /* 0x0056 - 0x005f: reserved */
2049
2050-/* BMU Control Status Registers */
2051+/* BMU Control Status Registers (Yukon and Genesis) */
2052 #define B0_R1_CSR 0x0060 /* 32 bit BMU Ctrl/Stat Rx Queue 1 */
2053 #define B0_R2_CSR 0x0064 /* 32 bit BMU Ctrl/Stat Rx Queue 2 */
2054 #define B0_XS1_CSR 0x0068 /* 32 bit BMU Ctrl/Stat Sync Tx Queue 1 */
2055@@ -390,7 +608,7 @@
2056 /*
2057 * Bank 2
2058 */
2059-/* NA reg = 48 bit Network Address Register, 3x16 or 8x8 bit readable */
2060+/* NA reg = 48 bit Network Address Register, 3x16 or 6x8 bit readable */
2061 #define B2_MAC_1 0x0100 /* NA reg MAC Address 1 */
2062 /* 0x0106 - 0x0107: reserved */
2063 #define B2_MAC_2 0x0108 /* NA reg MAC Address 2 */
2064@@ -400,14 +618,23 @@
2065 #define B2_CONN_TYP 0x0118 /* 8 bit Connector type */
2066 #define B2_PMD_TYP 0x0119 /* 8 bit PMD type */
2067 #define B2_MAC_CFG 0x011a /* 8 bit MAC Configuration / Chip Revision */
2068-#define B2_CHIP_ID 0x011b /* 8 bit Chip Identification Number */
2069- /* Eprom registers are currently of no use */
2070+#define B2_CHIP_ID 0x011b /* 8 bit Chip Identification Number */
2071+ /* Eprom registers */
2072 #define B2_E_0 0x011c /* 8 bit EPROM Byte 0 (ext. SRAM size */
2073+/* Yukon and Genesis */
2074 #define B2_E_1 0x011d /* 8 bit EPROM Byte 1 (PHY type) */
2075 #define B2_E_2 0x011e /* 8 bit EPROM Byte 2 */
2076+/* Yukon-2 */
2077+#define B2_Y2_CLK_GATE 0x011d /* 8 bit Clock Gating (Yukon-2) */
2078+#define B2_Y2_HW_RES 0x011e /* 8 bit HW Resources (Yukon-2) */
2079+
2080 #define B2_E_3 0x011f /* 8 bit EPROM Byte 3 */
2081+
2082+/* Yukon and Genesis */
2083 #define B2_FAR 0x0120 /* 32 bit Flash-Prom Addr Reg/Cnt */
2084 #define B2_FDP 0x0124 /* 8 bit Flash-Prom Data Port */
2085+/* Yukon-2 */
2086+#define B2_Y2_CLK_CTRL 0x0120 /* 32 bit Core Clock Frequency Control */
2087 /* 0x0125 - 0x0127: reserved */
2088 #define B2_LD_CTRL 0x0128 /* 8 bit EPROM loader control register */
2089 #define B2_LD_TEST 0x0129 /* 8 bit EPROM loader test register */
2090@@ -439,6 +666,10 @@
2091 #define B2_BSC_CTRL 0x0178 /* 8 bit Blink Source Counter Control */
2092 #define B2_BSC_STAT 0x0179 /* 8 bit Blink Source Counter Status */
2093 #define B2_BSC_TST 0x017a /* 16 bit Blink Source Counter Test Reg */
2094+
2095+/* Yukon-2 */
2096+#define Y2_PEX_PHY_DATA 0x0170 /* 16 bit PEX PHY Data Register */
2097+#define Y2_PEX_PHY_ADDR 0x0172 /* 16 bit PEX PHY Address Register */
2098 /* 0x017c - 0x017f: reserved */
2099
2100 /*
2101@@ -448,9 +679,14 @@
2102 #define B3_RAM_ADDR 0x0180 /* 32 bit RAM Address, to read or write */
2103 #define B3_RAM_DATA_LO 0x0184 /* 32 bit RAM Data Word (low dWord) */
2104 #define B3_RAM_DATA_HI 0x0188 /* 32 bit RAM Data Word (high dWord) */
2105+#define B3_RAM_PARITY 0x018c /* 8 bit RAM Parity (Yukon-ECU A1) */
2106+
2107+#define SELECT_RAM_BUFFER(rb, addr) (addr | (rb << 6)) /* Yukon-2 only */
2108+
2109 /* 0x018c - 0x018f: reserved */
2110
2111 /* RAM Interface Registers */
2112+/* Yukon-2: use SELECT_RAM_BUFFER() to access the RAM buffer */
2113 /*
2114 * The HW-Spec. calls this registers Timeout Value 0..11. But this names are
2115 * not usable in SW. Please notice these are NOT real timeouts, these are
2116@@ -517,8 +753,8 @@
2117 /* 0x01ea - 0x01eb: reserved */
2118 #define B3_PA_TOVAL_TX2 0x01ec /* 16 bit Timeout Val Tx Path MAC 2 */
2119 /* 0x01ee - 0x01ef: reserved */
2120-#define B3_PA_CTRL 0x01f0 /* 16 bit Packet Arbiter Ctrl Register */
2121-#define B3_PA_TEST 0x01f2 /* 16 bit Packet Arbiter Test Register */
2122+#define B3_PA_CTRL 0x01f0 /* 16 bit Packet Arbiter Ctrl Register */
2123+#define B3_PA_TEST 0x01f2 /* 16 bit Packet Arbiter Test Register */
2124 /* 0x01f4 - 0x01ff: reserved */
2125
2126 /*
2127@@ -532,7 +768,16 @@
2128 #define TXA_CTRL 0x0210 /* 8 bit Tx Arbiter Control Register */
2129 #define TXA_TEST 0x0211 /* 8 bit Tx Arbiter Test Register */
2130 #define TXA_STAT 0x0212 /* 8 bit Tx Arbiter Status Register */
2131- /* 0x0213 - 0x027f: reserved */
2132+ /* 0x0213 - 0x021f: reserved */
2133+
2134+ /* RSS key registers for Yukon-2 Family */
2135+#define B4_RSS_KEY 0x0220 /* 4x32 bit RSS Key register (Yukon-2) */
2136+ /* RSS key register offsets */
2137+#define KEY_IDX_0 0 /* offset for location of KEY 0 */
2138+#define KEY_IDX_1 4 /* offset for location of KEY 1 */
2139+#define KEY_IDX_2 8 /* offset for location of KEY 2 */
2140+#define KEY_IDX_3 12 /* offset for location of KEY 3 */
2141+
2142 /* 0x0280 - 0x0292: MAC 2 */
2143 /* 0x0213 - 0x027f: reserved */
2144
2145@@ -556,10 +801,10 @@
2146
2147 /* Queue Register Offsets, use Q_ADDR() to access */
2148 #define Q_D 0x00 /* 8*32 bit Current Descriptor */
2149-#define Q_DA_L 0x20 /* 32 bit Current Descriptor Address Low dWord */
2150-#define Q_DA_H 0x24 /* 32 bit Current Descriptor Address High dWord */
2151-#define Q_AC_L 0x28 /* 32 bit Current Address Counter Low dWord */
2152-#define Q_AC_H 0x2c /* 32 bit Current Address Counter High dWord */
2153+#define Q_DA_L 0x20 /* 32 bit Current Descriptor Address Low DWord */
2154+#define Q_DA_H 0x24 /* 32 bit Current Descriptor Address High DWord */
2155+#define Q_AC_L 0x28 /* 32 bit Current Address Counter Low DWord */
2156+#define Q_AC_H 0x2c /* 32 bit Current Address Counter High DWord */
2157 #define Q_BC 0x30 /* 32 bit Current Byte Counter */
2158 #define Q_CSR 0x34 /* 32 bit BMU Control/Status Register */
2159 #define Q_F 0x38 /* 32 bit Flag Register */
2160@@ -570,8 +815,56 @@
2161 #define Q_T1_SV 0x3f /* 8 bit Test Register 1 Supervisor SM */
2162 #define Q_T2 0x40 /* 32 bit Test Register 2 */
2163 #define Q_T3 0x44 /* 32 bit Test Register 3 */
2164+
2165+/* Yukon-2 */
2166+#define Q_DONE 0x24 /* 16 bit Done Index */
2167+
2168+#define Q_WM 0x40 /* 16 bit FIFO Watermark */
2169+#define Q_AL 0x42 /* 8 bit FIFO Alignment */
2170+ /* 0x43: reserved */
2171+/* RX Queue */
2172+#define Q_RX_RSP 0x44 /* 16 bit FIFO Read Shadow Pointer */
2173+#define Q_RX_RSL 0x46 /* 8 bit FIFO Read Shadow Level */
2174+ /* 0x47: reserved */
2175+#define Q_RX_RP 0x48 /* 8 bit FIFO Read Pointer */
2176+ /* 0x49: reserved */
2177+#define Q_RX_RL 0x4a /* 8 bit FIFO Read Level */
2178+ /* 0x4b: reserved */
2179+#define Q_RX_WP 0x4c /* 8 bit FIFO Write Pointer */
2180+#define Q_RX_WSP 0x4d /* 8 bit FIFO Write Shadow Pointer */
2181+#define Q_RX_WL 0x4e /* 8 bit FIFO Write Level */
2182+#define Q_RX_WSL 0x4f /* 8 bit FIFO Write Shadow Level */
2183+/* TX Queue */
2184+#define Q_TX_WSP 0x44 /* 16 bit FIFO Write Shadow Pointer */
2185+#define Q_TX_WSL 0x46 /* 8 bit FIFO Write Shadow Level */
2186+ /* 0x47: reserved */
2187+#define Q_TX_WP 0x48 /* 8 bit FIFO Write Pointer */
2188+ /* 0x49: reserved */
2189+#define Q_TX_WL 0x4a /* 8 bit FIFO Write Level */
2190+ /* 0x4b: reserved */
2191+#define Q_TX_RP 0x4c /* 8 bit FIFO Read Pointer */
2192+ /* 0x4d: reserved */
2193+#define Q_TX_RL 0x4e /* 8 bit FIFO Read Level */
2194+ /* 0x4f: reserved */
2195+
2196 /* 0x48 - 0x7f: reserved */
2197
2198+/* Queue Prefetch Unit Offsets, use Y2_PREF_Q_ADDR() to address (Yukon-2 only)*/
2199+#define Y2_B8_PREF_REGS 0x0450
2200+
2201+#define PREF_UNIT_CTRL_REG 0x00 /* 32 bit Prefetch Control register */
2202+#define PREF_UNIT_LAST_IDX_REG 0x04 /* 16 bit Last Index */
2203+#define PREF_UNIT_ADDR_LOW_REG 0x08 /* 32 bit List start addr, low part */
2204+#define PREF_UNIT_ADDR_HI_REG 0x0c /* 32 bit List start addr, high part*/
2205+#define PREF_UNIT_GET_IDX_REG 0x10 /* 16 bit Get Index */
2206+#define PREF_UNIT_PUT_IDX_REG 0x14 /* 16 bit Put Index */
2207+#define PREF_UNIT_FIFO_WP_REG 0x20 /* 8 bit FIFO write pointer */
2208+#define PREF_UNIT_FIFO_RP_REG 0x24 /* 8 bit FIFO read pointer */
2209+#define PREF_UNIT_FIFO_WM_REG 0x28 /* 8 bit FIFO watermark */
2210+#define PREF_UNIT_FIFO_LEV_REG 0x2c /* 8 bit FIFO level */
2211+
2212+#define PREF_UNIT_MASK_IDX 0x0fff
2213+
2214 /*
2215 * Bank 16 - 23
2216 */
2217@@ -583,17 +876,17 @@
2218 #define RB_END 0x04 /* 32 bit RAM Buffer End Address */
2219 #define RB_WP 0x08 /* 32 bit RAM Buffer Write Pointer */
2220 #define RB_RP 0x0c /* 32 bit RAM Buffer Read Pointer */
2221-#define RB_RX_UTPP 0x10 /* 32 bit Rx Upper Threshold, Pause Pack */
2222-#define RB_RX_LTPP 0x14 /* 32 bit Rx Lower Threshold, Pause Pack */
2223+#define RB_RX_UTPP 0x10 /* 32 bit Rx Upper Threshold, Pause Packet */
2224+#define RB_RX_LTPP 0x14 /* 32 bit Rx Lower Threshold, Pause Packet */
2225 #define RB_RX_UTHP 0x18 /* 32 bit Rx Upper Threshold, High Prio */
2226 #define RB_RX_LTHP 0x1c /* 32 bit Rx Lower Threshold, High Prio */
2227 /* 0x10 - 0x1f: reserved at Tx RAM Buffer Registers */
2228 #define RB_PC 0x20 /* 32 bit RAM Buffer Packet Counter */
2229 #define RB_LEV 0x24 /* 32 bit RAM Buffer Level Register */
2230-#define RB_CTRL 0x28 /* 8 bit RAM Buffer Control Register */
2231+#define RB_CTRL 0x28 /* 32 bit RAM Buffer Control Register */
2232 #define RB_TST1 0x29 /* 8 bit RAM Buffer Test Register 1 */
2233-#define RB_TST2 0x2A /* 8 bit RAM Buffer Test Register 2 */
2234- /* 0x2c - 0x7f: reserved */
2235+#define RB_TST2 0x2a /* 8 bit RAM Buffer Test Register 2 */
2236+ /* 0x2b - 0x7f: reserved */
2237
2238 /*
2239 * Bank 24
2240@@ -603,7 +896,7 @@
2241 * use MR_ADDR() to access
2242 */
2243 #define RX_MFF_EA 0x0c00 /* 32 bit Receive MAC FIFO End Address */
2244-#define RX_MFF_WP 0x0c04 /* 32 bit Receive MAC FIFO Write Pointer */
2245+#define RX_MFF_WP 0x0c04 /* 32 bit Receive MAC FIFO Write Pointer */
2246 /* 0x0c08 - 0x0c0b: reserved */
2247 #define RX_MFF_RP 0x0c0c /* 32 bit Receive MAC FIFO Read Pointer */
2248 #define RX_MFF_PC 0x0c10 /* 32 bit Receive MAC FIFO Packet Cnt */
2249@@ -628,20 +921,23 @@
2250 #define LNK_LED_REG 0x0c3c /* 8 bit Link LED Register */
2251 /* 0x0c3d - 0x0c3f: reserved */
2252
2253-/* Receive GMAC FIFO (YUKON only), use MR_ADDR() to access */
2254+/* Receive GMAC FIFO (YUKON and Yukon-2), use MR_ADDR() to access */
2255 #define RX_GMF_EA 0x0c40 /* 32 bit Rx GMAC FIFO End Address */
2256 #define RX_GMF_AF_THR 0x0c44 /* 32 bit Rx GMAC FIFO Almost Full Thresh. */
2257 #define RX_GMF_CTRL_T 0x0c48 /* 32 bit Rx GMAC FIFO Control/Test */
2258 #define RX_GMF_FL_MSK 0x0c4c /* 32 bit Rx GMAC FIFO Flush Mask */
2259 #define RX_GMF_FL_THR 0x0c50 /* 32 bit Rx GMAC FIFO Flush Threshold */
2260- /* 0x0c54 - 0x0c5f: reserved */
2261-#define RX_GMF_WP 0x0c60 /* 32 bit Rx GMAC FIFO Write Pointer */
2262+#define RX_GMF_TR_THR 0x0c54 /* 32 bit Rx Truncation Threshold (Yukon-2) */
2263+#define RX_GMF_UP_THR 0x0c58 /* 16 bit Rx Upper Pause Thr (Yukon-EC_U) */
2264+#define RX_GMF_LP_THR 0x0c5a /* 16 bit Rx Lower Pause Thr (Yukon-EC_U) */
2265+#define RX_GMF_VLAN 0x0c5c /* 32 bit Rx VLAN Type Register (Yukon-2) */
2266+#define RX_GMF_WP 0x0c60 /* 32 bit Rx GMAC FIFO Write Pointer */
2267 /* 0x0c64 - 0x0c67: reserved */
2268-#define RX_GMF_WLEV 0x0c68 /* 32 bit Rx GMAC FIFO Write Level */
2269+#define RX_GMF_WLEV 0x0c68 /* 32 bit Rx GMAC FIFO Write Level */
2270 /* 0x0c6c - 0x0c6f: reserved */
2271-#define RX_GMF_RP 0x0c70 /* 32 bit Rx GMAC FIFO Read Pointer */
2272+#define RX_GMF_RP 0x0c70 /* 32 bit Rx GMAC FIFO Read Pointer */
2273 /* 0x0c74 - 0x0c77: reserved */
2274-#define RX_GMF_RLEV 0x0c78 /* 32 bit Rx GMAC FIFO Read Level */
2275+#define RX_GMF_RLEV 0x0c78 /* 32 bit Rx GMAC FIFO Read Level */
2276 /* 0x0c7c - 0x0c7f: reserved */
2277
2278 /*
2279@@ -658,7 +954,7 @@
2280 * use MR_ADDR() to access
2281 */
2282 #define TX_MFF_EA 0x0d00 /* 32 bit Transmit MAC FIFO End Address */
2283-#define TX_MFF_WP 0x0d04 /* 32 bit Transmit MAC FIFO WR Pointer */
2284+#define TX_MFF_WP 0x0d04 /* 32 bit Transmit MAC FIFO WR Pointer */
2285 #define TX_MFF_WSP 0x0d08 /* 32 bit Transmit MAC FIFO WR Shadow Ptr */
2286 #define TX_MFF_RP 0x0d0c /* 32 bit Transmit MAC FIFO RD Pointer */
2287 #define TX_MFF_PC 0x0d10 /* 32 bit Transmit MAC FIFO Packet Cnt */
2288@@ -676,18 +972,19 @@
2289 #define TX_LED_TST 0x0d29 /* 8 bit Transmit LED Cnt Test Reg */
2290 /* 0x0d2a - 0x0d3f: reserved */
2291
2292-/* Transmit GMAC FIFO (YUKON only), use MR_ADDR() to access */
2293+/* Transmit GMAC FIFO (YUKON and Yukon-2), use MR_ADDR() to access */
2294 #define TX_GMF_EA 0x0d40 /* 32 bit Tx GMAC FIFO End Address */
2295-#define TX_GMF_AE_THR 0x0d44 /* 32 bit Tx GMAC FIFO Almost Empty Thresh.*/
2296+#define TX_GMF_AE_THR 0x0d44 /* 32 bit Tx GMAC FIFO Almost Empty Thresh. */
2297 #define TX_GMF_CTRL_T 0x0d48 /* 32 bit Tx GMAC FIFO Control/Test */
2298- /* 0x0d4c - 0x0d5f: reserved */
2299-#define TX_GMF_WP 0x0d60 /* 32 bit Tx GMAC FIFO Write Pointer */
2300-#define TX_GMF_WSP 0x0d64 /* 32 bit Tx GMAC FIFO Write Shadow Ptr. */
2301-#define TX_GMF_WLEV 0x0d68 /* 32 bit Tx GMAC FIFO Write Level */
2302+ /* 0x0d4c - 0x0d5b: reserved */
2303+#define TX_GMF_VLAN 0x0d5c /* 32 bit Tx VLAN Type Register (Yukon-2) */
2304+#define TX_GMF_WP 0x0d60 /* 32 bit Tx GMAC FIFO Write Pointer */
2305+#define TX_GMF_WSP 0x0d64 /* 32 bit Tx GMAC FIFO Write Shadow Pointer */
2306+#define TX_GMF_WLEV 0x0d68 /* 32 bit Tx GMAC FIFO Write Level */
2307 /* 0x0d6c - 0x0d6f: reserved */
2308-#define TX_GMF_RP 0x0d70 /* 32 bit Tx GMAC FIFO Read Pointer */
2309-#define TX_GMF_RSTP 0x0d74 /* 32 bit Tx GMAC FIFO Restart Pointer */
2310-#define TX_GMF_RLEV 0x0d78 /* 32 bit Tx GMAC FIFO Read Level */
2311+#define TX_GMF_RP 0x0d70 /* 32 bit Tx GMAC FIFO Read Pointer */
2312+#define TX_GMF_RSTP 0x0d74 /* 32 bit Tx GMAC FIFO Restart Pointer */
2313+#define TX_GMF_RLEV 0x0d78 /* 32 bit Tx GMAC FIFO Read Level */
2314 /* 0x0d7c - 0x0d7f: reserved */
2315
2316 /*
2317@@ -713,12 +1010,84 @@
2318 #define GMAC_TI_ST_CTRL 0x0e18 /* 8 bit Time Stamp Timer Ctrl Reg */
2319 /* 0x0e19: reserved */
2320 #define GMAC_TI_ST_TST 0x0e1a /* 8 bit Time Stamp Timer Test Reg */
2321- /* 0x0e1b - 0x0e7f: reserved */
2322+ /* 0x0e1b - 0x0e1f: reserved */
2323+
2324+/* Polling Unit Registers (Yukon-2 only) */
2325+#define POLL_CTRL 0x0e20 /* 32 bit Polling Unit Control Reg */
2326+#define POLL_LAST_IDX 0x0e24 /* 16 bit Polling Unit List Last Index */
2327+ /* 0x0e26 - 0x0e27: reserved */
2328+#define POLL_LIST_ADDR_LO 0x0e28 /* 32 bit Poll. List Start Addr (low) */
2329+#define POLL_LIST_ADDR_HI 0x0e2c /* 32 bit Poll. List Start Addr (high) */
2330+ /* 0x0e30 - 0x0e3f: reserved */
2331+
2332+/* ASF Subsystem Registers (Yukon-2 only) */
2333+#define B28_Y2_SMB_CONFIG 0x0e40 /* 32 bit ASF SMBus Config Register */
2334+#define B28_Y2_SMB_CSD_REG 0x0e44 /* 32 bit ASF SMB Control/Status/Data */
2335+ /* 0x0e48 - 0x0e5f: reserved */
2336+#define B28_Y2_ASF_IRQ_V_BASE 0x0e60 /* 32 bit ASF IRQ Vector Base */
2337+ /* 0x0e64 - 0x0e67: reserved */
2338+#define B28_Y2_ASF_STAT_CMD 0x0e68 /* 32 bit ASF Status and Command Reg */
2339+#define B28_Y2_ASF_HOST_COM 0x0e6c /* 32 bit ASF Host Communication Reg */
2340+#define B28_Y2_DATA_REG_1 0x0e70 /* 32 bit ASF/Host Data Register 1 */
2341+#define B28_Y2_DATA_REG_2 0x0e74 /* 32 bit ASF/Host Data Register 2 */
2342+#define B28_Y2_DATA_REG_3 0x0e78 /* 32 bit ASF/Host Data Register 3 */
2343+#define B28_Y2_DATA_REG_4 0x0e7c /* 32 bit ASF/Host Data Register 4 */
2344
2345 /*
2346 * Bank 29
2347 */
2348- /* 0x0e80 - 0x0efc: reserved */
2349+
2350+/* Status BMU Registers (Yukon-2 only)*/
2351+#define STAT_CTRL 0x0e80 /* 32 bit Status BMU Control Reg */
2352+#define STAT_LAST_IDX 0x0e84 /* 16 bit Status BMU Last Index */
2353+ /* 0x0e85 - 0x0e86: reserved */
2354+#define STAT_LIST_ADDR_LO 0x0e88 /* 32 bit Status List Start Addr (low) */
2355+#define STAT_LIST_ADDR_HI 0x0e8c /* 32 bit Status List Start Addr (high) */
2356+#define STAT_TXA1_RIDX 0x0e90 /* 16 bit Status TxA1 Report Index Reg */
2357+#define STAT_TXS1_RIDX 0x0e92 /* 16 bit Status TxS1 Report Index Reg */
2358+#define STAT_TXA2_RIDX 0x0e94 /* 16 bit Status TxA2 Report Index Reg */
2359+#define STAT_TXS2_RIDX 0x0e96 /* 16 bit Status TxS2 Report Index Reg */
2360+#define STAT_TX_IDX_TH 0x0e98 /* 16 bit Status Tx Index Threshold Reg */
2361+ /* 0x0e9a - 0x0e9b: reserved */
2362+#define STAT_PUT_IDX 0x0e9c /* 16 bit Status Put Index Reg */
2363+ /* 0x0e9e - 0x0e9f: reserved */
2364+
2365+/* FIFO Control/Status Registers (Yukon-2 only) */
2366+#define STAT_FIFO_WP 0x0ea0 /* 8 bit Status FIFO Write Pointer Reg */
2367+ /* 0x0ea1 - 0x0ea3: reserved */
2368+#define STAT_FIFO_RP 0x0ea4 /* 8 bit Status FIFO Read Pointer Reg */
2369+ /* 0x0ea5: reserved */
2370+#define STAT_FIFO_RSP 0x0ea6 /* 8 bit Status FIFO Read Shadow Ptr */
2371+ /* 0x0ea7: reserved */
2372+#define STAT_FIFO_LEVEL 0x0ea8 /* 8 bit Status FIFO Level Reg */
2373+ /* 0x0ea9: reserved */
2374+#define STAT_FIFO_SHLVL 0x0eaa /* 8 bit Status FIFO Shadow Level Reg */
2375+ /* 0x0eab: reserved */
2376+#define STAT_FIFO_WM 0x0eac /* 8 bit Status FIFO Watermark Reg */
2377+#define STAT_FIFO_ISR_WM 0x0ead /* 8 bit Status FIFO ISR Watermark Reg */
2378+ /* 0x0eae - 0x0eaf: reserved */
2379+
2380+/* Level and ISR Timer Registers (Yukon-2 only) */
2381+#define STAT_LEV_TIMER_INI 0x0eb0 /* 32 bit Level Timer Init. Value Reg */
2382+#define STAT_LEV_TIMER_CNT 0x0eb4 /* 32 bit Level Timer Counter Reg */
2383+#define STAT_LEV_TIMER_CTRL 0x0eb8 /* 8 bit Level Timer Control Reg */
2384+#define STAT_LEV_TIMER_TEST 0x0eb9 /* 8 bit Level Timer Test Reg */
2385+ /* 0x0eba - 0x0ebf: reserved */
2386+#define STAT_TX_TIMER_INI 0x0ec0 /* 32 bit Tx Timer Init. Value Reg */
2387+#define STAT_TX_TIMER_CNT 0x0ec4 /* 32 bit Tx Timer Counter Reg */
2388+#define STAT_TX_TIMER_CTRL 0x0ec8 /* 8 bit Tx Timer Control Reg */
2389+#define STAT_TX_TIMER_TEST 0x0ec9 /* 8 bit Tx Timer Test Reg */
2390+ /* 0x0eca - 0x0ecf: reserved */
2391+#define STAT_ISR_TIMER_INI 0x0ed0 /* 32 bit ISR Timer Init. Value Reg */
2392+#define STAT_ISR_TIMER_CNT 0x0ed4 /* 32 bit ISR Timer Counter Reg */
2393+#define STAT_ISR_TIMER_CTRL 0x0ed8 /* 8 bit ISR Timer Control Reg */
2394+#define STAT_ISR_TIMER_TEST 0x0ed9 /* 8 bit ISR Timer Test Reg */
2395+ /* 0x0eda - 0x0eff: reserved */
2396+
2397+#define ST_LAST_IDX_MASK 0x007f /* Last Index Mask */
2398+#define ST_TXRP_IDX_MASK 0x0fff /* Tx Report Index Mask */
2399+#define ST_TXTH_IDX_MASK 0x0fff /* Tx Threshold Index Mask */
2400+#define ST_WM_IDX_MASK 0x3f /* FIFO Watermark Index Mask */
2401
2402 /*
2403 * Bank 30
2404@@ -742,11 +1111,9 @@
2405 #define WOL_MATCH_RES 0x0f23 /* 8 bit WOL Match Result Reg */
2406 #define WOL_MAC_ADDR_LO 0x0f24 /* 32 bit WOL MAC Address Low */
2407 #define WOL_MAC_ADDR_HI 0x0f28 /* 16 bit WOL MAC Address High */
2408-#define WOL_PATT_RPTR 0x0f2c /* 8 bit WOL Pattern Read Ptr */
2409-
2410-/* use this macro to access above registers */
2411-#define WOL_REG(Reg) ((Reg) + (pAC->GIni.GIWolOffs))
2412-
2413+#define WOL_PATT_PME 0x0f2a /* 8 bit WOL PME Match Enable (Yukon-2) */
2414+#define WOL_PATT_ASFM 0x0f2b /* 8 bit WOL ASF Match Enable (Yukon-2) */
2415+#define WOL_PATT_RPTR 0x0f2c /* 8 bit WOL Pattern Read Pointer */
2416
2417 /* WOL Pattern Length Registers (YUKON only) */
2418
2419@@ -764,11 +1131,22 @@
2420 */
2421 /* 0x0f80 - 0x0fff: reserved */
2422
2423+/* WOL registers link 2 */
2424+
2425+/* use this macro to access WOL registers */
2426+#define WOL_REG(Port, Reg) ((Reg) + ((Port)*0x80) + (pAC->GIni.GIWolOffs))
2427+
2428 /*
2429 * Bank 32 - 33
2430 */
2431 #define WOL_PATT_RAM_1 0x1000 /* WOL Pattern RAM Link 1 */
2432+#define WOL_PATT_RAM_2 0x1400 /* WOL Pattern RAM Link 2 */
2433+
2434+/* use this macro to retrieve the pattern ram base address */
2435+#define WOL_PATT_RAM_BASE(Port) (WOL_PATT_RAM_1 + (Port)*0x400)
2436
2437+/* offset to configuration space on Yukon-2 */
2438+#define Y2_CFG_SPC 0x1c00
2439 /*
2440 * Bank 0x22 - 0x3f
2441 */
2442@@ -800,13 +1178,27 @@
2443 */
2444 /* B0_RAP 8 bit Register Address Port */
2445 /* Bit 7: reserved */
2446-#define RAP_RAP 0x3f /* Bit 6..0: 0 = block 0,..,6f = block 6f */
2447+#define RAP_MSK 0x7f /* Bit 6..0: 0 = block 0,..,6f = block 6f */
2448+
2449+/* B0_CTST 24 bit Control/Status register */
2450+ /* Bit 23..18: reserved */
2451+#define Y2_VMAIN_AVAIL BIT_17 /* VMAIN available (YUKON-2 only) */
2452+#define Y2_VAUX_AVAIL BIT_16 /* VAUX available (YUKON-2 only) */
2453+#define Y2_HW_WOL_ON BIT_15S /* HW WOL On (Yukon-EC Ultra A1 only) */
2454+#define Y2_HW_WOL_OFF BIT_14S /* HW WOL Off (Yukon-EC Ultra A1 only) */
2455+#define Y2_ASF_ENABLE BIT_13S /* ASF Unit Enable (YUKON-2 only) */
2456+#define Y2_ASF_DISABLE BIT_12S /* ASF Unit Disable (YUKON-2 only) */
2457+#define Y2_CLK_RUN_ENA BIT_11S /* CLK_RUN Enable (YUKON-2 only) */
2458+#define Y2_CLK_RUN_DIS BIT_10S /* CLK_RUN Disable (YUKON-2 only) */
2459+#define Y2_LED_STAT_ON BIT_9S /* Status LED On (YUKON-2 only) */
2460+#define Y2_LED_STAT_OFF BIT_8S /* Status LED Off (YUKON-2 only) */
2461+ /* Bit 7.. 0: same as below */
2462
2463 /* B0_CTST 16 bit Control/Status register */
2464 /* Bit 15..14: reserved */
2465-#define CS_CLK_RUN_HOT BIT_13S /* CLK_RUN hot m. (YUKON-Lite only) */
2466-#define CS_CLK_RUN_RST BIT_12S /* CLK_RUN reset (YUKON-Lite only) */
2467-#define CS_CLK_RUN_ENA BIT_11S /* CLK_RUN enable (YUKON-Lite only) */
2468+#define CS_CLK_RUN_HOT BIT_13S /* CLK_RUN Hot m. (YUKON-Lite only) */
2469+#define CS_CLK_RUN_RST BIT_12S /* CLK_RUN Reset (YUKON-Lite only) */
2470+#define CS_CLK_RUN_ENA BIT_11S /* CLK_RUN Enable (YUKON-Lite only) */
2471 #define CS_VAUX_AVAIL BIT_10S /* VAUX available (YUKON only) */
2472 #define CS_BUS_CLOCK BIT_9S /* Bus Clock 0/1 = 33/66 MHz */
2473 #define CS_BUS_SLOT_SZ BIT_8S /* Slot Size 0/1 = 32/64 bit slot */
2474@@ -814,26 +1206,27 @@
2475 #define CS_CL_SW_IRQ BIT_6S /* Clear IRQ SW Request */
2476 #define CS_STOP_DONE BIT_5S /* Stop Master is finished */
2477 #define CS_STOP_MAST BIT_4S /* Command Bit to stop the master */
2478-#define CS_MRST_CLR BIT_3S /* Clear Master reset */
2479-#define CS_MRST_SET BIT_2S /* Set Master reset */
2480-#define CS_RST_CLR BIT_1S /* Clear Software reset */
2481-#define CS_RST_SET BIT_0S /* Set Software reset */
2482+#define CS_MRST_CLR BIT_3S /* Clear Master Reset */
2483+#define CS_MRST_SET BIT_2S /* Set Master Reset */
2484+#define CS_RST_CLR BIT_1S /* Clear Software Reset */
2485+#define CS_RST_SET BIT_0S /* Set Software Reset */
2486
2487-/* B0_LED 8 Bit LED register */
2488+/* B0_LED 8 Bit LED register (GENESIS only)*/
2489 /* Bit 7.. 2: reserved */
2490-#define LED_STAT_ON BIT_1S /* Status LED on */
2491-#define LED_STAT_OFF BIT_0S /* Status LED off */
2492+#define LED_STAT_ON BIT_1S /* Status LED On */
2493+#define LED_STAT_OFF BIT_0S /* Status LED Off */
2494
2495 /* B0_POWER_CTRL 8 Bit Power Control reg (YUKON only) */
2496 #define PC_VAUX_ENA BIT_7 /* Switch VAUX Enable */
2497-#define PC_VAUX_DIS BIT_6 /* Switch VAUX Disable */
2498-#define PC_VCC_ENA BIT_5 /* Switch VCC Enable */
2499-#define PC_VCC_DIS BIT_4 /* Switch VCC Disable */
2500-#define PC_VAUX_ON BIT_3 /* Switch VAUX On */
2501-#define PC_VAUX_OFF BIT_2 /* Switch VAUX Off */
2502-#define PC_VCC_ON BIT_1 /* Switch VCC On */
2503-#define PC_VCC_OFF BIT_0 /* Switch VCC Off */
2504+#define PC_VAUX_DIS BIT_6 /* Switch VAUX Disable */
2505+#define PC_VCC_ENA BIT_5 /* Switch VCC Enable */
2506+#define PC_VCC_DIS BIT_4 /* Switch VCC Disable */
2507+#define PC_VAUX_ON BIT_3 /* Switch VAUX On */
2508+#define PC_VAUX_OFF BIT_2 /* Switch VAUX Off */
2509+#define PC_VCC_ON BIT_1 /* Switch VCC On */
2510+#define PC_VCC_OFF BIT_0 /* Switch VCC Off */
2511
2512+/* Yukon and Genesis */
2513 /* B0_ISRC 32 bit Interrupt Source Register */
2514 /* B0_IMSK 32 bit Interrupt Mask Register */
2515 /* B0_SP_ISRC 32 bit Special Interrupt Source Reg */
2516@@ -879,12 +1272,51 @@
2517 #define IS_XA2_F BIT_1 /* Q_XA2 End of Frame */
2518 #define IS_XA2_C BIT_0 /* Q_XA2 Encoding Error */
2519
2520+/* Yukon-2 */
2521+/* B0_ISRC 32 bit Interrupt Source Register */
2522+/* B0_IMSK 32 bit Interrupt Mask Register */
2523+/* B0_SP_ISRC 32 bit Special Interrupt Source Reg */
2524+/* B2_IRQM_MSK 32 bit IRQ Moderation Mask */
2525+/* B0_Y2_SP_ISRC2 32 bit Special Interrupt Source Reg 2 */
2526+/* B0_Y2_SP_ISRC3 32 bit Special Interrupt Source Reg 3 */
2527+/* B0_Y2_SP_EISR 32 bit Enter ISR Reg */
2528+/* B0_Y2_SP_LISR 32 bit Leave ISR Reg */
2529+#define Y2_IS_PORT_MASK(Port, Mask) ((Mask) << (Port*8))
2530+#define Y2_IS_HW_ERR BIT_31 /* Interrupt HW Error */
2531+#define Y2_IS_STAT_BMU BIT_30 /* Status BMU Interrupt */
2532+#define Y2_IS_ASF BIT_29 /* ASF subsystem Interrupt */
2533+ /* Bit 28: reserved */
2534+#define Y2_IS_POLL_CHK BIT_27 /* Check IRQ from polling unit */
2535+#define Y2_IS_TWSI_RDY BIT_26 /* IRQ on end of TWSI Tx */
2536+#define Y2_IS_IRQ_SW BIT_25 /* SW forced IRQ */
2537+#define Y2_IS_TIMINT BIT_24 /* IRQ from Timer */
2538+ /* Bit 23..16 reserved */
2539+ /* Link 2 Interrupts */
2540+#define Y2_IS_IRQ_PHY2 BIT_12 /* Interrupt from PHY 2 */
2541+#define Y2_IS_IRQ_MAC2 BIT_11 /* Interrupt from MAC 2 */
2542+#define Y2_IS_CHK_RX2 BIT_10 /* Descriptor error Rx 2 */
2543+#define Y2_IS_CHK_TXS2 BIT_9 /* Descriptor error TXS 2 */
2544+#define Y2_IS_CHK_TXA2 BIT_8 /* Descriptor error TXA 2 */
2545+ /* Bit 7.. 5 reserved */
2546+ /* Link 1 interrupts */
2547+#define Y2_IS_IRQ_PHY1 BIT_4 /* Interrupt from PHY 1 */
2548+#define Y2_IS_IRQ_MAC1 BIT_3 /* Interrupt from MAC 1 */
2549+#define Y2_IS_CHK_RX1 BIT_2 /* Descriptor error Rx 1 */
2550+#define Y2_IS_CHK_TXS1 BIT_1 /* Descriptor error TXS 1 */
2551+#define Y2_IS_CHK_TXA1 BIT_0 /* Descriptor error TXA 1 */
2552+
2553+#define Y2_IS_L1_MASK 0x0000001fUL /* IRQ Mask for port 1 */
2554+
2555+#define Y2_IS_L2_MASK 0x00001f00UL /* IRQ Mask for port 2 */
2556+
2557+#define Y2_IS_ALL_MSK 0xef001f1fUL /* All Interrupt bits */
2558
2559+/* Yukon and Genesis */
2560 /* B0_HWE_ISRC 32 bit HW Error Interrupt Src Reg */
2561 /* B0_HWE_IMSK 32 bit HW Error Interrupt Mask Reg */
2562 /* B2_IRQM_HWE_MSK 32 bit IRQ Moderation HW Error Mask */
2563 #define IS_ERR_MSK 0x00000fffL /* All Error bits */
2564- /* Bit 31..14: reserved */
2565+ /* Bit 31..14: reserved */
2566 #define IS_IRQ_TIST_OV BIT_13 /* Time Stamp Timer Overflow (YUKON only) */
2567 #define IS_IRQ_SENSOR BIT_12 /* IRQ from Sensor (YUKON only) */
2568 #define IS_IRQ_MST_ERR BIT_11 /* IRQ master error detected */
2569@@ -900,6 +1332,43 @@
2570 #define IS_R1_PAR_ERR BIT_1 /* Queue R1 Parity Error */
2571 #define IS_R2_PAR_ERR BIT_0 /* Queue R2 Parity Error */
2572
2573+/* Yukon-2 */
2574+/* B0_HWE_ISRC 32 bit HW Error Interrupt Src Reg */
2575+/* B0_HWE_IMSK 32 bit HW Error Interrupt Mask Reg */
2576+/* B2_IRQM_HWE_MSK 32 bit IRQ Moderation HW Error Mask */
2577+ /* Bit: 31..30 reserved */
2578+#define Y2_IS_TIST_OV BIT_29 /* Time Stamp Timer overflow interrupt */
2579+#define Y2_IS_SENSOR BIT_28 /* Sensor interrupt */
2580+#define Y2_IS_MST_ERR BIT_27 /* Master error interrupt */
2581+#define Y2_IS_IRQ_STAT BIT_26 /* Status exception interrupt */
2582+#define Y2_IS_PCI_EXP BIT_25 /* PCI-Express interrupt */
2583+#define Y2_IS_PCI_NEXP BIT_24 /* Bus Abort detected */
2584+ /* Bit: 23..14 reserved */
2585+ /* Link 2 */
2586+#define Y2_IS_PAR_RD2 BIT_13 /* Read RAM parity error interrupt */
2587+#define Y2_IS_PAR_WR2 BIT_12 /* Write RAM parity error interrupt */
2588+#define Y2_IS_PAR_MAC2 BIT_11 /* MAC hardware fault interrupt */
2589+#define Y2_IS_PAR_RX2 BIT_10 /* Parity Error Rx Queue 2 */
2590+#define Y2_IS_TCP_TXS2 BIT_9 /* TCP length mismatch sync Tx queue IRQ */
2591+#define Y2_IS_TCP_TXA2 BIT_8 /* TCP length mismatch async Tx queue IRQ */
2592+ /* Bit: 9.. 6 reserved */
2593+ /* Link 1 */
2594+#define Y2_IS_PAR_RD1 BIT_5 /* Read RAM parity error interrupt */
2595+#define Y2_IS_PAR_WR1 BIT_4 /* Write RAM parity error interrupt */
2596+#define Y2_IS_PAR_MAC1 BIT_3 /* MAC hardware fault interrupt */
2597+#define Y2_IS_PAR_RX1 BIT_2 /* Parity Error Rx Queue 1 */
2598+#define Y2_IS_TCP_TXS1 BIT_1 /* TCP length mismatch sync Tx queue IRQ */
2599+#define Y2_IS_TCP_TXA1 BIT_0 /* TCP length mismatch async Tx queue IRQ */
2600+
2601+#define Y2_HWE_L1_MASK (Y2_IS_PAR_RD1 | Y2_IS_PAR_WR1 | Y2_IS_PAR_MAC1 |\
2602+ Y2_IS_PAR_RX1 | Y2_IS_TCP_TXS1| Y2_IS_TCP_TXA1)
2603+#define Y2_HWE_L2_MASK (Y2_IS_PAR_RD2 | Y2_IS_PAR_WR2 | Y2_IS_PAR_MAC2 |\
2604+ Y2_IS_PAR_RX2 | Y2_IS_TCP_TXS2| Y2_IS_TCP_TXA2)
2605+
2606+#define Y2_HWE_ALL_MSK (Y2_IS_TIST_OV | /* Y2_IS_SENSOR | */ Y2_IS_MST_ERR |\
2607+ Y2_IS_IRQ_STAT | Y2_IS_PCI_EXP |\
2608+ Y2_HWE_L1_MASK | Y2_HWE_L2_MASK)
2609+
2610 /* B2_CONN_TYP 8 bit Connector type */
2611 /* B2_PMD_TYP 8 bit PMD type */
2612 /* Values of connector and PMD type comply to SysKonnect internal std */
2613@@ -908,19 +1377,74 @@
2614 #define CFG_CHIP_R_MSK (0xf<<4) /* Bit 7.. 4: Chip Revision */
2615 /* Bit 3.. 2: reserved */
2616 #define CFG_DIS_M2_CLK BIT_1S /* Disable Clock for 2nd MAC */
2617-#define CFG_SNG_MAC BIT_0S /* MAC Config: 0=2 MACs / 1=1 MAC*/
2618+#define CFG_SNG_MAC BIT_0S /* MAC Config: 0 = 2 MACs; 1 = 1 MAC */
2619
2620-/* B2_CHIP_ID 8 bit Chip Identification Number */
2621+/* B2_CHIP_ID 8 bit Chip Identification Number */
2622 #define CHIP_ID_GENESIS 0x0a /* Chip ID for GENESIS */
2623 #define CHIP_ID_YUKON 0xb0 /* Chip ID for YUKON */
2624 #define CHIP_ID_YUKON_LITE 0xb1 /* Chip ID for YUKON-Lite (Rev. A1-A3) */
2625 #define CHIP_ID_YUKON_LP 0xb2 /* Chip ID for YUKON-LP */
2626+#define CHIP_ID_YUKON_XL 0xb3 /* Chip ID for YUKON-2 XL */
2627+#define CHIP_ID_YUKON_EC_U 0xb4 /* Chip ID for YUKON-2 EC Ultra */
2628+#define CHIP_ID_YUKON_EC 0xb6 /* Chip ID for YUKON-2 EC */
2629+#define CHIP_ID_YUKON_FE 0xb7 /* Chip ID for YUKON-2 FE */
2630
2631 #define CHIP_REV_YU_LITE_A1 3 /* Chip Rev. for YUKON-Lite A1,A2 */
2632 #define CHIP_REV_YU_LITE_A3 7 /* Chip Rev. for YUKON-Lite A3 */
2633
2634+#define CHIP_REV_YU_XL_A0 0 /* Chip Rev. for Yukon-2 A0 */
2635+#define CHIP_REV_YU_XL_A1 1 /* Chip Rev. for Yukon-2 A1 */
2636+#define CHIP_REV_YU_XL_A2 2 /* Chip Rev. for Yukon-2 A2 */
2637+#define CHIP_REV_YU_XL_A3 3 /* Chip Rev. for Yukon-2 A3 */
2638+
2639+#define CHIP_REV_YU_EC_A1 0 /* Chip Rev. for Yukon-EC A0,A1 */
2640+#define CHIP_REV_YU_EC_A2 1 /* Chip Rev. for Yukon-EC A2 */
2641+#define CHIP_REV_YU_EC_A3 2 /* Chip Rev. for Yukon-EC A3 */
2642+
2643+#define CHIP_REV_YU_EC_U_A0 1 /* Chip Rev. for Yukon-EC Ultra A0 */
2644+#define CHIP_REV_YU_EC_U_A1 2 /* Chip Rev. for Yukon-EC Ultra A1 */
2645+
2646+/* B2_Y2_CLK_GATE 8 bit Clock Gating (Yukon-2 only) */
2647+#define Y2_STATUS_LNK2_INAC BIT_7S /* Status Link 2 inactiv (0 = activ) */
2648+#define Y2_CLK_GAT_LNK2_DIS BIT_6S /* Disable PHY clock for Link 2 */
2649+#define Y2_COR_CLK_LNK2_DIS BIT_5S /* Disable Core clock Link 2 */
2650+#define Y2_PCI_CLK_LNK2_DIS BIT_4S /* Disable PCI clock Link 2 */
2651+#define Y2_STATUS_LNK1_INAC BIT_3S /* Status Link 1 inactiv (0 = activ) */
2652+#define Y2_CLK_GAT_LNK1_DIS BIT_2S /* Disable PHY clock for Link 1 */
2653+#define Y2_COR_CLK_LNK1_DIS BIT_1S /* Disable Core clock Link 1 */
2654+#define Y2_PCI_CLK_LNK1_DIS BIT_0S /* Disable PCI clock Link 1 */
2655+
2656+/* B2_Y2_HW_RES 8 bit HW Resources (Yukon-2 only) */
2657+ /* Bit 7.. 5: reserved */
2658+#define CFG_LED_MODE_MSK (7<<2) /* Bit 4.. 2: LED Mode Mask */
2659+#define CFG_LINK_2_AVAIL BIT_1S /* Link 2 available */
2660+#define CFG_LINK_1_AVAIL BIT_0S /* Link 1 available */
2661+
2662+#define CFG_LED_MODE(x) (((x) & CFG_LED_MODE_MSK) >> 2)
2663+#define CFG_DUAL_MAC_MSK (CFG_LINK_2_AVAIL | CFG_LINK_1_AVAIL)
2664+
2665+#define CFG_LED_SING_ACT_LNK 0 /* Single LED ACT/LNK mode */
2666+#define CFG_LED_DUAL_ACT_LNK 1 /* Dual LED ACT/LNK mode */
2667+
2668+/* B2_E_3 8 bit lower 4 bits used for HW self test result */
2669+#define B2_E3_RES_MASK 0x0f
2670+
2671 /* B2_FAR 32 bit Flash-Prom Addr Reg/Cnt */
2672-#define FAR_ADDR 0x1ffffL /* Bit 16.. 0: FPROM Address mask */
2673+#define FAR_ADDR 0x1ffffL /* Bit 16.. 0: FPROM Address Mask */
2674+
2675+/* B2_Y2_CLK_CTRL 32 bit Core Clock Frequency Control Register (Yukon-2/EC) */
2676+ /* Bit 31..24: reserved */
2677+/* Yukon-EC/FE */
2678+#define Y2_CLK_DIV_VAL_MSK (0xffL<<16) /* Bit 23..16: Clock Divisor Value */
2679+#define Y2_CLK_DIV_VAL(x) (SHIFT16(x) & Y2_CLK_DIV_VAL_MSK)
2680+/* Yukon-2 */
2681+#define Y2_CLK_DIV_VAL2_MSK (7L<<21) /* Bit 23..21: Clock Divisor Value */
2682+#define Y2_CLK_SELECT2_MSK (0x1fL<<16) /* Bit 20..16: Clock Select */
2683+#define Y2_CLK_DIV_VAL_2(x) (SHIFT21(x) & Y2_CLK_DIV_VAL2_MSK)
2684+#define Y2_CLK_SEL_VAL_2(x) (SHIFT16(x) & Y2_CLK_SELECT2_MSK)
2685+ /* Bit 15.. 2: reserved */
2686+#define Y2_CLK_DIV_ENA BIT_1S /* Enable Core Clock Division */
2687+#define Y2_CLK_DIV_DIS BIT_0S /* Disable Core Clock Division */
2688
2689 /* B2_LD_CTRL 8 bit EPROM loader control register */
2690 /* Bits are currently reserved */
2691@@ -960,9 +1484,6 @@
2692 #define DPT_START BIT_1S /* Start Descriptor Poll Timer */
2693 #define DPT_STOP BIT_0S /* Stop Descriptor Poll Timer */
2694
2695-/* B2_E_3 8 bit lower 4 bits used for HW self test result */
2696-#define B2_E3_RES_MASK 0x0f
2697-
2698 /* B2_TST_CTRL1 8 bit Test Control Register 1 */
2699 #define TST_FRC_DPERR_MR BIT_7S /* force DATAPERR on MST RD */
2700 #define TST_FRC_DPERR_MW BIT_6S /* force DATAPERR on MST WR */
2701@@ -975,14 +1496,14 @@
2702
2703 /* B2_TST_CTRL2 8 bit Test Control Register 2 */
2704 /* Bit 7.. 4: reserved */
2705- /* force the following error on the next master read/write */
2706+ /* force the following error on the next master read/write */
2707 #define TST_FRC_DPERR_MR64 BIT_3S /* DataPERR RD 64 */
2708 #define TST_FRC_DPERR_MW64 BIT_2S /* DataPERR WR 64 */
2709 #define TST_FRC_APERR_1M64 BIT_1S /* AddrPERR on 1. phase */
2710 #define TST_FRC_APERR_2M64 BIT_0S /* AddrPERR on 2. phase */
2711
2712 /* B2_GP_IO 32 bit General Purpose I/O Register */
2713- /* Bit 31..26: reserved */
2714+ /* Bit 31..26: reserved */
2715 #define GP_DIR_9 BIT_25 /* IO_9 direct, 0=In/1=Out */
2716 #define GP_DIR_8 BIT_24 /* IO_8 direct, 0=In/1=Out */
2717 #define GP_DIR_7 BIT_23 /* IO_7 direct, 0=In/1=Out */
2718@@ -1009,15 +1530,15 @@
2719 #define I2C_FLAG BIT_31 /* Start read/write if WR */
2720 #define I2C_ADDR (0x7fffL<<16) /* Bit 30..16: Addr to be RD/WR */
2721 #define I2C_DEV_SEL (0x7fL<<9) /* Bit 15.. 9: I2C Device Select */
2722- /* Bit 8.. 5: reserved */
2723+ /* Bit 8.. 5: reserved */
2724 #define I2C_BURST_LEN BIT_4 /* Burst Len, 1/4 bytes */
2725-#define I2C_DEV_SIZE (7<<1) /* Bit 3.. 1: I2C Device Size */
2726-#define I2C_025K_DEV (0<<1) /* 0: 256 Bytes or smal. */
2727-#define I2C_05K_DEV (1<<1) /* 1: 512 Bytes */
2728-#define I2C_1K_DEV (2<<1) /* 2: 1024 Bytes */
2729-#define I2C_2K_DEV (3<<1) /* 3: 2048 Bytes */
2730-#define I2C_4K_DEV (4<<1) /* 4: 4096 Bytes */
2731-#define I2C_8K_DEV (5<<1) /* 5: 8192 Bytes */
2732+#define I2C_DEV_SIZE (7<<1) /* Bit 3.. 1: I2C Device Size */
2733+#define I2C_025K_DEV (0<<1) /* 0: 256 Bytes or smaller */
2734+#define I2C_05K_DEV (1<<1) /* 1: 512 Bytes */
2735+#define I2C_1K_DEV (2<<1) /* 2: 1024 Bytes */
2736+#define I2C_2K_DEV (3<<1) /* 3: 2048 Bytes */
2737+#define I2C_4K_DEV (4<<1) /* 4: 4096 Bytes */
2738+#define I2C_8K_DEV (5<<1) /* 5: 8192 Bytes */
2739 #define I2C_16K_DEV (6<<1) /* 6: 16384 Bytes */
2740 #define I2C_32K_DEV (7<<1) /* 7: 32768 Bytes */
2741 #define I2C_STOP BIT_0 /* Interrupt I2C transfer */
2742@@ -1026,16 +1547,14 @@
2743 /* Bit 31.. 1 reserved */
2744 #define I2C_CLR_IRQ BIT_0 /* Clear I2C IRQ */
2745
2746-/* B2_I2C_SW 32 bit (8 bit access) I2C HW SW Port Register */
2747+/* B2_I2C_SW 32 bit (8 bit access) I2C SW Port Register */
2748 /* Bit 7.. 3: reserved */
2749 #define I2C_DATA_DIR BIT_2S /* direction of I2C_DATA */
2750-#define I2C_DATA BIT_1S /* I2C Data Port */
2751-#define I2C_CLK BIT_0S /* I2C Clock Port */
2752+#define I2C_DATA BIT_1S /* I2C Data Port */
2753+#define I2C_CLK BIT_0S /* I2C Clock Port */
2754
2755-/*
2756- * I2C Address
2757- */
2758-#define I2C_SENS_ADDR LM80_ADDR /* I2C Sensor Address, (Volt and Temp)*/
2759+/* I2C Address */
2760+#define I2C_SENS_ADDR LM80_ADDR /* I2C Sensor Address (Volt and Temp) */
2761
2762
2763 /* B2_BSC_CTRL 8 bit Blink Source Counter Control */
2764@@ -1052,16 +1571,20 @@
2765 #define BSC_T_OFF BIT_1S /* Test mode off */
2766 #define BSC_T_STEP BIT_0S /* Test step */
2767
2768+/* Y2_PEX_PHY_ADDR/DATA PEX PHY address and data reg (Yukon-2 only) */
2769+#define PEX_RD_ACCESS BIT_31 /* Access Mode Read = 1, Write = 0 */
2770+#define PEX_DB_ACCESS BIT_30 /* Access to debug register */
2771+
2772
2773 /* B3_RAM_ADDR 32 bit RAM Address, to read or write */
2774 /* Bit 31..19: reserved */
2775 #define RAM_ADR_RAN 0x0007ffffL /* Bit 18.. 0: RAM Address Range */
2776
2777 /* RAM Interface Registers */
2778-/* B3_RI_CTRL 16 bit RAM Iface Control Register */
2779+/* B3_RI_CTRL 16 bit RAM Interface Control Register */
2780 /* Bit 15..10: reserved */
2781-#define RI_CLR_RD_PERR BIT_9S /* Clear IRQ RAM Read Parity Err */
2782-#define RI_CLR_WR_PERR BIT_8S /* Clear IRQ RAM Write Parity Err*/
2783+#define RI_CLR_RD_PERR BIT_9S /* Clear IRQ RAM Read Parity Err */
2784+#define RI_CLR_WR_PERR BIT_8S /* Clear IRQ RAM Write Parity Err */
2785 /* Bit 7.. 2: reserved */
2786 #define RI_RST_CLR BIT_1S /* Clear RAM Interface Reset */
2787 #define RI_RST_SET BIT_0S /* Set RAM Interface Reset */
2788@@ -1171,7 +1694,7 @@
2789 /* Bit 31..16: reserved */
2790 #define BC_MAX 0xffff /* Bit 15.. 0: Byte counter */
2791
2792-/* BMU Control Status Registers */
2793+/* BMU Control / Status Registers (Yukon and Genesis) */
2794 /* B0_R1_CSR 32 bit BMU Ctrl/Stat Rx Queue 1 */
2795 /* B0_R2_CSR 32 bit BMU Ctrl/Stat Rx Queue 2 */
2796 /* B0_XA1_CSR 32 bit BMU Ctrl/Stat Sync Tx Queue 1 */
2797@@ -1212,13 +1735,48 @@
2798 CSR_SV_RUN | CSR_DREAD_RUN | CSR_DWRITE_RUN |\
2799 CSR_TRANS_RUN)
2800
2801+/* Rx BMU Control / Status Registers (Yukon-2) */
2802+#define BMU_IDLE BIT_31 /* BMU Idle State */
2803+#define BMU_RX_TCP_PKT BIT_30 /* Rx TCP Packet (when RSS Hash enabled) */
2804+#define BMU_RX_IP_PKT BIT_29 /* Rx IP Packet (when RSS Hash enabled) */
2805+ /* Bit 28..16: reserved */
2806+#define BMU_ENA_RX_RSS_HASH BIT_15 /* Enable Rx RSS Hash */
2807+#define BMU_DIS_RX_RSS_HASH BIT_14 /* Disable Rx RSS Hash */
2808+#define BMU_ENA_RX_CHKSUM BIT_13 /* Enable Rx TCP/IP Checksum Check */
2809+#define BMU_DIS_RX_CHKSUM BIT_12 /* Disable Rx TCP/IP Checksum Check */
2810+#define BMU_CLR_IRQ_PAR BIT_11 /* Clear IRQ on Parity errors (Rx) */
2811+#define BMU_CLR_IRQ_TCP BIT_11 /* Clear IRQ on TCP segmen. error (Tx) */
2812+#define BMU_CLR_IRQ_CHK BIT_10 /* Clear IRQ Check */
2813+#define BMU_STOP BIT_9 /* Stop Rx/Tx Queue */
2814+#define BMU_START BIT_8 /* Start Rx/Tx Queue */
2815+#define BMU_FIFO_OP_ON BIT_7 /* FIFO Operational On */
2816+#define BMU_FIFO_OP_OFF BIT_6 /* FIFO Operational Off */
2817+#define BMU_FIFO_ENA BIT_5 /* Enable FIFO */
2818+#define BMU_FIFO_RST BIT_4 /* Reset FIFO */
2819+#define BMU_OP_ON BIT_3 /* BMU Operational On */
2820+#define BMU_OP_OFF BIT_2 /* BMU Operational Off */
2821+#define BMU_RST_CLR BIT_1 /* Clear BMU Reset (Enable) */
2822+#define BMU_RST_SET BIT_0 /* Set BMU Reset */
2823+
2824+#define BMU_CLR_RESET (BMU_FIFO_RST | BMU_OP_OFF | BMU_RST_CLR)
2825+#define BMU_OPER_INIT (BMU_CLR_IRQ_PAR | BMU_CLR_IRQ_CHK | BMU_START | \
2826+ BMU_FIFO_ENA | BMU_OP_ON)
2827+
2828+/* Tx BMU Control / Status Registers (Yukon-2) */
2829+ /* Bit 31: same as for Rx */
2830+ /* Bit 30..14: reserved */
2831+#define BMU_TX_IPIDINCR_ON BIT_13 /* Enable IP ID Increment */
2832+#define BMU_TX_IPIDINCR_OFF BIT_12 /* Disable IP ID Increment */
2833+#define BMU_TX_CLR_IRQ_TCP BIT_11 /* Clear IRQ on TCP segm. length mism. */
2834+ /* Bit 10..0: same as for Rx */
2835+
2836 /* Q_F 32 bit Flag Register */
2837 /* Bit 31..28: reserved */
2838 #define F_ALM_FULL BIT_27 /* Rx FIFO: almost full */
2839 #define F_EMPTY BIT_27 /* Tx FIFO: empty flag */
2840 #define F_FIFO_EOF BIT_26 /* Tag (EOF Flag) bit in FIFO */
2841 #define F_WM_REACHED BIT_25 /* Watermark reached */
2842- /* reserved */
2843+#define F_M_RX_RAM_DIS BIT_24 /* MAC Rx RAM Read Port disable */
2844 #define F_FIFO_LEVEL (0x1fL<<16) /* Bit 23..16: # of Qwords in FIFO */
2845 /* Bit 15..11: reserved */
2846 #define F_WATER_MARK 0x0007ffL /* Bit 10.. 0: Watermark */
2847@@ -1260,6 +1818,13 @@
2848 /* Bit 3: reserved */
2849 #define T3_VRAM_MSK 7 /* Bit 2.. 0: Virtual RAM Buffer Address */
2850
2851+/* Queue Prefetch Unit Offsets, use Y2_PREF_Q_ADDR() to address (Yukon-2 only)*/
2852+/* PREF_UNIT_CTRL_REG 32 bit Prefetch Control register */
2853+#define PREF_UNIT_OP_ON BIT_3 /* prefetch unit operational */
2854+#define PREF_UNIT_OP_OFF BIT_2 /* prefetch unit not operational */
2855+#define PREF_UNIT_RST_CLR BIT_1 /* Clear Prefetch Unit Reset */
2856+#define PREF_UNIT_RST_SET BIT_0 /* Set Prefetch Unit Reset */
2857+
2858 /* RAM Buffer Register Offsets, use RB_ADDR(Queue, Offs) to access */
2859 /* RB_START 32 bit RAM Buffer Start Address */
2860 /* RB_END 32 bit RAM Buffer End Address */
2861@@ -1275,24 +1840,24 @@
2862 #define RB_MSK 0x0007ffff /* Bit 18.. 0: RAM Buffer Pointer Bits */
2863
2864 /* RB_TST2 8 bit RAM Buffer Test Register 2 */
2865- /* Bit 7.. 4: reserved */
2866-#define RB_PC_DEC BIT_3S /* Packet Counter Decrem */
2867+ /* Bit 7.. 4: reserved */
2868+#define RB_PC_DEC BIT_3S /* Packet Counter Decrement */
2869 #define RB_PC_T_ON BIT_2S /* Packet Counter Test On */
2870-#define RB_PC_T_OFF BIT_1S /* Packet Counter Tst Off */
2871-#define RB_PC_INC BIT_0S /* Packet Counter Increm */
2872+#define RB_PC_T_OFF BIT_1S /* Packet Counter Test Off */
2873+#define RB_PC_INC BIT_0S /* Packet Counter Increment */
2874
2875 /* RB_TST1 8 bit RAM Buffer Test Register 1 */
2876 /* Bit 7: reserved */
2877 #define RB_WP_T_ON BIT_6S /* Write Pointer Test On */
2878 #define RB_WP_T_OFF BIT_5S /* Write Pointer Test Off */
2879-#define RB_WP_INC BIT_4S /* Write Pointer Increm */
2880+#define RB_WP_INC BIT_4S /* Write Pointer Increment */
2881 /* Bit 3: reserved */
2882 #define RB_RP_T_ON BIT_2S /* Read Pointer Test On */
2883 #define RB_RP_T_OFF BIT_1S /* Read Pointer Test Off */
2884-#define RB_RP_DEC BIT_0S /* Read Pointer Decrement */
2885+#define RB_RP_INC BIT_0S /* Read Pointer Increment */
2886
2887 /* RB_CTRL 8 bit RAM Buffer Control Register */
2888- /* Bit 7.. 6: reserved */
2889+ /* Bit 7.. 6: reserved */
2890 #define RB_ENA_STFWD BIT_5S /* Enable Store & Forward */
2891 #define RB_DIS_STFWD BIT_4S /* Disable Store & Forward */
2892 #define RB_ENA_OP_MD BIT_3S /* Enable Operation Mode */
2893@@ -1300,16 +1865,31 @@
2894 #define RB_RST_CLR BIT_1S /* Clear RAM Buf STM Reset */
2895 #define RB_RST_SET BIT_0S /* Set RAM Buf STM Reset */
2896
2897+/* Yukon-2 */
2898+ /* Bit 31..20: reserved */
2899+#define RB_CNT_DOWN BIT_19 /* Packet Counter Decrement */
2900+#define RB_CNT_TST_ON BIT_18 /* Packet Counter Test On */
2901+#define RB_CNT_TST_OFF BIT_17 /* Packet Counter Test Off */
2902+#define RB_CNT_UP BIT_16 /* Packet Counter Increment */
2903+ /* Bit 15: reserved */
2904+#define RB_WP_TST_ON BIT_14 /* Write Pointer Test On */
2905+#define RB_WP_TST_OFF BIT_13 /* Write Pointer Test Off */
2906+#define RB_WP_UP BIT_12 /* Write Pointer Increment */
2907+ /* Bit 11: reserved */
2908+#define RB_RP_TST_ON BIT_10 /* Read Pointer Test On */
2909+#define RB_RP_TST_OFF BIT_9 /* Read Pointer Test Off */
2910+#define RB_RP_UP BIT_8 /* Read Pointer Increment */
2911+
2912
2913 /* Receive and Transmit MAC FIFO Registers (GENESIS only) */
2914
2915 /* RX_MFF_EA 32 bit Receive MAC FIFO End Address */
2916-/* RX_MFF_WP 32 bit Receive MAC FIFO Write Pointer */
2917+/* RX_MFF_WP 32 bit Receive MAC FIFO Write Pointer */
2918 /* RX_MFF_RP 32 bit Receive MAC FIFO Read Pointer */
2919 /* RX_MFF_PC 32 bit Receive MAC FIFO Packet Counter */
2920 /* RX_MFF_LEV 32 bit Receive MAC FIFO Level */
2921 /* TX_MFF_EA 32 bit Transmit MAC FIFO End Address */
2922-/* TX_MFF_WP 32 bit Transmit MAC FIFO Write Pointer */
2923+/* TX_MFF_WP 32 bit Transmit MAC FIFO Write Pointer */
2924 /* TX_MFF_WSP 32 bit Transmit MAC FIFO WR Shadow Pointer */
2925 /* TX_MFF_RP 32 bit Transmit MAC FIFO Read Pointer */
2926 /* TX_MFF_PC 32 bit Transmit MAC FIFO Packet Cnt */
2927@@ -1359,9 +1939,9 @@
2928 /* RX_MFF_TST2 8 bit Receive MAC FIFO Test Register 2 */
2929 /* TX_MFF_TST2 8 bit Transmit MAC FIFO Test Register 2 */
2930 /* Bit 7: reserved */
2931-#define MFF_WSP_T_ON BIT_6S /* Tx: Write Shadow Ptr TestOn */
2932-#define MFF_WSP_T_OFF BIT_5S /* Tx: Write Shadow Ptr TstOff */
2933-#define MFF_WSP_INC BIT_4S /* Tx: Write Shadow Ptr Increment */
2934+#define MFF_WSP_T_ON BIT_6S /* Tx: Write Shadow Pointer Test On */
2935+#define MFF_WSP_T_OFF BIT_5S /* Tx: Write Shadow Pointer Test Off */
2936+#define MFF_WSP_INC BIT_4S /* Tx: Write Shadow Pointer Increment */
2937 #define MFF_PC_DEC BIT_3S /* Packet Counter Decrement */
2938 #define MFF_PC_T_ON BIT_2S /* Packet Counter Test On */
2939 #define MFF_PC_T_OFF BIT_1S /* Packet Counter Test Off */
2940@@ -1372,7 +1952,7 @@
2941 /* Bit 7: reserved */
2942 #define MFF_WP_T_ON BIT_6S /* Write Pointer Test On */
2943 #define MFF_WP_T_OFF BIT_5S /* Write Pointer Test Off */
2944-#define MFF_WP_INC BIT_4S /* Write Pointer Increm */
2945+#define MFF_WP_INC BIT_4S /* Write Pointer Increment */
2946 /* Bit 3: reserved */
2947 #define MFF_RP_T_ON BIT_2S /* Read Pointer Test On */
2948 #define MFF_RP_T_OFF BIT_1S /* Read Pointer Test Off */
2949@@ -1391,12 +1971,16 @@
2950
2951 /* RX_LED_CTRL 8 bit Receive LED Cnt Control Reg */
2952 /* TX_LED_CTRL 8 bit Transmit LED Cnt Control Reg */
2953+ /* Bit 7.. 3: reserved */
2954+#define LED_START BIT_2S /* Start Counter */
2955+#define LED_STOP BIT_1S /* Stop Counter */
2956+#define LED_STATE BIT_0S /* Rx/Tx: LED State, 1=LED On */
2957+
2958 /* LNK_SYNC_CTRL 8 bit Link Sync Cnt Control Register */
2959 /* Bit 7.. 3: reserved */
2960-#define LED_START BIT_2S /* Start Timer */
2961-#define LED_STOP BIT_1S /* Stop Timer */
2962-#define LED_STATE BIT_0S /* Rx/Tx: LED State, 1=LED on */
2963-#define LED_CLR_IRQ BIT_0S /* Lnk: Clear Link IRQ */
2964+#define LNK_START BIT_2S /* Start Counter */
2965+#define LNK_STOP BIT_1S /* Stop Counter */
2966+#define LNK_CLR_IRQ BIT_0S /* Clear Link IRQ */
2967
2968 /* RX_LED_TST 8 bit Receive LED Cnt Test Register */
2969 /* TX_LED_TST 8 bit Transmit LED Cnt Test Register */
2970@@ -1407,86 +1991,142 @@
2971 #define LED_T_STEP BIT_0S /* LED Counter Step */
2972
2973 /* LNK_LED_REG 8 bit Link LED Register */
2974- /* Bit 7.. 6: reserved */
2975+ /* Bit 7.. 6: reserved */
2976 #define LED_BLK_ON BIT_5S /* Link LED Blinking On */
2977 #define LED_BLK_OFF BIT_4S /* Link LED Blinking Off */
2978 #define LED_SYNC_ON BIT_3S /* Use Sync Wire to switch LED */
2979 #define LED_SYNC_OFF BIT_2S /* Disable Sync Wire Input */
2980-#define LED_ON BIT_1S /* switch LED on */
2981-#define LED_OFF BIT_0S /* switch LED off */
2982+#define LED_ON BIT_1S /* Switch LED On */
2983+#define LED_OFF BIT_0S /* Switch LED Off */
2984
2985 /* Receive and Transmit GMAC FIFO Registers (YUKON only) */
2986
2987 /* RX_GMF_EA 32 bit Rx GMAC FIFO End Address */
2988 /* RX_GMF_AF_THR 32 bit Rx GMAC FIFO Almost Full Thresh. */
2989-/* RX_GMF_WP 32 bit Rx GMAC FIFO Write Pointer */
2990-/* RX_GMF_WLEV 32 bit Rx GMAC FIFO Write Level */
2991-/* RX_GMF_RP 32 bit Rx GMAC FIFO Read Pointer */
2992-/* RX_GMF_RLEV 32 bit Rx GMAC FIFO Read Level */
2993+/* RX_GMF_WP 32 bit Rx GMAC FIFO Write Pointer */
2994+/* RX_GMF_WLEV 32 bit Rx GMAC FIFO Write Level */
2995+/* RX_GMF_RP 32 bit Rx GMAC FIFO Read Pointer */
2996+/* RX_GMF_RLEV 32 bit Rx GMAC FIFO Read Level */
2997 /* TX_GMF_EA 32 bit Tx GMAC FIFO End Address */
2998 /* TX_GMF_AE_THR 32 bit Tx GMAC FIFO Almost Empty Thresh.*/
2999-/* TX_GMF_WP 32 bit Tx GMAC FIFO Write Pointer */
3000-/* TX_GMF_WSP 32 bit Tx GMAC FIFO Write Shadow Ptr. */
3001-/* TX_GMF_WLEV 32 bit Tx GMAC FIFO Write Level */
3002-/* TX_GMF_RP 32 bit Tx GMAC FIFO Read Pointer */
3003-/* TX_GMF_RSTP 32 bit Tx GMAC FIFO Restart Pointer */
3004-/* TX_GMF_RLEV 32 bit Tx GMAC FIFO Read Level */
3005+/* TX_GMF_WP 32 bit Tx GMAC FIFO Write Pointer */
3006+/* TX_GMF_WSP 32 bit Tx GMAC FIFO Write Shadow Pointer */
3007+/* TX_GMF_WLEV 32 bit Tx GMAC FIFO Write Level */
3008+/* TX_GMF_RP 32 bit Tx GMAC FIFO Read Pointer */
3009+/* TX_GMF_RSTP 32 bit Tx GMAC FIFO Restart Pointer */
3010+/* TX_GMF_RLEV 32 bit Tx GMAC FIFO Read Level */
3011
3012 /* RX_GMF_CTRL_T 32 bit Rx GMAC FIFO Control/Test */
3013- /* Bits 31..15: reserved */
3014-#define GMF_WP_TST_ON BIT_14 /* Write Pointer Test On */
3015-#define GMF_WP_TST_OFF BIT_13 /* Write Pointer Test Off */
3016-#define GMF_WP_STEP BIT_12 /* Write Pointer Step/Increment */
3017+ /* Bit 31..28 reserved */
3018+#define RX_TRUNC_ON BIT_27 /* Enable Packet Truncation */
3019+#define RX_TRUNC_OFF BIT_26 /* Disable Packet Truncation */
3020+#define RX_VLAN_STRIP_ON BIT_25 /* Enable VLAN Stripping */
3021+#define RX_VLAN_STRIP_OFF BIT_24 /* Disable VLAN Stripping */
3022+ /* Bit 23..15 reserved */
3023+#define GMF_WP_TST_ON BIT_14 /* Write Pointer Test On */
3024+#define GMF_WP_TST_OFF BIT_13 /* Write Pointer Test Off */
3025+#define GMF_WP_STEP BIT_12 /* Write Pointer Step/Increment */
3026 /* Bit 11: reserved */
3027-#define GMF_RP_TST_ON BIT_10 /* Read Pointer Test On */
3028-#define GMF_RP_TST_OFF BIT_9 /* Read Pointer Test Off */
3029-#define GMF_RP_STEP BIT_8 /* Read Pointer Step/Increment */
3030-#define GMF_RX_F_FL_ON BIT_7 /* Rx FIFO Flush Mode On */
3031-#define GMF_RX_F_FL_OFF BIT_6 /* Rx FIFO Flush Mode Off */
3032-#define GMF_CLI_RX_FO BIT_5 /* Clear IRQ Rx FIFO Overrun */
3033-#define GMF_CLI_RX_FC BIT_4 /* Clear IRQ Rx Frame Complete */
3034-#define GMF_OPER_ON BIT_3 /* Operational Mode On */
3035-#define GMF_OPER_OFF BIT_2 /* Operational Mode Off */
3036-#define GMF_RST_CLR BIT_1 /* Clear GMAC FIFO Reset */
3037-#define GMF_RST_SET BIT_0 /* Set GMAC FIFO Reset */
3038-
3039-/* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test */
3040- /* Bits 31..19: reserved */
3041-#define GMF_WSP_TST_ON BIT_18 /* Write Shadow Pointer Test On */
3042-#define GMF_WSP_TST_OFF BIT_17 /* Write Shadow Pointer Test Off */
3043-#define GMF_WSP_STEP BIT_16 /* Write Shadow Pointer Step/Increment */
3044- /* Bits 15..7: same as for RX_GMF_CTRL_T */
3045-#define GMF_CLI_TX_FU BIT_6 /* Clear IRQ Tx FIFO Underrun */
3046-#define GMF_CLI_TX_FC BIT_5 /* Clear IRQ Tx Frame Complete */
3047-#define GMF_CLI_TX_PE BIT_4 /* Clear IRQ Tx Parity Error */
3048+#define GMF_RP_TST_ON BIT_10 /* Read Pointer Test On */
3049+#define GMF_RP_TST_OFF BIT_9 /* Read Pointer Test Off */
3050+#define GMF_RP_STEP BIT_8 /* Read Pointer Step/Increment */
3051+#define GMF_RX_F_FL_ON BIT_7 /* Rx FIFO Flush Mode On */
3052+#define GMF_RX_F_FL_OFF BIT_6 /* Rx FIFO Flush Mode Off */
3053+#define GMF_CLI_RX_FO BIT_5 /* Clear IRQ Rx FIFO Overrun */
3054+#define GMF_CLI_RX_FC BIT_4 /* Clear IRQ Rx Frame Complete */
3055+#define GMF_OPER_ON BIT_3 /* Operational Mode On */
3056+#define GMF_OPER_OFF BIT_2 /* Operational Mode Off */
3057+#define GMF_RST_CLR BIT_1 /* Clear GMAC FIFO Reset */
3058+#define GMF_RST_SET BIT_0 /* Set GMAC FIFO Reset */
3059+
3060+/* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test (YUKON and Yukon-2) */
3061+#define TX_STFW_DIS BIT_31 /* Disable Store & Forward (Yukon-EC Ultra) */
3062+#define TX_STFW_ENA BIT_30 /* Enable Store & Forward (Yukon-EC Ultra) */
3063+ /* Bits 29..26: reserved */
3064+#define TX_VLAN_TAG_ON BIT_25 /* Enable VLAN tagging */
3065+#define TX_VLAN_TAG_OFF BIT_24 /* Disable VLAN tagging */
3066+#define TX_PCI_JUM_ENA BIT_23 /* Enable PCI Jumbo Mode (Yukon-EC Ultra) */
3067+#define TX_PCI_JUM_DIS BIT_22 /* Disable PCI Jumbo Mode (Yukon-EC Ultra) */
3068+ /* Bits 21..19: reserved */
3069+#define GMF_WSP_TST_ON BIT_18 /* Write Shadow Pointer Test On */
3070+#define GMF_WSP_TST_OFF BIT_17 /* Write Shadow Pointer Test Off */
3071+#define GMF_WSP_STEP BIT_16 /* Write Shadow Pointer Step/Increment */
3072+ /* Bits 15..8: same as for RX_GMF_CTRL_T */
3073+ /* Bit 7: reserved */
3074+#define GMF_CLI_TX_FU BIT_6 /* Clear IRQ Tx FIFO Underrun */
3075+#define GMF_CLI_TX_FC BIT_5 /* Clear IRQ Tx Frame Complete */
3076+#define GMF_CLI_TX_PE BIT_4 /* Clear IRQ Tx Parity Error */
3077 /* Bits 3..0: same as for RX_GMF_CTRL_T */
3078
3079 #define GMF_RX_CTRL_DEF (GMF_OPER_ON | GMF_RX_F_FL_ON)
3080 #define GMF_TX_CTRL_DEF GMF_OPER_ON
3081
3082+#define RX_GMF_AF_THR_MIN 0x0c /* Rx GMAC FIFO Almost Full Thresh. min. */
3083 #define RX_GMF_FL_THR_DEF 0x0a /* Rx GMAC FIFO Flush Threshold default */
3084
3085 /* GMAC_TI_ST_CTRL 8 bit Time Stamp Timer Ctrl Reg (YUKON only) */
3086- /* Bit 7.. 3: reserved */
3087-#define GMT_ST_START BIT_2S /* Start Time Stamp Timer */
3088-#define GMT_ST_STOP BIT_1S /* Stop Time Stamp Timer */
3089-#define GMT_ST_CLR_IRQ BIT_0S /* Clear Time Stamp Timer IRQ */
3090-
3091+ /* Bit 7.. 3: reserved */
3092+#define GMT_ST_START BIT_2S /* Start Time Stamp Timer */
3093+#define GMT_ST_STOP BIT_1S /* Stop Time Stamp Timer */
3094+#define GMT_ST_CLR_IRQ BIT_0S /* Clear Time Stamp Timer IRQ */
3095+
3096+/* POLL_CTRL 32 bit Polling Unit control register (Yukon-2 only) */
3097+ /* Bit 31.. 6: reserved */
3098+#define PC_CLR_IRQ_CHK BIT_5 /* Clear IRQ Check */
3099+#define PC_POLL_RQ BIT_4 /* Poll Request Start */
3100+#define PC_POLL_OP_ON BIT_3 /* Operational Mode On */
3101+#define PC_POLL_OP_OFF BIT_2 /* Operational Mode Off */
3102+#define PC_POLL_RST_CLR BIT_1 /* Clear Polling Unit Reset (Enable) */
3103+#define PC_POLL_RST_SET BIT_0 /* Set Polling Unit Reset */
3104+
3105+
3106+/* The bit definition of the following registers is still missing! */
3107+/* B28_Y2_SMB_CONFIG 32 bit ASF SMBus Config Register */
3108+/* B28_Y2_SMB_CSD_REG 32 bit ASF SMB Control/Status/Data */
3109+/* B28_Y2_ASF_IRQ_V_BASE 32 bit ASF IRQ Vector Base */
3110+
3111+/* B28_Y2_ASF_STAT_CMD 32 bit ASF Status and Command Reg */
3112+/* This register is used by the host driver software */
3113+ /* Bit 31.. 5 reserved */
3114+#define Y2_ASF_OS_PRES BIT_4S /* ASF operation system present */
3115+#define Y2_ASF_RESET BIT_3S /* ASF system in reset state */
3116+#define Y2_ASF_RUNNING BIT_2S /* ASF system operational */
3117+#define Y2_ASF_CLR_HSTI BIT_1S /* Clear ASF IRQ */
3118+#define Y2_ASF_IRQ BIT_0S /* Issue an IRQ to ASF system */
3119+
3120+#define Y2_ASF_UC_STATE (3<<2) /* ASF uC State */
3121+#define Y2_ASF_CLK_HALT 0 /* ASF system clock stopped */
3122+
3123+/* B28_Y2_ASF_HOST_COM 32 bit ASF Host Communication Reg */
3124+/* This register is used by the ASF firmware */
3125+ /* Bit 31.. 2 reserved */
3126+#define Y2_ASF_CLR_ASFI BIT_1 /* Clear host IRQ */
3127+#define Y2_ASF_HOST_IRQ BIT_0 /* Issue an IRQ to HOST system */
3128+
3129+
3130+/* STAT_CTRL 32 bit Status BMU control register (Yukon-2 only) */
3131+ /* Bit 7.. 5: reserved */
3132+#define SC_STAT_CLR_IRQ BIT_4 /* Status Burst IRQ clear */
3133+#define SC_STAT_OP_ON BIT_3 /* Operational Mode On */
3134+#define SC_STAT_OP_OFF BIT_2 /* Operational Mode Off */
3135+#define SC_STAT_RST_CLR BIT_1 /* Clear Status Unit Reset (Enable) */
3136+#define SC_STAT_RST_SET BIT_0 /* Set Status Unit Reset */
3137+
3138 /* GMAC_CTRL 32 bit GMAC Control Reg (YUKON only) */
3139 /* Bits 31.. 8: reserved */
3140-#define GMC_H_BURST_ON BIT_7 /* Half Duplex Burst Mode On */
3141-#define GMC_H_BURST_OFF BIT_6 /* Half Duplex Burst Mode Off */
3142-#define GMC_F_LOOPB_ON BIT_5 /* FIFO Loopback On */
3143-#define GMC_F_LOOPB_OFF BIT_4 /* FIFO Loopback Off */
3144-#define GMC_PAUSE_ON BIT_3 /* Pause On */
3145-#define GMC_PAUSE_OFF BIT_2 /* Pause Off */
3146-#define GMC_RST_CLR BIT_1 /* Clear GMAC Reset */
3147-#define GMC_RST_SET BIT_0 /* Set GMAC Reset */
3148+#define GMC_H_BURST_ON BIT_7 /* Half Duplex Burst Mode On */
3149+#define GMC_H_BURST_OFF BIT_6 /* Half Duplex Burst Mode Off */
3150+#define GMC_F_LOOPB_ON BIT_5 /* FIFO Loopback On */
3151+#define GMC_F_LOOPB_OFF BIT_4 /* FIFO Loopback Off */
3152+#define GMC_PAUSE_ON BIT_3 /* Pause On */
3153+#define GMC_PAUSE_OFF BIT_2 /* Pause Off */
3154+#define GMC_RST_CLR BIT_1 /* Clear GMAC Reset */
3155+#define GMC_RST_SET BIT_0 /* Set GMAC Reset */
3156
3157 /* GPHY_CTRL 32 bit GPHY Control Reg (YUKON only) */
3158 /* Bits 31..29: reserved */
3159 #define GPC_SEL_BDT BIT_28 /* Select Bi-Dir. Transfer for MDC/MDIO */
3160-#define GPC_INT_POL_HI BIT_27 /* IRQ Polarity is Active HIGH */
3161+#define GPC_INT_POL BIT_27 /* IRQ Polarity is Active Low */
3162 #define GPC_75_OHM BIT_26 /* Use 75 Ohm Termination instead of 50 */
3163 #define GPC_DIS_FC BIT_25 /* Disable Automatic Fiber/Copper Detection */
3164 #define GPC_DIS_SLEEP BIT_24 /* Disable Energy Detect */
3165@@ -1510,6 +2150,13 @@
3166 #define GPC_RST_CLR BIT_1 /* Clear GPHY Reset */
3167 #define GPC_RST_SET BIT_0 /* Set GPHY Reset */
3168
3169+/* Yukon-EC Ultra only */
3170+#define GPC_PD_125M_CLK_OFF BIT_5 /* Disable Power Down Clock 125 MHz */
3171+#define GPC_PD_125M_CLK_ON BIT_4 /* Enable Power Down Clock 125 MHz */
3172+#define GPC_DPLL_RST_SET BIT_3 /* Set GPHY's DPLL Reset */
3173+#define GPC_DPLL_RST_CLR BIT_2 /* Clear GPHY's DPLL Reset */
3174+ /* (DPLL = Digital Phase Lock Loop) */
3175+
3176 #define GPC_HWCFG_GMII_COP (GPC_HWCFG_M_3 | GPC_HWCFG_M_2 | \
3177 GPC_HWCFG_M_1 | GPC_HWCFG_M_0)
3178
3179@@ -1540,14 +2187,14 @@
3180
3181 /* GMAC_IRQ_SRC 8 bit GMAC Interrupt Source Reg (YUKON only) */
3182 /* GMAC_IRQ_MSK 8 bit GMAC Interrupt Mask Reg (YUKON only) */
3183-#define GM_IS_TX_CO_OV BIT_5 /* Transmit Counter Overflow IRQ */
3184-#define GM_IS_RX_CO_OV BIT_4 /* Receive Counter Overflow IRQ */
3185-#define GM_IS_TX_FF_UR BIT_3 /* Transmit FIFO Underrun */
3186-#define GM_IS_TX_COMPL BIT_2 /* Frame Transmission Complete */
3187-#define GM_IS_RX_FF_OR BIT_1 /* Receive FIFO Overrun */
3188-#define GM_IS_RX_COMPL BIT_0 /* Frame Reception Complete */
3189+#define GM_IS_RX_CO_OV BIT_5S /* Receive Counter Overflow IRQ */
3190+#define GM_IS_TX_CO_OV BIT_4S /* Transmit Counter Overflow IRQ */
3191+#define GM_IS_TX_FF_UR BIT_3S /* Transmit FIFO Underrun */
3192+#define GM_IS_TX_COMPL BIT_2S /* Frame Transmission Complete */
3193+#define GM_IS_RX_FF_OR BIT_1S /* Receive FIFO Overrun */
3194+#define GM_IS_RX_COMPL BIT_0S /* Frame Reception Complete */
3195
3196-#define GMAC_DEF_MSK (GM_IS_TX_CO_OV | GM_IS_RX_CO_OV | \
3197+#define GMAC_DEF_MSK (GM_IS_RX_CO_OV | GM_IS_TX_CO_OV | \
3198 GM_IS_TX_FF_UR)
3199
3200 /* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */
3201@@ -1579,15 +2226,19 @@
3202
3203 #define WOL_CTL_DEFAULT \
3204 (WOL_CTL_DIS_PME_ON_LINK_CHG | \
3205- WOL_CTL_DIS_PME_ON_PATTERN | \
3206- WOL_CTL_DIS_PME_ON_MAGIC_PKT | \
3207- WOL_CTL_DIS_LINK_CHG_UNIT | \
3208- WOL_CTL_DIS_PATTERN_UNIT | \
3209- WOL_CTL_DIS_MAGIC_PKT_UNIT)
3210+ WOL_CTL_DIS_PME_ON_PATTERN | \
3211+ WOL_CTL_DIS_PME_ON_MAGIC_PKT | \
3212+ WOL_CTL_DIS_LINK_CHG_UNIT | \
3213+ WOL_CTL_DIS_PATTERN_UNIT | \
3214+ WOL_CTL_DIS_MAGIC_PKT_UNIT)
3215
3216 /* WOL_MATCH_CTL 8 bit WOL Match Control Reg */
3217 #define WOL_CTL_PATT_ENA(x) (BIT_0 << (x))
3218
3219+/* WOL_PATT_PME 8 bit WOL PME Match Enable (Yukon-2) */
3220+#define WOL_PATT_FORCE_PME BIT_7 /* Generates a PME */
3221+#define WOL_PATT_MATCH_PME_ALL 0x7f
3222+
3223 #define SK_NUM_WOL_PATTERN 7
3224 #define SK_PATTERN_PER_WORD 4
3225 #define SK_BITMASK_PATTERN 7
3226@@ -1597,26 +2248,28 @@
3227 #define WOL_LENGTH_SHIFT 8
3228
3229
3230+/* typedefs ******************************************************************/
3231+
3232 /* Receive and Transmit Descriptors ******************************************/
3233
3234 /* Transmit Descriptor struct */
3235 typedef struct s_HwTxd {
3236 SK_U32 volatile TxCtrl; /* Transmit Buffer Control Field */
3237 SK_U32 TxNext; /* Physical Address Pointer to the next TxD */
3238- SK_U32 TxAdrLo; /* Physical Tx Buffer Address lower dword */
3239- SK_U32 TxAdrHi; /* Physical Tx Buffer Address upper dword */
3240+ SK_U32 TxAdrLo; /* Physical Tx Buffer Address lower DWord */
3241+ SK_U32 TxAdrHi; /* Physical Tx Buffer Address upper DWord */
3242 SK_U32 TxStat; /* Transmit Frame Status Word */
3243-#ifndef SK_USE_REV_DESC
3244+#ifndef SK_USE_REV_DESC
3245 SK_U16 TxTcpOffs; /* TCP Checksum Calculation Start Value */
3246 SK_U16 TxRes1; /* 16 bit reserved field */
3247 SK_U16 TxTcpWp; /* TCP Checksum Write Position */
3248 SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */
3249-#else /* SK_USE_REV_DESC */
3250+#else /* SK_USE_REV_DESC */
3251 SK_U16 TxRes1; /* 16 bit reserved field */
3252 SK_U16 TxTcpOffs; /* TCP Checksum Calculation Start Value */
3253 SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */
3254 SK_U16 TxTcpWp; /* TCP Checksum Write Position */
3255-#endif /* SK_USE_REV_DESC */
3256+#endif /* SK_USE_REV_DESC */
3257 SK_U32 TxRes2; /* 32 bit reserved field */
3258 } SK_HWTXD;
3259
3260@@ -1624,33 +2277,266 @@
3261 typedef struct s_HwRxd {
3262 SK_U32 volatile RxCtrl; /* Receive Buffer Control Field */
3263 SK_U32 RxNext; /* Physical Address Pointer to the next RxD */
3264- SK_U32 RxAdrLo; /* Physical Rx Buffer Address lower dword */
3265- SK_U32 RxAdrHi; /* Physical Rx Buffer Address upper dword */
3266+ SK_U32 RxAdrLo; /* Physical Rx Buffer Address lower DWord */
3267+ SK_U32 RxAdrHi; /* Physical Rx Buffer Address upper DWord */
3268 SK_U32 RxStat; /* Receive Frame Status Word */
3269 SK_U32 RxTiSt; /* Receive Time Stamp (from XMAC on GENESIS) */
3270-#ifndef SK_USE_REV_DESC
3271- SK_U16 RxTcpSum1; /* TCP Checksum 1 */
3272- SK_U16 RxTcpSum2; /* TCP Checksum 2 */
3273+#ifndef SK_USE_REV_DESC
3274+ SK_U16 RxTcpSum1; /* Rx TCP Checksum 1 */
3275+ SK_U16 RxTcpSum2; /* Rx TCP Checksum 2 */
3276 SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */
3277 SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */
3278-#else /* SK_USE_REV_DESC */
3279- SK_U16 RxTcpSum2; /* TCP Checksum 2 */
3280- SK_U16 RxTcpSum1; /* TCP Checksum 1 */
3281+#else /* SK_USE_REV_DESC */
3282+ SK_U16 RxTcpSum2; /* Rx TCP Checksum 2 */
3283+ SK_U16 RxTcpSum1; /* Rx TCP Checksum 1 */
3284 SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */
3285 SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */
3286-#endif /* SK_USE_REV_DESC */
3287+#endif /* SK_USE_REV_DESC */
3288 } SK_HWRXD;
3289
3290 /*
3291 * Drivers which use the reverse descriptor feature (PCI_OUR_REG_2)
3292 * should set the define SK_USE_REV_DESC.
3293- * Structures are 'normaly' not endianess dependent. But in
3294- * this case the SK_U16 fields are bound to bit positions inside the
3295- * descriptor. RxTcpSum1 e.g. must start at bit 0 within the 6.th DWord.
3296+ * Structures are 'normally' not endianess dependent. But in this case
3297+ * the SK_U16 fields are bound to bit positions inside the descriptor.
3298+ * RxTcpSum1 e.g. must start at bit 0 within the 7.th DWord.
3299 * The bit positions inside a DWord are of course endianess dependent and
3300- * swaps if the DWord is swapped by the hardware.
3301+ * swap if the DWord is swapped by the hardware.
3302 */
3303
3304+/* YUKON-2 descriptors ******************************************************/
3305+
3306+typedef struct _TxChksum {
3307+#ifndef SK_USE_REV_DESC
3308+ SK_U16 TxTcpWp; /* TCP Checksum Write Position */
3309+ SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */
3310+#else /* SK_USE_REV_DESC */
3311+ SK_U16 TxTcpSp; /* TCP Checksum Calculation Start Position */
3312+ SK_U16 TxTcpWp; /* TCP Checksum Write Position */
3313+#endif /* SK_USE_REV_DESC */
3314+} SK_HWTXCS;
3315+
3316+typedef struct _LargeSend {
3317+#ifndef SK_USE_REV_DESC
3318+ SK_U16 Length; /* Large Send Segment Length */
3319+ SK_U16 Reserved; /* reserved */
3320+#else /* SK_USE_REV_DESC */
3321+ SK_U16 Reserved; /* reserved */
3322+ SK_U16 Length; /* Large Send Segment Length */
3323+#endif /* SK_USE_REV_DESC */
3324+} SK_HWTXLS;
3325+
3326+typedef union u_HwTxBuf {
3327+ SK_U16 BufLen; /* Tx Buffer Length */
3328+ SK_U16 VlanTag; /* VLAN Tag */
3329+ SK_U16 InitCsum; /* Init. Checksum */
3330+} SK_HWTXBUF;
3331+
3332+/* Tx List Element structure */
3333+typedef struct s_HwLeTx {
3334+ union {
3335+ SK_U32 BufAddr; /* Tx LE Buffer Address high/low */
3336+ SK_HWTXCS ChkSum; /* Tx LE TCP Checksum parameters */
3337+ SK_HWTXLS LargeSend;/* Large Send length */
3338+ } TxUn;
3339+#ifndef SK_USE_REV_DESC
3340+ SK_HWTXBUF Send;
3341+ SK_U8 ControlFlags; /* Tx LE Control field or Lock Number */
3342+ SK_U8 Opcode; /* Tx LE Opcode field */
3343+#else /* SK_USE_REV_DESC */
3344+ SK_U8 Opcode; /* Tx LE Opcode field */
3345+ SK_U8 ControlFlags; /* Tx LE Control field or Lock Number */
3346+ SK_HWTXBUF Send;
3347+#endif /* SK_USE_REV_DESC */
3348+} SK_HWLETX;
3349+
3350+typedef struct _RxChkSum{
3351+#ifndef SK_USE_REV_DESC
3352+ SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */
3353+ SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */
3354+#else /* SK_USE_REV_DESC */
3355+ SK_U16 RxTcpSp2; /* TCP Checksum Calculation Start Position 2 */
3356+ SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */
3357+#endif /* SK_USE_REV_DESC */
3358+} SK_HWRXCS;
3359+
3360+/* Rx List Element structure */
3361+typedef struct s_HwLeRx {
3362+ union {
3363+ SK_U32 BufAddr; /* Rx LE Buffer Address high/low */
3364+ SK_HWRXCS ChkSum; /* Rx LE TCP Checksum parameters */
3365+ } RxUn;
3366+#ifndef SK_USE_REV_DESC
3367+ SK_U16 BufferLength; /* Rx LE Buffer Length field */
3368+ SK_U8 ControlFlags; /* Rx LE Control field */
3369+ SK_U8 Opcode; /* Rx LE Opcode field */
3370+#else /* SK_USE_REV_DESC */
3371+ SK_U8 Opcode; /* Rx LE Opcode field */
3372+ SK_U8 ControlFlags; /* Rx LE Control field */
3373+ SK_U16 BufferLength; /* Rx LE Buffer Length field */
3374+#endif /* SK_USE_REV_DESC */
3375+} SK_HWLERX;
3376+
3377+typedef struct s_StRxTCPChkSum {
3378+#ifndef SK_USE_REV_DESC
3379+ SK_U16 RxTCPSum1; /* Rx TCP Checksum 1 */
3380+ SK_U16 RxTCPSum2; /* Rx TCP Checksum 2 */
3381+#else /* SK_USE_REV_DESC */
3382+ SK_U16 RxTCPSum2; /* Rx TCP Checksum 2 */
3383+ SK_U16 RxTCPSum1; /* Rx TCP Checksum 1 */
3384+#endif /* SK_USE_REV_DESC */
3385+} SK_HWSTCS;
3386+
3387+typedef struct s_StRxRssFlags {
3388+#ifndef SK_USE_REV_DESC
3389+ SK_U8 FlagField; /* contains TCP and IP flags */
3390+ SK_U8 reserved; /* reserved */
3391+#else /* SK_USE_REV_DESC */
3392+ SK_U8 reserved; /* reserved */
3393+ SK_U8 FlagField; /* contains TCP and IP flags */
3394+#endif /* SK_USE_REV_DESC */
3395+} SK_HWSTRSS;
3396+
3397+/* bit definition of RSS LE bit 32/33 (SK_HWSTRSS.FlagField) */
3398+ /* bit 7..2 reserved */
3399+#define RSS_TCP_FLAG BIT_1S /* RSS value related to TCP area */
3400+#define RSS_IP_FLAG BIT_0S /* RSS value related to IP area */
3401+/* StRxRssValue is valid if at least RSS_IP_FLAG is set */
3402+/* For protocol errors or other protocols an empty RSS LE is generated */
3403+
3404+typedef union u_HwStBuf {
3405+ SK_U16 BufLen; /* Rx Buffer Length */
3406+ SK_U16 VlanTag; /* VLAN Tag */
3407+ SK_U16 StTxStatHi; /* Tx Queue Status (high) */
3408+ SK_HWSTRSS Rss; /* Flag Field for TCP and IP protocol */
3409+} SK_HWSTBUF;
3410+
3411+/* Status List Element structure */
3412+typedef struct s_HwLeSt {
3413+ union {
3414+ SK_U32 StRxStatWord; /* Rx Status Dword */
3415+ SK_U32 StRxTimeStamp; /* Rx Timestamp */
3416+ SK_HWSTCS StRxTCPCSum; /* Rx TCP Checksum */
3417+ SK_U32 StTxStatLow; /* Tx Queue Status (low) */
3418+ SK_U32 StRxRssValue; /* Rx RSS value */
3419+ } StUn;
3420+#ifndef SK_USE_REV_DESC
3421+ SK_HWSTBUF Stat;
3422+ SK_U8 Link; /* Status LE Link field */
3423+ SK_U8 Opcode; /* Status LE Opcode field */
3424+#else /* SK_USE_REV_DESC */
3425+ SK_U8 Opcode; /* Status LE Opcode field */
3426+ SK_U8 Link; /* Status LE Link field */
3427+ SK_HWSTBUF Stat;
3428+#endif /* SK_USE_REV_DESC */
3429+} SK_HWLEST;
3430+
3431+/* Special Action List Element */
3432+typedef struct s_HwLeSa {
3433+#ifndef SK_USE_REV_DESC
3434+ SK_U16 TxAIdxVld; /* Special Action LE TxA Put Index field */
3435+ SK_U16 TxSIdxVld; /* Special Action LE TxS Put Index field */
3436+ SK_U16 RxIdxVld; /* Special Action LE Rx Put Index field */
3437+ SK_U8 Link; /* Special Action LE Link field */
3438+ SK_U8 Opcode; /* Special Action LE Opcode field */
3439+#else /* SK_USE_REV_DESC */
3440+ SK_U16 TxSIdxVld; /* Special Action LE TxS Put Index field */
3441+ SK_U16 TxAIdxVld; /* Special Action LE TxA Put Index field */
3442+ SK_U8 Opcode; /* Special Action LE Opcode field */
3443+ SK_U8 Link; /* Special Action LE Link field */
3444+ SK_U16 RxIdxVld; /* Special Action LE Rx Put Index field */
3445+#endif /* SK_USE_REV_DESC */
3446+} SK_HWLESA;
3447+
3448+/* Common List Element union */
3449+typedef union u_HwLeTxRxSt {
3450+ /* Transmit List Element Structure */
3451+ SK_HWLETX Tx;
3452+ /* Receive List Element Structure */
3453+ SK_HWLERX Rx;
3454+ /* Status List Element Structure */
3455+ SK_HWLEST St;
3456+ /* Special Action List Element Structure */
3457+ SK_HWLESA Sa;
3458+ /* Full List Element */
3459+ SK_U64 Full;
3460+} SK_HWLE;
3461+
3462+/* mask and shift value to get Tx async queue status for port 1 */
3463+#define STLE_TXA1_MSKL 0x00000fff
3464+#define STLE_TXA1_SHIFTL 0
3465+
3466+/* mask and shift value to get Tx sync queue status for port 1 */
3467+#define STLE_TXS1_MSKL 0x00fff000
3468+#define STLE_TXS1_SHIFTL 12
3469+
3470+/* mask and shift value to get Tx async queue status for port 2 */
3471+#define STLE_TXA2_MSKL 0xff000000
3472+#define STLE_TXA2_SHIFTL 24
3473+#define STLE_TXA2_MSKH 0x000f
3474+/* this one shifts up */
3475+#define STLE_TXA2_SHIFTH 8
3476+
3477+/* mask and shift value to get Tx sync queue status for port 2 */
3478+#define STLE_TXS2_MSKL 0x00000000
3479+#define STLE_TXS2_SHIFTL 0
3480+#define STLE_TXS2_MSKH 0xfff0
3481+#define STLE_TXS2_SHIFTH 4
3482+
3483+/* YUKON-2 bit values */
3484+#define HW_OWNER BIT_7
3485+#define SW_OWNER 0
3486+
3487+#define PU_PUTIDX_VALID BIT_12
3488+
3489+/* YUKON-2 Control flags */
3490+#define UDPTCP BIT_0S
3491+#define CALSUM BIT_1S
3492+#define WR_SUM BIT_2S
3493+#define INIT_SUM BIT_3S
3494+#define LOCK_SUM BIT_4S
3495+#define INS_VLAN BIT_5S
3496+#define FRC_STAT BIT_6S
3497+#define EOP BIT_7S
3498+
3499+#define TX_LOCK BIT_8S
3500+#define BUF_SEND BIT_9S
3501+#define PACKET_SEND BIT_10S
3502+
3503+#define NO_WARNING BIT_14S
3504+#define NO_UPDATE BIT_15S
3505+
3506+/* YUKON-2 Rx/Tx opcodes defines */
3507+#define OP_TCPWRITE 0x11
3508+#define OP_TCPSTART 0x12
3509+#define OP_TCPINIT 0x14
3510+#define OP_TCPLCK 0x18
3511+#define OP_TCPCHKSUM OP_TCPSTART
3512+#define OP_TCPIS (OP_TCPINIT | OP_TCPSTART)
3513+#define OP_TCPLW (OP_TCPLCK | OP_TCPWRITE)
3514+#define OP_TCPLSW (OP_TCPLCK | OP_TCPSTART | OP_TCPWRITE)
3515+#define OP_TCPLISW (OP_TCPLCK | OP_TCPINIT | OP_TCPSTART | OP_TCPWRITE)
3516+#define OP_ADDR64 0x21
3517+#define OP_VLAN 0x22
3518+#define OP_ADDR64VLAN (OP_ADDR64 | OP_VLAN)
3519+#define OP_LRGLEN 0x24
3520+#define OP_LRGLENVLAN (OP_LRGLEN | OP_VLAN)
3521+#define OP_BUFFER 0x40
3522+#define OP_PACKET 0x41
3523+#define OP_LARGESEND 0x43
3524+
3525+/* YUKON-2 STATUS opcodes defines */
3526+#define OP_RXSTAT 0x60
3527+#define OP_RXTIMESTAMP 0x61
3528+#define OP_RXVLAN 0x62
3529+#define OP_RXCHKS 0x64
3530+#define OP_RXCHKSVLAN (OP_RXCHKS | OP_RXVLAN)
3531+#define OP_RXTIMEVLAN (OP_RXTIMESTAMP | OP_RXVLAN)
3532+#define OP_RSS_HASH 0x65
3533+#define OP_TXINDEXLE 0x68
3534+
3535+/* YUKON-2 SPECIAL opcodes defines */
3536+#define OP_PUTIDX 0x70
3537
3538 /* Descriptor Bit Definition */
3539 /* TxCtrl Transmit Buffer Control Field */
3540@@ -1685,6 +2571,10 @@
3541
3542 /* macros ********************************************************************/
3543
3544+/* Macro for accessing the key registers */
3545+#define RSS_KEY_ADDR(Port, KeyIndex) \
3546+ ((B4_RSS_KEY | ( ((Port) == 0) ? 0 : 0x80)) + (KeyIndex))
3547+
3548 /* Receive and Transmit Queues */
3549 #define Q_R1 0x0000 /* Receive Queue 1 */
3550 #define Q_R2 0x0080 /* Receive Queue 2 */
3551@@ -1693,6 +2583,10 @@
3552 #define Q_XS2 0x0300 /* Synchronous Transmit Queue 2 */
3553 #define Q_XA2 0x0380 /* Asynchronous Transmit Queue 2 */
3554
3555+#define Q_ASF_R1 0x100 /* ASF Rx Queue 1 */
3556+#define Q_ASF_R2 0x180 /* ASF Rx Queue 2 */
3557+#define Q_ASF_T1 0x140 /* ASF Tx Queue 1 */
3558+#define Q_ASF_T2 0x1c0 /* ASF Tx Queue 2 */
3559 /*
3560 * Macro Q_ADDR()
3561 *
3562@@ -1704,11 +2598,27 @@
3563 * Offs Queue register offset.
3564 * Values: Q_D, Q_DA_L ... Q_T2, Q_T3
3565 *
3566- * usage SK_IN32(pAC, Q_ADDR(Q_R2, Q_BC), pVal)
3567+ * usage SK_IN32(IoC, Q_ADDR(Q_R2, Q_BC), pVal)
3568 */
3569 #define Q_ADDR(Queue, Offs) (B8_Q_REGS + (Queue) + (Offs))
3570
3571 /*
3572+ * Macro Y2_PREF_Q_ADDR()
3573+ *
3574+ * Use this macro to access the Prefetch Units of the receive and
3575+ * transmit queues of Yukon-2.
3576+ *
3577+ * para:
3578+ * Queue Queue to access.
3579+ * Values: Q_R1, Q_R2, Q_XS1, Q_XA1, Q_XS2, Q_XA2,
3580+ * Offs Queue register offset.
3581+ * Values: PREF_UNIT_CTRL_REG ... PREF_UNIT_FIFO_LEV_REG
3582+ *
3583+ * usage SK_IN16(IoC, Y2_Q_ADDR(Q_R2, PREF_UNIT_GET_IDX_REG), pVal)
3584+ */
3585+#define Y2_PREF_Q_ADDR(Queue, Offs) (Y2_B8_PREF_REGS + (Queue) + (Offs))
3586+
3587+/*
3588 * Macro RB_ADDR()
3589 *
3590 * Use this macro to access the RAM Buffer Registers.
3591@@ -1719,14 +2629,14 @@
3592 * Offs Queue register offset.
3593 * Values: RB_START, RB_END ... RB_LEV, RB_CTRL
3594 *
3595- * usage SK_IN32(pAC, RB_ADDR(Q_R2, RB_RP), pVal)
3596+ * usage SK_IN32(IoC, RB_ADDR(Q_R2, RB_RP), pVal)
3597 */
3598 #define RB_ADDR(Queue, Offs) (B16_RAM_REGS + (Queue) + (Offs))
3599
3600
3601 /* MAC Related Registers */
3602-#define MAC_1 0 /* belongs to the port near the slot */
3603-#define MAC_2 1 /* belongs to the port far away from the slot */
3604+#define MAC_1 0 /* 1st port */
3605+#define MAC_2 1 /* 2nd port */
3606
3607 /*
3608 * Macro MR_ADDR()
3609@@ -1740,19 +2650,10 @@
3610 * Values: RX_MFF_EA, RX_MFF_WP ... LNK_LED_REG,
3611 * TX_MFF_EA, TX_MFF_WP ... TX_LED_TST
3612 *
3613- * usage SK_IN32(pAC, MR_ADDR(MAC_1, TX_MFF_EA), pVal)
3614+ * usage SK_IN32(IoC, MR_ADDR(MAC_1, TX_MFF_EA), pVal)
3615 */
3616 #define MR_ADDR(Mac, Offs) (((Mac) << 7) + (Offs))
3617
3618-#ifdef SK_LITTLE_ENDIAN
3619-#define XM_WORD_LO 0
3620-#define XM_WORD_HI 1
3621-#else /* !SK_LITTLE_ENDIAN */
3622-#define XM_WORD_LO 1
3623-#define XM_WORD_HI 0
3624-#endif /* !SK_LITTLE_ENDIAN */
3625-
3626-
3627 /*
3628 * macros to access the XMAC (GENESIS only)
3629 *
3630@@ -1777,22 +2678,31 @@
3631 #define XMA(Mac, Reg) \
3632 ((BASE_XMAC_1 + (Mac) * (BASE_XMAC_2 - BASE_XMAC_1)) | ((Reg) << 1))
3633
3634-#define XM_IN16(IoC, Mac, Reg, pVal) \
3635- SK_IN16((IoC), XMA((Mac), (Reg)), (pVal))
3636+#define XM_IN16(IoC, Mac, Reg, pVal) \
3637+ SK_IN16(IoC, XMA(Mac, Reg), pVal)
3638+
3639+#define XM_OUT16(IoC, Mac, Reg, Val) \
3640+ SK_OUT16(IoC, XMA(Mac, Reg), Val)
3641+
3642+#ifdef SK_LITTLE_ENDIAN
3643
3644-#define XM_OUT16(IoC, Mac, Reg, Val) \
3645- SK_OUT16((IoC), XMA((Mac), (Reg)), (Val))
3646+#define XM_IN32(IoC, Mac, Reg, pVal) { \
3647+ SK_IN16(IoC, XMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal)); \
3648+ SK_IN16(IoC, XMA(Mac, (Reg) + 2), (SK_U16 SK_FAR *)(pVal) + 1); \
3649+}
3650+
3651+#else /* !SK_LITTLE_ENDIAN */
3652
3653-#define XM_IN32(IoC, Mac, Reg, pVal) { \
3654- SK_IN16((IoC), XMA((Mac), (Reg)), \
3655- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_LO]); \
3656- SK_IN16((IoC), XMA((Mac), (Reg+2)), \
3657- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_HI]); \
3658+#define XM_IN32(IoC, Mac, Reg, pVal) { \
3659+ SK_IN16(IoC, XMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal) + 1); \
3660+ SK_IN16(IoC, XMA(Mac, (Reg) + 2), (SK_U16 SK_FAR *)(pVal)); \
3661 }
3662
3663+#endif /* !SK_LITTLE_ENDIAN */
3664+
3665 #define XM_OUT32(IoC, Mac, Reg, Val) { \
3666- SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16)((Val) & 0xffffL)); \
3667- SK_OUT16((IoC), XMA((Mac), (Reg+2)), (SK_U16)(((Val) >> 16) & 0xffffL));\
3668+ SK_OUT16(IoC, XMA(Mac, Reg), (SK_U16)((Val) & 0xffffL)); \
3669+ SK_OUT16(IoC, XMA(Mac, (Reg) + 2), (SK_U16)(((Val) >> 16) & 0xffffL)); \
3670 }
3671
3672 /* Remember: we are always writing to / reading from LITTLE ENDIAN memory */
3673@@ -1802,13 +2712,13 @@
3674 SK_U8 *pByte; \
3675 pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \
3676 SK_IN16((IoC), XMA((Mac), (Reg)), &Word); \
3677- pByte[0] = (SK_U8)(Word & 0x00ff); \
3678+ pByte[0] = (SK_U8)(Word & 0x00ff); \
3679 pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \
3680- SK_IN16((IoC), XMA((Mac), (Reg+2)), &Word); \
3681- pByte[2] = (SK_U8)(Word & 0x00ff); \
3682+ SK_IN16((IoC), XMA((Mac), (Reg) + 2), &Word); \
3683+ pByte[2] = (SK_U8)(Word & 0x00ff); \
3684 pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \
3685- SK_IN16((IoC), XMA((Mac), (Reg+4)), &Word); \
3686- pByte[4] = (SK_U8)(Word & 0x00ff); \
3687+ SK_IN16((IoC), XMA((Mac), (Reg) + 4), &Word); \
3688+ pByte[4] = (SK_U8)(Word & 0x00ff); \
3689 pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \
3690 }
3691
3692@@ -1818,10 +2728,10 @@
3693 SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16) \
3694 (((SK_U16)(pByte[0]) & 0x00ff) | \
3695 (((SK_U16)(pByte[1]) << 8) & 0xff00))); \
3696- SK_OUT16((IoC), XMA((Mac), (Reg+2)), (SK_U16) \
3697+ SK_OUT16((IoC), XMA((Mac), (Reg) + 2), (SK_U16) \
3698 (((SK_U16)(pByte[2]) & 0x00ff) | \
3699 (((SK_U16)(pByte[3]) << 8) & 0xff00))); \
3700- SK_OUT16((IoC), XMA((Mac), (Reg+4)), (SK_U16) \
3701+ SK_OUT16((IoC), XMA((Mac), (Reg) + 4), (SK_U16) \
3702 (((SK_U16)(pByte[4]) & 0x00ff) | \
3703 (((SK_U16)(pByte[5]) << 8) & 0xff00))); \
3704 }
3705@@ -1831,16 +2741,16 @@
3706 SK_U8 SK_FAR *pByte; \
3707 pByte = (SK_U8 SK_FAR *)&((SK_U8 SK_FAR *)(pVal))[0]; \
3708 SK_IN16((IoC), XMA((Mac), (Reg)), &Word); \
3709- pByte[0] = (SK_U8)(Word & 0x00ff); \
3710+ pByte[0] = (SK_U8)(Word & 0x00ff); \
3711 pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \
3712- SK_IN16((IoC), XMA((Mac), (Reg+2)), &Word); \
3713- pByte[2] = (SK_U8)(Word & 0x00ff); \
3714+ SK_IN16((IoC), XMA((Mac), (Reg) + 2), &Word); \
3715+ pByte[2] = (SK_U8)(Word & 0x00ff); \
3716 pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \
3717- SK_IN16((IoC), XMA((Mac), (Reg+4)), &Word); \
3718- pByte[4] = (SK_U8)(Word & 0x00ff); \
3719+ SK_IN16((IoC), XMA((Mac), (Reg) + 4), &Word); \
3720+ pByte[4] = (SK_U8)(Word & 0x00ff); \
3721 pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \
3722- SK_IN16((IoC), XMA((Mac), (Reg+6)), &Word); \
3723- pByte[6] = (SK_U8)(Word & 0x00ff); \
3724+ SK_IN16((IoC), XMA((Mac), (Reg) + 6), &Word); \
3725+ pByte[6] = (SK_U8)(Word & 0x00ff); \
3726 pByte[7] = (SK_U8)((Word >> 8) & 0x00ff); \
3727 }
3728
3729@@ -1850,13 +2760,13 @@
3730 SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16) \
3731 (((SK_U16)(pByte[0]) & 0x00ff)| \
3732 (((SK_U16)(pByte[1]) << 8) & 0xff00))); \
3733- SK_OUT16((IoC), XMA((Mac), (Reg+2)), (SK_U16) \
3734+ SK_OUT16((IoC), XMA((Mac), (Reg) + 2), (SK_U16) \
3735 (((SK_U16)(pByte[2]) & 0x00ff)| \
3736 (((SK_U16)(pByte[3]) << 8) & 0xff00))); \
3737- SK_OUT16((IoC), XMA((Mac), (Reg+4)), (SK_U16) \
3738+ SK_OUT16((IoC), XMA((Mac), (Reg) + 4), (SK_U16) \
3739 (((SK_U16)(pByte[4]) & 0x00ff)| \
3740 (((SK_U16)(pByte[5]) << 8) & 0xff00))); \
3741- SK_OUT16((IoC), XMA((Mac), (Reg+6)), (SK_U16) \
3742+ SK_OUT16((IoC), XMA((Mac), (Reg) + 6), (SK_U16) \
3743 (((SK_U16)(pByte[6]) & 0x00ff)| \
3744 (((SK_U16)(pByte[7]) << 8) & 0xff00))); \
3745 }
3746@@ -1866,7 +2776,7 @@
3747 *
3748 * GM_IN16(), to read a 16 bit register (e.g. GM_GP_STAT)
3749 * GM_OUT16(), to write a 16 bit register (e.g. GM_GP_CTRL)
3750- * GM_IN32(), to read a 32 bit register (e.g. GM_)
3751+ * GM_IN32(), to read a 32 bit register (e.g. GM_RXF_UC_OK)
3752 * GM_OUT32(), to write a 32 bit register (e.g. GM_)
3753 * GM_INADDR(), to read a network address register (e.g. GM_SRC_ADDR_1L)
3754 * GM_OUTADDR(), to write a network address register (e.g. GM_SRC_ADDR_2L)
3755@@ -1885,22 +2795,31 @@
3756 #define GMA(Mac, Reg) \
3757 ((BASE_GMAC_1 + (Mac) * (BASE_GMAC_2 - BASE_GMAC_1)) | (Reg))
3758
3759-#define GM_IN16(IoC, Mac, Reg, pVal) \
3760- SK_IN16((IoC), GMA((Mac), (Reg)), (pVal))
3761+#define GM_IN16(IoC, Mac, Reg, pVal) \
3762+ SK_IN16(IoC, GMA(Mac, Reg), pVal)
3763+
3764+#define GM_OUT16(IoC, Mac, Reg, Val) \
3765+ SK_OUT16(IoC, GMA(Mac, Reg), Val)
3766+
3767+#ifdef SK_LITTLE_ENDIAN
3768+
3769+#define GM_IN32(IoC, Mac, Reg, pVal) { \
3770+ SK_IN16(IoC, GMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal)); \
3771+ SK_IN16((IoC), GMA(Mac, (Reg) + 4), (SK_U16 SK_FAR *)(pVal) + 1); \
3772+}
3773
3774-#define GM_OUT16(IoC, Mac, Reg, Val) \
3775- SK_OUT16((IoC), GMA((Mac), (Reg)), (Val))
3776+#else /* !SK_LITTLE_ENDIAN */
3777
3778-#define GM_IN32(IoC, Mac, Reg, pVal) { \
3779- SK_IN16((IoC), GMA((Mac), (Reg)), \
3780- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_LO]); \
3781- SK_IN16((IoC), GMA((Mac), (Reg+4)), \
3782- (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_HI]); \
3783+#define GM_IN32(IoC, Mac, Reg, pVal) { \
3784+ SK_IN16(IoC, GMA(Mac, Reg), (SK_U16 SK_FAR *)(pVal) + 1); \
3785+ SK_IN16(IoC, GMA(Mac, (Reg) + 4), (SK_U16 SK_FAR *)(pVal)); \
3786 }
3787
3788+#endif /* !SK_LITTLE_ENDIAN */
3789+
3790 #define GM_OUT32(IoC, Mac, Reg, Val) { \
3791- SK_OUT16((IoC), GMA((Mac), (Reg)), (SK_U16)((Val) & 0xffffL)); \
3792- SK_OUT16((IoC), GMA((Mac), (Reg+4)), (SK_U16)(((Val) >> 16) & 0xffffL));\
3793+ SK_OUT16(IoC, GMA(Mac, Reg), (SK_U16)((Val) & 0xffffL)); \
3794+ SK_OUT16(IoC, GMA(Mac, (Reg) + 4), (SK_U16)(((Val) >> 16) & 0xffffL)); \
3795 }
3796
3797 #define GM_INADDR(IoC, Mac, Reg, pVal) { \
3798@@ -1908,13 +2827,13 @@
3799 SK_U8 *pByte; \
3800 pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \
3801 SK_IN16((IoC), GMA((Mac), (Reg)), &Word); \
3802- pByte[0] = (SK_U8)(Word & 0x00ff); \
3803+ pByte[0] = (SK_U8)(Word & 0x00ff); \
3804 pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \
3805- SK_IN16((IoC), GMA((Mac), (Reg+4)), &Word); \
3806- pByte[2] = (SK_U8)(Word & 0x00ff); \
3807+ SK_IN16((IoC), GMA((Mac), (Reg) + 4), &Word); \
3808+ pByte[2] = (SK_U8)(Word & 0x00ff); \
3809 pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \
3810- SK_IN16((IoC), GMA((Mac), (Reg+8)), &Word); \
3811- pByte[4] = (SK_U8)(Word & 0x00ff); \
3812+ SK_IN16((IoC), GMA((Mac), (Reg) + 8), &Word); \
3813+ pByte[4] = (SK_U8)(Word & 0x00ff); \
3814 pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \
3815 }
3816
3817@@ -1924,10 +2843,10 @@
3818 SK_OUT16((IoC), GMA((Mac), (Reg)), (SK_U16) \
3819 (((SK_U16)(pByte[0]) & 0x00ff) | \
3820 (((SK_U16)(pByte[1]) << 8) & 0xff00))); \
3821- SK_OUT16((IoC), GMA((Mac), (Reg+4)), (SK_U16) \
3822+ SK_OUT16((IoC), GMA((Mac), (Reg) + 4), (SK_U16) \
3823 (((SK_U16)(pByte[2]) & 0x00ff) | \
3824 (((SK_U16)(pByte[3]) << 8) & 0xff00))); \
3825- SK_OUT16((IoC), GMA((Mac), (Reg+8)), (SK_U16) \
3826+ SK_OUT16((IoC), GMA((Mac), (Reg) + 8), (SK_U16) \
3827 (((SK_U16)(pByte[4]) & 0x00ff) | \
3828 (((SK_U16)(pByte[5]) << 8) & 0xff00))); \
3829 }
3830@@ -1937,16 +2856,16 @@
3831 SK_U8 *pByte; \
3832 pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \
3833 SK_IN16((IoC), GMA((Mac), (Reg)), &Word); \
3834- pByte[0] = (SK_U8)(Word & 0x00ff); \
3835+ pByte[0] = (SK_U8)(Word & 0x00ff); \
3836 pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \
3837- SK_IN16((IoC), GMA((Mac), (Reg+4)), &Word); \
3838- pByte[2] = (SK_U8)(Word & 0x00ff); \
3839+ SK_IN16((IoC), GMA((Mac), (Reg) + 4), &Word); \
3840+ pByte[2] = (SK_U8)(Word & 0x00ff); \
3841 pByte[3] = (SK_U8)((Word >> 8) & 0x00ff); \
3842- SK_IN16((IoC), GMA((Mac), (Reg+8)), &Word); \
3843- pByte[4] = (SK_U8)(Word & 0x00ff); \
3844+ SK_IN16((IoC), GMA((Mac), (Reg) + 8), &Word); \
3845+ pByte[4] = (SK_U8)(Word & 0x00ff); \
3846 pByte[5] = (SK_U8)((Word >> 8) & 0x00ff); \
3847- SK_IN16((IoC), GMA((Mac), (Reg+12)), &Word); \
3848- pByte[6] = (SK_U8)(Word & 0x00ff); \
3849+ SK_IN16((IoC), GMA((Mac), (Reg) + 12), &Word); \
3850+ pByte[6] = (SK_U8)(Word & 0x00ff); \
3851 pByte[7] = (SK_U8)((Word >> 8) & 0x00ff); \
3852 }
3853
3854@@ -1956,13 +2875,13 @@
3855 SK_OUT16((IoC), GMA((Mac), (Reg)), (SK_U16) \
3856 (((SK_U16)(pByte[0]) & 0x00ff)| \
3857 (((SK_U16)(pByte[1]) << 8) & 0xff00))); \
3858- SK_OUT16((IoC), GMA((Mac), (Reg+4)), (SK_U16) \
3859+ SK_OUT16((IoC), GMA((Mac), (Reg) + 4), (SK_U16) \
3860 (((SK_U16)(pByte[2]) & 0x00ff)| \
3861 (((SK_U16)(pByte[3]) << 8) & 0xff00))); \
3862- SK_OUT16((IoC), GMA((Mac), (Reg+8)), (SK_U16) \
3863+ SK_OUT16((IoC), GMA((Mac), (Reg) + 8), (SK_U16) \
3864 (((SK_U16)(pByte[4]) & 0x00ff)| \
3865 (((SK_U16)(pByte[5]) << 8) & 0xff00))); \
3866- SK_OUT16((IoC), GMA((Mac), (Reg+12)), (SK_U16) \
3867+ SK_OUT16((IoC), GMA((Mac), (Reg) + 12), (SK_U16) \
3868 (((SK_U16)(pByte[6]) & 0x00ff)| \
3869 (((SK_U16)(pByte[7]) << 8) & 0xff00))); \
3870 }
3871@@ -1980,8 +2899,8 @@
3872 #define SK_PHY_BCOM 1 /* Broadcom BCM5400 */
3873 #define SK_PHY_LONE 2 /* Level One LXT1000 */
3874 #define SK_PHY_NAT 3 /* National DP83891 */
3875-#define SK_PHY_MARV_COPPER 4 /* Marvell 88E1011S */
3876-#define SK_PHY_MARV_FIBER 5 /* Marvell 88E1011S working on fiber */
3877+#define SK_PHY_MARV_COPPER 4 /* Marvell 88E1040S */
3878+#define SK_PHY_MARV_FIBER 5 /* Marvell 88E1040S working on fiber */
3879
3880 /*
3881 * PHY addresses (bits 12..8 of PHY address reg)
3882@@ -2010,30 +2929,30 @@
3883 *
3884 * usage: PHY_READ(IoC, pPort, MAC_1, PHY_CTRL, Value);
3885 * Warning: a PHY_READ on an uninitialized PHY (PHY still in reset) never
3886- * comes back. This is checked in DEBUG mode.
3887+ * comes back. This is checked in DEBUG mode.
3888 */
3889 #ifndef DEBUG
3890 #define PHY_READ(IoC, pPort, Mac, PhyReg, pVal) { \
3891- SK_U16 Mmu; \
3892+ SK_U16 Mmu; \
3893 \
3894 XM_OUT16((IoC), (Mac), XM_PHY_ADDR, (PhyReg) | (pPort)->PhyAddr); \
3895 XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \
3896 if ((pPort)->PhyType != SK_PHY_XMAC) { \
3897- do { \
3898+ do { \
3899 XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \
3900 } while ((Mmu & XM_MMU_PHY_RDY) == 0); \
3901 XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \
3902- } \
3903+ } \
3904 }
3905 #else
3906 #define PHY_READ(IoC, pPort, Mac, PhyReg, pVal) { \
3907- SK_U16 Mmu; \
3908+ SK_U16 Mmu; \
3909 int __i = 0; \
3910 \
3911 XM_OUT16((IoC), (Mac), XM_PHY_ADDR, (PhyReg) | (pPort)->PhyAddr); \
3912 XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \
3913 if ((pPort)->PhyType != SK_PHY_XMAC) { \
3914- do { \
3915+ do { \
3916 XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \
3917 __i++; \
3918 if (__i > 100000) { \
3919@@ -2044,7 +2963,7 @@
3920 } \
3921 } while ((Mmu & XM_MMU_PHY_RDY) == 0); \
3922 XM_IN16((IoC), (Mac), XM_PHY_DATA, (pVal)); \
3923- } \
3924+ } \
3925 }
3926 #endif /* DEBUG */
3927
3928@@ -2052,17 +2971,17 @@
3929 SK_U16 Mmu; \
3930 \
3931 if ((pPort)->PhyType != SK_PHY_XMAC) { \
3932- do { \
3933+ do { \
3934 XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \
3935 } while ((Mmu & XM_MMU_PHY_BUSY) != 0); \
3936- } \
3937+ } \
3938 XM_OUT16((IoC), (Mac), XM_PHY_ADDR, (PhyReg) | (pPort)->PhyAddr); \
3939 XM_OUT16((IoC), (Mac), XM_PHY_DATA, (Val)); \
3940 if ((pPort)->PhyType != SK_PHY_XMAC) { \
3941- do { \
3942+ do { \
3943 XM_IN16((IoC), (Mac), XM_MMU_CMD, &Mmu); \
3944 } while ((Mmu & XM_MMU_PHY_BUSY) != 0); \
3945- } \
3946+ } \
3947 }
3948
3949 /*
3950@@ -2071,12 +2990,14 @@
3951 * Use this macro to access PCI config register from the I/O space.
3952 *
3953 * para:
3954+ * pAC Pointer to adapter context
3955 * Addr PCI configuration register to access.
3956 * Values: PCI_VENDOR_ID ... PCI_VPD_ADR_REG,
3957 *
3958- * usage SK_IN16(pAC, PCI_C(PCI_VENDOR_ID), pVal);
3959+ * usage SK_IN16(IoC, PCI_C(pAC, PCI_VENDOR_ID), pVal);
3960 */
3961-#define PCI_C(Addr) (B7_CFG_SPC + (Addr)) /* PCI Config Space */
3962+#define PCI_C(p, Addr) \
3963+ (((CHIP_ID_YUKON_2(p)) ? Y2_CFG_SPC : B7_CFG_SPC) + (Addr))
3964
3965 /*
3966 * Macro SK_HW_ADDR(Base, Addr)
3967@@ -2088,7 +3009,7 @@
3968 * Addr Address offset
3969 *
3970 * usage: May be used in SK_INxx and SK_OUTxx macros
3971- * #define SK_IN8(pAC, Addr, pVal) ...\
3972+ * #define SK_IN8(IoC, Addr, pVal) ...\
3973 * *pVal = (SK_U8)inp(SK_HW_ADDR(pAC->Hw.Iop, Addr)))
3974 */
3975 #ifdef SK_MEM_MAPPED_IO
3976@@ -2107,20 +3028,31 @@
3977 * para:
3978 * pAC Pointer to adapter context struct
3979 * IoC I/O context needed for SK I/O macros
3980- * Port Port number
3981+ * Port Port number
3982 * Mode Mode to set for this LED
3983 */
3984 #define SK_HWAC_LINK_LED(pAC, IoC, Port, Mode) \
3985 SK_OUT8(IoC, MR_ADDR(Port, LNK_LED_REG), Mode);
3986
3987+#define SK_SET_GP_IO(IoC, Bit) { \
3988+ SK_U32 DWord; \
3989+ SK_IN32(IoC, B2_GP_IO, &DWord); \
3990+ DWord |= ((GP_DIR_0 | GP_IO_0) << (Bit));\
3991+ SK_OUT32(IoC, B2_GP_IO, DWord); \
3992+}
3993
3994-/* typedefs *******************************************************************/
3995-
3996+#define SK_CLR_GP_IO(IoC, Bit) { \
3997+ SK_U32 DWord; \
3998+ SK_IN32(IoC, B2_GP_IO, &DWord); \
3999+ DWord &= ~((GP_DIR_0 | GP_IO_0) << (Bit));\
4000+ SK_OUT32(IoC, B2_GP_IO, DWord); \
4001+}
4002
4003-/* function prototypes ********************************************************/
4004+#define SK_GE_PCI_FIFO_SIZE 1600 /* PCI FIFO Size */
4005
4006 #ifdef __cplusplus
4007 }
4008 #endif /* __cplusplus */
4009
4010 #endif /* __INC_SKGEHW_H */
4011+
4012diff -ruN linux/drivers/net/sk98lin/h/skgehwt.h linux-new/drivers/net/sk98lin/h/skgehwt.h
4013--- linux/drivers/net/sk98lin/h/skgehwt.h 2006-04-11 19:19:28.000000000 +0200
4014+++ linux-new/drivers/net/sk98lin/h/skgehwt.h 2006-01-18 14:37:24.000000000 +0100
4015@@ -2,8 +2,8 @@
4016 *
4017 * Name: skhwt.h
4018 * Project: Gigabit Ethernet Adapters, Event Scheduler Module
4019- * Version: $Revision$
4020- * Date: $Date$
4021+ * Version: $Revision$
4022+ * Date: $Date$
4023 * Purpose: Defines for the hardware timer functions
4024 *
4025 ******************************************************************************/
4026diff -ruN linux/drivers/net/sk98lin/h/skgei2c.h linux-new/drivers/net/sk98lin/h/skgei2c.h
4027--- linux/drivers/net/sk98lin/h/skgei2c.h 2006-04-11 19:19:28.000000000 +0200
4028+++ linux-new/drivers/net/sk98lin/h/skgei2c.h 1970-01-01 01:00:00.000000000 +0100
4029@@ -1,210 +0,0 @@
4030-/******************************************************************************
4031- *
4032- * Name: skgei2c.h
4033- * Project: Gigabit Ethernet Adapters, TWSI-Module
4034- * Version: $Revision$
4035- * Date: $Date$
4036- * Purpose: Special defines for TWSI
4037- *
4038- ******************************************************************************/
4039-
4040-/******************************************************************************
4041- *
4042- * (C)Copyright 1998-2002 SysKonnect.
4043- * (C)Copyright 2002-2003 Marvell.
4044- *
4045- * This program is free software; you can redistribute it and/or modify
4046- * it under the terms of the GNU General Public License as published by
4047- * the Free Software Foundation; either version 2 of the License, or
4048- * (at your option) any later version.
4049- *
4050- * The information in this file is provided "AS IS" without warranty.
4051- *
4052- ******************************************************************************/
4053-
4054-/*
4055- * SKGEI2C.H contains all SK-98xx specific defines for the TWSI handling
4056- */
4057-
4058-#ifndef _INC_SKGEI2C_H_
4059-#define _INC_SKGEI2C_H_
4060-
4061-/*
4062- * Macros to access the B2_I2C_CTRL
4063- */
4064-#define SK_I2C_CTL(IoC, flag, dev, dev_size, reg, burst) \
4065- SK_OUT32(IoC, B2_I2C_CTRL,\
4066- (flag ? 0x80000000UL : 0x0L) | \
4067- (((SK_U32)reg << 16) & I2C_ADDR) | \
4068- (((SK_U32)dev << 9) & I2C_DEV_SEL) | \
4069- (dev_size & I2C_DEV_SIZE) | \
4070- ((burst << 4) & I2C_BURST_LEN))
4071-
4072-#define SK_I2C_STOP(IoC) { \
4073- SK_U32 I2cCtrl; \
4074- SK_IN32(IoC, B2_I2C_CTRL, &I2cCtrl); \
4075- SK_OUT32(IoC, B2_I2C_CTRL, I2cCtrl | I2C_STOP); \
4076-}
4077-
4078-#define SK_I2C_GET_CTL(IoC, pI2cCtrl) SK_IN32(IoC, B2_I2C_CTRL, pI2cCtrl)
4079-
4080-/*
4081- * Macros to access the TWSI SW Registers
4082- */
4083-#define SK_I2C_SET_BIT(IoC, SetBits) { \
4084- SK_U8 OrgBits; \
4085- SK_IN8(IoC, B2_I2C_SW, &OrgBits); \
4086- SK_OUT8(IoC, B2_I2C_SW, OrgBits | (SK_U8)(SetBits)); \
4087-}
4088-
4089-#define SK_I2C_CLR_BIT(IoC, ClrBits) { \
4090- SK_U8 OrgBits; \
4091- SK_IN8(IoC, B2_I2C_SW, &OrgBits); \
4092- SK_OUT8(IoC, B2_I2C_SW, OrgBits & ~((SK_U8)(ClrBits))); \
4093-}
4094-
4095-#define SK_I2C_GET_SW(IoC, pI2cSw) SK_IN8(IoC, B2_I2C_SW, pI2cSw)
4096-
4097-/*
4098- * define the possible sensor states
4099- */
4100-#define SK_SEN_IDLE 0 /* Idle: sensor not read */
4101-#define SK_SEN_VALUE 1 /* Value Read cycle */
4102-#define SK_SEN_VALEXT 2 /* Extended Value Read cycle */
4103-
4104-/*
4105- * Conversion factor to convert read Voltage sensor to milli Volt
4106- * Conversion factor to convert read Temperature sensor to 10th degree Celsius
4107- */
4108-#define SK_LM80_VT_LSB 22 /* 22mV LSB resolution */
4109-#define SK_LM80_TEMP_LSB 10 /* 1 degree LSB resolution */
4110-#define SK_LM80_TEMPEXT_LSB 5 /* 0.5 degree LSB resolution for ext. val. */
4111-
4112-/*
4113- * formula: counter = (22500*60)/(rpm * divisor * pulses/2)
4114- * assuming: 6500rpm, 4 pulses, divisor 1
4115- */
4116-#define SK_LM80_FAN_FAKTOR ((22500L*60)/(1*2))
4117-
4118-/*
4119- * Define sensor management data
4120- * Maximum is reached on Genesis copper dual port and Yukon-64
4121- * Board specific maximum is in pAC->I2c.MaxSens
4122- */
4123-#define SK_MAX_SENSORS 8 /* maximal no. of installed sensors */
4124-#define SK_MIN_SENSORS 5 /* minimal no. of installed sensors */
4125-
4126-/*
4127- * To watch the state machine (SM) use the timer in two ways
4128- * instead of one as hitherto
4129- */
4130-#define SK_TIMER_WATCH_SM 0 /* Watch the SM to finish in a spec. time */
4131-#define SK_TIMER_NEW_GAUGING 1 /* Start a new gauging when timer expires */
4132-
4133-/*
4134- * Defines for the individual thresholds
4135- */
4136-
4137-/* Temperature sensor */
4138-#define SK_SEN_TEMP_HIGH_ERR 800 /* Temperature High Err Threshold */
4139-#define SK_SEN_TEMP_HIGH_WARN 700 /* Temperature High Warn Threshold */
4140-#define SK_SEN_TEMP_LOW_WARN 100 /* Temperature Low Warn Threshold */
4141-#define SK_SEN_TEMP_LOW_ERR 0 /* Temperature Low Err Threshold */
4142-
4143-/* VCC which should be 5 V */
4144-#define SK_SEN_PCI_5V_HIGH_ERR 5588 /* Voltage PCI High Err Threshold */
4145-#define SK_SEN_PCI_5V_HIGH_WARN 5346 /* Voltage PCI High Warn Threshold */
4146-#define SK_SEN_PCI_5V_LOW_WARN 4664 /* Voltage PCI Low Warn Threshold */
4147-#define SK_SEN_PCI_5V_LOW_ERR 4422 /* Voltage PCI Low Err Threshold */
4148-
4149-/*
4150- * VIO may be 5 V or 3.3 V. Initialization takes two parts:
4151- * 1. Initialize lowest lower limit and highest higher limit.
4152- * 2. After the first value is read correct the upper or the lower limit to
4153- * the appropriate C constant.
4154- *
4155- * Warning limits are +-5% of the exepected voltage.
4156- * Error limits are +-10% of the expected voltage.
4157- */
4158-
4159-/* Bug fix AF: 16.Aug.2001: Correct the init base of LM80 sensor */
4160-
4161-#define SK_SEN_PCI_IO_5V_HIGH_ERR 5566 /* + 10% V PCI-IO High Err Threshold */
4162-#define SK_SEN_PCI_IO_5V_HIGH_WARN 5324 /* + 5% V PCI-IO High Warn Threshold */
4163- /* 5000 mVolt */
4164-#define SK_SEN_PCI_IO_5V_LOW_WARN 4686 /* - 5% V PCI-IO Low Warn Threshold */
4165-#define SK_SEN_PCI_IO_5V_LOW_ERR 4444 /* - 10% V PCI-IO Low Err Threshold */
4166-
4167-#define SK_SEN_PCI_IO_RANGE_LIMITER 4000 /* 4000 mV range delimiter */
4168-
4169-/* correction values for the second pass */
4170-#define SK_SEN_PCI_IO_3V3_HIGH_ERR 3850 /* + 15% V PCI-IO High Err Threshold */
4171-#define SK_SEN_PCI_IO_3V3_HIGH_WARN 3674 /* + 10% V PCI-IO High Warn Threshold */
4172- /* 3300 mVolt */
4173-#define SK_SEN_PCI_IO_3V3_LOW_WARN 2926 /* - 10% V PCI-IO Low Warn Threshold */
4174-#define SK_SEN_PCI_IO_3V3_LOW_ERR 2772 /* - 15% V PCI-IO Low Err Threshold */
4175-
4176-/*
4177- * VDD voltage
4178- */
4179-#define SK_SEN_VDD_HIGH_ERR 3630 /* Voltage ASIC High Err Threshold */
4180-#define SK_SEN_VDD_HIGH_WARN 3476 /* Voltage ASIC High Warn Threshold */
4181-#define SK_SEN_VDD_LOW_WARN 3146 /* Voltage ASIC Low Warn Threshold */
4182-#define SK_SEN_VDD_LOW_ERR 2970 /* Voltage ASIC Low Err Threshold */
4183-
4184-/*
4185- * PHY PLL 3V3 voltage
4186- */
4187-#define SK_SEN_PLL_3V3_HIGH_ERR 3630 /* Voltage PMA High Err Threshold */
4188-#define SK_SEN_PLL_3V3_HIGH_WARN 3476 /* Voltage PMA High Warn Threshold */
4189-#define SK_SEN_PLL_3V3_LOW_WARN 3146 /* Voltage PMA Low Warn Threshold */
4190-#define SK_SEN_PLL_3V3_LOW_ERR 2970 /* Voltage PMA Low Err Threshold */
4191-
4192-/*
4193- * VAUX (YUKON only)
4194- */
4195-#define SK_SEN_VAUX_3V3_HIGH_ERR 3630 /* Voltage VAUX High Err Threshold */
4196-#define SK_SEN_VAUX_3V3_HIGH_WARN 3476 /* Voltage VAUX High Warn Threshold */
4197-#define SK_SEN_VAUX_3V3_LOW_WARN 3146 /* Voltage VAUX Low Warn Threshold */
4198-#define SK_SEN_VAUX_3V3_LOW_ERR 2970 /* Voltage VAUX Low Err Threshold */
4199-#define SK_SEN_VAUX_0V_WARN_ERR 0 /* if VAUX not present */
4200-#define SK_SEN_VAUX_RANGE_LIMITER 1000 /* 1000 mV range delimiter */
4201-
4202-/*
4203- * PHY 2V5 voltage
4204- */
4205-#define SK_SEN_PHY_2V5_HIGH_ERR 2750 /* Voltage PHY High Err Threshold */
4206-#define SK_SEN_PHY_2V5_HIGH_WARN 2640 /* Voltage PHY High Warn Threshold */
4207-#define SK_SEN_PHY_2V5_LOW_WARN 2376 /* Voltage PHY Low Warn Threshold */
4208-#define SK_SEN_PHY_2V5_LOW_ERR 2222 /* Voltage PHY Low Err Threshold */
4209-
4210-/*
4211- * ASIC Core 1V5 voltage (YUKON only)
4212- */
4213-#define SK_SEN_CORE_1V5_HIGH_ERR 1650 /* Voltage ASIC Core High Err Threshold */
4214-#define SK_SEN_CORE_1V5_HIGH_WARN 1575 /* Voltage ASIC Core High Warn Threshold */
4215-#define SK_SEN_CORE_1V5_LOW_WARN 1425 /* Voltage ASIC Core Low Warn Threshold */
4216-#define SK_SEN_CORE_1V5_LOW_ERR 1350 /* Voltage ASIC Core Low Err Threshold */
4217-
4218-/*
4219- * FAN 1 speed
4220- */
4221-/* assuming: 6500rpm +-15%, 4 pulses,
4222- * warning at: 80 %
4223- * error at: 70 %
4224- * no upper limit
4225- */
4226-#define SK_SEN_FAN_HIGH_ERR 20000 /* FAN Speed High Err Threshold */
4227-#define SK_SEN_FAN_HIGH_WARN 20000 /* FAN Speed High Warn Threshold */
4228-#define SK_SEN_FAN_LOW_WARN 5200 /* FAN Speed Low Warn Threshold */
4229-#define SK_SEN_FAN_LOW_ERR 4550 /* FAN Speed Low Err Threshold */
4230-
4231-/*
4232- * Some Voltages need dynamic thresholds
4233- */
4234-#define SK_SEN_DYN_INIT_NONE 0 /* No dynamic init of thresholds */
4235-#define SK_SEN_DYN_INIT_PCI_IO 10 /* Init PCI-IO with new thresholds */
4236-#define SK_SEN_DYN_INIT_VAUX 11 /* Init VAUX with new thresholds */
4237-
4238-extern int SkLm80ReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen);
4239-#endif /* n_INC_SKGEI2C_H */
4240diff -ruN linux/drivers/net/sk98lin/h/skgeinit.h linux-new/drivers/net/sk98lin/h/skgeinit.h
4241--- linux/drivers/net/sk98lin/h/skgeinit.h 2006-04-11 19:19:28.000000000 +0200
4242+++ linux-new/drivers/net/sk98lin/h/skgeinit.h 2006-01-18 14:37:24.000000000 +0100
4243@@ -2,23 +2,24 @@
4244 *
4245 * Name: skgeinit.h
4246 * Project: Gigabit Ethernet Adapters, Common Modules
4247- * Version: $Revision$
4248- * Date: $Date$
4249+ * Version: $Revision$
4250+ * Date: $Date$
4251 * Purpose: Structures and prototypes for the GE Init Module
4252 *
4253 ******************************************************************************/
4254
4255 /******************************************************************************
4256 *
4257+ * LICENSE:
4258 * (C)Copyright 1998-2002 SysKonnect.
4259- * (C)Copyright 2002-2003 Marvell.
4260+ * (C)Copyright 2002-2005 Marvell.
4261 *
4262 * This program is free software; you can redistribute it and/or modify
4263 * it under the terms of the GNU General Public License as published by
4264 * the Free Software Foundation; either version 2 of the License, or
4265 * (at your option) any later version.
4266- *
4267 * The information in this file is provided "AS IS" without warranty.
4268+ * /LICENSE
4269 *
4270 ******************************************************************************/
4271
4272@@ -60,14 +61,17 @@
4273 #define SK_XMIT_DUR 0x002faf08UL /* 50 ms */
4274 #define SK_BLK_DUR 0x01dcd650UL /* 500 ms */
4275
4276-#define SK_DPOLL_DEF 0x00ee6b28UL /* 250 ms at 62.5 MHz */
4277+#define SK_DPOLL_DEF 0x00ee6b28UL /* 250 ms at 62.5 MHz (Genesis) */
4278+#define SK_DPOLL_DEF_Y2 0x0000124fUL /* 75 us (Yukon-2) */
4279
4280 #define SK_DPOLL_MAX 0x00ffffffUL /* 268 ms at 62.5 MHz */
4281- /* 215 ms at 78.12 MHz */
4282+ /* 215 ms at 78.12 MHz (Yukon) */
4283
4284 #define SK_FACT_62 100 /* is given in percent */
4285-#define SK_FACT_53 85 /* on GENESIS: 53.12 MHz */
4286+#define SK_FACT_53 85 /* on GENESIS: 53.12 MHz */
4287 #define SK_FACT_78 125 /* on YUKON: 78.12 MHz */
4288+#define SK_FACT_100 161 /* on YUKON-FE: 100 MHz */
4289+#define SK_FACT_125 202 /* on YUKON-EC: 125 MHz */
4290
4291 /* Timeout values */
4292 #define SK_MAC_TO_53 72 /* MAC arbiter timeout */
4293@@ -82,11 +86,23 @@
4294 #define SK_RB_LLPP_S (10 * 1024) /* Lower Level for small Queues */
4295 #define SK_RB_LLPP_B (16 * 1024) /* Lower Level for big Queues */
4296
4297+/* Threshold values for Yukon-EC Ultra */
4298+#define SK_ECU_ULPP 0x0080 /* Upper Pause Threshold (multiples of 8) */
4299+#define SK_ECU_LLPP 0x0060 /* Lower Pause Threshold (multiples of 8) */
4300+#define SK_ECU_AE_THR 0x0180 /* Almost Empty Threshold */
4301+#define SK_ECU_TXFF_LEV 0x01a0 /* Tx BMU FIFO Level */
4302+
4303 #ifndef SK_BMU_RX_WM
4304-#define SK_BMU_RX_WM 0x600 /* BMU Rx Watermark */
4305+#define SK_BMU_RX_WM 0x600 /* BMU Rx Watermark */
4306 #endif
4307+
4308 #ifndef SK_BMU_TX_WM
4309-#define SK_BMU_TX_WM 0x600 /* BMU Tx Watermark */
4310+#define SK_BMU_TX_WM 0x600 /* BMU Tx Watermark */
4311+#endif
4312+
4313+/* performance sensitive drivers should set this define to 0x80 */
4314+#ifndef SK_BMU_RX_WM_PEX
4315+#define SK_BMU_RX_WM_PEX 0x600 /* BMU Rx Watermark for PEX */
4316 #endif
4317
4318 /* XMAC II Rx High Watermark */
4319@@ -98,37 +114,31 @@
4320 #define SK_XM_THR_MULL 0x01fb /* .. for multiple link usage */
4321 #define SK_XM_THR_JUMBO 0x03fc /* .. for jumbo frame usage */
4322
4323-/* values for GIPortUsage */
4324+/* values for PortUsage */
4325 #define SK_RED_LINK 1 /* redundant link usage */
4326 #define SK_MUL_LINK 2 /* multiple link usage */
4327 #define SK_JUMBO_LINK 3 /* driver uses jumbo frames */
4328
4329 /* Minimum RAM Buffer Rx Queue Size */
4330-#define SK_MIN_RXQ_SIZE 16 /* 16 kB */
4331+#define SK_MIN_RXQ_SIZE (((pAC)->GIni.GIYukon2) ? 10 : 16) /* 10/16 kB */
4332
4333 /* Minimum RAM Buffer Tx Queue Size */
4334-#define SK_MIN_TXQ_SIZE 16 /* 16 kB */
4335+#define SK_MIN_TXQ_SIZE (((pAC)->GIni.GIYukon2) ? 10 : 16) /* 10/16 kB */
4336
4337-/* Queue Size units */
4338-#define QZ_UNITS 0x7
4339+/* Queue Size units (Genesis/Yukon) */
4340+#define QZ_UNITS 7
4341 #define QZ_STEP 8
4342
4343+/* Queue Size units (Yukon-2) */
4344+#define QZ_STEP_Y2 1
4345+
4346 /* Percentage of queue size from whole memory */
4347 /* 80 % for receive */
4348-#define RAM_QUOTA_RX 80L
4349-/* 0% for sync transfer */
4350-#define RAM_QUOTA_SYNC 0L
4351+#define RAM_QUOTA_RX 80
4352+/* 0 % for sync transfer */
4353+#define RAM_QUOTA_SYNC 0
4354 /* the rest (20%) is taken for async transfer */
4355
4356-/* Get the rounded queue size in Bytes in 8k steps */
4357-#define ROUND_QUEUE_SIZE(SizeInBytes) \
4358- ((((unsigned long) (SizeInBytes) + (QZ_STEP*1024L)-1) / 1024) & \
4359- ~(QZ_STEP-1))
4360-
4361-/* Get the rounded queue size in KBytes in 8k steps */
4362-#define ROUND_QUEUE_SIZE_KB(Kilobytes) \
4363- ROUND_QUEUE_SIZE((Kilobytes) * 1024L)
4364-
4365 /* Types of RAM Buffer Queues */
4366 #define SK_RX_SRAM_Q 1 /* small receive queue */
4367 #define SK_RX_BRAM_Q 2 /* big receive queue */
4368@@ -167,11 +177,11 @@
4369
4370
4371 /* Link Speed Capabilities */
4372-#define SK_LSPEED_CAP_AUTO (1<<0) /* Automatic resolution */
4373-#define SK_LSPEED_CAP_10MBPS (1<<1) /* 10 Mbps */
4374-#define SK_LSPEED_CAP_100MBPS (1<<2) /* 100 Mbps */
4375-#define SK_LSPEED_CAP_1000MBPS (1<<3) /* 1000 Mbps */
4376-#define SK_LSPEED_CAP_INDETERMINATED (1<<4) /* indeterminated */
4377+#define SK_LSPEED_CAP_AUTO BIT_0S /* Automatic resolution */
4378+#define SK_LSPEED_CAP_10MBPS BIT_1S /* 10 Mbps */
4379+#define SK_LSPEED_CAP_100MBPS BIT_2S /* 100 Mbps */
4380+#define SK_LSPEED_CAP_1000MBPS BIT_3S /* 1000 Mbps */
4381+#define SK_LSPEED_CAP_INDETERMINATED BIT_4S /* indeterminated */
4382
4383 /* Link Speed Parameter */
4384 #define SK_LSPEED_AUTO 1 /* Automatic resolution */
4385@@ -189,11 +199,11 @@
4386
4387
4388 /* Link Capability Parameter */
4389-#define SK_LMODE_CAP_HALF (1<<0) /* Half Duplex Mode */
4390-#define SK_LMODE_CAP_FULL (1<<1) /* Full Duplex Mode */
4391-#define SK_LMODE_CAP_AUTOHALF (1<<2) /* AutoHalf Duplex Mode */
4392-#define SK_LMODE_CAP_AUTOFULL (1<<3) /* AutoFull Duplex Mode */
4393-#define SK_LMODE_CAP_INDETERMINATED (1<<4) /* indeterminated */
4394+#define SK_LMODE_CAP_HALF BIT_0S /* Half Duplex Mode */
4395+#define SK_LMODE_CAP_FULL BIT_1S /* Full Duplex Mode */
4396+#define SK_LMODE_CAP_AUTOHALF BIT_2S /* AutoHalf Duplex Mode */
4397+#define SK_LMODE_CAP_AUTOFULL BIT_3S /* AutoFull Duplex Mode */
4398+#define SK_LMODE_CAP_INDETERMINATED BIT_4S /* indeterminated */
4399
4400 /* Link Mode Current State */
4401 #define SK_LMODE_STAT_UNKNOWN 1 /* Unknown Duplex Mode */
4402@@ -220,10 +230,10 @@
4403 #define SK_FLOW_STAT_INDETERMINATED 5 /* indeterminated */
4404
4405 /* Master/Slave Mode Capabilities */
4406-#define SK_MS_CAP_AUTO (1<<0) /* Automatic resolution */
4407-#define SK_MS_CAP_MASTER (1<<1) /* This station is master */
4408-#define SK_MS_CAP_SLAVE (1<<2) /* This station is slave */
4409-#define SK_MS_CAP_INDETERMINATED (1<<3) /* indeterminated */
4410+#define SK_MS_CAP_AUTO BIT_0S /* Automatic resolution */
4411+#define SK_MS_CAP_MASTER BIT_1S /* This station is master */
4412+#define SK_MS_CAP_SLAVE BIT_2S /* This station is slave */
4413+#define SK_MS_CAP_INDETERMINATED BIT_3S /* indeterminated */
4414
4415 /* Set Master/Slave Mode Parameter (and capabilities) */
4416 #define SK_MS_MODE_AUTO 1 /* Automatic resolution */
4417@@ -238,25 +248,25 @@
4418 #define SK_MS_STAT_FAULT 4 /* M/S resolution failed */
4419 #define SK_MS_STAT_INDETERMINATED 5 /* indeterminated */
4420
4421-/* parameter 'Mode' when calling SkXmSetRxCmd() */
4422-#define SK_STRIP_FCS_ON (1<<0) /* Enable FCS stripping of Rx frames */
4423-#define SK_STRIP_FCS_OFF (1<<1) /* Disable FCS stripping of Rx frames */
4424-#define SK_STRIP_PAD_ON (1<<2) /* Enable pad byte stripping of Rx fr */
4425-#define SK_STRIP_PAD_OFF (1<<3) /* Disable pad byte stripping of Rx fr */
4426-#define SK_LENERR_OK_ON (1<<4) /* Don't chk fr for in range len error */
4427-#define SK_LENERR_OK_OFF (1<<5) /* Check frames for in range len error */
4428-#define SK_BIG_PK_OK_ON (1<<6) /* Don't set Rx Error bit for big frames */
4429-#define SK_BIG_PK_OK_OFF (1<<7) /* Set Rx Error bit for big frames */
4430-#define SK_SELF_RX_ON (1<<8) /* Enable Rx of own packets */
4431-#define SK_SELF_RX_OFF (1<<9) /* Disable Rx of own packets */
4432+/* parameter 'Mode' when calling SkMacSetRxCmd() */
4433+#define SK_STRIP_FCS_ON BIT_0S /* Enable FCS stripping of Rx frames */
4434+#define SK_STRIP_FCS_OFF BIT_1S /* Disable FCS stripping of Rx frames */
4435+#define SK_STRIP_PAD_ON BIT_2S /* Enable pad byte stripping of Rx fr */
4436+#define SK_STRIP_PAD_OFF BIT_3S /* Disable pad byte stripping of Rx fr */
4437+#define SK_LENERR_OK_ON BIT_4S /* Don't chk fr for in range len error */
4438+#define SK_LENERR_OK_OFF BIT_5S /* Check frames for in range len error */
4439+#define SK_BIG_PK_OK_ON BIT_6S /* Don't set Rx Error bit for big frames */
4440+#define SK_BIG_PK_OK_OFF BIT_7S /* Set Rx Error bit for big frames */
4441+#define SK_SELF_RX_ON BIT_8S /* Enable Rx of own packets */
4442+#define SK_SELF_RX_OFF BIT_9S /* Disable Rx of own packets */
4443
4444 /* parameter 'Para' when calling SkMacSetRxTxEn() */
4445-#define SK_MAC_LOOPB_ON (1<<0) /* Enable MAC Loopback Mode */
4446-#define SK_MAC_LOOPB_OFF (1<<1) /* Disable MAC Loopback Mode */
4447-#define SK_PHY_LOOPB_ON (1<<2) /* Enable PHY Loopback Mode */
4448-#define SK_PHY_LOOPB_OFF (1<<3) /* Disable PHY Loopback Mode */
4449-#define SK_PHY_FULLD_ON (1<<4) /* Enable GMII Full Duplex */
4450-#define SK_PHY_FULLD_OFF (1<<5) /* Disable GMII Full Duplex */
4451+#define SK_MAC_LOOPB_ON BIT_0S /* Enable MAC Loopback Mode */
4452+#define SK_MAC_LOOPB_OFF BIT_1S /* Disable MAC Loopback Mode */
4453+#define SK_PHY_LOOPB_ON BIT_2S /* Enable PHY Loopback Mode */
4454+#define SK_PHY_LOOPB_OFF BIT_3S /* Disable PHY Loopback Mode */
4455+#define SK_PHY_FULLD_ON BIT_4S /* Enable GMII Full Duplex */
4456+#define SK_PHY_FULLD_OFF BIT_5S /* Disable GMII Full Duplex */
4457
4458 /* States of PState */
4459 #define SK_PRT_RESET 0 /* the port is reset */
4460@@ -266,18 +276,24 @@
4461
4462 /* PHY power down modes */
4463 #define PHY_PM_OPERATIONAL_MODE 0 /* PHY operational mode */
4464-#define PHY_PM_DEEP_SLEEP 1 /* coma mode --> minimal power */
4465+#define PHY_PM_DEEP_SLEEP 1 /* Coma mode --> minimal power */
4466 #define PHY_PM_IEEE_POWER_DOWN 2 /* IEEE 22.2.4.1.5 compl. power down */
4467-#define PHY_PM_ENERGY_DETECT 3 /* energy detect */
4468-#define PHY_PM_ENERGY_DETECT_PLUS 4 /* energy detect plus */
4469+#define PHY_PM_ENERGY_DETECT 3 /* Energy detect */
4470+#define PHY_PM_ENERGY_DETECT_PLUS 4 /* Energy detect plus */
4471+
4472+/* PCI Bus Types */
4473+#define SK_PCI_BUS BIT_0S /* normal PCI bus */
4474+#define SK_PCIX_BUS BIT_1S /* PCI-X bus */
4475+#define SK_PEX_BUS BIT_2S /* PCI-Express bus */
4476
4477 /* Default receive frame limit for Workaround of XMAC Errata */
4478 #define SK_DEF_RX_WA_LIM SK_CONSTU64(100)
4479
4480 /* values for GILedBlinkCtrl (LED Blink Control) */
4481-#define SK_ACT_LED_BLINK (1<<0) /* Active LED blinking */
4482-#define SK_DUP_LED_NORMAL (1<<1) /* Duplex LED normal */
4483-#define SK_LED_LINK100_ON (1<<2) /* Link 100M LED on */
4484+#define SK_ACT_LED_BLINK BIT_0S /* Active LED blinking */
4485+#define SK_DUP_LED_NORMAL BIT_1S /* Duplex LED normal */
4486+#define SK_LED_LINK100_ON BIT_2S /* Link 100M LED on */
4487+#define SK_DUAL_LED_ACT_LNK BIT_3S /* Dual LED ACT/LNK configuration */
4488
4489 /* Link Partner Status */
4490 #define SK_LIPA_UNKNOWN 0 /* Link partner is in unknown state */
4491@@ -290,18 +306,173 @@
4492 /* Max. Auto-neg. timeouts before link detection in sense mode is reset */
4493 #define SK_MAX_ANEG_TO 10 /* Max. 10 times the sense mode is reset */
4494
4495+
4496+/******************************************************************************
4497+ *
4498+ * HW_FEATURE() macro
4499+ */
4500+
4501+/* DWORD 0: Features */
4502+#define HWF_CLK_GATING_ENABLE 0x02000000UL /* Enable Clock Gating */
4503+#define HWF_RED_CORE_CLK_SUP 0x01000000UL /* Reduced Core Clock supp. */
4504+#define HWF_SYNC_TX_SUP 0x00800000UL /* Synch. Tx Queue available */
4505+#define HWF_SINGLE_PORT_DEVICE 0x00400000UL /* Device has only one LAN IF */
4506+#define HWF_JUMBO_FRAMES_SUP 0x00200000UL /* Jumbo Frames supported */
4507+#define HWF_TX_TCP_CSUM_SUP 0x00100000UL /* TCP Tx checksum supported */
4508+#define HWF_TX_UDP_CSUM_SUP 0x00080000UL /* UDP Tx checksum supported */
4509+#define HWF_RX_CSUM_SUP 0x00040000UL /* RX checksum supported */
4510+#define HWF_TCP_SEGM_SUP 0x00020000UL /* TCP segmentation supported */
4511+#define HWF_RSS_HASH_SUP 0x00010000UL /* RSS Hash supported */
4512+#define HWF_PORT_VLAN_SUP 0x00008000UL /* VLAN can be config per port*/
4513+#define HWF_ROLE_PARAM_SUP 0x00004000UL /* Role parameter supported */
4514+#define HWF_LOW_PMODE_SUP 0x00002000UL /* Low Power Mode supported */
4515+#define HWF_ENERGIE_DEMO_SUP 0x00001000UL /* Energy Detect mode supp. */
4516+#define HWF_SPEED1000_SUP 0x00000800UL /* Line Speed 1000 supported */
4517+#define HWF_SPEED100_SUP 0x00000400UL /* Line Speed 100 supported */
4518+#define HWF_SPEED10_SUP 0x00000200UL /* Line Speed 10 supported */
4519+#define HWF_AUTONEGSENSE_SUP 0x00000100UL /* Autoneg Sense supported */
4520+#define HWF_PHY_LOOPB_MD_SUP 0x00000080UL /* PHY loopback mode supp. */
4521+#define HWF_ASF_SUP 0x00000040UL /* ASF support possible */
4522+#define HWF_QS_STEPS_1KB 0x00000020UL /* The Rx/Tx queues can be */
4523+ /* configured with 1 kB res. */
4524+#define HWF_OWN_RAM_PER_PORT 0x00000010UL /* Each port has a separate */
4525+ /* RAM buffer */
4526+#define HWF_MIN_LED_IF 0x00000008UL /* Minimal LED interface */
4527+ /* (e.g. for Yukon-EC) */
4528+#define HWF_LIST_ELEMENTS_USED 0x00000004UL /* HW uses list elements */
4529+ /* (otherwise desc. are used) */
4530+#define HWF_GMAC_INSIDE 0x00000002UL /* Device contains GMAC */
4531+#define HWF_TWSI_PRESENT 0x00000001UL /* TWSI sensor bus present */
4532+
4533+/*-RMV- DWORD 1: Deviations */
4534+#define HWF_WA_DEV_4200 0x10200000UL /*-RMV- 4.200 (D3 Blue Screen)*/
4535+#define HWF_WA_DEV_4185CS 0x10100000UL /*-RMV- 4.185 (ECU 100 CS cal)*/
4536+#define HWF_WA_DEV_4185 0x10080000UL /*-RMV- 4.185 (ECU Tx h check)*/
4537+#define HWF_WA_DEV_4167 0x10040000UL /*-RMV- 4.167 (Rx OvSize Hang)*/
4538+#define HWF_WA_DEV_4152 0x10020000UL /*-RMV- 4.152 (RSS issue) */
4539+#define HWF_WA_DEV_4115 0x10010000UL /*-RMV- 4.115 (Rx MAC FIFO) */
4540+#define HWF_WA_DEV_4109 0x10008000UL /*-RMV- 4.109 (BIU hang) */
4541+#define HWF_WA_DEV_483 0x10004000UL /*-RMV- 4.83 (Rx TCP wrong) */
4542+#define HWF_WA_DEV_479 0x10002000UL /*-RMV- 4.79 (Rx BMU hang II) */
4543+#define HWF_WA_DEV_472 0x10001000UL /*-RMV- 4.72 (GPHY2 MDC clk) */
4544+#define HWF_WA_DEV_463 0x10000800UL /*-RMV- 4.63 (Rx BMU hang I) */
4545+#define HWF_WA_DEV_427 0x10000400UL /*-RMV- 4.27 (Tx Done Rep) */
4546+#define HWF_WA_DEV_42 0x10000200UL /*-RMV- 4.2 (pref unit burst) */
4547+#define HWF_WA_DEV_46 0x10000100UL /*-RMV- 4.6 (CPU crash II) */
4548+#define HWF_WA_DEV_43_418 0x10000080UL /*-RMV- 4.3 & 4.18 (PCI unexp */
4549+ /*-RMV- compl&Stat BMU deadl) */
4550+#define HWF_WA_DEV_420 0x10000040UL /*-RMV- 4.20 (Status BMU ov) */
4551+#define HWF_WA_DEV_423 0x10000020UL /*-RMV- 4.23 (TCP Segm Hang) */
4552+#define HWF_WA_DEV_424 0x10000010UL /*-RMV- 4.24 (MAC reg overwr) */
4553+#define HWF_WA_DEV_425 0x10000008UL /*-RMV- 4.25 (Magic packet */
4554+ /*-RMV- with odd offset) */
4555+#define HWF_WA_DEV_428 0x10000004UL /*-RMV- 4.28 (Poll-U &BigEndi)*/
4556+#define HWF_WA_FIFO_FLUSH_YLA0 0x10000002UL /*-RMV- dis Rx GMAC FIFO Flush*/
4557+ /*-RMV- for Yu-L Rev. A0 only */
4558+#define HWF_WA_COMA_MODE 0x10000001UL /*-RMV- Coma Mode WA req */
4559+
4560+/* DWORD 2: still unused */
4561+/* DWORD 3: still unused */
4562+
4563+
4564+/*
4565+ * HW_FEATURE() - returns whether the feature is serviced or not
4566+ */
4567+#define HW_FEATURE(pAC, ReqFeature) \
4568+ (((pAC)->GIni.HwF.Features[((ReqFeature) & 0x30000000UL) >> 28] &\
4569+ ((ReqFeature) & 0x0fffffffUL)) != 0)
4570+
4571+#define HW_FEAT_LIST 0
4572+#define HW_DEV_LIST 1
4573+
4574+#define SET_HW_FEATURE_MASK(pAC, List, OffMaskValue, OnMaskValue) { \
4575+ if ((List) == HW_FEAT_LIST || (List) == HW_DEV_LIST) { \
4576+ (pAC)->GIni.HwF.OffMask[List] = (OffMaskValue); \
4577+ (pAC)->GIni.HwF.OnMask[List] = (OnMaskValue); \
4578+ } \
4579+}
4580+
4581+/* driver access macros for GIni structure ***********************************/
4582+
4583+#define CHIP_ID_YUKON_2(pAC) ((pAC)->GIni.GIYukon2)
4584+
4585+#define HW_SYNC_TX_SUPPORTED(pAC) \
4586+ ((pAC)->GIni.GIChipId != CHIP_ID_YUKON_EC && \
4587+ (pAC)->GIni.GIChipId != CHIP_ID_YUKON_FE && \
4588+ (pAC)->GIni.GIChipId != CHIP_ID_YUKON_EC_U)
4589+
4590+#define HW_MS_TO_TICKS(pAC, MsTime) \
4591+ ((MsTime) * (62500L/100) * (pAC)->GIni.GIHstClkFact)
4592+
4593+#ifdef XXX
4594+/* still under construction */
4595+#define HW_IS_SINGLE_PORT(pAC) ((pAC)->GIni.GIMacsFound == 1)
4596+#define HW_NUMBER_OF_PORTS(pAC) ((pAC)->GIni.GIMacsFound)
4597+
4598+#define HW_TX_UDP_CSUM_SUPPORTED(pAC) \
4599+ ((((pAC)->GIni.GIChipId >= CHIP_ID_YUKON) && ((pAC)->GIni.GIChipRev != 0))
4600+
4601+#define HW_DEFAULT_LINESPEED(pAC) \
4602+ ((!(pAC)->GIni.GIGenesis && (pAC)->GIni.GICopperType) ? \
4603+ SK_LSPEED_AUTO : SK_LSPEED_1000MBPS)
4604+
4605+#define HW_ROLE_PARAM_SUPPORTED(pAC) ((pAC)->GIni.GICopperType)
4606+
4607+#define HW_SPEED1000_SUPPORTED(pAC, Port) \
4608+ ((pAC)->GIni.GP[Port].PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS)
4609+
4610+#define HW_SPEED100_SUPPORTED(pAC, Port) \
4611+ ((pAC)->GIni.GP[Port].PLinkSpeedCap & SK_LSPEED_CAP_100MBPS)
4612+
4613+#define HW_SPEED10_SUPPORTED(pAC, Port) \
4614+ ((pAC)->GIni.GP[Port].PLinkSpeedCap & SK_LSPEED_CAP_10MBPS)
4615+
4616+#define HW_AUTONEGSENSE_SUPPORTED(pAC) ((pAC)->GIni.GP[0].PhyType==SK_PHY_XMAC)
4617+
4618+#define HW_FREQ_TO_CARD_TICKS(pAC, AdapterClkSpeed, Freq) \
4619+ (((AdapterClkSpeed / 100) * (pAC)->GIni.GIHstClkFact) / Freq)
4620+
4621+#define HW_IS_LINK_UP(pAC, Port) ((pAC)->GIni.GP[Port].PHWLinkUp)
4622+#define HW_LINK_SPEED_USED(pAC, Port) ((pAC)->GIni.GP[Port].PLinkSpeedUsed)
4623+#define HW_RAM_SIZE(pAC) ((pAC)->GIni.GIRamSize)
4624+
4625+#define HW_PHY_LP_MODE_SUPPORTED(pAC) (pAC0->???
4626+#define HW_ASF_ACTIVE(pAC) ???
4627+#define RAWIO_OUT32(pAC, pAC->RegIrqMask, pAC->GIni.GIValIrqMask)...
4628+
4629+/* macro to check whether Tx checksum is supported */
4630+#define HW_TX_CSUM_SUPPORTED(pAC) ((pAC)->GIni.GIChipId != CHIP_ID_GENESIS)
4631+
4632+BMU_UDP_CHECK : BMU_TCP_CHECK;
4633+
4634+/* macro for - Own Bit mirrored to DWORD7 (Yukon LP receive descriptor) */
4635+#endif /* 0 */
4636+
4637+
4638 /* structures *****************************************************************/
4639
4640 /*
4641+ * HW Feature structure
4642+ */
4643+typedef struct s_HwFeatures {
4644+ SK_U32 Features[4]; /* Feature list */
4645+ SK_U32 OffMask[4]; /* Off Mask */
4646+ SK_U32 OnMask[4]; /* On Mask */
4647+} SK_HW_FEATURES;
4648+
4649+/*
4650 * MAC specific functions
4651 */
4652 typedef struct s_GeMacFunc {
4653- int (*pFnMacUpdateStats)(SK_AC *pAC, SK_IOC IoC, unsigned int Port);
4654- int (*pFnMacStatistic)(SK_AC *pAC, SK_IOC IoC, unsigned int Port,
4655- SK_U16 StatAddr, SK_U32 SK_FAR *pVal);
4656- int (*pFnMacResetCounter)(SK_AC *pAC, SK_IOC IoC, unsigned int Port);
4657- int (*pFnMacOverflow)(SK_AC *pAC, SK_IOC IoC, unsigned int Port,
4658- SK_U16 IStatus, SK_U64 SK_FAR *pVal);
4659+ int (*pFnMacUpdateStats)(SK_AC *, SK_IOC, unsigned int);
4660+ int (*pFnMacStatistic)(SK_AC *, SK_IOC, unsigned int, SK_U16, SK_U32 SK_FAR *);
4661+ int (*pFnMacResetCounter)(SK_AC *, SK_IOC, unsigned int);
4662+ int (*pFnMacOverflow)(SK_AC *, SK_IOC, unsigned int, SK_U16, SK_U64 SK_FAR *);
4663+ void (*pSkGeSirqIsr)(SK_AC *, SK_IOC, SK_U32);
4664+#ifdef SK_DIAG
4665+ int (*pFnMacPhyRead)(SK_AC *, SK_IOC, int, int, SK_U16 SK_FAR *);
4666+ int (*pFnMacPhyWrite)(SK_AC *, SK_IOC, int, int, SK_U16);
4667+#endif /* SK_DIAG */
4668 } SK_GEMACFUNC;
4669
4670 /*
4671@@ -311,7 +482,7 @@
4672 #ifndef SK_DIAG
4673 SK_TIMER PWaTimer; /* Workaround Timer */
4674 SK_TIMER HalfDupChkTimer;
4675-#endif /* SK_DIAG */
4676+#endif /* !SK_DIAG */
4677 SK_U32 PPrevShorts; /* Previous Short Counter checking */
4678 SK_U32 PPrevFcs; /* Previous FCS Error Counter checking */
4679 SK_U64 PPrevRx; /* Previous RxOk Counter checking */
4680@@ -335,6 +506,7 @@
4681 int PXaQOff; /* Asynchronous Tx Queue Address Offset */
4682 int PhyType; /* PHY used on this port */
4683 int PState; /* Port status (reset, stop, init, run) */
4684+ int PPortUsage; /* Driver Port Usage */
4685 SK_U16 PhyId1; /* PHY Id1 on this port */
4686 SK_U16 PhyAddr; /* MDIO/MDC PHY address */
4687 SK_U16 PIsave; /* Saved Interrupt status word */
4688@@ -367,7 +539,10 @@
4689 int PMacJamLen; /* MAC Jam length */
4690 int PMacJamIpgVal; /* MAC Jam IPG */
4691 int PMacJamIpgData; /* MAC IPG Jam to Data */
4692+ int PMacBackOffLim; /* MAC Back-off Limit */
4693+ int PMacDataBlind; /* MAC Data Blinder */
4694 int PMacIpgData; /* MAC Data IPG */
4695+ SK_U16 PMacAddr[3]; /* MAC address */
4696 SK_BOOL PMacLimit4; /* reset collision counter and backoff algorithm */
4697 } SK_GEPORT;
4698
4699@@ -379,27 +554,37 @@
4700 int GIChipId; /* Chip Identification Number */
4701 int GIChipRev; /* Chip Revision Number */
4702 SK_U8 GIPciHwRev; /* PCI HW Revision Number */
4703+ SK_U8 GIPciBus; /* PCI Bus Type (PCI / PCI-X / PCI-Express) */
4704+ SK_U8 GIPciMode; /* PCI / PCI-X Mode @ Clock */
4705+ SK_U8 GIPexWidth; /* PCI-Express Negotiated Link Width */
4706 SK_BOOL GIGenesis; /* Genesis adapter ? */
4707- SK_BOOL GIYukon; /* YUKON-A1/Bx chip */
4708+ SK_BOOL GIYukon; /* YUKON family (1 and 2) */
4709 SK_BOOL GIYukonLite; /* YUKON-Lite chip */
4710+ SK_BOOL GIYukon2; /* YUKON-2 chip (-XL, -EC or -FE) */
4711+ SK_U8 GIConTyp; /* Connector Type */
4712+ SK_U8 GIPmdTyp; /* PMD Type */
4713 SK_BOOL GICopperType; /* Copper Type adapter ? */
4714 SK_BOOL GIPciSlot64; /* 64-bit PCI Slot */
4715 SK_BOOL GIPciClock66; /* 66 MHz PCI Clock */
4716 SK_BOOL GIVauxAvail; /* VAUX available (YUKON) */
4717 SK_BOOL GIYukon32Bit; /* 32-Bit YUKON adapter */
4718+ SK_BOOL GIAsfEnabled; /* ASF subsystem enabled */
4719+ SK_BOOL GIAsfRunning; /* ASF subsystem running */
4720 SK_U16 GILedBlinkCtrl; /* LED Blink Control */
4721 int GIMacsFound; /* Number of MACs found on this adapter */
4722 int GIMacType; /* MAC Type used on this adapter */
4723- int GIHstClkFact; /* Host Clock Factor (62.5 / HstClk * 100) */
4724- int GIPortUsage; /* Driver Port Usage */
4725+ int GIChipCap; /* Adapter's Capabilities */
4726+ int GIHstClkFact; /* Host Clock Factor (HstClk / 62.5 * 100) */
4727 int GILevel; /* Initialization Level completed */
4728 int GIRamSize; /* The RAM size of the adapter in kB */
4729 int GIWolOffs; /* WOL Register Offset (HW-Bug in Rev. A) */
4730 SK_U32 GIRamOffs; /* RAM Address Offset for addr calculation */
4731 SK_U32 GIPollTimerVal; /* Descr. Poll Timer Init Val (HstClk ticks) */
4732 SK_U32 GIValIrqMask; /* Value for Interrupt Mask */
4733+ SK_U32 GIValHwIrqMask; /* Value for Interrupt Mask */
4734 SK_U32 GITimeStampCnt; /* Time Stamp High Counter (YUKON only) */
4735 SK_GEPORT GP[SK_MAX_MACS];/* Port Dependent Information */
4736+ SK_HW_FEATURES HwF; /* HW Features struct */
4737 SK_GEMACFUNC GIFunc; /* MAC depedent functions */
4738 } SK_GEINIT;
4739
4740@@ -417,7 +602,7 @@
4741 #define SKERR_HWI_E005 (SKERR_HWI_E004+1)
4742 #define SKERR_HWI_E005MSG "SkGeInitPort(): cannot init running ports"
4743 #define SKERR_HWI_E006 (SKERR_HWI_E005+1)
4744-#define SKERR_HWI_E006MSG "SkGeMacInit(): PState does not match HW state"
4745+#define SKERR_HWI_E006MSG "SkGeInit() called with illegal Chip Id"
4746 #define SKERR_HWI_E007 (SKERR_HWI_E006+1)
4747 #define SKERR_HWI_E007MSG "SkXmInitDupMd() called with invalid Dup Mode"
4748 #define SKERR_HWI_E008 (SKERR_HWI_E007+1)
4749@@ -433,11 +618,11 @@
4750 #define SKERR_HWI_E013 (SKERR_HWI_E012+1)
4751 #define SKERR_HWI_E013MSG "SkGeInitPort(): cfg changed for running queue"
4752 #define SKERR_HWI_E014 (SKERR_HWI_E013+1)
4753-#define SKERR_HWI_E014MSG "SkGeInitPort(): unknown GIPortUsage specified"
4754+#define SKERR_HWI_E014MSG "SkGeInitPort(): unknown PortUsage specified"
4755 #define SKERR_HWI_E015 (SKERR_HWI_E014+1)
4756-#define SKERR_HWI_E015MSG "Illegal Link mode parameter"
4757+#define SKERR_HWI_E015MSG "Illegal Link Mode parameter"
4758 #define SKERR_HWI_E016 (SKERR_HWI_E015+1)
4759-#define SKERR_HWI_E016MSG "Illegal Flow control mode parameter"
4760+#define SKERR_HWI_E016MSG "Illegal Flow Control Mode parameter"
4761 #define SKERR_HWI_E017 (SKERR_HWI_E016+1)
4762 #define SKERR_HWI_E017MSG "Illegal value specified for GIPollTimerVal"
4763 #define SKERR_HWI_E018 (SKERR_HWI_E017+1)
4764@@ -447,9 +632,9 @@
4765 #define SKERR_HWI_E020 (SKERR_HWI_E019+1)
4766 #define SKERR_HWI_E020MSG "Illegal Master/Slave parameter"
4767 #define SKERR_HWI_E021 (SKERR_HWI_E020+1)
4768-#define SKERR_HWI_E021MSG "MacUpdateStats(): cannot update statistic counter"
4769-#define SKERR_HWI_E022 (SKERR_HWI_E021+1)
4770-#define SKERR_HWI_E022MSG "MacStatistic(): illegal statistic base address"
4771+#define SKERR_HWI_E021MSG "MacUpdateStats(): cannot update statistic counter"
4772+#define SKERR_HWI_E022 (SKERR_HWI_E021+1)
4773+#define SKERR_HWI_E022MSG "MacStatistic(): illegal statistic base address"
4774 #define SKERR_HWI_E023 (SKERR_HWI_E022+1)
4775 #define SKERR_HWI_E023MSG "SkGeInitPort(): Transmit Queue Size too small"
4776 #define SKERR_HWI_E024 (SKERR_HWI_E023+1)
4777@@ -464,6 +649,24 @@
4778 /*
4779 * public functions in skgeinit.c
4780 */
4781+extern void SkGePortVlan(
4782+ SK_AC *pAC,
4783+ SK_IOC IoC,
4784+ int Port,
4785+ SK_BOOL Enable);
4786+
4787+extern void SkGeRxRss(
4788+ SK_AC *pAC,
4789+ SK_IOC IoC,
4790+ int Port,
4791+ SK_BOOL Enable);
4792+
4793+extern void SkGeRxCsum(
4794+ SK_AC *pAC,
4795+ SK_IOC IoC,
4796+ int Port,
4797+ SK_BOOL Enable);
4798+
4799 extern void SkGePollRxD(
4800 SK_AC *pAC,
4801 SK_IOC IoC,
4802@@ -528,9 +731,14 @@
4803
4804 extern int SkGeInitAssignRamToQueues(
4805 SK_AC *pAC,
4806- int ActivePort,
4807+ int Port,
4808 SK_BOOL DualNet);
4809
4810+extern int SkYuk2RestartRxBmu(
4811+ SK_AC *pAC,
4812+ SK_IOC IoC,
4813+ int Port);
4814+
4815 /*
4816 * public functions in skxmac2.c
4817 */
4818@@ -601,13 +809,13 @@
4819 int Port,
4820 SK_U16 IStatus);
4821
4822-extern void SkMacSetRxTxEn(
4823+extern void SkMacSetRxTxEn(
4824 SK_AC *pAC,
4825 SK_IOC IoC,
4826 int Port,
4827 int Para);
4828
4829-extern int SkMacRxTxEnable(
4830+extern int SkMacRxTxEnable(
4831 SK_AC *pAC,
4832 SK_IOC IoC,
4833 int Port);
4834@@ -624,28 +832,28 @@
4835 int Port,
4836 SK_BOOL Enable);
4837
4838-extern void SkXmPhyRead(
4839+extern int SkXmPhyRead(
4840 SK_AC *pAC,
4841 SK_IOC IoC,
4842 int Port,
4843 int Addr,
4844 SK_U16 SK_FAR *pVal);
4845
4846-extern void SkXmPhyWrite(
4847+extern int SkXmPhyWrite(
4848 SK_AC *pAC,
4849 SK_IOC IoC,
4850 int Port,
4851 int Addr,
4852 SK_U16 Val);
4853
4854-extern void SkGmPhyRead(
4855+extern int SkGmPhyRead(
4856 SK_AC *pAC,
4857 SK_IOC IoC,
4858 int Port,
4859 int Addr,
4860 SK_U16 SK_FAR *pVal);
4861
4862-extern void SkGmPhyWrite(
4863+extern int SkGmPhyWrite(
4864 SK_AC *pAC,
4865 SK_IOC IoC,
4866 int Port,
4867@@ -713,7 +921,7 @@
4868 SK_AC *pAC,
4869 SK_IOC IoC,
4870 unsigned int Port,
4871- SK_U16 IStatus,
4872+ SK_U16 IStatus,
4873 SK_U64 SK_FAR *pStatus);
4874
4875 extern int SkGmOverflowStatus(
4876@@ -729,6 +937,7 @@
4877 int Port,
4878 SK_BOOL StartTest);
4879
4880+#ifdef SK_PHY_LP_MODE
4881 extern int SkGmEnterLowPowerMode(
4882 SK_AC *pAC,
4883 SK_IOC IoC,
4884@@ -739,6 +948,7 @@
4885 SK_AC *pAC,
4886 SK_IOC IoC,
4887 int Port);
4888+#endif /* SK_PHY_LP_MODE */
4889
4890 #ifdef SK_DIAG
4891 extern void SkGePhyRead(
4892@@ -794,31 +1004,35 @@
4893 extern void SkGeXmitLED();
4894 extern void SkGeInitRamIface();
4895 extern int SkGeInitAssignRamToQueues();
4896+extern void SkGePortVlan();
4897+extern void SkGeRxCsum();
4898+extern void SkGeRxRss();
4899+extern int SkYuk2RestartRxBmu();
4900
4901 /*
4902 * public functions in skxmac2.c
4903 */
4904-extern void SkMacRxTxDisable();
4905+extern void SkMacRxTxDisable();
4906 extern void SkMacSoftRst();
4907 extern void SkMacHardRst();
4908 extern void SkMacClearRst();
4909-extern void SkMacInitPhy();
4910-extern int SkMacRxTxEnable();
4911-extern void SkMacPromiscMode();
4912-extern void SkMacHashing();
4913-extern void SkMacIrqDisable();
4914+extern void SkMacInitPhy();
4915+extern int SkMacRxTxEnable();
4916+extern void SkMacPromiscMode();
4917+extern void SkMacHashing();
4918+extern void SkMacIrqDisable();
4919 extern void SkMacFlushTxFifo();
4920 extern void SkMacFlushRxFifo();
4921 extern void SkMacIrq();
4922 extern int SkMacAutoNegDone();
4923 extern void SkMacAutoNegLipaPhy();
4924-extern void SkMacSetRxTxEn();
4925+extern void SkMacSetRxTxEn();
4926 extern void SkXmInitMac();
4927-extern void SkXmPhyRead();
4928-extern void SkXmPhyWrite();
4929+extern int SkXmPhyRead();
4930+extern int SkXmPhyWrite();
4931 extern void SkGmInitMac();
4932-extern void SkGmPhyRead();
4933-extern void SkGmPhyWrite();
4934+extern int SkGmPhyRead();
4935+extern int SkGmPhyWrite();
4936 extern void SkXmClrExactAddr();
4937 extern void SkXmInitDupMd();
4938 extern void SkXmInitPauseMd();
4939@@ -832,8 +1046,10 @@
4940 extern int SkXmOverflowStatus();
4941 extern int SkGmOverflowStatus();
4942 extern int SkGmCableDiagStatus();
4943+#ifdef SK_PHY_LP_MODE
4944 extern int SkGmEnterLowPowerMode();
4945 extern int SkGmLeaveLowPowerMode();
4946+#endif /* SK_PHY_LP_MODE */
4947
4948 #ifdef SK_DIAG
4949 extern void SkGePhyRead();
4950@@ -844,10 +1060,11 @@
4951 extern void SkXmSendCont();
4952 #endif /* SK_DIAG */
4953
4954-#endif /* SK_KR_PROTO */
4955+#endif /* SK_KR_PROTO */
4956
4957 #ifdef __cplusplus
4958 }
4959 #endif /* __cplusplus */
4960
4961 #endif /* __INC_SKGEINIT_H_ */
4962+
4963diff -ruN linux/drivers/net/sk98lin/h/skgepnm2.h linux-new/drivers/net/sk98lin/h/skgepnm2.h
4964--- linux/drivers/net/sk98lin/h/skgepnm2.h 2006-04-11 19:19:28.000000000 +0200
4965+++ linux-new/drivers/net/sk98lin/h/skgepnm2.h 2006-01-18 14:37:24.000000000 +0100
4966@@ -1,334 +1,339 @@
4967-/*****************************************************************************
4968- *
4969- * Name: skgepnm2.h
4970- * Project: GEnesis, PCI Gigabit Ethernet Adapter
4971- * Version: $Revision$
4972- * Date: $Date$
4973- * Purpose: Defines for Private Network Management Interface
4974- *
4975- ****************************************************************************/
4976-
4977-/******************************************************************************
4978- *
4979- * (C)Copyright 1998-2002 SysKonnect GmbH.
4980- * (C)Copyright 2002-2003 Marvell.
4981- *
4982- * This program is free software; you can redistribute it and/or modify
4983- * it under the terms of the GNU General Public License as published by
4984- * the Free Software Foundation; either version 2 of the License, or
4985- * (at your option) any later version.
4986- *
4987- * The information in this file is provided "AS IS" without warranty.
4988- *
4989- ******************************************************************************/
4990-
4991-#ifndef _SKGEPNM2_H_
4992-#define _SKGEPNM2_H_
4993-
4994-/*
4995- * General definitions
4996- */
4997-#define SK_PNMI_CHIPSET_XMAC 1 /* XMAC11800FP */
4998-#define SK_PNMI_CHIPSET_YUKON 2 /* YUKON */
4999-
5000-#define SK_PNMI_BUS_PCI 1 /* PCI bus*/
5001-
5002-/*
5003- * Actions
5004- */
5005-#define SK_PNMI_ACT_IDLE 1
5006-#define SK_PNMI_ACT_RESET 2
5007-#define SK_PNMI_ACT_SELFTEST 3
5008-#define SK_PNMI_ACT_RESETCNT 4
5009-
5010-/*
5011- * VPD releated defines
5012- */
5013-
5014-#define SK_PNMI_VPD_RW 1
5015-#define SK_PNMI_VPD_RO 2
5016-
5017-#define SK_PNMI_VPD_OK 0
5018-#define SK_PNMI_VPD_NOTFOUND 1
5019-#define SK_PNMI_VPD_CUT 2
5020-#define SK_PNMI_VPD_TIMEOUT 3
5021-#define SK_PNMI_VPD_FULL 4
5022-#define SK_PNMI_VPD_NOWRITE 5
5023-#define SK_PNMI_VPD_FATAL 6
5024-
5025-#define SK_PNMI_VPD_IGNORE 0
5026-#define SK_PNMI_VPD_CREATE 1
5027-#define SK_PNMI_VPD_DELETE 2
5028-
5029-
5030-/*
5031- * RLMT related defines
5032- */
5033-#define SK_PNMI_DEF_RLMT_CHG_THRES 240 /* 4 changes per minute */
5034-
5035-
5036-/*
5037- * VCT internal status values
5038- */
5039-#define SK_PNMI_VCT_PENDING 32
5040-#define SK_PNMI_VCT_TEST_DONE 64
5041-#define SK_PNMI_VCT_LINK 128
5042-
5043-/*
5044- * Internal table definitions
5045- */
5046-#define SK_PNMI_GET 0
5047-#define SK_PNMI_PRESET 1
5048-#define SK_PNMI_SET 2
5049-
5050-#define SK_PNMI_RO 0
5051-#define SK_PNMI_RW 1
5052-#define SK_PNMI_WO 2
5053-
5054-typedef struct s_OidTabEntry {
5055- SK_U32 Id;
5056- SK_U32 InstanceNo;
5057- unsigned int StructSize;
5058- unsigned int Offset;
5059- int Access;
5060- int (* Func)(SK_AC *pAc, SK_IOC pIo, int action,
5061- SK_U32 Id, char* pBuf, unsigned int* pLen,
5062- SK_U32 Instance, unsigned int TableIndex,
5063- SK_U32 NetNumber);
5064- SK_U16 Param;
5065-} SK_PNMI_TAB_ENTRY;
5066-
5067-
5068-/*
5069- * Trap lengths
5070- */
5071-#define SK_PNMI_TRAP_SIMPLE_LEN 17
5072-#define SK_PNMI_TRAP_SENSOR_LEN_BASE 46
5073-#define SK_PNMI_TRAP_RLMT_CHANGE_LEN 23
5074-#define SK_PNMI_TRAP_RLMT_PORT_LEN 23
5075-
5076-/*
5077- * Number of MAC types supported
5078- */
5079-#define SK_PNMI_MAC_TYPES (SK_MAC_GMAC + 1)
5080-
5081-/*
5082- * MAC statistic data list (overall set for MAC types used)
5083- */
5084-enum SK_MACSTATS {
5085- SK_PNMI_HTX = 0,
5086- SK_PNMI_HTX_OCTET,
5087- SK_PNMI_HTX_OCTETHIGH = SK_PNMI_HTX_OCTET,
5088- SK_PNMI_HTX_OCTETLOW,
5089- SK_PNMI_HTX_BROADCAST,
5090- SK_PNMI_HTX_MULTICAST,
5091- SK_PNMI_HTX_UNICAST,
5092- SK_PNMI_HTX_BURST,
5093- SK_PNMI_HTX_PMACC,
5094- SK_PNMI_HTX_MACC,
5095- SK_PNMI_HTX_COL,
5096- SK_PNMI_HTX_SINGLE_COL,
5097- SK_PNMI_HTX_MULTI_COL,
5098- SK_PNMI_HTX_EXCESS_COL,
5099- SK_PNMI_HTX_LATE_COL,
5100- SK_PNMI_HTX_DEFFERAL,
5101- SK_PNMI_HTX_EXCESS_DEF,
5102- SK_PNMI_HTX_UNDERRUN,
5103- SK_PNMI_HTX_CARRIER,
5104- SK_PNMI_HTX_UTILUNDER,
5105- SK_PNMI_HTX_UTILOVER,
5106- SK_PNMI_HTX_64,
5107- SK_PNMI_HTX_127,
5108- SK_PNMI_HTX_255,
5109- SK_PNMI_HTX_511,
5110- SK_PNMI_HTX_1023,
5111- SK_PNMI_HTX_MAX,
5112- SK_PNMI_HTX_LONGFRAMES,
5113- SK_PNMI_HTX_SYNC,
5114- SK_PNMI_HTX_SYNC_OCTET,
5115- SK_PNMI_HTX_RESERVED,
5116-
5117- SK_PNMI_HRX,
5118- SK_PNMI_HRX_OCTET,
5119- SK_PNMI_HRX_OCTETHIGH = SK_PNMI_HRX_OCTET,
5120- SK_PNMI_HRX_OCTETLOW,
5121- SK_PNMI_HRX_BADOCTET,
5122- SK_PNMI_HRX_BADOCTETHIGH = SK_PNMI_HRX_BADOCTET,
5123- SK_PNMI_HRX_BADOCTETLOW,
5124- SK_PNMI_HRX_BROADCAST,
5125- SK_PNMI_HRX_MULTICAST,
5126- SK_PNMI_HRX_UNICAST,
5127- SK_PNMI_HRX_PMACC,
5128- SK_PNMI_HRX_MACC,
5129- SK_PNMI_HRX_PMACC_ERR,
5130- SK_PNMI_HRX_MACC_UNKWN,
5131- SK_PNMI_HRX_BURST,
5132- SK_PNMI_HRX_MISSED,
5133- SK_PNMI_HRX_FRAMING,
5134- SK_PNMI_HRX_UNDERSIZE,
5135- SK_PNMI_HRX_OVERFLOW,
5136- SK_PNMI_HRX_JABBER,
5137- SK_PNMI_HRX_CARRIER,
5138- SK_PNMI_HRX_IRLENGTH,
5139- SK_PNMI_HRX_SYMBOL,
5140- SK_PNMI_HRX_SHORTS,
5141- SK_PNMI_HRX_RUNT,
5142- SK_PNMI_HRX_TOO_LONG,
5143- SK_PNMI_HRX_FCS,
5144- SK_PNMI_HRX_CEXT,
5145- SK_PNMI_HRX_UTILUNDER,
5146- SK_PNMI_HRX_UTILOVER,
5147- SK_PNMI_HRX_64,
5148- SK_PNMI_HRX_127,
5149- SK_PNMI_HRX_255,
5150- SK_PNMI_HRX_511,
5151- SK_PNMI_HRX_1023,
5152- SK_PNMI_HRX_MAX,
5153- SK_PNMI_HRX_LONGFRAMES,
5154-
5155- SK_PNMI_HRX_RESERVED,
5156-
5157- SK_PNMI_MAX_IDX /* NOTE: Ensure SK_PNMI_CNT_NO is set to this value */
5158-};
5159-
5160-/*
5161- * MAC specific data
5162- */
5163-typedef struct s_PnmiStatAddr {
5164- SK_U16 Reg; /* MAC register containing the value */
5165- SK_BOOL GetOffset; /* TRUE: Offset managed by PNMI (call GetStatVal())*/
5166-} SK_PNMI_STATADDR;
5167-
5168-
5169-/*
5170- * SK_PNMI_STRUCT_DATA copy offset evaluation macros
5171- */
5172-#define SK_PNMI_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_STRUCT_DATA *)0)->e))
5173-#define SK_PNMI_MAI_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_STRUCT_DATA *)0)->e))
5174-#define SK_PNMI_VPD_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_VPD *)0)->e))
5175-#define SK_PNMI_SEN_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_SENSOR *)0)->e))
5176-#define SK_PNMI_CHK_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_CHECKSUM *)0)->e))
5177-#define SK_PNMI_STA_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_STAT *)0)->e))
5178-#define SK_PNMI_CNF_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_CONF *)0)->e))
5179-#define SK_PNMI_RLM_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_RLMT *)0)->e))
5180-#define SK_PNMI_MON_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_RLMT_MONITOR *)0)->e))
5181-#define SK_PNMI_TRP_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_TRAP *)0)->e))
5182-
5183-#define SK_PNMI_SET_STAT(b,s,o) {SK_U32 Val32; char *pVal; \
5184- Val32 = (s); \
5185- pVal = (char *)(b) + ((SK_U32)(SK_UPTR) \
5186- &(((SK_PNMI_STRUCT_DATA *)0)-> \
5187- ReturnStatus.ErrorStatus)); \
5188- SK_PNMI_STORE_U32(pVal, Val32); \
5189- Val32 = (o); \
5190- pVal = (char *)(b) + ((SK_U32)(SK_UPTR) \
5191- &(((SK_PNMI_STRUCT_DATA *)0)-> \
5192- ReturnStatus.ErrorOffset)); \
5193- SK_PNMI_STORE_U32(pVal, Val32);}
5194-
5195-/*
5196- * Time macros
5197- */
5198-#ifndef SK_PNMI_HUNDREDS_SEC
5199-#if SK_TICKS_PER_SEC == 100
5200-#define SK_PNMI_HUNDREDS_SEC(t) (t)
5201-#else
5202-#define SK_PNMI_HUNDREDS_SEC(t) (((t) * 100) / (SK_TICKS_PER_SEC))
5203-#endif /* !SK_TICKS_PER_SEC */
5204-#endif /* !SK_PNMI_HUNDREDS_SEC */
5205-
5206-/*
5207- * Macros to work around alignment problems
5208- */
5209-#ifndef SK_PNMI_STORE_U16
5210-#define SK_PNMI_STORE_U16(p,v) {*(char *)(p) = *((char *)&(v)); \
5211- *((char *)(p) + 1) = \
5212- *(((char *)&(v)) + 1);}
5213-#endif
5214-
5215-#ifndef SK_PNMI_STORE_U32
5216-#define SK_PNMI_STORE_U32(p,v) {*(char *)(p) = *((char *)&(v)); \
5217- *((char *)(p) + 1) = \
5218- *(((char *)&(v)) + 1); \
5219- *((char *)(p) + 2) = \
5220- *(((char *)&(v)) + 2); \
5221- *((char *)(p) + 3) = \
5222- *(((char *)&(v)) + 3);}
5223-#endif
5224-
5225-#ifndef SK_PNMI_STORE_U64
5226-#define SK_PNMI_STORE_U64(p,v) {*(char *)(p) = *((char *)&(v)); \
5227- *((char *)(p) + 1) = \
5228- *(((char *)&(v)) + 1); \
5229- *((char *)(p) + 2) = \
5230- *(((char *)&(v)) + 2); \
5231- *((char *)(p) + 3) = \
5232- *(((char *)&(v)) + 3); \
5233- *((char *)(p) + 4) = \
5234- *(((char *)&(v)) + 4); \
5235- *((char *)(p) + 5) = \
5236- *(((char *)&(v)) + 5); \
5237- *((char *)(p) + 6) = \
5238- *(((char *)&(v)) + 6); \
5239- *((char *)(p) + 7) = \
5240- *(((char *)&(v)) + 7);}
5241-#endif
5242-
5243-#ifndef SK_PNMI_READ_U16
5244-#define SK_PNMI_READ_U16(p,v) {*((char *)&(v)) = *(char *)(p); \
5245- *(((char *)&(v)) + 1) = \
5246- *((char *)(p) + 1);}
5247-#endif
5248-
5249-#ifndef SK_PNMI_READ_U32
5250-#define SK_PNMI_READ_U32(p,v) {*((char *)&(v)) = *(char *)(p); \
5251- *(((char *)&(v)) + 1) = \
5252- *((char *)(p) + 1); \
5253- *(((char *)&(v)) + 2) = \
5254- *((char *)(p) + 2); \
5255- *(((char *)&(v)) + 3) = \
5256- *((char *)(p) + 3);}
5257-#endif
5258-
5259-#ifndef SK_PNMI_READ_U64
5260-#define SK_PNMI_READ_U64(p,v) {*((char *)&(v)) = *(char *)(p); \
5261- *(((char *)&(v)) + 1) = \
5262- *((char *)(p) + 1); \
5263- *(((char *)&(v)) + 2) = \
5264- *((char *)(p) + 2); \
5265- *(((char *)&(v)) + 3) = \
5266- *((char *)(p) + 3); \
5267- *(((char *)&(v)) + 4) = \
5268- *((char *)(p) + 4); \
5269- *(((char *)&(v)) + 5) = \
5270- *((char *)(p) + 5); \
5271- *(((char *)&(v)) + 6) = \
5272- *((char *)(p) + 6); \
5273- *(((char *)&(v)) + 7) = \
5274- *((char *)(p) + 7);}
5275-#endif
5276-
5277-/*
5278- * Macros for Debug
5279- */
5280-#ifdef DEBUG
5281-
5282-#define SK_PNMI_CHECKFLAGS(vSt) {if (pAC->Pnmi.MacUpdatedFlag > 0 || \
5283- pAC->Pnmi.RlmtUpdatedFlag > 0 || \
5284- pAC->Pnmi.SirqUpdatedFlag > 0) { \
5285- SK_DBG_MSG(pAC, \
5286- SK_DBGMOD_PNMI, \
5287- SK_DBGCAT_CTRL, \
5288- ("PNMI: ERR: %s MacUFlag=%d, RlmtUFlag=%d, SirqUFlag=%d\n", \
5289- vSt, \
5290- pAC->Pnmi.MacUpdatedFlag, \
5291- pAC->Pnmi.RlmtUpdatedFlag, \
5292- pAC->Pnmi.SirqUpdatedFlag))}}
5293-
5294-#else /* !DEBUG */
5295-
5296-#define SK_PNMI_CHECKFLAGS(vSt) /* Nothing */
5297-
5298-#endif /* !DEBUG */
5299-
5300-#endif /* _SKGEPNM2_H_ */
5301+/*****************************************************************************\r
5302+ *\r
5303+ * Name: skgepnm2.h\r
5304+ * Project: GEnesis, PCI Gigabit Ethernet Adapter\r
5305+ * Version: $Revision$\r
5306+ * Date: $Date$\r
5307+ * Purpose: Defines for Private Network Management Interface\r
5308+ *\r
5309+ ****************************************************************************/\r
5310+\r
5311+/******************************************************************************\r
5312+ *\r
5313+ * (C)Copyright 1998-2002 SysKonnect GmbH.\r
5314+ * (C)Copyright 2002-2003 Marvell.\r
5315+ *\r
5316+ * This program is free software; you can redistribute it and/or modify\r
5317+ * it under the terms of the GNU General Public License as published by\r
5318+ * the Free Software Foundation; either version 2 of the License, or\r
5319+ * (at your option) any later version.\r
5320+ *\r
5321+ * The information in this file is provided "AS IS" without warranty.\r
5322+ *\r
5323+ ******************************************************************************/\r
5324+\r
5325+#ifndef _SKGEPNM2_H_\r
5326+#define _SKGEPNM2_H_\r
5327+\r
5328+/*\r
5329+ * General definitions\r
5330+ */\r
5331+#define SK_PNMI_CHIPSET_XMAC 1 /* XMAC11800FP */\r
5332+#define SK_PNMI_CHIPSET_YUKON 2 /* YUKON */\r
5333+#define SK_PNMI_CHIPSET_YUKON_LITE 3 /* YUKON-Lite (Rev. A1-A3) */\r
5334+#define SK_PNMI_CHIPSET_YUKON_LP 4 /* YUKON-LP */\r
5335+#define SK_PNMI_CHIPSET_YUKON_XL 5 /* YUKON-2 XL */\r
5336+#define SK_PNMI_CHIPSET_YUKON_EC 6 /* YUKON-2 EC */\r
5337+#define SK_PNMI_CHIPSET_YUKON_FE 7 /* YUKON-2 FE */\r
5338+\r
5339+#define SK_PNMI_BUS_PCI 1 /* PCI bus*/\r
5340+\r
5341+/*\r
5342+ * Actions\r
5343+ */\r
5344+#define SK_PNMI_ACT_IDLE 1\r
5345+#define SK_PNMI_ACT_RESET 2\r
5346+#define SK_PNMI_ACT_SELFTEST 3\r
5347+#define SK_PNMI_ACT_RESETCNT 4\r
5348+\r
5349+/*\r
5350+ * VPD releated defines\r
5351+ */\r
5352+\r
5353+#define SK_PNMI_VPD_RW 1\r
5354+#define SK_PNMI_VPD_RO 2\r
5355+\r
5356+#define SK_PNMI_VPD_OK 0\r
5357+#define SK_PNMI_VPD_NOTFOUND 1\r
5358+#define SK_PNMI_VPD_CUT 2\r
5359+#define SK_PNMI_VPD_TIMEOUT 3\r
5360+#define SK_PNMI_VPD_FULL 4\r
5361+#define SK_PNMI_VPD_NOWRITE 5\r
5362+#define SK_PNMI_VPD_FATAL 6\r
5363+\r
5364+#define SK_PNMI_VPD_IGNORE 0\r
5365+#define SK_PNMI_VPD_CREATE 1\r
5366+#define SK_PNMI_VPD_DELETE 2\r
5367+\r
5368+\r
5369+/*\r
5370+ * RLMT related defines\r
5371+ */\r
5372+#define SK_PNMI_DEF_RLMT_CHG_THRES 240 /* 4 changes per minute */\r
5373+\r
5374+\r
5375+/*\r
5376+ * VCT internal status values\r
5377+ */\r
5378+#define SK_PNMI_VCT_PENDING 0x20\r
5379+#define SK_PNMI_VCT_TEST_DONE 0x40\r
5380+#define SK_PNMI_VCT_LINK 0x80\r
5381+\r
5382+/*\r
5383+ * Internal table definitions\r
5384+ */\r
5385+#define SK_PNMI_GET 0\r
5386+#define SK_PNMI_PRESET 1\r
5387+#define SK_PNMI_SET 2\r
5388+\r
5389+#define SK_PNMI_RO 0\r
5390+#define SK_PNMI_RW 1\r
5391+#define SK_PNMI_WO 2\r
5392+\r
5393+typedef struct s_OidTabEntry {\r
5394+ SK_U32 Id;\r
5395+ SK_U32 InstanceNo;\r
5396+ unsigned int StructSize;\r
5397+ unsigned int Offset;\r
5398+ int Access;\r
5399+ int (* Func)(SK_AC *pAc, SK_IOC pIo, int action,\r
5400+ SK_U32 Id, char* pBuf, unsigned int* pLen,\r
5401+ SK_U32 Instance, unsigned int TableIndex,\r
5402+ SK_U32 NetNumber);\r
5403+ SK_U16 Param;\r
5404+} SK_PNMI_TAB_ENTRY;\r
5405+\r
5406+\r
5407+/*\r
5408+ * Trap lengths\r
5409+ */\r
5410+#define SK_PNMI_TRAP_SIMPLE_LEN 17\r
5411+#define SK_PNMI_TRAP_SENSOR_LEN_BASE 46\r
5412+#define SK_PNMI_TRAP_RLMT_CHANGE_LEN 23\r
5413+#define SK_PNMI_TRAP_RLMT_PORT_LEN 23\r
5414+\r
5415+/*\r
5416+ * Number of MAC types supported\r
5417+ */\r
5418+#define SK_PNMI_MAC_TYPES (SK_MAC_GMAC + 1)\r
5419+\r
5420+/*\r
5421+ * MAC statistic data list (overall set for MAC types used)\r
5422+ */\r
5423+enum SK_MACSTATS {\r
5424+ SK_PNMI_HTX = 0,\r
5425+ SK_PNMI_HTX_OCTET,\r
5426+ SK_PNMI_HTX_OCTETHIGH = SK_PNMI_HTX_OCTET,\r
5427+ SK_PNMI_HTX_OCTETLOW,\r
5428+ SK_PNMI_HTX_BROADCAST,\r
5429+ SK_PNMI_HTX_MULTICAST,\r
5430+ SK_PNMI_HTX_UNICAST,\r
5431+ SK_PNMI_HTX_BURST,\r
5432+ SK_PNMI_HTX_PMACC,\r
5433+ SK_PNMI_HTX_MACC,\r
5434+ SK_PNMI_HTX_COL,\r
5435+ SK_PNMI_HTX_SINGLE_COL,\r
5436+ SK_PNMI_HTX_MULTI_COL,\r
5437+ SK_PNMI_HTX_EXCESS_COL,\r
5438+ SK_PNMI_HTX_LATE_COL,\r
5439+ SK_PNMI_HTX_DEFFERAL,\r
5440+ SK_PNMI_HTX_EXCESS_DEF,\r
5441+ SK_PNMI_HTX_UNDERRUN,\r
5442+ SK_PNMI_HTX_CARRIER,\r
5443+ SK_PNMI_HTX_UTILUNDER,\r
5444+ SK_PNMI_HTX_UTILOVER,\r
5445+ SK_PNMI_HTX_64,\r
5446+ SK_PNMI_HTX_127,\r
5447+ SK_PNMI_HTX_255,\r
5448+ SK_PNMI_HTX_511,\r
5449+ SK_PNMI_HTX_1023,\r
5450+ SK_PNMI_HTX_MAX,\r
5451+ SK_PNMI_HTX_LONGFRAMES,\r
5452+ SK_PNMI_HTX_SYNC,\r
5453+ SK_PNMI_HTX_SYNC_OCTET,\r
5454+ SK_PNMI_HTX_RESERVED,\r
5455+ \r
5456+ SK_PNMI_HRX,\r
5457+ SK_PNMI_HRX_OCTET,\r
5458+ SK_PNMI_HRX_OCTETHIGH = SK_PNMI_HRX_OCTET,\r
5459+ SK_PNMI_HRX_OCTETLOW,\r
5460+ SK_PNMI_HRX_BADOCTET,\r
5461+ SK_PNMI_HRX_BADOCTETHIGH = SK_PNMI_HRX_BADOCTET,\r
5462+ SK_PNMI_HRX_BADOCTETLOW,\r
5463+ SK_PNMI_HRX_BROADCAST,\r
5464+ SK_PNMI_HRX_MULTICAST,\r
5465+ SK_PNMI_HRX_UNICAST,\r
5466+ SK_PNMI_HRX_PMACC,\r
5467+ SK_PNMI_HRX_MACC,\r
5468+ SK_PNMI_HRX_PMACC_ERR,\r
5469+ SK_PNMI_HRX_MACC_UNKWN,\r
5470+ SK_PNMI_HRX_BURST,\r
5471+ SK_PNMI_HRX_MISSED,\r
5472+ SK_PNMI_HRX_FRAMING,\r
5473+ SK_PNMI_HRX_UNDERSIZE,\r
5474+ SK_PNMI_HRX_OVERFLOW,\r
5475+ SK_PNMI_HRX_JABBER,\r
5476+ SK_PNMI_HRX_CARRIER,\r
5477+ SK_PNMI_HRX_IRLENGTH,\r
5478+ SK_PNMI_HRX_SYMBOL,\r
5479+ SK_PNMI_HRX_SHORTS,\r
5480+ SK_PNMI_HRX_RUNT,\r
5481+ SK_PNMI_HRX_TOO_LONG,\r
5482+ SK_PNMI_HRX_FCS,\r
5483+ SK_PNMI_HRX_CEXT,\r
5484+ SK_PNMI_HRX_UTILUNDER,\r
5485+ SK_PNMI_HRX_UTILOVER,\r
5486+ SK_PNMI_HRX_64,\r
5487+ SK_PNMI_HRX_127,\r
5488+ SK_PNMI_HRX_255,\r
5489+ SK_PNMI_HRX_511,\r
5490+ SK_PNMI_HRX_1023,\r
5491+ SK_PNMI_HRX_MAX,\r
5492+ SK_PNMI_HRX_LONGFRAMES,\r
5493+ \r
5494+ SK_PNMI_HRX_RESERVED,\r
5495+ \r
5496+ SK_PNMI_MAX_IDX /* NOTE: Ensure SK_PNMI_CNT_NO is set to this value */\r
5497+};\r
5498+\r
5499+/*\r
5500+ * MAC specific data\r
5501+ */\r
5502+typedef struct s_PnmiStatAddr {\r
5503+ SK_U16 Reg; /* MAC register containing the value */\r
5504+ SK_BOOL GetOffset; /* TRUE: Offset managed by PNMI (call GetStatVal())*/\r
5505+} SK_PNMI_STATADDR;\r
5506+\r
5507+\r
5508+/*\r
5509+ * SK_PNMI_STRUCT_DATA copy offset evaluation macros\r
5510+ */\r
5511+#define SK_PNMI_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_STRUCT_DATA *)0)->e))\r
5512+#define SK_PNMI_MAI_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_STRUCT_DATA *)0)->e))\r
5513+#define SK_PNMI_VPD_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_VPD *)0)->e))\r
5514+#define SK_PNMI_SEN_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_SENSOR *)0)->e))\r
5515+#define SK_PNMI_CHK_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_CHECKSUM *)0)->e))\r
5516+#define SK_PNMI_STA_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_STAT *)0)->e))\r
5517+#define SK_PNMI_CNF_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_CONF *)0)->e))\r
5518+#define SK_PNMI_RLM_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_RLMT *)0)->e))\r
5519+#define SK_PNMI_MON_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_RLMT_MONITOR *)0)->e))\r
5520+#define SK_PNMI_TRP_OFF(e) ((SK_U32)(SK_UPTR)&(((SK_PNMI_TRAP *)0)->e))\r
5521+\r
5522+#define SK_PNMI_SET_STAT(b,s,o) {SK_U32 Val32; char *pVal; \\r
5523+ Val32 = (s); \\r
5524+ pVal = (char *)(b) + ((SK_U32)(SK_UPTR) \\r
5525+ &(((SK_PNMI_STRUCT_DATA *)0)-> \\r
5526+ ReturnStatus.ErrorStatus)); \\r
5527+ SK_PNMI_STORE_U32(pVal, Val32); \\r
5528+ Val32 = (o); \\r
5529+ pVal = (char *)(b) + ((SK_U32)(SK_UPTR) \\r
5530+ &(((SK_PNMI_STRUCT_DATA *)0)-> \\r
5531+ ReturnStatus.ErrorOffset)); \\r
5532+ SK_PNMI_STORE_U32(pVal, Val32);}\r
5533+\r
5534+/*\r
5535+ * Time macros\r
5536+ */\r
5537+#ifndef SK_PNMI_HUNDREDS_SEC\r
5538+#if SK_TICKS_PER_SEC == 100\r
5539+#define SK_PNMI_HUNDREDS_SEC(t) (t)\r
5540+#else\r
5541+#define SK_PNMI_HUNDREDS_SEC(t) (((t) * 100) / (SK_TICKS_PER_SEC))\r
5542+#endif /* !SK_TICKS_PER_SEC */\r
5543+#endif /* !SK_PNMI_HUNDREDS_SEC */\r
5544+\r
5545+/*\r
5546+ * Macros to work around alignment problems\r
5547+ */\r
5548+#ifndef SK_PNMI_STORE_U16\r
5549+#define SK_PNMI_STORE_U16(p,v) {*(char *)(p) = *((char *)&(v)); \\r
5550+ *((char *)(p) + 1) = \\r
5551+ *(((char *)&(v)) + 1);}\r
5552+#endif\r
5553+\r
5554+#ifndef SK_PNMI_STORE_U32\r
5555+#define SK_PNMI_STORE_U32(p,v) {*(char *)(p) = *((char *)&(v)); \\r
5556+ *((char *)(p) + 1) = \\r
5557+ *(((char *)&(v)) + 1); \\r
5558+ *((char *)(p) + 2) = \\r
5559+ *(((char *)&(v)) + 2); \\r
5560+ *((char *)(p) + 3) = \\r
5561+ *(((char *)&(v)) + 3);}\r
5562+#endif\r
5563+\r
5564+#ifndef SK_PNMI_STORE_U64\r
5565+#define SK_PNMI_STORE_U64(p,v) {*(char *)(p) = *((char *)&(v)); \\r
5566+ *((char *)(p) + 1) = \\r
5567+ *(((char *)&(v)) + 1); \\r
5568+ *((char *)(p) + 2) = \\r
5569+ *(((char *)&(v)) + 2); \\r
5570+ *((char *)(p) + 3) = \\r
5571+ *(((char *)&(v)) + 3); \\r
5572+ *((char *)(p) + 4) = \\r
5573+ *(((char *)&(v)) + 4); \\r
5574+ *((char *)(p) + 5) = \\r
5575+ *(((char *)&(v)) + 5); \\r
5576+ *((char *)(p) + 6) = \\r
5577+ *(((char *)&(v)) + 6); \\r
5578+ *((char *)(p) + 7) = \\r
5579+ *(((char *)&(v)) + 7);}\r
5580+#endif\r
5581+\r
5582+#ifndef SK_PNMI_READ_U16\r
5583+#define SK_PNMI_READ_U16(p,v) {*((char *)&(v)) = *(char *)(p); \\r
5584+ *(((char *)&(v)) + 1) = \\r
5585+ *((char *)(p) + 1);}\r
5586+#endif\r
5587+\r
5588+#ifndef SK_PNMI_READ_U32\r
5589+#define SK_PNMI_READ_U32(p,v) {*((char *)&(v)) = *(char *)(p); \\r
5590+ *(((char *)&(v)) + 1) = \\r
5591+ *((char *)(p) + 1); \\r
5592+ *(((char *)&(v)) + 2) = \\r
5593+ *((char *)(p) + 2); \\r
5594+ *(((char *)&(v)) + 3) = \\r
5595+ *((char *)(p) + 3);}\r
5596+#endif\r
5597+\r
5598+#ifndef SK_PNMI_READ_U64\r
5599+#define SK_PNMI_READ_U64(p,v) {*((char *)&(v)) = *(char *)(p); \\r
5600+ *(((char *)&(v)) + 1) = \\r
5601+ *((char *)(p) + 1); \\r
5602+ *(((char *)&(v)) + 2) = \\r
5603+ *((char *)(p) + 2); \\r
5604+ *(((char *)&(v)) + 3) = \\r
5605+ *((char *)(p) + 3); \\r
5606+ *(((char *)&(v)) + 4) = \\r
5607+ *((char *)(p) + 4); \\r
5608+ *(((char *)&(v)) + 5) = \\r
5609+ *((char *)(p) + 5); \\r
5610+ *(((char *)&(v)) + 6) = \\r
5611+ *((char *)(p) + 6); \\r
5612+ *(((char *)&(v)) + 7) = \\r
5613+ *((char *)(p) + 7);}\r
5614+#endif\r
5615+\r
5616+/*\r
5617+ * Macros for Debug\r
5618+ */\r
5619+#ifdef DEBUG\r
5620+\r
5621+#define SK_PNMI_CHECKFLAGS(vSt) {if (pAC->Pnmi.MacUpdatedFlag > 0 || \\r
5622+ pAC->Pnmi.RlmtUpdatedFlag > 0 || \\r
5623+ pAC->Pnmi.SirqUpdatedFlag > 0) { \\r
5624+ SK_DBG_MSG(pAC, \\r
5625+ SK_DBGMOD_PNMI, \\r
5626+ SK_DBGCAT_CTRL, \\r
5627+ ("PNMI: ERR: %s MacUFlag=%d, RlmtUFlag=%d, SirqUFlag=%d\n", \\r
5628+ vSt, \\r
5629+ pAC->Pnmi.MacUpdatedFlag, \\r
5630+ pAC->Pnmi.RlmtUpdatedFlag, \\r
5631+ pAC->Pnmi.SirqUpdatedFlag));}}\r
5632+\r
5633+#else /* !DEBUG */\r
5634+\r
5635+#define SK_PNMI_CHECKFLAGS(vSt) /* Nothing */\r
5636+\r
5637+#endif /* !DEBUG */\r
5638+\r
5639+#endif /* _SKGEPNM2_H_ */\r
5640diff -ruN linux/drivers/net/sk98lin/h/skgepnmi.h linux-new/drivers/net/sk98lin/h/skgepnmi.h
5641--- linux/drivers/net/sk98lin/h/skgepnmi.h 2006-04-11 19:19:28.000000000 +0200
5642+++ linux-new/drivers/net/sk98lin/h/skgepnmi.h 2006-01-18 14:37:24.000000000 +0100
5643@@ -1,966 +1,1019 @@
5644-/*****************************************************************************
5645- *
5646- * Name: skgepnmi.h
5647- * Project: GEnesis, PCI Gigabit Ethernet Adapter
5648- * Version: $Revision$
5649- * Date: $Date$
5650- * Purpose: Defines for Private Network Management Interface
5651- *
5652- ****************************************************************************/
5653-
5654-/******************************************************************************
5655- *
5656- * (C)Copyright 1998-2002 SysKonnect GmbH.
5657- * (C)Copyright 2002-2003 Marvell.
5658- *
5659- * This program is free software; you can redistribute it and/or modify
5660- * it under the terms of the GNU General Public License as published by
5661- * the Free Software Foundation; either version 2 of the License, or
5662- * (at your option) any later version.
5663- *
5664- * The information in this file is provided "AS IS" without warranty.
5665- *
5666- ******************************************************************************/
5667-
5668-#ifndef _SKGEPNMI_H_
5669-#define _SKGEPNMI_H_
5670-
5671-/*
5672- * Include dependencies
5673- */
5674-#include "h/sktypes.h"
5675-#include "h/skerror.h"
5676-#include "h/sktimer.h"
5677-#include "h/ski2c.h"
5678-#include "h/skaddr.h"
5679-#include "h/skrlmt.h"
5680-#include "h/skvpd.h"
5681-
5682-/*
5683- * Management Database Version
5684- */
5685-#define SK_PNMI_MDB_VERSION 0x00030001 /* 3.1 */
5686-
5687-
5688-/*
5689- * Event definitions
5690- */
5691-#define SK_PNMI_EVT_SIRQ_OVERFLOW 1 /* Counter overflow */
5692-#define SK_PNMI_EVT_SEN_WAR_LOW 2 /* Lower war thres exceeded */
5693-#define SK_PNMI_EVT_SEN_WAR_UPP 3 /* Upper war thres exceeded */
5694-#define SK_PNMI_EVT_SEN_ERR_LOW 4 /* Lower err thres exceeded */
5695-#define SK_PNMI_EVT_SEN_ERR_UPP 5 /* Upper err thres exceeded */
5696-#define SK_PNMI_EVT_CHG_EST_TIMER 6 /* Timer event for RLMT Chg */
5697-#define SK_PNMI_EVT_UTILIZATION_TIMER 7 /* Timer event for Utiliza. */
5698-#define SK_PNMI_EVT_CLEAR_COUNTER 8 /* Clear statistic counters */
5699-#define SK_PNMI_EVT_XMAC_RESET 9 /* XMAC will be reset */
5700-
5701-#define SK_PNMI_EVT_RLMT_PORT_UP 10 /* Port came logically up */
5702-#define SK_PNMI_EVT_RLMT_PORT_DOWN 11 /* Port went logically down */
5703-#define SK_PNMI_EVT_RLMT_SEGMENTATION 13 /* Two SP root bridges found */
5704-#define SK_PNMI_EVT_RLMT_ACTIVE_DOWN 14 /* Port went logically down */
5705-#define SK_PNMI_EVT_RLMT_ACTIVE_UP 15 /* Port came logically up */
5706-#define SK_PNMI_EVT_RLMT_SET_NETS 16 /* 1. Parameter is number of nets
5707- 1 = single net; 2 = dual net */
5708-#define SK_PNMI_EVT_VCT_RESET 17 /* VCT port reset timer event started with SET. */
5709-
5710-
5711-/*
5712- * Return values
5713- */
5714-#define SK_PNMI_ERR_OK 0
5715-#define SK_PNMI_ERR_GENERAL 1
5716-#define SK_PNMI_ERR_TOO_SHORT 2
5717-#define SK_PNMI_ERR_BAD_VALUE 3
5718-#define SK_PNMI_ERR_READ_ONLY 4
5719-#define SK_PNMI_ERR_UNKNOWN_OID 5
5720-#define SK_PNMI_ERR_UNKNOWN_INST 6
5721-#define SK_PNMI_ERR_UNKNOWN_NET 7
5722-#define SK_PNMI_ERR_NOT_SUPPORTED 10
5723-
5724-
5725-/*
5726- * Return values of driver reset function SK_DRIVER_RESET() and
5727- * driver event function SK_DRIVER_EVENT()
5728- */
5729-#define SK_PNMI_ERR_OK 0
5730-#define SK_PNMI_ERR_FAIL 1
5731-
5732-
5733-/*
5734- * Return values of driver test function SK_DRIVER_SELFTEST()
5735- */
5736-#define SK_PNMI_TST_UNKNOWN (1 << 0)
5737-#define SK_PNMI_TST_TRANCEIVER (1 << 1)
5738-#define SK_PNMI_TST_ASIC (1 << 2)
5739-#define SK_PNMI_TST_SENSOR (1 << 3)
5740-#define SK_PNMI_TST_POWERMGMT (1 << 4)
5741-#define SK_PNMI_TST_PCI (1 << 5)
5742-#define SK_PNMI_TST_MAC (1 << 6)
5743-
5744-
5745-/*
5746- * RLMT specific definitions
5747- */
5748-#define SK_PNMI_RLMT_STATUS_STANDBY 1
5749-#define SK_PNMI_RLMT_STATUS_ACTIVE 2
5750-#define SK_PNMI_RLMT_STATUS_ERROR 3
5751-
5752-#define SK_PNMI_RLMT_LSTAT_PHY_DOWN 1
5753-#define SK_PNMI_RLMT_LSTAT_AUTONEG 2
5754-#define SK_PNMI_RLMT_LSTAT_LOG_DOWN 3
5755-#define SK_PNMI_RLMT_LSTAT_LOG_UP 4
5756-#define SK_PNMI_RLMT_LSTAT_INDETERMINATED 5
5757-
5758-#define SK_PNMI_RLMT_MODE_CHK_LINK (SK_RLMT_CHECK_LINK)
5759-#define SK_PNMI_RLMT_MODE_CHK_RX (SK_RLMT_CHECK_LOC_LINK)
5760-#define SK_PNMI_RLMT_MODE_CHK_SPT (SK_RLMT_CHECK_SEG)
5761-/* #define SK_PNMI_RLMT_MODE_CHK_EX */
5762-
5763-/*
5764- * OID definition
5765- */
5766-#ifndef _NDIS_ /* Check, whether NDIS already included OIDs */
5767-
5768-#define OID_GEN_XMIT_OK 0x00020101
5769-#define OID_GEN_RCV_OK 0x00020102
5770-#define OID_GEN_XMIT_ERROR 0x00020103
5771-#define OID_GEN_RCV_ERROR 0x00020104
5772-#define OID_GEN_RCV_NO_BUFFER 0x00020105
5773-
5774-/* #define OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 */
5775-#define OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202
5776-/* #define OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 */
5777-#define OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204
5778-/* #define OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 */
5779-#define OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206
5780-/* #define OID_GEN_DIRECTED_BYTES_RCV 0x00020207 */
5781-#define OID_GEN_DIRECTED_FRAMES_RCV 0x00020208
5782-/* #define OID_GEN_MULTICAST_BYTES_RCV 0x00020209 */
5783-#define OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A
5784-/* #define OID_GEN_BROADCAST_BYTES_RCV 0x0002020B */
5785-#define OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C
5786-#define OID_GEN_RCV_CRC_ERROR 0x0002020D
5787-#define OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E
5788-
5789-#define OID_802_3_PERMANENT_ADDRESS 0x01010101
5790-#define OID_802_3_CURRENT_ADDRESS 0x01010102
5791-/* #define OID_802_3_MULTICAST_LIST 0x01010103 */
5792-/* #define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 */
5793-/* #define OID_802_3_MAC_OPTIONS 0x01010105 */
5794-
5795-#define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101
5796-#define OID_802_3_XMIT_ONE_COLLISION 0x01020102
5797-#define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103
5798-#define OID_802_3_XMIT_DEFERRED 0x01020201
5799-#define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202
5800-#define OID_802_3_RCV_OVERRUN 0x01020203
5801-#define OID_802_3_XMIT_UNDERRUN 0x01020204
5802-#define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206
5803-#define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207
5804-
5805-/*
5806- * PnP and PM OIDs
5807- */
5808-#ifdef SK_POWER_MGMT
5809-#define OID_PNP_CAPABILITIES 0xFD010100
5810-#define OID_PNP_SET_POWER 0xFD010101
5811-#define OID_PNP_QUERY_POWER 0xFD010102
5812-#define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103
5813-#define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104
5814-#define OID_PNP_ENABLE_WAKE_UP 0xFD010106
5815-#endif /* SK_POWER_MGMT */
5816-
5817-#endif /* _NDIS_ */
5818-
5819-#define OID_SKGE_MDB_VERSION 0xFF010100
5820-#define OID_SKGE_SUPPORTED_LIST 0xFF010101
5821-#define OID_SKGE_VPD_FREE_BYTES 0xFF010102
5822-#define OID_SKGE_VPD_ENTRIES_LIST 0xFF010103
5823-#define OID_SKGE_VPD_ENTRIES_NUMBER 0xFF010104
5824-#define OID_SKGE_VPD_KEY 0xFF010105
5825-#define OID_SKGE_VPD_VALUE 0xFF010106
5826-#define OID_SKGE_VPD_ACCESS 0xFF010107
5827-#define OID_SKGE_VPD_ACTION 0xFF010108
5828-
5829-#define OID_SKGE_PORT_NUMBER 0xFF010110
5830-#define OID_SKGE_DEVICE_TYPE 0xFF010111
5831-#define OID_SKGE_DRIVER_DESCR 0xFF010112
5832-#define OID_SKGE_DRIVER_VERSION 0xFF010113
5833-#define OID_SKGE_HW_DESCR 0xFF010114
5834-#define OID_SKGE_HW_VERSION 0xFF010115
5835-#define OID_SKGE_CHIPSET 0xFF010116
5836-#define OID_SKGE_ACTION 0xFF010117
5837-#define OID_SKGE_RESULT 0xFF010118
5838-#define OID_SKGE_BUS_TYPE 0xFF010119
5839-#define OID_SKGE_BUS_SPEED 0xFF01011A
5840-#define OID_SKGE_BUS_WIDTH 0xFF01011B
5841-/* 0xFF01011C unused */
5842-#define OID_SKGE_DIAG_ACTION 0xFF01011D
5843-#define OID_SKGE_DIAG_RESULT 0xFF01011E
5844-#define OID_SKGE_MTU 0xFF01011F
5845-#define OID_SKGE_PHYS_CUR_ADDR 0xFF010120
5846-#define OID_SKGE_PHYS_FAC_ADDR 0xFF010121
5847-#define OID_SKGE_PMD 0xFF010122
5848-#define OID_SKGE_CONNECTOR 0xFF010123
5849-#define OID_SKGE_LINK_CAP 0xFF010124
5850-#define OID_SKGE_LINK_MODE 0xFF010125
5851-#define OID_SKGE_LINK_MODE_STATUS 0xFF010126
5852-#define OID_SKGE_LINK_STATUS 0xFF010127
5853-#define OID_SKGE_FLOWCTRL_CAP 0xFF010128
5854-#define OID_SKGE_FLOWCTRL_MODE 0xFF010129
5855-#define OID_SKGE_FLOWCTRL_STATUS 0xFF01012A
5856-#define OID_SKGE_PHY_OPERATION_CAP 0xFF01012B
5857-#define OID_SKGE_PHY_OPERATION_MODE 0xFF01012C
5858-#define OID_SKGE_PHY_OPERATION_STATUS 0xFF01012D
5859-#define OID_SKGE_MULTICAST_LIST 0xFF01012E
5860-#define OID_SKGE_CURRENT_PACKET_FILTER 0xFF01012F
5861-
5862-#define OID_SKGE_TRAP 0xFF010130
5863-#define OID_SKGE_TRAP_NUMBER 0xFF010131
5864-
5865-#define OID_SKGE_RLMT_MODE 0xFF010140
5866-#define OID_SKGE_RLMT_PORT_NUMBER 0xFF010141
5867-#define OID_SKGE_RLMT_PORT_ACTIVE 0xFF010142
5868-#define OID_SKGE_RLMT_PORT_PREFERRED 0xFF010143
5869-#define OID_SKGE_INTERMEDIATE_SUPPORT 0xFF010160
5870-
5871-#define OID_SKGE_SPEED_CAP 0xFF010170
5872-#define OID_SKGE_SPEED_MODE 0xFF010171
5873-#define OID_SKGE_SPEED_STATUS 0xFF010172
5874-
5875-#define OID_SKGE_BOARDLEVEL 0xFF010180
5876-
5877-#define OID_SKGE_SENSOR_NUMBER 0xFF020100
5878-#define OID_SKGE_SENSOR_INDEX 0xFF020101
5879-#define OID_SKGE_SENSOR_DESCR 0xFF020102
5880-#define OID_SKGE_SENSOR_TYPE 0xFF020103
5881-#define OID_SKGE_SENSOR_VALUE 0xFF020104
5882-#define OID_SKGE_SENSOR_WAR_THRES_LOW 0xFF020105
5883-#define OID_SKGE_SENSOR_WAR_THRES_UPP 0xFF020106
5884-#define OID_SKGE_SENSOR_ERR_THRES_LOW 0xFF020107
5885-#define OID_SKGE_SENSOR_ERR_THRES_UPP 0xFF020108
5886-#define OID_SKGE_SENSOR_STATUS 0xFF020109
5887-#define OID_SKGE_SENSOR_WAR_CTS 0xFF02010A
5888-#define OID_SKGE_SENSOR_ERR_CTS 0xFF02010B
5889-#define OID_SKGE_SENSOR_WAR_TIME 0xFF02010C
5890-#define OID_SKGE_SENSOR_ERR_TIME 0xFF02010D
5891-
5892-#define OID_SKGE_CHKSM_NUMBER 0xFF020110
5893-#define OID_SKGE_CHKSM_RX_OK_CTS 0xFF020111
5894-#define OID_SKGE_CHKSM_RX_UNABLE_CTS 0xFF020112
5895-#define OID_SKGE_CHKSM_RX_ERR_CTS 0xFF020113
5896-#define OID_SKGE_CHKSM_TX_OK_CTS 0xFF020114
5897-#define OID_SKGE_CHKSM_TX_UNABLE_CTS 0xFF020115
5898-
5899-#define OID_SKGE_STAT_TX 0xFF020120
5900-#define OID_SKGE_STAT_TX_OCTETS 0xFF020121
5901-#define OID_SKGE_STAT_TX_BROADCAST 0xFF020122
5902-#define OID_SKGE_STAT_TX_MULTICAST 0xFF020123
5903-#define OID_SKGE_STAT_TX_UNICAST 0xFF020124
5904-#define OID_SKGE_STAT_TX_LONGFRAMES 0xFF020125
5905-#define OID_SKGE_STAT_TX_BURST 0xFF020126
5906-#define OID_SKGE_STAT_TX_PFLOWC 0xFF020127
5907-#define OID_SKGE_STAT_TX_FLOWC 0xFF020128
5908-#define OID_SKGE_STAT_TX_SINGLE_COL 0xFF020129
5909-#define OID_SKGE_STAT_TX_MULTI_COL 0xFF02012A
5910-#define OID_SKGE_STAT_TX_EXCESS_COL 0xFF02012B
5911-#define OID_SKGE_STAT_TX_LATE_COL 0xFF02012C
5912-#define OID_SKGE_STAT_TX_DEFFERAL 0xFF02012D
5913-#define OID_SKGE_STAT_TX_EXCESS_DEF 0xFF02012E
5914-#define OID_SKGE_STAT_TX_UNDERRUN 0xFF02012F
5915-#define OID_SKGE_STAT_TX_CARRIER 0xFF020130
5916-/* #define OID_SKGE_STAT_TX_UTIL 0xFF020131 */
5917-#define OID_SKGE_STAT_TX_64 0xFF020132
5918-#define OID_SKGE_STAT_TX_127 0xFF020133
5919-#define OID_SKGE_STAT_TX_255 0xFF020134
5920-#define OID_SKGE_STAT_TX_511 0xFF020135
5921-#define OID_SKGE_STAT_TX_1023 0xFF020136
5922-#define OID_SKGE_STAT_TX_MAX 0xFF020137
5923-#define OID_SKGE_STAT_TX_SYNC 0xFF020138
5924-#define OID_SKGE_STAT_TX_SYNC_OCTETS 0xFF020139
5925-#define OID_SKGE_STAT_RX 0xFF02013A
5926-#define OID_SKGE_STAT_RX_OCTETS 0xFF02013B
5927-#define OID_SKGE_STAT_RX_BROADCAST 0xFF02013C
5928-#define OID_SKGE_STAT_RX_MULTICAST 0xFF02013D
5929-#define OID_SKGE_STAT_RX_UNICAST 0xFF02013E
5930-#define OID_SKGE_STAT_RX_PFLOWC 0xFF02013F
5931-#define OID_SKGE_STAT_RX_FLOWC 0xFF020140
5932-#define OID_SKGE_STAT_RX_PFLOWC_ERR 0xFF020141
5933-#define OID_SKGE_STAT_RX_FLOWC_UNKWN 0xFF020142
5934-#define OID_SKGE_STAT_RX_BURST 0xFF020143
5935-#define OID_SKGE_STAT_RX_MISSED 0xFF020144
5936-#define OID_SKGE_STAT_RX_FRAMING 0xFF020145
5937-#define OID_SKGE_STAT_RX_OVERFLOW 0xFF020146
5938-#define OID_SKGE_STAT_RX_JABBER 0xFF020147
5939-#define OID_SKGE_STAT_RX_CARRIER 0xFF020148
5940-#define OID_SKGE_STAT_RX_IR_LENGTH 0xFF020149
5941-#define OID_SKGE_STAT_RX_SYMBOL 0xFF02014A
5942-#define OID_SKGE_STAT_RX_SHORTS 0xFF02014B
5943-#define OID_SKGE_STAT_RX_RUNT 0xFF02014C
5944-#define OID_SKGE_STAT_RX_CEXT 0xFF02014D
5945-#define OID_SKGE_STAT_RX_TOO_LONG 0xFF02014E
5946-#define OID_SKGE_STAT_RX_FCS 0xFF02014F
5947-/* #define OID_SKGE_STAT_RX_UTIL 0xFF020150 */
5948-#define OID_SKGE_STAT_RX_64 0xFF020151
5949-#define OID_SKGE_STAT_RX_127 0xFF020152
5950-#define OID_SKGE_STAT_RX_255 0xFF020153
5951-#define OID_SKGE_STAT_RX_511 0xFF020154
5952-#define OID_SKGE_STAT_RX_1023 0xFF020155
5953-#define OID_SKGE_STAT_RX_MAX 0xFF020156
5954-#define OID_SKGE_STAT_RX_LONGFRAMES 0xFF020157
5955-
5956-#define OID_SKGE_RLMT_CHANGE_CTS 0xFF020160
5957-#define OID_SKGE_RLMT_CHANGE_TIME 0xFF020161
5958-#define OID_SKGE_RLMT_CHANGE_ESTIM 0xFF020162
5959-#define OID_SKGE_RLMT_CHANGE_THRES 0xFF020163
5960-
5961-#define OID_SKGE_RLMT_PORT_INDEX 0xFF020164
5962-#define OID_SKGE_RLMT_STATUS 0xFF020165
5963-#define OID_SKGE_RLMT_TX_HELLO_CTS 0xFF020166
5964-#define OID_SKGE_RLMT_RX_HELLO_CTS 0xFF020167
5965-#define OID_SKGE_RLMT_TX_SP_REQ_CTS 0xFF020168
5966-#define OID_SKGE_RLMT_RX_SP_CTS 0xFF020169
5967-
5968-#define OID_SKGE_RLMT_MONITOR_NUMBER 0xFF010150
5969-#define OID_SKGE_RLMT_MONITOR_INDEX 0xFF010151
5970-#define OID_SKGE_RLMT_MONITOR_ADDR 0xFF010152
5971-#define OID_SKGE_RLMT_MONITOR_ERRS 0xFF010153
5972-#define OID_SKGE_RLMT_MONITOR_TIMESTAMP 0xFF010154
5973-#define OID_SKGE_RLMT_MONITOR_ADMIN 0xFF010155
5974-
5975-#define OID_SKGE_TX_SW_QUEUE_LEN 0xFF020170
5976-#define OID_SKGE_TX_SW_QUEUE_MAX 0xFF020171
5977-#define OID_SKGE_TX_RETRY 0xFF020172
5978-#define OID_SKGE_RX_INTR_CTS 0xFF020173
5979-#define OID_SKGE_TX_INTR_CTS 0xFF020174
5980-#define OID_SKGE_RX_NO_BUF_CTS 0xFF020175
5981-#define OID_SKGE_TX_NO_BUF_CTS 0xFF020176
5982-#define OID_SKGE_TX_USED_DESCR_NO 0xFF020177
5983-#define OID_SKGE_RX_DELIVERED_CTS 0xFF020178
5984-#define OID_SKGE_RX_OCTETS_DELIV_CTS 0xFF020179
5985-#define OID_SKGE_RX_HW_ERROR_CTS 0xFF02017A
5986-#define OID_SKGE_TX_HW_ERROR_CTS 0xFF02017B
5987-#define OID_SKGE_IN_ERRORS_CTS 0xFF02017C
5988-#define OID_SKGE_OUT_ERROR_CTS 0xFF02017D
5989-#define OID_SKGE_ERR_RECOVERY_CTS 0xFF02017E
5990-#define OID_SKGE_SYSUPTIME 0xFF02017F
5991-
5992-#define OID_SKGE_ALL_DATA 0xFF020190
5993-
5994-/* Defines for VCT. */
5995-#define OID_SKGE_VCT_GET 0xFF020200
5996-#define OID_SKGE_VCT_SET 0xFF020201
5997-#define OID_SKGE_VCT_STATUS 0xFF020202
5998-
5999-#ifdef SK_DIAG_SUPPORT
6000-/* Defines for driver DIAG mode. */
6001-#define OID_SKGE_DIAG_MODE 0xFF020204
6002-#endif /* SK_DIAG_SUPPORT */
6003-
6004-/* New OIDs */
6005-#define OID_SKGE_DRIVER_RELDATE 0xFF020210
6006-#define OID_SKGE_DRIVER_FILENAME 0xFF020211
6007-#define OID_SKGE_CHIPID 0xFF020212
6008-#define OID_SKGE_RAMSIZE 0xFF020213
6009-#define OID_SKGE_VAUXAVAIL 0xFF020214
6010-#define OID_SKGE_PHY_TYPE 0xFF020215
6011-#define OID_SKGE_PHY_LP_MODE 0xFF020216
6012-
6013-/* VCT struct to store a backup copy of VCT data after a port reset. */
6014-typedef struct s_PnmiVct {
6015- SK_U8 VctStatus;
6016- SK_U8 PCableLen;
6017- SK_U32 PMdiPairLen[4];
6018- SK_U8 PMdiPairSts[4];
6019-} SK_PNMI_VCT;
6020-
6021-
6022-/* VCT status values (to be given to CPA via OID_SKGE_VCT_STATUS). */
6023-#define SK_PNMI_VCT_NONE 0
6024-#define SK_PNMI_VCT_OLD_VCT_DATA 1
6025-#define SK_PNMI_VCT_NEW_VCT_DATA 2
6026-#define SK_PNMI_VCT_OLD_DSP_DATA 4
6027-#define SK_PNMI_VCT_NEW_DSP_DATA 8
6028-#define SK_PNMI_VCT_RUNNING 16
6029-
6030-
6031-/* VCT cable test status. */
6032-#define SK_PNMI_VCT_NORMAL_CABLE 0
6033-#define SK_PNMI_VCT_SHORT_CABLE 1
6034-#define SK_PNMI_VCT_OPEN_CABLE 2
6035-#define SK_PNMI_VCT_TEST_FAIL 3
6036-#define SK_PNMI_VCT_IMPEDANCE_MISMATCH 4
6037-
6038-#define OID_SKGE_TRAP_SEN_WAR_LOW 500
6039-#define OID_SKGE_TRAP_SEN_WAR_UPP 501
6040-#define OID_SKGE_TRAP_SEN_ERR_LOW 502
6041-#define OID_SKGE_TRAP_SEN_ERR_UPP 503
6042-#define OID_SKGE_TRAP_RLMT_CHANGE_THRES 520
6043-#define OID_SKGE_TRAP_RLMT_CHANGE_PORT 521
6044-#define OID_SKGE_TRAP_RLMT_PORT_DOWN 522
6045-#define OID_SKGE_TRAP_RLMT_PORT_UP 523
6046-#define OID_SKGE_TRAP_RLMT_SEGMENTATION 524
6047-
6048-#ifdef SK_DIAG_SUPPORT
6049-/* Defines for driver DIAG mode. */
6050-#define SK_DIAG_ATTACHED 2
6051-#define SK_DIAG_RUNNING 1
6052-#define SK_DIAG_IDLE 0
6053-#endif /* SK_DIAG_SUPPORT */
6054-
6055-/*
6056- * Generic PNMI IOCTL subcommand definitions.
6057- */
6058-#define SK_GET_SINGLE_VAR 1
6059-#define SK_SET_SINGLE_VAR 2
6060-#define SK_PRESET_SINGLE_VAR 3
6061-#define SK_GET_FULL_MIB 4
6062-#define SK_SET_FULL_MIB 5
6063-#define SK_PRESET_FULL_MIB 6
6064-
6065-
6066-/*
6067- * Define error numbers and messages for syslog
6068- */
6069-#define SK_PNMI_ERR001 (SK_ERRBASE_PNMI + 1)
6070-#define SK_PNMI_ERR001MSG "SkPnmiGetStruct: Unknown OID"
6071-#define SK_PNMI_ERR002 (SK_ERRBASE_PNMI + 2)
6072-#define SK_PNMI_ERR002MSG "SkPnmiGetStruct: Cannot read VPD keys"
6073-#define SK_PNMI_ERR003 (SK_ERRBASE_PNMI + 3)
6074-#define SK_PNMI_ERR003MSG "OidStruct: Called with wrong OID"
6075-#define SK_PNMI_ERR004 (SK_ERRBASE_PNMI + 4)
6076-#define SK_PNMI_ERR004MSG "OidStruct: Called with wrong action"
6077-#define SK_PNMI_ERR005 (SK_ERRBASE_PNMI + 5)
6078-#define SK_PNMI_ERR005MSG "Perform: Cannot reset driver"
6079-#define SK_PNMI_ERR006 (SK_ERRBASE_PNMI + 6)
6080-#define SK_PNMI_ERR006MSG "Perform: Unknown OID action command"
6081-#define SK_PNMI_ERR007 (SK_ERRBASE_PNMI + 7)
6082-#define SK_PNMI_ERR007MSG "General: Driver description not initialized"
6083-#define SK_PNMI_ERR008 (SK_ERRBASE_PNMI + 8)
6084-#define SK_PNMI_ERR008MSG "Addr: Tried to get unknown OID"
6085-#define SK_PNMI_ERR009 (SK_ERRBASE_PNMI + 9)
6086-#define SK_PNMI_ERR009MSG "Addr: Unknown OID"
6087-#define SK_PNMI_ERR010 (SK_ERRBASE_PNMI + 10)
6088-#define SK_PNMI_ERR010MSG "CsumStat: Unknown OID"
6089-#define SK_PNMI_ERR011 (SK_ERRBASE_PNMI + 11)
6090-#define SK_PNMI_ERR011MSG "SensorStat: Sensor descr string too long"
6091-#define SK_PNMI_ERR012 (SK_ERRBASE_PNMI + 12)
6092-#define SK_PNMI_ERR012MSG "SensorStat: Unknown OID"
6093-#define SK_PNMI_ERR013 (SK_ERRBASE_PNMI + 13)
6094-#define SK_PNMI_ERR013MSG ""
6095-#define SK_PNMI_ERR014 (SK_ERRBASE_PNMI + 14)
6096-#define SK_PNMI_ERR014MSG "Vpd: Cannot read VPD keys"
6097-#define SK_PNMI_ERR015 (SK_ERRBASE_PNMI + 15)
6098-#define SK_PNMI_ERR015MSG "Vpd: Internal array for VPD keys to small"
6099-#define SK_PNMI_ERR016 (SK_ERRBASE_PNMI + 16)
6100-#define SK_PNMI_ERR016MSG "Vpd: Key string too long"
6101-#define SK_PNMI_ERR017 (SK_ERRBASE_PNMI + 17)
6102-#define SK_PNMI_ERR017MSG "Vpd: Invalid VPD status pointer"
6103-#define SK_PNMI_ERR018 (SK_ERRBASE_PNMI + 18)
6104-#define SK_PNMI_ERR018MSG "Vpd: VPD data not valid"
6105-#define SK_PNMI_ERR019 (SK_ERRBASE_PNMI + 19)
6106-#define SK_PNMI_ERR019MSG "Vpd: VPD entries list string too long"
6107-#define SK_PNMI_ERR021 (SK_ERRBASE_PNMI + 21)
6108-#define SK_PNMI_ERR021MSG "Vpd: VPD data string too long"
6109-#define SK_PNMI_ERR022 (SK_ERRBASE_PNMI + 22)
6110-#define SK_PNMI_ERR022MSG "Vpd: VPD data string too long should be errored before"
6111-#define SK_PNMI_ERR023 (SK_ERRBASE_PNMI + 23)
6112-#define SK_PNMI_ERR023MSG "Vpd: Unknown OID in get action"
6113-#define SK_PNMI_ERR024 (SK_ERRBASE_PNMI + 24)
6114-#define SK_PNMI_ERR024MSG "Vpd: Unknown OID in preset/set action"
6115-#define SK_PNMI_ERR025 (SK_ERRBASE_PNMI + 25)
6116-#define SK_PNMI_ERR025MSG "Vpd: Cannot write VPD after modify entry"
6117-#define SK_PNMI_ERR026 (SK_ERRBASE_PNMI + 26)
6118-#define SK_PNMI_ERR026MSG "Vpd: Cannot update VPD"
6119-#define SK_PNMI_ERR027 (SK_ERRBASE_PNMI + 27)
6120-#define SK_PNMI_ERR027MSG "Vpd: Cannot delete VPD entry"
6121-#define SK_PNMI_ERR028 (SK_ERRBASE_PNMI + 28)
6122-#define SK_PNMI_ERR028MSG "Vpd: Cannot update VPD after delete entry"
6123-#define SK_PNMI_ERR029 (SK_ERRBASE_PNMI + 29)
6124-#define SK_PNMI_ERR029MSG "General: Driver description string too long"
6125-#define SK_PNMI_ERR030 (SK_ERRBASE_PNMI + 30)
6126-#define SK_PNMI_ERR030MSG "General: Driver version not initialized"
6127-#define SK_PNMI_ERR031 (SK_ERRBASE_PNMI + 31)
6128-#define SK_PNMI_ERR031MSG "General: Driver version string too long"
6129-#define SK_PNMI_ERR032 (SK_ERRBASE_PNMI + 32)
6130-#define SK_PNMI_ERR032MSG "General: Cannot read VPD Name for HW descr"
6131-#define SK_PNMI_ERR033 (SK_ERRBASE_PNMI + 33)
6132-#define SK_PNMI_ERR033MSG "General: HW description string too long"
6133-#define SK_PNMI_ERR034 (SK_ERRBASE_PNMI + 34)
6134-#define SK_PNMI_ERR034MSG "General: Unknown OID"
6135-#define SK_PNMI_ERR035 (SK_ERRBASE_PNMI + 35)
6136-#define SK_PNMI_ERR035MSG "Rlmt: Unknown OID"
6137-#define SK_PNMI_ERR036 (SK_ERRBASE_PNMI + 36)
6138-#define SK_PNMI_ERR036MSG ""
6139-#define SK_PNMI_ERR037 (SK_ERRBASE_PNMI + 37)
6140-#define SK_PNMI_ERR037MSG "Rlmt: SK_RLMT_MODE_CHANGE event return not 0"
6141-#define SK_PNMI_ERR038 (SK_ERRBASE_PNMI + 38)
6142-#define SK_PNMI_ERR038MSG "Rlmt: SK_RLMT_PREFPORT_CHANGE event return not 0"
6143-#define SK_PNMI_ERR039 (SK_ERRBASE_PNMI + 39)
6144-#define SK_PNMI_ERR039MSG "RlmtStat: Unknown OID"
6145-#define SK_PNMI_ERR040 (SK_ERRBASE_PNMI + 40)
6146-#define SK_PNMI_ERR040MSG "PowerManagement: Unknown OID"
6147-#define SK_PNMI_ERR041 (SK_ERRBASE_PNMI + 41)
6148-#define SK_PNMI_ERR041MSG "MacPrivateConf: Unknown OID"
6149-#define SK_PNMI_ERR042 (SK_ERRBASE_PNMI + 42)
6150-#define SK_PNMI_ERR042MSG "MacPrivateConf: SK_HWEV_SET_ROLE returned not 0"
6151-#define SK_PNMI_ERR043 (SK_ERRBASE_PNMI + 43)
6152-#define SK_PNMI_ERR043MSG "MacPrivateConf: SK_HWEV_SET_LMODE returned not 0"
6153-#define SK_PNMI_ERR044 (SK_ERRBASE_PNMI + 44)
6154-#define SK_PNMI_ERR044MSG "MacPrivateConf: SK_HWEV_SET_FLOWMODE returned not 0"
6155-#define SK_PNMI_ERR045 (SK_ERRBASE_PNMI + 45)
6156-#define SK_PNMI_ERR045MSG "MacPrivateConf: SK_HWEV_SET_SPEED returned not 0"
6157-#define SK_PNMI_ERR046 (SK_ERRBASE_PNMI + 46)
6158-#define SK_PNMI_ERR046MSG "Monitor: Unknown OID"
6159-#define SK_PNMI_ERR047 (SK_ERRBASE_PNMI + 47)
6160-#define SK_PNMI_ERR047MSG "SirqUpdate: Event function returns not 0"
6161-#define SK_PNMI_ERR048 (SK_ERRBASE_PNMI + 48)
6162-#define SK_PNMI_ERR048MSG "RlmtUpdate: Event function returns not 0"
6163-#define SK_PNMI_ERR049 (SK_ERRBASE_PNMI + 49)
6164-#define SK_PNMI_ERR049MSG "SkPnmiInit: Invalid size of 'CounterOffset' struct!!"
6165-#define SK_PNMI_ERR050 (SK_ERRBASE_PNMI + 50)
6166-#define SK_PNMI_ERR050MSG "SkPnmiInit: Invalid size of 'StatAddr' table!!"
6167-#define SK_PNMI_ERR051 (SK_ERRBASE_PNMI + 51)
6168-#define SK_PNMI_ERR051MSG "SkPnmiEvent: Port switch suspicious"
6169-#define SK_PNMI_ERR052 (SK_ERRBASE_PNMI + 52)
6170-#define SK_PNMI_ERR052MSG ""
6171-#define SK_PNMI_ERR053 (SK_ERRBASE_PNMI + 53)
6172-#define SK_PNMI_ERR053MSG "General: Driver release date not initialized"
6173-#define SK_PNMI_ERR054 (SK_ERRBASE_PNMI + 54)
6174-#define SK_PNMI_ERR054MSG "General: Driver release date string too long"
6175-#define SK_PNMI_ERR055 (SK_ERRBASE_PNMI + 55)
6176-#define SK_PNMI_ERR055MSG "General: Driver file name not initialized"
6177-#define SK_PNMI_ERR056 (SK_ERRBASE_PNMI + 56)
6178-#define SK_PNMI_ERR056MSG "General: Driver file name string too long"
6179-
6180-/*
6181- * Management counter macros called by the driver
6182- */
6183-#define SK_PNMI_SET_DRIVER_DESCR(pAC,v) ((pAC)->Pnmi.pDriverDescription = \
6184- (char *)(v))
6185-
6186-#define SK_PNMI_SET_DRIVER_VER(pAC,v) ((pAC)->Pnmi.pDriverVersion = \
6187- (char *)(v))
6188-
6189-#define SK_PNMI_SET_DRIVER_RELDATE(pAC,v) ((pAC)->Pnmi.pDriverReleaseDate = \
6190- (char *)(v))
6191-
6192-#define SK_PNMI_SET_DRIVER_FILENAME(pAC,v) ((pAC)->Pnmi.pDriverFileName = \
6193- (char *)(v))
6194-
6195-#define SK_PNMI_CNT_TX_QUEUE_LEN(pAC,v,p) \
6196- { \
6197- (pAC)->Pnmi.Port[p].TxSwQueueLen = (SK_U64)(v); \
6198- if ((pAC)->Pnmi.Port[p].TxSwQueueLen > (pAC)->Pnmi.Port[p].TxSwQueueMax) { \
6199- (pAC)->Pnmi.Port[p].TxSwQueueMax = (pAC)->Pnmi.Port[p].TxSwQueueLen; \
6200- } \
6201- }
6202-#define SK_PNMI_CNT_TX_RETRY(pAC,p) (((pAC)->Pnmi.Port[p].TxRetryCts)++)
6203-#define SK_PNMI_CNT_RX_INTR(pAC,p) (((pAC)->Pnmi.Port[p].RxIntrCts)++)
6204-#define SK_PNMI_CNT_TX_INTR(pAC,p) (((pAC)->Pnmi.Port[p].TxIntrCts)++)
6205-#define SK_PNMI_CNT_NO_RX_BUF(pAC,p) (((pAC)->Pnmi.Port[p].RxNoBufCts)++)
6206-#define SK_PNMI_CNT_NO_TX_BUF(pAC,p) (((pAC)->Pnmi.Port[p].TxNoBufCts)++)
6207-#define SK_PNMI_CNT_USED_TX_DESCR(pAC,v,p) \
6208- ((pAC)->Pnmi.Port[p].TxUsedDescrNo=(SK_U64)(v));
6209-#define SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC,v,p) \
6210- { \
6211- ((pAC)->Pnmi.Port[p].RxDeliveredCts)++; \
6212- (pAC)->Pnmi.Port[p].RxOctetsDeliveredCts += (SK_U64)(v); \
6213- }
6214-#define SK_PNMI_CNT_ERR_RECOVERY(pAC,p) (((pAC)->Pnmi.Port[p].ErrRecoveryCts)++);
6215-
6216-#define SK_PNMI_CNT_SYNC_OCTETS(pAC,p,v) \
6217- { \
6218- if ((p) < SK_MAX_MACS) { \
6219- ((pAC)->Pnmi.Port[p].StatSyncCts)++; \
6220- (pAC)->Pnmi.Port[p].StatSyncOctetsCts += (SK_U64)(v); \
6221- } \
6222- }
6223-
6224-#define SK_PNMI_CNT_RX_LONGFRAMES(pAC,p) \
6225- { \
6226- if ((p) < SK_MAX_MACS) { \
6227- ((pAC)->Pnmi.Port[p].StatRxLongFrameCts++); \
6228- } \
6229- }
6230-
6231-#define SK_PNMI_CNT_RX_FRAMETOOLONG(pAC,p) \
6232- { \
6233- if ((p) < SK_MAX_MACS) { \
6234- ((pAC)->Pnmi.Port[p].StatRxFrameTooLongCts++); \
6235- } \
6236- }
6237-
6238-#define SK_PNMI_CNT_RX_PMACC_ERR(pAC,p) \
6239- { \
6240- if ((p) < SK_MAX_MACS) { \
6241- ((pAC)->Pnmi.Port[p].StatRxPMaccErr++); \
6242- } \
6243- }
6244-
6245-/*
6246- * Conversion Macros
6247- */
6248-#define SK_PNMI_PORT_INST2LOG(i) ((unsigned int)(i) - 1)
6249-#define SK_PNMI_PORT_LOG2INST(l) ((unsigned int)(l) + 1)
6250-#define SK_PNMI_PORT_PHYS2LOG(p) ((unsigned int)(p) + 1)
6251-#define SK_PNMI_PORT_LOG2PHYS(pAC,l) ((unsigned int)(l) - 1)
6252-#define SK_PNMI_PORT_PHYS2INST(pAC,p) \
6253- (pAC->Pnmi.DualNetActiveFlag ? 2 : ((unsigned int)(p) + 2))
6254-#define SK_PNMI_PORT_INST2PHYS(pAC,i) ((unsigned int)(i) - 2)
6255-
6256-/*
6257- * Structure definition for SkPnmiGetStruct and SkPnmiSetStruct
6258- */
6259-#define SK_PNMI_VPD_KEY_SIZE 5
6260-#define SK_PNMI_VPD_BUFSIZE (VPD_SIZE)
6261-#define SK_PNMI_VPD_ENTRIES (VPD_SIZE / 4)
6262-#define SK_PNMI_VPD_DATALEN 128 /* Number of data bytes */
6263-
6264-#define SK_PNMI_MULTICAST_LISTLEN 64
6265-#define SK_PNMI_SENSOR_ENTRIES (SK_MAX_SENSORS)
6266-#define SK_PNMI_CHECKSUM_ENTRIES 3
6267-#define SK_PNMI_MAC_ENTRIES (SK_MAX_MACS + 1)
6268-#define SK_PNMI_MONITOR_ENTRIES 20
6269-#define SK_PNMI_TRAP_ENTRIES 10
6270-#define SK_PNMI_TRAPLEN 128
6271-#define SK_PNMI_STRINGLEN1 80
6272-#define SK_PNMI_STRINGLEN2 25
6273-#define SK_PNMI_TRAP_QUEUE_LEN 512
6274-
6275-typedef struct s_PnmiVpd {
6276- char VpdKey[SK_PNMI_VPD_KEY_SIZE];
6277- char VpdValue[SK_PNMI_VPD_DATALEN];
6278- SK_U8 VpdAccess;
6279- SK_U8 VpdAction;
6280-} SK_PNMI_VPD;
6281-
6282-typedef struct s_PnmiSensor {
6283- SK_U8 SensorIndex;
6284- char SensorDescr[SK_PNMI_STRINGLEN2];
6285- SK_U8 SensorType;
6286- SK_U32 SensorValue;
6287- SK_U32 SensorWarningThresholdLow;
6288- SK_U32 SensorWarningThresholdHigh;
6289- SK_U32 SensorErrorThresholdLow;
6290- SK_U32 SensorErrorThresholdHigh;
6291- SK_U8 SensorStatus;
6292- SK_U64 SensorWarningCts;
6293- SK_U64 SensorErrorCts;
6294- SK_U64 SensorWarningTimestamp;
6295- SK_U64 SensorErrorTimestamp;
6296-} SK_PNMI_SENSOR;
6297-
6298-typedef struct s_PnmiChecksum {
6299- SK_U64 ChecksumRxOkCts;
6300- SK_U64 ChecksumRxUnableCts;
6301- SK_U64 ChecksumRxErrCts;
6302- SK_U64 ChecksumTxOkCts;
6303- SK_U64 ChecksumTxUnableCts;
6304-} SK_PNMI_CHECKSUM;
6305-
6306-typedef struct s_PnmiStat {
6307- SK_U64 StatTxOkCts;
6308- SK_U64 StatTxOctetsOkCts;
6309- SK_U64 StatTxBroadcastOkCts;
6310- SK_U64 StatTxMulticastOkCts;
6311- SK_U64 StatTxUnicastOkCts;
6312- SK_U64 StatTxLongFramesCts;
6313- SK_U64 StatTxBurstCts;
6314- SK_U64 StatTxPauseMacCtrlCts;
6315- SK_U64 StatTxMacCtrlCts;
6316- SK_U64 StatTxSingleCollisionCts;
6317- SK_U64 StatTxMultipleCollisionCts;
6318- SK_U64 StatTxExcessiveCollisionCts;
6319- SK_U64 StatTxLateCollisionCts;
6320- SK_U64 StatTxDeferralCts;
6321- SK_U64 StatTxExcessiveDeferralCts;
6322- SK_U64 StatTxFifoUnderrunCts;
6323- SK_U64 StatTxCarrierCts;
6324- SK_U64 Dummy1; /* StatTxUtilization */
6325- SK_U64 StatTx64Cts;
6326- SK_U64 StatTx127Cts;
6327- SK_U64 StatTx255Cts;
6328- SK_U64 StatTx511Cts;
6329- SK_U64 StatTx1023Cts;
6330- SK_U64 StatTxMaxCts;
6331- SK_U64 StatTxSyncCts;
6332- SK_U64 StatTxSyncOctetsCts;
6333- SK_U64 StatRxOkCts;
6334- SK_U64 StatRxOctetsOkCts;
6335- SK_U64 StatRxBroadcastOkCts;
6336- SK_U64 StatRxMulticastOkCts;
6337- SK_U64 StatRxUnicastOkCts;
6338- SK_U64 StatRxLongFramesCts;
6339- SK_U64 StatRxPauseMacCtrlCts;
6340- SK_U64 StatRxMacCtrlCts;
6341- SK_U64 StatRxPauseMacCtrlErrorCts;
6342- SK_U64 StatRxMacCtrlUnknownCts;
6343- SK_U64 StatRxBurstCts;
6344- SK_U64 StatRxMissedCts;
6345- SK_U64 StatRxFramingCts;
6346- SK_U64 StatRxFifoOverflowCts;
6347- SK_U64 StatRxJabberCts;
6348- SK_U64 StatRxCarrierCts;
6349- SK_U64 StatRxIRLengthCts;
6350- SK_U64 StatRxSymbolCts;
6351- SK_U64 StatRxShortsCts;
6352- SK_U64 StatRxRuntCts;
6353- SK_U64 StatRxCextCts;
6354- SK_U64 StatRxTooLongCts;
6355- SK_U64 StatRxFcsCts;
6356- SK_U64 Dummy2; /* StatRxUtilization */
6357- SK_U64 StatRx64Cts;
6358- SK_U64 StatRx127Cts;
6359- SK_U64 StatRx255Cts;
6360- SK_U64 StatRx511Cts;
6361- SK_U64 StatRx1023Cts;
6362- SK_U64 StatRxMaxCts;
6363-} SK_PNMI_STAT;
6364-
6365-typedef struct s_PnmiConf {
6366- char ConfMacCurrentAddr[6];
6367- char ConfMacFactoryAddr[6];
6368- SK_U8 ConfPMD;
6369- SK_U8 ConfConnector;
6370- SK_U32 ConfPhyType;
6371- SK_U32 ConfPhyMode;
6372- SK_U8 ConfLinkCapability;
6373- SK_U8 ConfLinkMode;
6374- SK_U8 ConfLinkModeStatus;
6375- SK_U8 ConfLinkStatus;
6376- SK_U8 ConfFlowCtrlCapability;
6377- SK_U8 ConfFlowCtrlMode;
6378- SK_U8 ConfFlowCtrlStatus;
6379- SK_U8 ConfPhyOperationCapability;
6380- SK_U8 ConfPhyOperationMode;
6381- SK_U8 ConfPhyOperationStatus;
6382- SK_U8 ConfSpeedCapability;
6383- SK_U8 ConfSpeedMode;
6384- SK_U8 ConfSpeedStatus;
6385-} SK_PNMI_CONF;
6386-
6387-typedef struct s_PnmiRlmt {
6388- SK_U32 RlmtIndex;
6389- SK_U32 RlmtStatus;
6390- SK_U64 RlmtTxHelloCts;
6391- SK_U64 RlmtRxHelloCts;
6392- SK_U64 RlmtTxSpHelloReqCts;
6393- SK_U64 RlmtRxSpHelloCts;
6394-} SK_PNMI_RLMT;
6395-
6396-typedef struct s_PnmiRlmtMonitor {
6397- SK_U32 RlmtMonitorIndex;
6398- char RlmtMonitorAddr[6];
6399- SK_U64 RlmtMonitorErrorCts;
6400- SK_U64 RlmtMonitorTimestamp;
6401- SK_U8 RlmtMonitorAdmin;
6402-} SK_PNMI_RLMT_MONITOR;
6403-
6404-typedef struct s_PnmiRequestStatus {
6405- SK_U32 ErrorStatus;
6406- SK_U32 ErrorOffset;
6407-} SK_PNMI_REQUEST_STATUS;
6408-
6409-typedef struct s_PnmiStrucData {
6410- SK_U32 MgmtDBVersion;
6411- SK_PNMI_REQUEST_STATUS ReturnStatus;
6412- SK_U32 VpdFreeBytes;
6413- char VpdEntriesList[SK_PNMI_VPD_ENTRIES * SK_PNMI_VPD_KEY_SIZE];
6414- SK_U32 VpdEntriesNumber;
6415- SK_PNMI_VPD Vpd[SK_PNMI_VPD_ENTRIES];
6416- SK_U32 PortNumber;
6417- SK_U32 DeviceType;
6418- char DriverDescr[SK_PNMI_STRINGLEN1];
6419- char DriverVersion[SK_PNMI_STRINGLEN2];
6420- char DriverReleaseDate[SK_PNMI_STRINGLEN1];
6421- char DriverFileName[SK_PNMI_STRINGLEN1];
6422- char HwDescr[SK_PNMI_STRINGLEN1];
6423- char HwVersion[SK_PNMI_STRINGLEN2];
6424- SK_U16 Chipset;
6425- SK_U32 ChipId;
6426- SK_U8 VauxAvail;
6427- SK_U32 RamSize;
6428- SK_U32 MtuSize;
6429- SK_U32 Action;
6430- SK_U32 TestResult;
6431- SK_U8 BusType;
6432- SK_U8 BusSpeed;
6433- SK_U8 BusWidth;
6434- SK_U8 SensorNumber;
6435- SK_PNMI_SENSOR Sensor[SK_PNMI_SENSOR_ENTRIES];
6436- SK_U8 ChecksumNumber;
6437- SK_PNMI_CHECKSUM Checksum[SK_PNMI_CHECKSUM_ENTRIES];
6438- SK_PNMI_STAT Stat[SK_PNMI_MAC_ENTRIES];
6439- SK_PNMI_CONF Conf[SK_PNMI_MAC_ENTRIES];
6440- SK_U8 RlmtMode;
6441- SK_U32 RlmtPortNumber;
6442- SK_U8 RlmtPortActive;
6443- SK_U8 RlmtPortPreferred;
6444- SK_U64 RlmtChangeCts;
6445- SK_U64 RlmtChangeTime;
6446- SK_U64 RlmtChangeEstimate;
6447- SK_U64 RlmtChangeThreshold;
6448- SK_PNMI_RLMT Rlmt[SK_MAX_MACS];
6449- SK_U32 RlmtMonitorNumber;
6450- SK_PNMI_RLMT_MONITOR RlmtMonitor[SK_PNMI_MONITOR_ENTRIES];
6451- SK_U32 TrapNumber;
6452- SK_U8 Trap[SK_PNMI_TRAP_QUEUE_LEN];
6453- SK_U64 TxSwQueueLen;
6454- SK_U64 TxSwQueueMax;
6455- SK_U64 TxRetryCts;
6456- SK_U64 RxIntrCts;
6457- SK_U64 TxIntrCts;
6458- SK_U64 RxNoBufCts;
6459- SK_U64 TxNoBufCts;
6460- SK_U64 TxUsedDescrNo;
6461- SK_U64 RxDeliveredCts;
6462- SK_U64 RxOctetsDeliveredCts;
6463- SK_U64 RxHwErrorsCts;
6464- SK_U64 TxHwErrorsCts;
6465- SK_U64 InErrorsCts;
6466- SK_U64 OutErrorsCts;
6467- SK_U64 ErrRecoveryCts;
6468- SK_U64 SysUpTime;
6469-} SK_PNMI_STRUCT_DATA;
6470-
6471-#define SK_PNMI_STRUCT_SIZE (sizeof(SK_PNMI_STRUCT_DATA))
6472-#define SK_PNMI_MIN_STRUCT_SIZE ((unsigned int)(SK_UPTR)\
6473- &(((SK_PNMI_STRUCT_DATA *)0)->VpdFreeBytes))
6474- /*
6475- * ReturnStatus field
6476- * must be located
6477- * before VpdFreeBytes
6478- */
6479-
6480-/*
6481- * Various definitions
6482- */
6483-#define SK_PNMI_MAX_PROTOS 3
6484-
6485-#define SK_PNMI_CNT_NO 66 /* Must have the value of the enum
6486- * SK_PNMI_MAX_IDX. Define SK_PNMI_CHECK
6487- * for check while init phase 1
6488- */
6489-
6490-/*
6491- * Estimate data structure
6492- */
6493-typedef struct s_PnmiEstimate {
6494- unsigned int EstValueIndex;
6495- SK_U64 EstValue[7];
6496- SK_U64 Estimate;
6497- SK_TIMER EstTimer;
6498-} SK_PNMI_ESTIMATE;
6499-
6500-
6501-/*
6502- * VCT timer data structure
6503- */
6504-typedef struct s_VctTimer {
6505- SK_TIMER VctTimer;
6506-} SK_PNMI_VCT_TIMER;
6507-
6508-
6509-/*
6510- * PNMI specific adapter context structure
6511- */
6512-typedef struct s_PnmiPort {
6513- SK_U64 StatSyncCts;
6514- SK_U64 StatSyncOctetsCts;
6515- SK_U64 StatRxLongFrameCts;
6516- SK_U64 StatRxFrameTooLongCts;
6517- SK_U64 StatRxPMaccErr;
6518- SK_U64 TxSwQueueLen;
6519- SK_U64 TxSwQueueMax;
6520- SK_U64 TxRetryCts;
6521- SK_U64 RxIntrCts;
6522- SK_U64 TxIntrCts;
6523- SK_U64 RxNoBufCts;
6524- SK_U64 TxNoBufCts;
6525- SK_U64 TxUsedDescrNo;
6526- SK_U64 RxDeliveredCts;
6527- SK_U64 RxOctetsDeliveredCts;
6528- SK_U64 RxHwErrorsCts;
6529- SK_U64 TxHwErrorsCts;
6530- SK_U64 InErrorsCts;
6531- SK_U64 OutErrorsCts;
6532- SK_U64 ErrRecoveryCts;
6533- SK_U64 RxShortZeroMark;
6534- SK_U64 CounterOffset[SK_PNMI_CNT_NO];
6535- SK_U32 CounterHigh[SK_PNMI_CNT_NO];
6536- SK_BOOL ActiveFlag;
6537- SK_U8 Align[3];
6538-} SK_PNMI_PORT;
6539-
6540-
6541-typedef struct s_PnmiData {
6542- SK_PNMI_PORT Port [SK_MAX_MACS];
6543- SK_PNMI_PORT BufPort [SK_MAX_MACS]; /* 2002-09-13 pweber */
6544- SK_U64 VirtualCounterOffset[SK_PNMI_CNT_NO];
6545- SK_U32 TestResult;
6546- char HwVersion[10];
6547- SK_U16 Align01;
6548-
6549- char *pDriverDescription;
6550- char *pDriverVersion;
6551- char *pDriverReleaseDate;
6552- char *pDriverFileName;
6553-
6554- int MacUpdatedFlag;
6555- int RlmtUpdatedFlag;
6556- int SirqUpdatedFlag;
6557-
6558- SK_U64 RlmtChangeCts;
6559- SK_U64 RlmtChangeTime;
6560- SK_PNMI_ESTIMATE RlmtChangeEstimate;
6561- SK_U64 RlmtChangeThreshold;
6562-
6563- SK_U64 StartUpTime;
6564- SK_U32 DeviceType;
6565- char PciBusSpeed;
6566- char PciBusWidth;
6567- char Chipset;
6568- char PMD;
6569- char Connector;
6570- SK_BOOL DualNetActiveFlag;
6571- SK_U16 Align02;
6572-
6573- char TrapBuf[SK_PNMI_TRAP_QUEUE_LEN];
6574- unsigned int TrapBufFree;
6575- unsigned int TrapQueueBeg;
6576- unsigned int TrapQueueEnd;
6577- unsigned int TrapBufPad;
6578- unsigned int TrapUnique;
6579- SK_U8 VctStatus[SK_MAX_MACS];
6580- SK_PNMI_VCT VctBackup[SK_MAX_MACS];
6581- SK_PNMI_VCT_TIMER VctTimeout[SK_MAX_MACS];
6582-#ifdef SK_DIAG_SUPPORT
6583- SK_U32 DiagAttached;
6584-#endif /* SK_DIAG_SUPPORT */
6585-} SK_PNMI;
6586-
6587-
6588-/*
6589- * Function prototypes
6590- */
6591-extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level);
6592-extern int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,
6593- unsigned int* pLen, SK_U32 Instance, SK_U32 NetIndex);
6594-extern int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id,
6595- void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
6596-extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,
6597- unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
6598-extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,
6599- unsigned int *pLen, SK_U32 NetIndex);
6600-extern int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,
6601- unsigned int *pLen, SK_U32 NetIndex);
6602-extern int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,
6603- unsigned int *pLen, SK_U32 NetIndex);
6604-extern int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event,
6605- SK_EVPARA Param);
6606-extern int SkPnmiGenIoctl(SK_AC *pAC, SK_IOC IoC, void * pBuf,
6607- unsigned int * pLen, SK_U32 NetIndex);
6608-
6609-#endif
6610+/*****************************************************************************\r
6611+ *\r
6612+ * Name: skgepnmi.h\r
6613+ * Project: Gigabit Ethernet Adapters, PNMI-Module\r
6614+ * Version: $Revision$\r
6615+ * Date: $Date$\r
6616+ * Purpose: Defines for Private Network Management Interface\r
6617+ *\r
6618+ ****************************************************************************/\r
6619+\r
6620+/******************************************************************************\r
6621+ *\r
6622+ * (C)Copyright 1998-2002 SysKonnect GmbH.\r
6623+ * (C)Copyright 2002-2003 Marvell.\r
6624+ *\r
6625+ * This program is free software; you can redistribute it and/or modify\r
6626+ * it under the terms of the GNU General Public License as published by\r
6627+ * the Free Software Foundation; either version 2 of the License, or\r
6628+ * (at your option) any later version.\r
6629+ *\r
6630+ * The information in this file is provided "AS IS" without warranty.\r
6631+ *\r
6632+ ******************************************************************************/\r
6633+\r
6634+#ifndef _SKGEPNMI_H_\r
6635+#define _SKGEPNMI_H_\r
6636+\r
6637+/*\r
6638+ * Include dependencies\r
6639+ */\r
6640+#include "h/sktypes.h"\r
6641+#include "h/skerror.h"\r
6642+#include "h/sktimer.h"\r
6643+#include "h/sktwsi.h"\r
6644+#include "h/skaddr.h"\r
6645+#include "h/skrlmt.h"\r
6646+#include "h/skvpd.h"\r
6647+\r
6648+/*\r
6649+ * Management Database Version\r
6650+ */\r
6651+#define SK_PNMI_MDB_VERSION 0x00030001 /* 3.1 */\r
6652+\r
6653+/*\r
6654+ * Event definitions\r
6655+ */\r
6656+#define SK_PNMI_EVT_SIRQ_OVERFLOW 1 /* Counter overflow */\r
6657+#define SK_PNMI_EVT_SEN_WAR_LOW 2 /* Lower war thres exceeded */\r
6658+#define SK_PNMI_EVT_SEN_WAR_UPP 3 /* Upper war thres exceeded */\r
6659+#define SK_PNMI_EVT_SEN_ERR_LOW 4 /* Lower err thres exceeded */\r
6660+#define SK_PNMI_EVT_SEN_ERR_UPP 5 /* Upper err thres exceeded */\r
6661+#define SK_PNMI_EVT_CHG_EST_TIMER 6 /* Timer event for RLMT Chg */\r
6662+#define SK_PNMI_EVT_UTILIZATION_TIMER 7 /* Timer event for Utiliza. */\r
6663+#define SK_PNMI_EVT_CLEAR_COUNTER 8 /* Clear statistic counters */\r
6664+#define SK_PNMI_EVT_XMAC_RESET 9 /* XMAC will be reset */\r
6665+#define SK_PNMI_EVT_RLMT_PORT_UP 10 /* Port came logically up */\r
6666+#define SK_PNMI_EVT_RLMT_PORT_DOWN 11 /* Port went logically down */\r
6667+#define SK_PNMI_EVT_RLMT_SEGMENTATION 13 /* Two SP root bridges found */\r
6668+#define SK_PNMI_EVT_RLMT_ACTIVE_DOWN 14 /* Port went logically down */\r
6669+#define SK_PNMI_EVT_RLMT_ACTIVE_UP 15 /* Port came logically up */\r
6670+#define SK_PNMI_EVT_RLMT_SET_NETS 16 /* Number of nets (1 or 2). */\r
6671+#define SK_PNMI_EVT_VCT_RESET 17 /* VCT port reset timer event started with SET. */\r
6672+\r
6673+/*\r
6674+ * Return values\r
6675+ */\r
6676+#define SK_PNMI_ERR_OK 0\r
6677+#define SK_PNMI_ERR_GENERAL 1\r
6678+#define SK_PNMI_ERR_TOO_SHORT 2\r
6679+#define SK_PNMI_ERR_BAD_VALUE 3\r
6680+#define SK_PNMI_ERR_READ_ONLY 4\r
6681+#define SK_PNMI_ERR_UNKNOWN_OID 5\r
6682+#define SK_PNMI_ERR_UNKNOWN_INST 6\r
6683+#define SK_PNMI_ERR_UNKNOWN_NET 7\r
6684+#define SK_PNMI_ERR_NOT_SUPPORTED 10\r
6685+\r
6686+/*\r
6687+ * Return values of driver reset function SK_DRIVER_RESET() and\r
6688+ * driver event function SK_DRIVER_EVENT()\r
6689+ */\r
6690+#define SK_PNMI_ERR_OK 0\r
6691+#define SK_PNMI_ERR_FAIL 1\r
6692+\r
6693+/*\r
6694+ * Return values of driver test function SK_DRIVER_SELFTEST()\r
6695+ */\r
6696+#define SK_PNMI_TST_UNKNOWN (1 << 0)\r
6697+#define SK_PNMI_TST_TRANCEIVER (1 << 1)\r
6698+#define SK_PNMI_TST_ASIC (1 << 2)\r
6699+#define SK_PNMI_TST_SENSOR (1 << 3)\r
6700+#define SK_PNMI_TST_POWERMGMT (1 << 4)\r
6701+#define SK_PNMI_TST_PCI (1 << 5)\r
6702+#define SK_PNMI_TST_MAC (1 << 6)\r
6703+\r
6704+/*\r
6705+ * RLMT specific definitions\r
6706+ */\r
6707+#define SK_PNMI_RLMT_STATUS_STANDBY 1\r
6708+#define SK_PNMI_RLMT_STATUS_ACTIVE 2\r
6709+#define SK_PNMI_RLMT_STATUS_ERROR 3\r
6710+\r
6711+#define SK_PNMI_RLMT_LSTAT_PHY_DOWN 1\r
6712+#define SK_PNMI_RLMT_LSTAT_AUTONEG 2\r
6713+#define SK_PNMI_RLMT_LSTAT_LOG_DOWN 3\r
6714+#define SK_PNMI_RLMT_LSTAT_LOG_UP 4\r
6715+#define SK_PNMI_RLMT_LSTAT_INDETERMINATED 5\r
6716+\r
6717+#define SK_PNMI_RLMT_MODE_CHK_LINK (SK_RLMT_CHECK_LINK)\r
6718+#define SK_PNMI_RLMT_MODE_CHK_RX (SK_RLMT_CHECK_LOC_LINK)\r
6719+#define SK_PNMI_RLMT_MODE_CHK_SPT (SK_RLMT_CHECK_SEG)\r
6720+/* #define SK_PNMI_RLMT_MODE_CHK_EX */\r
6721+\r
6722+/*\r
6723+ * OID definition\r
6724+ */\r
6725+#ifndef _NDIS_ /* Check, whether NDIS already included OIDs */\r
6726+\r
6727+#define OID_GEN_XMIT_OK 0x00020101\r
6728+#define OID_GEN_RCV_OK 0x00020102\r
6729+#define OID_GEN_XMIT_ERROR 0x00020103\r
6730+#define OID_GEN_RCV_ERROR 0x00020104\r
6731+#define OID_GEN_RCV_NO_BUFFER 0x00020105\r
6732+\r
6733+/* #define OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 */\r
6734+#define OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202\r
6735+/* #define OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 */\r
6736+#define OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204\r
6737+/* #define OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 */\r
6738+#define OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206\r
6739+/* #define OID_GEN_DIRECTED_BYTES_RCV 0x00020207 */\r
6740+#define OID_GEN_DIRECTED_FRAMES_RCV 0x00020208\r
6741+/* #define OID_GEN_MULTICAST_BYTES_RCV 0x00020209 */\r
6742+#define OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A\r
6743+/* #define OID_GEN_BROADCAST_BYTES_RCV 0x0002020B */\r
6744+#define OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C\r
6745+#define OID_GEN_RCV_CRC_ERROR 0x0002020D\r
6746+#define OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E\r
6747+\r
6748+#define OID_802_3_PERMANENT_ADDRESS 0x01010101\r
6749+#define OID_802_3_CURRENT_ADDRESS 0x01010102\r
6750+/* #define OID_802_3_MULTICAST_LIST 0x01010103 */\r
6751+/* #define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 */\r
6752+/* #define OID_802_3_MAC_OPTIONS 0x01010105 */\r
6753+ \r
6754+#define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101\r
6755+#define OID_802_3_XMIT_ONE_COLLISION 0x01020102\r
6756+#define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103\r
6757+#define OID_802_3_XMIT_DEFERRED 0x01020201\r
6758+#define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202\r
6759+#define OID_802_3_RCV_OVERRUN 0x01020203\r
6760+#define OID_802_3_XMIT_UNDERRUN 0x01020204\r
6761+#define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206\r
6762+#define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207\r
6763+\r
6764+/*\r
6765+ * PnP and PM OIDs\r
6766+ */\r
6767+#ifdef SK_POWER_MGMT\r
6768+#define OID_PNP_CAPABILITIES 0xFD010100\r
6769+#define OID_PNP_SET_POWER 0xFD010101\r
6770+#define OID_PNP_QUERY_POWER 0xFD010102\r
6771+#define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103\r
6772+#define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104\r
6773+#define OID_PNP_ENABLE_WAKE_UP 0xFD010106\r
6774+#endif /* SK_POWER_MGMT */\r
6775+\r
6776+#endif /* _NDIS_ */\r
6777+\r
6778+#define OID_SKGE_MDB_VERSION 0xFF010100\r
6779+#define OID_SKGE_SUPPORTED_LIST 0xFF010101\r
6780+#define OID_SKGE_VPD_FREE_BYTES 0xFF010102\r
6781+#define OID_SKGE_VPD_ENTRIES_LIST 0xFF010103\r
6782+#define OID_SKGE_VPD_ENTRIES_NUMBER 0xFF010104\r
6783+#define OID_SKGE_VPD_KEY 0xFF010105\r
6784+#define OID_SKGE_VPD_VALUE 0xFF010106\r
6785+#define OID_SKGE_VPD_ACCESS 0xFF010107\r
6786+#define OID_SKGE_VPD_ACTION 0xFF010108\r
6787+ \r
6788+#define OID_SKGE_PORT_NUMBER 0xFF010110\r
6789+#define OID_SKGE_DEVICE_TYPE 0xFF010111\r
6790+#define OID_SKGE_DRIVER_DESCR 0xFF010112\r
6791+#define OID_SKGE_DRIVER_VERSION 0xFF010113\r
6792+#define OID_SKGE_HW_DESCR 0xFF010114\r
6793+#define OID_SKGE_HW_VERSION 0xFF010115\r
6794+#define OID_SKGE_CHIPSET 0xFF010116\r
6795+#define OID_SKGE_ACTION 0xFF010117\r
6796+#define OID_SKGE_RESULT 0xFF010118\r
6797+#define OID_SKGE_BUS_TYPE 0xFF010119\r
6798+#define OID_SKGE_BUS_SPEED 0xFF01011A\r
6799+#define OID_SKGE_BUS_WIDTH 0xFF01011B\r
6800+/* 0xFF01011C unused */\r
6801+#define OID_SKGE_DIAG_ACTION 0xFF01011D\r
6802+#define OID_SKGE_DIAG_RESULT 0xFF01011E\r
6803+#define OID_SKGE_MTU 0xFF01011F\r
6804+#define OID_SKGE_PHYS_CUR_ADDR 0xFF010120\r
6805+#define OID_SKGE_PHYS_FAC_ADDR 0xFF010121\r
6806+#define OID_SKGE_PMD 0xFF010122\r
6807+#define OID_SKGE_CONNECTOR 0xFF010123\r
6808+#define OID_SKGE_LINK_CAP 0xFF010124\r
6809+#define OID_SKGE_LINK_MODE 0xFF010125\r
6810+#define OID_SKGE_LINK_MODE_STATUS 0xFF010126\r
6811+#define OID_SKGE_LINK_STATUS 0xFF010127\r
6812+#define OID_SKGE_FLOWCTRL_CAP 0xFF010128\r
6813+#define OID_SKGE_FLOWCTRL_MODE 0xFF010129\r
6814+#define OID_SKGE_FLOWCTRL_STATUS 0xFF01012A\r
6815+#define OID_SKGE_PHY_OPERATION_CAP 0xFF01012B\r
6816+#define OID_SKGE_PHY_OPERATION_MODE 0xFF01012C\r
6817+#define OID_SKGE_PHY_OPERATION_STATUS 0xFF01012D\r
6818+#define OID_SKGE_MULTICAST_LIST 0xFF01012E\r
6819+#define OID_SKGE_CURRENT_PACKET_FILTER 0xFF01012F\r
6820+\r
6821+#define OID_SKGE_TRAP 0xFF010130\r
6822+#define OID_SKGE_TRAP_NUMBER 0xFF010131\r
6823+\r
6824+#define OID_SKGE_RLMT_MODE 0xFF010140\r
6825+#define OID_SKGE_RLMT_PORT_NUMBER 0xFF010141\r
6826+#define OID_SKGE_RLMT_PORT_ACTIVE 0xFF010142\r
6827+#define OID_SKGE_RLMT_PORT_PREFERRED 0xFF010143\r
6828+\r
6829+#define OID_SKGE_RLMT_MONITOR_NUMBER 0xFF010150\r
6830+#define OID_SKGE_RLMT_MONITOR_INDEX 0xFF010151\r
6831+#define OID_SKGE_RLMT_MONITOR_ADDR 0xFF010152\r
6832+#define OID_SKGE_RLMT_MONITOR_ERRS 0xFF010153\r
6833+#define OID_SKGE_RLMT_MONITOR_TIMESTAMP 0xFF010154\r
6834+#define OID_SKGE_RLMT_MONITOR_ADMIN 0xFF010155\r
6835+\r
6836+#define OID_SKGE_INTERMEDIATE_SUPPORT 0xFF010160\r
6837+#define OID_SKGE_SET_TEAM_MAC_ADDRESS 0xFF010161\r
6838+#define OID_SKGE_DEVICE_INFORMATION 0xFF010162\r
6839+\r
6840+#define OID_SKGE_SPEED_CAP 0xFF010170\r
6841+#define OID_SKGE_SPEED_MODE 0xFF010171\r
6842+#define OID_SKGE_SPEED_STATUS 0xFF010172\r
6843+\r
6844+#define OID_SKGE_BOARDLEVEL 0xFF010180\r
6845+\r
6846+#define OID_SKGE_SENSOR_NUMBER 0xFF020100 \r
6847+#define OID_SKGE_SENSOR_INDEX 0xFF020101\r
6848+#define OID_SKGE_SENSOR_DESCR 0xFF020102\r
6849+#define OID_SKGE_SENSOR_TYPE 0xFF020103\r
6850+#define OID_SKGE_SENSOR_VALUE 0xFF020104\r
6851+#define OID_SKGE_SENSOR_WAR_THRES_LOW 0xFF020105\r
6852+#define OID_SKGE_SENSOR_WAR_THRES_UPP 0xFF020106\r
6853+#define OID_SKGE_SENSOR_ERR_THRES_LOW 0xFF020107\r
6854+#define OID_SKGE_SENSOR_ERR_THRES_UPP 0xFF020108\r
6855+#define OID_SKGE_SENSOR_STATUS 0xFF020109\r
6856+#define OID_SKGE_SENSOR_WAR_CTS 0xFF02010A\r
6857+#define OID_SKGE_SENSOR_ERR_CTS 0xFF02010B\r
6858+#define OID_SKGE_SENSOR_WAR_TIME 0xFF02010C\r
6859+#define OID_SKGE_SENSOR_ERR_TIME 0xFF02010D\r
6860+\r
6861+#define OID_SKGE_CHKSM_NUMBER 0xFF020110\r
6862+#define OID_SKGE_CHKSM_RX_OK_CTS 0xFF020111\r
6863+#define OID_SKGE_CHKSM_RX_UNABLE_CTS 0xFF020112\r
6864+#define OID_SKGE_CHKSM_RX_ERR_CTS 0xFF020113\r
6865+#define OID_SKGE_CHKSM_TX_OK_CTS 0xFF020114\r
6866+#define OID_SKGE_CHKSM_TX_UNABLE_CTS 0xFF020115\r
6867+\r
6868+#define OID_SKGE_STAT_TX 0xFF020120\r
6869+#define OID_SKGE_STAT_TX_OCTETS 0xFF020121\r
6870+#define OID_SKGE_STAT_TX_BROADCAST 0xFF020122\r
6871+#define OID_SKGE_STAT_TX_MULTICAST 0xFF020123\r
6872+#define OID_SKGE_STAT_TX_UNICAST 0xFF020124\r
6873+#define OID_SKGE_STAT_TX_LONGFRAMES 0xFF020125\r
6874+#define OID_SKGE_STAT_TX_BURST 0xFF020126\r
6875+#define OID_SKGE_STAT_TX_PFLOWC 0xFF020127\r
6876+#define OID_SKGE_STAT_TX_FLOWC 0xFF020128\r
6877+#define OID_SKGE_STAT_TX_SINGLE_COL 0xFF020129\r
6878+#define OID_SKGE_STAT_TX_MULTI_COL 0xFF02012A\r
6879+#define OID_SKGE_STAT_TX_EXCESS_COL 0xFF02012B\r
6880+#define OID_SKGE_STAT_TX_LATE_COL 0xFF02012C\r
6881+#define OID_SKGE_STAT_TX_DEFFERAL 0xFF02012D\r
6882+#define OID_SKGE_STAT_TX_EXCESS_DEF 0xFF02012E\r
6883+#define OID_SKGE_STAT_TX_UNDERRUN 0xFF02012F\r
6884+#define OID_SKGE_STAT_TX_CARRIER 0xFF020130\r
6885+/* #define OID_SKGE_STAT_TX_UTIL 0xFF020131 */\r
6886+#define OID_SKGE_STAT_TX_64 0xFF020132\r
6887+#define OID_SKGE_STAT_TX_127 0xFF020133\r
6888+#define OID_SKGE_STAT_TX_255 0xFF020134\r
6889+#define OID_SKGE_STAT_TX_511 0xFF020135\r
6890+#define OID_SKGE_STAT_TX_1023 0xFF020136\r
6891+#define OID_SKGE_STAT_TX_MAX 0xFF020137\r
6892+#define OID_SKGE_STAT_TX_SYNC 0xFF020138\r
6893+#define OID_SKGE_STAT_TX_SYNC_OCTETS 0xFF020139\r
6894+#define OID_SKGE_STAT_RX 0xFF02013A\r
6895+#define OID_SKGE_STAT_RX_OCTETS 0xFF02013B\r
6896+#define OID_SKGE_STAT_RX_BROADCAST 0xFF02013C\r
6897+#define OID_SKGE_STAT_RX_MULTICAST 0xFF02013D\r
6898+#define OID_SKGE_STAT_RX_UNICAST 0xFF02013E\r
6899+#define OID_SKGE_STAT_RX_PFLOWC 0xFF02013F\r
6900+#define OID_SKGE_STAT_RX_FLOWC 0xFF020140\r
6901+#define OID_SKGE_STAT_RX_PFLOWC_ERR 0xFF020141\r
6902+#define OID_SKGE_STAT_RX_FLOWC_UNKWN 0xFF020142\r
6903+#define OID_SKGE_STAT_RX_BURST 0xFF020143\r
6904+#define OID_SKGE_STAT_RX_MISSED 0xFF020144\r
6905+#define OID_SKGE_STAT_RX_FRAMING 0xFF020145\r
6906+#define OID_SKGE_STAT_RX_OVERFLOW 0xFF020146\r
6907+#define OID_SKGE_STAT_RX_JABBER 0xFF020147\r
6908+#define OID_SKGE_STAT_RX_CARRIER 0xFF020148\r
6909+#define OID_SKGE_STAT_RX_IR_LENGTH 0xFF020149\r
6910+#define OID_SKGE_STAT_RX_SYMBOL 0xFF02014A\r
6911+#define OID_SKGE_STAT_RX_SHORTS 0xFF02014B\r
6912+#define OID_SKGE_STAT_RX_RUNT 0xFF02014C\r
6913+#define OID_SKGE_STAT_RX_CEXT 0xFF02014D\r
6914+#define OID_SKGE_STAT_RX_TOO_LONG 0xFF02014E\r
6915+#define OID_SKGE_STAT_RX_FCS 0xFF02014F\r
6916+/* #define OID_SKGE_STAT_RX_UTIL 0xFF020150 */\r
6917+#define OID_SKGE_STAT_RX_64 0xFF020151\r
6918+#define OID_SKGE_STAT_RX_127 0xFF020152\r
6919+#define OID_SKGE_STAT_RX_255 0xFF020153\r
6920+#define OID_SKGE_STAT_RX_511 0xFF020154\r
6921+#define OID_SKGE_STAT_RX_1023 0xFF020155\r
6922+#define OID_SKGE_STAT_RX_MAX 0xFF020156\r
6923+#define OID_SKGE_STAT_RX_LONGFRAMES 0xFF020157\r
6924+\r
6925+#define OID_SKGE_RLMT_CHANGE_CTS 0xFF020160\r
6926+#define OID_SKGE_RLMT_CHANGE_TIME 0xFF020161\r
6927+#define OID_SKGE_RLMT_CHANGE_ESTIM 0xFF020162\r
6928+#define OID_SKGE_RLMT_CHANGE_THRES 0xFF020163\r
6929+\r
6930+#define OID_SKGE_RLMT_PORT_INDEX 0xFF020164\r
6931+#define OID_SKGE_RLMT_STATUS 0xFF020165\r
6932+#define OID_SKGE_RLMT_TX_HELLO_CTS 0xFF020166\r
6933+#define OID_SKGE_RLMT_RX_HELLO_CTS 0xFF020167\r
6934+#define OID_SKGE_RLMT_TX_SP_REQ_CTS 0xFF020168\r
6935+#define OID_SKGE_RLMT_RX_SP_CTS 0xFF020169\r
6936+\r
6937+#define OID_SKGE_TX_SW_QUEUE_LEN 0xFF020170\r
6938+#define OID_SKGE_TX_SW_QUEUE_MAX 0xFF020171\r
6939+#define OID_SKGE_TX_RETRY 0xFF020172\r
6940+#define OID_SKGE_RX_INTR_CTS 0xFF020173\r
6941+#define OID_SKGE_TX_INTR_CTS 0xFF020174\r
6942+#define OID_SKGE_RX_NO_BUF_CTS 0xFF020175\r
6943+#define OID_SKGE_TX_NO_BUF_CTS 0xFF020176\r
6944+#define OID_SKGE_TX_USED_DESCR_NO 0xFF020177\r
6945+#define OID_SKGE_RX_DELIVERED_CTS 0xFF020178\r
6946+#define OID_SKGE_RX_OCTETS_DELIV_CTS 0xFF020179\r
6947+#define OID_SKGE_RX_HW_ERROR_CTS 0xFF02017A\r
6948+#define OID_SKGE_TX_HW_ERROR_CTS 0xFF02017B\r
6949+#define OID_SKGE_IN_ERRORS_CTS 0xFF02017C\r
6950+#define OID_SKGE_OUT_ERROR_CTS 0xFF02017D\r
6951+#define OID_SKGE_ERR_RECOVERY_CTS 0xFF02017E\r
6952+#define OID_SKGE_SYSUPTIME 0xFF02017F\r
6953+\r
6954+#define OID_SKGE_ALL_DATA 0xFF020190\r
6955+\r
6956+/* Defines for VCT. */\r
6957+#define OID_SKGE_VCT_GET 0xFF020200\r
6958+#define OID_SKGE_VCT_SET 0xFF020201\r
6959+#define OID_SKGE_VCT_STATUS 0xFF020202\r
6960+#define OID_SKGE_VCT_CAPABILITIES 0xFF020203\r
6961+\r
6962+#ifdef SK_DIAG_SUPPORT\r
6963+/* Defines for driver DIAG mode. */\r
6964+#define OID_SKGE_DIAG_MODE 0xFF020204\r
6965+#endif /* SK_DIAG_SUPPORT */\r
6966+\r
6967+/* New OIDs */\r
6968+#define OID_SKGE_DRIVER_RELDATE 0xFF020210\r
6969+#define OID_SKGE_DRIVER_FILENAME 0xFF020211\r
6970+#define OID_SKGE_CHIPID 0xFF020212\r
6971+#define OID_SKGE_RAMSIZE 0xFF020213\r
6972+#define OID_SKGE_VAUXAVAIL 0xFF020214\r
6973+#define OID_SKGE_PHY_TYPE 0xFF020215\r
6974+#define OID_SKGE_PHY_LP_MODE 0xFF020216\r
6975+\r
6976+/*\r
6977+ * Added for new DualNet IM driver V2\r
6978+ * these OIDs should later be in pnmi.h\r
6979+ */\r
6980+#define OID_SKGE_MAC_COUNT 0xFF020217\r
6981+#define OID_SKGE_DUALNET_MODE 0xFF020218\r
6982+#define OID_SKGE_SET_TAGHEADER 0xFF020219\r
6983+\r
6984+#ifdef SK_ASF\r
6985+/* Defines for ASF */\r
6986+#define OID_SKGE_ASF 0xFF02021a\r
6987+#define OID_SKGE_ASF_STORE_CONFIG 0xFF02021b\r
6988+#define OID_SKGE_ASF_ENA 0xFF02021c\r
6989+#define OID_SKGE_ASF_RETRANS 0xFF02021d\r
6990+#define OID_SKGE_ASF_RETRANS_INT 0xFF02021e\r
6991+#define OID_SKGE_ASF_HB_ENA 0xFF02021f\r
6992+#define OID_SKGE_ASF_HB_INT 0xFF020220\r
6993+#define OID_SKGE_ASF_WD_ENA 0xFF020221\r
6994+#define OID_SKGE_ASF_WD_TIME 0xFF020222\r
6995+#define OID_SKGE_ASF_IP_SOURCE 0xFF020223\r
6996+#define OID_SKGE_ASF_MAC_SOURCE 0xFF020224\r
6997+#define OID_SKGE_ASF_IP_DEST 0xFF020225\r
6998+#define OID_SKGE_ASF_MAC_DEST 0xFF020226\r
6999+#define OID_SKGE_ASF_COMMUNITY_NAME 0xFF020227\r
7000+#define OID_SKGE_ASF_RSP_ENA 0xFF020228 \r
7001+#define OID_SKGE_ASF_RETRANS_COUNT_MIN 0xFF020229\r
7002+#define OID_SKGE_ASF_RETRANS_COUNT_MAX 0xFF02022a\r
7003+#define OID_SKGE_ASF_RETRANS_INT_MIN 0xFF02022b\r
7004+#define OID_SKGE_ASF_RETRANS_INT_MAX 0xFF02022c\r
7005+#define OID_SKGE_ASF_HB_INT_MIN 0xFF02022d\r
7006+#define OID_SKGE_ASF_HB_INT_MAX 0xFF02022e\r
7007+#define OID_SKGE_ASF_WD_TIME_MIN 0xFF02022f\r
7008+#define OID_SKGE_ASF_WD_TIME_MAX 0xFF020230\r
7009+#define OID_SKGE_ASF_HB_CAP 0xFF020231\r
7010+#define OID_SKGE_ASF_WD_TIMER_RES 0xFF020232\r
7011+#define OID_SKGE_ASF_GUID 0xFF020233\r
7012+#define OID_SKGE_ASF_KEY_OP 0xFF020234\r
7013+#define OID_SKGE_ASF_KEY_ADM 0xFF020235\r
7014+#define OID_SKGE_ASF_KEY_GEN 0xFF020236\r
7015+#define OID_SKGE_ASF_CAP 0xFF020237\r
7016+#define OID_SKGE_ASF_PAR_1 0xFF020238\r
7017+#define OID_SKGE_ASF_OVERALL_OID 0xFF020239\r
7018+#endif /* SK_ASF */\r
7019+\r
7020+\r
7021+// Defined for yukon2 path only \r
7022+#define OID_SKGE_UPPER_MINIPORT 0xFF02023D\r
7023+\r
7024+\r
7025+#ifdef SK_ASF\r
7026+/* Defines for ASF */\r
7027+#define OID_SKGE_ASF_FWVER_OID 0xFF020240\r
7028+#define OID_SKGE_ASF_ACPI_OID 0xFF020241\r
7029+#define OID_SKGE_ASF_SMBUS_OID 0xFF020242\r
7030+#endif /* SK_ASF */\r
7031+\r
7032+\r
7033+/* VCT struct to store a backup copy of VCT data after a port reset. */\r
7034+typedef struct s_PnmiVct {\r
7035+ SK_U8 VctStatus;\r
7036+ SK_U8 CableLen;\r
7037+ SK_U32 MdiPairLen[4];\r
7038+ SK_U8 MdiPairSts[4];\r
7039+} SK_PNMI_VCT;\r
7040+\r
7041+\r
7042+/* VCT status values (to be given to CPA via OID_SKGE_VCT_STATUS). */\r
7043+#define SK_PNMI_VCT_NONE 0x00\r
7044+#define SK_PNMI_VCT_OLD_VCT_DATA 0x01\r
7045+#define SK_PNMI_VCT_NEW_VCT_DATA 0x02\r
7046+#define SK_PNMI_VCT_OLD_DSP_DATA 0x04\r
7047+#define SK_PNMI_VCT_NEW_DSP_DATA 0x08\r
7048+#define SK_PNMI_VCT_RUNNING 0x10\r
7049+\r
7050+\r
7051+/* VCT cable test status. */\r
7052+#define SK_PNMI_VCT_NORMAL_CABLE 0\r
7053+#define SK_PNMI_VCT_SHORT_CABLE 1\r
7054+#define SK_PNMI_VCT_OPEN_CABLE 2\r
7055+#define SK_PNMI_VCT_TEST_FAIL 3\r
7056+#define SK_PNMI_VCT_IMPEDANCE_MISMATCH 4\r
7057+#define SK_PNMI_VCT_NOT_PRESENT 5\r
7058+\r
7059+/* VCT capabilities (needed for OID_SKGE_VCT_CAPABILITIES. */\r
7060+#define SK_PNMI_VCT_SUPPORTED 1\r
7061+#define SK_PNMI_VCT_NOT_SUPPORTED 0\r
7062+\r
7063+#define OID_SKGE_TRAP_SEN_WAR_LOW 500\r
7064+#define OID_SKGE_TRAP_SEN_WAR_UPP 501\r
7065+#define OID_SKGE_TRAP_SEN_ERR_LOW 502\r
7066+#define OID_SKGE_TRAP_SEN_ERR_UPP 503\r
7067+#define OID_SKGE_TRAP_RLMT_CHANGE_THRES 520\r
7068+#define OID_SKGE_TRAP_RLMT_CHANGE_PORT 521\r
7069+#define OID_SKGE_TRAP_RLMT_PORT_DOWN 522\r
7070+#define OID_SKGE_TRAP_RLMT_PORT_UP 523\r
7071+#define OID_SKGE_TRAP_RLMT_SEGMENTATION 524\r
7072+\r
7073+#ifdef SK_DIAG_SUPPORT\r
7074+/* Defines for driver DIAG mode. */\r
7075+#define SK_DIAG_ATTACHED 2\r
7076+#define SK_DIAG_RUNNING 1\r
7077+#define SK_DIAG_IDLE 0\r
7078+#endif /* SK_DIAG_SUPPORT */\r
7079+\r
7080+/*\r
7081+ * Generic PNMI IOCTL subcommand definitions.\r
7082+ */\r
7083+#define SK_GET_SINGLE_VAR 1\r
7084+#define SK_SET_SINGLE_VAR 2\r
7085+#define SK_PRESET_SINGLE_VAR 3\r
7086+#define SK_GET_FULL_MIB 4\r
7087+#define SK_SET_FULL_MIB 5\r
7088+#define SK_PRESET_FULL_MIB 6\r
7089+\r
7090+/*\r
7091+ * Define error numbers and messages for syslog\r
7092+ */\r
7093+#define SK_PNMI_ERR001 (SK_ERRBASE_PNMI + 1)\r
7094+#define SK_PNMI_ERR001MSG "SkPnmiGetStruct: Unknown OID"\r
7095+#define SK_PNMI_ERR002 (SK_ERRBASE_PNMI + 2)\r
7096+#define SK_PNMI_ERR002MSG "SkPnmiGetStruct: Cannot read VPD keys"\r
7097+#define SK_PNMI_ERR003 (SK_ERRBASE_PNMI + 3)\r
7098+#define SK_PNMI_ERR003MSG "OidStruct: Called with wrong OID"\r
7099+#define SK_PNMI_ERR004 (SK_ERRBASE_PNMI + 4)\r
7100+#define SK_PNMI_ERR004MSG "OidStruct: Called with wrong action"\r
7101+#define SK_PNMI_ERR005 (SK_ERRBASE_PNMI + 5)\r
7102+#define SK_PNMI_ERR005MSG "Perform: Cannot reset driver"\r
7103+#define SK_PNMI_ERR006 (SK_ERRBASE_PNMI + 6)\r
7104+#define SK_PNMI_ERR006MSG "Perform: Unknown OID action command"\r
7105+#define SK_PNMI_ERR007 (SK_ERRBASE_PNMI + 7)\r
7106+#define SK_PNMI_ERR007MSG "General: Driver description not initialized"\r
7107+#define SK_PNMI_ERR008 (SK_ERRBASE_PNMI + 8)\r
7108+#define SK_PNMI_ERR008MSG "Addr: Tried to get unknown OID"\r
7109+#define SK_PNMI_ERR009 (SK_ERRBASE_PNMI + 9)\r
7110+#define SK_PNMI_ERR009MSG "Addr: Unknown OID"\r
7111+#define SK_PNMI_ERR010 (SK_ERRBASE_PNMI + 10)\r
7112+#define SK_PNMI_ERR010MSG "CsumStat: Unknown OID"\r
7113+#define SK_PNMI_ERR011 (SK_ERRBASE_PNMI + 11)\r
7114+#define SK_PNMI_ERR011MSG "SensorStat: Sensor descr string too long"\r
7115+#define SK_PNMI_ERR012 (SK_ERRBASE_PNMI + 12)\r
7116+#define SK_PNMI_ERR012MSG "SensorStat: Unknown OID"\r
7117+#define SK_PNMI_ERR013 (SK_ERRBASE_PNMI + 13)\r
7118+#define SK_PNMI_ERR013MSG ""\r
7119+#define SK_PNMI_ERR014 (SK_ERRBASE_PNMI + 14)\r
7120+#define SK_PNMI_ERR014MSG "Vpd: Cannot read VPD keys"\r
7121+#define SK_PNMI_ERR015 (SK_ERRBASE_PNMI + 15)\r
7122+#define SK_PNMI_ERR015MSG "Vpd: Internal array for VPD keys too small"\r
7123+#define SK_PNMI_ERR016 (SK_ERRBASE_PNMI + 16)\r
7124+#define SK_PNMI_ERR016MSG "Vpd: Key string too long"\r
7125+#define SK_PNMI_ERR017 (SK_ERRBASE_PNMI + 17)\r
7126+#define SK_PNMI_ERR017MSG "Vpd: Invalid VPD status pointer"\r
7127+#define SK_PNMI_ERR018 (SK_ERRBASE_PNMI + 18)\r
7128+#define SK_PNMI_ERR018MSG "Vpd: VPD data not valid"\r
7129+#define SK_PNMI_ERR019 (SK_ERRBASE_PNMI + 19)\r
7130+#define SK_PNMI_ERR019MSG "Vpd: VPD entries list string too long"\r
7131+#define SK_PNMI_ERR021 (SK_ERRBASE_PNMI + 21)\r
7132+#define SK_PNMI_ERR021MSG "Vpd: VPD data string too long"\r
7133+#define SK_PNMI_ERR022 (SK_ERRBASE_PNMI + 22)\r
7134+#define SK_PNMI_ERR022MSG "Vpd: VPD data string too long should be errored before"\r
7135+#define SK_PNMI_ERR023 (SK_ERRBASE_PNMI + 23)\r
7136+#define SK_PNMI_ERR023MSG "Vpd: Unknown OID in get action"\r
7137+#define SK_PNMI_ERR024 (SK_ERRBASE_PNMI + 24)\r
7138+#define SK_PNMI_ERR024MSG "Vpd: Unknown OID in preset/set action"\r
7139+#define SK_PNMI_ERR025 (SK_ERRBASE_PNMI + 25)\r
7140+#define SK_PNMI_ERR025MSG "Vpd: Cannot write VPD after modify entry"\r
7141+#define SK_PNMI_ERR026 (SK_ERRBASE_PNMI + 26)\r
7142+#define SK_PNMI_ERR026MSG "Vpd: Cannot update VPD"\r
7143+#define SK_PNMI_ERR027 (SK_ERRBASE_PNMI + 27)\r
7144+#define SK_PNMI_ERR027MSG "Vpd: Cannot delete VPD entry"\r
7145+#define SK_PNMI_ERR028 (SK_ERRBASE_PNMI + 28)\r
7146+#define SK_PNMI_ERR028MSG "Vpd: Cannot update VPD after delete entry"\r
7147+#define SK_PNMI_ERR029 (SK_ERRBASE_PNMI + 29)\r
7148+#define SK_PNMI_ERR029MSG "General: Driver description string too long"\r
7149+#define SK_PNMI_ERR030 (SK_ERRBASE_PNMI + 30)\r
7150+#define SK_PNMI_ERR030MSG "General: Driver version not initialized"\r
7151+#define SK_PNMI_ERR031 (SK_ERRBASE_PNMI + 31)\r
7152+#define SK_PNMI_ERR031MSG "General: Driver version string too long"\r
7153+#define SK_PNMI_ERR032 (SK_ERRBASE_PNMI + 32)\r
7154+#define SK_PNMI_ERR032MSG "General: Cannot read VPD Name for HW descr"\r
7155+#define SK_PNMI_ERR033 (SK_ERRBASE_PNMI + 33)\r
7156+#define SK_PNMI_ERR033MSG "General: HW description string too long"\r
7157+#define SK_PNMI_ERR034 (SK_ERRBASE_PNMI + 34)\r
7158+#define SK_PNMI_ERR034MSG "General: Unknown OID"\r
7159+#define SK_PNMI_ERR035 (SK_ERRBASE_PNMI + 35)\r
7160+#define SK_PNMI_ERR035MSG "Rlmt: Unknown OID"\r
7161+#define SK_PNMI_ERR036 (SK_ERRBASE_PNMI + 36)\r
7162+#define SK_PNMI_ERR036MSG ""\r
7163+#define SK_PNMI_ERR037 (SK_ERRBASE_PNMI + 37)\r
7164+#define SK_PNMI_ERR037MSG "Rlmt: SK_RLMT_MODE_CHANGE event returned not 0"\r
7165+#define SK_PNMI_ERR038 (SK_ERRBASE_PNMI + 38)\r
7166+#define SK_PNMI_ERR038MSG "Rlmt: SK_RLMT_PREFPORT_CHANGE event returned not 0"\r
7167+#define SK_PNMI_ERR039 (SK_ERRBASE_PNMI + 39)\r
7168+#define SK_PNMI_ERR039MSG "RlmtStat: Unknown OID"\r
7169+#define SK_PNMI_ERR040 (SK_ERRBASE_PNMI + 40)\r
7170+#define SK_PNMI_ERR040MSG "PowerManagement: Unknown OID"\r
7171+#define SK_PNMI_ERR041 (SK_ERRBASE_PNMI + 41)\r
7172+#define SK_PNMI_ERR041MSG "MacPrivateConf: Unknown OID"\r
7173+#define SK_PNMI_ERR042 (SK_ERRBASE_PNMI + 42)\r
7174+#define SK_PNMI_ERR042MSG "MacPrivateConf: SK_HWEV_SET_ROLE returned not 0"\r
7175+#define SK_PNMI_ERR043 (SK_ERRBASE_PNMI + 43)\r
7176+#define SK_PNMI_ERR043MSG "MacPrivateConf: SK_HWEV_SET_LMODE returned not 0"\r
7177+#define SK_PNMI_ERR044 (SK_ERRBASE_PNMI + 44)\r
7178+#define SK_PNMI_ERR044MSG "MacPrivateConf: SK_HWEV_SET_FLOWMODE returned not 0"\r
7179+#define SK_PNMI_ERR045 (SK_ERRBASE_PNMI + 45)\r
7180+#define SK_PNMI_ERR045MSG "MacPrivateConf: SK_HWEV_SET_SPEED returned not 0"\r
7181+#define SK_PNMI_ERR046 (SK_ERRBASE_PNMI + 46)\r
7182+#define SK_PNMI_ERR046MSG "Monitor: Unknown OID"\r
7183+#define SK_PNMI_ERR047 (SK_ERRBASE_PNMI + 47)\r
7184+#define SK_PNMI_ERR047MSG "SirqUpdate: Event function returned not 0"\r
7185+#define SK_PNMI_ERR048 (SK_ERRBASE_PNMI + 48)\r
7186+#define SK_PNMI_ERR048MSG "RlmtUpdate: Event function returned not 0"\r
7187+#define SK_PNMI_ERR049 (SK_ERRBASE_PNMI + 49)\r
7188+#define SK_PNMI_ERR049MSG "SkPnmiInit: Invalid size of 'CounterOffset' struct!!"\r
7189+#define SK_PNMI_ERR050 (SK_ERRBASE_PNMI + 50)\r
7190+#define SK_PNMI_ERR050MSG "SkPnmiInit: Invalid size of 'StatAddr' table!!"\r
7191+#define SK_PNMI_ERR051 (SK_ERRBASE_PNMI + 51)\r
7192+#define SK_PNMI_ERR051MSG "SkPnmiEvent: Port switch suspicious"\r
7193+#define SK_PNMI_ERR052 (SK_ERRBASE_PNMI + 52)\r
7194+#define SK_PNMI_ERR052MSG ""\r
7195+#define SK_PNMI_ERR053 (SK_ERRBASE_PNMI + 53)\r
7196+#define SK_PNMI_ERR053MSG "General: Driver release date not initialized"\r
7197+#define SK_PNMI_ERR054 (SK_ERRBASE_PNMI + 54)\r
7198+#define SK_PNMI_ERR054MSG "General: Driver release date string too long"\r
7199+#define SK_PNMI_ERR055 (SK_ERRBASE_PNMI + 55)\r
7200+#define SK_PNMI_ERR055MSG "General: Driver file name not initialized"\r
7201+#define SK_PNMI_ERR056 (SK_ERRBASE_PNMI + 56)\r
7202+#define SK_PNMI_ERR056MSG "General: Driver file name string too long"\r
7203+\r
7204+/*\r
7205+ * Management counter macros called by the driver\r
7206+ */\r
7207+#define SK_PNMI_SET_DRIVER_DESCR(pAC,v) ((pAC)->Pnmi.pDriverDescription = \\r
7208+ (char *)(v))\r
7209+\r
7210+#define SK_PNMI_SET_DRIVER_VER(pAC,v) ((pAC)->Pnmi.pDriverVersion = \\r
7211+ (char *)(v))\r
7212+\r
7213+#define SK_PNMI_SET_DRIVER_RELDATE(pAC,v) ((pAC)->Pnmi.pDriverReleaseDate = \\r
7214+ (char *)(v))\r
7215+\r
7216+#define SK_PNMI_SET_DRIVER_FILENAME(pAC,v) ((pAC)->Pnmi.pDriverFileName = \\r
7217+ (char *)(v))\r
7218+\r
7219+#define SK_PNMI_CNT_TX_QUEUE_LEN(pAC,v,p) \\r
7220+ { \\r
7221+ (pAC)->Pnmi.Port[p].TxSwQueueLen = (SK_U64)(v); \\r
7222+ if ((pAC)->Pnmi.Port[p].TxSwQueueLen > (pAC)->Pnmi.Port[p].TxSwQueueMax) { \\r
7223+ (pAC)->Pnmi.Port[p].TxSwQueueMax = (pAC)->Pnmi.Port[p].TxSwQueueLen; \\r
7224+ } \\r
7225+ }\r
7226+#define SK_PNMI_CNT_TX_RETRY(pAC,p) (((pAC)->Pnmi.Port[p].TxRetryCts)++)\r
7227+#define SK_PNMI_CNT_RX_INTR(pAC,p) (((pAC)->Pnmi.Port[p].RxIntrCts)++)\r
7228+#define SK_PNMI_CNT_TX_INTR(pAC,p) (((pAC)->Pnmi.Port[p].TxIntrCts)++)\r
7229+#define SK_PNMI_CNT_NO_RX_BUF(pAC,p) (((pAC)->Pnmi.Port[p].RxNoBufCts)++)\r
7230+#define SK_PNMI_CNT_NO_TX_BUF(pAC,p) (((pAC)->Pnmi.Port[p].TxNoBufCts)++)\r
7231+#define SK_PNMI_CNT_USED_TX_DESCR(pAC,v,p) \\r
7232+ ((pAC)->Pnmi.Port[p].TxUsedDescrNo=(SK_U64)(v));\r
7233+#define SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC,v,p) \\r
7234+ { \\r
7235+ ((pAC)->Pnmi.Port[p].RxDeliveredCts)++; \\r
7236+ (pAC)->Pnmi.Port[p].RxOctetsDeliveredCts += (SK_U64)(v); \\r
7237+ }\r
7238+#define SK_PNMI_CNT_ERR_RECOVERY(pAC,p) (((pAC)->Pnmi.Port[p].ErrRecoveryCts)++);\r
7239+\r
7240+#define SK_PNMI_CNT_SYNC_OCTETS(pAC,p,v) \\r
7241+ { \\r
7242+ if ((p) < SK_MAX_MACS) { \\r
7243+ ((pAC)->Pnmi.Port[p].StatSyncCts)++; \\r
7244+ (pAC)->Pnmi.Port[p].StatSyncOctetsCts += (SK_U64)(v); \\r
7245+ } \\r
7246+ }\r
7247+\r
7248+#define SK_PNMI_CNT_RX_LONGFRAMES(pAC,p) \\r
7249+ { \\r
7250+ if ((p) < SK_MAX_MACS) { \\r
7251+ ((pAC)->Pnmi.Port[p].StatRxLongFrameCts++); \\r
7252+ } \\r
7253+ }\r
7254+\r
7255+#define SK_PNMI_CNT_RX_FRAMETOOLONG(pAC,p) \\r
7256+ { \\r
7257+ if ((p) < SK_MAX_MACS) { \\r
7258+ ((pAC)->Pnmi.Port[p].StatRxFrameTooLongCts++); \\r
7259+ } \\r
7260+ }\r
7261+\r
7262+#define SK_PNMI_CNT_RX_PMACC_ERR(pAC,p) \\r
7263+ { \\r
7264+ if ((p) < SK_MAX_MACS) { \\r
7265+ ((pAC)->Pnmi.Port[p].StatRxPMaccErr++); \\r
7266+ } \\r
7267+ }\r
7268+\r
7269+/*\r
7270+ * Conversion Macros\r
7271+ */\r
7272+#define SK_PNMI_PORT_INST2LOG(i) ((unsigned int)(i) - 1)\r
7273+#define SK_PNMI_PORT_LOG2INST(l) ((unsigned int)(l) + 1)\r
7274+#define SK_PNMI_PORT_PHYS2LOG(p) ((unsigned int)(p) + 1)\r
7275+#define SK_PNMI_PORT_LOG2PHYS(pAC,l) ((unsigned int)(l) - 1)\r
7276+#define SK_PNMI_PORT_PHYS2INST(pAC,p) \\r
7277+ (pAC->Pnmi.DualNetActiveFlag ? 2 : ((unsigned int)(p) + 2))\r
7278+#define SK_PNMI_PORT_INST2PHYS(pAC,i) ((unsigned int)(i) - 2)\r
7279+\r
7280+/*\r
7281+ * Structure definition for SkPnmiGetStruct and SkPnmiSetStruct\r
7282+ */\r
7283+#define SK_PNMI_VPD_KEY_SIZE 5\r
7284+#define SK_PNMI_VPD_BUFSIZE (VPD_SIZE)\r
7285+#define SK_PNMI_VPD_ENTRIES (VPD_SIZE / 4)\r
7286+#define SK_PNMI_VPD_DATALEN 128 /* Number of data bytes */\r
7287+\r
7288+#define SK_PNMI_MULTICAST_LISTLEN 64\r
7289+#define SK_PNMI_SENSOR_ENTRIES (SK_MAX_SENSORS)\r
7290+#define SK_PNMI_CHECKSUM_ENTRIES 3\r
7291+#define SK_PNMI_MAC_ENTRIES (SK_MAX_MACS + 1)\r
7292+#define SK_PNMI_MONITOR_ENTRIES 20\r
7293+#define SK_PNMI_TRAP_ENTRIES 10\r
7294+#define SK_PNMI_TRAPLEN 128\r
7295+#define SK_PNMI_STRINGLEN1 80\r
7296+#define SK_PNMI_STRINGLEN2 25\r
7297+#define SK_PNMI_TRAP_QUEUE_LEN 512\r
7298+\r
7299+typedef struct s_PnmiVpd {\r
7300+ char VpdKey[SK_PNMI_VPD_KEY_SIZE];\r
7301+ char VpdValue[SK_PNMI_VPD_DATALEN];\r
7302+ SK_U8 VpdAccess;\r
7303+ SK_U8 VpdAction;\r
7304+} SK_PNMI_VPD;\r
7305+\r
7306+typedef struct s_PnmiSensor {\r
7307+ SK_U8 SensorIndex;\r
7308+ char SensorDescr[SK_PNMI_STRINGLEN2];\r
7309+ SK_U8 SensorType;\r
7310+ SK_U32 SensorValue;\r
7311+ SK_U32 SensorWarningThresholdLow;\r
7312+ SK_U32 SensorWarningThresholdHigh;\r
7313+ SK_U32 SensorErrorThresholdLow;\r
7314+ SK_U32 SensorErrorThresholdHigh;\r
7315+ SK_U8 SensorStatus;\r
7316+ SK_U64 SensorWarningCts;\r
7317+ SK_U64 SensorErrorCts;\r
7318+ SK_U64 SensorWarningTimestamp;\r
7319+ SK_U64 SensorErrorTimestamp;\r
7320+} SK_PNMI_SENSOR;\r
7321+\r
7322+typedef struct s_PnmiChecksum {\r
7323+ SK_U64 ChecksumRxOkCts;\r
7324+ SK_U64 ChecksumRxUnableCts;\r
7325+ SK_U64 ChecksumRxErrCts;\r
7326+ SK_U64 ChecksumTxOkCts;\r
7327+ SK_U64 ChecksumTxUnableCts;\r
7328+} SK_PNMI_CHECKSUM;\r
7329+\r
7330+typedef struct s_PnmiStat {\r
7331+ SK_U64 StatTxOkCts;\r
7332+ SK_U64 StatTxOctetsOkCts;\r
7333+ SK_U64 StatTxBroadcastOkCts;\r
7334+ SK_U64 StatTxMulticastOkCts;\r
7335+ SK_U64 StatTxUnicastOkCts;\r
7336+ SK_U64 StatTxLongFramesCts;\r
7337+ SK_U64 StatTxBurstCts;\r
7338+ SK_U64 StatTxPauseMacCtrlCts;\r
7339+ SK_U64 StatTxMacCtrlCts;\r
7340+ SK_U64 StatTxSingleCollisionCts;\r
7341+ SK_U64 StatTxMultipleCollisionCts;\r
7342+ SK_U64 StatTxExcessiveCollisionCts;\r
7343+ SK_U64 StatTxLateCollisionCts;\r
7344+ SK_U64 StatTxDeferralCts;\r
7345+ SK_U64 StatTxExcessiveDeferralCts;\r
7346+ SK_U64 StatTxFifoUnderrunCts;\r
7347+ SK_U64 StatTxCarrierCts;\r
7348+ SK_U64 Dummy1; /* StatTxUtilization */\r
7349+ SK_U64 StatTx64Cts;\r
7350+ SK_U64 StatTx127Cts;\r
7351+ SK_U64 StatTx255Cts;\r
7352+ SK_U64 StatTx511Cts;\r
7353+ SK_U64 StatTx1023Cts;\r
7354+ SK_U64 StatTxMaxCts;\r
7355+ SK_U64 StatTxSyncCts;\r
7356+ SK_U64 StatTxSyncOctetsCts;\r
7357+ SK_U64 StatRxOkCts;\r
7358+ SK_U64 StatRxOctetsOkCts;\r
7359+ SK_U64 StatRxBroadcastOkCts;\r
7360+ SK_U64 StatRxMulticastOkCts;\r
7361+ SK_U64 StatRxUnicastOkCts;\r
7362+ SK_U64 StatRxLongFramesCts;\r
7363+ SK_U64 StatRxPauseMacCtrlCts;\r
7364+ SK_U64 StatRxMacCtrlCts;\r
7365+ SK_U64 StatRxPauseMacCtrlErrorCts;\r
7366+ SK_U64 StatRxMacCtrlUnknownCts;\r
7367+ SK_U64 StatRxBurstCts;\r
7368+ SK_U64 StatRxMissedCts;\r
7369+ SK_U64 StatRxFramingCts;\r
7370+ SK_U64 StatRxFifoOverflowCts;\r
7371+ SK_U64 StatRxJabberCts;\r
7372+ SK_U64 StatRxCarrierCts;\r
7373+ SK_U64 StatRxIRLengthCts;\r
7374+ SK_U64 StatRxSymbolCts;\r
7375+ SK_U64 StatRxShortsCts;\r
7376+ SK_U64 StatRxRuntCts;\r
7377+ SK_U64 StatRxCextCts;\r
7378+ SK_U64 StatRxTooLongCts;\r
7379+ SK_U64 StatRxFcsCts;\r
7380+ SK_U64 Dummy2; /* StatRxUtilization */\r
7381+ SK_U64 StatRx64Cts;\r
7382+ SK_U64 StatRx127Cts;\r
7383+ SK_U64 StatRx255Cts;\r
7384+ SK_U64 StatRx511Cts;\r
7385+ SK_U64 StatRx1023Cts;\r
7386+ SK_U64 StatRxMaxCts;\r
7387+} SK_PNMI_STAT;\r
7388+\r
7389+typedef struct s_PnmiConf {\r
7390+ char ConfMacCurrentAddr[6];\r
7391+ char ConfMacFactoryAddr[6];\r
7392+ SK_U8 ConfPMD;\r
7393+ SK_U8 ConfConnector;\r
7394+ SK_U32 ConfPhyType;\r
7395+ SK_U32 ConfPhyMode;\r
7396+ SK_U8 ConfLinkCapability;\r
7397+ SK_U8 ConfLinkMode;\r
7398+ SK_U8 ConfLinkModeStatus;\r
7399+ SK_U8 ConfLinkStatus;\r
7400+ SK_U8 ConfFlowCtrlCapability;\r
7401+ SK_U8 ConfFlowCtrlMode;\r
7402+ SK_U8 ConfFlowCtrlStatus;\r
7403+ SK_U8 ConfPhyOperationCapability;\r
7404+ SK_U8 ConfPhyOperationMode;\r
7405+ SK_U8 ConfPhyOperationStatus;\r
7406+ SK_U8 ConfSpeedCapability;\r
7407+ SK_U8 ConfSpeedMode;\r
7408+ SK_U8 ConfSpeedStatus;\r
7409+} SK_PNMI_CONF;\r
7410+\r
7411+typedef struct s_PnmiRlmt {\r
7412+ SK_U32 RlmtIndex;\r
7413+ SK_U32 RlmtStatus;\r
7414+ SK_U64 RlmtTxHelloCts;\r
7415+ SK_U64 RlmtRxHelloCts;\r
7416+ SK_U64 RlmtTxSpHelloReqCts;\r
7417+ SK_U64 RlmtRxSpHelloCts;\r
7418+} SK_PNMI_RLMT;\r
7419+\r
7420+typedef struct s_PnmiRlmtMonitor {\r
7421+ SK_U32 RlmtMonitorIndex;\r
7422+ char RlmtMonitorAddr[6];\r
7423+ SK_U64 RlmtMonitorErrorCts;\r
7424+ SK_U64 RlmtMonitorTimestamp;\r
7425+ SK_U8 RlmtMonitorAdmin;\r
7426+} SK_PNMI_RLMT_MONITOR;\r
7427+\r
7428+typedef struct s_PnmiRequestStatus {\r
7429+ SK_U32 ErrorStatus;\r
7430+ SK_U32 ErrorOffset;\r
7431+} SK_PNMI_REQUEST_STATUS;\r
7432+\r
7433+typedef struct s_PnmiStrucData {\r
7434+ SK_U32 MgmtDBVersion;\r
7435+ SK_PNMI_REQUEST_STATUS ReturnStatus;\r
7436+ SK_U32 VpdFreeBytes;\r
7437+ char VpdEntriesList[SK_PNMI_VPD_ENTRIES * SK_PNMI_VPD_KEY_SIZE];\r
7438+ SK_U32 VpdEntriesNumber;\r
7439+ SK_PNMI_VPD Vpd[SK_PNMI_VPD_ENTRIES];\r
7440+ SK_U32 PortNumber;\r
7441+ SK_U32 DeviceType;\r
7442+ char DriverDescr[SK_PNMI_STRINGLEN1];\r
7443+ char DriverVersion[SK_PNMI_STRINGLEN2];\r
7444+ char DriverReleaseDate[SK_PNMI_STRINGLEN1];\r
7445+ char DriverFileName[SK_PNMI_STRINGLEN1];\r
7446+ char HwDescr[SK_PNMI_STRINGLEN1];\r
7447+ char HwVersion[SK_PNMI_STRINGLEN2];\r
7448+ SK_U16 Chipset;\r
7449+ SK_U32 ChipId;\r
7450+ SK_U8 VauxAvail;\r
7451+ SK_U32 RamSize;\r
7452+ SK_U32 MtuSize;\r
7453+ SK_U32 Action;\r
7454+ SK_U32 TestResult;\r
7455+ SK_U8 BusType;\r
7456+ SK_U8 BusSpeed;\r
7457+ SK_U8 BusWidth;\r
7458+ SK_U8 SensorNumber;\r
7459+ SK_PNMI_SENSOR Sensor[SK_PNMI_SENSOR_ENTRIES];\r
7460+ SK_U8 ChecksumNumber;\r
7461+ SK_PNMI_CHECKSUM Checksum[SK_PNMI_CHECKSUM_ENTRIES];\r
7462+ SK_PNMI_STAT Stat[SK_PNMI_MAC_ENTRIES];\r
7463+ SK_PNMI_CONF Conf[SK_PNMI_MAC_ENTRIES];\r
7464+ SK_U8 RlmtMode;\r
7465+ SK_U32 RlmtPortNumber;\r
7466+ SK_U8 RlmtPortActive;\r
7467+ SK_U8 RlmtPortPreferred;\r
7468+ SK_U64 RlmtChangeCts;\r
7469+ SK_U64 RlmtChangeTime;\r
7470+ SK_U64 RlmtChangeEstimate;\r
7471+ SK_U64 RlmtChangeThreshold;\r
7472+ SK_PNMI_RLMT Rlmt[SK_MAX_MACS];\r
7473+ SK_U32 RlmtMonitorNumber;\r
7474+ SK_PNMI_RLMT_MONITOR RlmtMonitor[SK_PNMI_MONITOR_ENTRIES];\r
7475+ SK_U32 TrapNumber;\r
7476+ SK_U8 Trap[SK_PNMI_TRAP_QUEUE_LEN];\r
7477+ SK_U64 TxSwQueueLen;\r
7478+ SK_U64 TxSwQueueMax;\r
7479+ SK_U64 TxRetryCts;\r
7480+ SK_U64 RxIntrCts;\r
7481+ SK_U64 TxIntrCts;\r
7482+ SK_U64 RxNoBufCts;\r
7483+ SK_U64 TxNoBufCts;\r
7484+ SK_U64 TxUsedDescrNo;\r
7485+ SK_U64 RxDeliveredCts;\r
7486+ SK_U64 RxOctetsDeliveredCts;\r
7487+ SK_U64 RxHwErrorsCts;\r
7488+ SK_U64 TxHwErrorsCts;\r
7489+ SK_U64 InErrorsCts;\r
7490+ SK_U64 OutErrorsCts;\r
7491+ SK_U64 ErrRecoveryCts;\r
7492+ SK_U64 SysUpTime;\r
7493+} SK_PNMI_STRUCT_DATA;\r
7494+\r
7495+#define SK_PNMI_STRUCT_SIZE (sizeof(SK_PNMI_STRUCT_DATA))\r
7496+\r
7497+/* The ReturnStatus field must be located before VpdFreeBytes! */\r
7498+#define SK_PNMI_MIN_STRUCT_SIZE ((unsigned int)(SK_UPTR)\\r
7499+ &(((SK_PNMI_STRUCT_DATA *)0)->VpdFreeBytes))\r
7500+\r
7501+/*\r
7502+ * Various definitions\r
7503+ */\r
7504+#define SK_PNMI_EVT_TIMER_CHECK 28125000L /* 28125 ms */\r
7505+\r
7506+#define SK_PNMI_VCT_TIMER_CHECK 4000000L /* 4 sec. */\r
7507+\r
7508+#define SK_PNMI_MAX_PROTOS 3\r
7509+\r
7510+/*\r
7511+ * SK_PNMI_CNT_NO must have the value of the enum SK_PNMI_MAX_IDX.\r
7512+ * Define SK_PNMI_CHECK to check this during init level SK_INIT_IO.\r
7513+ */\r
7514+#define SK_PNMI_CNT_NO 66\r
7515+\r
7516+/*\r
7517+ * Estimate data structure\r
7518+ */\r
7519+typedef struct s_PnmiEstimate {\r
7520+ unsigned int EstValueIndex;\r
7521+ SK_U64 EstValue[7];\r
7522+ SK_U64 Estimate;\r
7523+ SK_TIMER EstTimer;\r
7524+} SK_PNMI_ESTIMATE;\r
7525+\r
7526+\r
7527+/*\r
7528+ * PNMI specific adapter context structure\r
7529+ */\r
7530+typedef struct s_PnmiPort {\r
7531+ SK_U64 StatSyncCts;\r
7532+ SK_U64 StatSyncOctetsCts;\r
7533+ SK_U64 StatRxLongFrameCts;\r
7534+ SK_U64 StatRxFrameTooLongCts;\r
7535+ SK_U64 StatRxPMaccErr;\r
7536+ SK_U64 TxSwQueueLen;\r
7537+ SK_U64 TxSwQueueMax;\r
7538+ SK_U64 TxRetryCts;\r
7539+ SK_U64 RxIntrCts;\r
7540+ SK_U64 TxIntrCts;\r
7541+ SK_U64 RxNoBufCts;\r
7542+ SK_U64 TxNoBufCts;\r
7543+ SK_U64 TxUsedDescrNo;\r
7544+ SK_U64 RxDeliveredCts;\r
7545+ SK_U64 RxOctetsDeliveredCts;\r
7546+ SK_U64 RxHwErrorsCts;\r
7547+ SK_U64 TxHwErrorsCts;\r
7548+ SK_U64 InErrorsCts;\r
7549+ SK_U64 OutErrorsCts;\r
7550+ SK_U64 ErrRecoveryCts;\r
7551+ SK_U64 RxShortZeroMark;\r
7552+ SK_U64 CounterOffset[SK_PNMI_CNT_NO];\r
7553+ SK_U32 CounterHigh[SK_PNMI_CNT_NO];\r
7554+ SK_BOOL ActiveFlag;\r
7555+ SK_U8 Align[3];\r
7556+} SK_PNMI_PORT;\r
7557+\r
7558+\r
7559+typedef struct s_PnmiData {\r
7560+ SK_PNMI_PORT Port [SK_MAX_MACS];\r
7561+ SK_PNMI_PORT BufPort [SK_MAX_MACS]; /* 2002-09-13 pweber */\r
7562+ SK_U64 VirtualCounterOffset[SK_PNMI_CNT_NO];\r
7563+ SK_U32 TestResult;\r
7564+ char HwVersion[10];\r
7565+ SK_U16 Align01;\r
7566+\r
7567+ char *pDriverDescription;\r
7568+ char *pDriverVersion;\r
7569+ char *pDriverReleaseDate;\r
7570+ char *pDriverFileName;\r
7571+\r
7572+ int MacUpdatedFlag;\r
7573+ int RlmtUpdatedFlag;\r
7574+ int SirqUpdatedFlag;\r
7575+\r
7576+ SK_U64 RlmtChangeCts;\r
7577+ SK_U64 RlmtChangeTime;\r
7578+ SK_PNMI_ESTIMATE RlmtChangeEstimate;\r
7579+ SK_U64 RlmtChangeThreshold;\r
7580+\r
7581+ SK_U64 StartUpTime;\r
7582+ SK_U32 DeviceType;\r
7583+ char PciBusSpeed;\r
7584+ char PciBusWidth;\r
7585+ char Chipset;\r
7586+ char PMD;\r
7587+ char Connector;\r
7588+ SK_BOOL DualNetActiveFlag;\r
7589+ SK_U16 Align02;\r
7590+\r
7591+ char TrapBuf[SK_PNMI_TRAP_QUEUE_LEN];\r
7592+ unsigned int TrapBufFree;\r
7593+ unsigned int TrapQueueBeg;\r
7594+ unsigned int TrapQueueEnd;\r
7595+ unsigned int TrapBufPad;\r
7596+ unsigned int TrapUnique;\r
7597+ SK_U8 VctStatus[SK_MAX_MACS];\r
7598+ SK_PNMI_VCT VctBackup[SK_MAX_MACS];\r
7599+ SK_TIMER VctTimeout[SK_MAX_MACS];\r
7600+#ifdef SK_DIAG_SUPPORT\r
7601+ SK_U32 DiagAttached;\r
7602+#endif /* SK_DIAG_SUPPORT */\r
7603+ SK_BOOL VpdKeyReadError;\r
7604+} SK_PNMI;\r
7605+\r
7606+\r
7607+/*\r
7608+ * Function prototypes\r
7609+ */\r
7610+extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level);\r
7611+extern int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,\r
7612+ unsigned int* pLen, SK_U32 Instance, SK_U32 NetIndex);\r
7613+extern int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id,\r
7614+ void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);\r
7615+extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,\r
7616+ unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);\r
7617+extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,\r
7618+ unsigned int *pLen, SK_U32 NetIndex);\r
7619+extern int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,\r
7620+ unsigned int *pLen, SK_U32 NetIndex);\r
7621+extern int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,\r
7622+ unsigned int *pLen, SK_U32 NetIndex);\r
7623+extern int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event,\r
7624+ SK_EVPARA Param);\r
7625+extern int SkPnmiGenIoctl(SK_AC *pAC, SK_IOC IoC, void * pBuf,\r
7626+ unsigned int * pLen, SK_U32 NetIndex);\r
7627+\r
7628+#endif\r
7629diff -ruN linux/drivers/net/sk98lin/h/skgesirq.h linux-new/drivers/net/sk98lin/h/skgesirq.h
7630--- linux/drivers/net/sk98lin/h/skgesirq.h 2006-04-11 19:19:28.000000000 +0200
7631+++ linux-new/drivers/net/sk98lin/h/skgesirq.h 2006-01-18 14:37:24.000000000 +0100
7632@@ -2,23 +2,24 @@
7633 *
7634 * Name: skgesirq.h
7635 * Project: Gigabit Ethernet Adapters, Common Modules
7636- * Version: $Revision$
7637- * Date: $Date$
7638- * Purpose: SK specific Gigabit Ethernet special IRQ functions
7639+ * Version: $Revision$
7640+ * Date: $Date$
7641+ * Purpose: Gigabit Ethernet special IRQ functions
7642 *
7643 ******************************************************************************/
7644
7645 /******************************************************************************
7646 *
7647+ * LICENSE:
7648 * (C)Copyright 1998-2002 SysKonnect.
7649- * (C)Copyright 2002-2003 Marvell.
7650+ * (C)Copyright 2002-2005 Marvell.
7651 *
7652 * This program is free software; you can redistribute it and/or modify
7653 * it under the terms of the GNU General Public License as published by
7654 * the Free Software Foundation; either version 2 of the License, or
7655 * (at your option) any later version.
7656- *
7657 * The information in this file is provided "AS IS" without warranty.
7658+ * /LICENSE
7659 *
7660 ******************************************************************************/
7661
7662@@ -26,9 +27,9 @@
7663 #define _INC_SKGESIRQ_H_
7664
7665 /* Define return codes of SkGePortCheckUp and CheckShort */
7666-#define SK_HW_PS_NONE 0 /* No action needed */
7667-#define SK_HW_PS_RESTART 1 /* Restart needed */
7668-#define SK_HW_PS_LINK 2 /* Link Up actions needed */
7669+#define SK_HW_PS_NONE 0 /* No action needed */
7670+#define SK_HW_PS_RESTART 1 /* Restart needed */
7671+#define SK_HW_PS_LINK 2 /* Link Up actions needed */
7672
7673 /*
7674 * Define the Event the special IRQ/INI module can handle
7675@@ -44,10 +45,10 @@
7676 #define SK_HWEV_SET_SPEED 9 /* Set Link Speed by PNMI */
7677 #define SK_HWEV_HALFDUP_CHK 10 /* Half Duplex Hangup Workaround */
7678
7679-#define SK_WA_ACT_TIME (5000000UL) /* 5 sec */
7680-#define SK_WA_INA_TIME (100000UL) /* 100 msec */
7681+#define SK_WA_ACT_TIME 1000000UL /* 1000 msec (1 sec) */
7682+#define SK_WA_INA_TIME 100000UL /* 100 msec */
7683
7684-#define SK_HALFDUP_CHK_TIME (10000UL) /* 10 msec */
7685+#define SK_HALFDUP_CHK_TIME 10000UL /* 10 msec */
7686
7687 /*
7688 * Define the error numbers and messages
7689@@ -75,9 +76,9 @@
7690 #define SKERR_SIRQ_E011 (SKERR_SIRQ_E010+1)
7691 #define SKERR_SIRQ_E011MSG "CHECK failure XA2"
7692 #define SKERR_SIRQ_E012 (SKERR_SIRQ_E011+1)
7693-#define SKERR_SIRQ_E012MSG "unexpected IRQ Master error"
7694+#define SKERR_SIRQ_E012MSG "Unexpected IRQ Master error"
7695 #define SKERR_SIRQ_E013 (SKERR_SIRQ_E012+1)
7696-#define SKERR_SIRQ_E013MSG "unexpected IRQ Status error"
7697+#define SKERR_SIRQ_E013MSG "Unexpected IRQ Status error"
7698 #define SKERR_SIRQ_E014 (SKERR_SIRQ_E013+1)
7699 #define SKERR_SIRQ_E014MSG "Parity error on RAM (read)"
7700 #define SKERR_SIRQ_E015 (SKERR_SIRQ_E014+1)
7701@@ -102,10 +103,35 @@
7702 #define SKERR_SIRQ_E024MSG "FIFO overflow error"
7703 #define SKERR_SIRQ_E025 (SKERR_SIRQ_E024+1)
7704 #define SKERR_SIRQ_E025MSG "2 Pair Downshift detected"
7705+#define SKERR_SIRQ_E026 (SKERR_SIRQ_E025+1)
7706+#define SKERR_SIRQ_E026MSG "Uncorrectable PCI Express error"
7707+#define SKERR_SIRQ_E027 (SKERR_SIRQ_E026+1)
7708+#define SKERR_SIRQ_E027MSG "PCI Bus Abort detected"
7709+#define SKERR_SIRQ_E028 (SKERR_SIRQ_E027+1)
7710+#define SKERR_SIRQ_E028MSG "Parity error on RAM 1 (read)"
7711+#define SKERR_SIRQ_E029 (SKERR_SIRQ_E028+1)
7712+#define SKERR_SIRQ_E029MSG "Parity error on RAM 1 (write)"
7713+#define SKERR_SIRQ_E030 (SKERR_SIRQ_E029+1)
7714+#define SKERR_SIRQ_E030MSG "Parity error on RAM 2 (read)"
7715+#define SKERR_SIRQ_E031 (SKERR_SIRQ_E030+1)
7716+#define SKERR_SIRQ_E031MSG "Parity error on RAM 2 (write)"
7717+#define SKERR_SIRQ_E032 (SKERR_SIRQ_E031+1)
7718+#define SKERR_SIRQ_E032MSG "TCP segmentation error async. queue 1"
7719+#define SKERR_SIRQ_E033 (SKERR_SIRQ_E032+1)
7720+#define SKERR_SIRQ_E033MSG "TCP segmentation error sync. queue 1"
7721+#define SKERR_SIRQ_E034 (SKERR_SIRQ_E033+1)
7722+#define SKERR_SIRQ_E034MSG "TCP segmentation error async. queue 2"
7723+#define SKERR_SIRQ_E035 (SKERR_SIRQ_E034+1)
7724+#define SKERR_SIRQ_E035MSG "TCP segmentation error sync. queue 2"
7725+#define SKERR_SIRQ_E036 (SKERR_SIRQ_E035+1)
7726+#define SKERR_SIRQ_E036MSG "CHECK failure polling unit"
7727
7728 extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus);
7729 extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para);
7730 extern void SkHWLinkUp(SK_AC *pAC, SK_IOC IoC, int Port);
7731 extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port);
7732+extern void SkGeYuSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus);
7733+extern void SkYuk2SirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus);
7734
7735 #endif /* _INC_SKGESIRQ_H_ */
7736+
7737diff -ruN linux/drivers/net/sk98lin/h/skgetwsi.h linux-new/drivers/net/sk98lin/h/skgetwsi.h
7738--- linux/drivers/net/sk98lin/h/skgetwsi.h 1970-01-01 01:00:00.000000000 +0100
7739+++ linux-new/drivers/net/sk98lin/h/skgetwsi.h 2006-01-18 14:37:24.000000000 +0100
7740@@ -0,0 +1,241 @@
7741+/******************************************************************************
7742+ *
7743+ * Name: skgetwsi.h
7744+ * Project: Gigabit Ethernet Adapters, TWSI-Module
7745+ * Version: $Revision$
7746+ * Date: $Date$
7747+ * Purpose: Special defines for TWSI
7748+ *
7749+ ******************************************************************************/
7750+
7751+/******************************************************************************
7752+ *
7753+ * (C)Copyright 1998-2002 SysKonnect.
7754+ * (C)Copyright 2002-2004 Marvell.
7755+ *
7756+ * This program is free software; you can redistribute it and/or modify
7757+ * it under the terms of the GNU General Public License as published by
7758+ * the Free Software Foundation; either version 2 of the License, or
7759+ * (at your option) any later version.
7760+ * The information in this file is provided "AS IS" without warranty.
7761+ *
7762+ ******************************************************************************/
7763+
7764+/*
7765+ * SKGETWSI.H contains all SK-98xx specific defines for the TWSI handling
7766+ */
7767+
7768+#ifndef _INC_SKGETWSI_H_
7769+#define _INC_SKGETWSI_H_
7770+
7771+/*
7772+ * Macros to access the B2_I2C_CTRL
7773+ */
7774+#define SK_I2C_CTL(IoC, flag, dev, dev_size, reg, burst) \
7775+ SK_OUT32(IoC, B2_I2C_CTRL,\
7776+ (flag ? 0x80000000UL : 0x0L) | \
7777+ (((SK_U32)reg << 16) & I2C_ADDR) | \
7778+ (((SK_U32)dev << 9) & I2C_DEV_SEL) | \
7779+ (dev_size & I2C_DEV_SIZE) | \
7780+ ((burst << 4) & I2C_BURST_LEN))
7781+
7782+#define SK_I2C_STOP(IoC) { \
7783+ SK_U32 I2cCtrl; \
7784+ SK_IN32(IoC, B2_I2C_CTRL, &I2cCtrl); \
7785+ SK_OUT32(IoC, B2_I2C_CTRL, I2cCtrl | I2C_STOP); \
7786+}
7787+
7788+#define SK_I2C_GET_CTL(IoC, pI2cCtrl) SK_IN32(IoC, B2_I2C_CTRL, pI2cCtrl)
7789+
7790+/*
7791+ * Macros to access the TWSI SW Registers
7792+ */
7793+#define SK_I2C_SET_BIT(IoC, SetBits) { \
7794+ SK_U8 OrgBits; \
7795+ SK_IN8(IoC, B2_I2C_SW, &OrgBits); \
7796+ SK_OUT8(IoC, B2_I2C_SW, OrgBits | (SK_U8)(SetBits)); \
7797+}
7798+
7799+#define SK_I2C_CLR_BIT(IoC, ClrBits) { \
7800+ SK_U8 OrgBits; \
7801+ SK_IN8(IoC, B2_I2C_SW, &OrgBits); \
7802+ SK_OUT8(IoC, B2_I2C_SW, OrgBits & ~((SK_U8)(ClrBits))); \
7803+}
7804+
7805+#define SK_I2C_GET_SW(IoC, pI2cSw) SK_IN8(IoC, B2_I2C_SW, pI2cSw)
7806+
7807+/*
7808+ * define the possible sensor states
7809+ */
7810+#define SK_SEN_IDLE 0 /* Idle: sensor not read */
7811+#define SK_SEN_VALUE 1 /* Value Read cycle */
7812+#define SK_SEN_VALEXT 2 /* Extended Value Read cycle */
7813+
7814+/*
7815+ * Conversion factor to convert read Voltage sensor to milli Volt
7816+ * Conversion factor to convert read Temperature sensor to 10th degree Celsius
7817+ */
7818+#define SK_LM80_VT_LSB 22 /* 22mV LSB resolution */
7819+#define SK_LM80_TEMP_LSB 10 /* 1 degree LSB resolution */
7820+#define SK_LM80_TEMPEXT_LSB 5 /* 0.5 degree LSB resolution for ext. val. */
7821+
7822+/*
7823+ * formula: counter = (22500*60)/(rpm * divisor * pulses/2)
7824+ * assuming: 6500rpm, 4 pulses, divisor 1
7825+ */
7826+#define SK_LM80_FAN_FAKTOR ((22500L*60)/(1*2))
7827+
7828+/*
7829+ * Define sensor management data
7830+ * Maximum is reached on Genesis copper dual port and Yukon-64
7831+ * Board specific maximum is in pAC->I2c.MaxSens
7832+ */
7833+#define SK_MAX_SENSORS 8 /* maximal no. of installed sensors */
7834+#define SK_MIN_SENSORS 5 /* minimal no. of installed sensors */
7835+
7836+/*
7837+ * To watch the state machine (SM) use the timer in two ways
7838+ * instead of one as hitherto
7839+ */
7840+#define SK_TIMER_WATCH_SM 0 /* Watch the SM to finish in a spec. time */
7841+#define SK_TIMER_NEW_GAUGING 1 /* Start a new gauging when timer expires */
7842+
7843+/*
7844+ * Defines for the individual thresholds
7845+ */
7846+
7847+#define C_PLUS_20 120 / 100
7848+#define C_PLUS_15 115 / 100
7849+#define C_PLUS_10 110 / 100
7850+#define C_PLUS_5 105 / 100
7851+#define C_MINUS_5 95 / 100
7852+#define C_MINUS_10 90 / 100
7853+#define C_MINUS_15 85 / 100
7854+
7855+/* Temperature sensor */
7856+#define SK_SEN_TEMP_HIGH_ERR 800 /* Temperature High Err Threshold */
7857+#define SK_SEN_TEMP_HIGH_WARN 700 /* Temperature High Warn Threshold */
7858+#define SK_SEN_TEMP_LOW_WARN 100 /* Temperature Low Warn Threshold */
7859+#define SK_SEN_TEMP_LOW_ERR 0 /* Temperature Low Err Threshold */
7860+
7861+/* VCC which should be 5 V */
7862+#define SK_SEN_PCI_5V_HIGH_ERR 5588 /* Voltage PCI High Err Threshold */
7863+#define SK_SEN_PCI_5V_HIGH_WARN 5346 /* Voltage PCI High Warn Threshold */
7864+#define SK_SEN_PCI_5V_LOW_WARN 4664 /* Voltage PCI Low Warn Threshold */
7865+#define SK_SEN_PCI_5V_LOW_ERR 4422 /* Voltage PCI Low Err Threshold */
7866+
7867+/*
7868+ * VIO may be 5 V or 3.3 V. Initialization takes two parts:
7869+ * 1. Initialize lowest lower limit and highest higher limit.
7870+ * 2. After the first value is read correct the upper or the lower limit to
7871+ * the appropriate C constant.
7872+ *
7873+ * Warning limits are +-5% of the exepected voltage.
7874+ * Error limits are +-10% of the expected voltage.
7875+ */
7876+
7877+/* Bug fix AF: 16.Aug.2001: Correct the init base of LM80 sensor */
7878+
7879+#define SK_SEN_PCI_IO_5V_HIGH_ERR 5566 /* + 10% V PCI-IO High Err Threshold */
7880+#define SK_SEN_PCI_IO_5V_HIGH_WARN 5324 /* + 5% V PCI-IO High Warn Threshold */
7881+ /* 5000 mVolt */
7882+#define SK_SEN_PCI_IO_5V_LOW_WARN 4686 /* - 5% V PCI-IO Low Warn Threshold */
7883+#define SK_SEN_PCI_IO_5V_LOW_ERR 4444 /* - 10% V PCI-IO Low Err Threshold */
7884+
7885+#define SK_SEN_PCI_IO_RANGE_LIMITER 4000 /* 4000 mV range delimiter */
7886+
7887+/* correction values for the second pass */
7888+#define SK_SEN_PCI_IO_3V3_HIGH_ERR 3850 /* + 15% V PCI-IO High Err Threshold */
7889+#define SK_SEN_PCI_IO_3V3_HIGH_WARN 3674 /* + 10% V PCI-IO High Warn Threshold */
7890+ /* 3300 mVolt */
7891+#define SK_SEN_PCI_IO_3V3_LOW_WARN 2926 /* - 10% V PCI-IO Low Warn Threshold */
7892+#define SK_SEN_PCI_IO_3V3_LOW_ERR 2772 /* - 15% V PCI-IO Low Err Threshold */
7893+
7894+/*
7895+ * VDD voltage
7896+ */
7897+#define SK_SEN_VDD_HIGH_ERR 3630 /* Voltage ASIC High Err Threshold */
7898+#define SK_SEN_VDD_HIGH_WARN 3476 /* Voltage ASIC High Warn Threshold */
7899+#define SK_SEN_VDD_LOW_WARN 3146 /* Voltage ASIC Low Warn Threshold */
7900+#define SK_SEN_VDD_LOW_ERR 2970 /* Voltage ASIC Low Err Threshold */
7901+
7902+/*
7903+ * PHY PLL 3V3 voltage
7904+ */
7905+#define SK_SEN_PLL_3V3_HIGH_ERR 3630 /* Voltage PMA High Err Threshold */
7906+#define SK_SEN_PLL_3V3_HIGH_WARN 3476 /* Voltage PMA High Warn Threshold */
7907+#define SK_SEN_PLL_3V3_LOW_WARN 3146 /* Voltage PMA Low Warn Threshold */
7908+#define SK_SEN_PLL_3V3_LOW_ERR 2970 /* Voltage PMA Low Err Threshold */
7909+
7910+/*
7911+ * VAUX (YUKON only)
7912+ */
7913+#define SK_SEN_VAUX_3V3_VAL 3300 /* Voltage VAUX 3.3 Volt */
7914+
7915+#define SK_SEN_VAUX_3V3_HIGH_ERR (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_PLUS_10)
7916+#define SK_SEN_VAUX_3V3_HIGH_WARN (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_PLUS_5)
7917+#define SK_SEN_VAUX_3V3_LOW_WARN (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_MINUS_5)
7918+#define SK_SEN_VAUX_3V3_LOW_ERR (SK_I32)(SK_SEN_VAUX_3V3_VAL * C_MINUS_10)
7919+
7920+#define SK_SEN_VAUX_RANGE_LIMITER 1000 /* 1000 mV range delimiter */
7921+
7922+/*
7923+ * PHY 2V5 voltage
7924+ */
7925+#define SK_SEN_PHY_2V5_VAL 2500 /* Voltage PHY 2.5 Volt */
7926+
7927+#define SK_SEN_PHY_2V5_HIGH_ERR (SK_I32)(SK_SEN_PHY_2V5_VAL * C_PLUS_10)
7928+#define SK_SEN_PHY_2V5_HIGH_WARN (SK_I32)(SK_SEN_PHY_2V5_VAL * C_PLUS_5)
7929+#define SK_SEN_PHY_2V5_LOW_WARN (SK_I32)(SK_SEN_PHY_2V5_VAL * C_MINUS_5)
7930+#define SK_SEN_PHY_2V5_LOW_ERR (SK_I32)(SK_SEN_PHY_2V5_VAL * C_MINUS_10)
7931+
7932+/*
7933+ * ASIC Core 1V5 voltage (YUKON only)
7934+ */
7935+#define SK_SEN_CORE_1V5_VAL 1500 /* Voltage ASIC Core 1.5 Volt */
7936+
7937+#define SK_SEN_CORE_1V5_HIGH_ERR (SK_I32)(SK_SEN_CORE_1V5_VAL * C_PLUS_10)
7938+#define SK_SEN_CORE_1V5_HIGH_WARN (SK_I32)(SK_SEN_CORE_1V5_VAL * C_PLUS_5)
7939+#define SK_SEN_CORE_1V5_LOW_WARN (SK_I32)(SK_SEN_CORE_1V5_VAL * C_MINUS_5)
7940+#define SK_SEN_CORE_1V5_LOW_ERR (SK_I32)(SK_SEN_CORE_1V5_VAL * C_MINUS_10)
7941+
7942+/*
7943+ * ASIC Core 1V2 (1V3) voltage (YUKON-2 only)
7944+ */
7945+#define SK_SEN_CORE_1V2_VAL 1200 /* Voltage ASIC Core 1.2 Volt */
7946+
7947+#define SK_SEN_CORE_1V2_HIGH_ERR (SK_I32)(SK_SEN_CORE_1V2_VAL * C_PLUS_20)
7948+#define SK_SEN_CORE_1V2_HIGH_WARN (SK_I32)(SK_SEN_CORE_1V2_VAL * C_PLUS_15)
7949+#define SK_SEN_CORE_1V2_LOW_WARN (SK_I32)(SK_SEN_CORE_1V2_VAL * C_MINUS_5)
7950+#define SK_SEN_CORE_1V2_LOW_ERR (SK_I32)(SK_SEN_CORE_1V2_VAL * C_MINUS_10)
7951+
7952+#define SK_SEN_CORE_1V3_VAL 1300 /* Voltage ASIC Core 1.3 Volt */
7953+
7954+#define SK_SEN_CORE_1V3_HIGH_ERR (SK_I32)(SK_SEN_CORE_1V3_VAL * C_PLUS_15)
7955+#define SK_SEN_CORE_1V3_HIGH_WARN (SK_I32)(SK_SEN_CORE_1V3_VAL * C_PLUS_10)
7956+#define SK_SEN_CORE_1V3_LOW_WARN (SK_I32)(SK_SEN_CORE_1V3_VAL * C_MINUS_5)
7957+#define SK_SEN_CORE_1V3_LOW_ERR (SK_I32)(SK_SEN_CORE_1V3_VAL * C_MINUS_10)
7958+
7959+/*
7960+ * FAN 1 speed
7961+ */
7962+/* assuming: 6500rpm +-15%, 4 pulses,
7963+ * warning at: 80 %
7964+ * error at: 70 %
7965+ * no upper limit
7966+ */
7967+#define SK_SEN_FAN_HIGH_ERR 20000 /* FAN Speed High Err Threshold */
7968+#define SK_SEN_FAN_HIGH_WARN 20000 /* FAN Speed High Warn Threshold */
7969+#define SK_SEN_FAN_LOW_WARN 5200 /* FAN Speed Low Warn Threshold */
7970+#define SK_SEN_FAN_LOW_ERR 4550 /* FAN Speed Low Err Threshold */
7971+
7972+/*
7973+ * Some Voltages need dynamic thresholds
7974+ */
7975+#define SK_SEN_DYN_INIT_NONE 0 /* No dynamic init of thresholds */
7976+#define SK_SEN_DYN_INIT_PCI_IO 10 /* Init PCI-IO with new thresholds */
7977+#define SK_SEN_DYN_INIT_VAUX 11 /* Init VAUX with new thresholds */
7978+
7979+extern int SkLm80ReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen);
7980+#endif /* n_INC_SKGETWSI_H */
7981+
7982diff -ruN linux/drivers/net/sk98lin/h/ski2c.h linux-new/drivers/net/sk98lin/h/ski2c.h
7983--- linux/drivers/net/sk98lin/h/ski2c.h 2006-04-11 19:19:28.000000000 +0200
7984+++ linux-new/drivers/net/sk98lin/h/ski2c.h 1970-01-01 01:00:00.000000000 +0100
7985@@ -1,177 +0,0 @@
7986-/******************************************************************************
7987- *
7988- * Name: ski2c.h
7989- * Project: Gigabit Ethernet Adapters, TWSI-Module
7990- * Version: $Revision$
7991- * Date: $Date$
7992- * Purpose: Defines to access Voltage and Temperature Sensor
7993- *
7994- ******************************************************************************/
7995-
7996-/******************************************************************************
7997- *
7998- * (C)Copyright 1998-2002 SysKonnect.
7999- * (C)Copyright 2002-2003 Marvell.
8000- *
8001- * This program is free software; you can redistribute it and/or modify
8002- * it under the terms of the GNU General Public License as published by
8003- * the Free Software Foundation; either version 2 of the License, or
8004- * (at your option) any later version.
8005- *
8006- * The information in this file is provided "AS IS" without warranty.
8007- *
8008- ******************************************************************************/
8009-
8010-/*
8011- * SKI2C.H contains all I2C specific defines
8012- */
8013-
8014-#ifndef _SKI2C_H_
8015-#define _SKI2C_H_
8016-
8017-typedef struct s_Sensor SK_SENSOR;
8018-
8019-#include "h/skgei2c.h"
8020-
8021-/*
8022- * Define the I2C events.
8023- */
8024-#define SK_I2CEV_IRQ 1 /* IRQ happened Event */
8025-#define SK_I2CEV_TIM 2 /* Timeout event */
8026-#define SK_I2CEV_CLEAR 3 /* Clear MIB Values */
8027-
8028-/*
8029- * Define READ and WRITE Constants.
8030- */
8031-#define I2C_READ 0
8032-#define I2C_WRITE 1
8033-#define I2C_BURST 1
8034-#define I2C_SINGLE 0
8035-
8036-#define SKERR_I2C_E001 (SK_ERRBASE_I2C+0)
8037-#define SKERR_I2C_E001MSG "Sensor index unknown"
8038-#define SKERR_I2C_E002 (SKERR_I2C_E001+1)
8039-#define SKERR_I2C_E002MSG "TWSI: transfer does not complete"
8040-#define SKERR_I2C_E003 (SKERR_I2C_E002+1)
8041-#define SKERR_I2C_E003MSG "LM80: NAK on device send"
8042-#define SKERR_I2C_E004 (SKERR_I2C_E003+1)
8043-#define SKERR_I2C_E004MSG "LM80: NAK on register send"
8044-#define SKERR_I2C_E005 (SKERR_I2C_E004+1)
8045-#define SKERR_I2C_E005MSG "LM80: NAK on device (2) send"
8046-#define SKERR_I2C_E006 (SKERR_I2C_E005+1)
8047-#define SKERR_I2C_E006MSG "Unknown event"
8048-#define SKERR_I2C_E007 (SKERR_I2C_E006+1)
8049-#define SKERR_I2C_E007MSG "LM80 read out of state"
8050-#define SKERR_I2C_E008 (SKERR_I2C_E007+1)
8051-#define SKERR_I2C_E008MSG "Unexpected sensor read completed"
8052-#define SKERR_I2C_E009 (SKERR_I2C_E008+1)
8053-#define SKERR_I2C_E009MSG "WARNING: temperature sensor out of range"
8054-#define SKERR_I2C_E010 (SKERR_I2C_E009+1)
8055-#define SKERR_I2C_E010MSG "WARNING: voltage sensor out of range"
8056-#define SKERR_I2C_E011 (SKERR_I2C_E010+1)
8057-#define SKERR_I2C_E011MSG "ERROR: temperature sensor out of range"
8058-#define SKERR_I2C_E012 (SKERR_I2C_E011+1)
8059-#define SKERR_I2C_E012MSG "ERROR: voltage sensor out of range"
8060-#define SKERR_I2C_E013 (SKERR_I2C_E012+1)
8061-#define SKERR_I2C_E013MSG "ERROR: couldn't init sensor"
8062-#define SKERR_I2C_E014 (SKERR_I2C_E013+1)
8063-#define SKERR_I2C_E014MSG "WARNING: fan sensor out of range"
8064-#define SKERR_I2C_E015 (SKERR_I2C_E014+1)
8065-#define SKERR_I2C_E015MSG "ERROR: fan sensor out of range"
8066-#define SKERR_I2C_E016 (SKERR_I2C_E015+1)
8067-#define SKERR_I2C_E016MSG "TWSI: active transfer does not complete"
8068-
8069-/*
8070- * Define Timeout values
8071- */
8072-#define SK_I2C_TIM_LONG 2000000L /* 2 seconds */
8073-#define SK_I2C_TIM_SHORT 100000L /* 100 milliseconds */
8074-#define SK_I2C_TIM_WATCH 1000000L /* 1 second */
8075-
8076-/*
8077- * Define trap and error log hold times
8078- */
8079-#ifndef SK_SEN_ERR_TR_HOLD
8080-#define SK_SEN_ERR_TR_HOLD (4*SK_TICKS_PER_SEC)
8081-#endif
8082-#ifndef SK_SEN_ERR_LOG_HOLD
8083-#define SK_SEN_ERR_LOG_HOLD (60*SK_TICKS_PER_SEC)
8084-#endif
8085-#ifndef SK_SEN_WARN_TR_HOLD
8086-#define SK_SEN_WARN_TR_HOLD (15*SK_TICKS_PER_SEC)
8087-#endif
8088-#ifndef SK_SEN_WARN_LOG_HOLD
8089-#define SK_SEN_WARN_LOG_HOLD (15*60*SK_TICKS_PER_SEC)
8090-#endif
8091-
8092-/*
8093- * Defines for SenType
8094- */
8095-#define SK_SEN_UNKNOWN 0
8096-#define SK_SEN_TEMP 1
8097-#define SK_SEN_VOLT 2
8098-#define SK_SEN_FAN 3
8099-
8100-/*
8101- * Define for the SenErrorFlag
8102- */
8103-#define SK_SEN_ERR_NOT_PRESENT 0 /* Error Flag: Sensor not present */
8104-#define SK_SEN_ERR_OK 1 /* Error Flag: O.K. */
8105-#define SK_SEN_ERR_WARN 2 /* Error Flag: Warning */
8106-#define SK_SEN_ERR_ERR 3 /* Error Flag: Error */
8107-#define SK_SEN_ERR_FAULTY 4 /* Error Flag: Faulty */
8108-
8109-/*
8110- * Define the Sensor struct
8111- */
8112-struct s_Sensor {
8113- char *SenDesc; /* Description */
8114- int SenType; /* Voltage or Temperature */
8115- SK_I32 SenValue; /* Current value of the sensor */
8116- SK_I32 SenThreErrHigh; /* High error Threshhold of this sensor */
8117- SK_I32 SenThreWarnHigh; /* High warning Threshhold of this sensor */
8118- SK_I32 SenThreErrLow; /* Lower error Threshold of the sensor */
8119- SK_I32 SenThreWarnLow; /* Lower warning Threshold of the sensor */
8120- int SenErrFlag; /* Sensor indicated an error */
8121- SK_BOOL SenInit; /* Is sensor initialized ? */
8122- SK_U64 SenErrCts; /* Error trap counter */
8123- SK_U64 SenWarnCts; /* Warning trap counter */
8124- SK_U64 SenBegErrTS; /* Begin error timestamp */
8125- SK_U64 SenBegWarnTS; /* Begin warning timestamp */
8126- SK_U64 SenLastErrTrapTS; /* Last error trap timestamp */
8127- SK_U64 SenLastErrLogTS; /* Last error log timestamp */
8128- SK_U64 SenLastWarnTrapTS; /* Last warning trap timestamp */
8129- SK_U64 SenLastWarnLogTS; /* Last warning log timestamp */
8130- int SenState; /* Sensor State (see HW specific include) */
8131- int (*SenRead)(SK_AC *pAC, SK_IOC IoC, struct s_Sensor *pSen);
8132- /* Sensors read function */
8133- SK_U16 SenReg; /* Register Address for this sensor */
8134- SK_U8 SenDev; /* Device Selection for this sensor */
8135-};
8136-
8137-typedef struct s_I2c {
8138- SK_SENSOR SenTable[SK_MAX_SENSORS]; /* Sensor Table */
8139- int CurrSens; /* Which sensor is currently queried */
8140- int MaxSens; /* Max. number of sensors */
8141- int TimerMode; /* Use the timer also to watch the state machine */
8142- int InitLevel; /* Initialized Level */
8143-#ifndef SK_DIAG
8144- int DummyReads; /* Number of non-checked dummy reads */
8145- SK_TIMER SenTimer; /* Sensors timer */
8146-#endif /* !SK_DIAG */
8147-} SK_I2C;
8148-
8149-extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level);
8150-extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size,
8151- int Reg, int Burst);
8152-extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen);
8153-#ifdef SK_DIAG
8154-extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg,
8155- int Burst);
8156-#else /* !SK_DIAG */
8157-extern int SkI2cEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para);
8158-extern void SkI2cWaitIrq(SK_AC *pAC, SK_IOC IoC);
8159-extern void SkI2cIsr(SK_AC *pAC, SK_IOC IoC);
8160-#endif /* !SK_DIAG */
8161-#endif /* n_SKI2C_H */
8162-
8163diff -ruN linux/drivers/net/sk98lin/h/skqueue.h linux-new/drivers/net/sk98lin/h/skqueue.h
8164--- linux/drivers/net/sk98lin/h/skqueue.h 2006-04-11 19:19:28.000000000 +0200
8165+++ linux-new/drivers/net/sk98lin/h/skqueue.h 2006-01-18 14:37:24.000000000 +0100
8166@@ -2,8 +2,8 @@
8167 *
8168 * Name: skqueue.h
8169 * Project: Gigabit Ethernet Adapters, Event Scheduler Module
8170- * Version: $Revision$
8171- * Date: $Date$
8172+ * Version: $Revision$
8173+ * Date: $Date$
8174 * Purpose: Defines for the Event queue
8175 *
8176 ******************************************************************************/
8177@@ -45,6 +45,9 @@
8178 #define SKGE_RSF 11 /* RSF Aggregation Event Class */
8179 #define SKGE_MARKER 12 /* MARKER Aggregation Event Class */
8180 #define SKGE_FD 13 /* FD Distributor Event Class */
8181+#ifdef SK_ASF
8182+#define SKGE_ASF 14 /* ASF Event Class */
8183+#endif
8184
8185 /*
8186 * define event queue as circular buffer
8187@@ -90,5 +93,11 @@
8188 #define SKERR_Q_E001MSG "Event queue overflow"
8189 #define SKERR_Q_E002 (SKERR_Q_E001+1)
8190 #define SKERR_Q_E002MSG "Undefined event class"
8191+#define SKERR_Q_E003 (SKERR_Q_E001+2)
8192+#define SKERR_Q_E003MSG "Event queued in Init Level 0"
8193+#define SKERR_Q_E004 (SKERR_Q_E001+3)
8194+#define SKERR_Q_E004MSG "Error Reported from Event Fuction (Queue Blocked)"
8195+#define SKERR_Q_E005 (SKERR_Q_E001+4)
8196+#define SKERR_Q_E005MSG "Event scheduler called in Init Level 0 or 1"
8197 #endif /* _SKQUEUE_H_ */
8198
8199diff -ruN linux/drivers/net/sk98lin/h/skrlmt.h linux-new/drivers/net/sk98lin/h/skrlmt.h
8200--- linux/drivers/net/sk98lin/h/skrlmt.h 2006-04-11 19:19:28.000000000 +0200
8201+++ linux-new/drivers/net/sk98lin/h/skrlmt.h 2006-01-18 14:37:24.000000000 +0100
8202@@ -2,8 +2,8 @@
8203 *
8204 * Name: skrlmt.h
8205 * Project: GEnesis, PCI Gigabit Ethernet Adapter
8206- * Version: $Revision$
8207- * Date: $Date$
8208+ * Version: $Revision$
8209+ * Date: $Date$
8210 * Purpose: Header file for Redundant Link ManagemenT.
8211 *
8212 ******************************************************************************/
8213diff -ruN linux/drivers/net/sk98lin/h/sktimer.h linux-new/drivers/net/sk98lin/h/sktimer.h
8214--- linux/drivers/net/sk98lin/h/sktimer.h 2006-04-11 19:19:28.000000000 +0200
8215+++ linux-new/drivers/net/sk98lin/h/sktimer.h 2006-01-18 14:37:24.000000000 +0100
8216@@ -2,8 +2,8 @@
8217 *
8218 * Name: sktimer.h
8219 * Project: Gigabit Ethernet Adapters, Event Scheduler Module
8220- * Version: $Revision$
8221- * Date: $Date$
8222+ * Version: $Revision$
8223+ * Date: $Date$
8224 * Purpose: Defines for the timer functions
8225 *
8226 ******************************************************************************/
8227diff -ruN linux/drivers/net/sk98lin/h/sktwsi.h linux-new/drivers/net/sk98lin/h/sktwsi.h
8228--- linux/drivers/net/sk98lin/h/sktwsi.h 1970-01-01 01:00:00.000000000 +0100
8229+++ linux-new/drivers/net/sk98lin/h/sktwsi.h 2006-01-18 14:37:24.000000000 +0100
8230@@ -0,0 +1,177 @@
8231+/******************************************************************************
8232+ *
8233+ * Name: sktwsi.h
8234+ * Project: Gigabit Ethernet Adapters, TWSI-Module
8235+ * Version: $Revision$
8236+ * Date: $Date$
8237+ * Purpose: Defines to access Voltage and Temperature Sensor
8238+ *
8239+ ******************************************************************************/
8240+
8241+/******************************************************************************
8242+ *
8243+ * (C)Copyright 1998-2002 SysKonnect.
8244+ * (C)Copyright 2002-2003 Marvell.
8245+ *
8246+ * This program is free software; you can redistribute it and/or modify
8247+ * it under the terms of the GNU General Public License as published by
8248+ * the Free Software Foundation; either version 2 of the License, or
8249+ * (at your option) any later version.
8250+ *
8251+ * The information in this file is provided "AS IS" without warranty.
8252+ *
8253+ ******************************************************************************/
8254+
8255+/*
8256+ * SKTWSI.H contains all TWSI specific defines
8257+ */
8258+
8259+#ifndef _SKTWSI_H_
8260+#define _SKTWSI_H_
8261+
8262+typedef struct s_Sensor SK_SENSOR;
8263+
8264+#include "h/skgetwsi.h"
8265+
8266+/*
8267+ * Define the TWSI events.
8268+ */
8269+#define SK_I2CEV_IRQ 1 /* IRQ happened Event */
8270+#define SK_I2CEV_TIM 2 /* Timeout event */
8271+#define SK_I2CEV_CLEAR 3 /* Clear MIB Values */
8272+
8273+/*
8274+ * Define READ and WRITE Constants.
8275+ */
8276+#define I2C_READ 0
8277+#define I2C_WRITE 1
8278+#define I2C_BURST 1
8279+#define I2C_SINGLE 0
8280+
8281+#define SKERR_I2C_E001 (SK_ERRBASE_I2C+0)
8282+#define SKERR_I2C_E001MSG "Sensor index unknown"
8283+#define SKERR_I2C_E002 (SKERR_I2C_E001+1)
8284+#define SKERR_I2C_E002MSG "TWSI: transfer does not complete"
8285+#define SKERR_I2C_E003 (SKERR_I2C_E002+1)
8286+#define SKERR_I2C_E003MSG "LM80: NAK on device send"
8287+#define SKERR_I2C_E004 (SKERR_I2C_E003+1)
8288+#define SKERR_I2C_E004MSG "LM80: NAK on register send"
8289+#define SKERR_I2C_E005 (SKERR_I2C_E004+1)
8290+#define SKERR_I2C_E005MSG "LM80: NAK on device (2) send"
8291+#define SKERR_I2C_E006 (SKERR_I2C_E005+1)
8292+#define SKERR_I2C_E006MSG "Unknown event"
8293+#define SKERR_I2C_E007 (SKERR_I2C_E006+1)
8294+#define SKERR_I2C_E007MSG "LM80 read out of state"
8295+#define SKERR_I2C_E008 (SKERR_I2C_E007+1)
8296+#define SKERR_I2C_E008MSG "Unexpected sensor read completed"
8297+#define SKERR_I2C_E009 (SKERR_I2C_E008+1)
8298+#define SKERR_I2C_E009MSG "WARNING: temperature sensor out of range"
8299+#define SKERR_I2C_E010 (SKERR_I2C_E009+1)
8300+#define SKERR_I2C_E010MSG "WARNING: voltage sensor out of range"
8301+#define SKERR_I2C_E011 (SKERR_I2C_E010+1)
8302+#define SKERR_I2C_E011MSG "ERROR: temperature sensor out of range"
8303+#define SKERR_I2C_E012 (SKERR_I2C_E011+1)
8304+#define SKERR_I2C_E012MSG "ERROR: voltage sensor out of range"
8305+#define SKERR_I2C_E013 (SKERR_I2C_E012+1)
8306+#define SKERR_I2C_E013MSG "ERROR: couldn't init sensor"
8307+#define SKERR_I2C_E014 (SKERR_I2C_E013+1)
8308+#define SKERR_I2C_E014MSG "WARNING: fan sensor out of range"
8309+#define SKERR_I2C_E015 (SKERR_I2C_E014+1)
8310+#define SKERR_I2C_E015MSG "ERROR: fan sensor out of range"
8311+#define SKERR_I2C_E016 (SKERR_I2C_E015+1)
8312+#define SKERR_I2C_E016MSG "TWSI: active transfer does not complete"
8313+
8314+/*
8315+ * Define Timeout values
8316+ */
8317+#define SK_I2C_TIM_LONG 2000000L /* 2 seconds */
8318+#define SK_I2C_TIM_SHORT 100000L /* 100 milliseconds */
8319+#define SK_I2C_TIM_WATCH 1000000L /* 1 second */
8320+
8321+/*
8322+ * Define trap and error log hold times
8323+ */
8324+#ifndef SK_SEN_ERR_TR_HOLD
8325+#define SK_SEN_ERR_TR_HOLD (4*SK_TICKS_PER_SEC)
8326+#endif
8327+#ifndef SK_SEN_ERR_LOG_HOLD
8328+#define SK_SEN_ERR_LOG_HOLD (60*SK_TICKS_PER_SEC)
8329+#endif
8330+#ifndef SK_SEN_WARN_TR_HOLD
8331+#define SK_SEN_WARN_TR_HOLD (15*SK_TICKS_PER_SEC)
8332+#endif
8333+#ifndef SK_SEN_WARN_LOG_HOLD
8334+#define SK_SEN_WARN_LOG_HOLD (15*60*SK_TICKS_PER_SEC)
8335+#endif
8336+
8337+/*
8338+ * Defines for SenType
8339+ */
8340+#define SK_SEN_UNKNOWN 0
8341+#define SK_SEN_TEMP 1
8342+#define SK_SEN_VOLT 2
8343+#define SK_SEN_FAN 3
8344+
8345+/*
8346+ * Define for the SenErrorFlag
8347+ */
8348+#define SK_SEN_ERR_NOT_PRESENT 0 /* Error Flag: Sensor not present */
8349+#define SK_SEN_ERR_OK 1 /* Error Flag: O.K. */
8350+#define SK_SEN_ERR_WARN 2 /* Error Flag: Warning */
8351+#define SK_SEN_ERR_ERR 3 /* Error Flag: Error */
8352+#define SK_SEN_ERR_FAULTY 4 /* Error Flag: Faulty */
8353+
8354+/*
8355+ * Define the Sensor struct
8356+ */
8357+struct s_Sensor {
8358+ char *SenDesc; /* Description */
8359+ int SenType; /* Voltage or Temperature */
8360+ SK_I32 SenValue; /* Current value of the sensor */
8361+ SK_I32 SenThreErrHigh; /* High error Threshhold of this sensor */
8362+ SK_I32 SenThreWarnHigh; /* High warning Threshhold of this sensor */
8363+ SK_I32 SenThreErrLow; /* Lower error Threshold of the sensor */
8364+ SK_I32 SenThreWarnLow; /* Lower warning Threshold of the sensor */
8365+ int SenErrFlag; /* Sensor indicated an error */
8366+ SK_BOOL SenInit; /* Is sensor initialized ? */
8367+ SK_U64 SenErrCts; /* Error trap counter */
8368+ SK_U64 SenWarnCts; /* Warning trap counter */
8369+ SK_U64 SenBegErrTS; /* Begin error timestamp */
8370+ SK_U64 SenBegWarnTS; /* Begin warning timestamp */
8371+ SK_U64 SenLastErrTrapTS; /* Last error trap timestamp */
8372+ SK_U64 SenLastErrLogTS; /* Last error log timestamp */
8373+ SK_U64 SenLastWarnTrapTS; /* Last warning trap timestamp */
8374+ SK_U64 SenLastWarnLogTS; /* Last warning log timestamp */
8375+ int SenState; /* Sensor State (see HW specific include) */
8376+ int (*SenRead)(SK_AC *pAC, SK_IOC IoC, struct s_Sensor *pSen);
8377+ /* Sensors read function */
8378+ SK_U16 SenReg; /* Register Address for this sensor */
8379+ SK_U8 SenDev; /* Device Selection for this sensor */
8380+};
8381+
8382+typedef struct s_I2c {
8383+ SK_SENSOR SenTable[SK_MAX_SENSORS]; /* Sensor Table */
8384+ int CurrSens; /* Which sensor is currently queried */
8385+ int MaxSens; /* Max. number of sensors */
8386+ int TimerMode; /* Use the timer also to watch the state machine */
8387+ int InitLevel; /* Initialized Level */
8388+#ifndef SK_DIAG
8389+ int DummyReads; /* Number of non-checked dummy reads */
8390+ SK_TIMER SenTimer; /* Sensors timer */
8391+#endif /* !SK_DIAG */
8392+} SK_I2C;
8393+
8394+extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level);
8395+extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size,
8396+ int Reg, int Burst);
8397+extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen);
8398+#ifdef SK_DIAG
8399+extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg,
8400+ int Burst);
8401+#else /* !SK_DIAG */
8402+extern int SkI2cEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para);
8403+extern void SkI2cWaitIrq(SK_AC *pAC, SK_IOC IoC);
8404+extern void SkI2cIsr(SK_AC *pAC, SK_IOC IoC);
8405+#endif /* !SK_DIAG */
8406+#endif /* n_SKTWSI_H */
8407+
8408diff -ruN linux/drivers/net/sk98lin/h/sktypes.h linux-new/drivers/net/sk98lin/h/sktypes.h
8409--- linux/drivers/net/sk98lin/h/sktypes.h 2006-04-11 19:19:28.000000000 +0200
8410+++ linux-new/drivers/net/sk98lin/h/sktypes.h 2006-01-18 14:37:24.000000000 +0100
8411@@ -2,8 +2,8 @@
8412 *
8413 * Name: sktypes.h
8414 * Project: GEnesis, PCI Gigabit Ethernet Adapter
8415- * Version: $Revision$
8416- * Date: $Date$
8417+ * Version: $Revision$
8418+ * Date: $Date$
8419 * Purpose: Define data types for Linux
8420 *
8421 ******************************************************************************/
8422@@ -11,7 +11,7 @@
8423 /******************************************************************************
8424 *
8425 * (C)Copyright 1998-2002 SysKonnect GmbH.
8426- * (C)Copyright 2002-2003 Marvell.
8427+ * (C)Copyright 2002-2005 Marvell.
8428 *
8429 * This program is free software; you can redistribute it and/or modify
8430 * it under the terms of the GNU General Public License as published by
8431@@ -22,48 +22,28 @@
8432 *
8433 ******************************************************************************/
8434
8435-/******************************************************************************
8436- *
8437- * Description:
8438- *
8439- * In this file, all data types that are needed by the common modules
8440- * are mapped to Linux data types.
8441- *
8442- *
8443- * Include File Hierarchy:
8444- *
8445- *
8446- ******************************************************************************/
8447-
8448 #ifndef __INC_SKTYPES_H
8449 #define __INC_SKTYPES_H
8450
8451-
8452-/* defines *******************************************************************/
8453-
8454-/*
8455- * Data types with a specific size. 'I' = signed, 'U' = unsigned.
8456- */
8457-#define SK_I8 s8
8458-#define SK_U8 u8
8459-#define SK_I16 s16
8460-#define SK_U16 u16
8461-#define SK_I32 s32
8462-#define SK_U32 u32
8463-#define SK_I64 s64
8464-#define SK_U64 u64
8465-
8466-#define SK_UPTR ulong /* casting pointer <-> integral */
8467-
8468-/*
8469-* Boolean type.
8470-*/
8471-#define SK_BOOL SK_U8
8472-#define SK_FALSE 0
8473-#define SK_TRUE (!SK_FALSE)
8474-
8475-/* typedefs *******************************************************************/
8476-
8477-/* function prototypes ********************************************************/
8478+#define SK_I8 s8 /* 8 bits (1 byte) signed */
8479+#define SK_U8 u8 /* 8 bits (1 byte) unsigned */
8480+#define SK_I16 s16 /* 16 bits (2 bytes) signed */
8481+#define SK_U16 u16 /* 16 bits (2 bytes) unsigned */
8482+#define SK_I32 s32 /* 32 bits (4 bytes) signed */
8483+#define SK_U32 u32 /* 32 bits (4 bytes) unsigned */
8484+#define SK_I64 s64 /* 64 bits (8 bytes) signed */
8485+#define SK_U64 u64 /* 64 bits (8 bytes) unsigned */
8486+
8487+#define SK_UPTR ulong /* casting pointer <-> integral */
8488+
8489+#define SK_BOOL SK_U8
8490+#define SK_FALSE 0
8491+#define SK_TRUE (!SK_FALSE)
8492
8493 #endif /* __INC_SKTYPES_H */
8494+
8495+/*******************************************************************************
8496+ *
8497+ * End of file
8498+ *
8499+ ******************************************************************************/
8500diff -ruN linux/drivers/net/sk98lin/h/skversion.h linux-new/drivers/net/sk98lin/h/skversion.h
8501--- linux/drivers/net/sk98lin/h/skversion.h 2006-04-11 19:19:28.000000000 +0200
8502+++ linux-new/drivers/net/sk98lin/h/skversion.h 2006-01-18 14:37:24.000000000 +0100
8503@@ -1,17 +1,17 @@
8504 /******************************************************************************
8505 *
8506- * Name: version.h
8507+ * Name: skversion.h
8508 * Project: GEnesis, PCI Gigabit Ethernet Adapter
8509- * Version: $Revision$
8510- * Date: $Date$
8511- * Purpose: SK specific Error log support
8512+ * Version: $Revision$
8513+ * Date: $Date$
8514+ * Purpose: specific version strings and numbers
8515 *
8516 ******************************************************************************/
8517
8518 /******************************************************************************
8519 *
8520 * (C)Copyright 1998-2002 SysKonnect GmbH.
8521- * (C)Copyright 2002-2003 Marvell.
8522+ * (C)Copyright 2002-2005 Marvell.
8523 *
8524 * This program is free software; you can redistribute it and/or modify
8525 * it under the terms of the GNU General Public License as published by
8526@@ -22,17 +22,15 @@
8527 *
8528 ******************************************************************************/
8529
8530-#ifdef lint
8531-static const char SysKonnectFileId[] = "@(#) (C) SysKonnect GmbH.";
8532-static const char SysKonnectBuildNumber[] =
8533- "@(#)SK-BUILD: 6.23 PL: 01";
8534-#endif /* !defined(lint) */
8535-
8536-#define BOOT_STRING "sk98lin: Network Device Driver v6.23\n" \
8537- "(C)Copyright 1999-2004 Marvell(R)."
8538-
8539-#define VER_STRING "6.23"
8540-#define DRIVER_FILE_NAME "sk98lin"
8541-#define DRIVER_REL_DATE "Feb-13-2004"
8542-
8543+#define BOOT_STRING "sk98lin: Network Device Driver v8.31.2.3\n" \
8544+ "(C)Copyright 1999-2006 Marvell(R)."
8545+#define VER_STRING "8.31.2.3"
8546+#define PATCHLEVEL "02"
8547+#define DRIVER_FILE_NAME "sk98lin"
8548+#define DRIVER_REL_DATE "Jan-18-2006"
8549
8550+/*******************************************************************************
8551+ *
8552+ * End of file
8553+ *
8554+ ******************************************************************************/
8555diff -ruN linux/drivers/net/sk98lin/h/skvpd.h linux-new/drivers/net/sk98lin/h/skvpd.h
8556--- linux/drivers/net/sk98lin/h/skvpd.h 2006-04-11 19:19:28.000000000 +0200
8557+++ linux-new/drivers/net/sk98lin/h/skvpd.h 2006-01-18 14:37:24.000000000 +0100
8558@@ -1,22 +1,22 @@
8559 /******************************************************************************
8560 *
8561 * Name: skvpd.h
8562- * Project: GEnesis, PCI Gigabit Ethernet Adapter
8563- * Version: $Revision$
8564- * Date: $Date$
8565+ * Project: Gigabit Ethernet Adapters, VPD-Module
8566+ * Version: $Revision$
8567+ * Date: $Date$
8568 * Purpose: Defines and Macros for VPD handling
8569 *
8570 ******************************************************************************/
8571
8572 /******************************************************************************
8573 *
8574- * (C)Copyright 1998-2003 SysKonnect GmbH.
8575+ * (C)Copyright 1998-2002 SysKonnect.
8576+ * (C)Copyright 2002-2004 Marvell.
8577 *
8578 * This program is free software; you can redistribute it and/or modify
8579 * it under the terms of the GNU General Public License as published by
8580 * the Free Software Foundation; either version 2 of the License, or
8581 * (at your option) any later version.
8582- *
8583 * The information in this file is provided "AS IS" without warranty.
8584 *
8585 ******************************************************************************/
8586@@ -31,7 +31,7 @@
8587 /*
8588 * Define Resource Type Identifiers and VPD keywords
8589 */
8590-#define RES_ID 0x82 /* Resource Type ID String (Product Name) */
8591+#define RES_ID 0x82 /* Resource Type ID String (Product Name) */
8592 #define RES_VPD_R 0x90 /* start of VPD read only area */
8593 #define RES_VPD_W 0x91 /* start of VPD read/write area */
8594 #define RES_END 0x78 /* Resource Type End Tag */
8595@@ -40,14 +40,16 @@
8596 #define VPD_NAME "Name" /* Product Name, VPD name of RES_ID */
8597 #endif /* VPD_NAME */
8598 #define VPD_PN "PN" /* Adapter Part Number */
8599-#define VPD_EC "EC" /* Adapter Engineering Level */
8600+#define VPD_EC "EC" /* Adapter Engineering Level */
8601 #define VPD_MN "MN" /* Manufacture ID */
8602 #define VPD_SN "SN" /* Serial Number */
8603 #define VPD_CP "CP" /* Extended Capability */
8604 #define VPD_RV "RV" /* Checksum and Reserved */
8605-#define VPD_YA "YA" /* Asset Tag Identifier */
8606+#define VPD_YA "YA" /* Asset Tag Identifier */
8607 #define VPD_VL "VL" /* First Error Log Message (SK specific) */
8608 #define VPD_VF "VF" /* Second Error Log Message (SK specific) */
8609+#define VPD_VB "VB" /* Boot Agent ROM Configuration (SK specific) */
8610+#define VPD_VE "VE" /* EFI UNDI Configuration (SK specific) */
8611 #define VPD_RW "RW" /* Remaining Read / Write Area */
8612
8613 /* 'type' values for vpd_setup_para() */
8614@@ -55,7 +57,7 @@
8615 #define VPD_RW_KEY 2 /* RW keys are "Yx", "Vx", and "RW" */
8616
8617 /* 'op' values for vpd_setup_para() */
8618-#define ADD_KEY 1 /* add the key at the pos "RV" or "RW" */
8619+#define ADD_KEY 1 /* add the key at the pos "RV" or "RW" */
8620 #define OWR_KEY 2 /* overwrite key if already exists */
8621
8622 /*
8623@@ -64,18 +66,18 @@
8624
8625 #define VPD_DEV_ID_GENESIS 0x4300
8626
8627-#define VPD_SIZE_YUKON 256
8628-#define VPD_SIZE_GENESIS 512
8629-#define VPD_SIZE 512
8630+#define VPD_SIZE_YUKON 256
8631+#define VPD_SIZE_GENESIS 512
8632+#define VPD_SIZE 512
8633 #define VPD_READ 0x0000
8634 #define VPD_WRITE 0x8000
8635
8636 #define VPD_STOP(pAC,IoC) VPD_OUT16(pAC,IoC,PCI_VPD_ADR_REG,VPD_WRITE)
8637
8638-#define VPD_GET_RES_LEN(p) ((unsigned int) \
8639- (* (SK_U8 *)&(p)[1]) |\
8640- ((* (SK_U8 *)&(p)[2]) << 8))
8641-#define VPD_GET_VPD_LEN(p) ((unsigned int)(* (SK_U8 *)&(p)[2]))
8642+#define VPD_GET_RES_LEN(p) ((unsigned int)\
8643+ (*(SK_U8 *)&(p)[1]) |\
8644+ ((*(SK_U8 *)&(p)[2]) << 8))
8645+#define VPD_GET_VPD_LEN(p) ((unsigned int)(*(SK_U8 *)&(p)[2]))
8646 #define VPD_GET_VAL(p) ((char *)&(p)[3])
8647
8648 #define VPD_MAX_LEN 50
8649@@ -126,62 +128,70 @@
8650 /*
8651 * System specific VPD macros
8652 */
8653-#ifndef SKDIAG
8654+#ifndef SK_DIAG
8655 #ifndef VPD_DO_IO
8656 #define VPD_OUT8(pAC,IoC,Addr,Val) (void)SkPciWriteCfgByte(pAC,Addr,Val)
8657 #define VPD_OUT16(pAC,IoC,Addr,Val) (void)SkPciWriteCfgWord(pAC,Addr,Val)
8658+#define VPD_OUT32(pAC,IoC,Addr,Val) (void)SkPciWriteCfgDWord(pAC,Addr,Val)
8659 #define VPD_IN8(pAC,IoC,Addr,pVal) (void)SkPciReadCfgByte(pAC,Addr,pVal)
8660 #define VPD_IN16(pAC,IoC,Addr,pVal) (void)SkPciReadCfgWord(pAC,Addr,pVal)
8661 #define VPD_IN32(pAC,IoC,Addr,pVal) (void)SkPciReadCfgDWord(pAC,Addr,pVal)
8662 #else /* VPD_DO_IO */
8663-#define VPD_OUT8(pAC,IoC,Addr,Val) SK_OUT8(IoC,PCI_C(Addr),Val)
8664-#define VPD_OUT16(pAC,IoC,Addr,Val) SK_OUT16(IoC,PCI_C(Addr),Val)
8665-#define VPD_IN8(pAC,IoC,Addr,pVal) SK_IN8(IoC,PCI_C(Addr),pVal)
8666-#define VPD_IN16(pAC,IoC,Addr,pVal) SK_IN16(IoC,PCI_C(Addr),pVal)
8667-#define VPD_IN32(pAC,IoC,Addr,pVal) SK_IN32(IoC,PCI_C(Addr),pVal)
8668+#define VPD_OUT8(pAC,IoC,Addr,Val) SK_OUT8(IoC,PCI_C(pAC,Addr),Val)
8669+#define VPD_OUT16(pAC,IoC,Addr,Val) SK_OUT16(IoC,PCI_C(pAC,Addr),Val)
8670+#define VPD_OUT32(pAC,IoC,Addr,Val) SK_OUT32(IoC,PCI_C(pAC,Addr),Val)
8671+#define VPD_IN8(pAC,IoC,Addr,pVal) SK_IN8(IoC,PCI_C(pAC,Addr),pVal)
8672+#define VPD_IN16(pAC,IoC,Addr,pVal) SK_IN16(IoC,PCI_C(pAC,Addr),pVal)
8673+#define VPD_IN32(pAC,IoC,Addr,pVal) SK_IN32(IoC,PCI_C(pAC,Addr),pVal)
8674 #endif /* VPD_DO_IO */
8675-#else /* SKDIAG */
8676+#else /* SK_DIAG */
8677 #define VPD_OUT8(pAC,Ioc,Addr,Val) { \
8678 if ((pAC)->DgT.DgUseCfgCycle) \
8679 SkPciWriteCfgByte(pAC,Addr,Val); \
8680 else \
8681- SK_OUT8(pAC,PCI_C(Addr),Val); \
8682+ SK_OUT8(pAC,PCI_C(pAC,Addr),Val); \
8683 }
8684 #define VPD_OUT16(pAC,Ioc,Addr,Val) { \
8685 if ((pAC)->DgT.DgUseCfgCycle) \
8686 SkPciWriteCfgWord(pAC,Addr,Val); \
8687 else \
8688- SK_OUT16(pAC,PCI_C(Addr),Val); \
8689+ SK_OUT16(pAC,PCI_C(pAC,Addr),Val); \
8690+ }
8691+#define VPD_OUT32(pAC,Ioc,Addr,Val) { \
8692+ if ((pAC)->DgT.DgUseCfgCycle) \
8693+ SkPciWriteCfgDWord(pAC,Addr,Val); \
8694+ else \
8695+ SK_OUT32(pAC,PCI_C(pAC,Addr),Val); \
8696 }
8697 #define VPD_IN8(pAC,Ioc,Addr,pVal) { \
8698- if ((pAC)->DgT.DgUseCfgCycle) \
8699+ if ((pAC)->DgT.DgUseCfgCycle) \
8700 SkPciReadCfgByte(pAC,Addr,pVal); \
8701 else \
8702- SK_IN8(pAC,PCI_C(Addr),pVal); \
8703+ SK_IN8(pAC,PCI_C(pAC,Addr),pVal); \
8704 }
8705 #define VPD_IN16(pAC,Ioc,Addr,pVal) { \
8706- if ((pAC)->DgT.DgUseCfgCycle) \
8707+ if ((pAC)->DgT.DgUseCfgCycle) \
8708 SkPciReadCfgWord(pAC,Addr,pVal); \
8709 else \
8710- SK_IN16(pAC,PCI_C(Addr),pVal); \
8711+ SK_IN16(pAC,PCI_C(pAC,Addr),pVal); \
8712 }
8713 #define VPD_IN32(pAC,Ioc,Addr,pVal) { \
8714 if ((pAC)->DgT.DgUseCfgCycle) \
8715 SkPciReadCfgDWord(pAC,Addr,pVal); \
8716 else \
8717- SK_IN32(pAC,PCI_C(Addr),pVal); \
8718+ SK_IN32(pAC,PCI_C(pAC,Addr),pVal); \
8719 }
8720-#endif /* nSKDIAG */
8721+#endif /* SK_DIAG */
8722
8723 /* function prototypes ********************************************************/
8724
8725 #ifndef SK_KR_PROTO
8726-#ifdef SKDIAG
8727+#ifdef SK_DIAG
8728 extern SK_U32 VpdReadDWord(
8729 SK_AC *pAC,
8730 SK_IOC IoC,
8731 int addr);
8732-#endif /* SKDIAG */
8733+#endif /* SK_DIAG */
8734
8735 extern int VpdSetupPara(
8736 SK_AC *pAC,
8737@@ -232,7 +242,12 @@
8738 SK_IOC IoC,
8739 char *msg);
8740
8741-#ifdef SKDIAG
8742+int VpdInit(
8743+ SK_AC *pAC,
8744+ SK_IOC IoC);
8745+
8746+#if defined(SK_DIAG) || defined(SK_ASF)
8747+
8748 extern int VpdReadBlock(
8749 SK_AC *pAC,
8750 SK_IOC IoC,
8751@@ -246,7 +261,9 @@
8752 char *buf,
8753 int addr,
8754 int len);
8755-#endif /* SKDIAG */
8756+
8757+#endif /* SK_DIAG || SK_ASF */
8758+
8759 #else /* SK_KR_PROTO */
8760 extern SK_U32 VpdReadDWord();
8761 extern int VpdSetupPara();
8762@@ -261,3 +278,4 @@
8763 #endif /* SK_KR_PROTO */
8764
8765 #endif /* __INC_SKVPD_H_ */
8766+
8767diff -ruN linux/drivers/net/sk98lin/h/sky2le.h linux-new/drivers/net/sk98lin/h/sky2le.h
8768--- linux/drivers/net/sk98lin/h/sky2le.h 1970-01-01 01:00:00.000000000 +0100
8769+++ linux-new/drivers/net/sk98lin/h/sky2le.h 2006-01-18 14:37:24.000000000 +0100
8770@@ -0,0 +1,893 @@
8771+/******************************************************************************
8772+ *
8773+ * Name: sky2le.h
8774+ * Project: Gigabit Ethernet Adapters, Common Modules
8775+ * Version: $Revision$
8776+ * Date: $Date$
8777+ * Purpose: Common list element definitions and access macros.
8778+ *
8779+ ******************************************************************************/
8780+
8781+/******************************************************************************
8782+ *
8783+ * LICENSE:
8784+ * (C)Copyright 2003-2004 Marvell
8785+ *
8786+ * This program is free software; you can redistribute it and/or modify
8787+ * it under the terms of the GNU General Public License as published by
8788+ * the Free Software Foundation; either version 2 of the License, or
8789+ * (at your option) any later version.
8790+ * The information in this file is provided "AS IS" without warranty.
8791+ * /LICENSE
8792+ *
8793+ ******************************************************************************/
8794+
8795+#ifndef __INC_SKY2LE_H
8796+#define __INC_SKY2LE_H
8797+
8798+#ifdef __cplusplus
8799+extern "C" {
8800+#endif /* __cplusplus */
8801+
8802+/* defines ********************************************************************/
8803+
8804+#define MIN_LEN_OF_LE_TAB 128
8805+#define MAX_LEN_OF_LE_TAB 4096
8806+#ifdef USE_POLLING_UNIT
8807+#define NUM_LE_POLLING_UNIT 2
8808+#endif
8809+#define MAX_FRAG_OVERHEAD 10
8810+
8811+/* Macro for aligning a given value */
8812+#define SK_ALIGN_SIZE(Value, Alignment, AlignedVal) { \
8813+ (AlignedVal) = (((Value) + (Alignment) - 1) & (~((Alignment) - 1)));\
8814+}
8815+
8816+/******************************************************************************
8817+ *
8818+ * LE2DWord() - Converts the given Little Endian value to machine order value
8819+ *
8820+ * Description:
8821+ * This function converts the Little Endian value received as an argument to
8822+ * the machine order value.
8823+ *
8824+ * Returns:
8825+ * The converted value
8826+ *
8827+ */
8828+
8829+#ifdef SK_LITTLE_ENDIAN
8830+
8831+#ifndef SK_USE_REV_DESC
8832+#define LE2DWord(value) (value)
8833+#else /* SK_USE_REV_DESC */
8834+#define LE2DWord(value) \
8835+ ((((value)<<24L) & 0xff000000L) + \
8836+ (((value)<< 8L) & 0x00ff0000L) + \
8837+ (((value)>> 8L) & 0x0000ff00L) + \
8838+ (((value)>>24L) & 0x000000ffL))
8839+#endif /* SK_USE_REV_DESC */
8840+
8841+#else /* !SK_LITTLE_ENDIAN */
8842+
8843+#ifndef SK_USE_REV_DESC
8844+#define LE2DWord(value) \
8845+ ((((value)<<24L) & 0xff000000L) + \
8846+ (((value)<< 8L) & 0x00ff0000L) + \
8847+ (((value)>> 8L) & 0x0000ff00L) + \
8848+ (((value)>>24L) & 0x000000ffL))
8849+#else /* SK_USE_REV_DESC */
8850+#define LE2DWord(value) (value)
8851+#endif /* SK_USE_REV_DESC */
8852+
8853+#endif /* !SK_LITTLE_ENDIAN */
8854+
8855+/******************************************************************************
8856+ *
8857+ * DWord2LE() - Converts the given value to a Little Endian value
8858+ *
8859+ * Description:
8860+ * This function converts the value received as an argument to a Little Endian
8861+ * value on Big Endian machines. If the machine running the code is Little
8862+ * Endian, then no conversion is done.
8863+ *
8864+ * Returns:
8865+ * The converted value
8866+ *
8867+ */
8868+
8869+#ifdef SK_LITTLE_ENDIAN
8870+
8871+#ifndef SK_USE_REV_DESC
8872+#define DWord2LE(value) (value)
8873+#else /* SK_USE_REV_DESC */
8874+#define DWord2LE(value) \
8875+ ((((value)<<24L) & 0xff000000L) + \
8876+ (((value)<< 8L) & 0x00ff0000L) + \
8877+ (((value)>> 8L) & 0x0000ff00L) + \
8878+ (((value)>>24L) & 0x000000ffL))
8879+#endif /* SK_USE_REV_DESC */
8880+
8881+#else /* !SK_LITTLE_ENDIAN */
8882+
8883+#ifndef SK_USE_REV_DESC
8884+#define DWord2LE(value) \
8885+ ((((value)<<24L) & 0xff000000L) + \
8886+ (((value)<< 8L) & 0x00ff0000L) + \
8887+ (((value)>> 8L) & 0x0000ff00L) + \
8888+ (((value)>>24L) & 0x000000ffL))
8889+#else /* SK_USE_REV_DESC */
8890+#define DWord2LE(value) (value)
8891+#endif /* SK_USE_REV_DESC */
8892+#endif /* !SK_LITTLE_ENDIAN */
8893+
8894+/******************************************************************************
8895+ *
8896+ * LE2Word() - Converts the given Little Endian value to machine order value
8897+ *
8898+ * Description:
8899+ * This function converts the Little Endian value received as an argument to
8900+ * the machine order value.
8901+ *
8902+ * Returns:
8903+ * The converted value
8904+ *
8905+ */
8906+
8907+#ifdef SK_LITTLE_ENDIAN
8908+#ifndef SK_USE_REV_DESC
8909+#define LE2Word(value) (value)
8910+#else /* SK_USE_REV_DESC */
8911+#define LE2Word(value) \
8912+ ((((value)<< 8L) & 0xff00) + \
8913+ (((value)>> 8L) & 0x00ff))
8914+#endif /* SK_USE_REV_DESC */
8915+
8916+#else /* !SK_LITTLE_ENDIAN */
8917+#ifndef SK_USE_REV_DESC
8918+#define LE2Word(value) \
8919+ ((((value)<< 8L) & 0xff00) + \
8920+ (((value)>> 8L) & 0x00ff))
8921+#else /* SK_USE_REV_DESC */
8922+#define LE2Word(value) (value)
8923+#endif /* SK_USE_REV_DESC */
8924+#endif /* !SK_LITTLE_ENDIAN */
8925+
8926+/******************************************************************************
8927+ *
8928+ * Word2LE() - Converts the given value to a Little Endian value
8929+ *
8930+ * Description:
8931+ * This function converts the value received as an argument to a Little Endian
8932+ * value on Big Endian machines. If the machine running the code is Little
8933+ * Endian, then no conversion is done.
8934+ *
8935+ * Returns:
8936+ * The converted value
8937+ *
8938+ */
8939+
8940+#ifdef SK_LITTLE_ENDIAN
8941+#ifndef SK_USE_REV_DESC
8942+#define Word2LE(value) (value)
8943+#else /* SK_USE_REV_DESC */
8944+#define Word2LE(value) \
8945+ ((((value)<< 8L) & 0xff00) + \
8946+ (((value)>> 8L) & 0x00ff))
8947+#endif /* SK_USE_REV_DESC */
8948+
8949+#else /* !SK_LITTLE_ENDIAN */
8950+#ifndef SK_USE_REV_DESC
8951+#define Word2LE(value) \
8952+ ((((value)<< 8L) & 0xff00) + \
8953+ (((value)>> 8L) & 0x00ff))
8954+#else /* SK_USE_REV_DESC */
8955+#define Word2LE(value) (value)
8956+#endif /* SK_USE_REV_DESC */
8957+#endif /* !SK_LITTLE_ENDIAN */
8958+
8959+/******************************************************************************
8960+ *
8961+ * Transmit list element macros
8962+ *
8963+ */
8964+
8965+#define TXLE_SET_ADDR(pLE, Addr) \
8966+ ((pLE)->Tx.TxUn.BufAddr = DWord2LE(Addr))
8967+#define TXLE_SET_LSLEN(pLE, Len) \
8968+ ((pLE)->Tx.TxUn.LargeSend.Length = Word2LE(Len))
8969+#define TXLE_SET_STACS(pLE, Start) \
8970+ ((pLE)->Tx.TxUn.ChkSum.TxTcpSp = Word2LE(Start))
8971+#define TXLE_SET_WRICS(pLE, Write) \
8972+ ((pLE)->Tx.TxUn.ChkSum.TxTcpWp = Word2LE(Write))
8973+#define TXLE_SET_INICS(pLE, Ini) ((pLE)->Tx.Send.InitCsum = Word2LE(Ini))
8974+#define TXLE_SET_LEN(pLE, Len) ((pLE)->Tx.Send.BufLen = Word2LE(Len))
8975+#define TXLE_SET_VLAN(pLE, Vlan) ((pLE)->Tx.Send.VlanTag = Word2LE(Vlan))
8976+#define TXLE_SET_LCKCS(pLE, Lock) ((pLE)->Tx.ControlFlags = (Lock))
8977+#define TXLE_SET_CTRL(pLE, Ctrl) ((pLE)->Tx.ControlFlags = (Ctrl))
8978+#define TXLE_SET_OPC(pLE, Opc) ((pLE)->Tx.Opcode = (Opc))
8979+
8980+#define TXLE_GET_ADDR(pLE) LE2DWord((pLE)->Tx.TxUn.BufAddr)
8981+#define TXLE_GET_LSLEN(pLE) LE2Word((pLE)->Tx.TxUn.LargeSend.Length)
8982+#define TXLE_GET_STACS(pLE) LE2Word((pLE)->Tx.TxUn.ChkSum.TxTcpSp)
8983+#define TXLE_GET_WRICS(pLE) LE2Word((pLE)->Tx.TxUn.ChkSum.TxTcpWp)
8984+#define TXLE_GET_INICS(pLE) LE2Word((pLE)->Tx.Send.InitCsum)
8985+#define TXLE_GET_LEN(pLE) LE2Word((pLE)->Tx.Send.BufLen)
8986+#define TXLE_GET_VLAN(pLE) LE2Word((pLE)->Tx.Send.VlanTag)
8987+#define TXLE_GET_LCKCS(pLE) ((pLE)->Tx.ControlFlags)
8988+#define TXLE_GET_CTRL(pLE) ((pLE)->Tx.ControlFlags)
8989+#define TXLE_GET_OPC(pLE) ((pLE)->Tx.Opcode)
8990+
8991+/******************************************************************************
8992+ *
8993+ * Receive list element macros
8994+ *
8995+ */
8996+
8997+#define RXLE_SET_ADDR(pLE, Addr) \
8998+ ((pLE)->Rx.RxUn.BufAddr = (SK_U32) DWord2LE(Addr))
8999+#define RXLE_SET_STACS2(pLE, Offs) \
9000+ ((pLE)->Rx.RxUn.ChkSum.RxTcpSp2 = Word2LE(Offs))
9001+#define RXLE_SET_STACS1(pLE, Offs) \
9002+ ((pLE)->Rx.RxUn.ChkSum.RxTcpSp1 = Word2LE(Offs))
9003+#define RXLE_SET_LEN(pLE, Len) ((pLE)->Rx.BufferLength = Word2LE(Len))
9004+#define RXLE_SET_CTRL(pLE, Ctrl) ((pLE)->Rx.ControlFlags = (Ctrl))
9005+#define RXLE_SET_OPC(pLE, Opc) ((pLE)->Rx.Opcode = (Opc))
9006+
9007+#define RXLE_GET_ADDR(pLE) LE2DWord((pLE)->Rx.RxUn.BufAddr)
9008+#define RXLE_GET_STACS2(pLE) LE2Word((pLE)->Rx.RxUn.ChkSum.RxTcpSp2)
9009+#define RXLE_GET_STACS1(pLE) LE2Word((pLE)->Rx.RxUn.ChkSum.RxTcpSp1)
9010+#define RXLE_GET_LEN(pLE) LE2Word((pLE)->Rx.BufferLength)
9011+#define RXLE_GET_CTRL(pLE) ((pLE)->Rx.ControlFlags)
9012+#define RXLE_GET_OPC(pLE) ((pLE)->Rx.Opcode)
9013+
9014+/******************************************************************************
9015+ *
9016+ * Status list element macros
9017+ *
9018+ */
9019+
9020+#define STLE_SET_OPC(pLE, Opc) ((pLE)->St.Opcode = (Opc))
9021+
9022+#define STLE_GET_FRSTATUS(pLE) LE2DWord((pLE)->St.StUn.StRxStatWord)
9023+#define STLE_GET_TIST(pLE) LE2DWord((pLE)->St.StUn.StRxTimeStamp)
9024+#define STLE_GET_TCP1(pLE) LE2Word((pLE)->St.StUn.StRxTCPCSum.RxTCPSum1)
9025+#define STLE_GET_TCP2(pLE) LE2Word((pLE)->St.StUn.StRxTCPCSum.RxTCPSum2)
9026+#define STLE_GET_LEN(pLE) LE2Word((pLE)->St.Stat.BufLen)
9027+#define STLE_GET_VLAN(pLE) LE2Word((pLE)->St.Stat.VlanTag)
9028+#define STLE_GET_LINK(pLE) ((pLE)->St.Link)
9029+#define STLE_GET_OPC(pLE) ((pLE)->St.Opcode)
9030+#define STLE_GET_DONE_IDX(pLE,LowVal,HighVal) { \
9031+ (LowVal) = LE2DWord((pLE)->St.StUn.StTxStatLow); \
9032+ (HighVal) = LE2Word((pLE)->St.Stat.StTxStatHi); \
9033+}
9034+
9035+#define STLE_GET_RSS(pLE) LE2DWord((pLE)->St.StUn.StRxRssValue)
9036+#define STLE_GET_IPBIT(pLE) ((pLE)->St.Stat.Rss.FlagField & RSS_IP_FLAG)
9037+#define STLE_GET_TCPBIT(pLE) ((pLE)->St.Stat.Rss.FlagField & RSS_TCP_FLAG)
9038+
9039+
9040+/* I always take both values as a paramter to avoid typos */
9041+#define STLE_GET_DONE_IDX_TXA1(LowVal,HighVal) \
9042+ (((LowVal) & STLE_TXA1_MSKL) >> STLE_TXA1_SHIFTL)
9043+#define STLE_GET_DONE_IDX_TXS1(LowVal,HighVal) \
9044+ ((LowVal & STLE_TXS1_MSKL) >> STLE_TXS1_SHIFTL)
9045+#define STLE_GET_DONE_IDX_TXA2(LowVal,HighVal) \
9046+ (((LowVal & STLE_TXA2_MSKL) >> STLE_TXA2_SHIFTL) + \
9047+ ((HighVal & STLE_TXA2_MSKH) << STLE_TXA2_SHIFTH))
9048+#define STLE_GET_DONE_IDX_TXS2(LowVal,HighVal) \
9049+ ((HighVal & STLE_TXS2_MSKH) >> STLE_TXS2_SHIFTH)
9050+
9051+
9052+#define SK_Y2_RXSTAT_CHECK_PKT(Len, RxStat, IsOk) { \
9053+ (IsOk) = (((RxStat) & GMR_FS_RX_OK) != 0) && \
9054+ (((RxStat) & GMR_FS_ANY_ERR) == 0); \
9055+ \
9056+ if ((IsOk) && ((SK_U16)(((RxStat) & GMR_FS_LEN_MSK) >> \
9057+ GMR_FS_LEN_SHIFT) != (Len))) { \
9058+ /* length in MAC status differs from length in LE */\
9059+ (IsOk) = SK_FALSE; \
9060+ } \
9061+}
9062+
9063+
9064+/******************************************************************************
9065+ *
9066+ * Polling unit list element macros
9067+ *
9068+ * NOTE: the Idx must be <= 0xfff and PU_PUTIDX_VALID makes them valid
9069+ *
9070+ */
9071+
9072+#ifdef USE_POLLING_UNIT
9073+
9074+#define POLE_SET_OPC(pLE, Opc) ((pLE)->Sa.Opcode = (Opc))
9075+#define POLE_SET_LINK(pLE, Port) ((pLE)->Sa.Link = (Port))
9076+#define POLE_SET_RXIDX(pLE, Idx) ((pLE)->Sa.RxIdxVld = Word2LE(Idx))
9077+#define POLE_SET_TXAIDX(pLE, Idx) ((pLE)->Sa.TxAIdxVld = Word2LE(Idx))
9078+#define POLE_SET_TXSIDX(pLE, Idx) ((pLE)->Sa.TxSIdxVld = Word2LE(Idx))
9079+
9080+#define POLE_GET_OPC(pLE) ((pLE)->Sa.Opcode)
9081+#define POLE_GET_LINK(pLE) ((pLE)->Sa.Link)
9082+#define POLE_GET_RXIDX(pLE) LE2Word((pLE)->Sa.RxIdxVld)
9083+#define POLE_GET_TXAIDX(pLE) LE2Word((pLE)->Sa.TxAIdxVld)
9084+#define POLE_GET_TXSIDX(pLE) LE2Word((pLE)->Sa.TxSIdxVld)
9085+
9086+#endif /* USE_POLLING_UNIT */
9087+
9088+/******************************************************************************
9089+ *
9090+ * Debug macros for list elements
9091+ *
9092+ */
9093+
9094+#ifdef DEBUG
9095+
9096+#define SK_DBG_DUMP_RX_LE(pLE) { \
9097+ SK_U8 Opcode; \
9098+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9099+ ("=== RX_LIST_ELEMENT @addr: %p cont: %02x %02x %02x %02x %02x %02x %02x %02x\n", \
9100+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\
9101+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \
9102+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \
9103+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9104+ ("\t (16bit) %04x %04x %04x %04x\n", \
9105+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \
9106+ ((SK_U16 *) pLE)[3])); \
9107+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9108+ ("\t (32bit) %08x %08x\n", \
9109+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \
9110+ Opcode = RXLE_GET_OPC(pLE); \
9111+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9112+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == HW_OWNER) ? \
9113+ "Hardware" : "Software")); \
9114+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9115+ ("\tOpc: 0x%x ",Opcode)); \
9116+ switch (Opcode & (~HW_OWNER)) { \
9117+ case OP_BUFFER: \
9118+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9119+ ("\tOP_BUFFER\n")); \
9120+ break; \
9121+ case OP_PACKET: \
9122+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9123+ ("\tOP_PACKET\n")); \
9124+ break; \
9125+ case OP_ADDR64: \
9126+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9127+ ("\tOP_ADDR64\n")); \
9128+ break; \
9129+ case OP_TCPSTART: \
9130+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9131+ ("\tOP_TCPPAR\n")); \
9132+ break; \
9133+ case SW_OWNER: \
9134+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9135+ ("\tunused LE\n")); \
9136+ break; \
9137+ default: \
9138+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9139+ ("\tunknown Opcode!!!\n")); \
9140+ break; \
9141+ } \
9142+ if ((Opcode & OP_BUFFER) == OP_BUFFER) { \
9143+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9144+ ("\tControl: 0x%x\n", RXLE_GET_CTRL(pLE))); \
9145+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9146+ ("\tBufLen: 0x%x\n", RXLE_GET_LEN(pLE))); \
9147+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9148+ ("\tLowAddr: 0x%x\n", RXLE_GET_ADDR(pLE))); \
9149+ } \
9150+ if ((Opcode & OP_ADDR64) == OP_ADDR64) { \
9151+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9152+ ("\tHighAddr: 0x%x\n", RXLE_GET_ADDR(pLE))); \
9153+ } \
9154+ if ((Opcode & OP_TCPSTART) == OP_TCPSTART) { \
9155+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9156+ ("\tTCP Sum Start 1 : 0x%x\n", RXLE_GET_STACS1(pLE))); \
9157+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9158+ ("\tTCP Sum Start 2 : 0x%x\n", RXLE_GET_STACS2(pLE))); \
9159+ } \
9160+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9161+ ("=====================\n")); \
9162+}
9163+
9164+#define SK_DBG_DUMP_TX_LE(pLE) { \
9165+ SK_U8 Opcode; \
9166+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9167+ ("=== TX_LIST_ELEMENT @addr: %p cont: %02x %02x %02x %02x %02x %02x %02x %02x\n", \
9168+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\
9169+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \
9170+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \
9171+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9172+ ("\t (16bit) %04x %04x %04x %04x\n", \
9173+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \
9174+ ((SK_U16 *) pLE)[3])); \
9175+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9176+ ("\t (32bit) %08x %08x\n", \
9177+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \
9178+ Opcode = TXLE_GET_OPC(pLE); \
9179+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9180+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == HW_OWNER) ? \
9181+ "Hardware" : "Software")); \
9182+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9183+ ("\tOpc: 0x%x ",Opcode)); \
9184+ switch (Opcode & (~HW_OWNER)) { \
9185+ case OP_TCPCHKSUM: \
9186+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9187+ ("\tOP_TCPCHKSUM\n")); \
9188+ break; \
9189+ case OP_TCPIS: \
9190+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9191+ ("\tOP_TCPIS\n")); \
9192+ break; \
9193+ case OP_TCPLCK: \
9194+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9195+ ("\tOP_TCPLCK\n")); \
9196+ break; \
9197+ case OP_TCPLW: \
9198+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9199+ ("\tOP_TCPLW\n")); \
9200+ break; \
9201+ case OP_TCPLSW: \
9202+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9203+ ("\tOP_TCPLSW\n")); \
9204+ break; \
9205+ case OP_TCPLISW: \
9206+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9207+ ("\tOP_TCPLISW\n")); \
9208+ break; \
9209+ case OP_ADDR64: \
9210+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9211+ ("\tOP_ADDR64\n")); \
9212+ break; \
9213+ case OP_VLAN: \
9214+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9215+ ("\tOP_VLAN\n")); \
9216+ break; \
9217+ case OP_ADDR64VLAN: \
9218+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9219+ ("\tOP_ADDR64VLAN\n")); \
9220+ break; \
9221+ case OP_LRGLEN: \
9222+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9223+ ("\tOP_LRGLEN\n")); \
9224+ break; \
9225+ case OP_LRGLENVLAN: \
9226+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9227+ ("\tOP_LRGLENVLAN\n")); \
9228+ break; \
9229+ case OP_BUFFER: \
9230+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9231+ ("\tOP_BUFFER\n")); \
9232+ break; \
9233+ case OP_PACKET: \
9234+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9235+ ("\tOP_PACKET\n")); \
9236+ break; \
9237+ case OP_LARGESEND: \
9238+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9239+ ("\tOP_LARGESEND\n")); \
9240+ break; \
9241+ case SW_OWNER: \
9242+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9243+ ("\tunused LE\n")); \
9244+ break; \
9245+ default: \
9246+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9247+ ("\tunknown Opcode!!!\n")); \
9248+ break; \
9249+ } \
9250+ if ((Opcode & OP_BUFFER) == OP_BUFFER) { \
9251+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9252+ ("\tControl: 0x%x\n", TXLE_GET_CTRL(pLE))); \
9253+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9254+ ("\tBufLen: 0x%x\n", TXLE_GET_LEN(pLE))); \
9255+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9256+ ("\tLowAddr: 0x%x\n", TXLE_GET_ADDR(pLE))); \
9257+ } \
9258+ if ((Opcode & OP_ADDR64) == OP_ADDR64) { \
9259+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9260+ ("\tHighAddr: 0x%x\n", TXLE_GET_ADDR(pLE))); \
9261+ } \
9262+ if ((Opcode & OP_VLAN) == OP_VLAN) { \
9263+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9264+ ("\tVLAN Id: 0x%x\n", TXLE_GET_VLAN(pLE))); \
9265+ } \
9266+ if ((Opcode & OP_LRGLEN) == OP_LRGLEN) { \
9267+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9268+ ("\tLarge send length: 0x%x\n", TXLE_GET_LSLEN(pLE))); \
9269+ } \
9270+ if ((Opcode &(~HW_OWNER)) <= OP_ADDR64) { \
9271+ if ((Opcode & OP_TCPWRITE) == OP_TCPWRITE) { \
9272+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9273+ ("\tTCP Sum Write: 0x%x\n", TXLE_GET_WRICS(pLE))); \
9274+ } \
9275+ if ((Opcode & OP_TCPSTART) == OP_TCPSTART) { \
9276+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9277+ ("\tTCP Sum Start: 0x%x\n", TXLE_GET_STACS(pLE))); \
9278+ } \
9279+ if ((Opcode & OP_TCPINIT) == OP_TCPINIT) { \
9280+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9281+ ("\tTCP Sum Init: 0x%x\n", TXLE_GET_INICS(pLE))); \
9282+ } \
9283+ if ((Opcode & OP_TCPLCK) == OP_TCPLCK) { \
9284+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9285+ ("\tTCP Sum Lock: 0x%x\n", TXLE_GET_LCKCS(pLE))); \
9286+ } \
9287+ } \
9288+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9289+ ("=====================\n")); \
9290+}
9291+
9292+#define SK_DBG_DUMP_ST_LE(pLE) { \
9293+ SK_U8 Opcode; \
9294+ SK_U16 HighVal; \
9295+ SK_U32 LowVal; \
9296+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9297+ ("=== ST_LIST_ELEMENT @addr: %p contains: %02x %02x %02x %02x %02x %02x %02x %02x\n",\
9298+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\
9299+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \
9300+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \
9301+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9302+ ("\t (16bit) %04x %04x %04x %04x\n", \
9303+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \
9304+ ((SK_U16 *) pLE)[3])); \
9305+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9306+ ("\t (32bit) %08x %08x\n", \
9307+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \
9308+ Opcode = STLE_GET_OPC(pLE); \
9309+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9310+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == SW_OWNER) ? \
9311+ "Hardware" : "Software")); \
9312+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9313+ ("\tOpc: 0x%x", Opcode)); \
9314+ Opcode &= (~HW_OWNER); \
9315+ switch (Opcode) { \
9316+ case OP_RXSTAT: \
9317+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9318+ ("\tOP_RXSTAT\n")); \
9319+ break; \
9320+ case OP_RXTIMESTAMP: \
9321+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9322+ ("\tOP_RXTIMESTAMP\n")); \
9323+ break; \
9324+ case OP_RXVLAN: \
9325+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9326+ ("\tOP_RXVLAN\n")); \
9327+ break; \
9328+ case OP_RXCHKS: \
9329+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9330+ ("\tOP_RXCHKS\n")); \
9331+ break; \
9332+ case OP_RXCHKSVLAN: \
9333+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9334+ ("\tOP_RXCHKSVLAN\n")); \
9335+ break; \
9336+ case OP_RXTIMEVLAN: \
9337+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9338+ ("\tOP_RXTIMEVLAN\n")); \
9339+ break; \
9340+ case OP_RSS_HASH: \
9341+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9342+ ("\tOP_RSS_HASH\n")); \
9343+ break; \
9344+ case OP_TXINDEXLE: \
9345+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9346+ ("\tOP_TXINDEXLE\n")); \
9347+ break; \
9348+ case HW_OWNER: \
9349+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9350+ ("\tunused LE\n")); \
9351+ break; \
9352+ default: \
9353+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9354+ ("\tunknown status list element!!!\n")); \
9355+ break; \
9356+ } \
9357+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9358+ ("\tPort: %c\n", 'A' + STLE_GET_LINK(pLE))); \
9359+ if (Opcode == OP_RXSTAT) { \
9360+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9361+ ("\tFrameLen: 0x%x\n", STLE_GET_LEN(pLE))); \
9362+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9363+ ("\tFrameStat: 0x%x\n", STLE_GET_FRSTATUS(pLE))); \
9364+ } \
9365+ if ((Opcode & OP_RXVLAN) == OP_RXVLAN) { \
9366+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9367+ ("\tVLAN Id: 0x%x\n", STLE_GET_VLAN(pLE))); \
9368+ } \
9369+ if ((Opcode & OP_RXTIMESTAMP) == OP_RXTIMESTAMP) { \
9370+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9371+ ("\tTimestamp: 0x%x\n", STLE_GET_TIST(pLE))); \
9372+ } \
9373+ if ((Opcode & OP_RXCHKS) == OP_RXCHKS) { \
9374+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9375+ ("\tTCP: 0x%x 0x%x\n", STLE_GET_TCP1(pLE), \
9376+ STLE_GET_TCP2(pLE))); \
9377+ } \
9378+ if (Opcode == OP_TXINDEXLE) { \
9379+ STLE_GET_DONE_IDX(pLE, LowVal, HighVal); \
9380+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9381+ ("\tTx Index TxA1: 0x%x\n", \
9382+ STLE_GET_DONE_IDX_TXA1(LowVal,HighVal))); \
9383+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9384+ ("\tTx Index TxS1: 0x%x\n", \
9385+ STLE_GET_DONE_IDX_TXS1(LowVal,HighVal))); \
9386+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9387+ ("\tTx Index TxA2: 0x%x\n", \
9388+ STLE_GET_DONE_IDX_TXA2(LowVal,HighVal))); \
9389+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9390+ ("\tTx Index TxS2: 0x%x\n", \
9391+ STLE_GET_DONE_IDX_TXS2(LowVal,HighVal))); \
9392+ } \
9393+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9394+ ("=====================\n")); \
9395+}
9396+
9397+#ifdef USE_POLLING_UNIT
9398+#define SK_DBG_DUMP_PO_LE(pLE) { \
9399+ SK_U8 Opcode; \
9400+ SK_U16 Idx; \
9401+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9402+ ("=== PO_LIST_ELEMENT @addr: %p cont: %02x %02x %02x %02x %02x %02x %02x %02x\n", \
9403+ pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\
9404+ ((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5], \
9405+ ((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7])); \
9406+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9407+ ("\t (16bit) %04x %04x %04x %04x\n", \
9408+ ((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2], \
9409+ ((SK_U16 *) pLE)[3])); \
9410+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9411+ ("\t (32bit) %08x %08x\n", \
9412+ ((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1])); \
9413+ Opcode = POLE_GET_OPC(pLE); \
9414+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9415+ ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == HW_OWNER) ? \
9416+ "Hardware" : "Software")); \
9417+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9418+ ("\tOpc: 0x%x ",Opcode)); \
9419+ if ((Opcode & ~HW_OWNER) == OP_PUTIDX) { \
9420+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9421+ ("\tOP_PUTIDX\n")); \
9422+ } \
9423+ else { \
9424+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9425+ ("\tunknown Opcode!!!\n")); \
9426+ } \
9427+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9428+ ("\tPort %c\n", 'A' + POLE_GET_LINK(pLE))); \
9429+ Idx = POLE_GET_TXAIDX(pLE); \
9430+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9431+ ("\tTxA Index is 0x%X and %svalid\n", Idx, \
9432+ (Idx & PU_PUTIDX_VALID) ? "" : "not ")); \
9433+ Idx = POLE_GET_TXSIDX(pLE); \
9434+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9435+ ("\tTxS Index is 0x%X and %svalid\n", Idx, \
9436+ (Idx & PU_PUTIDX_VALID) ? "" : "not ")); \
9437+ Idx = POLE_GET_RXIDX(pLE); \
9438+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9439+ ("\tRx Index is 0x%X and %svalid\n", Idx, \
9440+ (Idx & PU_PUTIDX_VALID) ? "" : "not ")); \
9441+ SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT, \
9442+ ("=====================\n")); \
9443+}
9444+#endif /* USE_POLLING_UNIT */
9445+
9446+#else /* !DEBUG */
9447+
9448+#define SK_DBG_DUMP_RX_LE(pLE)
9449+#define SK_DBG_DUMP_TX_LE(pLE)
9450+#define SK_DBG_DUMP_ST_LE(pLE)
9451+#define SK_DBG_DUMP_PO_LE(pLE)
9452+
9453+#endif /* !DEBUG */
9454+
9455+/******************************************************************************
9456+ *
9457+ * Macros for listelement tables
9458+ *
9459+ *
9460+ */
9461+
9462+#define LE_SIZE sizeof(SK_HWLE)
9463+#define LE_TAB_SIZE(NumElements) ((NumElements) * LE_SIZE)
9464+
9465+/* Number of unused list elements in table
9466+ * this macro always returns the number of free listelements - 1
9467+ * this way we want to guarantee that always one LE remains unused
9468+ */
9469+#define NUM_FREE_LE_IN_TABLE(pTable) \
9470+ ( ((pTable)->Put >= (pTable)->Done) ? \
9471+ (NUM_LE_IN_TABLE(pTable) - (pTable)->Put + (pTable)->Done - 1) :\
9472+ ((pTable)->Done - (pTable)->Put - 1) )
9473+
9474+/* total number of list elements in table */
9475+#define NUM_LE_IN_TABLE(pTable) ((pTable)->Num)
9476+
9477+/* get next unused Rx list element */
9478+#define GET_RX_LE(pLE, pTable) { \
9479+ pLE = &(pTable)->pLETab[(pTable)->Put]; \
9480+ (pTable)->Put = ((pTable)->Put + 1) & (NUM_LE_IN_TABLE(pTable) - 1);\
9481+}
9482+
9483+/* get next unused Tx list element */
9484+#define GET_TX_LE(pLE, pTable) GET_RX_LE(pLE, pTable)
9485+
9486+/* get next status list element expected to be finished by hw */
9487+#define GET_ST_LE(pLE, pTable) { \
9488+ pLE = &(pTable)->pLETab[(pTable)->Done]; \
9489+ (pTable)->Done = ((pTable)->Done +1) & (NUM_LE_IN_TABLE(pTable) - 1);\
9490+}
9491+
9492+#ifdef USE_POLLING_UNIT
9493+/* get next polling unit list element for port */
9494+#define GET_PO_LE(pLE, pTable, Port) { \
9495+ pLE = &(pTable)->pLETab[(Port)]; \
9496+}
9497+#endif /* USE_POLLING_UNIT */
9498+
9499+#define GET_PUT_IDX(pTable) ((pTable)->Put)
9500+
9501+#define UPDATE_HWPUT_IDX(pTable) {(pTable)->HwPut = (pTable)->Put; }
9502+
9503+/*
9504+ * get own bit of next status LE
9505+ * if the result is != 0 there has been at least one status LE finished
9506+ */
9507+#define OWN_OF_FIRST_LE(pTable) \
9508+ (STLE_GET_OPC(&(pTable)->pLETab[(pTable)->Done]) & HW_OWNER)
9509+
9510+#define SET_DONE_INDEX(pTable, Idx) (pTable)->Done = (Idx);
9511+
9512+#define GET_DONE_INDEX(pTable) ((pTable)->Done)
9513+
9514+#ifdef SAFE_BUT_SLOW
9515+
9516+/* check own bit of LE before current done idx */
9517+#define CHECK_STLE_OVERFLOW(pTable, IsOk) { \
9518+ unsigned i; \
9519+ if ((i = (pTable)->Done) == 0) { \
9520+ i = NUM_LE_IN_TABLE(pTable); \
9521+ } \
9522+ else { \
9523+ i = i - 1; \
9524+ } \
9525+ if (STLE_GET_OPC(&(pTable)->pLETab[i]) == HW_OWNER) { \
9526+ (IsOk) = SK_TRUE; \
9527+ } \
9528+ else { \
9529+ (IsOk) = SK_FALSE; \
9530+ } \
9531+ }
9532+
9533+
9534+/*
9535+ * for Yukon-2 the hardware is not polling the list elements, so it
9536+ * is not necessary to change the own-bit of Rx or Tx LEs before
9537+ * reusing them
9538+ * but it might make debugging easier if one simply can see whether
9539+ * a LE has been worked on
9540+ */
9541+
9542+#define CLEAR_LE_OWN(pTable, Idx) \
9543+ STLE_SET_OPC(&(pTable)->pLETab[(Idx)], SW_OWNER)
9544+
9545+/*
9546+ * clear all own bits starting from old done index up to the LE before
9547+ * the new done index
9548+ */
9549+#define CLEAR_LE_OWN_FROM_DONE_TO(pTable, To) { \
9550+ int i; \
9551+ i = (pTable)->Done; \
9552+ while (i != To) { \
9553+ CLEAR_LE_OWN(pTable, i); \
9554+ i = (i + 1) & (NUM_LE_IN_TABLE(pTable) - 1); \
9555+ } \
9556+ }
9557+
9558+#else /* !SAFE_BUT_SLOW */
9559+
9560+#define CHECK_STLE_OVERFLOW(pTable, IsOk)
9561+#define CLEAR_LE_OWN(pTable, Idx)
9562+#define CLEAR_LE_OWN_FROM_DONE_TO(pTable, To)
9563+
9564+#endif /* !SAFE_BUT_SLOW */
9565+
9566+
9567+/* typedefs *******************************************************************/
9568+
9569+typedef struct s_LetRxTx {
9570+ SK_U16 VlanId; /* VLAN Id given down last time */
9571+ SK_U16 TcpWp; /* TCP Checksum Write Position */
9572+ SK_U16 TcpSp1; /* TCP Checksum Calculation Start Position 1 */
9573+ SK_U16 TcpSp2; /* TCP Checksum Calculation Start Position 2 */
9574+ SK_U16 MssValue; /* Maximum Segment Size */
9575+ SK_U16 Reserved1; /* reserved word for furture extensions */
9576+ SK_U16 Reserved2; /* reserved word for furture extensions */
9577+ SK_U16 Reserved3; /* reserved word for furture extensions */
9578+} SK_LET_RX_TX;
9579+
9580+typedef struct s_LetStat {
9581+ SK_U32 RxTimeStamp; /* Receive Timestamp */
9582+ SK_U32 RssHashValue; /* RSS Hash Value */
9583+ SK_BOOL RssIsIp; /* RSS Hash Value: IP packet detected */
9584+ SK_BOOL RssIsTcp; /* RSS Hash Value: IP+TCP packet detected */
9585+ SK_U16 VlanId; /* VLAN Id given received by Status BMU */
9586+ SK_U16 TcpSum1; /* TCP checksum 1 (status BMU) */
9587+ SK_U16 TcpSum2; /* TCP checksum 2 (status BMU) */
9588+} SK_LET_STAT;
9589+
9590+typedef union s_LetBmuSpec {
9591+ SK_LET_RX_TX RxTx; /* Rx/Tx BMU specific variables */
9592+ SK_LET_STAT Stat; /* Status BMU specific variables */
9593+} SK_LET_BMU_S;
9594+
9595+typedef struct s_le_table {
9596+ /* all LE's between Done and HWPut are owned by the hardware */
9597+ /* all LE's between Put and Done can be used from Software */
9598+ /* all LE's between HWPut and Put are currently processed in DriverSend */
9599+ unsigned Done; /* done index - consumed from HW and available */
9600+ unsigned Put; /* put index - to be given to hardware */
9601+ unsigned HwPut; /* put index actually given to hardware */
9602+ unsigned Num; /* total number of list elements */
9603+ SK_HWLE *pLETab; /* virtual address of list element table */
9604+ SK_U32 pPhyLETABLow; /* physical address of list element table */
9605+ SK_U32 pPhyLETABHigh; /* physical address of list element table */
9606+ /* values to remember in order to save some LEs */
9607+ SK_U32 BufHighAddr; /* high addr given down last time */
9608+ SK_LET_BMU_S Bmu; /* contains BMU specific information */
9609+ SK_U32 private; /* driver private variable free usable */
9610+ SK_U16 TcpInitCsum; /* Init. Checksum */
9611+} SK_LE_TABLE;
9612+
9613+/* function prototypes ********************************************************/
9614+
9615+#ifndef SK_KR_PROTO
9616+
9617+/*
9618+ * public functions in sky2le.c
9619+ */
9620+extern void SkGeY2SetPutIndex(
9621+ SK_AC *pAC,
9622+ SK_IOC IoC,
9623+ SK_U32 StartAddrPrefetchUnit,
9624+ SK_LE_TABLE *pLETab);
9625+
9626+extern void SkGeY2InitPrefetchUnit(
9627+ SK_AC *pAC,
9628+ SK_IOC IoC,
9629+ unsigned int Queue,
9630+ SK_LE_TABLE *pLETab);
9631+
9632+extern void SkGeY2InitStatBmu(
9633+ SK_AC *pAC,
9634+ SK_IOC IoC,
9635+ SK_LE_TABLE *pLETab);
9636+
9637+extern void SkGeY2InitPollUnit(
9638+ SK_AC *pAC,
9639+ SK_IOC IoC,
9640+ SK_LE_TABLE *pLETab);
9641+
9642+extern void SkGeY2InitSingleLETable(
9643+ SK_AC *pAC,
9644+ SK_LE_TABLE *pLETab,
9645+ unsigned int NumLE,
9646+ void *pVMem,
9647+ SK_U32 PMemLowAddr,
9648+ SK_U32 PMemHighAddr);
9649+
9650+#else /* SK_KR_PROTO */
9651+extern void SkGeY2SetPutIndex();
9652+extern void SkGeY2InitPrefetchUnit();
9653+extern void SkGeY2InitStatBmu();
9654+extern void SkGeY2InitPollUnit();
9655+extern void SkGeY2InitSingleLETable();
9656+#endif /* SK_KR_PROTO */
9657+
9658+#ifdef __cplusplus
9659+}
9660+#endif /* __cplusplus */
9661+
9662+#endif /* __INC_SKY2LE_H */
9663+
9664diff -ruN linux/drivers/net/sk98lin/h/xmac_ii.h linux-new/drivers/net/sk98lin/h/xmac_ii.h
9665--- linux/drivers/net/sk98lin/h/xmac_ii.h 2006-04-11 19:19:28.000000000 +0200
9666+++ linux-new/drivers/net/sk98lin/h/xmac_ii.h 2006-01-18 14:37:24.000000000 +0100
9667@@ -2,23 +2,24 @@
9668 *
9669 * Name: xmac_ii.h
9670 * Project: Gigabit Ethernet Adapters, Common Modules
9671- * Version: $Revision$
9672- * Date: $Date$
9673+ * Version: $Revision$
9674+ * Date: $Date$
9675 * Purpose: Defines and Macros for Gigabit Ethernet Controller
9676 *
9677 ******************************************************************************/
9678
9679 /******************************************************************************
9680 *
9681+ * LICENSE:
9682 * (C)Copyright 1998-2002 SysKonnect.
9683- * (C)Copyright 2002-2003 Marvell.
9684+ * (C)Copyright 2002-2005 Marvell.
9685 *
9686 * This program is free software; you can redistribute it and/or modify
9687 * it under the terms of the GNU General Public License as published by
9688 * the Free Software Foundation; either version 2 of the License, or
9689 * (at your option) any later version.
9690- *
9691 * The information in this file is provided "AS IS" without warranty.
9692+ * /LICENSE
9693 *
9694 ******************************************************************************/
9695
9696@@ -371,18 +372,18 @@
9697 /* Bit 16..6: reserved */
9698 #define XM_SC_SNP_RXC (1<<5) /* Bit 5: (sc) Snap Rx Counters */
9699 #define XM_SC_SNP_TXC (1<<4) /* Bit 4: (sc) Snap Tx Counters */
9700-#define XM_SC_CP_RXC (1<<3) /* Bit 3: Copy Rx Counters Continuously */
9701+#define XM_SC_CP_RXC (1<<3) /* Bit 3: Copy Rx Counters Continuously */
9702 #define XM_SC_CP_TXC (1<<2) /* Bit 2: Copy Tx Counters Continuously */
9703 #define XM_SC_CLR_RXC (1<<1) /* Bit 1: (sc) Clear Rx Counters */
9704-#define XM_SC_CLR_TXC (1<<0) /* Bit 0: (sc) Clear Tx Counters */
9705+#define XM_SC_CLR_TXC (1<<0) /* Bit 0: (sc) Clear Tx Counters */
9706
9707
9708 /* XM_RX_CNT_EV 32 bit r/o Rx Counter Event Register */
9709 /* XM_RX_EV_MSK 32 bit r/w Rx Counter Event Mask */
9710-#define XMR_MAX_SZ_OV (1UL<<31) /* Bit 31: 1024-MaxSize Rx Cnt Ov*/
9711-#define XMR_1023B_OV (1L<<30) /* Bit 30: 512-1023Byte Rx Cnt Ov*/
9712-#define XMR_511B_OV (1L<<29) /* Bit 29: 256-511 Byte Rx Cnt Ov*/
9713-#define XMR_255B_OV (1L<<28) /* Bit 28: 128-255 Byte Rx Cnt Ov*/
9714+#define XMR_MAX_SZ_OV (1UL<<31) /* Bit 31: 1024-MaxSize Rx Cnt Ov */
9715+#define XMR_1023B_OV (1L<<30) /* Bit 30: 512-1023Byte Rx Cnt Ov */
9716+#define XMR_511B_OV (1L<<29) /* Bit 29: 256-511 Byte Rx Cnt Ov */
9717+#define XMR_255B_OV (1L<<28) /* Bit 28: 128-255 Byte Rx Cnt Ov */
9718 #define XMR_127B_OV (1L<<27) /* Bit 27: 65-127 Byte Rx Cnt Ov */
9719 #define XMR_64B_OV (1L<<26) /* Bit 26: 64 Byte Rx Cnt Ov */
9720 #define XMR_UTIL_OV (1L<<25) /* Bit 25: Rx Util Cnt Overflow */
9721@@ -390,9 +391,9 @@
9722 #define XMR_CEX_ERR_OV (1L<<23) /* Bit 23: CEXT Err Cnt Ov */
9723 /* Bit 22: reserved */
9724 #define XMR_FCS_ERR_OV (1L<<21) /* Bit 21: Rx FCS Error Cnt Ov */
9725-#define XMR_LNG_ERR_OV (1L<<20) /* Bit 20: Rx too Long Err Cnt Ov*/
9726+#define XMR_LNG_ERR_OV (1L<<20) /* Bit 20: Rx too Long Err Cnt Ov */
9727 #define XMR_RUNT_OV (1L<<19) /* Bit 19: Runt Event Cnt Ov */
9728-#define XMR_SHT_ERR_OV (1L<<18) /* Bit 18: Rx Short Ev Err Cnt Ov*/
9729+#define XMR_SHT_ERR_OV (1L<<18) /* Bit 18: Rx Short Ev Err Cnt Ov */
9730 #define XMR_SYM_ERR_OV (1L<<17) /* Bit 17: Rx Sym Err Cnt Ov */
9731 /* Bit 16: reserved */
9732 #define XMR_CAR_ERR_OV (1L<<15) /* Bit 15: Rx Carr Ev Err Cnt Ov */
9733@@ -401,57 +402,57 @@
9734 #define XMR_FRA_ERR_OV (1L<<12) /* Bit 12: Rx Framing Err Cnt Ov */
9735 #define XMR_FMISS_OV (1L<<11) /* Bit 11: Rx Missed Ev Cnt Ov */
9736 #define XMR_BURST (1L<<10) /* Bit 10: Rx Burst Event Cnt Ov */
9737-#define XMR_INV_MOC (1L<<9) /* Bit 9: Rx with inv. MAC OC Ov*/
9738+#define XMR_INV_MOC (1L<<9) /* Bit 9: Rx with inv. MAC OC Ov */
9739 #define XMR_INV_MP (1L<<8) /* Bit 8: Rx inv Pause Frame Ov */
9740 #define XMR_MCTRL_OV (1L<<7) /* Bit 7: Rx MAC Ctrl-F Cnt Ov */
9741-#define XMR_MPAUSE_OV (1L<<6) /* Bit 6: Rx Pause MAC Ctrl-F Ov*/
9742-#define XMR_UC_OK_OV (1L<<5) /* Bit 5: Rx Unicast Frame CntOv*/
9743+#define XMR_MPAUSE_OV (1L<<6) /* Bit 6: Rx Pause MAC Ctrl-F Ov */
9744+#define XMR_UC_OK_OV (1L<<5) /* Bit 5: Rx Unicast Frame Cnt Ov */
9745 #define XMR_MC_OK_OV (1L<<4) /* Bit 4: Rx Multicast Cnt Ov */
9746 #define XMR_BC_OK_OV (1L<<3) /* Bit 3: Rx Broadcast Cnt Ov */
9747-#define XMR_OK_LO_OV (1L<<2) /* Bit 2: Octets Rx OK Low CntOv*/
9748-#define XMR_OK_HI_OV (1L<<1) /* Bit 1: Octets Rx OK Hi Cnt Ov*/
9749-#define XMR_OK_OV (1L<<0) /* Bit 0: Frames Received Ok Ov */
9750+#define XMR_OK_LO_OV (1L<<2) /* Bit 2: Octets Rx OK Low Cnt Ov */
9751+#define XMR_OK_HI_OV (1L<<1) /* Bit 1: Octets Rx OK High Cnt Ov */
9752+#define XMR_OK_OV (1L<<0) /* Bit 0: Frames Received OK Ov */
9753
9754 #define XMR_DEF_MSK (XMR_OK_LO_OV | XMR_OK_HI_OV)
9755
9756 /* XM_TX_CNT_EV 32 bit r/o Tx Counter Event Register */
9757 /* XM_TX_EV_MSK 32 bit r/w Tx Counter Event Mask */
9758 /* Bit 31..26: reserved */
9759-#define XMT_MAX_SZ_OV (1L<<25) /* Bit 25: 1024-MaxSize Tx Cnt Ov*/
9760-#define XMT_1023B_OV (1L<<24) /* Bit 24: 512-1023Byte Tx Cnt Ov*/
9761-#define XMT_511B_OV (1L<<23) /* Bit 23: 256-511 Byte Tx Cnt Ov*/
9762-#define XMT_255B_OV (1L<<22) /* Bit 22: 128-255 Byte Tx Cnt Ov*/
9763+#define XMT_MAX_SZ_OV (1L<<25) /* Bit 25: 1024-MaxSize Tx Cnt Ov */
9764+#define XMT_1023B_OV (1L<<24) /* Bit 24: 512-1023Byte Tx Cnt Ov */
9765+#define XMT_511B_OV (1L<<23) /* Bit 23: 256-511 Byte Tx Cnt Ov */
9766+#define XMT_255B_OV (1L<<22) /* Bit 22: 128-255 Byte Tx Cnt Ov */
9767 #define XMT_127B_OV (1L<<21) /* Bit 21: 65-127 Byte Tx Cnt Ov */
9768 #define XMT_64B_OV (1L<<20) /* Bit 20: 64 Byte Tx Cnt Ov */
9769 #define XMT_UTIL_OV (1L<<19) /* Bit 19: Tx Util Cnt Overflow */
9770 #define XMT_UTIL_UR (1L<<18) /* Bit 18: Tx Util Cnt Underrun */
9771-#define XMT_CS_ERR_OV (1L<<17) /* Bit 17: Tx Carr Sen Err Cnt Ov*/
9772+#define XMT_CS_ERR_OV (1L<<17) /* Bit 17: Tx Carr Sen Err Cnt Ov */
9773 #define XMT_FIFO_UR_OV (1L<<16) /* Bit 16: Tx FIFO Ur Ev Cnt Ov */
9774 #define XMT_EX_DEF_OV (1L<<15) /* Bit 15: Tx Ex Deferall Cnt Ov */
9775 #define XMT_DEF (1L<<14) /* Bit 14: Tx Deferred Cnt Ov */
9776 #define XMT_LAT_COL_OV (1L<<13) /* Bit 13: Tx Late Col Cnt Ov */
9777-#define XMT_ABO_COL_OV (1L<<12) /* Bit 12: Tx abo dueto Ex Col Ov*/
9778+#define XMT_ABO_COL_OV (1L<<12) /* Bit 12: Tx abo dueto Ex Col Ov */
9779 #define XMT_MUL_COL_OV (1L<<11) /* Bit 11: Tx Mult Col Cnt Ov */
9780 #define XMT_SNG_COL (1L<<10) /* Bit 10: Tx Single Col Cnt Ov */
9781-#define XMT_MCTRL_OV (1L<<9) /* Bit 9: Tx MAC Ctrl Counter Ov*/
9782-#define XMT_MPAUSE (1L<<8) /* Bit 8: Tx Pause MAC Ctrl-F Ov*/
9783+#define XMT_MCTRL_OV (1L<<9) /* Bit 9: Tx MAC Ctrl Counter Ov */
9784+#define XMT_MPAUSE (1L<<8) /* Bit 8: Tx Pause MAC Ctrl-F Ov */
9785 #define XMT_BURST (1L<<7) /* Bit 7: Tx Burst Event Cnt Ov */
9786 #define XMT_LONG (1L<<6) /* Bit 6: Tx Long Frame Cnt Ov */
9787 #define XMT_UC_OK_OV (1L<<5) /* Bit 5: Tx Unicast Cnt Ov */
9788 #define XMT_MC_OK_OV (1L<<4) /* Bit 4: Tx Multicast Cnt Ov */
9789 #define XMT_BC_OK_OV (1L<<3) /* Bit 3: Tx Broadcast Cnt Ov */
9790-#define XMT_OK_LO_OV (1L<<2) /* Bit 2: Octets Tx OK Low CntOv*/
9791-#define XMT_OK_HI_OV (1L<<1) /* Bit 1: Octets Tx OK Hi Cnt Ov*/
9792-#define XMT_OK_OV (1L<<0) /* Bit 0: Frames Tx Ok Ov */
9793+#define XMT_OK_LO_OV (1L<<2) /* Bit 2: Octets Tx OK Low Cnt Ov */
9794+#define XMT_OK_HI_OV (1L<<1) /* Bit 1: Octets Tx OK High Cnt Ov */
9795+#define XMT_OK_OV (1L<<0) /* Bit 0: Frames Tx OK Ov */
9796
9797 #define XMT_DEF_MSK (XMT_OK_LO_OV | XMT_OK_HI_OV)
9798
9799 /*
9800 * Receive Frame Status Encoding
9801 */
9802-#define XMR_FS_LEN (0x3fffUL<<18) /* Bit 31..18: Rx Frame Length */
9803-#define XMR_FS_2L_VLAN (1L<<17) /* Bit 17: tagged wh 2Lev VLAN ID*/
9804-#define XMR_FS_1L_VLAN (1L<<16) /* Bit 16: tagged wh 1Lev VLAN ID*/
9805+#define XMR_FS_LEN_MSK (0x3fffUL<<18) /* Bit 31..18: Rx Frame Length */
9806+#define XMR_FS_2L_VLAN (1L<<17) /* Bit 17: Tagged wh 2Lev VLAN ID */
9807+#define XMR_FS_1L_VLAN (1L<<16) /* Bit 16: Tagged wh 1Lev VLAN ID */
9808 #define XMR_FS_BC (1L<<15) /* Bit 15: Broadcast Frame */
9809 #define XMR_FS_MC (1L<<14) /* Bit 14: Multicast Frame */
9810 #define XMR_FS_UC (1L<<13) /* Bit 13: Unicast Frame */
9811@@ -469,6 +470,8 @@
9812 #define XMR_FS_ERR (1L<<1) /* Bit 1: Frame Error */
9813 #define XMR_FS_MCTRL (1L<<0) /* Bit 0: MAC Control Packet */
9814
9815+#define XMR_FS_LEN_SHIFT 18
9816+
9817 /*
9818 * XMR_FS_ERR will be set if
9819 * XMR_FS_FCS_ERR, XMR_FS_LNG_ERR, XMR_FS_RUNT,
9820@@ -488,7 +491,7 @@
9821 #define PHY_XMAC_ID0 0x02 /* 16 bit r/o PHY ID0 Register */
9822 #define PHY_XMAC_ID1 0x03 /* 16 bit r/o PHY ID1 Register */
9823 #define PHY_XMAC_AUNE_ADV 0x04 /* 16 bit r/w Auto-Neg. Advertisement */
9824-#define PHY_XMAC_AUNE_LP 0x05 /* 16 bit r/o Link Partner Abi Reg */
9825+#define PHY_XMAC_AUNE_LP 0x05 /* 16 bit r/o Link Partner Ability Reg */
9826 #define PHY_XMAC_AUNE_EXP 0x06 /* 16 bit r/o Auto-Neg. Expansion Reg */
9827 #define PHY_XMAC_NEPG 0x07 /* 16 bit r/w Next Page Register */
9828 #define PHY_XMAC_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
9829@@ -510,7 +513,7 @@
9830 #define PHY_BCOM_NEPG 0x07 /* 16 bit r/w Next Page Register */
9831 #define PHY_BCOM_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
9832 /* Broadcom-specific registers */
9833-#define PHY_BCOM_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Ctrl Reg */
9834+#define PHY_BCOM_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */
9835 #define PHY_BCOM_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */
9836 /* 0x0b - 0x0e: reserved */
9837 #define PHY_BCOM_EXT_STAT 0x0f /* 16 bit r/o Extended Status Reg */
9838@@ -541,24 +544,32 @@
9839 #define PHY_MARV_NEPG 0x07 /* 16 bit r/w Next Page Register */
9840 #define PHY_MARV_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
9841 /* Marvel-specific registers */
9842-#define PHY_MARV_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Ctrl Reg */
9843+#define PHY_MARV_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */
9844 #define PHY_MARV_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */
9845 /* 0x0b - 0x0e: reserved */
9846 #define PHY_MARV_EXT_STAT 0x0f /* 16 bit r/o Extended Status Reg */
9847-#define PHY_MARV_PHY_CTRL 0x10 /* 16 bit r/w PHY Specific Ctrl Reg */
9848-#define PHY_MARV_PHY_STAT 0x11 /* 16 bit r/o PHY Specific Stat Reg */
9849+#define PHY_MARV_PHY_CTRL 0x10 /* 16 bit r/w PHY Specific Control Reg */
9850+#define PHY_MARV_PHY_STAT 0x11 /* 16 bit r/o PHY Specific Status Reg */
9851 #define PHY_MARV_INT_MASK 0x12 /* 16 bit r/w Interrupt Mask Reg */
9852 #define PHY_MARV_INT_STAT 0x13 /* 16 bit r/o Interrupt Status Reg */
9853 #define PHY_MARV_EXT_CTRL 0x14 /* 16 bit r/w Ext. PHY Specific Ctrl */
9854 #define PHY_MARV_RXE_CNT 0x15 /* 16 bit r/w Receive Error Counter */
9855 #define PHY_MARV_EXT_ADR 0x16 /* 16 bit r/w Ext. Ad. for Cable Diag. */
9856- /* 0x17: reserved */
9857+#define PHY_MARV_PORT_IRQ 0x17 /* 16 bit r/o Port 0 IRQ (88E1111 only) */
9858 #define PHY_MARV_LED_CTRL 0x18 /* 16 bit r/w LED Control Reg */
9859 #define PHY_MARV_LED_OVER 0x19 /* 16 bit r/w Manual LED Override Reg */
9860 #define PHY_MARV_EXT_CTRL_2 0x1a /* 16 bit r/w Ext. PHY Specific Ctrl 2 */
9861 #define PHY_MARV_EXT_P_STAT 0x1b /* 16 bit r/w Ext. PHY Spec. Stat Reg */
9862 #define PHY_MARV_CABLE_DIAG 0x1c /* 16 bit r/o Cable Diagnostic Reg */
9863- /* 0x1d - 0x1f: reserved */
9864+#define PHY_MARV_PAGE_ADDR 0x1d /* 16 bit r/w Extended Page Address Reg */
9865+#define PHY_MARV_PAGE_DATA 0x1e /* 16 bit r/w Extended Page Data Reg */
9866+
9867+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
9868+#define PHY_MARV_FE_LED_PAR 0x16 /* 16 bit r/w LED Parallel Select Reg. */
9869+#define PHY_MARV_FE_LED_SER 0x17 /* 16 bit r/w LED Stream Select S. LED */
9870+#define PHY_MARV_FE_VCT_TX 0x1a /* 16 bit r/w VCT Reg. for TXP/N Pins */
9871+#define PHY_MARV_FE_VCT_RX 0x1b /* 16 bit r/o VCT Reg. for RXP/N Pins */
9872+#define PHY_MARV_FE_SPEC_2 0x1c /* 16 bit r/w Specific Control Reg. 2 */
9873
9874 /*----------------------------------------------------------------------------*/
9875 /*
9876@@ -574,9 +585,9 @@
9877 #define PHY_LONE_NEPG 0x07 /* 16 bit r/w Next Page Register */
9878 #define PHY_LONE_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
9879 /* Level One-specific registers */
9880-#define PHY_LONE_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg*/
9881+#define PHY_LONE_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */
9882 #define PHY_LONE_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */
9883- /* 0x0b -0x0e: reserved */
9884+ /* 0x0b - 0x0e: reserved */
9885 #define PHY_LONE_EXT_STAT 0x0f /* 16 bit r/o Extended Status Reg */
9886 #define PHY_LONE_PORT_CFG 0x10 /* 16 bit r/w Port Configuration Reg*/
9887 #define PHY_LONE_Q_STAT 0x11 /* 16 bit r/o Quick Status Reg */
9888@@ -585,7 +596,7 @@
9889 #define PHY_LONE_LED_CFG 0x14 /* 16 bit r/w LED Configuration Reg */
9890 #define PHY_LONE_PORT_CTRL 0x15 /* 16 bit r/w Port Control Reg */
9891 #define PHY_LONE_CIM 0x16 /* 16 bit r/o CIM Reg */
9892- /* 0x17 -0x1c: reserved */
9893+ /* 0x17 - 0x1c: reserved */
9894
9895 /*----------------------------------------------------------------------------*/
9896 /*
9897@@ -603,14 +614,14 @@
9898 /* National-specific registers */
9899 #define PHY_NAT_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg */
9900 #define PHY_NAT_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */
9901- /* 0x0b -0x0e: reserved */
9902+ /* 0x0b - 0x0e: reserved */
9903 #define PHY_NAT_EXT_STAT 0x0f /* 16 bit r/o Extended Status Register */
9904 #define PHY_NAT_EXT_CTRL1 0x10 /* 16 bit r/o Extended Control Reg1 */
9905 #define PHY_NAT_Q_STAT1 0x11 /* 16 bit r/o Quick Status Reg1 */
9906 #define PHY_NAT_10B_OP 0x12 /* 16 bit r/o 10Base-T Operations Reg */
9907 #define PHY_NAT_EXT_CTRL2 0x13 /* 16 bit r/o Extended Control Reg1 */
9908 #define PHY_NAT_Q_STAT2 0x14 /* 16 bit r/o Quick Status Reg2 */
9909- /* 0x15 -0x18: reserved */
9910+ /* 0x15 - 0x18: reserved */
9911 #define PHY_NAT_PHY_ADDR 0x19 /* 16 bit r/o PHY Address Register */
9912
9913
9914@@ -618,7 +629,7 @@
9915
9916 /*
9917 * PHY bit definitions
9918- * Bits defined as PHY_X_..., PHY_B_..., PHY_L_... or PHY_N_... are
9919+ * Bits defined as PHY_X_..., PHY_B_..., PHY_L_..., PHY_N_... or PHY_M_... are
9920 * XMAC/Broadcom/LevelOne/National/Marvell-specific.
9921 * All other are general.
9922 */
9923@@ -629,14 +640,14 @@
9924 /***** PHY_LONE_CTRL 16 bit r/w PHY Control Register *****/
9925 #define PHY_CT_RESET (1<<15) /* Bit 15: (sc) clear all PHY related regs */
9926 #define PHY_CT_LOOP (1<<14) /* Bit 14: enable Loopback over PHY */
9927-#define PHY_CT_SPS_LSB (1<<13) /* Bit 13: (BC,L1) Speed select, lower bit */
9928+#define PHY_CT_SPS_LSB (1<<13) /* Bit 13: Speed select, lower bit */
9929 #define PHY_CT_ANE (1<<12) /* Bit 12: Auto-Negotiation Enabled */
9930-#define PHY_CT_PDOWN (1<<11) /* Bit 11: (BC,L1) Power Down Mode */
9931-#define PHY_CT_ISOL (1<<10) /* Bit 10: (BC,L1) Isolate Mode */
9932-#define PHY_CT_RE_CFG (1<<9) /* Bit 9: (sc) Restart Auto-Negotiation */
9933+#define PHY_CT_PDOWN (1<<11) /* Bit 11: Power Down Mode */
9934+#define PHY_CT_ISOL (1<<10) /* Bit 10: Isolate Mode */
9935+#define PHY_CT_RE_CFG (1<<9) /* Bit 9: (sc) Restart Auto-Negotiation */
9936 #define PHY_CT_DUP_MD (1<<8) /* Bit 8: Duplex Mode */
9937-#define PHY_CT_COL_TST (1<<7) /* Bit 7: (BC,L1) Collision Test enabled */
9938-#define PHY_CT_SPS_MSB (1<<6) /* Bit 6: (BC,L1) Speed select, upper bit */
9939+#define PHY_CT_COL_TST (1<<7) /* Bit 7: Collision Test enabled */
9940+#define PHY_CT_SPS_MSB (1<<6) /* Bit 6: Speed select, upper bit */
9941 /* Bit 5..0: reserved */
9942
9943 #define PHY_CT_SP1000 PHY_CT_SPS_MSB /* enable speed of 1000 Mbps */
9944@@ -649,25 +660,25 @@
9945 /***** PHY_MARV_STAT 16 bit r/w PHY Status Register *****/
9946 /***** PHY_LONE_STAT 16 bit r/w PHY Status Register *****/
9947 /* Bit 15..9: reserved */
9948- /* (BC/L1) 100/10 Mbps cap bits ignored*/
9949+ /* (BC/L1) 100/10 Mbps cap bits ignored */
9950 #define PHY_ST_EXT_ST (1<<8) /* Bit 8: Extended Status Present */
9951 /* Bit 7: reserved */
9952-#define PHY_ST_PRE_SUP (1<<6) /* Bit 6: (BC/L1) preamble suppression */
9953+#define PHY_ST_PRE_SUP (1<<6) /* Bit 6: Preamble Suppression */
9954 #define PHY_ST_AN_OVER (1<<5) /* Bit 5: Auto-Negotiation Over */
9955 #define PHY_ST_REM_FLT (1<<4) /* Bit 4: Remote Fault Condition Occured */
9956 #define PHY_ST_AN_CAP (1<<3) /* Bit 3: Auto-Negotiation Capability */
9957 #define PHY_ST_LSYNC (1<<2) /* Bit 2: Link Synchronized */
9958-#define PHY_ST_JAB_DET (1<<1) /* Bit 1: (BC/L1) Jabber Detected */
9959+#define PHY_ST_JAB_DET (1<<1) /* Bit 1: Jabber Detected */
9960 #define PHY_ST_EXT_REG (1<<0) /* Bit 0: Extended Register available */
9961
9962
9963-/***** PHY_XMAC_ID1 16 bit r/o PHY ID1 Register */
9964-/***** PHY_BCOM_ID1 16 bit r/o PHY ID1 Register */
9965-/***** PHY_MARV_ID1 16 bit r/o PHY ID1 Register */
9966-/***** PHY_LONE_ID1 16 bit r/o PHY ID1 Register */
9967+/***** PHY_XMAC_ID1 16 bit r/o PHY ID1 Register */
9968+/***** PHY_BCOM_ID1 16 bit r/o PHY ID1 Register */
9969+/***** PHY_MARV_ID1 16 bit r/o PHY ID1 Register */
9970+/***** PHY_LONE_ID1 16 bit r/o PHY ID1 Register */
9971 #define PHY_I1_OUI_MSK (0x3f<<10) /* Bit 15..10: Organization Unique ID */
9972 #define PHY_I1_MOD_NUM (0x3f<<4) /* Bit 9.. 4: Model Number */
9973-#define PHY_I1_REV_MSK 0x0f /* Bit 3.. 0: Revision Number */
9974+#define PHY_I1_REV_MSK 0xf /* Bit 3.. 0: Revision Number */
9975
9976 /* different Broadcom PHY Ids */
9977 #define PHY_BCOM_ID1_A1 0x6041
9978@@ -675,11 +686,21 @@
9979 #define PHY_BCOM_ID1_C0 0x6044
9980 #define PHY_BCOM_ID1_C5 0x6047
9981
9982+/* different Marvell PHY Ids */
9983+#define PHY_MARV_ID0_VAL 0x0141 /* Marvell Unique Identifier */
9984+
9985+#define PHY_MARV_ID1_B0 0x0C23 /* Yukon (PHY 88E1040 Rev.C0) */
9986+#define PHY_MARV_ID1_B2 0x0C25 /* Yukon-Plus (PHY 88E1040 Rev.D0) */
9987+#define PHY_MARV_ID1_C2 0x0CC2 /* Yukon-EC (PHY 88E1111 Rev.B1) */
9988+#define PHY_MARV_ID1_Y2 0x0C91 /* Yukon-XL (PHY 88E1112 Rev.B0) */
9989+#define PHY_MARV_ID1_FE 0x0C83 /* Yukon-FE (PHY 88E3082 Rev.A1) */
9990+#define PHY_MARV_ID1_ECU 0x0CB0 /* Yukon-ECU (PHY 88E1149 Rev.B2?) */
9991+
9992
9993 /***** PHY_XMAC_AUNE_ADV 16 bit r/w Auto-Negotiation Advertisement *****/
9994 /***** PHY_XMAC_AUNE_LP 16 bit r/o Link Partner Ability Reg *****/
9995 #define PHY_AN_NXT_PG (1<<15) /* Bit 15: Request Next Page */
9996-#define PHY_X_AN_ACK (1<<14) /* Bit 14: (ro) Acknowledge Received */
9997+#define PHY_X_AN_ACK (1<<14) /* Bit 14: (ro) Acknowledge Received */
9998 #define PHY_X_AN_RFB (3<<12) /* Bit 13..12: Remote Fault Bits */
9999 /* Bit 11.. 9: reserved */
10000 #define PHY_X_AN_PAUSE (3<<7) /* Bit 8.. 7: Pause Bits */
10001@@ -827,7 +848,7 @@
10002 #define PHY_B_PEC_BY_MLT3 (1<<8) /* Bit 8: Bypass MLT3 Encoder */
10003 #define PHY_B_PEC_BY_RXA (1<<7) /* Bit 7: Bypass Rx Alignm. */
10004 #define PHY_B_PEC_RES_SCR (1<<6) /* Bit 6: Reset Scrambler */
10005-#define PHY_B_PEC_EN_LTR (1<<5) /* Bit 5: Ena LED Traffic Mode */
10006+#define PHY_B_PEC_EN_LTR (1<<5) /* Bit 5: Enable LED Traffic Mode */
10007 #define PHY_B_PEC_LED_ON (1<<4) /* Bit 4: Force LED's on */
10008 #define PHY_B_PEC_LED_OFF (1<<3) /* Bit 3: Force LED's off */
10009 #define PHY_B_PEC_EX_IPG (1<<2) /* Bit 2: Extend Tx IPG Mode */
10010@@ -981,7 +1002,7 @@
10011 #define PHY_L_QS_DUP_MOD (1<<9) /* Bit 9: Full/Half Duplex */
10012 #define PHY_L_QS_AN (1<<8) /* Bit 8: AutoNeg is On */
10013 #define PHY_L_QS_AN_C (1<<7) /* Bit 7: AN is Complete */
10014-#define PHY_L_QS_LLE (7<<4) /* Bit 6: Line Length Estim. */
10015+#define PHY_L_QS_LLE (7<<4) /* Bit 6..4: Line Length Estim. */
10016 #define PHY_L_QS_PAUSE (1<<3) /* Bit 3: LP advertised Pause */
10017 #define PHY_L_QS_AS_PAUSE (1<<2) /* Bit 2: LP adv. asym. Pause */
10018 #define PHY_L_QS_ISOLATE (1<<1) /* Bit 1: CIM Isolated */
10019@@ -1029,9 +1050,8 @@
10020 /* Bit 9..0: not described */
10021
10022 /***** PHY_LONE_CIM 16 bit r/o CIM Reg *****/
10023-#define PHY_L_CIM_ISOL (255<<8)/* Bit 15..8: Isolate Count */
10024-#define PHY_L_CIM_FALSE_CAR (255<<0)/* Bit 7..0: False Carrier Count */
10025-
10026+#define PHY_L_CIM_ISOL (0xff<<8) /* Bit 15..8: Isolate Count */
10027+#define PHY_L_CIM_FALSE_CAR 0xff /* Bit 7..0: False Carrier Count */
10028
10029 /*
10030 * Pause Bits (PHY_L_AN_ASP and PHY_L_AN_PC) encoding
10031@@ -1041,7 +1061,6 @@
10032 #define PHY_L_P_ASYM_MD (2<<10) /* Bit 11..10: asymmetric Pause Mode */
10033 #define PHY_L_P_BOTH_MD (3<<10) /* Bit 11..10: both Pause Mode */
10034
10035-
10036 /*
10037 * National-Specific
10038 */
10039@@ -1086,22 +1105,24 @@
10040 */
10041 /***** PHY_MARV_AUNE_ADV 16 bit r/w Auto-Negotiation Advertisement *****/
10042 /***** PHY_MARV_AUNE_LP 16 bit r/w Link Part Ability Reg *****/
10043-#define PHY_M_AN_NXT_PG BIT_15 /* Request Next Page */
10044-#define PHY_M_AN_ACK BIT_14 /* (ro) Acknowledge Received */
10045-#define PHY_M_AN_RF BIT_13 /* Remote Fault */
10046- /* Bit 12: reserved */
10047-#define PHY_M_AN_ASP BIT_11 /* Asymmetric Pause */
10048-#define PHY_M_AN_PC BIT_10 /* MAC Pause implemented */
10049-#define PHY_M_AN_100_FD BIT_8 /* Advertise 100Base-TX Full Duplex */
10050-#define PHY_M_AN_100_HD BIT_7 /* Advertise 100Base-TX Half Duplex */
10051-#define PHY_M_AN_10_FD BIT_6 /* Advertise 10Base-TX Full Duplex */
10052-#define PHY_M_AN_10_HD BIT_5 /* Advertise 10Base-TX Half Duplex */
10053-
10054-/* special defines for FIBER (88E1011S only) */
10055-#define PHY_M_AN_ASP_X BIT_8 /* Asymmetric Pause */
10056-#define PHY_M_AN_PC_X BIT_7 /* MAC Pause implemented */
10057-#define PHY_M_AN_1000X_AHD BIT_6 /* Advertise 10000Base-X Half Duplex */
10058-#define PHY_M_AN_1000X_AFD BIT_5 /* Advertise 10000Base-X Full Duplex */
10059+#define PHY_M_AN_NXT_PG BIT_15S /* Request Next Page */
10060+#define PHY_M_AN_ACK BIT_14S /* (ro) Acknowledge Received */
10061+#define PHY_M_AN_RF BIT_13S /* Remote Fault */
10062+ /* Bit 12: reserved */
10063+#define PHY_M_AN_ASP BIT_11S /* Asymmetric Pause */
10064+#define PHY_M_AN_PC BIT_10S /* MAC Pause implemented */
10065+#define PHY_M_AN_100_T4 BIT_9S /* Not cap. 100Base-T4 (always 0) */
10066+#define PHY_M_AN_100_FD BIT_8S /* Advertise 100Base-TX Full Duplex */
10067+#define PHY_M_AN_100_HD BIT_7S /* Advertise 100Base-TX Half Duplex */
10068+#define PHY_M_AN_10_FD BIT_6S /* Advertise 10Base-TX Full Duplex */
10069+#define PHY_M_AN_10_HD BIT_5S /* Advertise 10Base-TX Half Duplex */
10070+#define PHY_M_AN_SEL_MSK (0x1f<<4) /* Bit 4.. 0: Selector Field Mask */
10071+
10072+/* special defines for FIBER (88E1040S only) */
10073+#define PHY_M_AN_ASP_X BIT_8S /* Asymmetric Pause */
10074+#define PHY_M_AN_PC_X BIT_7S /* MAC Pause implemented */
10075+#define PHY_M_AN_1000X_AHD BIT_6S /* Advertise 10000Base-X Half Duplex */
10076+#define PHY_M_AN_1000X_AFD BIT_5S /* Advertise 10000Base-X Full Duplex */
10077
10078 /* Pause Bits (PHY_M_AN_ASP_X and PHY_M_AN_PC_X) encoding */
10079 #define PHY_M_P_NO_PAUSE_X (0<<7) /* Bit 8.. 7: no Pause Mode */
10080@@ -1111,105 +1132,167 @@
10081
10082 /***** PHY_MARV_1000T_CTRL 16 bit r/w 1000Base-T Control Reg *****/
10083 #define PHY_M_1000C_TEST (7<<13) /* Bit 15..13: Test Modes */
10084-#define PHY_M_1000C_MSE (1<<12) /* Bit 12: Manual Master/Slave Enable */
10085-#define PHY_M_1000C_MSC (1<<11) /* Bit 11: M/S Configuration (1=Master) */
10086-#define PHY_M_1000C_MPD (1<<10) /* Bit 10: Multi-Port Device */
10087-#define PHY_M_1000C_AFD (1<<9) /* Bit 9: Advertise Full Duplex */
10088-#define PHY_M_1000C_AHD (1<<8) /* Bit 8: Advertise Half Duplex */
10089+#define PHY_M_1000C_MSE BIT_12S /* Manual Master/Slave Enable */
10090+#define PHY_M_1000C_MSC BIT_11S /* M/S Configuration (1=Master) */
10091+#define PHY_M_1000C_MPD BIT_10S /* Multi-Port Device */
10092+#define PHY_M_1000C_AFD BIT_9S /* Advertise Full Duplex */
10093+#define PHY_M_1000C_AHD BIT_8S /* Advertise Half Duplex */
10094 /* Bit 7..0: reserved */
10095
10096 /***** PHY_MARV_PHY_CTRL 16 bit r/w PHY Specific Ctrl Reg *****/
10097-#define PHY_M_PC_TX_FFD_MSK (3<<14) /* Bit 15..14: Tx FIFO Depth Mask */
10098-#define PHY_M_PC_RX_FFD_MSK (3<<12) /* Bit 13..12: Rx FIFO Depth Mask */
10099-#define PHY_M_PC_ASS_CRS_TX (1<<11) /* Bit 11: Assert CRS on Transmit */
10100-#define PHY_M_PC_FL_GOOD (1<<10) /* Bit 10: Force Link Good */
10101-#define PHY_M_PC_EN_DET_MSK (3<<8) /* Bit 9.. 8: Energy Detect Mask */
10102-#define PHY_M_PC_ENA_EXT_D (1<<7) /* Bit 7: Enable Ext. Distance (10BT) */
10103-#define PHY_M_PC_MDIX_MSK (3<<5) /* Bit 6.. 5: MDI/MDIX Config. Mask */
10104-#define PHY_M_PC_DIS_125CLK (1<<4) /* Bit 4: Disable 125 CLK */
10105-#define PHY_M_PC_MAC_POW_UP (1<<3) /* Bit 3: MAC Power up */
10106-#define PHY_M_PC_SQE_T_ENA (1<<2) /* Bit 2: SQE Test Enabled */
10107-#define PHY_M_PC_POL_R_DIS (1<<1) /* Bit 1: Polarity Reversal Disabled */
10108-#define PHY_M_PC_DIS_JABBER (1<<0) /* Bit 0: Disable Jabber */
10109+#define PHY_M_PC_TX_FFD_MSK (3<<14) /* Bit 15..14: Tx FIFO Depth Mask */
10110+#define PHY_M_PC_RX_FFD_MSK (3<<12) /* Bit 13..12: Rx FIFO Depth Mask */
10111+#define PHY_M_PC_ASS_CRS_TX BIT_11S /* Assert CRS on Transmit */
10112+#define PHY_M_PC_FL_GOOD BIT_10S /* Force Link Good */
10113+#define PHY_M_PC_EN_DET_MSK (3<<8) /* Bit 9.. 8: Energy Detect Mask */
10114+#define PHY_M_PC_ENA_EXT_D BIT_7S /* Enable Ext. Distance (10BT) */
10115+#define PHY_M_PC_MDIX_MSK (3<<5) /* Bit 6.. 5: MDI/MDIX Config. Mask */
10116+#define PHY_M_PC_DIS_125CLK BIT_4S /* Disable 125 CLK */
10117+#define PHY_M_PC_MAC_POW_UP BIT_3S /* MAC Power up */
10118+#define PHY_M_PC_SQE_T_ENA BIT_2S /* SQE Test Enabled */
10119+#define PHY_M_PC_POL_R_DIS BIT_1S /* Polarity Reversal Disabled */
10120+#define PHY_M_PC_DIS_JABBER BIT_0S /* Disable Jabber */
10121
10122 #define PHY_M_PC_EN_DET SHIFT8(2) /* Energy Detect (Mode 1) */
10123 #define PHY_M_PC_EN_DET_PLUS SHIFT8(3) /* Energy Detect Plus (Mode 2) */
10124
10125-#define PHY_M_PC_MDI_XMODE(x) SHIFT5(x)
10126-#define PHY_M_PC_MAN_MDI 0 /* 00 = Manual MDI configuration */
10127+#define PHY_M_PC_MDI_XMODE(x) (SHIFT5(x) & PHY_M_PC_MDIX_MSK)
10128+
10129+#define PHY_M_PC_MAN_MDI 0 /* 00 = Manual MDI configuration */
10130 #define PHY_M_PC_MAN_MDIX 1 /* 01 = Manual MDIX configuration */
10131 #define PHY_M_PC_ENA_AUTO 3 /* 11 = Enable Automatic Crossover */
10132
10133+/* for Yukon-2/-EC Ultra Gigabit Ethernet PHY (88E1112/88E1149 only) */
10134+#define PHY_M_PC_DIS_LINK_P BIT_15S /* Disable Link Pulses */
10135+#define PHY_M_PC_DSC_MSK (7<<12) /* Bit 14..12: Downshift Counter */
10136+#define PHY_M_PC_DOWN_S_ENA BIT_11S /* Downshift Enable */
10137+ /* !!! Errata in spec. (1 = disable) */
10138+
10139+#define PHY_M_PC_DSC(x) (SHIFT12(x) & PHY_M_PC_DSC_MSK)
10140+ /* 000=1x; 001=2x; 010=3x; 011=4x */
10141+ /* 100=5x; 101=6x; 110=7x; 111=8x */
10142+
10143+/* for Yukon-EC Ultra Gigabit Ethernet PHY (88E1149 only) */
10144+ /* Bit 4: reserved */
10145+#define PHY_M_PC_COP_TX_DIS BIT_3S /* Copper Transmitter Disable */
10146+#define PHY_M_PC_POW_D_ENA BIT_2S /* Power Down Enable */
10147+
10148+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
10149+#define PHY_M_PC_ENA_DTE_DT BIT_15S /* Enable Data Terminal Equ. (DTE) Detect */
10150+#define PHY_M_PC_ENA_ENE_DT BIT_14S /* Enable Energy Detect (sense & pulse) */
10151+#define PHY_M_PC_DIS_NLP_CK BIT_13S /* Disable Normal Link Puls (NLP) Check */
10152+#define PHY_M_PC_ENA_LIP_NP BIT_12S /* Enable Link Partner Next Page Reg. */
10153+#define PHY_M_PC_DIS_NLP_GN BIT_11S /* Disable Normal Link Puls Generation */
10154+
10155+#define PHY_M_PC_DIS_SCRAMB BIT_9S /* Disable Scrambler */
10156+#define PHY_M_PC_DIS_FEFI BIT_8S /* Disable Far End Fault Indic. (FEFI) */
10157+
10158+#define PHY_M_PC_SH_TP_SEL BIT_6S /* Shielded Twisted Pair Select */
10159+#define PHY_M_PC_RX_FD_MSK (3<<2) /* Bit 3.. 2: Rx FIFO Depth Mask */
10160+
10161 /***** PHY_MARV_PHY_STAT 16 bit r/o PHY Specific Status Reg *****/
10162-#define PHY_M_PS_SPEED_MSK (3<<14) /* Bit 15..14: Speed Mask */
10163-#define PHY_M_PS_SPEED_1000 (1<<15) /* 10 = 1000 Mbps */
10164-#define PHY_M_PS_SPEED_100 (1<<14) /* 01 = 100 Mbps */
10165-#define PHY_M_PS_SPEED_10 0 /* 00 = 10 Mbps */
10166-#define PHY_M_PS_FULL_DUP (1<<13) /* Bit 13: Full Duplex */
10167-#define PHY_M_PS_PAGE_REC (1<<12) /* Bit 12: Page Received */
10168-#define PHY_M_PS_SPDUP_RES (1<<11) /* Bit 11: Speed & Duplex Resolved */
10169-#define PHY_M_PS_LINK_UP (1<<10) /* Bit 10: Link Up */
10170-#define PHY_M_PS_CABLE_MSK (3<<7) /* Bit 9.. 7: Cable Length Mask */
10171-#define PHY_M_PS_MDI_X_STAT (1<<6) /* Bit 6: MDI Crossover Stat (1=MDIX) */
10172-#define PHY_M_PS_DOWNS_STAT (1<<5) /* Bit 5: Downshift Status (1=downsh.) */
10173-#define PHY_M_PS_ENDET_STAT (1<<4) /* Bit 4: Energy Detect Status (1=act) */
10174-#define PHY_M_PS_TX_P_EN (1<<3) /* Bit 3: Tx Pause Enabled */
10175-#define PHY_M_PS_RX_P_EN (1<<2) /* Bit 2: Rx Pause Enabled */
10176-#define PHY_M_PS_POL_REV (1<<1) /* Bit 1: Polarity Reversed */
10177-#define PHY_M_PC_JABBER (1<<0) /* Bit 0: Jabber */
10178+#define PHY_M_PS_SPEED_MSK (3<<14) /* Bit 15..14: Speed Mask */
10179+#define PHY_M_PS_SPEED_1000 BIT_15S /* 10 = 1000 Mbps */
10180+#define PHY_M_PS_SPEED_100 BIT_14S /* 01 = 100 Mbps */
10181+#define PHY_M_PS_SPEED_10 0 /* 00 = 10 Mbps */
10182+#define PHY_M_PS_FULL_DUP BIT_13S /* Full Duplex */
10183+#define PHY_M_PS_PAGE_REC BIT_12S /* Page Received */
10184+#define PHY_M_PS_SPDUP_RES BIT_11S /* Speed & Duplex Resolved */
10185+#define PHY_M_PS_LINK_UP BIT_10S /* Link Up */
10186+#define PHY_M_PS_CABLE_MSK (7<<7) /* Bit 9.. 7: Cable Length Mask */
10187+#define PHY_M_PS_MDI_X_STAT BIT_6S /* MDI Crossover Stat (1=MDIX) */
10188+#define PHY_M_PS_DOWNS_STAT BIT_5S /* Downshift Status (1=downsh.) */
10189+#define PHY_M_PS_ENDET_STAT BIT_4S /* Energy Detect Status (1=act) */
10190+#define PHY_M_PS_TX_P_EN BIT_3S /* Tx Pause Enabled */
10191+#define PHY_M_PS_RX_P_EN BIT_2S /* Rx Pause Enabled */
10192+#define PHY_M_PS_POL_REV BIT_1S /* Polarity Reversed */
10193+#define PHY_M_PS_JABBER BIT_0S /* Jabber */
10194
10195 #define PHY_M_PS_PAUSE_MSK (PHY_M_PS_TX_P_EN | PHY_M_PS_RX_P_EN)
10196
10197+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
10198+#define PHY_M_PS_DTE_DETECT BIT_15S /* Data Terminal Equipment (DTE) Detected */
10199+#define PHY_M_PS_RES_SPEED BIT_14S /* Resolved Speed (1=100 Mbps, 0=10 Mbps */
10200+
10201 /***** PHY_MARV_INT_MASK 16 bit r/w Interrupt Mask Reg *****/
10202 /***** PHY_MARV_INT_STAT 16 bit r/o Interrupt Status Reg *****/
10203-#define PHY_M_IS_AN_ERROR (1<<15) /* Bit 15: Auto-Negotiation Error */
10204-#define PHY_M_IS_LSP_CHANGE (1<<14) /* Bit 14: Link Speed Changed */
10205-#define PHY_M_IS_DUP_CHANGE (1<<13) /* Bit 13: Duplex Mode Changed */
10206-#define PHY_M_IS_AN_PR (1<<12) /* Bit 12: Page Received */
10207-#define PHY_M_IS_AN_COMPL (1<<11) /* Bit 11: Auto-Negotiation Completed */
10208-#define PHY_M_IS_LST_CHANGE (1<<10) /* Bit 10: Link Status Changed */
10209-#define PHY_M_IS_SYMB_ERROR (1<<9) /* Bit 9: Symbol Error */
10210-#define PHY_M_IS_FALSE_CARR (1<<8) /* Bit 8: False Carrier */
10211-#define PHY_M_IS_FIFO_ERROR (1<<7) /* Bit 7: FIFO Overflow/Underrun Error */
10212-#define PHY_M_IS_MDI_CHANGE (1<<6) /* Bit 6: MDI Crossover Changed */
10213-#define PHY_M_IS_DOWNSH_DET (1<<5) /* Bit 5: Downshift Detected */
10214-#define PHY_M_IS_END_CHANGE (1<<4) /* Bit 4: Energy Detect Changed */
10215- /* Bit 3..2: reserved */
10216-#define PHY_M_IS_POL_CHANGE (1<<1) /* Bit 1: Polarity Changed */
10217-#define PHY_M_IS_JABBER (1<<0) /* Bit 0: Jabber */
10218+#define PHY_M_IS_AN_ERROR BIT_15S /* Auto-Negotiation Error */
10219+#define PHY_M_IS_LSP_CHANGE BIT_14S /* Link Speed Changed */
10220+#define PHY_M_IS_DUP_CHANGE BIT_13S /* Duplex Mode Changed */
10221+#define PHY_M_IS_AN_PR BIT_12S /* Page Received */
10222+#define PHY_M_IS_AN_COMPL BIT_11S /* Auto-Negotiation Completed */
10223+#define PHY_M_IS_LST_CHANGE BIT_10S /* Link Status Changed */
10224+#define PHY_M_IS_SYMB_ERROR BIT_9S /* Symbol Error */
10225+#define PHY_M_IS_FALSE_CARR BIT_8S /* False Carrier */
10226+#define PHY_M_IS_FIFO_ERROR BIT_7S /* FIFO Overflow/Underrun Error */
10227+#define PHY_M_IS_MDI_CHANGE BIT_6S /* MDI Crossover Changed */
10228+#define PHY_M_IS_DOWNSH_DET BIT_5S /* Downshift Detected */
10229+#define PHY_M_IS_END_CHANGE BIT_4S /* Energy Detect Changed */
10230+ /* Bit 3: reserved */
10231+#define PHY_M_IS_DTE_CHANGE BIT_2S /* DTE Power Det. Status Changed */
10232+ /* (88E1111 only) */
10233+#define PHY_M_IS_POL_CHANGE BIT_1S /* Polarity Changed */
10234+#define PHY_M_IS_JABBER BIT_0S /* Jabber */
10235
10236 #define PHY_M_DEF_MSK (PHY_M_IS_AN_ERROR | PHY_M_IS_AN_PR | \
10237 PHY_M_IS_LST_CHANGE | PHY_M_IS_FIFO_ERROR)
10238
10239 /***** PHY_MARV_EXT_CTRL 16 bit r/w Ext. PHY Specific Ctrl *****/
10240-#define PHY_M_EC_M_DSC_MSK (3<<10) /* Bit 11..10: Master downshift counter */
10241-#define PHY_M_EC_S_DSC_MSK (3<<8) /* Bit 9.. 8: Slave downshift counter */
10242+#define PHY_M_EC_ENA_BC_EXT BIT_15S /* Enable Block Carr. Ext. (88E1111 only) */
10243+#define PHY_M_EC_ENA_LIN_LB BIT_14S /* Enable Line Loopback (88E1111 only) */
10244+ /* Bit 13: reserved */
10245+#define PHY_M_EC_DIS_LINK_P BIT_12S /* Disable Link Pulses (88E1111 only) */
10246+#define PHY_M_EC_M_DSC_MSK (3<<10) /* Bit 11..10: Master Downshift Counter */
10247+ /* (88E1040 Rev.C0 only) */
10248+#define PHY_M_EC_S_DSC_MSK (3<<8) /* Bit 9.. 8: Slave Downshift Counter */
10249+ /* (88E1040 Rev.C0 only) */
10250+#define PHY_M_EC_DSC_MSK_2 (7<<9) /* Bit 11.. 9: Downshift Counter */
10251+ /* (88E1040 Rev.D0 and higher) */
10252+#define PHY_M_EC_DOWN_S_ENA BIT_8S /* Downshift Enable (88E1040 Rev.D0 and */
10253+ /* 88E1111 !!! Errata in spec. (1=dis.) */
10254+#define PHY_M_EC_RX_TIM_CT BIT_7S /* RGMII Rx Timing Control*/
10255 #define PHY_M_EC_MAC_S_MSK (7<<4) /* Bit 6.. 4: Def. MAC interface speed */
10256-#define PHY_M_EC_FIB_AN_ENA (1<<3) /* Bit 3: Fiber Auto-Neg. Enable */
10257-
10258-#define PHY_M_EC_M_DSC(x) SHIFT10(x) /* 00=1x; 01=2x; 10=3x; 11=4x */
10259-#define PHY_M_EC_S_DSC(x) SHIFT8(x) /* 00=dis; 01=1x; 10=2x; 11=3x */
10260-#define PHY_M_EC_MAC_S(x) SHIFT4(x) /* 01X=0; 110=2.5; 111=25 (MHz) */
10261-
10262+#define PHY_M_EC_FIB_AN_ENA BIT_3S /* Fiber Auto-Neg. Enable 88E1040S only) */
10263+#define PHY_M_EC_DTE_D_ENA BIT_2S /* DTE Detect Enable (88E1111 only) */
10264+#define PHY_M_EC_TX_TIM_CT BIT_1S /* RGMII Tx Timing Control */
10265+#define PHY_M_EC_TRANS_DIS BIT_0S /* Transmitter Disable (88E1111 only) */
10266+
10267+#define PHY_M_EC_M_DSC(x) (SHIFT10(x) & PHY_M_EC_M_DSC_MSK)
10268+ /* 00=1x; 01=2x; 10=3x; 11=4x */
10269+#define PHY_M_EC_S_DSC(x) (SHIFT8(x) & PHY_M_EC_S_DSC_MSK)
10270+ /* 00=dis; 01=1x; 10=2x; 11=3x */
10271+#define PHY_M_EC_MAC_S(x) (SHIFT4(x) & PHY_M_EC_MAC_S_MSK)
10272+ /* 01X=0; 110=2.5; 111=25 (MHz) */
10273+
10274+#define PHY_M_EC_DSC_2(x) (SHIFT9(x) & PHY_M_EC_DSC_MSK_2)
10275+ /* 000=1x; 001=2x; 010=3x; 011=4x */
10276+ /* 100=5x; 101=6x; 110=7x; 111=8x */
10277 #define MAC_TX_CLK_0_MHZ 2
10278 #define MAC_TX_CLK_2_5_MHZ 6
10279 #define MAC_TX_CLK_25_MHZ 7
10280
10281 /***** PHY_MARV_LED_CTRL 16 bit r/w LED Control Reg *****/
10282-#define PHY_M_LEDC_DIS_LED (1<<15) /* Bit 15: Disable LED */
10283-#define PHY_M_LEDC_PULS_MSK (7<<12) /* Bit 14..12: Pulse Stretch Mask */
10284-#define PHY_M_LEDC_F_INT (1<<11) /* Bit 11: Force Interrupt */
10285-#define PHY_M_LEDC_BL_R_MSK (7<<8) /* Bit 10.. 8: Blink Rate Mask */
10286- /* Bit 7.. 5: reserved */
10287-#define PHY_M_LEDC_LINK_MSK (3<<3) /* Bit 4.. 3: Link Control Mask */
10288-#define PHY_M_LEDC_DP_CTRL (1<<2) /* Bit 2: Duplex Control */
10289-#define PHY_M_LEDC_RX_CTRL (1<<1) /* Bit 1: Rx activity / Link */
10290-#define PHY_M_LEDC_TX_CTRL (1<<0) /* Bit 0: Tx activity / Link */
10291+#define PHY_M_LEDC_DIS_LED BIT_15S /* Disable LED */
10292+#define PHY_M_LEDC_PULS_MSK (7<<12) /* Bit 14..12: Pulse Stretch Mask */
10293+#define PHY_M_LEDC_F_INT BIT_11S /* Force Interrupt */
10294+#define PHY_M_LEDC_BL_R_MSK (7<<8) /* Bit 10.. 8: Blink Rate Mask */
10295+#define PHY_M_LEDC_DP_C_LSB BIT_7S /* Duplex Control (LSB, 88E1111 only) */
10296+#define PHY_M_LEDC_TX_C_LSB BIT_6S /* Tx Control (LSB, 88E1111 only) */
10297+#define PHY_M_LEDC_LK_C_MSK (7<<3) /* Bit 5.. 3: Link Control Mask */
10298+ /* (88E1111 only) */
10299+ /* Bit 7.. 5: reserved (88E1040 only) */
10300+#define PHY_M_LEDC_LINK_MSK (3<<3) /* Bit 4.. 3: Link Control Mask */
10301+ /* (88E1040 only) */
10302+#define PHY_M_LEDC_DP_CTRL BIT_2S /* Duplex Control */
10303+#define PHY_M_LEDC_DP_C_MSB BIT_2S /* Duplex Control (MSB, 88E1111 only) */
10304+#define PHY_M_LEDC_RX_CTRL BIT_1S /* Rx Activity / Link */
10305+#define PHY_M_LEDC_TX_CTRL BIT_0S /* Tx Activity / Link */
10306+#define PHY_M_LEDC_TX_C_MSB BIT_0S /* Tx Control (MSB, 88E1111 only) */
10307
10308-#define PHY_M_LED_PULS_DUR(x) SHIFT12(x) /* Pulse Stretch Duration */
10309+#define PHY_M_LED_PULS_DUR(x) (SHIFT12(x) & PHY_M_LEDC_PULS_MSK)
10310
10311-#define PULS_NO_STR 0 /* no pulse stretching */
10312-#define PULS_21MS 1 /* 21 ms to 42 ms */
10313+#define PULS_NO_STR 0 /* no pulse stretching */
10314+#define PULS_21MS 1 /* 21 ms to 42 ms */
10315 #define PULS_42MS 2 /* 42 ms to 84 ms */
10316 #define PULS_84MS 3 /* 84 ms to 170 ms */
10317 #define PULS_170MS 4 /* 170 ms to 340 ms */
10318@@ -1217,7 +1300,7 @@
10319 #define PULS_670MS 6 /* 670 ms to 1.3 s */
10320 #define PULS_1300MS 7 /* 1.3 s to 2.7 s */
10321
10322-#define PHY_M_LED_BLINK_RT(x) SHIFT8(x) /* Blink Rate */
10323+#define PHY_M_LED_BLINK_RT(x) (SHIFT8(x) & PHY_M_LEDC_BL_R_MSK)
10324
10325 #define BLINK_42MS 0 /* 42 ms */
10326 #define BLINK_84MS 1 /* 84 ms */
10327@@ -1227,6 +1310,8 @@
10328 /* values 5 - 7: reserved */
10329
10330 /***** PHY_MARV_LED_OVER 16 bit r/w Manual LED Override Reg *****/
10331+#define PHY_M_LED_MO_SGMII(x) SHIFT14(x) /* Bit 15..14: SGMII AN Timer */
10332+ /* Bit 13..12: reserved */
10333 #define PHY_M_LED_MO_DUP(x) SHIFT10(x) /* Bit 11..10: Duplex */
10334 #define PHY_M_LED_MO_10(x) SHIFT8(x) /* Bit 9.. 8: Link 10 */
10335 #define PHY_M_LED_MO_100(x) SHIFT6(x) /* Bit 7.. 6: Link 100 */
10336@@ -1240,30 +1325,35 @@
10337 #define MO_LED_ON 3
10338
10339 /***** PHY_MARV_EXT_CTRL_2 16 bit r/w Ext. PHY Specific Ctrl 2 *****/
10340- /* Bit 15.. 7: reserved */
10341-#define PHY_M_EC2_FI_IMPED (1<<6) /* Bit 6: Fiber Input Impedance */
10342-#define PHY_M_EC2_FO_IMPED (1<<5) /* Bit 5: Fiber Output Impedance */
10343-#define PHY_M_EC2_FO_M_CLK (1<<4) /* Bit 4: Fiber Mode Clock Enable */
10344-#define PHY_M_EC2_FO_BOOST (1<<3) /* Bit 3: Fiber Output Boost */
10345+ /* Bit 15.. 7: reserved */
10346+#define PHY_M_EC2_FI_IMPED BIT_6S /* Fiber Input Impedance */
10347+#define PHY_M_EC2_FO_IMPED BIT_5S /* Fiber Output Impedance */
10348+#define PHY_M_EC2_FO_M_CLK BIT_4S /* Fiber Mode Clock Enable */
10349+#define PHY_M_EC2_FO_BOOST BIT_3S /* Fiber Output Boost */
10350 #define PHY_M_EC2_FO_AM_MSK 7 /* Bit 2.. 0: Fiber Output Amplitude */
10351
10352-/***** PHY_MARV_EXT_P_STAT 16 bit r/w Ext. PHY Specific Status *****/
10353-#define PHY_M_FC_AUTO_SEL (1<<15) /* Bit 15: Fiber/Copper Auto Sel. dis. */
10354-#define PHY_M_FC_AN_REG_ACC (1<<14) /* Bit 14: Fiber/Copper Autoneg. reg acc */
10355-#define PHY_M_FC_RESULUTION (1<<13) /* Bit 13: Fiber/Copper Resulution */
10356-#define PHY_M_SER_IF_AN_BP (1<<12) /* Bit 12: Ser IF autoneg. bypass enable */
10357-#define PHY_M_SER_IF_BP_ST (1<<11) /* Bit 11: Ser IF autoneg. bypass status */
10358-#define PHY_M_IRQ_POLARITY (1<<10) /* Bit 10: IRQ polarity */
10359- /* Bit 9..4: reserved */
10360-#define PHY_M_UNDOC1 (1<< 7) /* undocumented bit !! */
10361-#define PHY_M_MODE_MASK (0xf<<0)/* Bit 3..0: copy of HWCFG MODE[3:0] */
10362-
10363+/***** PHY_MARV_EXT_P_STAT 16 bit r/w Ext. PHY Specific Status *****/
10364+#define PHY_M_FC_AUTO_SEL BIT_15S /* Fiber/Copper Auto Sel. Dis. */
10365+#define PHY_M_FC_AN_REG_ACC BIT_14S /* Fiber/Copper AN Reg. Access */
10366+#define PHY_M_FC_RESOLUTION BIT_13S /* Fiber/Copper Resolution */
10367+#define PHY_M_SER_IF_AN_BP BIT_12S /* Ser. IF AN Bypass Enable */
10368+#define PHY_M_SER_IF_BP_ST BIT_11S /* Ser. IF AN Bypass Status */
10369+#define PHY_M_IRQ_POLARITY BIT_10S /* IRQ polarity */
10370+#define PHY_M_DIS_AUT_MED BIT_9S /* Disable Aut. Medium Reg. Selection */
10371+ /* (88E1111 only) */
10372+ /* Bit 9.. 4: reserved (88E1040 only) */
10373+#define PHY_M_UNDOC1 BIT_7S /* undocumented bit !! */
10374+#define PHY_M_DTE_POW_STAT BIT_4S /* DTE Power Status (88E1111 only) */
10375+#define PHY_M_MODE_MASK 0xf /* Bit 3.. 0: copy of HWCFG MODE[3:0] */
10376
10377 /***** PHY_MARV_CABLE_DIAG 16 bit r/o Cable Diagnostic Reg *****/
10378-#define PHY_M_CABD_ENA_TEST (1<<15) /* Bit 15: Enable Test */
10379-#define PHY_M_CABD_STAT_MSK (3<<13) /* Bit 14..13: Status */
10380- /* Bit 12.. 8: reserved */
10381-#define PHY_M_CABD_DIST_MSK 0xff /* Bit 7.. 0: Distance */
10382+#define PHY_M_CABD_ENA_TEST BIT_15S /* Enable Test (Page 0) */
10383+#define PHY_M_CABD_DIS_WAIT BIT_15S /* Disable Waiting Period (Page 1) */
10384+ /* (88E1111 only) */
10385+#define PHY_M_CABD_STAT_MSK (3<<13) /* Bit 14..13: Status Mask */
10386+#define PHY_M_CABD_AMPL_MSK (0x1f<<8) /* Bit 12.. 8: Amplitude Mask */
10387+ /* (88E1111 only) */
10388+#define PHY_M_CABD_DIST_MSK 0xff /* Bit 7.. 0: Distance Mask */
10389
10390 /* values for Cable Diagnostic Status (11=fail; 00=OK; 10=open; 01=short) */
10391 #define CABD_STAT_NORMAL 0
10392@@ -1271,6 +1361,79 @@
10393 #define CABD_STAT_OPEN 2
10394 #define CABD_STAT_FAIL 3
10395
10396+/* for 10/100 Fast Ethernet PHY (88E3082 only) */
10397+/***** PHY_MARV_FE_LED_PAR 16 bit r/w LED Parallel Select Reg. *****/
10398+ /* Bit 15..12: reserved (used internally) */
10399+#define PHY_M_FELP_LED2_MSK (0xf<<8) /* Bit 11.. 8: LED2 Mask (LINK) */
10400+#define PHY_M_FELP_LED1_MSK (0xf<<4) /* Bit 7.. 4: LED1 Mask (ACT) */
10401+#define PHY_M_FELP_LED0_MSK 0xf /* Bit 3.. 0: LED0 Mask (SPEED) */
10402+
10403+#define PHY_M_FELP_LED2_CTRL(x) (SHIFT8(x) & PHY_M_FELP_LED2_MSK)
10404+#define PHY_M_FELP_LED1_CTRL(x) (SHIFT4(x) & PHY_M_FELP_LED1_MSK)
10405+#define PHY_M_FELP_LED0_CTRL(x) (SHIFT0(x) & PHY_M_FELP_LED0_MSK)
10406+
10407+#define LED_PAR_CTRL_COLX 0x00
10408+#define LED_PAR_CTRL_ERROR 0x01
10409+#define LED_PAR_CTRL_DUPLEX 0x02
10410+#define LED_PAR_CTRL_DP_COL 0x03
10411+#define LED_PAR_CTRL_SPEED 0x04
10412+#define LED_PAR_CTRL_LINK 0x05
10413+#define LED_PAR_CTRL_TX 0x06
10414+#define LED_PAR_CTRL_RX 0x07
10415+#define LED_PAR_CTRL_ACT 0x08
10416+#define LED_PAR_CTRL_LNK_RX 0x09
10417+#define LED_PAR_CTRL_LNK_AC 0x0a
10418+#define LED_PAR_CTRL_ACT_BL 0x0b
10419+#define LED_PAR_CTRL_TX_BL 0x0c
10420+#define LED_PAR_CTRL_RX_BL 0x0d
10421+#define LED_PAR_CTRL_COL_BL 0x0e
10422+#define LED_PAR_CTRL_INACT 0x0f
10423+
10424+/***** PHY_MARV_FE_SPEC_2 16 bit r/w Specific Control Reg. 2 *****/
10425+#define PHY_M_FESC_DIS_WAIT BIT_2S /* Disable TDR Waiting Period */
10426+#define PHY_M_FESC_ENA_MCLK BIT_1S /* Enable MAC Rx Clock in sleep mode */
10427+#define PHY_M_FESC_SEL_CL_A BIT_0S /* Select Class A driver (100B-TX) */
10428+
10429+/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */
10430+/***** PHY_MARV_PHY_CTRL (page 1) 16 bit r/w Fiber Specific Ctrl *****/
10431+#define PHY_M_FIB_FORCE_LNK BIT_10S /* Force Link Good */
10432+#define PHY_M_FIB_SIGD_POL BIT_9S /* SIGDET Polarity */
10433+#define PHY_M_FIB_TX_DIS BIT_3S /* Transmitter Disable */
10434+
10435+/***** PHY_MARV_PHY_CTRL (page 2) 16 bit r/w MAC Specific Ctrl *****/
10436+#define PHY_M_MAC_MD_MSK (7<<7) /* Bit 9.. 7: Mode Select Mask */
10437+#define PHY_M_MAC_GMIF_PUP BIT_3S /* GMII Power Up (88E1149 only) */
10438+
10439+#define PHY_M_MAC_MD_AUTO 3 /* Auto Copper/1000Base-X */
10440+#define PHY_M_MAC_MD_COPPER 5 /* Copper only */
10441+#define PHY_M_MAC_MD_1000BX 7 /* 1000Base-X only */
10442+#define PHY_M_MAC_MODE_SEL(x) (SHIFT7(x) & PHY_M_MAC_MD_MSK)
10443+
10444+/***** PHY_MARV_PHY_CTRL (page 3) 16 bit r/w LED Control Reg. *****/
10445+#define PHY_M_LEDC_LOS_MSK (0xf<<12) /* Bit 15..12: LOS LED Ctrl. Mask */
10446+#define PHY_M_LEDC_INIT_MSK (0xf<<8) /* Bit 11.. 8: INIT LED Ctrl. Mask */
10447+#define PHY_M_LEDC_STA1_MSK (0xf<<4) /* Bit 7.. 4: STAT1 LED Ctrl. Mask */
10448+#define PHY_M_LEDC_STA0_MSK 0xf /* Bit 3.. 0: STAT0 LED Ctrl. Mask */
10449+
10450+#define PHY_M_LEDC_LOS_CTRL(x) (SHIFT12(x) & PHY_M_LEDC_LOS_MSK)
10451+#define PHY_M_LEDC_INIT_CTRL(x) (SHIFT8(x) & PHY_M_LEDC_INIT_MSK)
10452+#define PHY_M_LEDC_STA1_CTRL(x) (SHIFT4(x) & PHY_M_LEDC_STA1_MSK)
10453+#define PHY_M_LEDC_STA0_CTRL(x) (SHIFT0(x) & PHY_M_LEDC_STA0_MSK)
10454+
10455+/***** PHY_MARV_PHY_STAT (page 3) 16 bit r/w Polarity Control Reg. *****/
10456+#define PHY_M_POLC_LS1M_MSK (0xf<<12) /* Bit 15..12: LOS,STAT1 Mix % Mask */
10457+#define PHY_M_POLC_IS0M_MSK (0xf<<8) /* Bit 11.. 8: INIT,STAT0 Mix % Mask */
10458+#define PHY_M_POLC_LOS_MSK (0x3<<6) /* Bit 7.. 6: LOS Pol. Ctrl. Mask */
10459+#define PHY_M_POLC_INIT_MSK (0x3<<4) /* Bit 5.. 4: INIT Pol. Ctrl. Mask */
10460+#define PHY_M_POLC_STA1_MSK (0x3<<2) /* Bit 3.. 2: STAT1 Pol. Ctrl. Mask */
10461+#define PHY_M_POLC_STA0_MSK 0x3 /* Bit 1.. 0: STAT0 Pol. Ctrl. Mask */
10462+
10463+#define PHY_M_POLC_LS1_P_MIX(x) (SHIFT12(x) & PHY_M_POLC_LS1M_MSK)
10464+#define PHY_M_POLC_IS0_P_MIX(x) (SHIFT8(x) & PHY_M_POLC_IS0M_MSK)
10465+#define PHY_M_POLC_LOS_CTRL(x) (SHIFT6(x) & PHY_M_POLC_LOS_MSK)
10466+#define PHY_M_POLC_INIT_CTRL(x) (SHIFT4(x) & PHY_M_POLC_INIT_MSK)
10467+#define PHY_M_POLC_STA1_CTRL(x) (SHIFT2(x) & PHY_M_POLC_STA1_MSK)
10468+#define PHY_M_POLC_STA0_CTRL(x) (SHIFT0(x) & PHY_M_POLC_STA0_MSK)
10469
10470 /*
10471 * GMAC registers
10472@@ -1431,141 +1594,159 @@
10473 */
10474
10475 /* GM_GP_STAT 16 bit r/o General Purpose Status Register */
10476-#define GM_GPSR_SPEED (1<<15) /* Bit 15: Port Speed (1 = 100 Mbps) */
10477-#define GM_GPSR_DUPLEX (1<<14) /* Bit 14: Duplex Mode (1 = Full) */
10478-#define GM_GPSR_FC_TX_DIS (1<<13) /* Bit 13: Tx Flow-Control Mode Disabled */
10479-#define GM_GPSR_LINK_UP (1<<12) /* Bit 12: Link Up Status */
10480-#define GM_GPSR_PAUSE (1<<11) /* Bit 11: Pause State */
10481-#define GM_GPSR_TX_ACTIVE (1<<10) /* Bit 10: Tx in Progress */
10482-#define GM_GPSR_EXC_COL (1<<9) /* Bit 9: Excessive Collisions Occured */
10483-#define GM_GPSR_LAT_COL (1<<8) /* Bit 8: Late Collisions Occured */
10484- /* Bit 7..6: reserved */
10485-#define GM_GPSR_PHY_ST_CH (1<<5) /* Bit 5: PHY Status Change */
10486-#define GM_GPSR_GIG_SPEED (1<<4) /* Bit 4: Gigabit Speed (1 = 1000 Mbps) */
10487-#define GM_GPSR_PART_MODE (1<<3) /* Bit 3: Partition mode */
10488-#define GM_GPSR_FC_RX_DIS (1<<2) /* Bit 2: Rx Flow-Control Mode Disabled */
10489-#define GM_GPSR_PROM_EN (1<<1) /* Bit 1: Promiscuous Mode Enabled */
10490- /* Bit 0: reserved */
10491-
10492+#define GM_GPSR_SPEED BIT_15S /* Port Speed (1 = 100 Mbps) */
10493+#define GM_GPSR_DUPLEX BIT_14S /* Duplex Mode (1 = Full) */
10494+#define GM_GPSR_FC_TX_DIS BIT_13S /* Tx Flow-Control Mode Disabled */
10495+#define GM_GPSR_LINK_UP BIT_12S /* Link Up Status */
10496+#define GM_GPSR_PAUSE BIT_11S /* Pause State */
10497+#define GM_GPSR_TX_ACTIVE BIT_10S /* Tx in Progress */
10498+#define GM_GPSR_EXC_COL BIT_9S /* Excessive Collisions Occured */
10499+#define GM_GPSR_LAT_COL BIT_8S /* Late Collisions Occured */
10500+ /* Bit 7.. 6: reserved */
10501+#define GM_GPSR_PHY_ST_CH BIT_5S /* PHY Status Change */
10502+#define GM_GPSR_GIG_SPEED BIT_4S /* Gigabit Speed (1 = 1000 Mbps) */
10503+#define GM_GPSR_PART_MODE BIT_3S /* Partition mode */
10504+#define GM_GPSR_FC_RX_DIS BIT_2S /* Rx Flow-Control Mode Disabled */
10505+ /* Bit 2.. 0: reserved */
10506+
10507 /* GM_GP_CTRL 16 bit r/w General Purpose Control Register */
10508- /* Bit 15: reserved */
10509-#define GM_GPCR_PROM_ENA (1<<14) /* Bit 14: Enable Promiscuous Mode */
10510-#define GM_GPCR_FC_TX_DIS (1<<13) /* Bit 13: Disable Tx Flow-Control Mode */
10511-#define GM_GPCR_TX_ENA (1<<12) /* Bit 12: Enable Transmit */
10512-#define GM_GPCR_RX_ENA (1<<11) /* Bit 11: Enable Receive */
10513-#define GM_GPCR_BURST_ENA (1<<10) /* Bit 10: Enable Burst Mode */
10514-#define GM_GPCR_LOOP_ENA (1<<9) /* Bit 9: Enable MAC Loopback Mode */
10515-#define GM_GPCR_PART_ENA (1<<8) /* Bit 8: Enable Partition Mode */
10516-#define GM_GPCR_GIGS_ENA (1<<7) /* Bit 7: Gigabit Speed (1000 Mbps) */
10517-#define GM_GPCR_FL_PASS (1<<6) /* Bit 6: Force Link Pass */
10518-#define GM_GPCR_DUP_FULL (1<<5) /* Bit 5: Full Duplex Mode */
10519-#define GM_GPCR_FC_RX_DIS (1<<4) /* Bit 4: Disable Rx Flow-Control Mode */
10520-#define GM_GPCR_SPEED_100 (1<<3) /* Bit 3: Port Speed 100 Mbps */
10521-#define GM_GPCR_AU_DUP_DIS (1<<2) /* Bit 2: Disable Auto-Update Duplex */
10522-#define GM_GPCR_AU_FCT_DIS (1<<1) /* Bit 1: Disable Auto-Update Flow-C. */
10523-#define GM_GPCR_AU_SPD_DIS (1<<0) /* Bit 0: Disable Auto-Update Speed */
10524+#define GM_GPCR_RMII_PH_ENA BIT_15S /* Enable RMII for PHY (Yukon-FE only) */
10525+#define GM_GPCR_RMII_LB_ENA BIT_14S /* Enable RMII Loopback (Yukon-FE only) */
10526+#define GM_GPCR_FC_TX_DIS BIT_13S /* Disable Tx Flow-Control Mode */
10527+#define GM_GPCR_TX_ENA BIT_12S /* Enable Transmit */
10528+#define GM_GPCR_RX_ENA BIT_11S /* Enable Receive */
10529+ /* Bit 10: reserved */
10530+#define GM_GPCR_LOOP_ENA BIT_9S /* Enable MAC Loopback Mode */
10531+#define GM_GPCR_PART_ENA BIT_8S /* Enable Partition Mode */
10532+#define GM_GPCR_GIGS_ENA BIT_7S /* Gigabit Speed (1000 Mbps) */
10533+#define GM_GPCR_FL_PASS BIT_6S /* Force Link Pass */
10534+#define GM_GPCR_DUP_FULL BIT_5S /* Full Duplex Mode */
10535+#define GM_GPCR_FC_RX_DIS BIT_4S /* Disable Rx Flow-Control Mode */
10536+#define GM_GPCR_SPEED_100 BIT_3S /* Port Speed 100 Mbps */
10537+#define GM_GPCR_AU_DUP_DIS BIT_2S /* Disable Auto-Update Duplex */
10538+#define GM_GPCR_AU_FCT_DIS BIT_1S /* Disable Auto-Update Flow-C. */
10539+#define GM_GPCR_AU_SPD_DIS BIT_0S /* Disable Auto-Update Speed */
10540
10541 #define GM_GPCR_SPEED_1000 (GM_GPCR_GIGS_ENA | GM_GPCR_SPEED_100)
10542 #define GM_GPCR_AU_ALL_DIS (GM_GPCR_AU_DUP_DIS | GM_GPCR_AU_FCT_DIS |\
10543 GM_GPCR_AU_SPD_DIS)
10544-
10545+
10546 /* GM_TX_CTRL 16 bit r/w Transmit Control Register */
10547-#define GM_TXCR_FORCE_JAM (1<<15) /* Bit 15: Force Jam / Flow-Control */
10548-#define GM_TXCR_CRC_DIS (1<<14) /* Bit 14: Disable insertion of CRC */
10549-#define GM_TXCR_PAD_DIS (1<<13) /* Bit 13: Disable padding of packets */
10550-#define GM_TXCR_COL_THR_MSK (1<<10) /* Bit 12..10: Collision Threshold */
10551+#define GM_TXCR_FORCE_JAM BIT_15S /* Force Jam / Flow-Control */
10552+#define GM_TXCR_CRC_DIS BIT_14S /* Disable insertion of CRC */
10553+#define GM_TXCR_PAD_DIS BIT_13S /* Disable padding of packets */
10554+#define GM_TXCR_COL_THR_MSK (7<<10) /* Bit 12..10: Collision Threshold Mask */
10555+ /* Bit 9.. 8: reserved */
10556+#define GM_TXCR_PAD_PAT_MSK 0xff /* Bit 7.. 0: Padding Pattern Mask */
10557+ /* (Yukon-2 only) */
10558
10559 #define TX_COL_THR(x) (SHIFT10(x) & GM_TXCR_COL_THR_MSK)
10560
10561 #define TX_COL_DEF 0x04
10562-
10563+
10564 /* GM_RX_CTRL 16 bit r/w Receive Control Register */
10565-#define GM_RXCR_UCF_ENA (1<<15) /* Bit 15: Enable Unicast filtering */
10566-#define GM_RXCR_MCF_ENA (1<<14) /* Bit 14: Enable Multicast filtering */
10567-#define GM_RXCR_CRC_DIS (1<<13) /* Bit 13: Remove 4-byte CRC */
10568-#define GM_RXCR_PASS_FC (1<<12) /* Bit 12: Pass FC packets to FIFO */
10569-
10570+#define GM_RXCR_UCF_ENA BIT_15S /* Enable Unicast filtering */
10571+#define GM_RXCR_MCF_ENA BIT_14S /* Enable Multicast filtering */
10572+#define GM_RXCR_CRC_DIS BIT_13S /* Remove 4-byte CRC */
10573+#define GM_RXCR_PASS_FC BIT_12S /* Pass FC packets to FIFO (Yukon-1 only) */
10574+ /* Bit 11.. 0: reserved */
10575+
10576 /* GM_TX_PARAM 16 bit r/w Transmit Parameter Register */
10577-#define GM_TXPA_JAMLEN_MSK (0x03<<14) /* Bit 15..14: Jam Length */
10578-#define GM_TXPA_JAMIPG_MSK (0x1f<<9) /* Bit 13..9: Jam IPG */
10579-#define GM_TXPA_JAMDAT_MSK (0x1f<<4) /* Bit 8..4: IPG Jam to Data */
10580- /* Bit 3..0: reserved */
10581+#define GM_TXPA_JAMLEN_MSK (3<<14) /* Bit 15..14: Jam Length Mask */
10582+#define GM_TXPA_JAMIPG_MSK (0x1f<<9) /* Bit 13.. 9: Jam IPG Mask */
10583+#define GM_TXPA_JAMDAT_MSK (0x1f<<4) /* Bit 8.. 4: IPG Jam to Data Mask */
10584+#define GM_TXPA_BO_LIM_MSK 0x0f /* Bit 3.. 0: Backoff Limit Mask */
10585+ /* (Yukon-2 only) */
10586
10587 #define TX_JAM_LEN_VAL(x) (SHIFT14(x) & GM_TXPA_JAMLEN_MSK)
10588 #define TX_JAM_IPG_VAL(x) (SHIFT9(x) & GM_TXPA_JAMIPG_MSK)
10589 #define TX_IPG_JAM_DATA(x) (SHIFT4(x) & GM_TXPA_JAMDAT_MSK)
10590+#define TX_BACK_OFF_LIM(x) ((x) & GM_TXPA_BO_LIM_MSK)
10591
10592 #define TX_JAM_LEN_DEF 0x03
10593 #define TX_JAM_IPG_DEF 0x0b
10594 #define TX_IPG_JAM_DEF 0x1c
10595+#define TX_BOF_LIM_DEF 0x04
10596
10597 /* GM_SERIAL_MODE 16 bit r/w Serial Mode Register */
10598-#define GM_SMOD_DATABL_MSK (0x1f<<11) /* Bit 15..11: Data Blinder (r/o) */
10599-#define GM_SMOD_LIMIT_4 (1<<10) /* Bit 10: 4 consecutive Tx trials */
10600-#define GM_SMOD_VLAN_ENA (1<<9) /* Bit 9: Enable VLAN (Max. Frame Len) */
10601-#define GM_SMOD_JUMBO_ENA (1<<8) /* Bit 8: Enable Jumbo (Max. Frame Len) */
10602- /* Bit 7..5: reserved */
10603-#define GM_SMOD_IPG_MSK 0x1f /* Bit 4..0: Inter-Packet Gap (IPG) */
10604-
10605+#define GM_SMOD_DATABL_MSK (0x1f<<11) /* Bit 15..11: Data Blinder */
10606+ /* r/o on Yukon, r/w on Yukon-EC */
10607+#define GM_SMOD_LIMIT_4 BIT_10S /* 4 consecutive Tx trials */
10608+#define GM_SMOD_VLAN_ENA BIT_9S /* Enable VLAN (Max. Frame Len) */
10609+#define GM_SMOD_JUMBO_ENA BIT_8S /* Enable Jumbo (Max. Frame Len) */
10610+ /* Bit 7.. 5: reserved */
10611+#define GM_SMOD_IPG_MSK 0x1f /* Bit 4.. 0: Inter-Packet Gap (IPG) */
10612+
10613 #define DATA_BLIND_VAL(x) (SHIFT11(x) & GM_SMOD_DATABL_MSK)
10614-#define DATA_BLIND_DEF 0x04
10615+#define IPG_DATA_VAL(x) ((x) & GM_SMOD_IPG_MSK)
10616
10617-#define IPG_DATA_VAL(x) (x & GM_SMOD_IPG_MSK)
10618+#define DATA_BLIND_DEF 0x04
10619 #define IPG_DATA_DEF 0x1e
10620
10621 /* GM_SMI_CTRL 16 bit r/w SMI Control Register */
10622 #define GM_SMI_CT_PHY_A_MSK (0x1f<<11) /* Bit 15..11: PHY Device Address */
10623 #define GM_SMI_CT_REG_A_MSK (0x1f<<6) /* Bit 10.. 6: PHY Register Address */
10624-#define GM_SMI_CT_OP_RD (1<<5) /* Bit 5: OpCode Read (0=Write)*/
10625-#define GM_SMI_CT_RD_VAL (1<<4) /* Bit 4: Read Valid (Read completed) */
10626-#define GM_SMI_CT_BUSY (1<<3) /* Bit 3: Busy (Operation in progress) */
10627- /* Bit 2..0: reserved */
10628-
10629+#define GM_SMI_CT_OP_RD BIT_5S /* OpCode Read (0=Write)*/
10630+#define GM_SMI_CT_RD_VAL BIT_4S /* Read Valid (Read completed) */
10631+#define GM_SMI_CT_BUSY BIT_3S /* Busy (Operation in progress) */
10632+ /* Bit 2.. 0: reserved */
10633+
10634 #define GM_SMI_CT_PHY_AD(x) (SHIFT11(x) & GM_SMI_CT_PHY_A_MSK)
10635 #define GM_SMI_CT_REG_AD(x) (SHIFT6(x) & GM_SMI_CT_REG_A_MSK)
10636
10637- /* GM_PHY_ADDR 16 bit r/w GPHY Address Register */
10638- /* Bit 15..6: reserved */
10639-#define GM_PAR_MIB_CLR (1<<5) /* Bit 5: Set MIB Clear Counter Mode */
10640-#define GM_PAR_MIB_TST (1<<4) /* Bit 4: MIB Load Counter (Test Mode) */
10641- /* Bit 3..0: reserved */
10642-
10643+/* GM_PHY_ADDR 16 bit r/w GPHY Address Register */
10644+ /* Bit 15.. 6: reserved */
10645+#define GM_PAR_MIB_CLR BIT_5S /* Set MIB Clear Counter Mode */
10646+#define GM_PAR_MIB_TST BIT_4S /* MIB Load Counter (Test Mode) */
10647+ /* Bit 3.. 0: reserved */
10648+
10649 /* Receive Frame Status Encoding */
10650-#define GMR_FS_LEN (0xffffUL<<16) /* Bit 31..16: Rx Frame Length */
10651+#define GMR_FS_LEN_MSK (0xffffUL<<16) /* Bit 31..16: Rx Frame Length */
10652 /* Bit 15..14: reserved */
10653-#define GMR_FS_VLAN (1L<<13) /* Bit 13: VLAN Packet */
10654-#define GMR_FS_JABBER (1L<<12) /* Bit 12: Jabber Packet */
10655-#define GMR_FS_UN_SIZE (1L<<11) /* Bit 11: Undersize Packet */
10656-#define GMR_FS_MC (1L<<10) /* Bit 10: Multicast Packet */
10657-#define GMR_FS_BC (1L<<9) /* Bit 9: Broadcast Packet */
10658-#define GMR_FS_RX_OK (1L<<8) /* Bit 8: Receive OK (Good Packet) */
10659-#define GMR_FS_GOOD_FC (1L<<7) /* Bit 7: Good Flow-Control Packet */
10660-#define GMR_FS_BAD_FC (1L<<6) /* Bit 6: Bad Flow-Control Packet */
10661-#define GMR_FS_MII_ERR (1L<<5) /* Bit 5: MII Error */
10662-#define GMR_FS_LONG_ERR (1L<<4) /* Bit 4: Too Long Packet */
10663-#define GMR_FS_FRAGMENT (1L<<3) /* Bit 3: Fragment */
10664+#define GMR_FS_VLAN BIT_13 /* VLAN Packet */
10665+#define GMR_FS_JABBER BIT_12 /* Jabber Packet */
10666+#define GMR_FS_UN_SIZE BIT_11 /* Undersize Packet */
10667+#define GMR_FS_MC BIT_10 /* Multicast Packet */
10668+#define GMR_FS_BC BIT_9 /* Broadcast Packet */
10669+#define GMR_FS_RX_OK BIT_8 /* Receive OK (Good Packet) */
10670+#define GMR_FS_GOOD_FC BIT_7 /* Good Flow-Control Packet */
10671+#define GMR_FS_BAD_FC BIT_6 /* Bad Flow-Control Packet */
10672+#define GMR_FS_MII_ERR BIT_5 /* MII Error */
10673+#define GMR_FS_LONG_ERR BIT_4 /* Too Long Packet */
10674+#define GMR_FS_FRAGMENT BIT_3 /* Fragment */
10675 /* Bit 2: reserved */
10676-#define GMR_FS_CRC_ERR (1L<<1) /* Bit 1: CRC Error */
10677-#define GMR_FS_RX_FF_OV (1L<<0) /* Bit 0: Rx FIFO Overflow */
10678+#define GMR_FS_CRC_ERR BIT_1 /* CRC Error */
10679+#define GMR_FS_RX_FF_OV BIT_0 /* Rx FIFO Overflow */
10680+
10681+#define GMR_FS_LEN_SHIFT 16
10682
10683 /*
10684 * GMR_FS_ANY_ERR (analogous to XMR_FS_ANY_ERR)
10685 */
10686-#define GMR_FS_ANY_ERR (GMR_FS_CRC_ERR | \
10687- GMR_FS_LONG_ERR | \
10688+#ifdef SK_DIAG
10689+#define GMR_FS_ANY_ERR ( \
10690+ GMR_FS_RX_FF_OV | \
10691+ GMR_FS_CRC_ERR | \
10692+ GMR_FS_FRAGMENT | \
10693 GMR_FS_MII_ERR | \
10694 GMR_FS_BAD_FC | \
10695 GMR_FS_GOOD_FC | \
10696 GMR_FS_JABBER)
10697-
10698-/* Rx GMAC FIFO Flush Mask (default) */
10699-#define RX_FF_FL_DEF_MSK (GMR_FS_CRC_ERR | \
10700+#else
10701+#define GMR_FS_ANY_ERR ( \
10702 GMR_FS_RX_FF_OV | \
10703+ GMR_FS_CRC_ERR | \
10704+ GMR_FS_FRAGMENT | \
10705+ GMR_FS_LONG_ERR | \
10706 GMR_FS_MII_ERR | \
10707 GMR_FS_BAD_FC | \
10708 GMR_FS_GOOD_FC | \
10709 GMR_FS_UN_SIZE | \
10710 GMR_FS_JABBER)
10711+#endif
10712+
10713+/* Rx GMAC FIFO Flush Mask (default) */
10714+#define RX_FF_FL_DEF_MSK GMR_FS_ANY_ERR
10715
10716 /* typedefs *******************************************************************/
10717
10718@@ -1577,3 +1758,4 @@
10719 #endif /* __cplusplus */
10720
10721 #endif /* __INC_XMAC_H */
10722+
10723diff -ruN linux/drivers/net/sk98lin/skaddr.c linux-new/drivers/net/sk98lin/skaddr.c
10724--- linux/drivers/net/sk98lin/skaddr.c 2006-04-11 19:19:28.000000000 +0200
10725+++ linux-new/drivers/net/sk98lin/skaddr.c 2006-01-18 14:37:24.000000000 +0100
10726@@ -2,8 +2,8 @@
10727 *
10728 * Name: skaddr.c
10729 * Project: Gigabit Ethernet Adapters, ADDR-Module
10730- * Version: $Revision$
10731- * Date: $Date$
10732+ * Version: $Revision$
10733+ * Date: $Date$
10734 * Purpose: Manage Addresses (Multicast and Unicast) and Promiscuous Mode.
10735 *
10736 ******************************************************************************/
10737@@ -11,7 +11,7 @@
10738 /******************************************************************************
10739 *
10740 * (C)Copyright 1998-2002 SysKonnect GmbH.
10741- * (C)Copyright 2002-2003 Marvell.
10742+ * (C)Copyright 2002-2005 Marvell.
10743 *
10744 * This program is free software; you can redistribute it and/or modify
10745 * it under the terms of the GNU General Public License as published by
10746@@ -44,7 +44,7 @@
10747
10748 #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
10749 static const char SysKonnectFileId[] =
10750- "@(#) $Id$ (C) Marvell.";
10751+ "@(#) $Id$ (C) Marvell.";
10752 #endif /* DEBUG ||!LINT || !SK_SLIM */
10753
10754 #define __SKADDR_C
10755@@ -58,11 +58,10 @@
10756
10757 /* defines ********************************************************************/
10758
10759-
10760 #define XMAC_POLY 0xEDB88320UL /* CRC32-Poly - XMAC: Little Endian */
10761 #define GMAC_POLY 0x04C11DB7L /* CRC16-Poly - GMAC: Little Endian */
10762 #define HASH_BITS 6 /* #bits in hash */
10763-#define SK_MC_BIT 0x01
10764+#define SK_MC_BIT 0x01
10765
10766 /* Error numbers and messages. */
10767
10768@@ -79,7 +78,7 @@
10769
10770 /* 64-bit hash values with all bits set. */
10771
10772-static const SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
10773+SK_U16 OnesHash[4] = {0xffff, 0xffff, 0xffff, 0xffff};
10774
10775 /* local variables ************************************************************/
10776
10777@@ -136,13 +135,12 @@
10778
10779 switch (Level) {
10780 case SK_INIT_DATA:
10781- SK_MEMSET((char *) &pAC->Addr, (SK_U8) 0,
10782- (SK_U16) sizeof(SK_ADDR));
10783+ SK_MEMSET((char *)&pAC->Addr, (SK_U8)0, (SK_U16)sizeof(SK_ADDR));
10784
10785 for (i = 0; i < SK_MAX_MACS; i++) {
10786 pAPort = &pAC->Addr.Port[i];
10787 pAPort->PromMode = SK_PROM_MODE_NONE;
10788-
10789+
10790 pAPort->FirstExactMatchRlmt = SK_ADDR_FIRST_MATCH_RLMT;
10791 pAPort->FirstExactMatchDrv = SK_ADDR_FIRST_MATCH_DRV;
10792 pAPort->NextExactMatchRlmt = SK_ADDR_FIRST_MATCH_RLMT;
10793@@ -159,7 +157,7 @@
10794 /* pAC->Addr.InitDone = SK_INIT_DATA; */
10795 break;
10796
10797- case SK_INIT_IO:
10798+ case SK_INIT_IO:
10799 #ifndef SK_NO_RLMT
10800 for (i = 0; i < SK_MAX_NETS; i++) {
10801 pAC->Addr.Net[i].ActivePort = pAC->Rlmt.Net[i].ActivePort;
10802@@ -173,7 +171,7 @@
10803 }
10804 }
10805 #endif /* DEBUG */
10806-
10807+
10808 /* Read permanent logical MAC address from Control Register File. */
10809 for (j = 0; j < SK_MAC_ADDR_LEN; j++) {
10810 InAddr = (SK_U8 *) &pAC->Addr.Net[0].PermanentMacAddress.a[j];
10811@@ -191,11 +189,11 @@
10812 pAC->Addr.Port[pAC->Addr.Net[0].ActivePort].Exact[0] =
10813 pAC->Addr.Net[0].CurrentMacAddress;
10814 #if SK_MAX_NETS > 1
10815- /* Set logical MAC address for net 2 to (log | 3). */
10816+ /* Set logical MAC address for net 2 to. */
10817 if (!pAC->Addr.Net[1].CurrentMacAddressSet) {
10818 pAC->Addr.Net[1].PermanentMacAddress =
10819 pAC->Addr.Net[0].PermanentMacAddress;
10820- pAC->Addr.Net[1].PermanentMacAddress.a[5] |= 3;
10821+ pAC->Addr.Net[1].PermanentMacAddress.a[5] += 1;
10822 /* Set the current logical MAC address to the permanent one. */
10823 pAC->Addr.Net[1].CurrentMacAddress =
10824 pAC->Addr.Net[1].PermanentMacAddress;
10825@@ -213,8 +211,8 @@
10826 pAC->Addr.Net[i].PermanentMacAddress.a[2],
10827 pAC->Addr.Net[i].PermanentMacAddress.a[3],
10828 pAC->Addr.Net[i].PermanentMacAddress.a[4],
10829- pAC->Addr.Net[i].PermanentMacAddress.a[5]))
10830-
10831+ pAC->Addr.Net[i].PermanentMacAddress.a[5]));
10832+
10833 SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_INIT,
10834 ("Logical MAC Address (Net%d): %02X %02X %02X %02X %02X %02X\n",
10835 i,
10836@@ -223,7 +221,7 @@
10837 pAC->Addr.Net[i].CurrentMacAddress.a[2],
10838 pAC->Addr.Net[i].CurrentMacAddress.a[3],
10839 pAC->Addr.Net[i].CurrentMacAddress.a[4],
10840- pAC->Addr.Net[i].CurrentMacAddress.a[5]))
10841+ pAC->Addr.Net[i].CurrentMacAddress.a[5]));
10842 }
10843 #endif /* DEBUG */
10844
10845@@ -266,8 +264,8 @@
10846 pAPort->PermanentMacAddress.a[2],
10847 pAPort->PermanentMacAddress.a[3],
10848 pAPort->PermanentMacAddress.a[4],
10849- pAPort->PermanentMacAddress.a[5]))
10850-
10851+ pAPort->PermanentMacAddress.a[5]));
10852+
10853 SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_INIT,
10854 ("SkAddrInit: Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",
10855 pAPort->CurrentMacAddress.a[0],
10856@@ -275,7 +273,7 @@
10857 pAPort->CurrentMacAddress.a[2],
10858 pAPort->CurrentMacAddress.a[3],
10859 pAPort->CurrentMacAddress.a[4],
10860- pAPort->CurrentMacAddress.a[5]))
10861+ pAPort->CurrentMacAddress.a[5]));
10862 #endif /* DEBUG */
10863 }
10864 /* pAC->Addr.InitDone = SK_INIT_IO; */
10865@@ -299,7 +297,7 @@
10866 }
10867
10868 return (SK_ADDR_SUCCESS);
10869-
10870+
10871 } /* SkAddrInit */
10872
10873 #ifndef SK_SLIM
10874@@ -333,16 +331,20 @@
10875 int Flags) /* permanent/non-perm, sw-only */
10876 {
10877 int ReturnCode;
10878-
10879+
10880 if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {
10881 return (SK_ADDR_ILLEGAL_PORT);
10882 }
10883-
10884+
10885 if (pAC->GIni.GIGenesis) {
10886+#ifdef GENESIS
10887 ReturnCode = SkAddrXmacMcClear(pAC, IoC, PortNumber, Flags);
10888+#endif
10889 }
10890 else {
10891+#ifdef YUKON
10892 ReturnCode = SkAddrGmacMcClear(pAC, IoC, PortNumber, Flags);
10893+#endif
10894 }
10895
10896 return (ReturnCode);
10897@@ -352,7 +354,7 @@
10898 #endif /* !SK_SLIM */
10899
10900 #ifndef SK_SLIM
10901-
10902+#ifdef GENESIS
10903 /******************************************************************************
10904 *
10905 * SkAddrXmacMcClear - clear the multicast table
10906@@ -402,13 +404,13 @@
10907 }
10908
10909 return (SK_ADDR_SUCCESS);
10910-
10911-} /* SkAddrXmacMcClear */
10912
10913+} /* SkAddrXmacMcClear */
10914+#endif /* GENESIS */
10915 #endif /* !SK_SLIM */
10916
10917 #ifndef SK_SLIM
10918-
10919+#ifdef YUKON
10920 /******************************************************************************
10921 *
10922 * SkAddrGmacMcClear - clear the multicast table
10923@@ -447,38 +449,37 @@
10924 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[4],
10925 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[5],
10926 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[6],
10927- pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7]))
10928+ pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7]));
10929 #endif /* DEBUG */
10930
10931 /* Clear InexactFilter */
10932 for (i = 0; i < 8; i++) {
10933 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] = 0;
10934 }
10935-
10936+
10937 if (Flags & SK_ADDR_PERMANENT) { /* permanent => RLMT */
10938-
10939+
10940 /* Copy DRV bits to InexactFilter. */
10941 for (i = 0; i < 8; i++) {
10942 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |=
10943 pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i];
10944-
10945+
10946 /* Clear InexactRlmtFilter. */
10947 pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i] = 0;
10948-
10949- }
10950+ }
10951 }
10952 else { /* not permanent => DRV */
10953-
10954+
10955 /* Copy RLMT bits to InexactFilter. */
10956 for (i = 0; i < 8; i++) {
10957 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |=
10958 pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i];
10959-
10960+
10961 /* Clear InexactDrvFilter. */
10962 pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i] = 0;
10963 }
10964 }
10965-
10966+
10967 #ifdef DEBUG
10968 SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
10969 ("GMAC InexactFilter (cleared): %02X %02X %02X %02X %02X %02X %02X %02X\n",
10970@@ -489,19 +490,20 @@
10971 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[4],
10972 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[5],
10973 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[6],
10974- pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7]))
10975+ pAC->Addr.Port[PortNumber].InexactFilter.Bytes[7]));
10976 #endif /* DEBUG */
10977-
10978+
10979 if (!(Flags & SK_MC_SW_ONLY)) {
10980 (void) SkAddrGmacMcUpdate(pAC, IoC, PortNumber);
10981 }
10982-
10983+
10984 return (SK_ADDR_SUCCESS);
10985
10986 } /* SkAddrGmacMcClear */
10987+#endif /* YUKON */
10988
10989 #ifndef SK_ADDR_CHEAT
10990-
10991+#ifdef GENESIS
10992 /******************************************************************************
10993 *
10994 * SkXmacMcHash - hash multicast address
10995@@ -538,8 +540,9 @@
10996 return (Crc & ((1 << HASH_BITS) - 1));
10997
10998 } /* SkXmacMcHash */
10999+#endif /* GENESIS */
11000
11001-
11002+#ifdef YUKON
11003 /******************************************************************************
11004 *
11005 * SkGmacMcHash - hash multicast address
11006@@ -570,7 +573,7 @@
11007 for (Byte = 0; Byte < 6; Byte++) {
11008 /* Get next byte. */
11009 Data = (SK_U32) pMc[Byte];
11010-
11011+
11012 /* Change bit order in byte. */
11013 TmpData = Data;
11014 for (Bit = 0; Bit < 8; Bit++) {
11015@@ -582,7 +585,7 @@
11016 }
11017 TmpData >>= 1;
11018 }
11019-
11020+
11021 Crc ^= (Data << 24);
11022 for (Bit = 0; Bit < 8; Bit++) {
11023 if (Crc & 0x80000000) {
11024@@ -593,11 +596,11 @@
11025 }
11026 }
11027 }
11028-
11029+
11030 return (Crc & ((1 << HASH_BITS) - 1));
11031
11032 } /* SkGmacMcHash */
11033-
11034+#endif /* YUKON */
11035 #endif /* !SK_ADDR_CHEAT */
11036
11037 /******************************************************************************
11038@@ -632,23 +635,27 @@
11039 int Flags) /* permanent/non-permanent */
11040 {
11041 int ReturnCode;
11042-
11043+
11044 if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {
11045 return (SK_ADDR_ILLEGAL_PORT);
11046 }
11047-
11048+
11049 if (pAC->GIni.GIGenesis) {
11050+#ifdef GENESIS
11051 ReturnCode = SkAddrXmacMcAdd(pAC, IoC, PortNumber, pMc, Flags);
11052+#endif
11053 }
11054 else {
11055+#ifdef YUKON
11056 ReturnCode = SkAddrGmacMcAdd(pAC, IoC, PortNumber, pMc, Flags);
11057+#endif
11058 }
11059
11060 return (ReturnCode);
11061
11062 } /* SkAddrMcAdd */
11063
11064-
11065+#ifdef GENESIS
11066 /******************************************************************************
11067 *
11068 * SkAddrXmacMcAdd - add a multicast address to a port
11069@@ -693,7 +700,7 @@
11070 return (SK_MC_RLMT_OVERFLOW);
11071 }
11072 #endif /* DEBUG */
11073-
11074+
11075 if (pAC->Addr.Port[PortNumber].NextExactMatchRlmt >
11076 SK_ADDR_LAST_MATCH_RLMT) {
11077 return (SK_MC_RLMT_OVERFLOW);
11078@@ -714,7 +721,7 @@
11079 return (SK_MC_RLMT_OVERFLOW);
11080 }
11081 #endif /* DEBUG */
11082-
11083+
11084 if (pAC->Addr.Port[PortNumber].NextExactMatchDrv <= SK_ADDR_LAST_MATCH_DRV) {
11085
11086 /* Set exact match entry. */
11087@@ -758,8 +765,9 @@
11088 }
11089
11090 } /* SkAddrXmacMcAdd */
11091+#endif /* GENESIS */
11092
11093-
11094+#ifdef YUKON
11095 /******************************************************************************
11096 *
11097 * SkAddrGmacMcAdd - add a multicast address to a port
11098@@ -789,28 +797,29 @@
11099 #ifndef SK_ADDR_CHEAT
11100 SK_U32 HashBit;
11101 #endif /* !defined(SK_ADDR_CHEAT) */
11102-
11103+
11104 if (!(pMc->a[0] & SK_MC_BIT)) {
11105 /* Hashing only possible with multicast addresses */
11106 return (SK_MC_ILLEGAL_ADDRESS);
11107 }
11108-
11109+
11110 #ifndef SK_ADDR_CHEAT
11111-
11112+
11113 /* Compute hash value of address. */
11114 HashBit = SkGmacMcHash(&pMc->a[0]);
11115-
11116+
11117 if (Flags & SK_ADDR_PERMANENT) { /* permanent => RLMT */
11118-
11119+
11120 /* Add bit to InexactRlmtFilter. */
11121 pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[HashBit / 8] |=
11122 1 << (HashBit % 8);
11123-
11124+
11125 /* Copy bit to InexactFilter. */
11126 for (i = 0; i < 8; i++) {
11127 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |=
11128 pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i];
11129 }
11130+
11131 #ifdef DEBUG
11132 SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11133 ("GMAC InexactRlmtFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n",
11134@@ -821,20 +830,21 @@
11135 pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[4],
11136 pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[5],
11137 pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[6],
11138- pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[7]))
11139+ pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[7]));
11140 #endif /* DEBUG */
11141 }
11142 else { /* not permanent => DRV */
11143-
11144+
11145 /* Add bit to InexactDrvFilter. */
11146 pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[HashBit / 8] |=
11147 1 << (HashBit % 8);
11148-
11149+
11150 /* Copy bit to InexactFilter. */
11151 for (i = 0; i < 8; i++) {
11152 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |=
11153 pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i];
11154 }
11155+
11156 #ifdef DEBUG
11157 SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11158 ("GMAC InexactDrvFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n",
11159@@ -845,22 +855,22 @@
11160 pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[4],
11161 pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[5],
11162 pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[6],
11163- pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[7]))
11164+ pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[7]));
11165 #endif /* DEBUG */
11166 }
11167-
11168+
11169 #else /* SK_ADDR_CHEAT */
11170-
11171+
11172 /* Set all bits in InexactFilter. */
11173 for (i = 0; i < 8; i++) {
11174 pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] = 0xFF;
11175 }
11176 #endif /* SK_ADDR_CHEAT */
11177-
11178+
11179 return (SK_MC_FILTERING_INEXACT);
11180-
11181-} /* SkAddrGmacMcAdd */
11182
11183+} /* SkAddrGmacMcAdd */
11184+#endif /* YUKON */
11185 #endif /* !SK_SLIM */
11186
11187 /******************************************************************************
11188@@ -892,7 +902,8 @@
11189 SK_IOC IoC, /* I/O context */
11190 SK_U32 PortNumber) /* Port Number */
11191 {
11192- int ReturnCode = 0;
11193+ int ReturnCode = SK_ADDR_ILLEGAL_PORT;
11194+
11195 #if (!defined(SK_SLIM) || defined(DEBUG))
11196 if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {
11197 return (SK_ADDR_ILLEGAL_PORT);
11198@@ -948,13 +959,13 @@
11199 SK_ADDR_PORT *pAPort;
11200
11201 SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11202- ("SkAddrXmacMcUpdate on Port %u.\n", PortNumber))
11203-
11204+ ("SkAddrXmacMcUpdate on Port %u.\n", PortNumber));
11205+
11206 pAPort = &pAC->Addr.Port[PortNumber];
11207
11208 #ifdef DEBUG
11209 SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11210- ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]))
11211+ ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]));
11212 #endif /* DEBUG */
11213
11214 /* Start with 0 to also program the logical MAC address. */
11215@@ -966,7 +977,7 @@
11216
11217 /* Clear other permanent exact match addresses on XMAC */
11218 if (pAPort->NextExactMatchRlmt <= SK_ADDR_LAST_MATCH_RLMT) {
11219-
11220+
11221 SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchRlmt,
11222 SK_ADDR_LAST_MATCH_RLMT);
11223 }
11224@@ -978,7 +989,7 @@
11225
11226 /* Clear other non-permanent exact match addresses on XMAC */
11227 if (pAPort->NextExactMatchDrv <= SK_ADDR_LAST_MATCH_DRV) {
11228-
11229+
11230 SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchDrv,
11231 SK_ADDR_LAST_MATCH_DRV);
11232 }
11233@@ -988,18 +999,18 @@
11234 }
11235
11236 if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) {
11237-
11238+
11239 /* Set all bits in 64-bit hash register. */
11240 XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash);
11241-
11242+
11243 /* Enable Hashing */
11244 SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);
11245 }
11246 else if (Inexact != 0) {
11247-
11248+
11249 /* Set 64-bit hash register to InexactFilter. */
11250 XM_OUTHASH(IoC, PortNumber, XM_HSM, &pAPort->InexactFilter.Bytes[0]);
11251-
11252+
11253 /* Enable Hashing */
11254 SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);
11255 }
11256@@ -1014,7 +1025,7 @@
11257
11258 /* Set port's current physical MAC address. */
11259 OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0];
11260-
11261+
11262 XM_OUTADDR(IoC, PortNumber, XM_SA, OutAddr);
11263
11264 #ifdef xDEBUG
11265@@ -1024,9 +1035,9 @@
11266
11267 /* Get exact match address i from port PortNumber. */
11268 InAddr = (SK_U16 *) &InAddr8[0];
11269-
11270+
11271 XM_INADDR(IoC, PortNumber, XM_EXM(i), InAddr);
11272-
11273+
11274 SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11275 ("SkAddrXmacMcUpdate: MC address %d on Port %u: ",
11276 "%02x %02x %02x %02x %02x %02x -- %02x %02x %02x %02x %02x %02x\n",
11277@@ -1043,7 +1054,7 @@
11278 pAPort->Exact[i].a[2],
11279 pAPort->Exact[i].a[3],
11280 pAPort->Exact[i].a[4],
11281- pAPort->Exact[i].a[5]))
11282+ pAPort->Exact[i].a[5]));
11283 }
11284 #endif /* DEBUG */
11285
11286@@ -1054,7 +1065,7 @@
11287 else {
11288 return (SK_MC_FILTERING_INEXACT);
11289 }
11290-
11291+
11292 } /* SkAddrXmacMcUpdate */
11293
11294 #endif /* GENESIS */
11295@@ -1095,37 +1106,37 @@
11296 SK_ADDR_PORT *pAPort;
11297
11298 SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11299- ("SkAddrGmacMcUpdate on Port %u.\n", PortNumber))
11300-
11301+ ("SkAddrGmacMcUpdate on Port %u.\n", PortNumber));
11302+
11303 pAPort = &pAC->Addr.Port[PortNumber];
11304
11305 #ifdef DEBUG
11306 SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11307- ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]))
11308+ ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]));
11309 #endif /* DEBUG */
11310-
11311+
11312 #ifndef SK_SLIM
11313 for (Inexact = 0, i = 0; i < 8; i++) {
11314 Inexact |= pAPort->InexactFilter.Bytes[i];
11315 }
11316-
11317+
11318 /* Set 64-bit hash register to InexactFilter. */
11319 GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1,
11320 &pAPort->InexactFilter.Bytes[0]);
11321-
11322- if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) {
11323-
11324+
11325+ if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) {
11326+
11327 /* Set all bits in 64-bit hash register. */
11328 GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash);
11329-
11330+
11331 /* Enable Hashing */
11332 SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);
11333 }
11334- else {
11335+ else {
11336 /* Enable Hashing. */
11337 SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);
11338 }
11339-
11340+
11341 if (pAPort->PromMode != SK_PROM_MODE_NONE) {
11342 (void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode);
11343 }
11344@@ -1136,19 +1147,19 @@
11345
11346 /* Enable Hashing */
11347 SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);
11348-
11349+
11350 (void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode);
11351-
11352+
11353 #endif /* SK_SLIM */
11354-
11355+
11356 /* Set port's current physical MAC address. */
11357 OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0];
11358 GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_1L, OutAddr);
11359-
11360+
11361 /* Set port's current logical MAC address. */
11362 OutAddr = (SK_U16 *) &pAPort->Exact[0].a[0];
11363 GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_2L, OutAddr);
11364-
11365+
11366 #ifdef DEBUG
11367 SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11368 ("SkAddrGmacMcUpdate: Permanent Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",
11369@@ -1157,8 +1168,8 @@
11370 pAPort->Exact[0].a[2],
11371 pAPort->Exact[0].a[3],
11372 pAPort->Exact[0].a[4],
11373- pAPort->Exact[0].a[5]))
11374-
11375+ pAPort->Exact[0].a[5]));
11376+
11377 SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11378 ("SkAddrGmacMcUpdate: Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",
11379 pAPort->CurrentMacAddress.a[0],
11380@@ -1166,9 +1177,9 @@
11381 pAPort->CurrentMacAddress.a[2],
11382 pAPort->CurrentMacAddress.a[3],
11383 pAPort->CurrentMacAddress.a[4],
11384- pAPort->CurrentMacAddress.a[5]))
11385+ pAPort->CurrentMacAddress.a[5]));
11386 #endif /* DEBUG */
11387-
11388+
11389 #ifndef SK_SLIM
11390 /* Determine return value. */
11391 if (Inexact == 0 && pAPort->PromMode == 0) {
11392@@ -1180,7 +1191,7 @@
11393 #else /* SK_SLIM */
11394 return (SK_MC_FILTERING_INEXACT);
11395 #endif /* SK_SLIM */
11396-
11397+
11398 } /* SkAddrGmacMcUpdate */
11399
11400 #endif /* YUKON */
11401@@ -1275,26 +1286,46 @@
11402 (void) SkAddrMcUpdate(pAC, IoC, PortNumber);
11403 }
11404 else if (Flags & SK_ADDR_PHYSICAL_ADDRESS) { /* Physical MAC address. */
11405- if (SK_ADDR_EQUAL(pNewAddr->a,
11406- pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) {
11407- return (SK_ADDR_DUPLICATE_ADDRESS);
11408- }
11409-
11410 for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {
11411 if (!pAC->Addr.Port[i].CurrentMacAddressSet) {
11412 return (SK_ADDR_TOO_EARLY);
11413 }
11414+ }
11415
11416+ /*
11417+ * In dual net mode it should be possible to set all MAC
11418+ * addresses independently. Therefore the equality checks
11419+ * against the locical address of the same port and the
11420+ * physical address of the other port are suppressed here.
11421+ */
11422+#ifndef SK_NO_RLMT
11423+ if (pAC->Rlmt.NumNets == 1) {
11424+#endif /* SK_NO_RLMT */
11425 if (SK_ADDR_EQUAL(pNewAddr->a,
11426- pAC->Addr.Port[i].CurrentMacAddress.a)) {
11427- if (i == PortNumber) {
11428- return (SK_ADDR_SUCCESS);
11429- }
11430- else {
11431- return (SK_ADDR_DUPLICATE_ADDRESS);
11432+ pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) {
11433+ return (SK_ADDR_DUPLICATE_ADDRESS);
11434+ }
11435+
11436+ for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {
11437+ if (SK_ADDR_EQUAL(pNewAddr->a,
11438+ pAC->Addr.Port[i].CurrentMacAddress.a)) {
11439+ if (i == PortNumber) {
11440+ return (SK_ADDR_SUCCESS);
11441+ }
11442+ else {
11443+ return (SK_ADDR_DUPLICATE_ADDRESS);
11444+ }
11445 }
11446 }
11447+#ifndef SK_NO_RLMT
11448 }
11449+ else {
11450+ if (SK_ADDR_EQUAL(pNewAddr->a,
11451+ pAC->Addr.Port[PortNumber].CurrentMacAddress.a)) {
11452+ return (SK_ADDR_SUCCESS);
11453+ }
11454+ }
11455+#endif /* SK_NO_RLMT */
11456
11457 pAC->Addr.Port[PortNumber].PreviousMacAddress =
11458 pAC->Addr.Port[PortNumber].CurrentMacAddress;
11459@@ -1325,18 +1356,32 @@
11460 pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) {
11461 return (SK_ADDR_SUCCESS);
11462 }
11463-
11464+
11465 for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {
11466 if (!pAC->Addr.Port[i].CurrentMacAddressSet) {
11467 return (SK_ADDR_TOO_EARLY);
11468 }
11469+ }
11470
11471- if (SK_ADDR_EQUAL(pNewAddr->a,
11472- pAC->Addr.Port[i].CurrentMacAddress.a)) {
11473- return (SK_ADDR_DUPLICATE_ADDRESS);
11474+ /*
11475+ * In dual net mode on Yukon-2 adapters the physical address
11476+ * of port 0 and the logical address of port 1 are equal - in
11477+ * this case the equality check of the physical address leads
11478+ * to an error and is suppressed here.
11479+ */
11480+#ifndef SK_NO_RLMT
11481+ if (pAC->Rlmt.NumNets == 1) {
11482+#endif /* SK_NO_RLMT */
11483+ for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {
11484+ if (SK_ADDR_EQUAL(pNewAddr->a,
11485+ pAC->Addr.Port[i].CurrentMacAddress.a)) {
11486+ return (SK_ADDR_DUPLICATE_ADDRESS);
11487+ }
11488 }
11489+#ifndef SK_NO_RLMT
11490 }
11491-
11492+#endif /* SK_NO_RLMT */
11493+
11494 /*
11495 * In case that the physical and the logical MAC addresses are equal
11496 * we must also change the physical MAC address here.
11497@@ -1345,11 +1390,11 @@
11498 */
11499 if (SK_ADDR_EQUAL(pAC->Addr.Port[PortNumber].CurrentMacAddress.a,
11500 pAC->Addr.Port[PortNumber].Exact[0].a)) {
11501-
11502+
11503 pAC->Addr.Port[PortNumber].PreviousMacAddress =
11504 pAC->Addr.Port[PortNumber].CurrentMacAddress;
11505 pAC->Addr.Port[PortNumber].CurrentMacAddress = *pNewAddr;
11506-
11507+
11508 #ifndef SK_NO_RLMT
11509 /* Report address change to RLMT. */
11510 Para.Para32[0] = PortNumber;
11511@@ -1357,7 +1402,7 @@
11512 SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_PORT_ADDR, Para);
11513 #endif /* !SK_NO_RLMT */
11514 }
11515-
11516+
11517 #ifndef SK_NO_RLMT
11518 /* Set PortNumber to number of net's active port. */
11519 PortNumber = pAC->Rlmt.Net[NetNumber].
11520@@ -1373,8 +1418,8 @@
11521 pAC->Addr.Net[NetNumber].PermanentMacAddress.a[2],
11522 pAC->Addr.Net[NetNumber].PermanentMacAddress.a[3],
11523 pAC->Addr.Net[NetNumber].PermanentMacAddress.a[4],
11524- pAC->Addr.Net[NetNumber].PermanentMacAddress.a[5]))
11525-
11526+ pAC->Addr.Net[NetNumber].PermanentMacAddress.a[5]));
11527+
11528 SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,
11529 ("SkAddrOverride: New logical MAC Address: %02X %02X %02X %02X %02X %02X\n",
11530 pAC->Addr.Net[NetNumber].CurrentMacAddress.a[0],
11531@@ -1382,17 +1427,16 @@
11532 pAC->Addr.Net[NetNumber].CurrentMacAddress.a[2],
11533 pAC->Addr.Net[NetNumber].CurrentMacAddress.a[3],
11534 pAC->Addr.Net[NetNumber].CurrentMacAddress.a[4],
11535- pAC->Addr.Net[NetNumber].CurrentMacAddress.a[5]))
11536+ pAC->Addr.Net[NetNumber].CurrentMacAddress.a[5]));
11537 #endif /* DEBUG */
11538
11539- /* Write address to first exact match entry of active port. */
11540- (void) SkAddrMcUpdate(pAC, IoC, PortNumber);
11541+ /* Write address to first exact match entry of active port. */
11542+ (void)SkAddrMcUpdate(pAC, IoC, PortNumber);
11543 }
11544
11545 return (SK_ADDR_SUCCESS);
11546-
11547-} /* SkAddrOverride */
11548
11549+} /* SkAddrOverride */
11550
11551 #endif /* SK_NO_MAO */
11552
11553@@ -1424,7 +1468,8 @@
11554 SK_U32 PortNumber, /* port whose promiscuous mode changes */
11555 int NewPromMode) /* new promiscuous mode */
11556 {
11557- int ReturnCode = 0;
11558+ int ReturnCode = SK_ADDR_ILLEGAL_PORT;
11559+
11560 #if (!defined(SK_SLIM) || defined(DEBUG))
11561 if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {
11562 return (SK_ADDR_ILLEGAL_PORT);
11563@@ -1489,17 +1534,18 @@
11564 /* Promiscuous mode! */
11565 CurPromMode |= SK_PROM_MODE_LLC;
11566 }
11567-
11568+
11569 for (Inexact = 0xFF, i = 0; i < 8; i++) {
11570 Inexact &= pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i];
11571 }
11572+
11573 if (Inexact == 0xFF) {
11574 CurPromMode |= (pAC->Addr.Port[PortNumber].PromMode & SK_PROM_MODE_ALL_MC);
11575 }
11576 else {
11577 /* Get InexactModeBit (bit XM_MD_ENA_HASH in mode register) */
11578 XM_IN16(IoC, PortNumber, XM_MODE, &LoMode);
11579-
11580+
11581 InexactModeBit = (LoMode & XM_MD_ENA_HASH) != 0;
11582
11583 /* Read 64-bit hash register from XMAC */
11584@@ -1522,7 +1568,7 @@
11585
11586 if ((NewPromMode & SK_PROM_MODE_ALL_MC) &&
11587 !(CurPromMode & SK_PROM_MODE_ALL_MC)) { /* All MC. */
11588-
11589+
11590 /* Set all bits in 64-bit hash register. */
11591 XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash);
11592
11593@@ -1558,9 +1604,9 @@
11594 /* Clear Promiscuous Mode */
11595 SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_FALSE);
11596 }
11597-
11598+
11599 return (SK_ADDR_SUCCESS);
11600-
11601+
11602 } /* SkAddrXmacPromiscuousChange */
11603
11604 #endif /* GENESIS */
11605@@ -1607,22 +1653,25 @@
11606 CurPromMode |= (pAC->Addr.Port[PortNumber].PromMode & SK_PROM_MODE_ALL_MC);
11607 }
11608
11609+ /* dummy read after GM_IN16() */
11610+ SK_IN16(IoC, B0_RAP, &ReceiveControl);
11611+
11612 pAC->Addr.Port[PortNumber].PromMode = NewPromMode;
11613
11614 if (NewPromMode == CurPromMode) {
11615 return (SK_ADDR_SUCCESS);
11616 }
11617-
11618+
11619 if ((NewPromMode & SK_PROM_MODE_ALL_MC) &&
11620 !(CurPromMode & SK_PROM_MODE_ALL_MC)) { /* All MC */
11621-
11622+
11623 /* Set all bits in 64-bit hash register. */
11624 GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash);
11625-
11626+
11627 /* Enable Hashing */
11628 SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE);
11629 }
11630-
11631+
11632 if ((CurPromMode & SK_PROM_MODE_ALL_MC) &&
11633 !(NewPromMode & SK_PROM_MODE_ALL_MC)) { /* Norm. MC */
11634
11635@@ -1636,19 +1685,19 @@
11636
11637 if ((NewPromMode & SK_PROM_MODE_LLC) &&
11638 !(CurPromMode & SK_PROM_MODE_LLC)) { /* Prom. LLC */
11639-
11640+
11641 /* Set the MAC to Promiscuous Mode. */
11642 SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_TRUE);
11643 }
11644 else if ((CurPromMode & SK_PROM_MODE_LLC) &&
11645 !(NewPromMode & SK_PROM_MODE_LLC)) { /* Norm. LLC */
11646-
11647+
11648 /* Clear Promiscuous Mode. */
11649 SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_FALSE);
11650 }
11651
11652 return (SK_ADDR_SUCCESS);
11653-
11654+
11655 } /* SkAddrGmacPromiscuousChange */
11656
11657 #endif /* YUKON */
11658@@ -1720,33 +1769,33 @@
11659 pAC->Addr.Port[ToPortNumber].InexactFilter.Bytes[i];
11660 pAC->Addr.Port[ToPortNumber].InexactFilter.Bytes[i] = Byte;
11661 }
11662-
11663+
11664 i = pAC->Addr.Port[FromPortNumber].PromMode;
11665 pAC->Addr.Port[FromPortNumber].PromMode = pAC->Addr.Port[ToPortNumber].PromMode;
11666 pAC->Addr.Port[ToPortNumber].PromMode = i;
11667-
11668+
11669 if (pAC->GIni.GIGenesis) {
11670 DWord = pAC->Addr.Port[FromPortNumber].FirstExactMatchRlmt;
11671 pAC->Addr.Port[FromPortNumber].FirstExactMatchRlmt =
11672 pAC->Addr.Port[ToPortNumber].FirstExactMatchRlmt;
11673 pAC->Addr.Port[ToPortNumber].FirstExactMatchRlmt = DWord;
11674-
11675+
11676 DWord = pAC->Addr.Port[FromPortNumber].NextExactMatchRlmt;
11677 pAC->Addr.Port[FromPortNumber].NextExactMatchRlmt =
11678 pAC->Addr.Port[ToPortNumber].NextExactMatchRlmt;
11679 pAC->Addr.Port[ToPortNumber].NextExactMatchRlmt = DWord;
11680-
11681+
11682 DWord = pAC->Addr.Port[FromPortNumber].FirstExactMatchDrv;
11683 pAC->Addr.Port[FromPortNumber].FirstExactMatchDrv =
11684 pAC->Addr.Port[ToPortNumber].FirstExactMatchDrv;
11685 pAC->Addr.Port[ToPortNumber].FirstExactMatchDrv = DWord;
11686-
11687+
11688 DWord = pAC->Addr.Port[FromPortNumber].NextExactMatchDrv;
11689 pAC->Addr.Port[FromPortNumber].NextExactMatchDrv =
11690 pAC->Addr.Port[ToPortNumber].NextExactMatchDrv;
11691 pAC->Addr.Port[ToPortNumber].NextExactMatchDrv = DWord;
11692 }
11693-
11694+
11695 /* CAUTION: Solution works if only ports of one adapter are in use. */
11696 for (i = 0; (SK_U32) i < pAC->Rlmt.Net[pAC->Rlmt.Port[ToPortNumber].
11697 Net->NetNumber].NumPorts; i++) {
11698@@ -1757,12 +1806,12 @@
11699 /* 20001207 RA: Was "ToPortNumber;". */
11700 }
11701 }
11702-
11703+
11704 (void) SkAddrMcUpdate(pAC, IoC, FromPortNumber);
11705 (void) SkAddrMcUpdate(pAC, IoC, ToPortNumber);
11706
11707 return (SK_ADDR_SUCCESS);
11708-
11709+
11710 } /* SkAddrSwap */
11711
11712 #endif /* !SK_SLIM */
11713diff -ruN linux/drivers/net/sk98lin/skcsum.c linux-new/drivers/net/sk98lin/skcsum.c
11714--- linux/drivers/net/sk98lin/skcsum.c 1970-01-01 01:00:00.000000000 +0100
11715+++ linux-new/drivers/net/sk98lin/skcsum.c 2006-01-18 14:37:24.000000000 +0100
11716@@ -0,0 +1,871 @@
11717+/******************************************************************************
11718+ *
11719+ * Name: skcsum.c
11720+ * Project: GEnesis, PCI Gigabit Ethernet Adapter
11721+ * Version: $Revision$
11722+ * Date: $Date$
11723+ * Purpose: Store/verify Internet checksum in send/receive packets.
11724+ *
11725+ ******************************************************************************/
11726+
11727+/******************************************************************************
11728+ *
11729+ * (C)Copyright 1998-2003 SysKonnect GmbH.
11730+ *
11731+ * This program is free software; you can redistribute it and/or modify
11732+ * it under the terms of the GNU General Public License as published by
11733+ * the Free Software Foundation; either version 2 of the License, or
11734+ * (at your option) any later version.
11735+ *
11736+ * The information in this file is provided "AS IS" without warranty.
11737+ *
11738+ ******************************************************************************/
11739+
11740+#ifdef SK_USE_CSUM /* Check if CSUM is to be used. */
11741+
11742+#ifndef lint
11743+static const char SysKonnectFileId[] =
11744+ "@(#) $Id$ (C) SysKonnect.";
11745+#endif /* !lint */
11746+
11747+/******************************************************************************
11748+ *
11749+ * Description:
11750+ *
11751+ * This is the "GEnesis" common module "CSUM".
11752+ *
11753+ * This module contains the code necessary to calculate, store, and verify the
11754+ * Internet Checksum of IP, TCP, and UDP frames.
11755+ *
11756+ * "GEnesis" is an abbreviation of "Gigabit Ethernet Network System in Silicon"
11757+ * and is the code name of this SysKonnect project.
11758+ *
11759+ * Compilation Options:
11760+ *
11761+ * SK_USE_CSUM - Define if CSUM is to be used. Otherwise, CSUM will be an
11762+ * empty module.
11763+ *
11764+ * SKCS_OVERWRITE_PROTO - Define to overwrite the default protocol id
11765+ * definitions. In this case, all SKCS_PROTO_xxx definitions must be made
11766+ * external.
11767+ *
11768+ * SKCS_OVERWRITE_STATUS - Define to overwrite the default return status
11769+ * definitions. In this case, all SKCS_STATUS_xxx definitions must be made
11770+ * external.
11771+ *
11772+ * Include File Hierarchy:
11773+ *
11774+ * "h/skdrv1st.h"
11775+ * "h/skcsum.h"
11776+ * "h/sktypes.h"
11777+ * "h/skqueue.h"
11778+ * "h/skdrv2nd.h"
11779+ *
11780+ ******************************************************************************/
11781+
11782+#include "h/skdrv1st.h"
11783+#include "h/skcsum.h"
11784+#include "h/skdrv2nd.h"
11785+
11786+/* defines ********************************************************************/
11787+
11788+/* The size of an Ethernet MAC header. */
11789+#define SKCS_ETHERNET_MAC_HEADER_SIZE (6+6+2)
11790+
11791+/* The size of the used topology's MAC header. */
11792+#define SKCS_MAC_HEADER_SIZE SKCS_ETHERNET_MAC_HEADER_SIZE
11793+
11794+/* The size of the IP header without any option fields. */
11795+#define SKCS_IP_HEADER_SIZE 20
11796+
11797+/*
11798+ * Field offsets within the IP header.
11799+ */
11800+
11801+/* "Internet Header Version" and "Length". */
11802+#define SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH 0
11803+
11804+/* "Total Length". */
11805+#define SKCS_OFS_IP_TOTAL_LENGTH 2
11806+
11807+/* "Flags" "Fragment Offset". */
11808+#define SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET 6
11809+
11810+/* "Next Level Protocol" identifier. */
11811+#define SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL 9
11812+
11813+/* Source IP address. */
11814+#define SKCS_OFS_IP_SOURCE_ADDRESS 12
11815+
11816+/* Destination IP address. */
11817+#define SKCS_OFS_IP_DESTINATION_ADDRESS 16
11818+
11819+
11820+/*
11821+ * Field offsets within the UDP header.
11822+ */
11823+
11824+/* UDP checksum. */
11825+#define SKCS_OFS_UDP_CHECKSUM 6
11826+
11827+/* IP "Next Level Protocol" identifiers (see RFC 790). */
11828+#define SKCS_PROTO_ID_TCP 6 /* Transport Control Protocol */
11829+#define SKCS_PROTO_ID_UDP 17 /* User Datagram Protocol */
11830+
11831+/* IP "Don't Fragment" bit. */
11832+#define SKCS_IP_DONT_FRAGMENT SKCS_HTON16(0x4000)
11833+
11834+/* Add a byte offset to a pointer. */
11835+#define SKCS_IDX(pPtr, Ofs) ((void *) ((char *) (pPtr) + (Ofs)))
11836+
11837+/*
11838+ * Macros that convert host to network representation and vice versa, i.e.
11839+ * little/big endian conversion on little endian machines only.
11840+ */
11841+#ifdef SK_LITTLE_ENDIAN
11842+#define SKCS_HTON16(Val16) (((unsigned) (Val16) >> 8) | (((Val16) & 0xff) << 8))
11843+#endif /* SK_LITTLE_ENDIAN */
11844+#ifdef SK_BIG_ENDIAN
11845+#define SKCS_HTON16(Val16) (Val16)
11846+#endif /* SK_BIG_ENDIAN */
11847+#define SKCS_NTOH16(Val16) SKCS_HTON16(Val16)
11848+
11849+/* typedefs *******************************************************************/
11850+
11851+/* function prototypes ********************************************************/
11852+
11853+/******************************************************************************
11854+ *
11855+ * SkCsGetSendInfo - get checksum information for a send packet
11856+ *
11857+ * Description:
11858+ * Get all checksum information necessary to send a TCP or UDP packet. The
11859+ * function checks the IP header passed to it. If the high-level protocol
11860+ * is either TCP or UDP the pseudo header checksum is calculated and
11861+ * returned.
11862+ *
11863+ * The function returns the total length of the IP header (including any
11864+ * IP option fields), which is the same as the start offset of the IP data
11865+ * which in turn is the start offset of the TCP or UDP header.
11866+ *
11867+ * The function also returns the TCP or UDP pseudo header checksum, which
11868+ * should be used as the start value for the hardware checksum calculation.
11869+ * (Note that any actual pseudo header checksum can never calculate to
11870+ * zero.)
11871+ *
11872+ * Note:
11873+ * There is a bug in the GENESIS ASIC which may lead to wrong checksums.
11874+ *
11875+ * Arguments:
11876+ * pAc - A pointer to the adapter context struct.
11877+ *
11878+ * pIpHeader - Pointer to IP header. Must be at least the IP header *not*
11879+ * including any option fields, i.e. at least 20 bytes.
11880+ *
11881+ * Note: This pointer will be used to address 8-, 16-, and 32-bit
11882+ * variables with the respective alignment offsets relative to the pointer.
11883+ * Thus, the pointer should point to a 32-bit aligned address. If the
11884+ * target system cannot address 32-bit variables on non 32-bit aligned
11885+ * addresses, then the pointer *must* point to a 32-bit aligned address.
11886+ *
11887+ * pPacketInfo - A pointer to the packet information structure for this
11888+ * packet. Before calling this SkCsGetSendInfo(), the following field must
11889+ * be initialized:
11890+ *
11891+ * ProtocolFlags - Initialize with any combination of
11892+ * SKCS_PROTO_XXX bit flags. SkCsGetSendInfo() will only work on
11893+ * the protocols specified here. Any protocol(s) not specified
11894+ * here will be ignored.
11895+ *
11896+ * Note: Only one checksum can be calculated in hardware. Thus, if
11897+ * SKCS_PROTO_IP is specified in the 'ProtocolFlags',
11898+ * SkCsGetSendInfo() must calculate the IP header checksum in
11899+ * software. It might be a better idea to have the calling
11900+ * protocol stack calculate the IP header checksum.
11901+ *
11902+ * Returns: N/A
11903+ * On return, the following fields in 'pPacketInfo' may or may not have
11904+ * been filled with information, depending on the protocol(s) found in the
11905+ * packet:
11906+ *
11907+ * ProtocolFlags - Returns the SKCS_PROTO_XXX bit flags of the protocol(s)
11908+ * that were both requested by the caller and actually found in the packet.
11909+ * Protocol(s) not specified by the caller and/or not found in the packet
11910+ * will have their respective SKCS_PROTO_XXX bit flags reset.
11911+ *
11912+ * Note: For IP fragments, TCP and UDP packet information is ignored.
11913+ *
11914+ * IpHeaderLength - The total length in bytes of the complete IP header
11915+ * including any option fields is returned here. This is the start offset
11916+ * of the IP data, i.e. the TCP or UDP header if present.
11917+ *
11918+ * IpHeaderChecksum - If IP has been specified in the 'ProtocolFlags', the
11919+ * 16-bit Internet Checksum of the IP header is returned here. This value
11920+ * is to be stored into the packet's 'IP Header Checksum' field.
11921+ *
11922+ * PseudoHeaderChecksum - If this is a TCP or UDP packet and if TCP or UDP
11923+ * has been specified in the 'ProtocolFlags', the 16-bit Internet Checksum
11924+ * of the TCP or UDP pseudo header is returned here.
11925+ */
11926+void SkCsGetSendInfo(
11927+SK_AC *pAc, /* Adapter context struct. */
11928+void *pIpHeader, /* IP header. */
11929+SKCS_PACKET_INFO *pPacketInfo, /* Packet information struct. */
11930+int NetNumber) /* Net number */
11931+{
11932+ /* Internet Header Version found in IP header. */
11933+ unsigned InternetHeaderVersion;
11934+
11935+ /* Length of the IP header as found in IP header. */
11936+ unsigned IpHeaderLength;
11937+
11938+ /* Bit field specifiying the desired/found protocols. */
11939+ unsigned ProtocolFlags;
11940+
11941+ /* Next level protocol identifier found in IP header. */
11942+ unsigned NextLevelProtocol;
11943+
11944+ /* Length of IP data portion. */
11945+ unsigned IpDataLength;
11946+
11947+ /* TCP/UDP pseudo header checksum. */
11948+ unsigned long PseudoHeaderChecksum;
11949+
11950+ /* Pointer to next level protocol statistics structure. */
11951+ SKCS_PROTO_STATS *NextLevelProtoStats;
11952+
11953+ /* Temporary variable. */
11954+ unsigned Tmp;
11955+
11956+ Tmp = *(SK_U8 *)
11957+ SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH);
11958+
11959+ /* Get the Internet Header Version (IHV). */
11960+ /* Note: The IHV is stored in the upper four bits. */
11961+
11962+ InternetHeaderVersion = Tmp >> 4;
11963+
11964+ /* Check the Internet Header Version. */
11965+ /* Note: We currently only support IP version 4. */
11966+
11967+ if (InternetHeaderVersion != 4) { /* IPv4? */
11968+ SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX,
11969+ ("Tx: Unknown Internet Header Version %u.\n",
11970+ InternetHeaderVersion));
11971+ pPacketInfo->ProtocolFlags = 0;
11972+ pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++;
11973+ return;
11974+ }
11975+
11976+ /* Get the IP header length (IHL). */
11977+ /*
11978+ * Note: The IHL is stored in the lower four bits as the number of
11979+ * 4-byte words.
11980+ */
11981+
11982+ IpHeaderLength = (Tmp & 0xf) * 4;
11983+ pPacketInfo->IpHeaderLength = IpHeaderLength;
11984+
11985+ /* Check the IP header length. */
11986+
11987+ /* 04-Aug-1998 sw - Really check the IHL? Necessary? */
11988+
11989+ if (IpHeaderLength < 5*4) {
11990+ SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_TX,
11991+ ("Tx: Invalid IP Header Length %u.\n", IpHeaderLength));
11992+ pPacketInfo->ProtocolFlags = 0;
11993+ pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxUnableCts++;
11994+ return;
11995+ }
11996+
11997+ /* This is an IPv4 frame with a header of valid length. */
11998+
11999+ pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].TxOkCts++;
12000+
12001+ /* Check if we should calculate the IP header checksum. */
12002+
12003+ ProtocolFlags = pPacketInfo->ProtocolFlags;
12004+
12005+ if (ProtocolFlags & SKCS_PROTO_IP) {
12006+ pPacketInfo->IpHeaderChecksum =
12007+ SkCsCalculateChecksum(pIpHeader, IpHeaderLength);
12008+ }
12009+
12010+ /* Get the next level protocol identifier. */
12011+
12012+ NextLevelProtocol =
12013+ *(SK_U8 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL);
12014+
12015+ /*
12016+ * Check if this is a TCP or UDP frame and if we should calculate the
12017+ * TCP/UDP pseudo header checksum.
12018+ *
12019+ * Also clear all protocol bit flags of protocols not present in the
12020+ * frame.
12021+ */
12022+
12023+ if ((ProtocolFlags & SKCS_PROTO_TCP) != 0 &&
12024+ NextLevelProtocol == SKCS_PROTO_ID_TCP) {
12025+ /* TCP/IP frame. */
12026+ ProtocolFlags &= SKCS_PROTO_TCP | SKCS_PROTO_IP;
12027+ NextLevelProtoStats =
12028+ &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP];
12029+ }
12030+ else if ((ProtocolFlags & SKCS_PROTO_UDP) != 0 &&
12031+ NextLevelProtocol == SKCS_PROTO_ID_UDP) {
12032+ /* UDP/IP frame. */
12033+ ProtocolFlags &= SKCS_PROTO_UDP | SKCS_PROTO_IP;
12034+ NextLevelProtoStats =
12035+ &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP];
12036+ }
12037+ else {
12038+ /*
12039+ * Either not a TCP or UDP frame and/or TCP/UDP processing not
12040+ * specified.
12041+ */
12042+ pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP;
12043+ return;
12044+ }
12045+
12046+ /* Check if this is an IP fragment. */
12047+
12048+ /*
12049+ * Note: An IP fragment has a non-zero "Fragment Offset" field and/or
12050+ * the "More Fragments" bit set. Thus, if both the "Fragment Offset"
12051+ * and the "More Fragments" are zero, it is *not* a fragment. We can
12052+ * easily check both at the same time since they are in the same 16-bit
12053+ * word.
12054+ */
12055+
12056+ if ((*(SK_U16 *)
12057+ SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) &
12058+ ~SKCS_IP_DONT_FRAGMENT) != 0) {
12059+ /* IP fragment; ignore all other protocols. */
12060+ pPacketInfo->ProtocolFlags = ProtocolFlags & SKCS_PROTO_IP;
12061+ NextLevelProtoStats->TxUnableCts++;
12062+ return;
12063+ }
12064+
12065+ /*
12066+ * Calculate the TCP/UDP pseudo header checksum.
12067+ */
12068+
12069+ /* Get total length of IP header and data. */
12070+
12071+ IpDataLength =
12072+ *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH);
12073+
12074+ /* Get length of IP data portion. */
12075+
12076+ IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength;
12077+
12078+ /* Calculate the sum of all pseudo header fields (16-bit). */
12079+
12080+ PseudoHeaderChecksum =
12081+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12082+ SKCS_OFS_IP_SOURCE_ADDRESS + 0) +
12083+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12084+ SKCS_OFS_IP_SOURCE_ADDRESS + 2) +
12085+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12086+ SKCS_OFS_IP_DESTINATION_ADDRESS + 0) +
12087+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12088+ SKCS_OFS_IP_DESTINATION_ADDRESS + 2) +
12089+ (unsigned long) SKCS_HTON16(NextLevelProtocol) +
12090+ (unsigned long) SKCS_HTON16(IpDataLength);
12091+
12092+ /* Add-in any carries. */
12093+
12094+ SKCS_OC_ADD(PseudoHeaderChecksum, PseudoHeaderChecksum, 0);
12095+
12096+ /* Add-in any new carry. */
12097+
12098+ SKCS_OC_ADD(pPacketInfo->PseudoHeaderChecksum, PseudoHeaderChecksum, 0);
12099+
12100+ pPacketInfo->ProtocolFlags = ProtocolFlags;
12101+ NextLevelProtoStats->TxOkCts++; /* Success. */
12102+} /* SkCsGetSendInfo */
12103+
12104+
12105+/******************************************************************************
12106+ *
12107+ * SkCsGetReceiveInfo - verify checksum information for a received packet
12108+ *
12109+ * Description:
12110+ * Verify a received frame's checksum. The function returns a status code
12111+ * reflecting the result of the verification.
12112+ *
12113+ * Note:
12114+ * Before calling this function you have to verify that the frame is
12115+ * not padded and Checksum1 and Checksum2 are bigger than 1.
12116+ *
12117+ * Arguments:
12118+ * pAc - Pointer to adapter context struct.
12119+ *
12120+ * pIpHeader - Pointer to IP header. Must be at least the length in bytes
12121+ * of the received IP header including any option fields. For UDP packets,
12122+ * 8 additional bytes are needed to access the UDP checksum.
12123+ *
12124+ * Note: The actual length of the IP header is stored in the lower four
12125+ * bits of the first octet of the IP header as the number of 4-byte words,
12126+ * so it must be multiplied by four to get the length in bytes. Thus, the
12127+ * maximum IP header length is 15 * 4 = 60 bytes.
12128+ *
12129+ * Checksum1 - The first 16-bit Internet Checksum calculated by the
12130+ * hardware starting at the offset returned by SkCsSetReceiveFlags().
12131+ *
12132+ * Checksum2 - The second 16-bit Internet Checksum calculated by the
12133+ * hardware starting at the offset returned by SkCsSetReceiveFlags().
12134+ *
12135+ * Returns:
12136+ * SKCS_STATUS_UNKNOWN_IP_VERSION - Not an IP v4 frame.
12137+ * SKCS_STATUS_IP_CSUM_ERROR - IP checksum error.
12138+ * SKCS_STATUS_IP_CSUM_ERROR_TCP - IP checksum error in TCP frame.
12139+ * SKCS_STATUS_IP_CSUM_ERROR_UDP - IP checksum error in UDP frame
12140+ * SKCS_STATUS_IP_FRAGMENT - IP fragment (IP checksum ok).
12141+ * SKCS_STATUS_IP_CSUM_OK - IP checksum ok (not a TCP or UDP frame).
12142+ * SKCS_STATUS_TCP_CSUM_ERROR - TCP checksum error (IP checksum ok).
12143+ * SKCS_STATUS_UDP_CSUM_ERROR - UDP checksum error (IP checksum ok).
12144+ * SKCS_STATUS_TCP_CSUM_OK - IP and TCP checksum ok.
12145+ * SKCS_STATUS_UDP_CSUM_OK - IP and UDP checksum ok.
12146+ * SKCS_STATUS_IP_CSUM_OK_NO_UDP - IP checksum OK and no UDP checksum.
12147+ *
12148+ * Note: If SKCS_OVERWRITE_STATUS is defined, the SKCS_STATUS_XXX values
12149+ * returned here can be defined in some header file by the module using CSUM.
12150+ * In this way, the calling module can assign return values for its own needs,
12151+ * e.g. by assigning bit flags to the individual protocols.
12152+ */
12153+SKCS_STATUS SkCsGetReceiveInfo(
12154+SK_AC *pAc, /* Adapter context struct. */
12155+void *pIpHeader, /* IP header. */
12156+unsigned Checksum1, /* Hardware checksum 1. */
12157+unsigned Checksum2, /* Hardware checksum 2. */
12158+int NetNumber) /* Net number */
12159+{
12160+ /* Internet Header Version found in IP header. */
12161+ unsigned InternetHeaderVersion;
12162+
12163+ /* Length of the IP header as found in IP header. */
12164+ unsigned IpHeaderLength;
12165+
12166+ /* Length of IP data portion. */
12167+ unsigned IpDataLength;
12168+
12169+ /* IP header checksum. */
12170+ unsigned IpHeaderChecksum;
12171+
12172+ /* IP header options checksum, if any. */
12173+ unsigned IpOptionsChecksum;
12174+
12175+ /* IP data checksum, i.e. TCP/UDP checksum. */
12176+ unsigned IpDataChecksum;
12177+
12178+ /* Next level protocol identifier found in IP header. */
12179+ unsigned NextLevelProtocol;
12180+
12181+ /* The checksum of the "next level protocol", i.e. TCP or UDP. */
12182+ unsigned long NextLevelProtocolChecksum;
12183+
12184+ /* Pointer to next level protocol statistics structure. */
12185+ SKCS_PROTO_STATS *NextLevelProtoStats;
12186+
12187+ /* Temporary variable. */
12188+ unsigned Tmp;
12189+
12190+ Tmp = *(SK_U8 *)
12191+ SKCS_IDX(pIpHeader, SKCS_OFS_IP_HEADER_VERSION_AND_LENGTH);
12192+
12193+ /* Get the Internet Header Version (IHV). */
12194+ /* Note: The IHV is stored in the upper four bits. */
12195+
12196+ InternetHeaderVersion = Tmp >> 4;
12197+
12198+ /* Check the Internet Header Version. */
12199+ /* Note: We currently only support IP version 4. */
12200+
12201+ if (InternetHeaderVersion != 4) { /* IPv4? */
12202+ SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX,
12203+ ("Rx: Unknown Internet Header Version %u.\n",
12204+ InternetHeaderVersion));
12205+ pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxUnableCts++;
12206+ return (SKCS_STATUS_UNKNOWN_IP_VERSION);
12207+ }
12208+
12209+ /* Get the IP header length (IHL). */
12210+ /*
12211+ * Note: The IHL is stored in the lower four bits as the number of
12212+ * 4-byte words.
12213+ */
12214+
12215+ IpHeaderLength = (Tmp & 0xf) * 4;
12216+
12217+ /* Check the IP header length. */
12218+
12219+ /* 04-Aug-1998 sw - Really check the IHL? Necessary? */
12220+
12221+ if (IpHeaderLength < 5*4) {
12222+ SK_DBG_MSG(pAc, SK_DBGMOD_CSUM, SK_DBGCAT_ERR | SK_DBGCAT_RX,
12223+ ("Rx: Invalid IP Header Length %u.\n", IpHeaderLength));
12224+ pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++;
12225+ return (SKCS_STATUS_IP_CSUM_ERROR);
12226+ }
12227+
12228+ /* This is an IPv4 frame with a header of valid length. */
12229+
12230+ /* Get the IP header and data checksum. */
12231+
12232+ IpDataChecksum = Checksum2;
12233+
12234+ /*
12235+ * The IP header checksum is calculated as follows:
12236+ *
12237+ * IpHeaderChecksum = Checksum1 - Checksum2
12238+ */
12239+
12240+ SKCS_OC_SUB(IpHeaderChecksum, Checksum1, Checksum2);
12241+
12242+ /* Check if any IP header options. */
12243+
12244+ if (IpHeaderLength > SKCS_IP_HEADER_SIZE) {
12245+
12246+ /* Get the IP options checksum. */
12247+
12248+ IpOptionsChecksum = SkCsCalculateChecksum(
12249+ SKCS_IDX(pIpHeader, SKCS_IP_HEADER_SIZE),
12250+ IpHeaderLength - SKCS_IP_HEADER_SIZE);
12251+
12252+ /* Adjust the IP header and IP data checksums. */
12253+
12254+ SKCS_OC_ADD(IpHeaderChecksum, IpHeaderChecksum, IpOptionsChecksum);
12255+
12256+ SKCS_OC_SUB(IpDataChecksum, IpDataChecksum, IpOptionsChecksum);
12257+ }
12258+
12259+ /*
12260+ * Check if the IP header checksum is ok.
12261+ *
12262+ * NOTE: We must check the IP header checksum even if the caller just wants
12263+ * us to check upper-layer checksums, because we cannot do any further
12264+ * processing of the packet without a valid IP checksum.
12265+ */
12266+
12267+ /* Get the next level protocol identifier. */
12268+
12269+ NextLevelProtocol = *(SK_U8 *)
12270+ SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL);
12271+
12272+ if (IpHeaderChecksum != 0xffff) {
12273+ pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++;
12274+ /* the NDIS tester wants to know the upper level protocol too */
12275+ if (NextLevelProtocol == SKCS_PROTO_ID_TCP) {
12276+ return(SKCS_STATUS_IP_CSUM_ERROR_TCP);
12277+ }
12278+ else if (NextLevelProtocol == SKCS_PROTO_ID_UDP) {
12279+ return(SKCS_STATUS_IP_CSUM_ERROR_UDP);
12280+ }
12281+ return (SKCS_STATUS_IP_CSUM_ERROR);
12282+ }
12283+
12284+ /*
12285+ * Check if this is a TCP or UDP frame and if we should calculate the
12286+ * TCP/UDP pseudo header checksum.
12287+ *
12288+ * Also clear all protocol bit flags of protocols not present in the
12289+ * frame.
12290+ */
12291+
12292+ if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_TCP) != 0 &&
12293+ NextLevelProtocol == SKCS_PROTO_ID_TCP) {
12294+ /* TCP/IP frame. */
12295+ NextLevelProtoStats =
12296+ &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_TCP];
12297+ }
12298+ else if ((pAc->Csum.ReceiveFlags[NetNumber] & SKCS_PROTO_UDP) != 0 &&
12299+ NextLevelProtocol == SKCS_PROTO_ID_UDP) {
12300+ /* UDP/IP frame. */
12301+ NextLevelProtoStats =
12302+ &pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_UDP];
12303+ }
12304+ else {
12305+ /*
12306+ * Either not a TCP or UDP frame and/or TCP/UDP processing not
12307+ * specified.
12308+ */
12309+ return (SKCS_STATUS_IP_CSUM_OK);
12310+ }
12311+
12312+ /* Check if this is an IP fragment. */
12313+
12314+ /*
12315+ * Note: An IP fragment has a non-zero "Fragment Offset" field and/or
12316+ * the "More Fragments" bit set. Thus, if both the "Fragment Offset"
12317+ * and the "More Fragments" are zero, it is *not* a fragment. We can
12318+ * easily check both at the same time since they are in the same 16-bit
12319+ * word.
12320+ */
12321+
12322+ if ((*(SK_U16 *)
12323+ SKCS_IDX(pIpHeader, SKCS_OFS_IP_FLAGS_AND_FRAGMENT_OFFSET) &
12324+ ~SKCS_IP_DONT_FRAGMENT) != 0) {
12325+ /* IP fragment; ignore all other protocols. */
12326+ NextLevelProtoStats->RxUnableCts++;
12327+ return (SKCS_STATUS_IP_FRAGMENT);
12328+ }
12329+
12330+ /*
12331+ * 08-May-2000 ra
12332+ *
12333+ * From RFC 768 (UDP)
12334+ * If the computed checksum is zero, it is transmitted as all ones (the
12335+ * equivalent in one's complement arithmetic). An all zero transmitted
12336+ * checksum value means that the transmitter generated no checksum (for
12337+ * debugging or for higher level protocols that don't care).
12338+ */
12339+
12340+ if (NextLevelProtocol == SKCS_PROTO_ID_UDP &&
12341+ *(SK_U16*)SKCS_IDX(pIpHeader, IpHeaderLength + 6) == 0x0000) {
12342+
12343+ NextLevelProtoStats->RxOkCts++;
12344+
12345+ return (SKCS_STATUS_IP_CSUM_OK_NO_UDP);
12346+ }
12347+
12348+ /*
12349+ * Calculate the TCP/UDP checksum.
12350+ */
12351+
12352+ /* Get total length of IP header and data. */
12353+
12354+ IpDataLength =
12355+ *(SK_U16 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_TOTAL_LENGTH);
12356+
12357+ /* Get length of IP data portion. */
12358+
12359+ IpDataLength = SKCS_NTOH16(IpDataLength) - IpHeaderLength;
12360+
12361+ NextLevelProtocolChecksum =
12362+
12363+ /* Calculate the pseudo header checksum. */
12364+
12365+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12366+ SKCS_OFS_IP_SOURCE_ADDRESS + 0) +
12367+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12368+ SKCS_OFS_IP_SOURCE_ADDRESS + 2) +
12369+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12370+ SKCS_OFS_IP_DESTINATION_ADDRESS + 0) +
12371+ (unsigned long) *(SK_U16 *) SKCS_IDX(pIpHeader,
12372+ SKCS_OFS_IP_DESTINATION_ADDRESS + 2) +
12373+ (unsigned long) SKCS_HTON16(NextLevelProtocol) +
12374+ (unsigned long) SKCS_HTON16(IpDataLength) +
12375+
12376+ /* Add the TCP/UDP header checksum. */
12377+
12378+ (unsigned long) IpDataChecksum;
12379+
12380+ /* Add-in any carries. */
12381+
12382+ SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0);
12383+
12384+ /* Add-in any new carry. */
12385+
12386+ SKCS_OC_ADD(NextLevelProtocolChecksum, NextLevelProtocolChecksum, 0);
12387+
12388+ /* Check if the TCP/UDP checksum is ok. */
12389+
12390+ if ((unsigned) NextLevelProtocolChecksum == 0xffff) {
12391+
12392+ /* TCP/UDP checksum ok. */
12393+
12394+ NextLevelProtoStats->RxOkCts++;
12395+
12396+ return (NextLevelProtocol == SKCS_PROTO_ID_TCP ?
12397+ SKCS_STATUS_TCP_CSUM_OK : SKCS_STATUS_UDP_CSUM_OK);
12398+ }
12399+
12400+ /* TCP/UDP checksum error. */
12401+
12402+ NextLevelProtoStats->RxErrCts++;
12403+
12404+ return (NextLevelProtocol == SKCS_PROTO_ID_TCP ?
12405+ SKCS_STATUS_TCP_CSUM_ERROR : SKCS_STATUS_UDP_CSUM_ERROR);
12406+} /* SkCsGetReceiveInfo */
12407+
12408+
12409+/******************************************************************************
12410+ *
12411+ * SkCsSetReceiveFlags - set checksum receive flags
12412+ *
12413+ * Description:
12414+ * Use this function to set the various receive flags. According to the
12415+ * protocol flags set by the caller, the start offsets within received
12416+ * packets of the two hardware checksums are returned. These offsets must
12417+ * be stored in all receive descriptors.
12418+ *
12419+ * Arguments:
12420+ * pAc - Pointer to adapter context struct.
12421+ *
12422+ * ReceiveFlags - Any combination of SK_PROTO_XXX flags of the protocols
12423+ * for which the caller wants checksum information on received frames.
12424+ *
12425+ * pChecksum1Offset - The start offset of the first receive descriptor
12426+ * hardware checksum to be calculated for received frames is returned
12427+ * here.
12428+ *
12429+ * pChecksum2Offset - The start offset of the second receive descriptor
12430+ * hardware checksum to be calculated for received frames is returned
12431+ * here.
12432+ *
12433+ * Returns: N/A
12434+ * Returns the two hardware checksum start offsets.
12435+ */
12436+void SkCsSetReceiveFlags(
12437+SK_AC *pAc, /* Adapter context struct. */
12438+unsigned ReceiveFlags, /* New receive flags. */
12439+unsigned *pChecksum1Offset, /* Offset for hardware checksum 1. */
12440+unsigned *pChecksum2Offset, /* Offset for hardware checksum 2. */
12441+int NetNumber)
12442+{
12443+ /* Save the receive flags. */
12444+
12445+ pAc->Csum.ReceiveFlags[NetNumber] = ReceiveFlags;
12446+
12447+ /* First checksum start offset is the IP header. */
12448+ *pChecksum1Offset = SKCS_MAC_HEADER_SIZE;
12449+
12450+ /*
12451+ * Second checksum start offset is the IP data. Note that this may vary
12452+ * if there are any IP header options in the actual packet.
12453+ */
12454+ *pChecksum2Offset = SKCS_MAC_HEADER_SIZE + SKCS_IP_HEADER_SIZE;
12455+} /* SkCsSetReceiveFlags */
12456+
12457+#ifndef SK_CS_CALCULATE_CHECKSUM
12458+
12459+/******************************************************************************
12460+ *
12461+ * SkCsCalculateChecksum - calculate checksum for specified data
12462+ *
12463+ * Description:
12464+ * Calculate and return the 16-bit Internet Checksum for the specified
12465+ * data.
12466+ *
12467+ * Arguments:
12468+ * pData - Pointer to data for which the checksum shall be calculated.
12469+ * Note: The pointer should be aligned on a 16-bit boundary.
12470+ *
12471+ * Length - Length in bytes of data to checksum.
12472+ *
12473+ * Returns:
12474+ * The 16-bit Internet Checksum for the specified data.
12475+ *
12476+ * Note: The checksum is calculated in the machine's natural byte order,
12477+ * i.e. little vs. big endian. Thus, the resulting checksum is different
12478+ * for the same input data on little and big endian machines.
12479+ *
12480+ * However, when written back to the network packet, the byte order is
12481+ * always in correct network order.
12482+ */
12483+unsigned SkCsCalculateChecksum(
12484+void *pData, /* Data to checksum. */
12485+unsigned Length) /* Length of data. */
12486+{
12487+ SK_U16 *pU16; /* Pointer to the data as 16-bit words. */
12488+ unsigned long Checksum; /* Checksum; must be at least 32 bits. */
12489+
12490+ /* Sum up all 16-bit words. */
12491+
12492+ pU16 = (SK_U16 *) pData;
12493+ for (Checksum = 0; Length > 1; Length -= 2) {
12494+ Checksum += *pU16++;
12495+ }
12496+
12497+ /* If this is an odd number of bytes, add-in the last byte. */
12498+
12499+ if (Length > 0) {
12500+#ifdef SK_BIG_ENDIAN
12501+ /* Add the last byte as the high byte. */
12502+ Checksum += ((unsigned) *(SK_U8 *) pU16) << 8;
12503+#else /* !SK_BIG_ENDIAN */
12504+ /* Add the last byte as the low byte. */
12505+ Checksum += *(SK_U8 *) pU16;
12506+#endif /* !SK_BIG_ENDIAN */
12507+ }
12508+
12509+ /* Add-in any carries. */
12510+
12511+ SKCS_OC_ADD(Checksum, Checksum, 0);
12512+
12513+ /* Add-in any new carry. */
12514+
12515+ SKCS_OC_ADD(Checksum, Checksum, 0);
12516+
12517+ /* Note: All bits beyond the 16-bit limit are now zero. */
12518+
12519+ return ((unsigned) Checksum);
12520+} /* SkCsCalculateChecksum */
12521+
12522+#endif /* SK_CS_CALCULATE_CHECKSUM */
12523+
12524+/******************************************************************************
12525+ *
12526+ * SkCsEvent - the CSUM event dispatcher
12527+ *
12528+ * Description:
12529+ * This is the event handler for the CSUM module.
12530+ *
12531+ * Arguments:
12532+ * pAc - Pointer to adapter context.
12533+ *
12534+ * Ioc - I/O context.
12535+ *
12536+ * Event - Event id.
12537+ *
12538+ * Param - Event dependent parameter.
12539+ *
12540+ * Returns:
12541+ * The 16-bit Internet Checksum for the specified data.
12542+ *
12543+ * Note: The checksum is calculated in the machine's natural byte order,
12544+ * i.e. little vs. big endian. Thus, the resulting checksum is different
12545+ * for the same input data on little and big endian machines.
12546+ *
12547+ * However, when written back to the network packet, the byte order is
12548+ * always in correct network order.
12549+ */
12550+int SkCsEvent(
12551+SK_AC *pAc, /* Pointer to adapter context. */
12552+SK_IOC Ioc, /* I/O context. */
12553+SK_U32 Event, /* Event id. */
12554+SK_EVPARA Param) /* Event dependent parameter. */
12555+{
12556+ int ProtoIndex;
12557+ int NetNumber;
12558+
12559+ switch (Event) {
12560+ /*
12561+ * Clear protocol statistics.
12562+ *
12563+ * Param - Protocol index, or -1 for all protocols.
12564+ * - Net number.
12565+ */
12566+ case SK_CSUM_EVENT_CLEAR_PROTO_STATS:
12567+
12568+ ProtoIndex = (int)Param.Para32[1];
12569+ NetNumber = (int)Param.Para32[0];
12570+ if (ProtoIndex < 0) { /* Clear for all protocols. */
12571+ if (NetNumber >= 0) {
12572+ SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][0], 0,
12573+ sizeof(pAc->Csum.ProtoStats[NetNumber]));
12574+ }
12575+ }
12576+ else { /* Clear for individual protocol. */
12577+ SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0,
12578+ sizeof(pAc->Csum.ProtoStats[NetNumber][ProtoIndex]));
12579+ }
12580+ break;
12581+ default:
12582+ break;
12583+ }
12584+ return (0); /* Success. */
12585+} /* SkCsEvent */
12586+
12587+#endif /* SK_USE_CSUM */
12588diff -ruN linux/drivers/net/sk98lin/skdim.c linux-new/drivers/net/sk98lin/skdim.c
12589--- linux/drivers/net/sk98lin/skdim.c 2006-04-11 19:19:28.000000000 +0200
12590+++ linux-new/drivers/net/sk98lin/skdim.c 2006-01-18 14:37:24.000000000 +0100
12591@@ -1,17 +1,25 @@
12592 /******************************************************************************
12593 *
12594- * Name: skdim.c
12595- * Project: GEnesis, PCI Gigabit Ethernet Adapter
12596- * Version: $Revision$
12597- * Date: $Date$
12598- * Purpose: All functions to maintain interrupt moderation
12599+ * Name: skdim.c
12600+ * Project: GEnesis, PCI Gigabit Ethernet Adapter
12601+ * Version: $Revision$
12602+ * Date: $Date$
12603+ * Purpose: All functions regardig interrupt moderation
12604 *
12605 ******************************************************************************/
12606
12607 /******************************************************************************
12608 *
12609 * (C)Copyright 1998-2002 SysKonnect GmbH.
12610- * (C)Copyright 2002-2003 Marvell.
12611+ * (C)Copyright 2002-2005 Marvell.
12612+ *
12613+ * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet
12614+ * Server Adapters.
12615+ *
12616+ * Author: Ralph Roesler (rroesler@syskonnect.de)
12617+ * Mirko Lindner (mlindner@syskonnect.de)
12618+ *
12619+ * Address all question to: linux@syskonnect.de
12620 *
12621 * This program is free software; you can redistribute it and/or modify
12622 * it under the terms of the GNU General Public License as published by
12623@@ -20,723 +28,367 @@
12624 *
12625 * The information in this file is provided "AS IS" without warranty.
12626 *
12627- ******************************************************************************/
12628+ *****************************************************************************/
12629
12630-/******************************************************************************
12631- *
12632- * Description:
12633- *
12634- * This module is intended to manage the dynamic interrupt moderation on both
12635- * GEnesis and Yukon adapters.
12636- *
12637- * Include File Hierarchy:
12638- *
12639- * "skdrv1st.h"
12640- * "skdrv2nd.h"
12641- *
12642- ******************************************************************************/
12643-
12644-#ifndef lint
12645-static const char SysKonnectFileId[] =
12646- "@(#) $Id$ (C) SysKonnect.";
12647-#endif
12648-
12649-#define __SKADDR_C
12650-
12651-#ifdef __cplusplus
12652-#error C++ is not yet supported.
12653-extern "C" {
12654-#endif
12655-
12656-/*******************************************************************************
12657-**
12658-** Includes
12659-**
12660-*******************************************************************************/
12661-
12662-#ifndef __INC_SKDRV1ST_H
12663 #include "h/skdrv1st.h"
12664-#endif
12665-
12666-#ifndef __INC_SKDRV2ND_H
12667 #include "h/skdrv2nd.h"
12668-#endif
12669
12670-#include <linux/kernel_stat.h>
12671-
12672-/*******************************************************************************
12673-**
12674-** Defines
12675-**
12676-*******************************************************************************/
12677-
12678-/*******************************************************************************
12679-**
12680-** Typedefs
12681-**
12682-*******************************************************************************/
12683+/******************************************************************************
12684+ *
12685+ * Local Function Prototypes
12686+ *
12687+ *****************************************************************************/
12688
12689-/*******************************************************************************
12690-**
12691-** Local function prototypes
12692-**
12693-*******************************************************************************/
12694-
12695-static unsigned int GetCurrentSystemLoad(SK_AC *pAC);
12696-static SK_U64 GetIsrCalls(SK_AC *pAC);
12697-static SK_BOOL IsIntModEnabled(SK_AC *pAC);
12698-static void SetCurrIntCtr(SK_AC *pAC);
12699-static void EnableIntMod(SK_AC *pAC);
12700-static void DisableIntMod(SK_AC *pAC);
12701-static void ResizeDimTimerDuration(SK_AC *pAC);
12702-static void DisplaySelectedModerationType(SK_AC *pAC);
12703-static void DisplaySelectedModerationMask(SK_AC *pAC);
12704-static void DisplayDescrRatio(SK_AC *pAC);
12705+static SK_U64 getIsrCalls(SK_AC *pAC);
12706+static SK_BOOL isIntModEnabled(SK_AC *pAC);
12707+static void setCurrIntCtr(SK_AC *pAC);
12708+static void enableIntMod(SK_AC *pAC);
12709+static void disableIntMod(SK_AC *pAC);
12710
12711-/*******************************************************************************
12712-**
12713-** Global variables
12714-**
12715-*******************************************************************************/
12716+#define M_DIMINFO pAC->DynIrqModInfo
12717
12718-/*******************************************************************************
12719-**
12720-** Local variables
12721-**
12722-*******************************************************************************/
12723+/******************************************************************************
12724+ *
12725+ * Global Functions
12726+ *
12727+ *****************************************************************************/
12728
12729-/*******************************************************************************
12730-**
12731-** Global functions
12732-**
12733-*******************************************************************************/
12734+/*****************************************************************************
12735+ *
12736+ * SkDimModerate - Moderates the IRQs depending on the current needs
12737+ *
12738+ * Description:
12739+ * Moderation of IRQs depends on the number of occurred IRQs with
12740+ * respect to the previous moderation cycle.
12741+ *
12742+ * Returns: N/A
12743+ *
12744+ */
12745+void SkDimModerate(
12746+SK_AC *pAC) /* pointer to adapter control context */
12747+{
12748+ SK_U64 IsrCalls = getIsrCalls(pAC);
12749+
12750+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==> SkDimModerate\n"));
12751+
12752+ if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
12753+ if (isIntModEnabled(pAC)) {
12754+ if (IsrCalls < M_DIMINFO.MaxModIntsPerSecLowerLimit) {
12755+ disableIntMod(pAC);
12756+ }
12757+ } else {
12758+ if (IsrCalls > M_DIMINFO.MaxModIntsPerSecUpperLimit) {
12759+ enableIntMod(pAC);
12760+ }
12761+ }
12762+ }
12763+ setCurrIntCtr(pAC);
12764
12765-/*******************************************************************************
12766-** Function : SkDimModerate
12767-** Description : Called in every ISR to check if moderation is to be applied
12768-** or not for the current number of interrupts
12769-** Programmer : Ralph Roesler
12770-** Last Modified: 22-mar-03
12771-** Returns : void (!)
12772-** Notes : -
12773-*******************************************************************************/
12774-
12775-void
12776-SkDimModerate(SK_AC *pAC) {
12777- unsigned int CurrSysLoad = 0; /* expressed in percent */
12778- unsigned int LoadIncrease = 0; /* expressed in percent */
12779- SK_U64 ThresholdInts = 0;
12780- SK_U64 IsrCallsPerSec = 0;
12781+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("<== SkDimModerate\n"));
12782+}
12783
12784-#define M_DIMINFO pAC->DynIrqModInfo
12785+/*****************************************************************************
12786+ *
12787+ * SkDimStartModerationTimer - Starts the moderation timer
12788+ *
12789+ * Description:
12790+ * Dynamic interrupt moderation is regularly checked using the
12791+ * so-called moderation timer. This timer is started with this function.
12792+ *
12793+ * Returns: N/A
12794+ */
12795+void SkDimStartModerationTimer(
12796+SK_AC *pAC) /* pointer to adapter control context */
12797+{
12798+ SK_EVPARA EventParam; /* Event struct for timer event */
12799+
12800+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
12801+ ("==> SkDimStartModerationTimer\n"));
12802
12803- if (!IsIntModEnabled(pAC)) {
12804- if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
12805- CurrSysLoad = GetCurrentSystemLoad(pAC);
12806- if (CurrSysLoad > 75) {
12807- /*
12808- ** More than 75% total system load! Enable the moderation
12809- ** to shield the system against too many interrupts.
12810- */
12811- EnableIntMod(pAC);
12812- } else if (CurrSysLoad > M_DIMINFO.PrevSysLoad) {
12813- LoadIncrease = (CurrSysLoad - M_DIMINFO.PrevSysLoad);
12814- if (LoadIncrease > ((M_DIMINFO.PrevSysLoad *
12815- C_INT_MOD_ENABLE_PERCENTAGE) / 100)) {
12816- if (CurrSysLoad > 10) {
12817- /*
12818- ** More than 50% increase with respect to the
12819- ** previous load of the system. Most likely this
12820- ** is due to our ISR-proc...
12821- */
12822- EnableIntMod(pAC);
12823- }
12824- }
12825- } else {
12826- /*
12827- ** Neither too much system load at all nor too much increase
12828- ** with respect to the previous system load. Hence, we can leave
12829- ** the ISR-handling like it is without enabling moderation.
12830- */
12831- }
12832- M_DIMINFO.PrevSysLoad = CurrSysLoad;
12833- }
12834- } else {
12835- if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
12836- ThresholdInts = ((M_DIMINFO.MaxModIntsPerSec *
12837- C_INT_MOD_DISABLE_PERCENTAGE) / 100);
12838- IsrCallsPerSec = GetIsrCalls(pAC);
12839- if (IsrCallsPerSec <= ThresholdInts) {
12840- /*
12841- ** The number of interrupts within the last second is
12842- ** lower than the disable_percentage of the desried
12843- ** maxrate. Therefore we can disable the moderation.
12844- */
12845- DisableIntMod(pAC);
12846- M_DIMINFO.MaxModIntsPerSec =
12847- (M_DIMINFO.MaxModIntsPerSecUpperLimit +
12848- M_DIMINFO.MaxModIntsPerSecLowerLimit) / 2;
12849- } else {
12850- /*
12851- ** The number of interrupts per sec is the same as expected.
12852- ** Evalulate the descriptor-ratio. If it has changed, a resize
12853- ** in the moderation timer might be useful
12854- */
12855- if (M_DIMINFO.AutoSizing) {
12856- ResizeDimTimerDuration(pAC);
12857- }
12858- }
12859- }
12860- }
12861-
12862- /*
12863- ** Some information to the log...
12864- */
12865- if (M_DIMINFO.DisplayStats) {
12866- DisplaySelectedModerationType(pAC);
12867- DisplaySelectedModerationMask(pAC);
12868- DisplayDescrRatio(pAC);
12869- }
12870+ if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
12871+ SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam));
12872+ EventParam.Para32[0] = SK_DRV_MODERATION_TIMER;
12873+ SkTimerStart(pAC, pAC->IoBase,
12874+ &pAC->DynIrqModInfo.ModTimer,
12875+ pAC->DynIrqModInfo.DynIrqModSampleInterval * 1000000,
12876+ SKGE_DRV, SK_DRV_TIMER, EventParam);
12877+ }
12878
12879- M_DIMINFO.NbrProcessedDescr = 0;
12880- SetCurrIntCtr(pAC);
12881+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
12882+ ("<== SkDimStartModerationTimer\n"));
12883 }
12884
12885-/*******************************************************************************
12886-** Function : SkDimStartModerationTimer
12887-** Description : Starts the audit-timer for the dynamic interrupt moderation
12888-** Programmer : Ralph Roesler
12889-** Last Modified: 22-mar-03
12890-** Returns : void (!)
12891-** Notes : -
12892-*******************************************************************************/
12893-
12894-void
12895-SkDimStartModerationTimer(SK_AC *pAC) {
12896- SK_EVPARA EventParam; /* Event struct for timer event */
12897-
12898- SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam));
12899- EventParam.Para32[0] = SK_DRV_MODERATION_TIMER;
12900- SkTimerStart(pAC, pAC->IoBase, &pAC->DynIrqModInfo.ModTimer,
12901- SK_DRV_MODERATION_TIMER_LENGTH,
12902- SKGE_DRV, SK_DRV_TIMER, EventParam);
12903-}
12904+/*****************************************************************************
12905+ *
12906+ * SkDimEnableModerationIfNeeded - Enables or disables any moderationtype
12907+ *
12908+ * Description:
12909+ * This function effectively initializes the IRQ moderation of a network
12910+ * adapter. Depending on the configuration, this might be either static
12911+ * or dynamic. If no moderation is configured, this function will do
12912+ * nothing.
12913+ *
12914+ * Returns: N/A
12915+ */
12916+void SkDimEnableModerationIfNeeded(
12917+SK_AC *pAC) /* pointer to adapter control context */
12918+{
12919+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
12920+ ("==> SkDimEnableModerationIfNeeded\n"));
12921+
12922+ if (M_DIMINFO.IntModTypeSelect != C_INT_MOD_NONE) {
12923+ if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_STATIC) {
12924+ enableIntMod(pAC);
12925+ } else { /* must be C_INT_MOD_DYNAMIC */
12926+ SkDimStartModerationTimer(pAC);
12927+ }
12928+ }
12929
12930-/*******************************************************************************
12931-** Function : SkDimEnableModerationIfNeeded
12932-** Description : Either enables or disables moderation
12933-** Programmer : Ralph Roesler
12934-** Last Modified: 22-mar-03
12935-** Returns : void (!)
12936-** Notes : This function is called when a particular adapter is opened
12937-** There is no Disable function, because when all interrupts
12938-** might be disable, the moderation timer has no meaning at all
12939-******************************************************************************/
12940-
12941-void
12942-SkDimEnableModerationIfNeeded(SK_AC *pAC) {
12943-
12944- if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_STATIC) {
12945- EnableIntMod(pAC); /* notification print in this function */
12946- } else if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
12947- SkDimStartModerationTimer(pAC);
12948- if (M_DIMINFO.DisplayStats) {
12949- printk("Dynamic moderation has been enabled\n");
12950- }
12951- } else {
12952- if (M_DIMINFO.DisplayStats) {
12953- printk("No moderation has been enabled\n");
12954- }
12955- }
12956+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
12957+ ("<== SkDimEnableModerationIfNeeded\n"));
12958 }
12959
12960-/*******************************************************************************
12961-** Function : SkDimDisplayModerationSettings
12962-** Description : Displays the current settings regaring interrupt moderation
12963-** Programmer : Ralph Roesler
12964-** Last Modified: 22-mar-03
12965-** Returns : void (!)
12966-** Notes : -
12967-*******************************************************************************/
12968-
12969-void
12970-SkDimDisplayModerationSettings(SK_AC *pAC) {
12971- DisplaySelectedModerationType(pAC);
12972- DisplaySelectedModerationMask(pAC);
12973-}
12974+/*****************************************************************************
12975+ *
12976+ * SkDimDisableModeration - disables moderation if it is enabled
12977+ *
12978+ * Description:
12979+ * Disabling of the moderation requires that is enabled already.
12980+ *
12981+ * Returns: N/A
12982+ */
12983+void SkDimDisableModeration(
12984+SK_AC *pAC, /* pointer to adapter control context */
12985+int CurrentModeration) /* type of current moderation */
12986+{
12987+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
12988+ ("==> SkDimDisableModeration\n"));
12989+
12990+ if (M_DIMINFO.IntModTypeSelect != C_INT_MOD_NONE) {
12991+ if (CurrentModeration == C_INT_MOD_STATIC) {
12992+ disableIntMod(pAC);
12993+ } else { /* must be C_INT_MOD_DYNAMIC */
12994+ SkTimerStop(pAC, pAC->IoBase, &M_DIMINFO.ModTimer);
12995+ disableIntMod(pAC);
12996+ }
12997+ }
12998
12999-/*******************************************************************************
13000-**
13001-** Local functions
13002-**
13003-*******************************************************************************/
13004+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
13005+ ("<== SkDimDisableModeration\n"));
13006+}
13007
13008-/*******************************************************************************
13009-** Function : GetCurrentSystemLoad
13010-** Description : Retrieves the current system load of the system. This load
13011-** is evaluated for all processors within the system.
13012-** Programmer : Ralph Roesler
13013-** Last Modified: 22-mar-03
13014-** Returns : unsigned int: load expressed in percentage
13015-** Notes : The possible range being returned is from 0 up to 100.
13016-** Whereas 0 means 'no load at all' and 100 'system fully loaded'
13017-** It is impossible to determine what actually causes the system
13018-** to be in 100%, but maybe that is due to too much interrupts.
13019-*******************************************************************************/
13020-
13021-static unsigned int
13022-GetCurrentSystemLoad(SK_AC *pAC) {
13023- unsigned long jif = jiffies;
13024- unsigned int UserTime = 0;
13025- unsigned int SystemTime = 0;
13026- unsigned int NiceTime = 0;
13027- unsigned int IdleTime = 0;
13028- unsigned int TotalTime = 0;
13029- unsigned int UsedTime = 0;
13030- unsigned int SystemLoad = 0;
13031+/******************************************************************************
13032+ *
13033+ * Local Functions
13034+ *
13035+ *****************************************************************************/
13036
13037- /* unsigned int NbrCpu = 0; */
13038+/*****************************************************************************
13039+ *
13040+ * getIsrCalls - evaluate the number of IRQs handled in mod interval
13041+ *
13042+ * Description:
13043+ * Depending on the selected moderation mask, this function will return
13044+ * the number of interrupts handled in the previous moderation interval.
13045+ * This evaluated number is based on the current number of interrupts
13046+ * stored in PNMI-context and the previous stored interrupts.
13047+ *
13048+ * Returns:
13049+ * the number of IRQs handled
13050+ */
13051+static SK_U64 getIsrCalls(
13052+SK_AC *pAC) /* pointer to adapter control context */
13053+{
13054+ SK_U64 RxPort0IntDiff = 0, RxPort1IntDiff = 0;
13055+ SK_U64 TxPort0IntDiff = 0, TxPort1IntDiff = 0;
13056+ SK_U64 StatusPort0IntDiff = 0, StatusPort1IntDiff = 0;
13057+
13058+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==>getIsrCalls\n"));
13059+
13060+ if (!CHIP_ID_YUKON_2(pAC)) {
13061+ if ((M_DIMINFO.MaskIrqModeration == IRQ_MASK_TX_ONLY) ||
13062+ (M_DIMINFO.MaskIrqModeration == IRQ_MASK_SP_TX)) {
13063+ if (pAC->GIni.GIMacsFound == 2) {
13064+ TxPort1IntDiff =
13065+ pAC->Pnmi.Port[1].TxIntrCts -
13066+ M_DIMINFO.PrevPort1TxIntrCts;
13067+ }
13068+ TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts -
13069+ M_DIMINFO.PrevPort0TxIntrCts;
13070+ } else if ((M_DIMINFO.MaskIrqModeration == IRQ_MASK_RX_ONLY) ||
13071+ (M_DIMINFO.MaskIrqModeration == IRQ_MASK_SP_RX)) {
13072+ if (pAC->GIni.GIMacsFound == 2) {
13073+ RxPort1IntDiff =
13074+ pAC->Pnmi.Port[1].RxIntrCts -
13075+ M_DIMINFO.PrevPort1RxIntrCts;
13076+ }
13077+ RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts -
13078+ M_DIMINFO.PrevPort0RxIntrCts;
13079+ } else {
13080+ if (pAC->GIni.GIMacsFound == 2) {
13081+ RxPort1IntDiff =
13082+ pAC->Pnmi.Port[1].RxIntrCts -
13083+ M_DIMINFO.PrevPort1RxIntrCts;
13084+ TxPort1IntDiff =
13085+ pAC->Pnmi.Port[1].TxIntrCts -
13086+ M_DIMINFO.PrevPort1TxIntrCts;
13087+ }
13088+ RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts -
13089+ M_DIMINFO.PrevPort0RxIntrCts;
13090+ TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts -
13091+ M_DIMINFO.PrevPort0TxIntrCts;
13092+ }
13093+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
13094+ ("==>getIsrCalls (!CHIP_ID_YUKON_2)\n"));
13095+ return (RxPort0IntDiff + RxPort1IntDiff +
13096+ TxPort0IntDiff + TxPort1IntDiff);
13097+ }
13098
13099 /*
13100- ** The following lines have been commented out, because
13101- ** from kernel 2.5.44 onwards, the kernel-owned structure
13102- **
13103- ** struct kernel_stat kstat
13104- **
13105- ** is not marked as an exported symbol in the file
13106+ ** We have a Yukon2 compliant chipset if we come up to here
13107 **
13108- ** kernel/ksyms.c
13109- **
13110- ** As a consequence, using this driver as KLM is not possible
13111- ** and any access of the structure kernel_stat via the
13112- ** dedicated macros kstat_cpu(i).cpustat.xxx is to be avoided.
13113- **
13114- ** The kstat-information might be added again in future
13115- ** versions of the 2.5.xx kernel, but for the time being,
13116- ** number of interrupts will serve as indication how much
13117- ** load we currently have...
13118- **
13119- ** for (NbrCpu = 0; NbrCpu < num_online_cpus(); NbrCpu++) {
13120- ** UserTime = UserTime + kstat_cpu(NbrCpu).cpustat.user;
13121- ** NiceTime = NiceTime + kstat_cpu(NbrCpu).cpustat.nice;
13122- ** SystemTime = SystemTime + kstat_cpu(NbrCpu).cpustat.system;
13123- ** }
13124+ if (pAC->GIni.GIMacsFound == 2) {
13125+ StatusPort1IntDiff = pAC->Pnmi.Port[1].StatusLeIntrCts -
13126+ M_DIMINFO.PrevPort1StatusIntrCts;
13127+ }
13128+ StatusPort0IntDiff = pAC->Pnmi.Port[0].StatusLeIntrCts -
13129+ M_DIMINFO.PrevPort0StatusIntrCts;
13130 */
13131- SK_U64 ThresholdInts = 0;
13132- SK_U64 IsrCallsPerSec = 0;
13133-
13134- ThresholdInts = ((M_DIMINFO.MaxModIntsPerSec *
13135- C_INT_MOD_ENABLE_PERCENTAGE) + 100);
13136- IsrCallsPerSec = GetIsrCalls(pAC);
13137- if (IsrCallsPerSec >= ThresholdInts) {
13138- /*
13139- ** We do not know how much the real CPU-load is!
13140- ** Return 80% as a default in order to activate DIM
13141- */
13142- SystemLoad = 80;
13143- return (SystemLoad);
13144- }
13145-
13146- UsedTime = UserTime + NiceTime + SystemTime;
13147-
13148- IdleTime = jif * num_online_cpus() - UsedTime;
13149- TotalTime = UsedTime + IdleTime;
13150-
13151- SystemLoad = ( 100 * (UsedTime - M_DIMINFO.PrevUsedTime) ) /
13152- (TotalTime - M_DIMINFO.PrevTotalTime);
13153+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
13154+ ("==>getIsrCalls (CHIP_ID_YUKON_2)\n"));
13155+ return (StatusPort0IntDiff + StatusPort1IntDiff);
13156+}
13157
13158- if (M_DIMINFO.DisplayStats) {
13159- printk("Current system load is: %u\n", SystemLoad);
13160+/*****************************************************************************
13161+ *
13162+ * setCurrIntCtr - stores the current number of interrupts
13163+ *
13164+ * Description:
13165+ * Stores the current number of occurred interrupts in the adapter
13166+ * context. This is needed to evaluate the umber of interrupts within
13167+ * the moderation interval.
13168+ *
13169+ * Returns: N/A
13170+ *
13171+ */
13172+static void setCurrIntCtr(
13173+SK_AC *pAC) /* pointer to adapter control context */
13174+{
13175+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==>setCurrIntCtr\n"));
13176+
13177+ if (!CHIP_ID_YUKON_2(pAC)) {
13178+ if (pAC->GIni.GIMacsFound == 2) {
13179+ M_DIMINFO.PrevPort1RxIntrCts = pAC->Pnmi.Port[1].RxIntrCts;
13180+ M_DIMINFO.PrevPort1TxIntrCts = pAC->Pnmi.Port[1].TxIntrCts;
13181+ }
13182+ M_DIMINFO.PrevPort0RxIntrCts = pAC->Pnmi.Port[0].RxIntrCts;
13183+ M_DIMINFO.PrevPort0TxIntrCts = pAC->Pnmi.Port[0].TxIntrCts;
13184+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
13185+ ("<== setCurrIntCtr (!CHIP_ID_YUKON_2)\n"));
13186+ return;
13187 }
13188
13189- M_DIMINFO.PrevTotalTime = TotalTime;
13190- M_DIMINFO.PrevUsedTime = UsedTime;
13191-
13192- return (SystemLoad);
13193+ /*
13194+ ** We have a Yukon2 compliant chipset if we come up to here
13195+ **
13196+ if (pAC->GIni.GIMacsFound == 2) {
13197+ M_DIMINFO.PrevPort1StatusIntrCts = pAC->Pnmi.Port[1].StatusLeIntrCts;
13198+ }
13199+ M_DIMINFO.PrevPort0StatusIntrCts = pAC->Pnmi.Port[0].StatusLeIntrCts;
13200+ */
13201+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
13202+ ("<== setCurrIntCtr (CHIP_ID_YUKON_2)\n"));
13203 }
13204
13205-/*******************************************************************************
13206-** Function : GetIsrCalls
13207-** Description : Depending on the selected moderation mask, this function will
13208-** return the number of interrupts handled in the previous time-
13209-** frame. This evaluated number is based on the current number
13210-** of interrupts stored in PNMI-context and the previous stored
13211-** interrupts.
13212-** Programmer : Ralph Roesler
13213-** Last Modified: 23-mar-03
13214-** Returns : int: the number of interrupts being executed in the last
13215-** timeframe
13216-** Notes : It makes only sense to call this function, when dynamic
13217-** interrupt moderation is applied
13218-*******************************************************************************/
13219-
13220-static SK_U64
13221-GetIsrCalls(SK_AC *pAC) {
13222- SK_U64 RxPort0IntDiff = 0;
13223- SK_U64 RxPort1IntDiff = 0;
13224- SK_U64 TxPort0IntDiff = 0;
13225- SK_U64 TxPort1IntDiff = 0;
13226-
13227- if (pAC->DynIrqModInfo.MaskIrqModeration == IRQ_MASK_TX_ONLY) {
13228- if (pAC->GIni.GIMacsFound == 2) {
13229- TxPort1IntDiff = pAC->Pnmi.Port[1].TxIntrCts -
13230- pAC->DynIrqModInfo.PrevPort1TxIntrCts;
13231- }
13232- TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts -
13233- pAC->DynIrqModInfo.PrevPort0TxIntrCts;
13234- } else if (pAC->DynIrqModInfo.MaskIrqModeration == IRQ_MASK_RX_ONLY) {
13235- if (pAC->GIni.GIMacsFound == 2) {
13236- RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts -
13237- pAC->DynIrqModInfo.PrevPort1RxIntrCts;
13238- }
13239- RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts -
13240- pAC->DynIrqModInfo.PrevPort0RxIntrCts;
13241- } else {
13242- if (pAC->GIni.GIMacsFound == 2) {
13243- RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts -
13244- pAC->DynIrqModInfo.PrevPort1RxIntrCts;
13245- TxPort1IntDiff = pAC->Pnmi.Port[1].TxIntrCts -
13246- pAC->DynIrqModInfo.PrevPort1TxIntrCts;
13247- }
13248- RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts -
13249- pAC->DynIrqModInfo.PrevPort0RxIntrCts;
13250- TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts -
13251- pAC->DynIrqModInfo.PrevPort0TxIntrCts;
13252- }
13253-
13254- return (RxPort0IntDiff + RxPort1IntDiff + TxPort0IntDiff + TxPort1IntDiff);
13255+/*****************************************************************************
13256+ *
13257+ * isIntModEnabled - returns the current state of interrupt moderation
13258+ *
13259+ * Description:
13260+ * This function retrieves the current value of the interrupt moderation
13261+ * command register. Its content determines whether any moderation is
13262+ * running or not.
13263+ *
13264+ * Returns:
13265+ * SK_TRUE : IRQ moderation is currently active
13266+ * SK_FALSE: No IRQ moderation is active
13267+ */
13268+static SK_BOOL isIntModEnabled(
13269+SK_AC *pAC) /* pointer to adapter control context */
13270+{
13271+ unsigned long CtrCmd;
13272+
13273+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==>isIntModEnabled\n"));
13274+
13275+ SK_IN32(pAC->IoBase, B2_IRQM_CTRL, &CtrCmd);
13276+ if ((CtrCmd & TIM_START) == TIM_START) {
13277+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
13278+ ("<== isIntModEnabled (SK_TRUE)\n"));
13279+ return SK_TRUE;
13280+ }
13281+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,
13282+ ("<== isIntModEnabled (SK_FALSE)\n"));
13283+ return SK_FALSE;
13284 }
13285
13286-/*******************************************************************************
13287-** Function : GetRxCalls
13288-** Description : This function will return the number of times a receive inter-
13289-** rupt was processed. This is needed to evaluate any resizing
13290-** factor.
13291-** Programmer : Ralph Roesler
13292-** Last Modified: 23-mar-03
13293-** Returns : SK_U64: the number of RX-ints being processed
13294-** Notes : It makes only sense to call this function, when dynamic
13295-** interrupt moderation is applied
13296-*******************************************************************************/
13297-
13298-static SK_U64
13299-GetRxCalls(SK_AC *pAC) {
13300- SK_U64 RxPort0IntDiff = 0;
13301- SK_U64 RxPort1IntDiff = 0;
13302-
13303- if (pAC->GIni.GIMacsFound == 2) {
13304- RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts -
13305- pAC->DynIrqModInfo.PrevPort1RxIntrCts;
13306- }
13307- RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts -
13308- pAC->DynIrqModInfo.PrevPort0RxIntrCts;
13309-
13310- return (RxPort0IntDiff + RxPort1IntDiff);
13311-}
13312+/*****************************************************************************
13313+ *
13314+ * enableIntMod - enables the interrupt moderation
13315+ *
13316+ * Description:
13317+ * Enabling the interrupt moderation is done by putting the desired
13318+ * moderation interval in the B2_IRQM_INI register, specifying the
13319+ * desired maks in the B2_IRQM_MSK register and finally starting the
13320+ * IRQ moderation timer using the B2_IRQM_CTRL register.
13321+ *
13322+ * Returns: N/A
13323+ *
13324+ */
13325+static void enableIntMod(
13326+SK_AC *pAC) /* pointer to adapter control context */
13327+{
13328+ unsigned long ModBase;
13329+
13330+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==> enableIntMod\n"));
13331+
13332+ if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {
13333+ ModBase = C_CLK_FREQ_GENESIS / M_DIMINFO.MaxModIntsPerSec;
13334+ } else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) {
13335+ ModBase = C_CLK_FREQ_YUKON_EC / M_DIMINFO.MaxModIntsPerSec;
13336+ } else {
13337+ ModBase = C_CLK_FREQ_YUKON / M_DIMINFO.MaxModIntsPerSec;
13338+ }
13339
13340-/*******************************************************************************
13341-** Function : SetCurrIntCtr
13342-** Description : Will store the current number orf occured interrupts in the
13343-** adapter context. This is needed to evaluated the number of
13344-** interrupts within a current timeframe.
13345-** Programmer : Ralph Roesler
13346-** Last Modified: 23-mar-03
13347-** Returns : void (!)
13348-** Notes : -
13349-*******************************************************************************/
13350-
13351-static void
13352-SetCurrIntCtr(SK_AC *pAC) {
13353- if (pAC->GIni.GIMacsFound == 2) {
13354- pAC->DynIrqModInfo.PrevPort1RxIntrCts = pAC->Pnmi.Port[1].RxIntrCts;
13355- pAC->DynIrqModInfo.PrevPort1TxIntrCts = pAC->Pnmi.Port[1].TxIntrCts;
13356- }
13357- pAC->DynIrqModInfo.PrevPort0RxIntrCts = pAC->Pnmi.Port[0].RxIntrCts;
13358- pAC->DynIrqModInfo.PrevPort0TxIntrCts = pAC->Pnmi.Port[0].TxIntrCts;
13359-}
13360+ SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase);
13361+ SK_OUT32(pAC->IoBase, B2_IRQM_MSK, M_DIMINFO.MaskIrqModeration);
13362+ SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START);
13363
13364-/*******************************************************************************
13365-** Function : IsIntModEnabled()
13366-** Description : Retrieves the current value of the interrupts moderation
13367-** command register. Its content determines whether any
13368-** moderation is running or not.
13369-** Programmer : Ralph Roesler
13370-** Last Modified: 23-mar-03
13371-** Returns : SK_TRUE : if mod timer running
13372-** SK_FALSE : if no moderation is being performed
13373-** Notes : -
13374-*******************************************************************************/
13375-
13376-static SK_BOOL
13377-IsIntModEnabled(SK_AC *pAC) {
13378- unsigned long CtrCmd;
13379-
13380- SK_IN32(pAC->IoBase, B2_IRQM_CTRL, &CtrCmd);
13381- if ((CtrCmd & TIM_START) == TIM_START) {
13382- return SK_TRUE;
13383- } else {
13384- return SK_FALSE;
13385- }
13386+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("<== enableIntMod\n"));
13387 }
13388
13389-/*******************************************************************************
13390-** Function : EnableIntMod()
13391-** Description : Enables the interrupt moderation using the values stored in
13392-** in the pAC->DynIntMod data structure
13393-** Programmer : Ralph Roesler
13394-** Last Modified: 22-mar-03
13395-** Returns : -
13396-** Notes : -
13397-*******************************************************************************/
13398-
13399-static void
13400-EnableIntMod(SK_AC *pAC) {
13401- unsigned long ModBase;
13402-
13403- if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {
13404- ModBase = C_CLK_FREQ_GENESIS / pAC->DynIrqModInfo.MaxModIntsPerSec;
13405- } else {
13406- ModBase = C_CLK_FREQ_YUKON / pAC->DynIrqModInfo.MaxModIntsPerSec;
13407- }
13408-
13409- SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase);
13410- SK_OUT32(pAC->IoBase, B2_IRQM_MSK, pAC->DynIrqModInfo.MaskIrqModeration);
13411- SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START);
13412- if (M_DIMINFO.DisplayStats) {
13413- printk("Enabled interrupt moderation (%i ints/sec)\n",
13414- M_DIMINFO.MaxModIntsPerSec);
13415- }
13416-}
13417+/*****************************************************************************
13418+ *
13419+ * disableIntMod - disables the interrupt moderation
13420+ *
13421+ * Description:
13422+ * Disabling the interrupt moderation is done by stopping the
13423+ * IRQ moderation timer using the B2_IRQM_CTRL register.
13424+ *
13425+ * Returns: N/A
13426+ *
13427+ */
13428+static void disableIntMod(
13429+SK_AC *pAC) /* pointer to adapter control context */
13430+{
13431+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("==> disableIntMod\n"));
13432
13433-/*******************************************************************************
13434-** Function : DisableIntMod()
13435-** Description : Disbles the interrupt moderation independent of what inter-
13436-** rupts are running or not
13437-** Programmer : Ralph Roesler
13438-** Last Modified: 23-mar-03
13439-** Returns : -
13440-** Notes : -
13441-*******************************************************************************/
13442-
13443-static void
13444-DisableIntMod(SK_AC *pAC) {
13445-
13446- SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_STOP);
13447- if (M_DIMINFO.DisplayStats) {
13448- printk("Disabled interrupt moderation\n");
13449- }
13450-}
13451+ SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_STOP);
13452
13453-/*******************************************************************************
13454-** Function : ResizeDimTimerDuration();
13455-** Description : Checks the current used descriptor ratio and resizes the
13456-** duration timer (longer/smaller) if possible.
13457-** Programmer : Ralph Roesler
13458-** Last Modified: 23-mar-03
13459-** Returns : -
13460-** Notes : There are both maximum and minimum timer duration value.
13461-** This function assumes that interrupt moderation is already
13462-** enabled!
13463-*******************************************************************************/
13464-
13465-static void
13466-ResizeDimTimerDuration(SK_AC *pAC) {
13467- SK_BOOL IncreaseTimerDuration;
13468- int TotalMaxNbrDescr;
13469- int UsedDescrRatio;
13470- int RatioDiffAbs;
13471- int RatioDiffRel;
13472- int NewMaxModIntsPerSec;
13473- int ModAdjValue;
13474- long ModBase;
13475-
13476- /*
13477- ** Check first if we are allowed to perform any modification
13478- */
13479- if (IsIntModEnabled(pAC)) {
13480- if (M_DIMINFO.IntModTypeSelect != C_INT_MOD_DYNAMIC) {
13481- return;
13482- } else {
13483- if (M_DIMINFO.ModJustEnabled) {
13484- M_DIMINFO.ModJustEnabled = SK_FALSE;
13485- return;
13486- }
13487- }
13488- }
13489-
13490- /*
13491- ** If we got until here, we have to evaluate the amount of the
13492- ** descriptor ratio change...
13493- */
13494- TotalMaxNbrDescr = pAC->RxDescrPerRing * GetRxCalls(pAC);
13495- UsedDescrRatio = (M_DIMINFO.NbrProcessedDescr * 100) / TotalMaxNbrDescr;
13496-
13497- if (UsedDescrRatio > M_DIMINFO.PrevUsedDescrRatio) {
13498- RatioDiffAbs = (UsedDescrRatio - M_DIMINFO.PrevUsedDescrRatio);
13499- RatioDiffRel = (RatioDiffAbs * 100) / UsedDescrRatio;
13500- M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio;
13501- IncreaseTimerDuration = SK_FALSE; /* in other words: DECREASE */
13502- } else if (UsedDescrRatio < M_DIMINFO.PrevUsedDescrRatio) {
13503- RatioDiffAbs = (M_DIMINFO.PrevUsedDescrRatio - UsedDescrRatio);
13504- RatioDiffRel = (RatioDiffAbs * 100) / M_DIMINFO.PrevUsedDescrRatio;
13505- M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio;
13506- IncreaseTimerDuration = SK_TRUE; /* in other words: INCREASE */
13507- } else {
13508- RatioDiffAbs = (M_DIMINFO.PrevUsedDescrRatio - UsedDescrRatio);
13509- RatioDiffRel = (RatioDiffAbs * 100) / M_DIMINFO.PrevUsedDescrRatio;
13510- M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio;
13511- IncreaseTimerDuration = SK_TRUE; /* in other words: INCREASE */
13512- }
13513-
13514- /*
13515- ** Now we can determine the change in percent
13516- */
13517- if ((RatioDiffRel >= 0) && (RatioDiffRel <= 5) ) {
13518- ModAdjValue = 1; /* 1% change - maybe some other value in future */
13519- } else if ((RatioDiffRel > 5) && (RatioDiffRel <= 10) ) {
13520- ModAdjValue = 1; /* 1% change - maybe some other value in future */
13521- } else if ((RatioDiffRel > 10) && (RatioDiffRel <= 15) ) {
13522- ModAdjValue = 1; /* 1% change - maybe some other value in future */
13523- } else {
13524- ModAdjValue = 1; /* 1% change - maybe some other value in future */
13525- }
13526-
13527- if (IncreaseTimerDuration) {
13528- NewMaxModIntsPerSec = M_DIMINFO.MaxModIntsPerSec +
13529- (M_DIMINFO.MaxModIntsPerSec * ModAdjValue) / 100;
13530- } else {
13531- NewMaxModIntsPerSec = M_DIMINFO.MaxModIntsPerSec -
13532- (M_DIMINFO.MaxModIntsPerSec * ModAdjValue) / 100;
13533- }
13534-
13535- /*
13536- ** Check if we exceed boundaries...
13537- */
13538- if ( (NewMaxModIntsPerSec > M_DIMINFO.MaxModIntsPerSecUpperLimit) ||
13539- (NewMaxModIntsPerSec < M_DIMINFO.MaxModIntsPerSecLowerLimit)) {
13540- if (M_DIMINFO.DisplayStats) {
13541- printk("Cannot change ModTim from %i to %i ints/sec\n",
13542- M_DIMINFO.MaxModIntsPerSec, NewMaxModIntsPerSec);
13543- }
13544- return;
13545- } else {
13546- if (M_DIMINFO.DisplayStats) {
13547- printk("Resized ModTim from %i to %i ints/sec\n",
13548- M_DIMINFO.MaxModIntsPerSec, NewMaxModIntsPerSec);
13549- }
13550- }
13551-
13552- M_DIMINFO.MaxModIntsPerSec = NewMaxModIntsPerSec;
13553-
13554- if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {
13555- ModBase = C_CLK_FREQ_GENESIS / pAC->DynIrqModInfo.MaxModIntsPerSec;
13556- } else {
13557- ModBase = C_CLK_FREQ_YUKON / pAC->DynIrqModInfo.MaxModIntsPerSec;
13558- }
13559-
13560- /*
13561- ** We do not need to touch any other registers
13562- */
13563- SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase);
13564+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_MSG,("<== disableIntMod\n"));
13565 }
13566
13567 /*******************************************************************************
13568-** Function : DisplaySelectedModerationType()
13569-** Description : Displays what type of moderation we have
13570-** Programmer : Ralph Roesler
13571-** Last Modified: 23-mar-03
13572-** Returns : void!
13573-** Notes : -
13574-*******************************************************************************/
13575-
13576-static void
13577-DisplaySelectedModerationType(SK_AC *pAC) {
13578-
13579- if (pAC->DynIrqModInfo.DisplayStats) {
13580- if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) {
13581- printk("Static int moderation runs with %i INTS/sec\n",
13582- pAC->DynIrqModInfo.MaxModIntsPerSec);
13583- } else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
13584- if (IsIntModEnabled(pAC)) {
13585- printk("Dynamic int moderation runs with %i INTS/sec\n",
13586- pAC->DynIrqModInfo.MaxModIntsPerSec);
13587- } else {
13588- printk("Dynamic int moderation currently not applied\n");
13589- }
13590- } else {
13591- printk("No interrupt moderation selected!\n");
13592- }
13593- }
13594-}
13595-
13596-/*******************************************************************************
13597-** Function : DisplaySelectedModerationMask()
13598-** Description : Displays what interrupts are moderated
13599-** Programmer : Ralph Roesler
13600-** Last Modified: 23-mar-03
13601-** Returns : void!
13602-** Notes : -
13603-*******************************************************************************/
13604-
13605-static void
13606-DisplaySelectedModerationMask(SK_AC *pAC) {
13607-
13608- if (pAC->DynIrqModInfo.DisplayStats) {
13609- if (pAC->DynIrqModInfo.IntModTypeSelect != C_INT_MOD_NONE) {
13610- switch (pAC->DynIrqModInfo.MaskIrqModeration) {
13611- case IRQ_MASK_TX_ONLY:
13612- printk("Only Tx-interrupts are moderated\n");
13613- break;
13614- case IRQ_MASK_RX_ONLY:
13615- printk("Only Rx-interrupts are moderated\n");
13616- break;
13617- case IRQ_MASK_SP_ONLY:
13618- printk("Only special-interrupts are moderated\n");
13619- break;
13620- case IRQ_MASK_TX_RX:
13621- printk("Tx- and Rx-interrupts are moderated\n");
13622- break;
13623- case IRQ_MASK_SP_RX:
13624- printk("Special- and Rx-interrupts are moderated\n");
13625- break;
13626- case IRQ_MASK_SP_TX:
13627- printk("Special- and Tx-interrupts are moderated\n");
13628- break;
13629- case IRQ_MASK_RX_TX_SP:
13630- printk("All Rx-, Tx and special-interrupts are moderated\n");
13631- break;
13632- default:
13633- printk("Don't know what is moderated\n");
13634- break;
13635- }
13636- } else {
13637- printk("No specific interrupts masked for moderation\n");
13638- }
13639- }
13640-}
13641-
13642-/*******************************************************************************
13643-** Function : DisplayDescrRatio
13644-** Description : Like the name states...
13645-** Programmer : Ralph Roesler
13646-** Last Modified: 23-mar-03
13647-** Returns : void!
13648-** Notes : -
13649-*******************************************************************************/
13650-
13651-static void
13652-DisplayDescrRatio(SK_AC *pAC) {
13653- int TotalMaxNbrDescr = 0;
13654-
13655- if (pAC->DynIrqModInfo.DisplayStats) {
13656- TotalMaxNbrDescr = pAC->RxDescrPerRing * GetRxCalls(pAC);
13657- printk("Ratio descriptors: %i/%i\n",
13658- M_DIMINFO.NbrProcessedDescr, TotalMaxNbrDescr);
13659- }
13660-}
13661-
13662-/*******************************************************************************
13663-**
13664-** End of file
13665-**
13666-*******************************************************************************/
13667+ *
13668+ * End of file
13669+ *
13670+ ******************************************************************************/
13671diff -ruN linux/drivers/net/sk98lin/skethtool.c linux-new/drivers/net/sk98lin/skethtool.c
13672--- linux/drivers/net/sk98lin/skethtool.c 2006-04-11 19:19:28.000000000 +0200
13673+++ linux-new/drivers/net/sk98lin/skethtool.c 2006-01-18 14:37:24.000000000 +0100
13674@@ -2,8 +2,8 @@
13675 *
13676 * Name: skethtool.c
13677 * Project: GEnesis, PCI Gigabit Ethernet Adapter
13678- * Version: $Revision$
13679- * Date: $Date$
13680+ * Version: $Revision$
13681+ * Date: $Date$
13682 * Purpose: All functions regarding ethtool handling
13683 *
13684 ******************************************************************************/
13685@@ -11,7 +11,7 @@
13686 /******************************************************************************
13687 *
13688 * (C)Copyright 1998-2002 SysKonnect GmbH.
13689- * (C)Copyright 2002-2004 Marvell.
13690+ * (C)Copyright 2002-2005 Marvell.
13691 *
13692 * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet
13693 * Server Adapters.
13694@@ -21,9 +21,6 @@
13695 *
13696 * Address all question to: linux@syskonnect.de
13697 *
13698- * The technical manual for the adapters is available from SysKonnect's
13699- * web pages: www.syskonnect.com
13700- *
13701 * This program is free software; you can redistribute it and/or modify
13702 * it under the terms of the GNU General Public License as published by
13703 * the Free Software Foundation; either version 2 of the License, or
13704@@ -36,10 +33,18 @@
13705 #include "h/skdrv1st.h"
13706 #include "h/skdrv2nd.h"
13707 #include "h/skversion.h"
13708-
13709 #include <linux/ethtool.h>
13710+#include <linux/module.h>
13711 #include <linux/timer.h>
13712-#include <linux/delay.h>
13713+
13714+/******************************************************************************
13715+ *
13716+ * External Functions and Data
13717+ *
13718+ *****************************************************************************/
13719+
13720+extern void SkDimDisableModeration(SK_AC *pAC, int CurrentModeration);
13721+extern void SkDimEnableModerationIfNeeded(SK_AC *pAC);
13722
13723 /******************************************************************************
13724 *
13725@@ -47,6 +52,12 @@
13726 *
13727 *****************************************************************************/
13728
13729+#ifndef ETHT_STATSTRING_LEN
13730+#define ETHT_STATSTRING_LEN 32
13731+#endif
13732+
13733+#define SK98LIN_STAT(m) sizeof(((SK_AC *)0)->m),offsetof(SK_AC, m)
13734+
13735 #define SUPP_COPPER_ALL (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \
13736 SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \
13737 SUPPORTED_1000baseT_Half| SUPPORTED_1000baseT_Full| \
13738@@ -65,6 +76,454 @@
13739 ADVERTISED_FIBRE | \
13740 ADVERTISED_Autoneg)
13741
13742+/******************************************************************************
13743+ *
13744+ * Local Function Prototypes
13745+ *
13746+ *****************************************************************************/
13747+
13748+#ifdef ETHTOOL_GSET
13749+static void getSettings(SK_AC *pAC, int port, struct ethtool_cmd *ecmd);
13750+#endif
13751+#ifdef ETHTOOL_SSET
13752+static int setSettings(SK_AC *pAC, int port, struct ethtool_cmd *ecmd);
13753+#endif
13754+#ifdef ETHTOOL_GPAUSEPARAM
13755+static void getPauseParams(SK_AC *pAC, int port, struct ethtool_pauseparam *epause);
13756+#endif
13757+#ifdef ETHTOOL_SPAUSEPARAM
13758+static int setPauseParams(SK_AC *pAC, int port, struct ethtool_pauseparam *epause);
13759+#endif
13760+#ifdef ETHTOOL_GDRVINFO
13761+static void getDriverInfo(SK_AC *pAC, int port, struct ethtool_drvinfo *edrvinfo);
13762+#endif
13763+#ifdef ETHTOOL_PHYS_ID
13764+static int startLocateNIC(SK_AC *pAC, int port, struct ethtool_value *blinkSecs);
13765+static void toggleLeds(unsigned long ptr);
13766+#endif
13767+#ifdef ETHTOOL_GCOALESCE
13768+static void getModerationParams(SK_AC *pAC, int port, struct ethtool_coalesce *ecoalesc);
13769+#endif
13770+#ifdef ETHTOOL_SCOALESCE
13771+static int setModerationParams(SK_AC *pAC, int port, struct ethtool_coalesce *ecoalesc);
13772+#endif
13773+#ifdef ETHTOOL_GWOL
13774+static void getWOLsettings(SK_AC *pAC, int port, struct ethtool_wolinfo *ewol);
13775+#endif
13776+#ifdef ETHTOOL_SWOL
13777+static int setWOLsettings(SK_AC *pAC, int port, struct ethtool_wolinfo *ewol);
13778+#endif
13779+
13780+static int getPortNumber(struct net_device *netdev, struct ifreq *ifr);
13781+
13782+/******************************************************************************
13783+ *
13784+ * Local Variables
13785+ *
13786+ *****************************************************************************/
13787+
13788+struct sk98lin_stats {
13789+ char stat_string[ETHT_STATSTRING_LEN];
13790+ int sizeof_stat;
13791+ int stat_offset;
13792+};
13793+
13794+static struct sk98lin_stats sk98lin_etht_stats_port0[] = {
13795+ { "rx_packets" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxOkCts) },
13796+ { "tx_packets" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxOkCts) },
13797+ { "rx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxOctetsOkCts) },
13798+ { "tx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxOctetsOkCts) },
13799+ { "rx_errors" , SK98LIN_STAT(PnmiStruct.InErrorsCts) },
13800+ { "tx_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxSingleCollisionCts) },
13801+ { "rx_dropped" , SK98LIN_STAT(PnmiStruct.RxNoBufCts) },
13802+ { "tx_dropped" , SK98LIN_STAT(PnmiStruct.TxNoBufCts) },
13803+ { "multicasts" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxMulticastOkCts) },
13804+ { "collisions" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxSingleCollisionCts) },
13805+ { "rx_length_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxRuntCts) },
13806+ { "rx_buffer_overflow_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxFifoOverflowCts) },
13807+ { "rx_crc_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxFcsCts) },
13808+ { "rx_frame_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxFramingCts) },
13809+ { "rx_too_short_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxShortsCts) },
13810+ { "rx_too_long_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxTooLongCts) },
13811+ { "rx_carrier_extension_errors", SK98LIN_STAT(PnmiStruct.Stat[0].StatRxCextCts) },
13812+ { "rx_symbol_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxSymbolCts) },
13813+ { "rx_llc_mac_size_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxIRLengthCts) },
13814+ { "rx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxCarrierCts) },
13815+ { "rx_jabber_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxJabberCts) },
13816+ { "rx_missed_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatRxMissedCts) },
13817+ { "tx_abort_collision_errors" , SK98LIN_STAT(stats.tx_aborted_errors) },
13818+ { "tx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxCarrierCts) },
13819+ { "tx_buffer_underrun_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxFifoUnderrunCts) },
13820+ { "tx_heartbeat_errors" , SK98LIN_STAT(PnmiStruct.Stat[0].StatTxCarrierCts) } ,
13821+ { "tx_window_errors" , SK98LIN_STAT(stats.tx_window_errors) }
13822+};
13823+
13824+static struct sk98lin_stats sk98lin_etht_stats_port1[] = {
13825+ { "rx_packets" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxOkCts) },
13826+ { "tx_packets" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxOkCts) },
13827+ { "rx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxOctetsOkCts) },
13828+ { "tx_bytes" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxOctetsOkCts) },
13829+ { "rx_errors" , SK98LIN_STAT(PnmiStruct.InErrorsCts) },
13830+ { "tx_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxSingleCollisionCts) },
13831+ { "rx_dropped" , SK98LIN_STAT(PnmiStruct.RxNoBufCts) },
13832+ { "tx_dropped" , SK98LIN_STAT(PnmiStruct.TxNoBufCts) },
13833+ { "multicasts" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxMulticastOkCts) },
13834+ { "collisions" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxSingleCollisionCts) },
13835+ { "rx_length_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxRuntCts) },
13836+ { "rx_buffer_overflow_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxFifoOverflowCts) },
13837+ { "rx_crc_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxFcsCts) },
13838+ { "rx_frame_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxFramingCts) },
13839+ { "rx_too_short_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxShortsCts) },
13840+ { "rx_too_long_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxTooLongCts) },
13841+ { "rx_carrier_extension_errors", SK98LIN_STAT(PnmiStruct.Stat[1].StatRxCextCts) },
13842+ { "rx_symbol_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxSymbolCts) },
13843+ { "rx_llc_mac_size_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxIRLengthCts) },
13844+ { "rx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxCarrierCts) },
13845+ { "rx_jabber_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxJabberCts) },
13846+ { "rx_missed_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatRxMissedCts) },
13847+ { "tx_abort_collision_errors" , SK98LIN_STAT(stats.tx_aborted_errors) },
13848+ { "tx_carrier_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxCarrierCts) },
13849+ { "tx_buffer_underrun_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxFifoUnderrunCts) },
13850+ { "tx_heartbeat_errors" , SK98LIN_STAT(PnmiStruct.Stat[1].StatTxCarrierCts) } ,
13851+ { "tx_window_errors" , SK98LIN_STAT(stats.tx_window_errors) }
13852+};
13853+
13854+#define SK98LIN_STATS_LEN sizeof(sk98lin_etht_stats_port0) / sizeof(struct sk98lin_stats)
13855+
13856+static int nbrBlinkQuarterSeconds;
13857+static int currentPortIndex;
13858+static SK_BOOL isLocateNICrunning = SK_FALSE;
13859+static SK_BOOL isDualNetCard = SK_FALSE;
13860+static SK_BOOL doSwitchLEDsOn = SK_FALSE;
13861+static SK_BOOL boardWasDown[2] = { SK_FALSE, SK_FALSE };
13862+static struct timer_list locateNICtimer;
13863+
13864+/******************************************************************************
13865+ *
13866+ * Global Functions
13867+ *
13868+ *****************************************************************************/
13869+
13870+/*****************************************************************************
13871+ *
13872+ * SkEthIoctl - IOCTL entry point for all ethtool queries
13873+ *
13874+ * Description:
13875+ * Any IOCTL request that has to deal with the ethtool command tool is
13876+ * dispatched via this function.
13877+ *
13878+ * Returns:
13879+ * ==0: everything fine, no error
13880+ * !=0: the return value is the error code of the failure
13881+ */
13882+int SkEthIoctl(
13883+struct net_device *netdev, /* the pointer to netdev structure */
13884+struct ifreq *ifr) /* what interface the request refers to? */
13885+{
13886+ DEV_NET *pNet = (DEV_NET*) netdev->priv;
13887+ SK_AC *pAC = pNet->pAC;
13888+ void *pAddr = ifr->ifr_data;
13889+ int port = getPortNumber(netdev, ifr);
13890+ SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct;
13891+ SK_U32 Size = sizeof(SK_PNMI_STRUCT_DATA);
13892+ SK_U32 cmd;
13893+ struct sk98lin_stats *sk98lin_etht_stats =
13894+ (port == 0) ? sk98lin_etht_stats_port0 : sk98lin_etht_stats_port1;
13895+
13896+ if (get_user(cmd, (uint32_t *) pAddr)) {
13897+ return -EFAULT;
13898+ }
13899+
13900+ switch(cmd) {
13901+#ifdef ETHTOOL_GSET
13902+ case ETHTOOL_GSET: {
13903+ struct ethtool_cmd ecmd = { ETHTOOL_GSET };
13904+ getSettings(pAC, port, &ecmd);
13905+ if(copy_to_user(pAddr, &ecmd, sizeof(ecmd))) {
13906+ return -EFAULT;
13907+ }
13908+ return 0;
13909+ }
13910+ break;
13911+#endif
13912+#ifdef ETHTOOL_SSET
13913+ case ETHTOOL_SSET: {
13914+ struct ethtool_cmd ecmd;
13915+ if(copy_from_user(&ecmd, pAddr, sizeof(ecmd))) {
13916+ return -EFAULT;
13917+ }
13918+ return setSettings(pAC, port, &ecmd);
13919+ }
13920+ break;
13921+#endif
13922+#ifdef ETHTOOL_GLINK
13923+ case ETHTOOL_GLINK: {
13924+ struct ethtool_value edata = { ETHTOOL_GLINK };
13925+ edata.data = netif_carrier_ok(netdev);
13926+ if (copy_to_user(pAddr, &edata, sizeof(edata)))
13927+ return -EFAULT;
13928+ return 0;
13929+ }
13930+#endif
13931+#ifdef ETHTOOL_GDRVINFO
13932+ case ETHTOOL_GDRVINFO: {
13933+ struct ethtool_drvinfo drvinfo = { ETHTOOL_GDRVINFO };
13934+ getDriverInfo(pAC, port, &drvinfo);
13935+ if(copy_to_user(pAddr, &drvinfo, sizeof(drvinfo))) {
13936+ return -EFAULT;
13937+ }
13938+ return 0;
13939+ }
13940+ break;
13941+#endif
13942+#ifdef ETHTOOL_GSTRINGS
13943+ case ETHTOOL_GSTRINGS: {
13944+ struct ethtool_gstrings gstrings = { ETHTOOL_GSTRINGS };
13945+ char *strings = NULL;
13946+ int err = 0;
13947+ if(copy_from_user(&gstrings, pAddr, sizeof(gstrings))) {
13948+ return -EFAULT;
13949+ }
13950+ switch(gstrings.string_set) {
13951+#ifdef ETHTOOL_GSTATS
13952+ case ETH_SS_STATS: {
13953+ int i;
13954+ gstrings.len = SK98LIN_STATS_LEN;
13955+ if ((strings = kmalloc(SK98LIN_STATS_LEN*ETHT_STATSTRING_LEN,GFP_KERNEL)) == NULL) {
13956+ return -ENOMEM;
13957+ }
13958+ for(i=0; i < SK98LIN_STATS_LEN; i++) {
13959+ memcpy(&strings[i * ETHT_STATSTRING_LEN],
13960+ &(sk98lin_etht_stats[i].stat_string),
13961+ ETHT_STATSTRING_LEN);
13962+ }
13963+ }
13964+ break;
13965+#endif
13966+ default:
13967+ return -EOPNOTSUPP;
13968+ }
13969+ if(copy_to_user(pAddr, &gstrings, sizeof(gstrings))) {
13970+ err = -EFAULT;
13971+ }
13972+ pAddr = (void *) ((unsigned long int) pAddr + offsetof(struct ethtool_gstrings, data));
13973+ if(!err && copy_to_user(pAddr, strings, gstrings.len * ETH_GSTRING_LEN)) {
13974+ err = -EFAULT;
13975+ }
13976+ kfree(strings);
13977+ return err;
13978+ }
13979+#endif
13980+#ifdef ETHTOOL_GSTATS
13981+ case ETHTOOL_GSTATS: {
13982+ struct {
13983+ struct ethtool_stats eth_stats;
13984+ uint64_t data[SK98LIN_STATS_LEN];
13985+ } stats = { {ETHTOOL_GSTATS, SK98LIN_STATS_LEN} };
13986+ int i;
13987+
13988+ if (netif_running(pAC->dev[port])) {
13989+ SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, port);
13990+ }
13991+ for(i = 0; i < SK98LIN_STATS_LEN; i++) {
13992+ if (netif_running(pAC->dev[port])) {
13993+ stats.data[i] = (sk98lin_etht_stats[i].sizeof_stat ==
13994+ sizeof(uint64_t)) ?
13995+ *(uint64_t *)((char *)pAC +
13996+ sk98lin_etht_stats[i].stat_offset) :
13997+ *(uint32_t *)((char *)pAC +
13998+ sk98lin_etht_stats[i].stat_offset);
13999+ } else {
14000+ stats.data[i] = (sk98lin_etht_stats[i].sizeof_stat ==
14001+ sizeof(uint64_t)) ? (uint64_t) 0 : (uint32_t) 0;
14002+ }
14003+ }
14004+ if(copy_to_user(pAddr, &stats, sizeof(stats))) {
14005+ return -EFAULT;
14006+ }
14007+ return 0;
14008+ }
14009+#endif
14010+#ifdef ETHTOOL_PHYS_ID
14011+ case ETHTOOL_PHYS_ID: {
14012+ struct ethtool_value blinkSecs;
14013+ if(copy_from_user(&blinkSecs, pAddr, sizeof(blinkSecs))) {
14014+ return -EFAULT;
14015+ }
14016+ return startLocateNIC(pAC, port, &blinkSecs);
14017+ }
14018+#endif
14019+#ifdef ETHTOOL_GPAUSEPARAM
14020+ case ETHTOOL_GPAUSEPARAM: {
14021+ struct ethtool_pauseparam epause = { ETHTOOL_GPAUSEPARAM };
14022+ getPauseParams(pAC, port, &epause);
14023+ if(copy_to_user(pAddr, &epause, sizeof(epause))) {
14024+ return -EFAULT;
14025+ }
14026+ return 0;
14027+ }
14028+#endif
14029+#ifdef ETHTOOL_SPAUSEPARAM
14030+ case ETHTOOL_SPAUSEPARAM: {
14031+ struct ethtool_pauseparam epause;
14032+ if(copy_from_user(&epause, pAddr, sizeof(epause))) {
14033+ return -EFAULT;
14034+ }
14035+ return setPauseParams(pAC, port, &epause);
14036+ }
14037+#endif
14038+#ifdef ETHTOOL_GSG
14039+ case ETHTOOL_GSG: {
14040+ struct ethtool_value edata = { ETHTOOL_GSG };
14041+ edata.data = (netdev->features & NETIF_F_SG) != 0;
14042+ if (copy_to_user(pAddr, &edata, sizeof(edata))) {
14043+ return -EFAULT;
14044+ }
14045+ return 0;
14046+ }
14047+#endif
14048+#ifdef ETHTOOL_SSG
14049+ case ETHTOOL_SSG: {
14050+ struct ethtool_value edata;
14051+ if (copy_from_user(&edata, pAddr, sizeof(edata))) {
14052+ return -EFAULT;
14053+ }
14054+ if (pAC->ChipsetType) { /* Don't handle if Genesis */
14055+ if (edata.data) {
14056+ netdev->features |= NETIF_F_SG;
14057+ } else {
14058+ netdev->features &= ~NETIF_F_SG;
14059+ }
14060+ }
14061+ return 0;
14062+ }
14063+#endif
14064+#ifdef ETHTOOL_GRXCSUM
14065+ case ETHTOOL_GRXCSUM: {
14066+ struct ethtool_value edata = { ETHTOOL_GRXCSUM };
14067+ edata.data = pAC->RxPort[port].UseRxCsum;
14068+ if (copy_to_user(pAddr, &edata, sizeof(edata))) {
14069+ return -EFAULT;
14070+ }
14071+ return 0;
14072+ }
14073+#endif
14074+#ifdef ETHTOOL_SRXCSUM
14075+ case ETHTOOL_SRXCSUM: {
14076+ struct ethtool_value edata;
14077+ if (copy_from_user(&edata, pAddr, sizeof(edata))) {
14078+ return -EFAULT;
14079+ }
14080+ pAC->RxPort[port].UseRxCsum = edata.data;
14081+ return 0;
14082+ }
14083+#endif
14084+#ifdef ETHTOOL_GTXCSUM
14085+ case ETHTOOL_GTXCSUM: {
14086+ struct ethtool_value edata = { ETHTOOL_GTXCSUM };
14087+ edata.data = ((netdev->features & NETIF_F_IP_CSUM) != 0);
14088+ if (copy_to_user(pAddr, &edata, sizeof(edata))) {
14089+ return -EFAULT;
14090+ }
14091+ return 0;
14092+ }
14093+#endif
14094+#ifdef ETHTOOL_STXCSUM
14095+ case ETHTOOL_STXCSUM: {
14096+ struct ethtool_value edata;
14097+ if (copy_from_user(&edata, pAddr, sizeof(edata))) {
14098+ return -EFAULT;
14099+ }
14100+ if (pAC->ChipsetType) { /* Don't handle if Genesis */
14101+ if (edata.data) {
14102+ netdev->features |= NETIF_F_IP_CSUM;
14103+ } else {
14104+ netdev->features &= ~NETIF_F_IP_CSUM;
14105+ }
14106+ }
14107+ return 0;
14108+ }
14109+#endif
14110+#ifdef ETHTOOL_NWAY_RST
14111+ case ETHTOOL_NWAY_RST: {
14112+ if(netif_running(netdev)) {
14113+ (*netdev->stop)(netdev);
14114+ (*netdev->open)(netdev);
14115+ }
14116+ return 0;
14117+ }
14118+#endif
14119+#ifdef NETIF_F_TSO
14120+#ifdef ETHTOOL_GTSO
14121+ case ETHTOOL_GTSO: {
14122+ struct ethtool_value edata = { ETHTOOL_GTSO };
14123+ edata.data = (netdev->features & NETIF_F_TSO) != 0;
14124+ if (copy_to_user(pAddr, &edata, sizeof(edata))) {
14125+ return -EFAULT;
14126+ }
14127+ return 0;
14128+ }
14129+#endif
14130+#ifdef ETHTOOL_STSO
14131+ case ETHTOOL_STSO: {
14132+ struct ethtool_value edata;
14133+ if (CHIP_ID_YUKON_2(pAC)) {
14134+ if (copy_from_user(&edata, pAddr, sizeof(edata))) {
14135+ return -EFAULT;
14136+ }
14137+ if (edata.data) {
14138+ netdev->features |= NETIF_F_TSO;
14139+ } else {
14140+ netdev->features &= ~NETIF_F_TSO;
14141+ }
14142+ return 0;
14143+ }
14144+ return -EOPNOTSUPP;
14145+ }
14146+#endif
14147+#endif
14148+#ifdef ETHTOOL_GCOALESCE
14149+ case ETHTOOL_GCOALESCE: {
14150+ struct ethtool_coalesce ecoalesc = { ETHTOOL_GCOALESCE };
14151+ getModerationParams(pAC, port, &ecoalesc);
14152+ if(copy_to_user(pAddr, &ecoalesc, sizeof(ecoalesc))) {
14153+ return -EFAULT;
14154+ }
14155+ return 0;
14156+ }
14157+#endif
14158+#ifdef ETHTOOL_SCOALESCE
14159+ case ETHTOOL_SCOALESCE: {
14160+ struct ethtool_coalesce ecoalesc;
14161+ if(copy_from_user(&ecoalesc, pAddr, sizeof(ecoalesc))) {
14162+ return -EFAULT;
14163+ }
14164+ return setModerationParams(pAC, port, &ecoalesc);
14165+ }
14166+#endif
14167+#ifdef ETHTOOL_GWOL
14168+ case ETHTOOL_GWOL: {
14169+ struct ethtool_wolinfo ewol = { ETHTOOL_GWOL };
14170+ getWOLsettings(pAC, port, &ewol);
14171+ if(copy_to_user(pAddr, &ewol, sizeof(ewol))) {
14172+ return -EFAULT;
14173+ }
14174+ return 0;
14175+ }
14176+#endif
14177+#ifdef ETHTOOL_SWOL
14178+ case ETHTOOL_SWOL: {
14179+ struct ethtool_wolinfo ewol;
14180+ if(copy_from_user(&ewol, pAddr, sizeof(ewol))) {
14181+ return -EFAULT;
14182+ }
14183+ return setWOLsettings(pAC, port, &ewol);
14184+ }
14185+#endif
14186+ default:
14187+ return -EOPNOTSUPP;
14188+ }
14189+} /* SkEthIoctl() */
14190
14191 /******************************************************************************
14192 *
14193@@ -72,6 +531,7 @@
14194 *
14195 *****************************************************************************/
14196
14197+#ifdef ETHTOOL_GSET
14198 /*****************************************************************************
14199 *
14200 * getSettings - retrieves the current settings of the selected adapter
14201@@ -81,15 +541,15 @@
14202 * This configuration involves a)speed, b)duplex and c)autoneg plus
14203 * a number of other variables.
14204 *
14205- * Returns: always 0
14206+ * Returns: N/A
14207 *
14208 */
14209-static int getSettings(struct net_device *dev, struct ethtool_cmd *ecmd)
14210+static void getSettings(
14211+SK_AC *pAC, /* pointer to adapter control context */
14212+int port, /* the port of the selected adapter */
14213+struct ethtool_cmd *ecmd) /* mandatory command structure for results */
14214 {
14215- const DEV_NET *pNet = netdev_priv(dev);
14216- int port = pNet->PortNr;
14217- const SK_AC *pAC = pNet->pAC;
14218- const SK_GEPORT *pPort = &pAC->GIni.GP[port];
14219+ SK_GEPORT *pPort = &pAC->GIni.GP[port];
14220
14221 static int DuplexAutoNegConfMap[9][3]= {
14222 { -1 , -1 , -1 },
14223@@ -102,6 +562,7 @@
14224 { SK_LMODE_AUTOSENSE , -1 , -1 },
14225 { SK_LMODE_INDETERMINATED, -1 , -1 }
14226 };
14227+
14228 static int SpeedConfMap[6][2] = {
14229 { 0 , -1 },
14230 { SK_LSPEED_AUTO , -1 },
14231@@ -110,6 +571,7 @@
14232 { SK_LSPEED_1000MBPS , SPEED_1000 },
14233 { SK_LSPEED_INDETERMINATED, -1 }
14234 };
14235+
14236 static int AdvSpeedMap[6][2] = {
14237 { 0 , -1 },
14238 { SK_LSPEED_AUTO , -1 },
14239@@ -137,12 +599,10 @@
14240 if (pAC->GIni.GIChipId == CHIP_ID_YUKON) {
14241 ecmd->supported &= ~(SUPPORTED_1000baseT_Half);
14242 }
14243-#ifdef CHIP_ID_YUKON_FE
14244 if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) {
14245 ecmd->supported &= ~(SUPPORTED_1000baseT_Half);
14246 ecmd->supported &= ~(SUPPORTED_1000baseT_Full);
14247 }
14248-#endif
14249 }
14250 if (pAC->GIni.GP[0].PLinkSpeed != SK_LSPEED_AUTO) {
14251 ecmd->advertising = AdvSpeedMap[pPort->PLinkSpeed][1];
14252@@ -152,26 +612,20 @@
14253 } else {
14254 ecmd->advertising = ecmd->supported;
14255 }
14256-
14257- if (ecmd->autoneg == AUTONEG_ENABLE)
14258+ if (ecmd->autoneg == AUTONEG_ENABLE) {
14259 ecmd->advertising |= ADVERTISED_Autoneg;
14260+ } else {
14261+ ecmd->advertising = ADVERTISED_TP;
14262+ }
14263 } else {
14264 ecmd->port = PORT_FIBRE;
14265- ecmd->supported = SUPP_FIBRE_ALL;
14266- ecmd->advertising = ADV_FIBRE_ALL;
14267+ ecmd->supported = (SUPP_FIBRE_ALL);
14268+ ecmd->advertising = (ADV_FIBRE_ALL);
14269 }
14270- return 0;
14271-}
14272-
14273-/*
14274- * MIB infrastructure uses instance value starting at 1
14275- * based on board and port.
14276- */
14277-static inline u32 pnmiInstance(const DEV_NET *pNet)
14278-{
14279- return 1 + (pNet->pAC->RlmtNets == 2) + pNet->PortNr;
14280 }
14281+#endif
14282
14283+#ifdef ETHTOOL_SSET
14284 /*****************************************************************************
14285 *
14286 * setSettings - configures the settings of a selected adapter
14287@@ -181,422 +635,722 @@
14288 * c)autonegotiation.
14289 *
14290 * Returns:
14291- * 0: everything fine, no error
14292- * <0: the return value is the error code of the failure
14293+ * ==0: everything fine, no error
14294+ * !=0: the return value is the error code of the failure
14295 */
14296-static int setSettings(struct net_device *dev, struct ethtool_cmd *ecmd)
14297+static int setSettings(
14298+SK_AC *pAC, /* pointer to adapter control context */
14299+int port, /* the port of the selected adapter */
14300+struct ethtool_cmd *ecmd) /* command structure containing settings */
14301 {
14302- DEV_NET *pNet = netdev_priv(dev);
14303- SK_AC *pAC = pNet->pAC;
14304- u32 instance;
14305- char buf[4];
14306- int len = 1;
14307+ DEV_NET *pNet = (DEV_NET *) pAC->dev[port]->priv;
14308+ SK_U32 Instance;
14309+ char Buf[4];
14310+ unsigned int Len = 1;
14311+ int Ret;
14312
14313- if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100
14314- && ecmd->speed != SPEED_1000)
14315- return -EINVAL;
14316-
14317- if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
14318- return -EINVAL;
14319+ if (port == 0) {
14320+ Instance = (pAC->RlmtNets == 2) ? 1 : 2;
14321+ } else {
14322+ Instance = (pAC->RlmtNets == 2) ? 2 : 3;
14323+ }
14324
14325- if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE)
14326- return -EINVAL;
14327+ if (((ecmd->autoneg == AUTONEG_DISABLE) || (ecmd->autoneg == AUTONEG_ENABLE)) &&
14328+ ((ecmd->duplex == DUPLEX_FULL) || (ecmd->duplex == DUPLEX_HALF))) {
14329+ if (ecmd->autoneg == AUTONEG_DISABLE) {
14330+ if (ecmd->duplex == DUPLEX_FULL) {
14331+ *Buf = (char) SK_LMODE_FULL;
14332+ } else {
14333+ *Buf = (char) SK_LMODE_HALF;
14334+ }
14335+ } else {
14336+ if (ecmd->duplex == DUPLEX_FULL) {
14337+ *Buf = (char) SK_LMODE_AUTOFULL;
14338+ } else {
14339+ *Buf = (char) SK_LMODE_AUTOHALF;
14340+ }
14341+ }
14342
14343- if (ecmd->autoneg == AUTONEG_DISABLE)
14344- *buf = (ecmd->duplex == DUPLEX_FULL)
14345- ? SK_LMODE_FULL : SK_LMODE_HALF;
14346- else
14347- *buf = (ecmd->duplex == DUPLEX_FULL)
14348- ? SK_LMODE_AUTOFULL : SK_LMODE_AUTOHALF;
14349+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_LINK_MODE,
14350+ &Buf, &Len, Instance, pNet->NetNr);
14351
14352- instance = pnmiInstance(pNet);
14353- if (SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_LINK_MODE,
14354- &buf, &len, instance, pNet->NetNr) != SK_PNMI_ERR_OK)
14355- return -EINVAL;
14356-
14357- switch(ecmd->speed) {
14358- case SPEED_1000:
14359- *buf = SK_LSPEED_1000MBPS;
14360- break;
14361- case SPEED_100:
14362- *buf = SK_LSPEED_100MBPS;
14363- break;
14364- case SPEED_10:
14365- *buf = SK_LSPEED_10MBPS;
14366+ if (Ret != SK_PNMI_ERR_OK) {
14367+ return -EINVAL;
14368+ }
14369+ } else if (ecmd->autoneg == AUTONEG_ENABLE) {
14370+ /* Set default values */
14371+ *Buf = (char) SK_LMODE_AUTOFULL;
14372+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_LINK_MODE,
14373+ &Buf, &Len, Instance, pNet->NetNr);
14374 }
14375
14376- if (SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE,
14377- &buf, &len, instance, pNet->NetNr) != SK_PNMI_ERR_OK)
14378+ if ((ecmd->speed == SPEED_1000) ||
14379+ (ecmd->speed == SPEED_100) ||
14380+ (ecmd->speed == SPEED_10)) {
14381+ if (ecmd->autoneg == AUTONEG_ENABLE) {
14382+ *Buf = (char) SK_LSPEED_AUTO;
14383+ } else if (ecmd->speed == SPEED_1000) {
14384+ *Buf = (char) SK_LSPEED_1000MBPS;
14385+ } else if (ecmd->speed == SPEED_100) {
14386+ *Buf = (char) SK_LSPEED_100MBPS;
14387+ } else {
14388+ *Buf = (char) SK_LSPEED_10MBPS;
14389+ }
14390+
14391+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE,
14392+ &Buf, &Len, Instance, pNet->NetNr);
14393+
14394+ if (Ret != SK_PNMI_ERR_OK) {
14395+ return -EINVAL;
14396+ }
14397+ } else if (ecmd->autoneg == AUTONEG_ENABLE) {
14398+ *Buf = (char) SK_LSPEED_AUTO;
14399+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE,
14400+ &Buf, &Len, Instance, pNet->NetNr);
14401+ } else {
14402 return -EINVAL;
14403+ }
14404
14405 return 0;
14406 }
14407+#endif
14408
14409+#ifdef ETHTOOL_GPAUSEPARAM
14410 /*****************************************************************************
14411 *
14412- * getDriverInfo - returns generic driver and adapter information
14413+ * getPauseParams - retrieves the pause parameters
14414 *
14415 * Description:
14416- * Generic driver information is returned via this function, such as
14417- * the name of the driver, its version and and firmware version.
14418- * In addition to this, the location of the selected adapter is
14419- * returned as a bus info string (e.g. '01:05.0').
14420- *
14421+ * All current pause parameters of a selected adapter are placed
14422+ * in the passed ethtool_pauseparam structure and are returned.
14423+ *
14424 * Returns: N/A
14425 *
14426 */
14427-static void getDriverInfo(struct net_device *dev, struct ethtool_drvinfo *info)
14428+static void getPauseParams(
14429+SK_AC *pAC, /* pointer to adapter control context */
14430+int port, /* the port of the selected adapter */
14431+struct ethtool_pauseparam *epause) /* pause parameter struct for result */
14432 {
14433- const DEV_NET *pNet = netdev_priv(dev);
14434- const SK_AC *pAC = pNet->pAC;
14435- char vers[32];
14436-
14437- snprintf(vers, sizeof(vers)-1, VER_STRING "(v%d.%d)",
14438- (pAC->GIni.GIPciHwRev >> 4) & 0xf, pAC->GIni.GIPciHwRev & 0xf);
14439-
14440- strlcpy(info->driver, DRIVER_FILE_NAME, sizeof(info->driver));
14441- strcpy(info->version, vers);
14442- strcpy(info->fw_version, "N/A");
14443- strlcpy(info->bus_info, pci_name(pAC->PciDev), ETHTOOL_BUSINFO_LEN);
14444-}
14445-
14446-/*
14447- * Ethtool statistics support.
14448- */
14449-static const char StringsStats[][ETH_GSTRING_LEN] = {
14450- "rx_packets", "tx_packets",
14451- "rx_bytes", "tx_bytes",
14452- "rx_errors", "tx_errors",
14453- "rx_dropped", "tx_dropped",
14454- "multicasts", "collisions",
14455- "rx_length_errors", "rx_buffer_overflow_errors",
14456- "rx_crc_errors", "rx_frame_errors",
14457- "rx_too_short_errors", "rx_too_long_errors",
14458- "rx_carrier_extension_errors", "rx_symbol_errors",
14459- "rx_llc_mac_size_errors", "rx_carrier_errors",
14460- "rx_jabber_errors", "rx_missed_errors",
14461- "tx_abort_collision_errors", "tx_carrier_errors",
14462- "tx_buffer_underrun_errors", "tx_heartbeat_errors",
14463- "tx_window_errors",
14464-};
14465+ SK_GEPORT *pPort = &pAC->GIni.GP[port];
14466
14467-static int getStatsCount(struct net_device *dev)
14468-{
14469- return ARRAY_SIZE(StringsStats);
14470-}
14471+ epause->rx_pause = 0;
14472+ epause->tx_pause = 0;
14473
14474-static void getStrings(struct net_device *dev, u32 stringset, u8 *data)
14475-{
14476- switch(stringset) {
14477- case ETH_SS_STATS:
14478- memcpy(data, *StringsStats, sizeof(StringsStats));
14479- break;
14480+ if (pPort->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND) {
14481+ epause->tx_pause = 1;
14482+ }
14483+ if ((pPort->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC) ||
14484+ (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM)) {
14485+ epause->tx_pause = 1;
14486+ epause->rx_pause = 1;
14487 }
14488-}
14489
14490-static void getEthtoolStats(struct net_device *dev,
14491- struct ethtool_stats *stats, u64 *data)
14492-{
14493- const DEV_NET *pNet = netdev_priv(dev);
14494- const SK_AC *pAC = pNet->pAC;
14495- const SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct;
14496-
14497- *data++ = pPnmiStruct->Stat[0].StatRxOkCts;
14498- *data++ = pPnmiStruct->Stat[0].StatTxOkCts;
14499- *data++ = pPnmiStruct->Stat[0].StatRxOctetsOkCts;
14500- *data++ = pPnmiStruct->Stat[0].StatTxOctetsOkCts;
14501- *data++ = pPnmiStruct->InErrorsCts;
14502- *data++ = pPnmiStruct->Stat[0].StatTxSingleCollisionCts;
14503- *data++ = pPnmiStruct->RxNoBufCts;
14504- *data++ = pPnmiStruct->TxNoBufCts;
14505- *data++ = pPnmiStruct->Stat[0].StatRxMulticastOkCts;
14506- *data++ = pPnmiStruct->Stat[0].StatTxSingleCollisionCts;
14507- *data++ = pPnmiStruct->Stat[0].StatRxRuntCts;
14508- *data++ = pPnmiStruct->Stat[0].StatRxFifoOverflowCts;
14509- *data++ = pPnmiStruct->Stat[0].StatRxFcsCts;
14510- *data++ = pPnmiStruct->Stat[0].StatRxFramingCts;
14511- *data++ = pPnmiStruct->Stat[0].StatRxShortsCts;
14512- *data++ = pPnmiStruct->Stat[0].StatRxTooLongCts;
14513- *data++ = pPnmiStruct->Stat[0].StatRxCextCts;
14514- *data++ = pPnmiStruct->Stat[0].StatRxSymbolCts;
14515- *data++ = pPnmiStruct->Stat[0].StatRxIRLengthCts;
14516- *data++ = pPnmiStruct->Stat[0].StatRxCarrierCts;
14517- *data++ = pPnmiStruct->Stat[0].StatRxJabberCts;
14518- *data++ = pPnmiStruct->Stat[0].StatRxMissedCts;
14519- *data++ = pAC->stats.tx_aborted_errors;
14520- *data++ = pPnmiStruct->Stat[0].StatTxCarrierCts;
14521- *data++ = pPnmiStruct->Stat[0].StatTxFifoUnderrunCts;
14522- *data++ = pPnmiStruct->Stat[0].StatTxCarrierCts;
14523- *data++ = pAC->stats.tx_window_errors;
14524+ if ((epause->rx_pause == 0) && (epause->tx_pause == 0)) {
14525+ epause->autoneg = SK_FALSE;
14526+ } else {
14527+ epause->autoneg = SK_TRUE;
14528+ }
14529 }
14530+#endif
14531
14532-
14533+#ifdef ETHTOOL_SPAUSEPARAM
14534 /*****************************************************************************
14535 *
14536- * toggleLeds - Changes the LED state of an adapter
14537+ * setPauseParams - configures the pause parameters of an adapter
14538 *
14539 * Description:
14540- * This function changes the current state of all LEDs of an adapter so
14541- * that it can be located by a user.
14542- *
14543- * Returns: N/A
14544+ * This function sets the Rx or Tx pause parameters
14545 *
14546+ * Returns:
14547+ * ==0: everything fine, no error
14548+ * !=0: the return value is the error code of the failure
14549 */
14550-static void toggleLeds(DEV_NET *pNet, int on)
14551+static int setPauseParams(
14552+SK_AC *pAC, /* pointer to adapter control context */
14553+int port, /* the port of the selected adapter */
14554+struct ethtool_pauseparam *epause) /* pause parameter struct with params */
14555 {
14556- SK_AC *pAC = pNet->pAC;
14557- int port = pNet->PortNr;
14558- void __iomem *io = pAC->IoBase;
14559-
14560- if (pAC->GIni.GIGenesis) {
14561- SK_OUT8(io, MR_ADDR(port,LNK_LED_REG),
14562- on ? SK_LNK_ON : SK_LNK_OFF);
14563- SkGeYellowLED(pAC, io,
14564- on ? (LED_ON >> 1) : (LED_OFF >> 1));
14565- SkGeXmitLED(pAC, io, MR_ADDR(port,RX_LED_INI),
14566- on ? SK_LED_TST : SK_LED_DIS);
14567-
14568- if (pAC->GIni.GP[port].PhyType == SK_PHY_BCOM)
14569- SkXmPhyWrite(pAC, io, port, PHY_BCOM_P_EXT_CTRL,
14570- on ? PHY_B_PEC_LED_ON : PHY_B_PEC_LED_OFF);
14571- else if (pAC->GIni.GP[port].PhyType == SK_PHY_LONE)
14572- SkXmPhyWrite(pAC, io, port, PHY_LONE_LED_CFG,
14573- on ? 0x0800 : PHY_L_LC_LEDT);
14574- else
14575- SkGeXmitLED(pAC, io, MR_ADDR(port,TX_LED_INI),
14576- on ? SK_LED_TST : SK_LED_DIS);
14577+ SK_GEPORT *pPort = &pAC->GIni.GP[port];
14578+ DEV_NET *pNet = (DEV_NET *) pAC->dev[port]->priv;
14579+ int PrevSpeedVal = pPort->PLinkSpeedUsed;
14580+
14581+ SK_U32 Instance;
14582+ char Buf[4];
14583+ int Ret;
14584+ SK_BOOL prevAutonegValue = SK_TRUE;
14585+ int prevTxPause = 0;
14586+ int prevRxPause = 0;
14587+ unsigned int Len = 1;
14588+
14589+ if (port == 0) {
14590+ Instance = (pAC->RlmtNets == 2) ? 1 : 2;
14591+ } else {
14592+ Instance = (pAC->RlmtNets == 2) ? 2 : 3;
14593+ }
14594+
14595+ /*
14596+ ** we have to determine the current settings to see if
14597+ ** the operator requested any modification of the flow
14598+ ** control parameters...
14599+ */
14600+ if (pPort->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND) {
14601+ prevTxPause = 1;
14602+ }
14603+ if ((pPort->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC) ||
14604+ (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM)) {
14605+ prevTxPause = 1;
14606+ prevRxPause = 1;
14607+ }
14608+
14609+ if ((prevRxPause == 0) && (prevTxPause == 0)) {
14610+ prevAutonegValue = SK_FALSE;
14611+ }
14612+
14613+
14614+ /*
14615+ ** perform modifications regarding the changes
14616+ ** requested by the operator
14617+ */
14618+ if (epause->autoneg != prevAutonegValue) {
14619+ if (epause->autoneg == AUTONEG_DISABLE) {
14620+ *Buf = (char) SK_FLOW_MODE_NONE;
14621+ } else {
14622+ *Buf = (char) SK_FLOW_MODE_SYMMETRIC;
14623+ }
14624 } else {
14625- const u16 YukLedOn = (PHY_M_LED_MO_DUP(MO_LED_ON) |
14626- PHY_M_LED_MO_10(MO_LED_ON) |
14627- PHY_M_LED_MO_100(MO_LED_ON) |
14628- PHY_M_LED_MO_1000(MO_LED_ON) |
14629- PHY_M_LED_MO_RX(MO_LED_ON));
14630- const u16 YukLedOff = (PHY_M_LED_MO_DUP(MO_LED_OFF) |
14631- PHY_M_LED_MO_10(MO_LED_OFF) |
14632- PHY_M_LED_MO_100(MO_LED_OFF) |
14633- PHY_M_LED_MO_1000(MO_LED_OFF) |
14634- PHY_M_LED_MO_RX(MO_LED_OFF));
14635-
14636+ if(epause->rx_pause && epause->tx_pause) {
14637+ *Buf = (char) SK_FLOW_MODE_SYMMETRIC;
14638+ } else if (epause->rx_pause && !epause->tx_pause) {
14639+ *Buf = (char) SK_FLOW_MODE_SYM_OR_REM;
14640+ } else if(!epause->rx_pause && epause->tx_pause) {
14641+ *Buf = (char) SK_FLOW_MODE_LOC_SEND;
14642+ } else {
14643+ *Buf = (char) SK_FLOW_MODE_NONE;
14644+ }
14645+ }
14646+
14647+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_FLOWCTRL_MODE,
14648+ &Buf, &Len, Instance, pNet->NetNr);
14649+
14650+ if (Ret != SK_PNMI_ERR_OK) {
14651+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL,
14652+ ("ethtool (sk98lin): error changing rx/tx pause (%i)\n", Ret));
14653+ } else {
14654+ Len = 1; /* set buffer length to correct value */
14655+ }
14656+
14657+ /*
14658+ ** It may be that autoneg has been disabled! Therefore
14659+ ** set the speed to the previously used value...
14660+ */
14661+ *Buf = (char) PrevSpeedVal;
14662
14663- SkGmPhyWrite(pAC,io,port,PHY_MARV_LED_CTRL,0);
14664- SkGmPhyWrite(pAC,io,port,PHY_MARV_LED_OVER,
14665- on ? YukLedOn : YukLedOff);
14666+ Ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE,
14667+ &Buf, &Len, Instance, pNet->NetNr);
14668+
14669+ if (Ret != SK_PNMI_ERR_OK) {
14670+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL,
14671+ ("ethtool (sk98lin): error setting speed (%i)\n", Ret));
14672 }
14673+ return 0;
14674 }
14675+#endif
14676
14677+#ifdef ETHTOOL_GCOALESCE
14678 /*****************************************************************************
14679 *
14680- * skGeBlinkTimer - Changes the LED state of an adapter
14681+ * getModerationParams - retrieves the IRQ moderation settings
14682 *
14683 * Description:
14684- * This function changes the current state of all LEDs of an adapter so
14685- * that it can be located by a user. If the requested time interval for
14686- * this test has elapsed, this function cleans up everything that was
14687- * temporarily setup during the locate NIC test. This involves of course
14688- * also closing or opening any adapter so that the initial board state
14689- * is recovered.
14690+ * All current IRQ moderation settings of a selected adapter are placed
14691+ * in the passed ethtool_coalesce structure and are returned.
14692 *
14693 * Returns: N/A
14694 *
14695 */
14696-void SkGeBlinkTimer(unsigned long data)
14697+static void getModerationParams(
14698+SK_AC *pAC, /* pointer to adapter control context */
14699+int port, /* the port of the selected adapter */
14700+struct ethtool_coalesce *ecoalesc) /* IRQ moderation struct for results */
14701 {
14702- struct net_device *dev = (struct net_device *) data;
14703- DEV_NET *pNet = netdev_priv(dev);
14704- SK_AC *pAC = pNet->pAC;
14705-
14706- toggleLeds(pNet, pAC->LedsOn);
14707+ DIM_INFO *Info = &pAC->DynIrqModInfo;
14708+ SK_BOOL UseTxIrqModeration = SK_FALSE;
14709+ SK_BOOL UseRxIrqModeration = SK_FALSE;
14710+
14711+ if (Info->IntModTypeSelect != C_INT_MOD_NONE) {
14712+ if (CHIP_ID_YUKON_2(pAC)) {
14713+ UseRxIrqModeration = SK_TRUE;
14714+ UseTxIrqModeration = SK_TRUE;
14715+ } else {
14716+ if ((Info->MaskIrqModeration == IRQ_MASK_RX_ONLY) ||
14717+ (Info->MaskIrqModeration == IRQ_MASK_SP_RX) ||
14718+ (Info->MaskIrqModeration == IRQ_MASK_RX_TX_SP)) {
14719+ UseRxIrqModeration = SK_TRUE;
14720+ }
14721+ if ((Info->MaskIrqModeration == IRQ_MASK_TX_ONLY) ||
14722+ (Info->MaskIrqModeration == IRQ_MASK_SP_TX) ||
14723+ (Info->MaskIrqModeration == IRQ_MASK_RX_TX_SP)) {
14724+ UseTxIrqModeration = SK_TRUE;
14725+ }
14726+ }
14727
14728- pAC->LedsOn = !pAC->LedsOn;
14729- mod_timer(&pAC->BlinkTimer, jiffies + HZ/4);
14730+ if (UseRxIrqModeration) {
14731+ ecoalesc->rx_coalesce_usecs = 1000000 / Info->MaxModIntsPerSec;
14732+ }
14733+ if (UseTxIrqModeration) {
14734+ ecoalesc->tx_coalesce_usecs = 1000000 / Info->MaxModIntsPerSec;
14735+ }
14736+ if (Info->IntModTypeSelect == C_INT_MOD_DYNAMIC) {
14737+ ecoalesc->rate_sample_interval = Info->DynIrqModSampleInterval;
14738+ if (UseRxIrqModeration) {
14739+ ecoalesc->use_adaptive_rx_coalesce = 1;
14740+ ecoalesc->rx_coalesce_usecs_low =
14741+ 1000000 / Info->MaxModIntsPerSecLowerLimit;
14742+ ecoalesc->rx_coalesce_usecs_high =
14743+ 1000000 / Info->MaxModIntsPerSecUpperLimit;
14744+ }
14745+ if (UseTxIrqModeration) {
14746+ ecoalesc->use_adaptive_tx_coalesce = 1;
14747+ ecoalesc->tx_coalesce_usecs_low =
14748+ 1000000 / Info->MaxModIntsPerSecLowerLimit;
14749+ ecoalesc->tx_coalesce_usecs_high =
14750+ 1000000 / Info->MaxModIntsPerSecUpperLimit;
14751+ }
14752+ }
14753+ }
14754 }
14755+#endif
14756
14757+#ifdef ETHTOOL_SCOALESCE
14758 /*****************************************************************************
14759 *
14760- * locateDevice - start the locate NIC feature of the elected adapter
14761+ * setModerationParams - configures the IRQ moderation of an adapter
14762 *
14763 * Description:
14764- * This function is used if the user want to locate a particular NIC.
14765- * All LEDs are regularly switched on and off, so the NIC can easily
14766- * be identified.
14767+ * Depending on the desired IRQ moderation parameters, either a) static,
14768+ * b) dynamic or c) no moderation is configured.
14769 *
14770- * Returns:
14771- * ==0: everything fine, no error, locateNIC test was started
14772- * !=0: one locateNIC test runs already
14773+ * Returns:
14774+ * ==0: everything fine, no error
14775+ * !=0: the return value is the error code of the failure
14776 *
14777+ * Notes:
14778+ * The supported timeframe for the coalesced interrupts ranges from
14779+ * 33.333us (30 IntsPerSec) down to 25us (40.000 IntsPerSec).
14780+ * Any requested value that is not in this range will abort the request!
14781 */
14782-static int locateDevice(struct net_device *dev, u32 data)
14783+static int setModerationParams(
14784+SK_AC *pAC, /* pointer to adapter control context */
14785+int port, /* the port of the selected adapter */
14786+struct ethtool_coalesce *ecoalesc) /* IRQ moderation struct with params */
14787 {
14788- DEV_NET *pNet = netdev_priv(dev);
14789- SK_AC *pAC = pNet->pAC;
14790+ DIM_INFO *Info = &pAC->DynIrqModInfo;
14791+ int PrevModeration = Info->IntModTypeSelect;
14792
14793- if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
14794- data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
14795+ Info->IntModTypeSelect = C_INT_MOD_NONE; /* initial default */
14796
14797- /* start blinking */
14798- pAC->LedsOn = 0;
14799- mod_timer(&pAC->BlinkTimer, jiffies);
14800- msleep_interruptible(data * 1000);
14801- del_timer_sync(&pAC->BlinkTimer);
14802- toggleLeds(pNet, 0);
14803+ if ((ecoalesc->rx_coalesce_usecs) || (ecoalesc->tx_coalesce_usecs)) {
14804+ if (ecoalesc->rx_coalesce_usecs) {
14805+ if ((ecoalesc->rx_coalesce_usecs < 25) ||
14806+ (ecoalesc->rx_coalesce_usecs > 33333)) {
14807+ return -EINVAL;
14808+ }
14809+ }
14810+ if (ecoalesc->tx_coalesce_usecs) {
14811+ if ((ecoalesc->tx_coalesce_usecs < 25) ||
14812+ (ecoalesc->tx_coalesce_usecs > 33333)) {
14813+ return -EINVAL;
14814+ }
14815+ }
14816+ if (!CHIP_ID_YUKON_2(pAC)) {
14817+ if ((Info->MaskIrqModeration == IRQ_MASK_SP_RX) ||
14818+ (Info->MaskIrqModeration == IRQ_MASK_SP_TX) ||
14819+ (Info->MaskIrqModeration == IRQ_MASK_RX_TX_SP)) {
14820+ Info->MaskIrqModeration = IRQ_MASK_SP_ONLY;
14821+ }
14822+ }
14823+ Info->IntModTypeSelect = C_INT_MOD_STATIC;
14824+ if (ecoalesc->rx_coalesce_usecs) {
14825+ Info->MaxModIntsPerSec =
14826+ 1000000 / ecoalesc->rx_coalesce_usecs;
14827+ if (!CHIP_ID_YUKON_2(pAC)) {
14828+ if (Info->MaskIrqModeration == IRQ_MASK_TX_ONLY) {
14829+ Info->MaskIrqModeration = IRQ_MASK_TX_RX;
14830+ }
14831+ if (Info->MaskIrqModeration == IRQ_MASK_SP_ONLY) {
14832+ Info->MaskIrqModeration = IRQ_MASK_SP_RX;
14833+ }
14834+ if (Info->MaskIrqModeration == IRQ_MASK_SP_TX) {
14835+ Info->MaskIrqModeration = IRQ_MASK_RX_TX_SP;
14836+ }
14837+ } else {
14838+ Info->MaskIrqModeration = Y2_IRQ_MASK;
14839+ }
14840+ }
14841+ if (ecoalesc->tx_coalesce_usecs) {
14842+ Info->MaxModIntsPerSec =
14843+ 1000000 / ecoalesc->tx_coalesce_usecs;
14844+ if (!CHIP_ID_YUKON_2(pAC)) {
14845+ if (Info->MaskIrqModeration == IRQ_MASK_RX_ONLY) {
14846+ Info->MaskIrqModeration = IRQ_MASK_TX_RX;
14847+ }
14848+ if (Info->MaskIrqModeration == IRQ_MASK_SP_ONLY) {
14849+ Info->MaskIrqModeration = IRQ_MASK_SP_TX;
14850+ }
14851+ if (Info->MaskIrqModeration == IRQ_MASK_SP_RX) {
14852+ Info->MaskIrqModeration = IRQ_MASK_RX_TX_SP;
14853+ }
14854+ } else {
14855+ Info->MaskIrqModeration = Y2_IRQ_MASK;
14856+ }
14857+ }
14858+ }
14859+ if ((ecoalesc->rate_sample_interval) ||
14860+ (ecoalesc->rx_coalesce_usecs_low) ||
14861+ (ecoalesc->tx_coalesce_usecs_low) ||
14862+ (ecoalesc->rx_coalesce_usecs_high)||
14863+ (ecoalesc->tx_coalesce_usecs_high)) {
14864+ if (ecoalesc->rate_sample_interval) {
14865+ if ((ecoalesc->rate_sample_interval < 1) ||
14866+ (ecoalesc->rate_sample_interval > 10)) {
14867+ return -EINVAL;
14868+ }
14869+ }
14870+ if (ecoalesc->rx_coalesce_usecs_low) {
14871+ if ((ecoalesc->rx_coalesce_usecs_low < 25) ||
14872+ (ecoalesc->rx_coalesce_usecs_low > 33333)) {
14873+ return -EINVAL;
14874+ }
14875+ }
14876+ if (ecoalesc->rx_coalesce_usecs_high) {
14877+ if ((ecoalesc->rx_coalesce_usecs_high < 25) ||
14878+ (ecoalesc->rx_coalesce_usecs_high > 33333)) {
14879+ return -EINVAL;
14880+ }
14881+ }
14882+ if (ecoalesc->tx_coalesce_usecs_low) {
14883+ if ((ecoalesc->tx_coalesce_usecs_low < 25) ||
14884+ (ecoalesc->tx_coalesce_usecs_low > 33333)) {
14885+ return -EINVAL;
14886+ }
14887+ }
14888+ if (ecoalesc->tx_coalesce_usecs_high) {
14889+ if ((ecoalesc->tx_coalesce_usecs_high < 25) ||
14890+ (ecoalesc->tx_coalesce_usecs_high > 33333)) {
14891+ return -EINVAL;
14892+ }
14893+ }
14894
14895- return 0;
14896+ Info->IntModTypeSelect = C_INT_MOD_DYNAMIC;
14897+ if (ecoalesc->rate_sample_interval) {
14898+ Info->DynIrqModSampleInterval =
14899+ ecoalesc->rate_sample_interval;
14900+ }
14901+ if (ecoalesc->rx_coalesce_usecs_low) {
14902+ Info->MaxModIntsPerSecLowerLimit =
14903+ 1000000 / ecoalesc->rx_coalesce_usecs_low;
14904+ }
14905+ if (ecoalesc->tx_coalesce_usecs_low) {
14906+ Info->MaxModIntsPerSecLowerLimit =
14907+ 1000000 / ecoalesc->tx_coalesce_usecs_low;
14908+ }
14909+ if (ecoalesc->rx_coalesce_usecs_high) {
14910+ Info->MaxModIntsPerSecUpperLimit =
14911+ 1000000 / ecoalesc->rx_coalesce_usecs_high;
14912+ }
14913+ if (ecoalesc->tx_coalesce_usecs_high) {
14914+ Info->MaxModIntsPerSecUpperLimit =
14915+ 1000000 / ecoalesc->tx_coalesce_usecs_high;
14916+ }
14917+ }
14918+
14919+ if ((PrevModeration == C_INT_MOD_NONE) &&
14920+ (Info->IntModTypeSelect != C_INT_MOD_NONE)) {
14921+ SkDimEnableModerationIfNeeded(pAC);
14922+ }
14923+ if (PrevModeration != C_INT_MOD_NONE) {
14924+ SkDimDisableModeration(pAC, PrevModeration);
14925+ if (Info->IntModTypeSelect != C_INT_MOD_NONE) {
14926+ SkDimEnableModerationIfNeeded(pAC);
14927+ }
14928+ }
14929+
14930+ return 0;
14931 }
14932+#endif
14933
14934+#ifdef ETHTOOL_GWOL
14935 /*****************************************************************************
14936 *
14937- * getPauseParams - retrieves the pause parameters
14938+ * getWOLsettings - retrieves the WOL settings of the selected adapter
14939 *
14940 * Description:
14941- * All current pause parameters of a selected adapter are placed
14942- * in the passed ethtool_pauseparam structure and are returned.
14943+ * All current WOL settings of a selected adapter are placed in the
14944+ * passed ethtool_wolinfo structure and are returned to the caller.
14945 *
14946 * Returns: N/A
14947 *
14948 */
14949-static void getPauseParams(struct net_device *dev, struct ethtool_pauseparam *epause)
14950+static void getWOLsettings(
14951+SK_AC *pAC, /* pointer to adapter control context */
14952+int port, /* the port of the selected adapter */
14953+struct ethtool_wolinfo *ewol) /* mandatory WOL structure for results */
14954 {
14955- DEV_NET *pNet = netdev_priv(dev);
14956- SK_AC *pAC = pNet->pAC;
14957- SK_GEPORT *pPort = &pAC->GIni.GP[pNet->PortNr];
14958-
14959- epause->rx_pause = (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC) ||
14960- (pPort->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM);
14961+ ewol->supported = pAC->WolInfo.SupportedWolOptions;
14962+ ewol->wolopts = pAC->WolInfo.ConfiguredWolOptions;
14963
14964- epause->tx_pause = epause->rx_pause || (pPort->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND);
14965- epause->autoneg = epause->rx_pause || epause->tx_pause;
14966+ return;
14967 }
14968+#endif
14969
14970+#ifdef ETHTOOL_SWOL
14971 /*****************************************************************************
14972 *
14973- * setPauseParams - configures the pause parameters of an adapter
14974+ * setWOLsettings - configures the WOL settings of a selected adapter
14975 *
14976 * Description:
14977- * This function sets the Rx or Tx pause parameters
14978+ * The WOL settings of a selected adapter are configured regarding
14979+ * the parameters in the passed ethtool_wolinfo structure.
14980+ * Note that currently only wake on magic packet is supported!
14981 *
14982 * Returns:
14983 * ==0: everything fine, no error
14984 * !=0: the return value is the error code of the failure
14985 */
14986-static int setPauseParams(struct net_device *dev , struct ethtool_pauseparam *epause)
14987+static int setWOLsettings(
14988+SK_AC *pAC, /* pointer to adapter control context */
14989+int port, /* the port of the selected adapter */
14990+struct ethtool_wolinfo *ewol) /* WOL structure containing settings */
14991 {
14992- DEV_NET *pNet = netdev_priv(dev);
14993- SK_AC *pAC = pNet->pAC;
14994- SK_GEPORT *pPort = &pAC->GIni.GP[pNet->PortNr];
14995- u32 instance = pnmiInstance(pNet);
14996- struct ethtool_pauseparam old;
14997- u8 oldspeed = pPort->PLinkSpeedUsed;
14998- char buf[4];
14999- int len = 1;
15000- int ret;
15001+ if (((ewol->wolopts & WAKE_MAGIC) == WAKE_MAGIC) || (ewol->wolopts == 0)) {
15002+ pAC->WolInfo.ConfiguredWolOptions = ewol->wolopts;
15003+ return 0;
15004+ }
15005+ return -EFAULT;
15006+}
15007+#endif
15008
15009- /*
15010- ** we have to determine the current settings to see if
15011- ** the operator requested any modification of the flow
15012- ** control parameters...
15013- */
15014- getPauseParams(dev, &old);
15015+#ifdef ETHTOOL_GDRVINFO
15016+/*****************************************************************************
15017+ *
15018+ * getDriverInfo - returns generic driver and adapter information
15019+ *
15020+ * Description:
15021+ * Generic driver information is returned via this function, such as
15022+ * the name of the driver, its version and and firmware version.
15023+ * In addition to this, the location of the selected adapter is
15024+ * returned as a bus info string (e.g. '01:05.0').
15025+ *
15026+ * Returns: N/A
15027+ *
15028+ */
15029+static void getDriverInfo(
15030+SK_AC *pAC, /* pointer to adapter control context */
15031+int port, /* the port of the selected adapter */
15032+struct ethtool_drvinfo *edrvinfo) /* mandatory info structure for results */
15033+{
15034+ char versionString[32];
15035
15036- /*
15037- ** perform modifications regarding the changes
15038- ** requested by the operator
15039- */
15040- if (epause->autoneg != old.autoneg)
15041- *buf = epause->autoneg ? SK_FLOW_MODE_NONE : SK_FLOW_MODE_SYMMETRIC;
15042- else {
15043- if (epause->rx_pause && epause->tx_pause)
15044- *buf = SK_FLOW_MODE_SYMMETRIC;
15045- else if (epause->rx_pause && !epause->tx_pause)
15046- *buf = SK_FLOW_MODE_SYM_OR_REM;
15047- else if (!epause->rx_pause && epause->tx_pause)
15048- *buf = SK_FLOW_MODE_LOC_SEND;
15049- else
15050- *buf = SK_FLOW_MODE_NONE;
15051+ snprintf(versionString, 32, "%s (%s)", VER_STRING, PATCHLEVEL);
15052+ strncpy(edrvinfo->driver, DRIVER_FILE_NAME , 32);
15053+ strncpy(edrvinfo->version, versionString , 32);
15054+ strncpy(edrvinfo->fw_version, "N/A", 32);
15055+ strncpy(edrvinfo->bus_info, pci_name(pAC->PciDev), 32);
15056+
15057+#ifdef ETHTOOL_GSTATS
15058+ edrvinfo->n_stats = SK98LIN_STATS_LEN;
15059+#endif
15060+}
15061+#endif
15062+
15063+#ifdef ETHTOOL_PHYS_ID
15064+/*****************************************************************************
15065+ *
15066+ * startLocateNIC - start the locate NIC feature of the elected adapter
15067+ *
15068+ * Description:
15069+ * This function is used if the user want to locate a particular NIC.
15070+ * All LEDs are regularly switched on and off, so the NIC can easily
15071+ * be identified.
15072+ *
15073+ * Returns:
15074+ * ==0: everything fine, no error, locateNIC test was started
15075+ * !=0: one locateNIC test runs already
15076+ *
15077+ */
15078+static int startLocateNIC(
15079+SK_AC *pAC, /* pointer to adapter control context */
15080+int port, /* the port of the selected adapter */
15081+struct ethtool_value *blinkSecs) /* how long the LEDs should blink in seconds */
15082+{
15083+ struct SK_NET_DEVICE *pDev = pAC->dev[port];
15084+ int OtherPort = (port) ? 0 : 1;
15085+ struct SK_NET_DEVICE *pOtherDev = pAC->dev[OtherPort];
15086+
15087+ if (isLocateNICrunning) {
15088+ return -EFAULT;
15089 }
15090+ isLocateNICrunning = SK_TRUE;
15091+ currentPortIndex = port;
15092+ isDualNetCard = (pDev != pOtherDev) ? SK_TRUE : SK_FALSE;
15093
15094- ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_FLOWCTRL_MODE,
15095- &buf, &len, instance, pNet->NetNr);
15096+ if (netif_running(pAC->dev[port])) {
15097+ boardWasDown[0] = SK_FALSE;
15098+ } else {
15099+ (*pDev->open)(pDev);
15100+ boardWasDown[0] = SK_TRUE;
15101+ }
15102
15103- if (ret != SK_PNMI_ERR_OK) {
15104- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL,
15105- ("ethtool (sk98lin): error changing rx/tx pause (%i)\n", ret));
15106- goto err;
15107+ if (isDualNetCard) {
15108+ if (netif_running(pAC->dev[OtherPort])) {
15109+ boardWasDown[1] = SK_FALSE;
15110+ } else {
15111+ (*pOtherDev->open)(pOtherDev);
15112+ boardWasDown[1] = SK_TRUE;
15113+ }
15114 }
15115
15116- /*
15117- ** It may be that autoneg has been disabled! Therefore
15118- ** set the speed to the previously used value...
15119- */
15120- if (!epause->autoneg) {
15121- len = 1;
15122- ret = SkPnmiSetVar(pAC, pAC->IoBase, OID_SKGE_SPEED_MODE,
15123- &oldspeed, &len, instance, pNet->NetNr);
15124- if (ret != SK_PNMI_ERR_OK)
15125- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_CTRL,
15126- ("ethtool (sk98lin): error setting speed (%i)\n", ret));
15127+ if ((blinkSecs->data < 1) || (blinkSecs->data > 30)) {
15128+ blinkSecs->data = 3; /* three seconds default */
15129 }
15130- err:
15131- return ret ? -EIO : 0;
15132-}
15133+ nbrBlinkQuarterSeconds = 4*blinkSecs->data;
15134
15135-/* Only Yukon supports checksum offload. */
15136-static int setScatterGather(struct net_device *dev, u32 data)
15137-{
15138- DEV_NET *pNet = netdev_priv(dev);
15139- SK_AC *pAC = pNet->pAC;
15140+ init_timer(&locateNICtimer);
15141+ locateNICtimer.function = toggleLeds;
15142+ locateNICtimer.data = (unsigned long) pAC;
15143+ locateNICtimer.expires = jiffies + HZ; /* initially 1sec */
15144+ add_timer(&locateNICtimer);
15145
15146- if (pAC->GIni.GIChipId == CHIP_ID_GENESIS)
15147- return -EOPNOTSUPP;
15148- return ethtool_op_set_sg(dev, data);
15149+ return 0;
15150 }
15151
15152-static int setTxCsum(struct net_device *dev, u32 data)
15153+/*****************************************************************************
15154+ *
15155+ * toggleLeds - Changes the LED state of an adapter
15156+ *
15157+ * Description:
15158+ * This function changes the current state of all LEDs of an adapter so
15159+ * that it can be located by a user. If the requested time interval for
15160+ * this test has elapsed, this function cleans up everything that was
15161+ * temporarily setup during the locate NIC test. This involves of course
15162+ * also closing or opening any adapter so that the initial board state
15163+ * is recovered.
15164+ *
15165+ * Returns: N/A
15166+ *
15167+ */
15168+static void toggleLeds(
15169+unsigned long ptr) /* holds the pointer to adapter control context */
15170 {
15171- DEV_NET *pNet = netdev_priv(dev);
15172- SK_AC *pAC = pNet->pAC;
15173-
15174- if (pAC->GIni.GIChipId == CHIP_ID_GENESIS)
15175- return -EOPNOTSUPP;
15176+ SK_AC *pAC = (SK_AC *) ptr;
15177+ int port = currentPortIndex;
15178+ SK_IOC IoC = pAC->IoBase;
15179+ struct SK_NET_DEVICE *pDev = pAC->dev[port];
15180+ int OtherPort = (port) ? 0 : 1;
15181+ struct SK_NET_DEVICE *pOtherDev = pAC->dev[OtherPort];
15182+
15183+ SK_U16 YukLedOn = (PHY_M_LED_MO_DUP(MO_LED_ON) |
15184+ PHY_M_LED_MO_10(MO_LED_ON) |
15185+ PHY_M_LED_MO_100(MO_LED_ON) |
15186+ PHY_M_LED_MO_1000(MO_LED_ON) |
15187+ PHY_M_LED_MO_RX(MO_LED_ON));
15188+ SK_U16 YukLedOff = (PHY_M_LED_MO_DUP(MO_LED_OFF) |
15189+ PHY_M_LED_MO_10(MO_LED_OFF) |
15190+ PHY_M_LED_MO_100(MO_LED_OFF) |
15191+ PHY_M_LED_MO_1000(MO_LED_OFF) |
15192+ PHY_M_LED_MO_RX(MO_LED_OFF));
15193+
15194+ nbrBlinkQuarterSeconds--;
15195+ if (nbrBlinkQuarterSeconds <= 0) {
15196+ (*pDev->stop)(pDev);
15197+ if (isDualNetCard) {
15198+ (*pOtherDev->stop)(pOtherDev);
15199+ }
15200
15201- return ethtool_op_set_tx_csum(dev, data);
15202-}
15203+ if (!boardWasDown[0]) {
15204+ (*pDev->open)(pDev);
15205+ }
15206+ if (isDualNetCard) {
15207+ (*pOtherDev->open)(pOtherDev);
15208+ }
15209+ isDualNetCard = SK_FALSE;
15210+ isLocateNICrunning = SK_FALSE;
15211+ return;
15212+ }
15213
15214-static u32 getRxCsum(struct net_device *dev)
15215-{
15216- DEV_NET *pNet = netdev_priv(dev);
15217- SK_AC *pAC = pNet->pAC;
15218+ doSwitchLEDsOn = (doSwitchLEDsOn) ? SK_FALSE : SK_TRUE;
15219+ if (doSwitchLEDsOn) {
15220+ if (pAC->GIni.GIGenesis) {
15221+ SK_OUT8(IoC,MR_ADDR(port,LNK_LED_REG),(SK_U8)SK_LNK_ON);
15222+ SkGeYellowLED(pAC,IoC,LED_ON >> 1);
15223+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,RX_LED_INI),SK_LED_TST);
15224+ if (pAC->GIni.GP[port].PhyType == SK_PHY_BCOM) {
15225+ SkXmPhyWrite(pAC,IoC,port,PHY_BCOM_P_EXT_CTRL,PHY_B_PEC_LED_ON);
15226+ } else if (pAC->GIni.GP[port].PhyType == SK_PHY_LONE) {
15227+ SkXmPhyWrite(pAC,IoC,port,PHY_LONE_LED_CFG,0x0800);
15228+ } else {
15229+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,TX_LED_INI),SK_LED_TST);
15230+ }
15231+ } else {
15232+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_CTRL,0);
15233+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_OVER,YukLedOn);
15234+ }
15235+ } else {
15236+ if (pAC->GIni.GIGenesis) {
15237+ SK_OUT8(IoC,MR_ADDR(port,LNK_LED_REG),(SK_U8)SK_LNK_OFF);
15238+ SkGeYellowLED(pAC,IoC,LED_OFF >> 1);
15239+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,RX_LED_INI),SK_LED_DIS);
15240+ if (pAC->GIni.GP[port].PhyType == SK_PHY_BCOM) {
15241+ SkXmPhyWrite(pAC,IoC,port,PHY_BCOM_P_EXT_CTRL,PHY_B_PEC_LED_OFF);
15242+ } else if (pAC->GIni.GP[port].PhyType == SK_PHY_LONE) {
15243+ SkXmPhyWrite(pAC,IoC,port,PHY_LONE_LED_CFG,PHY_L_LC_LEDT);
15244+ } else {
15245+ SkGeXmitLED(pAC,IoC,MR_ADDR(port,TX_LED_INI),SK_LED_DIS);
15246+ }
15247+ } else {
15248+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_CTRL,0);
15249+ SkGmPhyWrite(pAC,IoC,port,PHY_MARV_LED_OVER,YukLedOff);
15250+ }
15251+ }
15252
15253- return pAC->RxPort[pNet->PortNr].RxCsum;
15254-}
15255+ locateNICtimer.function = toggleLeds;
15256+ locateNICtimer.data = (unsigned long) pAC;
15257+ locateNICtimer.expires = jiffies + (HZ/4); /* 250ms */
15258+ add_timer(&locateNICtimer);
15259+}
15260+#endif
15261
15262-static int setRxCsum(struct net_device *dev, u32 data)
15263+/*****************************************************************************
15264+ *
15265+ * getPortNumber - evaluates the port number of an interface
15266+ *
15267+ * Description:
15268+ * It may be that the current interface refers to one which is located
15269+ * on a dual net adapter. Hence, this function will return the correct
15270+ * port for further use.
15271+ *
15272+ * Returns:
15273+ * the port number that corresponds to the selected adapter
15274+ *
15275+ */
15276+static int getPortNumber(
15277+struct net_device *netdev, /* the pointer to netdev structure */
15278+struct ifreq *ifr) /* what interface the request refers to? */
15279 {
15280- DEV_NET *pNet = netdev_priv(dev);
15281- SK_AC *pAC = pNet->pAC;
15282-
15283- if (pAC->GIni.GIChipId == CHIP_ID_GENESIS)
15284- return -EOPNOTSUPP;
15285+ DEV_NET *pNet = (DEV_NET*) netdev->priv;
15286+ SK_AC *pAC = pNet->pAC;
15287
15288- pAC->RxPort[pNet->PortNr].RxCsum = data != 0;
15289+ if (pAC->dev[1] != pAC->dev[0]) {
15290+ if (!strcmp(pAC->dev[1]->name, ifr->ifr_name)) {
15291+ return 1; /* port index 1 */
15292+ }
15293+ }
15294 return 0;
15295 }
15296
15297-struct ethtool_ops SkGeEthtoolOps = {
15298- .get_settings = getSettings,
15299- .set_settings = setSettings,
15300- .get_drvinfo = getDriverInfo,
15301- .get_strings = getStrings,
15302- .get_stats_count = getStatsCount,
15303- .get_ethtool_stats = getEthtoolStats,
15304- .phys_id = locateDevice,
15305- .get_pauseparam = getPauseParams,
15306- .set_pauseparam = setPauseParams,
15307- .get_link = ethtool_op_get_link,
15308- .get_perm_addr = ethtool_op_get_perm_addr,
15309- .get_sg = ethtool_op_get_sg,
15310- .set_sg = setScatterGather,
15311- .get_tx_csum = ethtool_op_get_tx_csum,
15312- .set_tx_csum = setTxCsum,
15313- .get_rx_csum = getRxCsum,
15314- .set_rx_csum = setRxCsum,
15315-};
15316+/*******************************************************************************
15317+ *
15318+ * End of file
15319+ *
15320+ ******************************************************************************/
15321diff -ruN linux/drivers/net/sk98lin/skge.c linux-new/drivers/net/sk98lin/skge.c
15322--- linux/drivers/net/sk98lin/skge.c 2006-04-11 19:19:28.000000000 +0200
15323+++ linux-new/drivers/net/sk98lin/skge.c 2006-01-18 14:37:24.000000000 +0100
15324@@ -1,32 +1,26 @@
15325 /******************************************************************************
15326 *
15327- * Name: skge.c
15328- * Project: GEnesis, PCI Gigabit Ethernet Adapter
15329- * Version: $Revision$
15330- * Date: $Date$
15331- * Purpose: The main driver source module
15332+ * Name: skge.c
15333+ * Project: GEnesis, PCI Gigabit Ethernet Adapter
15334+ * Version: $Revision$
15335+ * Date: $Date$
15336+ * Purpose: The main driver source module
15337 *
15338 ******************************************************************************/
15339
15340 /******************************************************************************
15341 *
15342 * (C)Copyright 1998-2002 SysKonnect GmbH.
15343- * (C)Copyright 2002-2003 Marvell.
15344+ * (C)Copyright 2002-2005 Marvell.
15345 *
15346 * Driver for Marvell Yukon chipset and SysKonnect Gigabit Ethernet
15347 * Server Adapters.
15348 *
15349- * Created 10-Feb-1999, based on Linux' acenic.c, 3c59x.c and
15350- * SysKonnects GEnesis Solaris driver
15351- * Author: Christoph Goos (cgoos@syskonnect.de)
15352- * Mirko Lindner (mlindner@syskonnect.de)
15353+ * Author: Mirko Lindner (mlindner@syskonnect.de)
15354+ * Ralph Roesler (rroesler@syskonnect.de)
15355 *
15356 * Address all question to: linux@syskonnect.de
15357 *
15358- * The technical manual for the adapters is available from SysKonnect's
15359- * web pages: www.syskonnect.com
15360- * Goto "Support" and search Knowledge Base for "manual".
15361- *
15362 * This program is free software; you can redistribute it and/or modify
15363 * it under the terms of the GNU General Public License as published by
15364 * the Free Software Foundation; either version 2 of the License, or
15365@@ -38,85 +32,53 @@
15366
15367 /******************************************************************************
15368 *
15369- * Possible compiler options (#define xxx / -Dxxx):
15370- *
15371- * debugging can be enable by changing SK_DEBUG_CHKMOD and
15372- * SK_DEBUG_CHKCAT in makefile (described there).
15373- *
15374- ******************************************************************************/
15375-
15376-/******************************************************************************
15377- *
15378 * Description:
15379 *
15380- * This is the main module of the Linux GE driver.
15381- *
15382- * All source files except skge.c, skdrv1st.h, skdrv2nd.h and sktypes.h
15383- * are part of SysKonnect's COMMON MODULES for the SK-98xx adapters.
15384- * Those are used for drivers on multiple OS', so some thing may seem
15385- * unnecessary complicated on Linux. Please do not try to 'clean up'
15386- * them without VERY good reasons, because this will make it more
15387- * difficult to keep the Linux driver in synchronisation with the
15388- * other versions.
15389- *
15390- * Include file hierarchy:
15391- *
15392- * <linux/module.h>
15393- *
15394- * "h/skdrv1st.h"
15395- * <linux/types.h>
15396- * <linux/kernel.h>
15397- * <linux/string.h>
15398- * <linux/errno.h>
15399- * <linux/ioport.h>
15400- * <linux/slab.h>
15401- * <linux/interrupt.h>
15402- * <linux/pci.h>
15403- * <linux/bitops.h>
15404- * <asm/byteorder.h>
15405- * <asm/io.h>
15406- * <linux/netdevice.h>
15407- * <linux/etherdevice.h>
15408- * <linux/skbuff.h>
15409- * those three depending on kernel version used:
15410- * <linux/bios32.h>
15411- * <linux/init.h>
15412- * <asm/uaccess.h>
15413- * <net/checksum.h>
15414- *
15415- * "h/skerror.h"
15416- * "h/skdebug.h"
15417- * "h/sktypes.h"
15418- * "h/lm80.h"
15419- * "h/xmac_ii.h"
15420- *
15421- * "h/skdrv2nd.h"
15422- * "h/skqueue.h"
15423- * "h/skgehwt.h"
15424- * "h/sktimer.h"
15425- * "h/ski2c.h"
15426- * "h/skgepnmi.h"
15427- * "h/skvpd.h"
15428- * "h/skgehw.h"
15429- * "h/skgeinit.h"
15430- * "h/skaddr.h"
15431- * "h/skgesirq.h"
15432- * "h/skrlmt.h"
15433+ * All source files in this sk98lin directory except of the sk98lin
15434+ * Linux specific files
15435+ *
15436+ * - skdim.c
15437+ * - skethtool.c
15438+ * - skge.c
15439+ * - skproc.c
15440+ * - sky2.c
15441+ * - Makefile
15442+ * - h/skdrv1st.h
15443+ * - h/skdrv2nd.h
15444+ * - h/sktypes.h
15445+ * - h/skversion.h
15446+ *
15447+ * are part of SysKonnect's common modules for the SK-9xxx adapters.
15448+ *
15449+ * Those common module files which are not Linux specific are used to
15450+ * build drivers on different OS' (e.g. Windows, MAC OS) so that those
15451+ * drivers are based on the same set of files
15452+ *
15453+ * At a first glance, this seems to complicate things unnescessarily on
15454+ * Linux, but please do not try to 'clean up' them without VERY good
15455+ * reasons, because this will make it more difficult to keep the sk98lin
15456+ * driver for Linux in synchronisation with the other drivers running on
15457+ * other operating systems.
15458 *
15459 ******************************************************************************/
15460
15461 #include "h/skversion.h"
15462
15463-#include <linux/in.h>
15464 #include <linux/module.h>
15465-#include <linux/moduleparam.h>
15466 #include <linux/init.h>
15467-#include <linux/dma-mapping.h>
15468-#include <linux/ip.h>
15469+#include <linux/ethtool.h>
15470+
15471+#ifdef CONFIG_PROC_FS
15472+#include <linux/proc_fs.h>
15473+#endif
15474
15475 #include "h/skdrv1st.h"
15476 #include "h/skdrv2nd.h"
15477
15478+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)
15479+#include <linux/moduleparam.h>
15480+#endif
15481+
15482 /*******************************************************************************
15483 *
15484 * Defines
15485@@ -126,62 +88,14 @@
15486 /* for debuging on x86 only */
15487 /* #define BREAKPOINT() asm(" int $3"); */
15488
15489-/* use the transmit hw checksum driver functionality */
15490-#define USE_SK_TX_CHECKSUM
15491-
15492-/* use the receive hw checksum driver functionality */
15493-#define USE_SK_RX_CHECKSUM
15494-
15495-/* use the scatter-gather functionality with sendfile() */
15496-#define SK_ZEROCOPY
15497-
15498-/* use of a transmit complete interrupt */
15499-#define USE_TX_COMPLETE
15500-
15501-/*
15502- * threshold for copying small receive frames
15503- * set to 0 to avoid copying, set to 9001 to copy all frames
15504- */
15505-#define SK_COPY_THRESHOLD 50
15506-
15507-/* number of adapters that can be configured via command line params */
15508-#define SK_MAX_CARD_PARAM 16
15509-
15510-
15511-
15512-/*
15513- * use those defines for a compile-in version of the driver instead
15514- * of command line parameters
15515- */
15516-// #define LINK_SPEED_A {"Auto", }
15517-// #define LINK_SPEED_B {"Auto", }
15518-// #define AUTO_NEG_A {"Sense", }
15519-// #define AUTO_NEG_B {"Sense", }
15520-// #define DUP_CAP_A {"Both", }
15521-// #define DUP_CAP_B {"Both", }
15522-// #define FLOW_CTRL_A {"SymOrRem", }
15523-// #define FLOW_CTRL_B {"SymOrRem", }
15524-// #define ROLE_A {"Auto", }
15525-// #define ROLE_B {"Auto", }
15526-// #define PREF_PORT {"A", }
15527-// #define CON_TYPE {"Auto", }
15528-// #define RLMT_MODE {"CheckLinkState", }
15529-
15530-#define DEV_KFREE_SKB(skb) dev_kfree_skb(skb)
15531-#define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb)
15532-#define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb)
15533-
15534
15535 /* Set blink mode*/
15536 #define OEM_CONFIG_VALUE ( SK_ACT_LED_BLINK | \
15537 SK_DUP_LED_NORMAL | \
15538 SK_LED_LINK100_ON)
15539
15540-
15541-/* Isr return value */
15542-#define SkIsrRetVar irqreturn_t
15543-#define SkIsrRetNone IRQ_NONE
15544-#define SkIsrRetHandled IRQ_HANDLED
15545+#define CLEAR_AND_START_RX(Port) SK_OUT8(pAC->IoBase, RxQueueAddr[(Port)]+Q_CSR, CSR_START | CSR_IRQ_CL_F)
15546+#define CLEAR_TX_IRQ(Port,Prio) SK_OUT8(pAC->IoBase, TxQueueAddr[(Port)][(Prio)]+Q_CSR, CSR_IRQ_CL_F)
15547
15548
15549 /*******************************************************************************
15550@@ -190,12 +104,25 @@
15551 *
15552 ******************************************************************************/
15553
15554+static int __devinit sk98lin_init_device(struct pci_dev *pdev, const struct pci_device_id *ent);
15555+static void sk98lin_remove_device(struct pci_dev *pdev);
15556+#ifdef CONFIG_PM
15557+static int sk98lin_suspend(struct pci_dev *pdev, u32 state);
15558+static int sk98lin_resume(struct pci_dev *pdev);
15559+static void SkEnableWOMagicPacket(SK_AC *pAC, SK_IOC IoC, SK_MAC_ADDR MacAddr);
15560+#endif
15561+#ifdef Y2_RECOVERY
15562+static void SkGeHandleKernelTimer(unsigned long ptr);
15563+void SkGeCheckTimer(DEV_NET *pNet);
15564+static SK_BOOL CheckRXCounters(DEV_NET *pNet);
15565+static void CheckRxPath(DEV_NET *pNet);
15566+#endif
15567 static void FreeResources(struct SK_NET_DEVICE *dev);
15568 static int SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC);
15569 static SK_BOOL BoardAllocMem(SK_AC *pAC);
15570 static void BoardFreeMem(SK_AC *pAC);
15571 static void BoardInitMem(SK_AC *pAC);
15572-static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL);
15573+static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, int*, SK_BOOL);
15574 static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs);
15575 static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs);
15576 static int SkGeOpen(struct SK_NET_DEVICE *dev);
15577@@ -206,39 +133,76 @@
15578 static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev);
15579 static int SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd);
15580 static void GetConfiguration(SK_AC*);
15581+static void ProductStr(SK_AC*);
15582 static int XmitFrame(SK_AC*, TX_PORT*, struct sk_buff*);
15583 static void FreeTxDescriptors(SK_AC*pAC, TX_PORT*);
15584 static void FillRxRing(SK_AC*, RX_PORT*);
15585 static SK_BOOL FillRxDescriptor(SK_AC*, RX_PORT*);
15586+#ifdef CONFIG_SK98LIN_NAPI
15587+static int SkGePoll(struct net_device *dev, int *budget);
15588+static void ReceiveIrq(SK_AC*, RX_PORT*, SK_BOOL, int*, int);
15589+#else
15590 static void ReceiveIrq(SK_AC*, RX_PORT*, SK_BOOL);
15591-static void ClearAndStartRx(SK_AC*, int);
15592-static void ClearTxIrq(SK_AC*, int, int);
15593+#endif
15594+#ifdef SK_POLL_CONTROLLER
15595+static void SkGeNetPoll(struct SK_NET_DEVICE *dev);
15596+#endif
15597 static void ClearRxRing(SK_AC*, RX_PORT*);
15598 static void ClearTxRing(SK_AC*, TX_PORT*);
15599 static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int new_mtu);
15600 static void PortReInitBmu(SK_AC*, int);
15601 static int SkGeIocMib(DEV_NET*, unsigned int, int);
15602 static int SkGeInitPCI(SK_AC *pAC);
15603-static void StartDrvCleanupTimer(SK_AC *pAC);
15604-static void StopDrvCleanupTimer(SK_AC *pAC);
15605-static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*);
15606-
15607-#ifdef SK_DIAG_SUPPORT
15608 static SK_U32 ParseDeviceNbrFromSlotName(const char *SlotName);
15609 static int SkDrvInitAdapter(SK_AC *pAC, int devNbr);
15610 static int SkDrvDeInitAdapter(SK_AC *pAC, int devNbr);
15611-#endif
15612+extern void SkLocalEventQueue( SK_AC *pAC,
15613+ SK_U32 Class,
15614+ SK_U32 Event,
15615+ SK_U32 Param1,
15616+ SK_U32 Param2,
15617+ SK_BOOL Flag);
15618+extern void SkLocalEventQueue64( SK_AC *pAC,
15619+ SK_U32 Class,
15620+ SK_U32 Event,
15621+ SK_U64 Param,
15622+ SK_BOOL Flag);
15623+
15624+static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*);
15625
15626 /*******************************************************************************
15627 *
15628 * Extern Function Prototypes
15629 *
15630 ******************************************************************************/
15631+
15632+extern SK_BOOL SkY2AllocateResources(SK_AC *pAC);
15633+extern void SkY2FreeResources(SK_AC *pAC);
15634+extern void SkY2AllocateRxBuffers(SK_AC *pAC,SK_IOC IoC,int Port);
15635+extern void SkY2FreeRxBuffers(SK_AC *pAC,SK_IOC IoC,int Port);
15636+extern void SkY2FreeTxBuffers(SK_AC *pAC,SK_IOC IoC,int Port);
15637+extern SkIsrRetVar SkY2Isr(int irq,void *dev_id,struct pt_regs *ptregs);
15638+extern int SkY2Xmit(struct sk_buff *skb,struct SK_NET_DEVICE *dev);
15639+extern void SkY2PortStop(SK_AC *pAC,SK_IOC IoC,int Port,int Dir,int RstMode);
15640+extern void SkY2PortStart(SK_AC *pAC,SK_IOC IoC,int Port);
15641+extern int SkY2RlmtSend(SK_AC *pAC,int PortNr,struct sk_buff *pMessage);
15642+extern void SkY2RestartStatusUnit(SK_AC *pAC);
15643+extern void FillReceiveTableYukon2(SK_AC *pAC,SK_IOC IoC,int Port);
15644+#ifdef CONFIG_SK98LIN_NAPI
15645+extern int SkY2Poll(struct net_device *dev, int *budget);
15646+#endif
15647+
15648 extern void SkDimEnableModerationIfNeeded(SK_AC *pAC);
15649-extern void SkDimDisplayModerationSettings(SK_AC *pAC);
15650 extern void SkDimStartModerationTimer(SK_AC *pAC);
15651 extern void SkDimModerate(SK_AC *pAC);
15652-extern void SkGeBlinkTimer(unsigned long data);
15653+
15654+extern int SkEthIoctl(struct net_device *netdev, struct ifreq *ifr);
15655+
15656+#ifdef CONFIG_PROC_FS
15657+static const char SK_Root_Dir_entry[] = "sk98lin";
15658+static struct proc_dir_entry *pSkRootDir;
15659+extern struct file_operations sk_proc_fops;
15660+#endif
15661
15662 #ifdef DEBUG
15663 static void DumpMsg(struct sk_buff*, char*);
15664@@ -247,33 +211,436 @@
15665 #endif
15666
15667 /* global variables *********************************************************/
15668+static const char *BootString = BOOT_STRING;
15669+struct SK_NET_DEVICE *SkGeRootDev = NULL;
15670 static SK_BOOL DoPrintInterfaceChange = SK_TRUE;
15671-extern struct ethtool_ops SkGeEthtoolOps;
15672
15673 /* local variables **********************************************************/
15674 static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}};
15675 static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480};
15676+static int sk98lin_max_boards_found = 0;
15677+
15678+#ifdef CONFIG_PROC_FS
15679+static struct proc_dir_entry *pSkRootDir;
15680+#endif
15681+
15682+
15683+
15684+static struct pci_device_id sk98lin_pci_tbl[] __devinitdata = {
15685+/* { pci_vendor_id, pci_device_id, * SAMPLE ENTRY! *
15686+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, */
15687+ { 0x10b7, 0x1700, /* 3Com (10b7), Gigabit Ethernet Adapter */
15688+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15689+ { 0x10b7, 0x80eb, /* 3Com (10b7), 3Com 3C940B Gigabit LOM Ethernet Adapter */
15690+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15691+ { 0x1148, 0x4300, /* SysKonnect (1148), SK-98xx Gigabit Ethernet Server Adapter */
15692+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15693+ { 0x1148, 0x4320, /* SysKonnect (1148), SK-98xx V2.0 Gigabit Ethernet Adapter */
15694+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15695+ { 0x1148, 0x9000, /* SysKonnect (1148), SK-9Sxx 10/100/1000Base-T Server Adapter */
15696+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15697+ { 0x1148, 0x9E00, /* SysKonnect (1148), SK-9Exx 10/100/1000Base-T Adapter */
15698+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15699+ { 0x1186, 0x4b00, /* D-Link (1186), Gigabit Ethernet Adapter */
15700+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15701+ { 0x1186, 0x4b01, /* D-Link (1186), Gigabit Ethernet Adapter */
15702+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15703+ { 0x1186, 0x4c00, /* D-Link (1186), Gigabit Ethernet Adapter */
15704+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15705+ { 0x11ab, 0x4320, /* Marvell (11ab), Gigabit Ethernet Controller */
15706+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15707+ { 0x11ab, 0x4340, /* Marvell (11ab), Gigabit Ethernet Controller */
15708+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15709+ { 0x11ab, 0x4341, /* Marvell (11ab), Gigabit Ethernet Controller */
15710+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15711+ { 0x11ab, 0x4342, /* Marvell (11ab), Gigabit Ethernet Controller */
15712+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15713+ { 0x11ab, 0x4343, /* Marvell (11ab), Gigabit Ethernet Controller */
15714+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15715+ { 0x11ab, 0x4344, /* Marvell (11ab), Gigabit Ethernet Controller */
15716+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15717+ { 0x11ab, 0x4345, /* Marvell (11ab), Gigabit Ethernet Controller */
15718+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15719+ { 0x11ab, 0x4346, /* Marvell (11ab), Gigabit Ethernet Controller */
15720+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15721+ { 0x11ab, 0x4347, /* Marvell (11ab), Gigabit Ethernet Controller */
15722+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15723+ { 0x11ab, 0x4350, /* Marvell (11ab), Fast Ethernet Controller */
15724+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15725+ { 0x11ab, 0x4351, /* Marvell (11ab), Fast Ethernet Controller */
15726+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15727+ { 0x11ab, 0x4352, /* Marvell (11ab), Fast Ethernet Controller */
15728+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15729+ { 0x11ab, 0x4360, /* Marvell (11ab), Gigabit Ethernet Controller */
15730+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15731+ { 0x11ab, 0x4361, /* Marvell (11ab), Gigabit Ethernet Controller */
15732+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15733+ { 0x11ab, 0x4362, /* Marvell (11ab), Gigabit Ethernet Controller */
15734+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15735+ { 0x11ab, 0x4363, /* Marvell (11ab), Marvell */
15736+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15737+ { 0x11ab, 0x5005, /* Marvell (11ab), Belkin */
15738+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15739+ { 0x1371, 0x434e, /* CNet (1371), GigaCard Network Adapter */
15740+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15741+ { 0x1737, 0x1032, /* Linksys (1737), Gigabit Network Adapter */
15742+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15743+ { 0x1737, 0x1064, /* Linksys (1737), Gigabit Network Adapter */
15744+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
15745+ { 0, }
15746+};
15747+
15748+MODULE_DEVICE_TABLE(pci, sk98lin_pci_tbl);
15749+
15750+static struct pci_driver sk98lin_driver = {
15751+ .name = DRIVER_FILE_NAME,
15752+ .id_table = sk98lin_pci_tbl,
15753+ .probe = sk98lin_init_device,
15754+ .remove = __devexit_p(sk98lin_remove_device),
15755+#ifdef CONFIG_PM
15756+ .suspend = sk98lin_suspend,
15757+ .resume = sk98lin_resume
15758+#endif
15759+};
15760+
15761
15762 /*****************************************************************************
15763 *
15764- * SkPciWriteCfgDWord - write a 32 bit value to pci config space
15765+ * sk98lin_init_device - initialize the adapter
15766 *
15767 * Description:
15768- * This routine writes a 32 bit value to the pci configuration
15769- * space.
15770+ * This function initializes the adapter. Resources for
15771+ * the adapter are allocated and the adapter is brought into Init 1
15772+ * state.
15773 *
15774 * Returns:
15775- * 0 - indicate everything worked ok.
15776- * != 0 - error indication
15777+ * 0, if everything is ok
15778+ * !=0, on error
15779 */
15780-static inline int SkPciWriteCfgDWord(
15781-SK_AC *pAC, /* Adapter Control structure pointer */
15782-int PciAddr, /* PCI register address */
15783-SK_U32 Val) /* pointer to store the read value */
15784+static int __devinit sk98lin_init_device(struct pci_dev *pdev,
15785+ const struct pci_device_id *ent)
15786+
15787 {
15788- pci_write_config_dword(pAC->PciDev, PciAddr, Val);
15789- return(0);
15790-} /* SkPciWriteCfgDWord */
15791+ static SK_BOOL sk98lin_boot_string = SK_FALSE;
15792+ static SK_BOOL sk98lin_proc_entry = SK_FALSE;
15793+ static int sk98lin_boards_found = 0;
15794+ SK_AC *pAC;
15795+ DEV_NET *pNet = NULL;
15796+ struct SK_NET_DEVICE *dev = NULL;
15797+ int retval;
15798+#ifdef CONFIG_PROC_FS
15799+ struct proc_dir_entry *pProcFile;
15800+#endif
15801+ int pci_using_dac;
15802+
15803+ retval = pci_enable_device(pdev);
15804+ if (retval) {
15805+ printk(KERN_ERR "Cannot enable PCI device, "
15806+ "aborting.\n");
15807+ return retval;
15808+ }
15809+
15810+ dev = NULL;
15811+ pNet = NULL;
15812+
15813+
15814+ /* INSERT * We have to find the power-management capabilities */
15815+ /* Find power-management capability. */
15816+
15817+ pci_using_dac = 0; /* Set 32 bit DMA per default */
15818+ /* Configure DMA attributes. */
15819+ retval = pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL);
15820+ if (!retval) {
15821+ pci_using_dac = 1;
15822+ } else {
15823+ retval = pci_set_dma_mask(pdev, (u64) 0xffffffff);
15824+ if (retval) {
15825+ printk(KERN_ERR "No usable DMA configuration, "
15826+ "aborting.\n");
15827+ return retval;
15828+ }
15829+ }
15830+
15831+
15832+ if ((dev = alloc_etherdev(sizeof(DEV_NET))) == NULL) {
15833+ printk(KERN_ERR "Unable to allocate etherdev "
15834+ "structure!\n");
15835+ return -ENODEV;
15836+ }
15837+
15838+ pNet = dev->priv;
15839+ pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL);
15840+ if (pNet->pAC == NULL){
15841+ free_netdev(dev);
15842+ printk(KERN_ERR "Unable to allocate adapter "
15843+ "structure!\n");
15844+ return -ENODEV;
15845+ }
15846+
15847+
15848+ /* Print message */
15849+ if (!sk98lin_boot_string) {
15850+ /* set display flag to TRUE so that */
15851+ /* we only display this string ONCE */
15852+ sk98lin_boot_string = SK_TRUE;
15853+ printk("%s\n", BootString);
15854+ }
15855+
15856+ memset(pNet->pAC, 0, sizeof(SK_AC));
15857+ pAC = pNet->pAC;
15858+ pAC->PciDev = pdev;
15859+ pAC->PciDevId = pdev->device;
15860+ pAC->dev[0] = dev;
15861+ pAC->dev[1] = dev;
15862+ sprintf(pAC->Name, "SysKonnect SK-98xx");
15863+ pAC->CheckQueue = SK_FALSE;
15864+
15865+ dev->irq = pdev->irq;
15866+ retval = SkGeInitPCI(pAC);
15867+ if (retval) {
15868+ printk("SKGE: PCI setup failed: %i\n", retval);
15869+ free_netdev(dev);
15870+ return -ENODEV;
15871+ }
15872+
15873+ SET_MODULE_OWNER(dev);
15874+
15875+ dev->open = &SkGeOpen;
15876+ dev->stop = &SkGeClose;
15877+ dev->get_stats = &SkGeStats;
15878+ dev->set_multicast_list = &SkGeSetRxMode;
15879+ dev->set_mac_address = &SkGeSetMacAddr;
15880+ dev->do_ioctl = &SkGeIoctl;
15881+ dev->change_mtu = &SkGeChangeMtu;
15882+ dev->flags &= ~IFF_RUNNING;
15883+#ifdef SK_POLL_CONTROLLER
15884+ dev->poll_controller = SkGeNetPoll;
15885+#endif
15886+ SET_NETDEV_DEV(dev, &pdev->dev);
15887+
15888+ pAC->Index = sk98lin_boards_found;
15889+
15890+ if (SkGeBoardInit(dev, pAC)) {
15891+ free_netdev(dev);
15892+ return -ENODEV;
15893+ } else {
15894+ ProductStr(pAC);
15895+ }
15896+
15897+ if (pci_using_dac)
15898+ dev->features |= NETIF_F_HIGHDMA;
15899+
15900+ /* shifter to later moment in time... */
15901+ if (CHIP_ID_YUKON_2(pAC)) {
15902+ dev->hard_start_xmit = &SkY2Xmit;
15903+#ifdef CONFIG_SK98LIN_NAPI
15904+ dev->poll = &SkY2Poll;
15905+ dev->weight = 64;
15906+#endif
15907+ } else {
15908+ dev->hard_start_xmit = &SkGeXmit;
15909+#ifdef CONFIG_SK98LIN_NAPI
15910+ dev->poll = &SkGePoll;
15911+ dev->weight = 64;
15912+#endif
15913+ }
15914+
15915+#ifdef NETIF_F_TSO
15916+#ifdef USE_SK_TSO_FEATURE
15917+ if ((CHIP_ID_YUKON_2(pAC)) &&
15918+ (pAC->GIni.GIChipId != CHIP_ID_YUKON_EC_U)) {
15919+ dev->features |= NETIF_F_TSO;
15920+ }
15921+#endif
15922+#endif
15923+#ifdef CONFIG_SK98LIN_ZEROCOPY
15924+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS)
15925+ dev->features |= NETIF_F_SG;
15926+#endif
15927+#ifdef USE_SK_TX_CHECKSUM
15928+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS)
15929+ dev->features |= NETIF_F_IP_CSUM;
15930+#endif
15931+#ifdef USE_SK_RX_CHECKSUM
15932+ pAC->RxPort[0].UseRxCsum = SK_TRUE;
15933+ if (pAC->GIni.GIMacsFound == 2 ) {
15934+ pAC->RxPort[1].UseRxCsum = SK_TRUE;
15935+ }
15936+#endif
15937+
15938+ /* Save the hardware revision */
15939+ pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) +
15940+ (pAC->GIni.GIPciHwRev & 0x0F);
15941+
15942+ /* Set driver globals */
15943+ pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME;
15944+ pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE;
15945+
15946+ SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA));
15947+ SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct),
15948+ sizeof(SK_PNMI_STRUCT_DATA));
15949+
15950+ /* Register net device */
15951+ retval = register_netdev(dev);
15952+ if (retval) {
15953+ printk(KERN_ERR "SKGE: Could not register device.\n");
15954+ FreeResources(dev);
15955+ free_netdev(dev);
15956+ return retval;
15957+ }
15958+
15959+ /* Save initial device name */
15960+ strcpy(pNet->InitialDevName, dev->name);
15961+
15962+ /* Set network to off */
15963+ netif_stop_queue(dev);
15964+ netif_carrier_off(dev);
15965+
15966+ /* Print adapter specific string from vpd and config settings */
15967+ printk("%s: %s\n", pNet->InitialDevName, pAC->DeviceStr);
15968+ printk(" PrefPort:%c RlmtMode:%s\n",
15969+ 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber,
15970+ (pAC->RlmtMode==0) ? "Check Link State" :
15971+ ((pAC->RlmtMode==1) ? "Check Link State" :
15972+ ((pAC->RlmtMode==3) ? "Check Local Port" :
15973+ ((pAC->RlmtMode==7) ? "Check Segmentation" :
15974+ ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error")))));
15975+
15976+ SkGeYellowLED(pAC, pAC->IoBase, 1);
15977+
15978+ memcpy((caddr_t) &dev->dev_addr,
15979+ (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6);
15980+
15981+ /* First adapter... Create proc and print message */
15982+#ifdef CONFIG_PROC_FS
15983+ if (!sk98lin_proc_entry) {
15984+ sk98lin_proc_entry = SK_TRUE;
15985+ SK_MEMCPY(&SK_Root_Dir_entry, BootString,
15986+ sizeof(SK_Root_Dir_entry) - 1);
15987+
15988+ /*Create proc (directory)*/
15989+ if(!pSkRootDir) {
15990+ pSkRootDir = proc_mkdir(SK_Root_Dir_entry, proc_net);
15991+ if (!pSkRootDir) {
15992+ printk(KERN_WARNING "%s: Unable to create /proc/net/%s",
15993+ dev->name, SK_Root_Dir_entry);
15994+ } else {
15995+ pSkRootDir->owner = THIS_MODULE;
15996+ }
15997+ }
15998+ }
15999+
16000+ /* Create proc file */
16001+ if (pSkRootDir &&
16002+ (pProcFile = create_proc_entry(pNet->InitialDevName, S_IRUGO,
16003+ pSkRootDir))) {
16004+ pProcFile->proc_fops = &sk_proc_fops;
16005+ pProcFile->data = dev;
16006+ }
16007+
16008+#endif
16009+
16010+ pNet->PortNr = 0;
16011+ pNet->NetNr = 0;
16012+
16013+ sk98lin_boards_found++;
16014+ pci_set_drvdata(pdev, dev);
16015+
16016+ /* More then one port found */
16017+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
16018+ if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) {
16019+ printk(KERN_ERR "Unable to allocate etherdev "
16020+ "structure!\n");
16021+ return -ENODEV;
16022+ }
16023+
16024+ pAC->dev[1] = dev;
16025+ pNet = dev->priv;
16026+ pNet->PortNr = 1;
16027+ pNet->NetNr = 1;
16028+ pNet->pAC = pAC;
16029+
16030+ if (CHIP_ID_YUKON_2(pAC)) {
16031+ dev->hard_start_xmit = &SkY2Xmit;
16032+#ifdef CONFIG_SK98LIN_NAPI
16033+ dev->poll = &SkY2Poll;
16034+ dev->weight = 64;
16035+#endif
16036+ } else {
16037+ dev->hard_start_xmit = &SkGeXmit;
16038+#ifdef CONFIG_SK98LIN_NAPI
16039+ dev->poll = &SkGePoll;
16040+ dev->weight = 64;
16041+#endif
16042+ }
16043+ dev->open = &SkGeOpen;
16044+ dev->stop = &SkGeClose;
16045+ dev->get_stats = &SkGeStats;
16046+ dev->set_multicast_list = &SkGeSetRxMode;
16047+ dev->set_mac_address = &SkGeSetMacAddr;
16048+ dev->do_ioctl = &SkGeIoctl;
16049+ dev->change_mtu = &SkGeChangeMtu;
16050+ dev->flags &= ~IFF_RUNNING;
16051+#ifdef SK_POLL_CONTROLLER
16052+ dev->poll_controller = SkGeNetPoll;
16053+#endif
16054+
16055+#ifdef NETIF_F_TSO
16056+#ifdef USE_SK_TSO_FEATURE
16057+ if ((CHIP_ID_YUKON_2(pAC)) &&
16058+ (pAC->GIni.GIChipId != CHIP_ID_YUKON_EC_U)) {
16059+ dev->features |= NETIF_F_TSO;
16060+ }
16061+#endif
16062+#endif
16063+#ifdef CONFIG_SK98LIN_ZEROCOPY
16064+ /* Don't handle if Genesis chipset */
16065+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS)
16066+ dev->features |= NETIF_F_SG;
16067+#endif
16068+#ifdef USE_SK_TX_CHECKSUM
16069+ /* Don't handle if Genesis chipset */
16070+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS)
16071+ dev->features |= NETIF_F_IP_CSUM;
16072+#endif
16073+
16074+ if (register_netdev(dev)) {
16075+ printk(KERN_ERR "SKGE: Could not register device.\n");
16076+ free_netdev(dev);
16077+ pAC->dev[1] = pAC->dev[0];
16078+ } else {
16079+
16080+ /* Save initial device name */
16081+ strcpy(pNet->InitialDevName, dev->name);
16082+
16083+ /* Set network to off */
16084+ netif_stop_queue(dev);
16085+ netif_carrier_off(dev);
16086+
16087+
16088+#ifdef CONFIG_PROC_FS
16089+ if (pSkRootDir
16090+ && (pProcFile = create_proc_entry(pNet->InitialDevName,
16091+ S_IRUGO, pSkRootDir))) {
16092+ pProcFile->proc_fops = &sk_proc_fops;
16093+ pProcFile->data = dev;
16094+ }
16095+#endif
16096+
16097+ memcpy((caddr_t) &dev->dev_addr,
16098+ (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6);
16099+
16100+ printk("%s: %s\n", pNet->InitialDevName, pAC->DeviceStr);
16101+ printk(" PrefPort:B RlmtMode:Dual Check Link State\n");
16102+ }
16103+ }
16104+
16105+ pAC->Index = sk98lin_boards_found;
16106+ sk98lin_max_boards_found = sk98lin_boards_found;
16107+ return 0;
16108+}
16109+
16110+
16111
16112 /*****************************************************************************
16113 *
16114@@ -282,22 +649,26 @@
16115 * Description:
16116 * This function initialize the PCI resources and IO
16117 *
16118- * Returns:
16119- * 0 - indicate everything worked ok.
16120- * != 0 - error indication
16121+ * Returns: N/A
16122+ *
16123 */
16124-static __devinit int SkGeInitPCI(SK_AC *pAC)
16125+int SkGeInitPCI(SK_AC *pAC)
16126 {
16127 struct SK_NET_DEVICE *dev = pAC->dev[0];
16128 struct pci_dev *pdev = pAC->PciDev;
16129 int retval;
16130
16131+ if (pci_enable_device(pdev) != 0) {
16132+ return 1;
16133+ }
16134+
16135 dev->mem_start = pci_resource_start (pdev, 0);
16136 pci_set_master(pdev);
16137
16138- retval = pci_request_regions(pdev, "sk98lin");
16139- if (retval)
16140- goto out;
16141+ if (pci_request_regions(pdev, DRIVER_FILE_NAME) != 0) {
16142+ retval = 2;
16143+ goto out_disable;
16144+ }
16145
16146 #ifdef SK_BIG_ENDIAN
16147 /*
16148@@ -315,9 +686,10 @@
16149 /*
16150 * Remap the regs into kernel space.
16151 */
16152- pAC->IoBase = ioremap_nocache(dev->mem_start, 0x4000);
16153- if (!pAC->IoBase) {
16154- retval = -EIO;
16155+ pAC->IoBase = (char*)ioremap_nocache(dev->mem_start, 0x4000);
16156+
16157+ if (!pAC->IoBase){
16158+ retval = 3;
16159 goto out_release;
16160 }
16161
16162@@ -325,10 +697,460 @@
16163
16164 out_release:
16165 pci_release_regions(pdev);
16166- out:
16167+ out_disable:
16168+ pci_disable_device(pdev);
16169 return retval;
16170 }
16171
16172+#ifdef Y2_RECOVERY
16173+/*****************************************************************************
16174+ *
16175+ * SkGeHandleKernelTimer - Handle the kernel timer requests
16176+ *
16177+ * Description:
16178+ * If the requested time interval for the timer has elapsed,
16179+ * this function checks the link state.
16180+ *
16181+ * Returns: N/A
16182+ *
16183+ */
16184+static void SkGeHandleKernelTimer(
16185+unsigned long ptr) /* holds the pointer to adapter control context */
16186+{
16187+ DEV_NET *pNet = (DEV_NET*) ptr;
16188+ SkGeCheckTimer(pNet);
16189+}
16190+
16191+/*****************************************************************************
16192+ *
16193+ * sk98lin_check_timer - Resume the the card
16194+ *
16195+ * Description:
16196+ * This function checks the kernel timer
16197+ *
16198+ * Returns: N/A
16199+ *
16200+ */
16201+void SkGeCheckTimer(
16202+DEV_NET *pNet) /* holds the pointer to adapter control context */
16203+{
16204+ SK_AC *pAC = pNet->pAC;
16205+ SK_BOOL StartTimer = SK_TRUE;
16206+
16207+ if (pNet->InRecover)
16208+ return;
16209+ if (pNet->TimerExpired)
16210+ return;
16211+ pNet->TimerExpired = SK_TRUE;
16212+
16213+#define TXPORT pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]
16214+#define RXPORT pAC->RxPort[pNet->PortNr]
16215+
16216+ if ( (CHIP_ID_YUKON_2(pAC)) &&
16217+ (netif_running(pAC->dev[pNet->PortNr]))) {
16218+
16219+#ifdef Y2_RX_CHECK
16220+ if (HW_FEATURE(pAC, HWF_WA_DEV_4167)) {
16221+ /* Checks the RX path */
16222+ CheckRxPath(pNet);
16223+ }
16224+#endif
16225+
16226+ /* Checkthe transmitter */
16227+ if (!(IS_Q_EMPTY(&TXPORT.TxAQ_working))) {
16228+ if (TXPORT.LastDone != TXPORT.TxALET.Done) {
16229+ TXPORT.LastDone = TXPORT.TxALET.Done;
16230+ pNet->TransmitTimeoutTimer = 0;
16231+ } else {
16232+ pNet->TransmitTimeoutTimer++;
16233+ if (pNet->TransmitTimeoutTimer >= 10) {
16234+ pNet->TransmitTimeoutTimer = 0;
16235+#ifdef CHECK_TRANSMIT_TIMEOUT
16236+ StartTimer = SK_FALSE;
16237+ SkLocalEventQueue(pAC, SKGE_DRV,
16238+ SK_DRV_RECOVER,pNet->PortNr,-1,SK_FALSE);
16239+#endif
16240+ }
16241+ }
16242+ }
16243+
16244+#ifdef CHECK_TRANSMIT_TIMEOUT
16245+// if (!timer_pending(&pNet->KernelTimer)) {
16246+ pNet->KernelTimer.expires = jiffies + (HZ/4); /* 100ms */
16247+ add_timer(&pNet->KernelTimer);
16248+ pNet->TimerExpired = SK_FALSE;
16249+// }
16250+#endif
16251+ }
16252+}
16253+
16254+
16255+/*****************************************************************************
16256+*
16257+* CheckRXCounters - Checks the the statistics for RX path hang
16258+*
16259+* Description:
16260+* This function is called periodical by a timer.
16261+*
16262+* Notes:
16263+*
16264+* Function Parameters:
16265+*
16266+* Returns:
16267+* Traffic status
16268+*
16269+*/
16270+static SK_BOOL CheckRXCounters(
16271+DEV_NET *pNet) /* holds the pointer to adapter control context */
16272+{
16273+ SK_AC *pAC = pNet->pAC;
16274+ SK_BOOL bStatus = SK_FALSE;
16275+
16276+ /* Variable used to store the MAC RX FIFO RP, RPLev*/
16277+ SK_U32 MACFifoRP = 0;
16278+ SK_U32 MACFifoRLev = 0;
16279+
16280+ /* Variable used to store the PCI RX FIFO RP, RPLev*/
16281+ SK_U32 RXFifoRP = 0;
16282+ SK_U8 RXFifoRLev = 0;
16283+
16284+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
16285+ ("==> CheckRXCounters()\n"));
16286+
16287+ /*Check if statistic counters hangs*/
16288+ if (pNet->LastJiffies == pAC->dev[pNet->PortNr]->last_rx) {
16289+ /* Now read the values of read pointer/level from MAC RX FIFO again */
16290+ SK_IN32(pAC->IoBase, MR_ADDR(pNet->PortNr, RX_GMF_RP), &MACFifoRP);
16291+ SK_IN32(pAC->IoBase, MR_ADDR(pNet->PortNr, RX_GMF_RLEV), &MACFifoRLev);
16292+
16293+ /* Now read the values of read pointer/level from RX FIFO again */
16294+ SK_IN8(pAC->IoBase, Q_ADDR(pAC->GIni.GP[pNet->PortNr].PRxQOff, Q_RX_RP), &RXFifoRP);
16295+ SK_IN8(pAC->IoBase, Q_ADDR(pAC->GIni.GP[pNet->PortNr].PRxQOff, Q_RX_RL), &RXFifoRLev);
16296+
16297+ /* Check if the MAC RX hang */
16298+ if ((MACFifoRP == pNet->PreviousMACFifoRP) &&
16299+ (pNet->PreviousMACFifoRP != 0) &&
16300+ (MACFifoRLev >= pNet->PreviousMACFifoRLev)){
16301+ bStatus = SK_TRUE;
16302+ }
16303+
16304+ /* Check if the PCI RX hang */
16305+ if ((RXFifoRP == pNet->PreviousRXFifoRP) &&
16306+ (pNet->PreviousRXFifoRP != 0) &&
16307+ (RXFifoRLev >= pNet->PreviousRXFifoRLev)){
16308+ /*Set the flag to indicate that the RX FIFO hangs*/
16309+ bStatus = SK_TRUE;
16310+ }
16311+ }
16312+
16313+ /* Store now the values of counters for next check */
16314+ pNet->LastJiffies = pAC->dev[pNet->PortNr]->last_rx;
16315+
16316+ /* Store the values of read pointer/level from MAC RX FIFO for next test */
16317+ pNet->PreviousMACFifoRP = MACFifoRP;
16318+ pNet->PreviousMACFifoRLev = MACFifoRLev;
16319+
16320+ /* Store the values of read pointer/level from RX FIFO for next test */
16321+ pNet->PreviousRXFifoRP = RXFifoRP;
16322+ pNet->PreviousRXFifoRLev = RXFifoRLev;
16323+
16324+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
16325+ ("<== CheckRXCounters()\n"));
16326+
16327+ return bStatus;
16328+}
16329+
16330+/*****************************************************************************
16331+*
16332+* CheckRxPath - Checks if the RX path
16333+*
16334+* Description:
16335+* This function is called periodical by a timer.
16336+*
16337+* Notes:
16338+*
16339+* Function Parameters:
16340+*
16341+* Returns:
16342+* None.
16343+*
16344+*/
16345+static void CheckRxPath(
16346+DEV_NET *pNet) /* holds the pointer to adapter control context */
16347+{
16348+ unsigned long Flags; /* for the spin locks */
16349+ /* Initialize the pAC structure.*/
16350+ SK_AC *pAC = pNet->pAC;
16351+
16352+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
16353+ ("==> CheckRxPath()\n"));
16354+
16355+ /*If the statistics are not changed then could be an RX problem */
16356+ if (CheckRXCounters(pNet)){
16357+ /*
16358+ * First we try the simple solution by resetting the Level Timer
16359+ */
16360+
16361+ /* Stop Level Timer of Status BMU */
16362+ SK_OUT8(pAC->IoBase, STAT_LEV_TIMER_CTRL, TIM_STOP);
16363+
16364+ /* Start Level Timer of Status BMU */
16365+ SK_OUT8(pAC->IoBase, STAT_LEV_TIMER_CTRL, TIM_START);
16366+
16367+ if (!CheckRXCounters(pNet)) {
16368+ return;
16369+ }
16370+
16371+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
16372+ SkLocalEventQueue(pAC, SKGE_DRV,
16373+ SK_DRV_RECOVER,pNet->PortNr,-1,SK_TRUE);
16374+
16375+ /* Reset the fifo counters */
16376+ pNet->PreviousMACFifoRP = 0;
16377+ pNet->PreviousMACFifoRLev = 0;
16378+ pNet->PreviousRXFifoRP = 0;
16379+ pNet->PreviousRXFifoRLev = 0;
16380+
16381+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
16382+ }
16383+
16384+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
16385+ ("<== CheckRxPath()\n"));
16386+}
16387+
16388+
16389+
16390+#endif
16391+
16392+
16393+#ifdef CONFIG_PM
16394+/*****************************************************************************
16395+ *
16396+ * sk98lin_resume - Resume the the card
16397+ *
16398+ * Description:
16399+ * This function resumes the card into the D0 state
16400+ *
16401+ * Returns: N/A
16402+ *
16403+ */
16404+static int sk98lin_resume(
16405+struct pci_dev *pdev) /* the device that is to resume */
16406+{
16407+ struct net_device *dev = pci_get_drvdata(pdev);
16408+ DEV_NET *pNet = (DEV_NET*) dev->priv;
16409+ SK_AC *pAC = pNet->pAC;
16410+ SK_U16 PmCtlSts;
16411+
16412+ /* Set the power state to D0 */
16413+ pci_set_power_state(pdev, 0);
16414+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)
16415+ pci_restore_state(pdev);
16416+#else
16417+ pci_restore_state(pdev, pAC->PciState);
16418+#endif
16419+
16420+ /* Set the adapter power state to D0 */
16421+ SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
16422+ PmCtlSts &= ~(PCI_PM_STATE_D3); /* reset all DState bits */
16423+ PmCtlSts |= PCI_PM_STATE_D0;
16424+ SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PmCtlSts);
16425+
16426+ /* Reinit the adapter and start the port again */
16427+ pAC->BoardLevel = SK_INIT_DATA;
16428+ SkDrvLeaveDiagMode(pAC);
16429+
16430+ netif_device_attach(dev);
16431+ netif_start_queue(dev);
16432+ return 0;
16433+}
16434+
16435+/*****************************************************************************
16436+ *
16437+ * sk98lin_suspend - Suspend the card
16438+ *
16439+ * Description:
16440+ * This function suspends the card into a defined state
16441+ *
16442+ * Returns: N/A
16443+ *
16444+ */
16445+static int sk98lin_suspend(
16446+struct pci_dev *pdev, /* pointer to the device that is to suspend */
16447+u32 state) /* what power state is desired by Linux? */
16448+{
16449+ struct net_device *dev = pci_get_drvdata(pdev);
16450+ DEV_NET *pNet = (DEV_NET*) dev->priv;
16451+ SK_AC *pAC = pNet->pAC;
16452+ SK_U16 PciPMControlStatus;
16453+ SK_U16 PciPMCapabilities;
16454+ SK_MAC_ADDR MacAddr;
16455+ int i;
16456+
16457+ /* GEnesis and first yukon revs do not support power management */
16458+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON) {
16459+ if (pAC->GIni.GIChipRev == 0) {
16460+ return 0; /* power management not supported */
16461+ }
16462+ }
16463+
16464+ if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {
16465+ return 0; /* not supported for this chipset */
16466+ }
16467+
16468+ if (pAC->WolInfo.ConfiguredWolOptions == 0) {
16469+ return 0; /* WOL possible, but disabled via ethtool */
16470+ }
16471+
16472+ if(netif_running(dev)) {
16473+ netif_stop_queue(dev); /* stop device if running */
16474+ }
16475+
16476+ netif_device_detach(dev);
16477+
16478+ /* read the PM control/status register from the PCI config space */
16479+ SK_IN16(pAC->IoBase, PCI_C(pAC, PCI_PM_CTL_STS), &PciPMControlStatus);
16480+
16481+ /* read the power management capabilities from the config space */
16482+ SK_IN16(pAC->IoBase, PCI_C(pAC, PCI_PM_CAP_REG), &PciPMCapabilities);
16483+
16484+ /* Enable WakeUp with Magic Packet - get MAC address from adapter */
16485+ for (i = 0; i < SK_MAC_ADDR_LEN; i++) {
16486+ /* virtual address: will be used for data */
16487+ SK_IN8(pAC->IoBase, (B2_MAC_1 + i), &MacAddr.a[i]);
16488+ }
16489+
16490+ SkDrvEnterDiagMode(pAC);
16491+ SkEnableWOMagicPacket(pAC, pAC->IoBase, MacAddr);
16492+
16493+ pci_enable_wake(pdev, 3, 1);
16494+ pci_enable_wake(pdev, 4, 1); /* 4 == D3 cold */
16495+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)
16496+ pci_save_state(pdev);
16497+#else
16498+ pci_save_state(pdev, pAC->PciState);
16499+#endif
16500+ pci_set_power_state(pdev, state); /* set the state */
16501+
16502+ return 0;
16503+}
16504+
16505+
16506+/******************************************************************************
16507+ *
16508+ * SkEnableWOMagicPacket - Enable Wake on Magic Packet on the adapter
16509+ *
16510+ * Context:
16511+ * init, pageable
16512+ * the adapter should be de-initialized before calling this function
16513+ *
16514+ * Returns:
16515+ * nothing
16516+ */
16517+
16518+static void SkEnableWOMagicPacket(
16519+SK_AC *pAC, /* Adapter Control Context */
16520+SK_IOC IoC, /* I/O control context */
16521+SK_MAC_ADDR MacAddr) /* MacAddr expected in magic packet */
16522+{
16523+ SK_U16 Word;
16524+ SK_U32 DWord;
16525+ int i;
16526+ int HwPortIndex;
16527+ int Port = 0;
16528+
16529+ /* use Port 0 as long as we do not have any dual port cards which support WOL */
16530+ HwPortIndex = 0;
16531+ DWord = 0;
16532+
16533+ SK_OUT16(IoC, 0x0004, 0x0002); /* clear S/W Reset */
16534+ SK_OUT16(IoC, 0x0f10, 0x0002); /* clear Link Reset */
16535+
16536+ /*
16537+ * PHY Configuration:
16538+ * Autonegotioation is enalbed, advertise 10 HD, 10 FD,
16539+ * 100 HD, and 100 FD.
16540+ */
16541+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) ||
16542+ (pAC->GIni.GIChipId == CHIP_ID_YUKON) ||
16543+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE)) {
16544+
16545+ SK_OUT16(IoC, 0x0004, 0x0800); /* enable CLK_RUN */
16546+ SK_OUT8(IoC, 0x0007, 0xa9); /* enable VAUX */
16547+
16548+ /* WA code for COMA mode */
16549+ /* Only for yukon plus based chipsets rev A3 */
16550+ if (pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) {
16551+ SK_IN32(IoC, B2_GP_IO, &DWord);
16552+ DWord |= GP_DIR_9; /* set to output */
16553+ DWord &= ~GP_IO_9; /* clear PHY reset (active high) */
16554+ SK_OUT32(IoC, B2_GP_IO, DWord); /* clear PHY reset */
16555+ }
16556+
16557+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) ||
16558+ (pAC->GIni.GIChipId == CHIP_ID_YUKON)) {
16559+ SK_OUT32(IoC, 0x0f04, 0x01f04001); /* set PHY reset */
16560+ SK_OUT32(IoC, 0x0f04, 0x01f04002); /* clear PHY reset */
16561+ } else {
16562+ SK_OUT8(IoC, 0x0f04, 0x02); /* clear PHY reset */
16563+ }
16564+
16565+ SK_OUT8(IoC, 0x0f00, 0x02); /* clear MAC reset */
16566+ SkGmPhyWrite(pAC, IoC, Port, 4, 0x01e1); /* advertise 10/100 HD/FD */
16567+ SkGmPhyWrite(pAC, IoC, Port, 9, 0x0000); /* do not advertise 1000 HD/FD */
16568+ SkGmPhyWrite(pAC, IoC, Port, 00, 0xB300); /* 100 MBit, disable Autoneg */
16569+ } else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) {
16570+ SK_OUT8(IoC, 0x0007, 0xa9); /* enable VAUX */
16571+ SK_OUT8(IoC, 0x0f04, 0x02); /* clear PHY reset */
16572+ SK_OUT8(IoC, 0x0f00, 0x02); /* clear MAC reset */
16573+ SkGmPhyWrite(pAC, IoC, Port, 16, 0x0130); /* Enable Automatic Crossover */
16574+ SkGmPhyWrite(pAC, IoC, Port, 00, 0xB300); /* 100 MBit, disable Autoneg */
16575+ }
16576+
16577+
16578+ /*
16579+ * MAC Configuration:
16580+ * Set the MAC to 100 HD and enable the auto update features
16581+ * for Speed, Flow Control and Duplex Mode.
16582+ * If autonegotiation completes successfully the
16583+ * MAC takes the link parameters from the PHY.
16584+ * If the link partner doesn't support autonegotiation
16585+ * the MAC can receive magic packets if the link partner
16586+ * uses 100 HD.
16587+ */
16588+ SK_OUT16(IoC, 0x2804, 0x3832);
16589+
16590+
16591+ /*
16592+ * Set Up Magic Packet parameters
16593+ */
16594+ for (i = 0; i < 6; i+=2) { /* set up magic packet MAC address */
16595+ SK_IN16(IoC, 0x100 + i, &Word);
16596+ SK_OUT16(IoC, 0xf24 + i, Word);
16597+ }
16598+
16599+ SK_OUT16(IoC, 0x0f20, 0x0208); /* enable PME on magic packet */
16600+ /* and on wake up frame */
16601+
16602+ /*
16603+ * Set up PME generation
16604+ */
16605+ /* set PME legacy mode */
16606+ /* Only for PCI express based chipsets */
16607+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) ||
16608+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE)) {
16609+ SkPciReadCfgDWord(pAC, 0x40, &DWord);
16610+ DWord |= 0x8000;
16611+ SkPciWriteCfgDWord(pAC, 0x40, DWord);
16612+ }
16613+
16614+ /* clear PME status and switch adapter to DState */
16615+ SkPciReadCfgWord(pAC, 0x4c, &Word);
16616+ Word |= 0x103;
16617+ SkPciWriteCfgWord(pAC, 0x4c, Word);
16618+} /* SkEnableWOMagicPacket */
16619+#endif
16620+
16621
16622 /*****************************************************************************
16623 *
16624@@ -347,20 +1169,24 @@
16625 DEV_NET *pNet;
16626 SK_AC *pAC;
16627
16628- pNet = netdev_priv(dev);
16629- pAC = pNet->pAC;
16630- AllocFlag = pAC->AllocFlag;
16631- if (pAC->PciDev) {
16632- pci_release_regions(pAC->PciDev);
16633- }
16634- if (AllocFlag & SK_ALLOC_IRQ) {
16635- free_irq(dev->irq, dev);
16636- }
16637- if (pAC->IoBase) {
16638- iounmap(pAC->IoBase);
16639- }
16640- if (pAC->pDescrMem) {
16641- BoardFreeMem(pAC);
16642+ if (dev->priv) {
16643+ pNet = (DEV_NET*) dev->priv;
16644+ pAC = pNet->pAC;
16645+ AllocFlag = pAC->AllocFlag;
16646+ if (pAC->PciDev) {
16647+ pci_release_regions(pAC->PciDev);
16648+ }
16649+ if (AllocFlag & SK_ALLOC_IRQ) {
16650+ free_irq(dev->irq, dev);
16651+ }
16652+ if (pAC->IoBase) {
16653+ iounmap(pAC->IoBase);
16654+ }
16655+ if (CHIP_ID_YUKON_2(pAC)) {
16656+ SkY2FreeResources(pAC);
16657+ } else {
16658+ BoardFreeMem(pAC);
16659+ }
16660 }
16661
16662 } /* FreeResources */
16663@@ -369,6 +1195,7 @@
16664 MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver");
16665 MODULE_LICENSE("GPL");
16666
16667+
16668 #ifdef LINK_SPEED_A
16669 static char *Speed_A[SK_MAX_CARD_PARAM] = LINK_SPEED;
16670 #else
16671@@ -441,37 +1268,146 @@
16672 static char *PrefPort[SK_MAX_CARD_PARAM] = {"", };
16673 #endif
16674
16675-#ifdef RLMT_MODE
16676-static char *RlmtMode[SK_MAX_CARD_PARAM] = RLMT_MODE;
16677-#else
16678-static char *RlmtMode[SK_MAX_CARD_PARAM] = {"", };
16679+#ifdef RLMT_MODE
16680+static char *RlmtMode[SK_MAX_CARD_PARAM] = RLMT_MODE;
16681+#else
16682+static char *RlmtMode[SK_MAX_CARD_PARAM] = {"", };
16683+#endif
16684+
16685+static int IntsPerSec[SK_MAX_CARD_PARAM];
16686+static char *Moderation[SK_MAX_CARD_PARAM];
16687+static char *ModerationMask[SK_MAX_CARD_PARAM];
16688+
16689+static char *LowLatency[SK_MAX_CARD_PARAM];
16690+
16691+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)
16692+module_param_array(Speed_A, charp, NULL, 0);
16693+module_param_array(Speed_B, charp, NULL, 0);
16694+module_param_array(AutoNeg_A, charp, NULL, 0);
16695+module_param_array(AutoNeg_B, charp, NULL, 0);
16696+module_param_array(DupCap_A, charp, NULL, 0);
16697+module_param_array(DupCap_B, charp, NULL, 0);
16698+module_param_array(FlowCtrl_A, charp, NULL, 0);
16699+module_param_array(FlowCtrl_B, charp, NULL, 0);
16700+module_param_array(Role_A, charp, NULL, 0);
16701+module_param_array(Role_B, charp, NULL, 0);
16702+module_param_array(ConType, charp, NULL, 0);
16703+module_param_array(PrefPort, charp, NULL, 0);
16704+module_param_array(RlmtMode, charp, NULL, 0);
16705+/* used for interrupt moderation */
16706+module_param_array(IntsPerSec, int, NULL, 0);
16707+module_param_array(Moderation, charp, NULL, 0);
16708+module_param_array(ModerationMask, charp, NULL, 0);
16709+module_param_array(LowLatency, charp, NULL, 0);
16710+#else
16711+MODULE_PARM(Speed_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16712+MODULE_PARM(Speed_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16713+MODULE_PARM(AutoNeg_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16714+MODULE_PARM(AutoNeg_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16715+MODULE_PARM(DupCap_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16716+MODULE_PARM(DupCap_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16717+MODULE_PARM(FlowCtrl_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16718+MODULE_PARM(FlowCtrl_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16719+MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16720+MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16721+MODULE_PARM(ConType, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16722+MODULE_PARM(PrefPort, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16723+MODULE_PARM(RlmtMode, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16724+MODULE_PARM(IntsPerSec, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i");
16725+MODULE_PARM(Moderation, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16726+MODULE_PARM(ModerationMask, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16727+MODULE_PARM(LowLatency, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
16728+#endif
16729+
16730+
16731+/*****************************************************************************
16732+ *
16733+ * sk98lin_remove_device - device deinit function
16734+ *
16735+ * Description:
16736+ * Disable adapter if it is still running, free resources,
16737+ * free device struct.
16738+ *
16739+ * Returns: N/A
16740+ */
16741+
16742+static void sk98lin_remove_device(struct pci_dev *pdev)
16743+{
16744+DEV_NET *pNet;
16745+SK_AC *pAC;
16746+struct SK_NET_DEVICE *next;
16747+unsigned long Flags;
16748+struct net_device *dev = pci_get_drvdata(pdev);
16749+
16750+
16751+ /* Device not available. Return. */
16752+ if (!dev)
16753+ return;
16754+
16755+ pNet = (DEV_NET*) dev->priv;
16756+ pAC = pNet->pAC;
16757+ next = pAC->Next;
16758+
16759+ netif_stop_queue(dev);
16760+ SkGeYellowLED(pAC, pAC->IoBase, 0);
16761+
16762+ if(pAC->BoardLevel == SK_INIT_RUN) {
16763+ /* board is still alive */
16764+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
16765+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP,
16766+ 0, -1, SK_FALSE);
16767+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP,
16768+ 1, -1, SK_TRUE);
16769+
16770+ /* disable interrupts */
16771+ SK_OUT32(pAC->IoBase, B0_IMSK, 0);
16772+ SkGeDeInit(pAC, pAC->IoBase);
16773+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
16774+ pAC->BoardLevel = SK_INIT_DATA;
16775+ /* We do NOT check here, if IRQ was pending, of course*/
16776+ }
16777+
16778+ if(pAC->BoardLevel == SK_INIT_IO) {
16779+ /* board is still alive */
16780+ SkGeDeInit(pAC, pAC->IoBase);
16781+ pAC->BoardLevel = SK_INIT_DATA;
16782+ }
16783+
16784+ if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){
16785+ unregister_netdev(pAC->dev[1]);
16786+ free_netdev(pAC->dev[1]);
16787+ }
16788+
16789+ FreeResources(dev);
16790+
16791+#ifdef CONFIG_PROC_FS
16792+ /* Remove the sk98lin procfs device entries */
16793+ if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){
16794+ remove_proc_entry(pAC->dev[1]->name, pSkRootDir);
16795+ }
16796+ remove_proc_entry(pNet->InitialDevName, pSkRootDir);
16797+#endif
16798+
16799+ dev->get_stats = NULL;
16800+ /*
16801+ * otherwise unregister_netdev calls get_stats with
16802+ * invalid IO ... :-(
16803+ */
16804+ unregister_netdev(dev);
16805+ free_netdev(dev);
16806+ kfree(pAC);
16807+ sk98lin_max_boards_found--;
16808+
16809+#ifdef CONFIG_PROC_FS
16810+ /* Remove all Proc entries if last device */
16811+ if (sk98lin_max_boards_found == 0) {
16812+ /* clear proc-dir */
16813+ remove_proc_entry(pSkRootDir->name, proc_net);
16814+ }
16815 #endif
16816
16817-static int IntsPerSec[SK_MAX_CARD_PARAM];
16818-static char *Moderation[SK_MAX_CARD_PARAM];
16819-static char *ModerationMask[SK_MAX_CARD_PARAM];
16820-static char *AutoSizing[SK_MAX_CARD_PARAM];
16821-static char *Stats[SK_MAX_CARD_PARAM];
16822+}
16823
16824-module_param_array(Speed_A, charp, NULL, 0);
16825-module_param_array(Speed_B, charp, NULL, 0);
16826-module_param_array(AutoNeg_A, charp, NULL, 0);
16827-module_param_array(AutoNeg_B, charp, NULL, 0);
16828-module_param_array(DupCap_A, charp, NULL, 0);
16829-module_param_array(DupCap_B, charp, NULL, 0);
16830-module_param_array(FlowCtrl_A, charp, NULL, 0);
16831-module_param_array(FlowCtrl_B, charp, NULL, 0);
16832-module_param_array(Role_A, charp, NULL, 0);
16833-module_param_array(Role_B, charp, NULL, 0);
16834-module_param_array(ConType, charp, NULL, 0);
16835-module_param_array(PrefPort, charp, NULL, 0);
16836-module_param_array(RlmtMode, charp, NULL, 0);
16837-/* used for interrupt moderation */
16838-module_param_array(IntsPerSec, int, NULL, 0);
16839-module_param_array(Moderation, charp, NULL, 0);
16840-module_param_array(Stats, charp, NULL, 0);
16841-module_param_array(ModerationMask, charp, NULL, 0);
16842-module_param_array(AutoSizing, charp, NULL, 0);
16843
16844 /*****************************************************************************
16845 *
16846@@ -486,7 +1422,7 @@
16847 * 0, if everything is ok
16848 * !=0, on error
16849 */
16850-static int __devinit SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC)
16851+static int __init SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC)
16852 {
16853 short i;
16854 unsigned long Flags;
16855@@ -509,12 +1445,11 @@
16856 spin_lock_init(&pAC->TxPort[i][0].TxDesRingLock);
16857 spin_lock_init(&pAC->RxPort[i].RxDesRingLock);
16858 }
16859- spin_lock_init(&pAC->SlowPathLock);
16860
16861- /* setup phy_id blink timer */
16862- pAC->BlinkTimer.function = SkGeBlinkTimer;
16863- pAC->BlinkTimer.data = (unsigned long) dev;
16864- init_timer(&pAC->BlinkTimer);
16865+ spin_lock_init(&pAC->InitLock); /* Init lock */
16866+ spin_lock_init(&pAC->SlowPathLock);
16867+ spin_lock_init(&pAC->TxQueueLock); /* for Yukon2 chipsets */
16868+ spin_lock_init(&pAC->SetPutIndexLock); /* for Yukon2 chipsets */
16869
16870 /* level 0 init common modules here */
16871
16872@@ -523,7 +1458,7 @@
16873 if (SkGeInit(pAC, pAC->IoBase, SK_INIT_DATA) != 0) {
16874 printk("HWInit (0) failed.\n");
16875 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
16876- return -EIO;
16877+ return(-EAGAIN);
16878 }
16879 SkI2cInit( pAC, pAC->IoBase, SK_INIT_DATA);
16880 SkEventInit(pAC, pAC->IoBase, SK_INIT_DATA);
16881@@ -533,19 +1468,17 @@
16882 SkTimerInit(pAC, pAC->IoBase, SK_INIT_DATA);
16883
16884 pAC->BoardLevel = SK_INIT_DATA;
16885- pAC->RxBufSize = ETH_BUF_SIZE;
16886+ pAC->RxPort[0].RxBufSize = ETH_BUF_SIZE;
16887+ pAC->RxPort[1].RxBufSize = ETH_BUF_SIZE;
16888
16889 SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString);
16890 SK_PNMI_SET_DRIVER_VER(pAC, VerStr);
16891
16892- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
16893-
16894 /* level 1 init common modules here (HW init) */
16895- spin_lock_irqsave(&pAC->SlowPathLock, Flags);
16896 if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) {
16897 printk("sk98lin: HWInit (1) failed.\n");
16898 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
16899- return -EIO;
16900+ return(-EAGAIN);
16901 }
16902 SkI2cInit( pAC, pAC->IoBase, SK_INIT_IO);
16903 SkEventInit(pAC, pAC->IoBase, SK_INIT_IO);
16904@@ -553,46 +1486,93 @@
16905 SkAddrInit( pAC, pAC->IoBase, SK_INIT_IO);
16906 SkRlmtInit( pAC, pAC->IoBase, SK_INIT_IO);
16907 SkTimerInit(pAC, pAC->IoBase, SK_INIT_IO);
16908+#ifdef Y2_RECOVERY
16909+ /* mark entries invalid */
16910+ pAC->LastPort = 3;
16911+ pAC->LastOpc = 0xFF;
16912+#endif
16913
16914 /* Set chipset type support */
16915- pAC->ChipsetType = 0;
16916 if ((pAC->GIni.GIChipId == CHIP_ID_YUKON) ||
16917- (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE)) {
16918- pAC->ChipsetType = 1;
16919+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) ||
16920+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LP)) {
16921+ pAC->ChipsetType = 1; /* Yukon chipset (descriptor logic) */
16922+ } else if (CHIP_ID_YUKON_2(pAC)) {
16923+ pAC->ChipsetType = 2; /* Yukon2 chipset (list logic) */
16924+ } else {
16925+ pAC->ChipsetType = 0; /* Genesis chipset (descriptor logic) */
16926+ }
16927+
16928+ /* wake on lan support */
16929+ pAC->WolInfo.SupportedWolOptions = 0;
16930+#if defined (ETHTOOL_GWOL) && defined (ETHTOOL_SWOL)
16931+ if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) {
16932+ pAC->WolInfo.SupportedWolOptions = WAKE_MAGIC;
16933+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON) {
16934+ if (pAC->GIni.GIChipRev == 0) {
16935+ pAC->WolInfo.SupportedWolOptions = 0;
16936+ }
16937+ }
16938 }
16939+#endif
16940+ pAC->WolInfo.ConfiguredWolOptions = pAC->WolInfo.SupportedWolOptions;
16941
16942 GetConfiguration(pAC);
16943 if (pAC->RlmtNets == 2) {
16944- pAC->GIni.GIPortUsage = SK_MUL_LINK;
16945+ pAC->GIni.GP[0].PPortUsage = SK_MUL_LINK;
16946+ pAC->GIni.GP[1].PPortUsage = SK_MUL_LINK;
16947 }
16948
16949 pAC->BoardLevel = SK_INIT_IO;
16950 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
16951
16952- if (pAC->GIni.GIMacsFound == 2) {
16953- Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, "sk98lin", dev);
16954- } else if (pAC->GIni.GIMacsFound == 1) {
16955- Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ,
16956- "sk98lin", dev);
16957- } else {
16958- printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n",
16959- pAC->GIni.GIMacsFound);
16960- return -EIO;
16961+ if (!CHIP_ID_YUKON_2(pAC)) {
16962+ if (pAC->GIni.GIMacsFound == 2) {
16963+ Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, dev->name, dev);
16964+ } else if (pAC->GIni.GIMacsFound == 1) {
16965+ Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, dev->name, dev);
16966+ } else {
16967+ printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n",
16968+ pAC->GIni.GIMacsFound);
16969+ return -EAGAIN;
16970+ }
16971+ }
16972+ else {
16973+ Ret = request_irq(dev->irq, SkY2Isr, SA_SHIRQ, dev->name, dev);
16974 }
16975
16976 if (Ret) {
16977 printk(KERN_WARNING "sk98lin: Requested IRQ %d is busy.\n",
16978- dev->irq);
16979- return Ret;
16980+ dev->irq);
16981+ return -EAGAIN;
16982 }
16983 pAC->AllocFlag |= SK_ALLOC_IRQ;
16984
16985- /* Alloc memory for this board (Mem for RxD/TxD) : */
16986- if(!BoardAllocMem(pAC)) {
16987- printk("No memory for descriptor rings.\n");
16988- return -ENOMEM;
16989+ /*
16990+ ** Alloc descriptor/LETable memory for this board (both RxD/TxD)
16991+ */
16992+ if (CHIP_ID_YUKON_2(pAC)) {
16993+ if (!SkY2AllocateResources(pAC)) {
16994+ printk("No memory for Yukon2 settings\n");
16995+ return(-EAGAIN);
16996+ }
16997+ } else {
16998+ if(!BoardAllocMem(pAC)) {
16999+ printk("No memory for descriptor rings.\n");
17000+ return(-EAGAIN);
17001+ }
17002 }
17003
17004+#ifdef SK_USE_CSUM
17005+ SkCsSetReceiveFlags(pAC,
17006+ SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP,
17007+ &pAC->CsOfs1, &pAC->CsOfs2, 0);
17008+ pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1;
17009+#endif
17010+
17011+ /*
17012+ ** Function BoardInitMem() for Yukon dependent settings...
17013+ */
17014 BoardInitMem(pAC);
17015 /* tschilling: New common function with minimum size check. */
17016 DualNet = SK_FALSE;
17017@@ -604,11 +1584,22 @@
17018 pAC,
17019 pAC->ActivePort,
17020 DualNet)) {
17021- BoardFreeMem(pAC);
17022+ if (CHIP_ID_YUKON_2(pAC)) {
17023+ SkY2FreeResources(pAC);
17024+ } else {
17025+ BoardFreeMem(pAC);
17026+ }
17027+
17028 printk("sk98lin: SkGeInitAssignRamToQueues failed.\n");
17029- return -EIO;
17030+ return(-EAGAIN);
17031 }
17032
17033+ /*
17034+ * Register the device here
17035+ */
17036+ pAC->Next = SkGeRootDev;
17037+ SkGeRootDev = dev;
17038+
17039 return (0);
17040 } /* SkGeBoardInit */
17041
17042@@ -627,7 +1618,8 @@
17043 * SK_TRUE, if all memory could be allocated
17044 * SK_FALSE, if not
17045 */
17046-static __devinit SK_BOOL BoardAllocMem(SK_AC *pAC)
17047+static SK_BOOL BoardAllocMem(
17048+SK_AC *pAC)
17049 {
17050 caddr_t pDescrMem; /* pointer to descriptor memory area */
17051 size_t AllocLength; /* length of complete descriptor area */
17052@@ -697,16 +1689,20 @@
17053
17054 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
17055 ("BoardFreeMem\n"));
17056+
17057+ if (pAC->pDescrMem) {
17058+
17059 #if (BITS_PER_LONG == 32)
17060- AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8;
17061+ AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8;
17062 #else
17063- AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound
17064- + RX_RING_SIZE + 8;
17065+ AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound
17066+ + RX_RING_SIZE + 8;
17067 #endif
17068
17069- pci_free_consistent(pAC->PciDev, AllocLength,
17070+ pci_free_consistent(pAC->PciDev, AllocLength,
17071 pAC->pDescrMem, pAC->pDescrMemDMA);
17072- pAC->pDescrMem = NULL;
17073+ pAC->pDescrMem = NULL;
17074+ }
17075 } /* BoardFreeMem */
17076
17077
17078@@ -715,12 +1711,13 @@
17079 * BoardInitMem - initiate the descriptor rings
17080 *
17081 * Description:
17082- * This function sets the descriptor rings up in memory.
17083+ * This function sets the descriptor rings or LETables up in memory.
17084 * The adapter is initialized with the descriptor start addresses.
17085 *
17086 * Returns: N/A
17087 */
17088-static __devinit void BoardInitMem(SK_AC *pAC)
17089+static void BoardInitMem(
17090+SK_AC *pAC) /* pointer to adapter context */
17091 {
17092 int i; /* loop counter */
17093 int RxDescrSize; /* the size of a rx descriptor rounded up to alignment*/
17094@@ -729,34 +1726,37 @@
17095 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
17096 ("BoardInitMem\n"));
17097
17098- RxDescrSize = (((sizeof(RXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;
17099- pAC->RxDescrPerRing = RX_RING_SIZE / RxDescrSize;
17100- TxDescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;
17101- pAC->TxDescrPerRing = TX_RING_SIZE / RxDescrSize;
17102+ if (!pAC->GIni.GIYukon2) {
17103+ RxDescrSize = (((sizeof(RXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;
17104+ pAC->RxDescrPerRing = RX_RING_SIZE / RxDescrSize;
17105+ TxDescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;
17106+ pAC->TxDescrPerRing = TX_RING_SIZE / RxDescrSize;
17107
17108- for (i=0; i<pAC->GIni.GIMacsFound; i++) {
17109- SetupRing(
17110- pAC,
17111- pAC->TxPort[i][0].pTxDescrRing,
17112- pAC->TxPort[i][0].VTxDescrRing,
17113- (RXD**)&pAC->TxPort[i][0].pTxdRingHead,
17114- (RXD**)&pAC->TxPort[i][0].pTxdRingTail,
17115- (RXD**)&pAC->TxPort[i][0].pTxdRingPrev,
17116- &pAC->TxPort[i][0].TxdRingFree,
17117- SK_TRUE);
17118- SetupRing(
17119- pAC,
17120- pAC->RxPort[i].pRxDescrRing,
17121- pAC->RxPort[i].VRxDescrRing,
17122- &pAC->RxPort[i].pRxdRingHead,
17123- &pAC->RxPort[i].pRxdRingTail,
17124- &pAC->RxPort[i].pRxdRingPrev,
17125- &pAC->RxPort[i].RxdRingFree,
17126- SK_FALSE);
17127+ for (i=0; i<pAC->GIni.GIMacsFound; i++) {
17128+ SetupRing(
17129+ pAC,
17130+ pAC->TxPort[i][0].pTxDescrRing,
17131+ pAC->TxPort[i][0].VTxDescrRing,
17132+ (RXD**)&pAC->TxPort[i][0].pTxdRingHead,
17133+ (RXD**)&pAC->TxPort[i][0].pTxdRingTail,
17134+ (RXD**)&pAC->TxPort[i][0].pTxdRingPrev,
17135+ &pAC->TxPort[i][0].TxdRingFree,
17136+ &pAC->TxPort[i][0].TxdRingPrevFree,
17137+ SK_TRUE);
17138+ SetupRing(
17139+ pAC,
17140+ pAC->RxPort[i].pRxDescrRing,
17141+ pAC->RxPort[i].VRxDescrRing,
17142+ &pAC->RxPort[i].pRxdRingHead,
17143+ &pAC->RxPort[i].pRxdRingTail,
17144+ &pAC->RxPort[i].pRxdRingPrev,
17145+ &pAC->RxPort[i].RxdRingFree,
17146+ &pAC->RxPort[i].RxdRingFree,
17147+ SK_FALSE);
17148+ }
17149 }
17150 } /* BoardInitMem */
17151
17152-
17153 /*****************************************************************************
17154 *
17155 * SetupRing - create one descriptor ring
17156@@ -776,6 +1776,7 @@
17157 RXD **ppRingTail, /* address where the tail should be written */
17158 RXD **ppRingPrev, /* address where the tail should be written */
17159 int *pRingFree, /* address where the # of free descr. goes */
17160+int *pRingPrevFree, /* address where the # of free descr. goes */
17161 SK_BOOL IsTx) /* flag: is this a tx ring */
17162 {
17163 int i; /* loop counter */
17164@@ -808,7 +1809,7 @@
17165 /* set the pointers right */
17166 pDescr->VNextRxd = VNextDescr & 0xffffffffULL;
17167 pDescr->pNextRxd = pNextDescr;
17168- if (!IsTx) pDescr->TcpSumStarts = ETH_HLEN << 16 | ETH_HLEN;
17169+ pDescr->TcpSumStarts = pAC->CsOfs;
17170
17171 /* advance one step */
17172 pPrevDescr = pDescr;
17173@@ -818,11 +1819,12 @@
17174 }
17175 pPrevDescr->pNextRxd = (RXD*) pMemArea;
17176 pPrevDescr->VNextRxd = VMemArea;
17177- pDescr = (RXD*) pMemArea;
17178- *ppRingHead = (RXD*) pMemArea;
17179- *ppRingTail = *ppRingHead;
17180- *ppRingPrev = pPrevDescr;
17181- *pRingFree = DescrNum;
17182+ pDescr = (RXD*) pMemArea;
17183+ *ppRingHead = (RXD*) pMemArea;
17184+ *ppRingTail = *ppRingHead;
17185+ *ppRingPrev = pPrevDescr;
17186+ *pRingFree = DescrNum;
17187+ *pRingPrevFree = DescrNum;
17188 } /* SetupRing */
17189
17190
17191@@ -887,17 +1889,35 @@
17192 SK_AC *pAC;
17193 SK_U32 IntSrc; /* interrupts source register contents */
17194
17195- pNet = netdev_priv(dev);
17196+ pNet = (DEV_NET*) dev->priv;
17197 pAC = pNet->pAC;
17198
17199 /*
17200 * Check and process if its our interrupt
17201 */
17202 SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc);
17203- if (IntSrc == 0) {
17204+ if ((IntSrc == 0) && (!pNet->NetConsoleMode)) {
17205 return SkIsrRetNone;
17206 }
17207
17208+#ifdef CONFIG_SK98LIN_NAPI
17209+ if (netif_rx_schedule_prep(dev)) {
17210+ pAC->GIni.GIValIrqMask &= ~(NAPI_DRV_IRQS);
17211+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
17212+ __netif_rx_schedule(dev);
17213+ }
17214+
17215+#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
17216+ if (IntSrc & IS_XA1_F) {
17217+ CLEAR_TX_IRQ(0, TX_PRIO_LOW);
17218+ }
17219+ if (IntSrc & IS_XA2_F) {
17220+ CLEAR_TX_IRQ(1, TX_PRIO_LOW);
17221+ }
17222+#endif
17223+
17224+
17225+#else
17226 while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) {
17227 #if 0 /* software irq currently not used */
17228 if (IntSrc & IS_IRQ_SW) {
17229@@ -911,6 +1931,7 @@
17230 SK_DBGCAT_DRV_INT_SRC,
17231 ("EOF RX1 IRQ\n"));
17232 ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE);
17233+ CLEAR_AND_START_RX(0);
17234 SK_PNMI_CNT_RX_INTR(pAC, 0);
17235 }
17236 if (IntSrc & IS_R2_F) {
17237@@ -918,6 +1939,7 @@
17238 SK_DBGCAT_DRV_INT_SRC,
17239 ("EOF RX2 IRQ\n"));
17240 ReceiveIrq(pAC, &pAC->RxPort[1], SK_TRUE);
17241+ CLEAR_AND_START_RX(1);
17242 SK_PNMI_CNT_RX_INTR(pAC, 1);
17243 }
17244 #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
17245@@ -925,6 +1947,7 @@
17246 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
17247 SK_DBGCAT_DRV_INT_SRC,
17248 ("EOF AS TX1 IRQ\n"));
17249+ CLEAR_TX_IRQ(0, TX_PRIO_LOW);
17250 SK_PNMI_CNT_TX_INTR(pAC, 0);
17251 spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
17252 FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]);
17253@@ -934,6 +1957,7 @@
17254 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
17255 SK_DBGCAT_DRV_INT_SRC,
17256 ("EOF AS TX2 IRQ\n"));
17257+ CLEAR_TX_IRQ(1, TX_PRIO_LOW);
17258 SK_PNMI_CNT_TX_INTR(pAC, 1);
17259 spin_lock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock);
17260 FreeTxDescriptors(pAC, &pAC->TxPort[1][TX_PRIO_LOW]);
17261@@ -944,38 +1968,28 @@
17262 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
17263 SK_DBGCAT_DRV_INT_SRC,
17264 ("EOF SY TX1 IRQ\n"));
17265+ CLEAR_TX_IRQ(0, TX_PRIO_HIGH);
17266 SK_PNMI_CNT_TX_INTR(pAC, 1);
17267 spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
17268 FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH);
17269 spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
17270- ClearTxIrq(pAC, 0, TX_PRIO_HIGH);
17271 }
17272 if (IntSrc & IS_XS2_F) {
17273 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
17274 SK_DBGCAT_DRV_INT_SRC,
17275 ("EOF SY TX2 IRQ\n"));
17276+ CLEAR_TX_IRQ(1, TX_PRIO_HIGH);
17277 SK_PNMI_CNT_TX_INTR(pAC, 1);
17278 spin_lock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock);
17279 FreeTxDescriptors(pAC, 1, TX_PRIO_HIGH);
17280 spin_unlock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock);
17281- ClearTxIrq(pAC, 1, TX_PRIO_HIGH);
17282 }
17283 #endif
17284 #endif
17285
17286- /* do all IO at once */
17287- if (IntSrc & IS_R1_F)
17288- ClearAndStartRx(pAC, 0);
17289- if (IntSrc & IS_R2_F)
17290- ClearAndStartRx(pAC, 1);
17291-#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
17292- if (IntSrc & IS_XA1_F)
17293- ClearTxIrq(pAC, 0, TX_PRIO_LOW);
17294- if (IntSrc & IS_XA2_F)
17295- ClearTxIrq(pAC, 1, TX_PRIO_LOW);
17296-#endif
17297 SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc);
17298 } /* while (IntSrc & IRQ_MASK != 0) */
17299+#endif
17300
17301 IntSrc &= pAC->GIni.GIValIrqMask;
17302 if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) {
17303@@ -989,18 +2003,12 @@
17304 SkEventDispatcher(pAC, pAC->IoBase);
17305 spin_unlock(&pAC->SlowPathLock);
17306 }
17307- /*
17308- * do it all again is case we cleared an interrupt that
17309- * came in after handling the ring (OUTs may be delayed
17310- * in hardware buffers, but are through after IN)
17311- *
17312- * rroesler: has been commented out and shifted to
17313- * SkGeDrvEvent(), because it is timer
17314- * guarded now
17315- *
17316+
17317+#ifndef CONFIG_SK98LIN_NAPI
17318+ /* Handle interrupts */
17319 ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE);
17320 ReceiveIrq(pAC, &pAC->RxPort[1], SK_TRUE);
17321- */
17322+#endif
17323
17324 if (pAC->CheckQueue) {
17325 pAC->CheckQueue = SK_FALSE;
17326@@ -1036,17 +2044,32 @@
17327 SK_AC *pAC;
17328 SK_U32 IntSrc; /* interrupts source register contents */
17329
17330- pNet = netdev_priv(dev);
17331+ pNet = (DEV_NET*) dev->priv;
17332 pAC = pNet->pAC;
17333
17334 /*
17335 * Check and process if its our interrupt
17336 */
17337 SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc);
17338- if (IntSrc == 0) {
17339+ if ((IntSrc == 0) && (!pNet->NetConsoleMode)) {
17340 return SkIsrRetNone;
17341 }
17342
17343+#ifdef CONFIG_SK98LIN_NAPI
17344+ if (netif_rx_schedule_prep(dev)) {
17345+ CLEAR_AND_START_RX(0);
17346+ CLEAR_TX_IRQ(0, TX_PRIO_LOW);
17347+ pAC->GIni.GIValIrqMask &= ~(NAPI_DRV_IRQS);
17348+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
17349+ __netif_rx_schedule(dev);
17350+ }
17351+
17352+#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
17353+ if (IntSrc & IS_XA1_F) {
17354+ CLEAR_TX_IRQ(0, TX_PRIO_LOW);
17355+ }
17356+#endif
17357+#else
17358 while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) {
17359 #if 0 /* software irq currently not used */
17360 if (IntSrc & IS_IRQ_SW) {
17361@@ -1060,6 +2083,7 @@
17362 SK_DBGCAT_DRV_INT_SRC,
17363 ("EOF RX1 IRQ\n"));
17364 ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE);
17365+ CLEAR_AND_START_RX(0);
17366 SK_PNMI_CNT_RX_INTR(pAC, 0);
17367 }
17368 #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
17369@@ -1067,6 +2091,7 @@
17370 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
17371 SK_DBGCAT_DRV_INT_SRC,
17372 ("EOF AS TX1 IRQ\n"));
17373+ CLEAR_TX_IRQ(0, TX_PRIO_LOW);
17374 SK_PNMI_CNT_TX_INTR(pAC, 0);
17375 spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
17376 FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]);
17377@@ -1077,24 +2102,18 @@
17378 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
17379 SK_DBGCAT_DRV_INT_SRC,
17380 ("EOF SY TX1 IRQ\n"));
17381+ CLEAR_TX_IRQ(0, TX_PRIO_HIGH);
17382 SK_PNMI_CNT_TX_INTR(pAC, 0);
17383 spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
17384 FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH);
17385 spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
17386- ClearTxIrq(pAC, 0, TX_PRIO_HIGH);
17387 }
17388 #endif
17389 #endif
17390
17391- /* do all IO at once */
17392- if (IntSrc & IS_R1_F)
17393- ClearAndStartRx(pAC, 0);
17394-#ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
17395- if (IntSrc & IS_XA1_F)
17396- ClearTxIrq(pAC, 0, TX_PRIO_LOW);
17397-#endif
17398 SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc);
17399 } /* while (IntSrc & IRQ_MASK != 0) */
17400+#endif
17401
17402 IntSrc &= pAC->GIni.GIValIrqMask;
17403 if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) {
17404@@ -1108,17 +2127,10 @@
17405 SkEventDispatcher(pAC, pAC->IoBase);
17406 spin_unlock(&pAC->SlowPathLock);
17407 }
17408- /*
17409- * do it all again is case we cleared an interrupt that
17410- * came in after handling the ring (OUTs may be delayed
17411- * in hardware buffers, but are through after IN)
17412- *
17413- * rroesler: has been commented out and shifted to
17414- * SkGeDrvEvent(), because it is timer
17415- * guarded now
17416- *
17417+
17418+#ifndef CONFIG_SK98LIN_NAPI
17419 ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE);
17420- */
17421+#endif
17422
17423 /* IRQ is processed - Enable IRQs again*/
17424 SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
17425@@ -1126,25 +2138,6 @@
17426 return SkIsrRetHandled;
17427 } /* SkGeIsrOnePort */
17428
17429-#ifdef CONFIG_NET_POLL_CONTROLLER
17430-/****************************************************************************
17431- *
17432- * SkGePollController - polling receive, for netconsole
17433- *
17434- * Description:
17435- * Polling receive - used by netconsole and other diagnostic tools
17436- * to allow network i/o with interrupts disabled.
17437- *
17438- * Returns: N/A
17439- */
17440-static void SkGePollController(struct net_device *dev)
17441-{
17442- disable_irq(dev->irq);
17443- SkGeIsr(dev->irq, dev, NULL);
17444- enable_irq(dev->irq);
17445-}
17446-#endif
17447-
17448 /****************************************************************************
17449 *
17450 * SkGeOpen - handle start of initialized adapter
17451@@ -1162,27 +2155,27 @@
17452 * != 0 on error
17453 */
17454 static int SkGeOpen(
17455-struct SK_NET_DEVICE *dev)
17456+struct SK_NET_DEVICE *dev) /* the device that is to be opened */
17457 {
17458- DEV_NET *pNet;
17459- SK_AC *pAC;
17460- unsigned long Flags; /* for spin lock */
17461- int i;
17462- SK_EVPARA EvPara; /* an event parameter union */
17463+ DEV_NET *pNet = (DEV_NET*) dev->priv;
17464+ SK_AC *pAC = pNet->pAC;
17465+ unsigned long Flags; /* for the spin locks */
17466+ unsigned long InitFlags; /* for the spin locks */
17467+ int CurrMac; /* loop ctr for ports */
17468
17469- pNet = netdev_priv(dev);
17470- pAC = pNet->pAC;
17471-
17472 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
17473 ("SkGeOpen: pAC=0x%lX:\n", (unsigned long)pAC));
17474+ spin_lock_irqsave(&pAC->InitLock, InitFlags);
17475
17476-#ifdef SK_DIAG_SUPPORT
17477 if (pAC->DiagModeActive == DIAG_ACTIVE) {
17478 if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {
17479 return (-1); /* still in use by diag; deny actions */
17480 }
17481 }
17482-#endif
17483+
17484+ if (!try_module_get(THIS_MODULE)) {
17485+ return (-1); /* increase of usage count not possible */
17486+ }
17487
17488 /* Set blink mode */
17489 if ((pAC->PciDev->vendor == 0x1186) || (pAC->PciDev->vendor == 0x11ab ))
17490@@ -1191,6 +2184,7 @@
17491 if (pAC->BoardLevel == SK_INIT_DATA) {
17492 /* level 1 init common modules here */
17493 if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) {
17494+ module_put(THIS_MODULE); /* decrease usage count */
17495 printk("%s: HWInit (1) failed.\n", pAC->dev[pNet->PortNr]->name);
17496 return (-1);
17497 }
17498@@ -1201,11 +2195,17 @@
17499 SkRlmtInit (pAC, pAC->IoBase, SK_INIT_IO);
17500 SkTimerInit (pAC, pAC->IoBase, SK_INIT_IO);
17501 pAC->BoardLevel = SK_INIT_IO;
17502+#ifdef Y2_RECOVERY
17503+ /* mark entries invalid */
17504+ pAC->LastPort = 3;
17505+ pAC->LastOpc = 0xFF;
17506+#endif
17507 }
17508
17509 if (pAC->BoardLevel != SK_INIT_RUN) {
17510 /* tschilling: Level 2 init modules here, check return value. */
17511 if (SkGeInit(pAC, pAC->IoBase, SK_INIT_RUN) != 0) {
17512+ module_put(THIS_MODULE); /* decrease usage count */
17513 printk("%s: HWInit (2) failed.\n", pAC->dev[pNet->PortNr]->name);
17514 return (-1);
17515 }
17516@@ -1218,44 +2218,62 @@
17517 pAC->BoardLevel = SK_INIT_RUN;
17518 }
17519
17520- for (i=0; i<pAC->GIni.GIMacsFound; i++) {
17521- /* Enable transmit descriptor polling. */
17522- SkGePollTxD(pAC, pAC->IoBase, i, SK_TRUE);
17523- FillRxRing(pAC, &pAC->RxPort[i]);
17524+ for (CurrMac=0; CurrMac<pAC->GIni.GIMacsFound; CurrMac++) {
17525+ if (!CHIP_ID_YUKON_2(pAC)) {
17526+ /* Enable transmit descriptor polling. */
17527+ SkGePollTxD(pAC, pAC->IoBase, CurrMac, SK_TRUE);
17528+ FillRxRing(pAC, &pAC->RxPort[CurrMac]);
17529+ SkMacRxTxEnable(pAC, pAC->IoBase, pNet->PortNr);
17530+ }
17531 }
17532- SkGeYellowLED(pAC, pAC->IoBase, 1);
17533
17534- StartDrvCleanupTimer(pAC);
17535+ SkGeYellowLED(pAC, pAC->IoBase, 1);
17536 SkDimEnableModerationIfNeeded(pAC);
17537- SkDimDisplayModerationSettings(pAC);
17538
17539- pAC->GIni.GIValIrqMask &= IRQ_MASK;
17540-
17541- /* enable Interrupts */
17542- SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
17543- SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK);
17544+ if (!CHIP_ID_YUKON_2(pAC)) {
17545+ /*
17546+ ** Has been setup already at SkGeInit(SK_INIT_IO),
17547+ ** but additional masking added for Genesis & Yukon
17548+ ** chipsets -> modify it...
17549+ */
17550+ pAC->GIni.GIValIrqMask &= IRQ_MASK;
17551+#ifndef USE_TX_COMPLETE
17552+ pAC->GIni.GIValIrqMask &= ~(TX_COMPL_IRQS);
17553+#endif
17554+ }
17555
17556 spin_lock_irqsave(&pAC->SlowPathLock, Flags);
17557
17558 if ((pAC->RlmtMode != 0) && (pAC->MaxPorts == 0)) {
17559- EvPara.Para32[0] = pAC->RlmtNets;
17560- EvPara.Para32[1] = -1;
17561- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS,
17562- EvPara);
17563- EvPara.Para32[0] = pAC->RlmtMode;
17564- EvPara.Para32[1] = 0;
17565- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_MODE_CHANGE,
17566- EvPara);
17567+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS,
17568+ pAC->RlmtNets, -1, SK_FALSE);
17569+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_MODE_CHANGE,
17570+ pAC->RlmtMode, 0, SK_FALSE);
17571 }
17572
17573- EvPara.Para32[0] = pNet->NetNr;
17574- EvPara.Para32[1] = -1;
17575- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
17576- SkEventDispatcher(pAC, pAC->IoBase);
17577+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_START,
17578+ pNet->NetNr, -1, SK_TRUE);
17579 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
17580
17581- pAC->MaxPorts++;
17582+#ifdef Y2_RECOVERY
17583+ pNet->TimerExpired = SK_FALSE;
17584+ pNet->InRecover = SK_FALSE;
17585+ pNet->NetConsoleMode = SK_FALSE;
17586+
17587+ /* Initialize the kernel timer */
17588+ init_timer(&pNet->KernelTimer);
17589+ pNet->KernelTimer.function = SkGeHandleKernelTimer;
17590+ pNet->KernelTimer.data = (unsigned long) pNet;
17591+ pNet->KernelTimer.expires = jiffies + (HZ/4); /* initially 250ms */
17592+ add_timer(&pNet->KernelTimer);
17593+#endif
17594+
17595+ /* enable Interrupts */
17596+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
17597+ SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK);
17598
17599+ pAC->MaxPorts++;
17600+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags);
17601
17602 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
17603 ("SkGeOpen suceeded\n"));
17604@@ -1276,32 +2294,37 @@
17605 * error code - on error
17606 */
17607 static int SkGeClose(
17608-struct SK_NET_DEVICE *dev)
17609+struct SK_NET_DEVICE *dev) /* the device that is to be closed */
17610 {
17611- DEV_NET *pNet;
17612- DEV_NET *newPtrNet;
17613- SK_AC *pAC;
17614-
17615- unsigned long Flags; /* for spin lock */
17616- int i;
17617- int PortIdx;
17618- SK_EVPARA EvPara;
17619-
17620+ DEV_NET *pNet = (DEV_NET*) dev->priv;
17621+ SK_AC *pAC = pNet->pAC;
17622+ DEV_NET *newPtrNet;
17623+ unsigned long Flags; /* for the spin locks */
17624+ unsigned long InitFlags; /* for the spin locks */
17625+ int CurrMac; /* loop ctr for the current MAC */
17626+ int PortIdx;
17627+#ifdef CONFIG_SK98LIN_NAPI
17628+ int WorkToDo = 1; /* min(*budget, dev->quota); */
17629+ int WorkDone = 0;
17630+#endif
17631 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
17632 ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC));
17633+ spin_lock_irqsave(&pAC->InitLock, InitFlags);
17634
17635- pNet = netdev_priv(dev);
17636- pAC = pNet->pAC;
17637+#ifdef Y2_RECOVERY
17638+ pNet->InRecover = SK_TRUE;
17639+ del_timer(&pNet->KernelTimer);
17640+#endif
17641
17642-#ifdef SK_DIAG_SUPPORT
17643 if (pAC->DiagModeActive == DIAG_ACTIVE) {
17644 if (pAC->DiagFlowCtrl == SK_FALSE) {
17645+ module_put(THIS_MODULE);
17646 /*
17647 ** notify that the interface which has been closed
17648 ** by operator interaction must not be started up
17649 ** again when the DIAG has finished.
17650 */
17651- newPtrNet = netdev_priv(pAC->dev[0]);
17652+ newPtrNet = (DEV_NET *) pAC->dev[0]->priv;
17653 if (newPtrNet == pNet) {
17654 pAC->WasIfUp[0] = SK_FALSE;
17655 } else {
17656@@ -1312,7 +2335,6 @@
17657 pAC->DiagFlowCtrl = SK_FALSE;
17658 }
17659 }
17660-#endif
17661
17662 netif_stop_queue(dev);
17663
17664@@ -1321,8 +2343,6 @@
17665 else
17666 PortIdx = pNet->NetNr;
17667
17668- StopDrvCleanupTimer(pAC);
17669-
17670 /*
17671 * Clear multicast table, promiscuous mode ....
17672 */
17673@@ -1334,46 +2354,101 @@
17674 spin_lock_irqsave(&pAC->SlowPathLock, Flags);
17675 /* disable interrupts */
17676 SK_OUT32(pAC->IoBase, B0_IMSK, 0);
17677- EvPara.Para32[0] = pNet->NetNr;
17678- EvPara.Para32[1] = -1;
17679- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
17680- SkEventDispatcher(pAC, pAC->IoBase);
17681+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP,
17682+ pNet->NetNr, -1, SK_TRUE);
17683 SK_OUT32(pAC->IoBase, B0_IMSK, 0);
17684 /* stop the hardware */
17685- SkGeDeInit(pAC, pAC->IoBase);
17686- pAC->BoardLevel = SK_INIT_DATA;
17687+
17688+
17689+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 1)) {
17690+ /* RLMT check link state mode */
17691+ for (CurrMac=0; CurrMac<pAC->GIni.GIMacsFound; CurrMac++) {
17692+ if (CHIP_ID_YUKON_2(pAC))
17693+ SkY2PortStop( pAC,
17694+ pAC->IoBase,
17695+ CurrMac,
17696+ SK_STOP_ALL,
17697+ SK_HARD_RST);
17698+ else
17699+ SkGeStopPort( pAC,
17700+ pAC->IoBase,
17701+ CurrMac,
17702+ SK_STOP_ALL,
17703+ SK_HARD_RST);
17704+ } /* for */
17705+ } else {
17706+ /* Single link or single port */
17707+ if (CHIP_ID_YUKON_2(pAC))
17708+ SkY2PortStop( pAC,
17709+ pAC->IoBase,
17710+ PortIdx,
17711+ SK_STOP_ALL,
17712+ SK_HARD_RST);
17713+ else
17714+ SkGeStopPort( pAC,
17715+ pAC->IoBase,
17716+ PortIdx,
17717+ SK_STOP_ALL,
17718+ SK_HARD_RST);
17719+ }
17720 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
17721 } else {
17722-
17723 spin_lock_irqsave(&pAC->SlowPathLock, Flags);
17724- EvPara.Para32[0] = pNet->NetNr;
17725- EvPara.Para32[1] = -1;
17726- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
17727- SkPnmiEvent(pAC, pAC->IoBase, SK_PNMI_EVT_XMAC_RESET, EvPara);
17728- SkEventDispatcher(pAC, pAC->IoBase);
17729+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP,
17730+ pNet->NetNr, -1, SK_FALSE);
17731+ SkLocalEventQueue(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET,
17732+ pNet->NetNr, -1, SK_TRUE);
17733 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
17734
17735 /* Stop port */
17736 spin_lock_irqsave(&pAC->TxPort[pNet->PortNr]
17737 [TX_PRIO_LOW].TxDesRingLock, Flags);
17738- SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr,
17739- SK_STOP_ALL, SK_HARD_RST);
17740+ if (CHIP_ID_YUKON_2(pAC)) {
17741+ SkY2PortStop(pAC, pAC->IoBase, pNet->PortNr,
17742+ SK_STOP_ALL, SK_HARD_RST);
17743+ }
17744+ else {
17745+ SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr,
17746+ SK_STOP_ALL, SK_HARD_RST);
17747+ }
17748 spin_unlock_irqrestore(&pAC->TxPort[pNet->PortNr]
17749 [TX_PRIO_LOW].TxDesRingLock, Flags);
17750 }
17751
17752 if (pAC->RlmtNets == 1) {
17753 /* clear all descriptor rings */
17754- for (i=0; i<pAC->GIni.GIMacsFound; i++) {
17755- ReceiveIrq(pAC, &pAC->RxPort[i], SK_TRUE);
17756- ClearRxRing(pAC, &pAC->RxPort[i]);
17757- ClearTxRing(pAC, &pAC->TxPort[i][TX_PRIO_LOW]);
17758+ for (CurrMac=0; CurrMac<pAC->GIni.GIMacsFound; CurrMac++) {
17759+ if (!CHIP_ID_YUKON_2(pAC)) {
17760+#ifdef CONFIG_SK98LIN_NAPI
17761+ WorkToDo = 1;
17762+ ReceiveIrq(pAC,&pAC->RxPort[CurrMac],
17763+ SK_TRUE,&WorkDone,WorkToDo);
17764+#else
17765+ ReceiveIrq(pAC,&pAC->RxPort[CurrMac],SK_TRUE);
17766+#endif
17767+ ClearRxRing(pAC, &pAC->RxPort[CurrMac]);
17768+ ClearTxRing(pAC, &pAC->TxPort[CurrMac][TX_PRIO_LOW]);
17769+ } else {
17770+ SkY2FreeRxBuffers(pAC, pAC->IoBase, CurrMac);
17771+ SkY2FreeTxBuffers(pAC, pAC->IoBase, CurrMac);
17772+ }
17773 }
17774 } else {
17775 /* clear port descriptor rings */
17776- ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE);
17777- ClearRxRing(pAC, &pAC->RxPort[pNet->PortNr]);
17778- ClearTxRing(pAC, &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]);
17779+ if (!CHIP_ID_YUKON_2(pAC)) {
17780+#ifdef CONFIG_SK98LIN_NAPI
17781+ WorkToDo = 1;
17782+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE, &WorkDone, WorkToDo);
17783+#else
17784+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE);
17785+#endif
17786+ ClearRxRing(pAC, &pAC->RxPort[pNet->PortNr]);
17787+ ClearTxRing(pAC, &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]);
17788+ }
17789+ else {
17790+ SkY2FreeRxBuffers(pAC, pAC->IoBase, pNet->PortNr);
17791+ SkY2FreeTxBuffers(pAC, pAC->IoBase, pNet->PortNr);
17792+ }
17793 }
17794
17795 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
17796@@ -1384,6 +2459,12 @@
17797 sizeof(SK_PNMI_STRUCT_DATA));
17798
17799 pAC->MaxPorts--;
17800+ module_put(THIS_MODULE);
17801+
17802+#ifdef Y2_RECOVERY
17803+ pNet->InRecover = SK_FALSE;
17804+#endif
17805+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags);
17806
17807 return (0);
17808 } /* SkGeClose */
17809@@ -1410,7 +2491,7 @@
17810 SK_AC *pAC;
17811 int Rc; /* return code of XmitFrame */
17812
17813- pNet = netdev_priv(dev);
17814+ pNet = (DEV_NET*) dev->priv;
17815 pAC = pNet->pAC;
17816
17817 if ((!skb_shinfo(skb)->nr_frags) ||
17818@@ -1442,9 +2523,11 @@
17819 }
17820
17821 /* Transmitter out of resources? */
17822+#ifdef USE_TX_COMPLETE
17823 if (Rc <= 0) {
17824 netif_stop_queue(dev);
17825 }
17826+#endif
17827
17828 /* If not taken, give buffer ownership back to the
17829 * queueing layer.
17830@@ -1456,6 +2539,96 @@
17831 return (0);
17832 } /* SkGeXmit */
17833
17834+#ifdef CONFIG_SK98LIN_NAPI
17835+/*****************************************************************************
17836+ *
17837+ * SkGePoll - NAPI Rx polling callback for GEnesis and Yukon chipsets
17838+ *
17839+ * Description:
17840+ * Called by the Linux system in case NAPI polling is activated
17841+ *
17842+ * Returns:
17843+ * The number of work data still to be handled
17844+ */
17845+static int SkGePoll(struct net_device *dev, int *budget)
17846+{
17847+ SK_AC *pAC = ((DEV_NET*)(dev->priv))->pAC; /* pointer to adapter context */
17848+ int WorkToDo = min(*budget, dev->quota);
17849+ int WorkDone = 0;
17850+ unsigned long Flags;
17851+
17852+
17853+ if (pAC->dev[0] != pAC->dev[1]) {
17854+ spin_lock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock);
17855+ FreeTxDescriptors(pAC, &pAC->TxPort[1][TX_PRIO_LOW]);
17856+ spin_unlock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock);
17857+
17858+ ReceiveIrq(pAC, &pAC->RxPort[1], SK_TRUE, &WorkDone, WorkToDo);
17859+ CLEAR_AND_START_RX(1);
17860+ }
17861+ spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
17862+ FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]);
17863+ spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
17864+
17865+ ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE, &WorkDone, WorkToDo);
17866+ CLEAR_AND_START_RX(0);
17867+
17868+ *budget -= WorkDone;
17869+ dev->quota -= WorkDone;
17870+
17871+ if(WorkDone < WorkToDo) {
17872+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
17873+ netif_rx_complete(dev);
17874+ pAC->GIni.GIValIrqMask |= (NAPI_DRV_IRQS);
17875+#ifndef USE_TX_COMPLETE
17876+ pAC->GIni.GIValIrqMask &= ~(TX_COMPL_IRQS);
17877+#endif
17878+ /* enable interrupts again */
17879+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
17880+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
17881+ }
17882+ return (WorkDone >= WorkToDo);
17883+} /* SkGePoll */
17884+#endif
17885+
17886+#ifdef SK_POLL_CONTROLLER
17887+/*****************************************************************************
17888+ *
17889+ * SkGeNetPoll - Polling "interrupt"
17890+ *
17891+ * Description:
17892+ * Polling 'interrupt' - used by things like netconsole and netdump
17893+ * to send skbs without having to re-enable interrupts.
17894+ * It's not called while the interrupt routine is executing.
17895+ */
17896+static void SkGeNetPoll(
17897+struct SK_NET_DEVICE *dev)
17898+{
17899+DEV_NET *pNet;
17900+SK_AC *pAC;
17901+
17902+ pNet = (DEV_NET*) dev->priv;
17903+ pAC = pNet->pAC;
17904+ pNet->NetConsoleMode = SK_TRUE;
17905+
17906+ /* Prevent any reconfiguration while handling
17907+ the 'interrupt' */
17908+ SK_OUT32(pAC->IoBase, B0_IMSK, 0);
17909+
17910+ if (!CHIP_ID_YUKON_2(pAC)) {
17911+ /* Handle the GENESIS Isr */
17912+ if (pAC->GIni.GIMacsFound == 2)
17913+ SkGeIsr(dev->irq, dev, NULL);
17914+ else
17915+ SkGeIsrOnePort(dev->irq, dev, NULL);
17916+ } else {
17917+ /* Handle the Yukon2 Isr */
17918+ SkY2Isr(dev->irq, dev, NULL);
17919+ }
17920+
17921+}
17922+#endif
17923+
17924
17925 /*****************************************************************************
17926 *
17927@@ -1480,7 +2653,7 @@
17928 * < 0 - on failure: other problems ( -> return failure to upper layers)
17929 */
17930 static int XmitFrame(
17931-SK_AC *pAC, /* pointer to adapter context */
17932+SK_AC *pAC, /* pointer to adapter context */
17933 TX_PORT *pTxPort, /* pointer to struct of port to send to */
17934 struct sk_buff *pMessage) /* pointer to send-message */
17935 {
17936@@ -1488,17 +2661,22 @@
17937 TXD *pOldTxd;
17938 unsigned long Flags;
17939 SK_U64 PhysAddr;
17940+ int Protocol;
17941+ int IpHeaderLength;
17942 int BytesSend = pMessage->len;
17943
17944 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X"));
17945
17946 spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags);
17947 #ifndef USE_TX_COMPLETE
17948- FreeTxDescriptors(pAC, pTxPort);
17949+ if ((pTxPort->TxdRingPrevFree - pTxPort->TxdRingFree) > 6) {
17950+ FreeTxDescriptors(pAC, pTxPort);
17951+ pTxPort->TxdRingPrevFree = pTxPort->TxdRingFree;
17952+ }
17953 #endif
17954 if (pTxPort->TxdRingFree == 0) {
17955 /*
17956- ** no enough free descriptors in ring at the moment.
17957+ ** not enough free descriptors in ring at the moment.
17958 ** Maybe free'ing some old one help?
17959 */
17960 FreeTxDescriptors(pAC, pTxPort);
17961@@ -1560,10 +2738,8 @@
17962 pTxd->pMBuf = pMessage;
17963
17964 if (pMessage->ip_summed == CHECKSUM_HW) {
17965- u16 hdrlen = pMessage->h.raw - pMessage->data;
17966- u16 offset = hdrlen + pMessage->csum;
17967-
17968- if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) &&
17969+ Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff);
17970+ if ((Protocol == C_PROTO_ID_UDP) &&
17971 (pAC->GIni.GIChipRev == 0) &&
17972 (pAC->GIni.GIChipId == CHIP_ID_YUKON)) {
17973 pTxd->TBControl = BMU_TCP_CHECK;
17974@@ -1571,9 +2747,14 @@
17975 pTxd->TBControl = BMU_UDP_CHECK;
17976 }
17977
17978- pTxd->TcpSumOfs = 0;
17979- pTxd->TcpSumSt = hdrlen;
17980- pTxd->TcpSumWr = offset;
17981+ IpHeaderLength = (SK_U8)pMessage->data[C_OFFSET_IPHEADER];
17982+ IpHeaderLength = (IpHeaderLength & 0xf) * 4;
17983+ pTxd->TcpSumOfs = 0; /* PH-Checksum already calculated */
17984+ pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength +
17985+ (Protocol == C_PROTO_ID_UDP ?
17986+ C_OFFSET_UDPHEADER_UDPCS :
17987+ C_OFFSET_TCPHEADER_TCPCS);
17988+ pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength;
17989
17990 pTxd->TBControl |= BMU_OWN | BMU_STF |
17991 BMU_SW | BMU_EOF |
17992@@ -1581,7 +2762,7 @@
17993 BMU_IRQ_EOF |
17994 #endif
17995 pMessage->len;
17996- } else {
17997+ } else {
17998 pTxd->TBControl = BMU_OWN | BMU_STF | BMU_CHECK |
17999 BMU_SW | BMU_EOF |
18000 #ifdef USE_TX_COMPLETE
18001@@ -1636,10 +2817,11 @@
18002 TXD *pTxdLst;
18003 int CurrFrag;
18004 int BytesSend;
18005+ int IpHeaderLength;
18006+ int Protocol;
18007 skb_frag_t *sk_frag;
18008 SK_U64 PhysAddr;
18009 unsigned long Flags;
18010- SK_U32 Control;
18011
18012 spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags);
18013 #ifndef USE_TX_COMPLETE
18014@@ -1662,6 +2844,7 @@
18015 pTxdFst = pTxd;
18016 pTxdLst = pTxd;
18017 BytesSend = 0;
18018+ Protocol = 0;
18019
18020 /*
18021 ** Map the first fragment (header) into the DMA-space
18022@@ -1679,31 +2862,32 @@
18023 ** Does the HW need to evaluate checksum for TCP or UDP packets?
18024 */
18025 if (pMessage->ip_summed == CHECKSUM_HW) {
18026- u16 hdrlen = pMessage->h.raw - pMessage->data;
18027- u16 offset = hdrlen + pMessage->csum;
18028-
18029- Control = BMU_STFWD;
18030-
18031+ pTxd->TBControl = BMU_STF | BMU_STFWD | skb_headlen(pMessage);
18032 /*
18033 ** We have to use the opcode for tcp here, because the
18034 ** opcode for udp is not working in the hardware yet
18035 ** (Revision 2.0)
18036 */
18037- if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) &&
18038+ Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff);
18039+ if ((Protocol == C_PROTO_ID_UDP) &&
18040 (pAC->GIni.GIChipRev == 0) &&
18041 (pAC->GIni.GIChipId == CHIP_ID_YUKON)) {
18042- Control |= BMU_TCP_CHECK;
18043+ pTxd->TBControl |= BMU_TCP_CHECK;
18044 } else {
18045- Control |= BMU_UDP_CHECK;
18046+ pTxd->TBControl |= BMU_UDP_CHECK;
18047 }
18048
18049- pTxd->TcpSumOfs = 0;
18050- pTxd->TcpSumSt = hdrlen;
18051- pTxd->TcpSumWr = offset;
18052- } else
18053- Control = BMU_CHECK | BMU_SW;
18054-
18055- pTxd->TBControl = BMU_STF | Control | skb_headlen(pMessage);
18056+ IpHeaderLength = ((SK_U8)pMessage->data[C_OFFSET_IPHEADER] & 0xf)*4;
18057+ pTxd->TcpSumOfs = 0; /* PH-Checksum already claculated */
18058+ pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength +
18059+ (Protocol == C_PROTO_ID_UDP ?
18060+ C_OFFSET_UDPHEADER_UDPCS :
18061+ C_OFFSET_TCPHEADER_TCPCS);
18062+ pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength;
18063+ } else {
18064+ pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_STF |
18065+ skb_headlen(pMessage);
18066+ }
18067
18068 pTxd = pTxd->pNextTxd;
18069 pTxPort->TxdRingFree--;
18070@@ -1727,18 +2911,40 @@
18071 pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32);
18072 pTxd->pMBuf = pMessage;
18073
18074- pTxd->TBControl = Control | BMU_OWN | sk_frag->size;;
18075+ /*
18076+ ** Does the HW need to evaluate checksum for TCP or UDP packets?
18077+ */
18078+ if (pMessage->ip_summed == CHECKSUM_HW) {
18079+ pTxd->TBControl = BMU_OWN | BMU_SW | BMU_STFWD;
18080+ /*
18081+ ** We have to use the opcode for tcp here because the
18082+ ** opcode for udp is not working in the hardware yet
18083+ ** (revision 2.0)
18084+ */
18085+ if ((Protocol == C_PROTO_ID_UDP) &&
18086+ (pAC->GIni.GIChipRev == 0) &&
18087+ (pAC->GIni.GIChipId == CHIP_ID_YUKON)) {
18088+ pTxd->TBControl |= BMU_TCP_CHECK;
18089+ } else {
18090+ pTxd->TBControl |= BMU_UDP_CHECK;
18091+ }
18092+ } else {
18093+ pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_OWN;
18094+ }
18095
18096 /*
18097 ** Do we have the last fragment?
18098 */
18099 if( (CurrFrag+1) == skb_shinfo(pMessage)->nr_frags ) {
18100 #ifdef USE_TX_COMPLETE
18101- pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF;
18102+ pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF | sk_frag->size;
18103 #else
18104- pTxd->TBControl |= BMU_EOF;
18105+ pTxd->TBControl |= BMU_EOF | sk_frag->size;
18106 #endif
18107 pTxdFst->TBControl |= BMU_OWN | BMU_SW;
18108+
18109+ } else {
18110+ pTxd->TBControl |= sk_frag->size;
18111 }
18112 pTxdLst = pTxd;
18113 pTxd = pTxd->pNextTxd;
18114@@ -1892,7 +3098,7 @@
18115 SK_U16 Length; /* data fragment length */
18116 SK_U64 PhysAddr; /* physical address of a rx buffer */
18117
18118- pMsgBlock = alloc_skb(pAC->RxBufSize, GFP_ATOMIC);
18119+ pMsgBlock = alloc_skb(pRxPort->RxBufSize, GFP_ATOMIC);
18120 if (pMsgBlock == NULL) {
18121 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18122 SK_DBGCAT_DRV_ENTRY,
18123@@ -1906,12 +3112,12 @@
18124 pRxd = pRxPort->pRxdRingTail;
18125 pRxPort->pRxdRingTail = pRxd->pNextRxd;
18126 pRxPort->RxdRingFree--;
18127- Length = pAC->RxBufSize;
18128+ Length = pRxPort->RxBufSize;
18129 PhysAddr = (SK_U64) pci_map_page(pAC->PciDev,
18130 virt_to_page(pMsgBlock->data),
18131 ((unsigned long) pMsgBlock->data &
18132 ~PAGE_MASK),
18133- pAC->RxBufSize - 2,
18134+ pRxPort->RxBufSize - 2,
18135 PCI_DMA_FROMDEVICE);
18136
18137 pRxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff);
18138@@ -1951,7 +3157,7 @@
18139 pRxd = pRxPort->pRxdRingTail;
18140 pRxPort->pRxdRingTail = pRxd->pNextRxd;
18141 pRxPort->RxdRingFree--;
18142- Length = pAC->RxBufSize;
18143+ Length = pRxPort->RxBufSize;
18144
18145 pRxd->VDataLow = PhysLow;
18146 pRxd->VDataHigh = PhysHigh;
18147@@ -1976,28 +3182,40 @@
18148 * Returns: N/A
18149 */
18150 static void ReceiveIrq(
18151- SK_AC *pAC, /* pointer to adapter context */
18152- RX_PORT *pRxPort, /* pointer to receive port struct */
18153- SK_BOOL SlowPathLock) /* indicates if SlowPathLock is needed */
18154-{
18155-RXD *pRxd; /* pointer to receive descriptors */
18156-SK_U32 Control; /* control field of descriptor */
18157-struct sk_buff *pMsg; /* pointer to message holding frame */
18158-struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */
18159-int FrameLength; /* total length of received frame */
18160-SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */
18161-SK_EVPARA EvPara; /* an event parameter union */
18162-unsigned long Flags; /* for spin lock */
18163-int PortIndex = pRxPort->PortIndex;
18164-unsigned int Offset;
18165-unsigned int NumBytes;
18166-unsigned int ForRlmt;
18167-SK_BOOL IsBc;
18168-SK_BOOL IsMc;
18169-SK_BOOL IsBadFrame; /* Bad frame */
18170-
18171-SK_U32 FrameStat;
18172-SK_U64 PhysAddr;
18173+#ifdef CONFIG_SK98LIN_NAPI
18174+SK_AC *pAC, /* pointer to adapter context */
18175+RX_PORT *pRxPort, /* pointer to receive port struct */
18176+SK_BOOL SlowPathLock, /* indicates if SlowPathLock is needed */
18177+int *WorkDone,
18178+int WorkToDo)
18179+#else
18180+SK_AC *pAC, /* pointer to adapter context */
18181+RX_PORT *pRxPort, /* pointer to receive port struct */
18182+SK_BOOL SlowPathLock) /* indicates if SlowPathLock is needed */
18183+#endif
18184+{
18185+ RXD *pRxd; /* pointer to receive descriptors */
18186+ struct sk_buff *pMsg; /* pointer to message holding frame */
18187+ struct sk_buff *pNewMsg; /* pointer to new message for frame copy */
18188+ SK_MBUF *pRlmtMbuf; /* ptr to buffer for giving frame to RLMT */
18189+ SK_EVPARA EvPara; /* an event parameter union */
18190+ SK_U32 Control; /* control field of descriptor */
18191+ unsigned long Flags; /* for spin lock handling */
18192+ int PortIndex = pRxPort->PortIndex;
18193+ int FrameLength; /* total length of received frame */
18194+ int IpFrameLength; /* IP length of the received frame */
18195+ unsigned int Offset;
18196+ unsigned int NumBytes;
18197+ unsigned int RlmtNotifier;
18198+ SK_BOOL IsBc; /* we received a broadcast packet */
18199+ SK_BOOL IsMc; /* we received a multicast packet */
18200+ SK_BOOL IsBadFrame; /* the frame received is bad! */
18201+ SK_U32 FrameStat;
18202+ unsigned short Csum1;
18203+ unsigned short Csum2;
18204+ unsigned short Type;
18205+ int Result;
18206+ SK_U64 PhysAddr;
18207
18208 rx_start:
18209 /* do forever; exit if BMU_OWN found */
18210@@ -2019,6 +3237,13 @@
18211
18212 Control = pRxd->RBControl;
18213
18214+#ifdef CONFIG_SK98LIN_NAPI
18215+ if (*WorkDone >= WorkToDo) {
18216+ break;
18217+ }
18218+ (*WorkDone)++;
18219+#endif
18220+
18221 /* check if this descriptor is ready */
18222 if ((Control & BMU_OWN) != 0) {
18223 /* this descriptor is not yet ready */
18224@@ -2027,11 +3252,10 @@
18225 FillRxRing(pAC, pRxPort);
18226 return;
18227 }
18228- pAC->DynIrqModInfo.NbrProcessedDescr++;
18229
18230 /* get length of frame and check it */
18231 FrameLength = Control & BMU_BBC;
18232- if (FrameLength > pAC->RxBufSize) {
18233+ if (FrameLength > pRxPort->RxBufSize) {
18234 goto rx_failed;
18235 }
18236
18237@@ -2046,8 +3270,8 @@
18238 FrameStat = pRxd->FrameStat;
18239
18240 /* check for frame length mismatch */
18241-#define XMR_FS_LEN_SHIFT 18
18242-#define GMR_FS_LEN_SHIFT 16
18243+#define XMR_FS_LEN_SHIFT 18
18244+#define GMR_FS_LEN_SHIFT 16
18245 if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {
18246 if (FrameLength != (SK_U32) (FrameStat >> XMR_FS_LEN_SHIFT)) {
18247 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18248@@ -2057,8 +3281,7 @@
18249 (SK_U32) (FrameStat >> XMR_FS_LEN_SHIFT)));
18250 goto rx_failed;
18251 }
18252- }
18253- else {
18254+ } else {
18255 if (FrameLength != (SK_U32) (FrameStat >> GMR_FS_LEN_SHIFT)) {
18256 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18257 SK_DBGCAT_DRV_RX_PROGRESS,
18258@@ -2091,9 +3314,6 @@
18259 /* DumpMsg(pMsg, "Rx"); */
18260
18261 if ((Control & BMU_STAT_VAL) != BMU_STAT_VAL || (IsBadFrame)) {
18262-#if 0
18263- (FrameStat & (XMR_FS_ANY_ERR | XMR_FS_2L_VLAN)) != 0) {
18264-#endif
18265 /* there is a receive error in this frame */
18266 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18267 SK_DBGCAT_DRV_RX_PROGRESS,
18268@@ -2101,6 +3321,20 @@
18269 "Control: %x\nRxStat: %x\n",
18270 Control, FrameStat));
18271
18272+ PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
18273+ PhysAddr |= (SK_U64) pRxd->VDataLow;
18274+
18275+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
18276+ pci_dma_sync_single(pAC->PciDev,
18277+ (dma_addr_t) PhysAddr,
18278+ FrameLength,
18279+ PCI_DMA_FROMDEVICE);
18280+#else
18281+ pci_dma_sync_single_for_cpu(pAC->PciDev,
18282+ (dma_addr_t) PhysAddr,
18283+ FrameLength,
18284+ PCI_DMA_FROMDEVICE);
18285+#endif
18286 ReQueueRxBuffer(pAC, pRxPort, pMsg,
18287 pRxd->VDataHigh, pRxd->VDataLow);
18288
18289@@ -2120,96 +3354,107 @@
18290 skb_put(pNewMsg, FrameLength);
18291 PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
18292 PhysAddr |= (SK_U64) pRxd->VDataLow;
18293-
18294- pci_dma_sync_single_for_cpu(pAC->PciDev,
18295- (dma_addr_t) PhysAddr,
18296- FrameLength,
18297- PCI_DMA_FROMDEVICE);
18298- memcpy(pNewMsg->data, pMsg, FrameLength);
18299-
18300+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
18301+ pci_dma_sync_single(pAC->PciDev,
18302+ (dma_addr_t) PhysAddr,
18303+ FrameLength,
18304+ PCI_DMA_FROMDEVICE);
18305+#else
18306 pci_dma_sync_single_for_device(pAC->PciDev,
18307- (dma_addr_t) PhysAddr,
18308- FrameLength,
18309- PCI_DMA_FROMDEVICE);
18310+ (dma_addr_t) PhysAddr,
18311+ FrameLength,
18312+ PCI_DMA_FROMDEVICE);
18313+#endif
18314+
18315+ eth_copy_and_sum(pNewMsg, pMsg->data,
18316+ FrameLength, 0);
18317 ReQueueRxBuffer(pAC, pRxPort, pMsg,
18318 pRxd->VDataHigh, pRxd->VDataLow);
18319
18320 pMsg = pNewMsg;
18321
18322- }
18323- else {
18324+ } else {
18325 /*
18326 * if large frame, or SKB allocation failed, pass
18327 * the SKB directly to the networking
18328 */
18329-
18330 PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
18331 PhysAddr |= (SK_U64) pRxd->VDataLow;
18332
18333 /* release the DMA mapping */
18334 pci_unmap_single(pAC->PciDev,
18335 PhysAddr,
18336- pAC->RxBufSize - 2,
18337+ pRxPort->RxBufSize - 2,
18338 PCI_DMA_FROMDEVICE);
18339+ skb_put(pMsg, FrameLength); /* set message len */
18340+ pMsg->ip_summed = CHECKSUM_NONE; /* initial default */
18341
18342- /* set length in message */
18343- skb_put(pMsg, FrameLength);
18344+ if (pRxPort->UseRxCsum) {
18345+ Type = ntohs(*((short*)&pMsg->data[12]));
18346+ if (Type == 0x800) {
18347+ IpFrameLength = (int) ntohs((unsigned short)
18348+ ((unsigned short *) pMsg->data)[8]);
18349+ if ((FrameLength - IpFrameLength) == 0xe) {
18350+ Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff);
18351+ Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff);
18352+ if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) &&
18353+ (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) ||
18354+ (pAC->ChipsetType)) {
18355+ Result = SkCsGetReceiveInfo(pAC, &pMsg->data[14],
18356+ Csum1, Csum2, PortIndex);
18357+ if ((Result == SKCS_STATUS_IP_FRAGMENT) ||
18358+ (Result == SKCS_STATUS_IP_CSUM_OK) ||
18359+ (Result == SKCS_STATUS_TCP_CSUM_OK) ||
18360+ (Result == SKCS_STATUS_UDP_CSUM_OK)) {
18361+ pMsg->ip_summed = CHECKSUM_UNNECESSARY;
18362+ } else if ((Result == SKCS_STATUS_TCP_CSUM_ERROR) ||
18363+ (Result == SKCS_STATUS_UDP_CSUM_ERROR) ||
18364+ (Result == SKCS_STATUS_IP_CSUM_ERROR_UDP) ||
18365+ (Result == SKCS_STATUS_IP_CSUM_ERROR_TCP) ||
18366+ (Result == SKCS_STATUS_IP_CSUM_ERROR)) {
18367+ /* HW Checksum error */
18368+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18369+ SK_DBGCAT_DRV_RX_PROGRESS,
18370+ ("skge: CRC error. Frame dropped!\n"));
18371+ goto rx_failed;
18372+ } else {
18373+ pMsg->ip_summed = CHECKSUM_NONE;
18374+ }
18375+ }/* checksumControl calculation valid */
18376+ } /* Frame length check */
18377+ } /* IP frame */
18378+ } /* pRxPort->UseRxCsum */
18379 } /* frame > SK_COPY_TRESHOLD */
18380-
18381-#ifdef USE_SK_RX_CHECKSUM
18382- pMsg->csum = pRxd->TcpSums & 0xffff;
18383- pMsg->ip_summed = CHECKSUM_HW;
18384-#else
18385- pMsg->ip_summed = CHECKSUM_NONE;
18386-#endif
18387-
18388+
18389 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V"));
18390- ForRlmt = SK_RLMT_RX_PROTOCOL;
18391-#if 0
18392- IsBc = (FrameStat & XMR_FS_BC)==XMR_FS_BC;
18393-#endif
18394+ RlmtNotifier = SK_RLMT_RX_PROTOCOL;
18395 SK_RLMT_PRE_LOOKAHEAD(pAC, PortIndex, FrameLength,
18396- IsBc, &Offset, &NumBytes);
18397+ IsBc, &Offset, &NumBytes);
18398 if (NumBytes != 0) {
18399-#if 0
18400- IsMc = (FrameStat & XMR_FS_MC)==XMR_FS_MC;
18401-#endif
18402- SK_RLMT_LOOKAHEAD(pAC, PortIndex,
18403- &pMsg->data[Offset],
18404- IsBc, IsMc, &ForRlmt);
18405+ SK_RLMT_LOOKAHEAD(pAC,PortIndex,&pMsg->data[Offset],
18406+ IsBc,IsMc,&RlmtNotifier);
18407 }
18408- if (ForRlmt == SK_RLMT_RX_PROTOCOL) {
18409- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("W"));
18410+ if (RlmtNotifier == SK_RLMT_RX_PROTOCOL) {
18411+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("W"));
18412 /* send up only frames from active port */
18413- if ((PortIndex == pAC->ActivePort) ||
18414- (pAC->RlmtNets == 2)) {
18415- /* frame for upper layer */
18416+ if ((PortIndex == pAC->ActivePort)||(pAC->RlmtNets == 2)) {
18417 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("U"));
18418 #ifdef xDEBUG
18419 DumpMsg(pMsg, "Rx");
18420 #endif
18421- SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC,
18422- FrameLength, pRxPort->PortIndex);
18423-
18424- pMsg->dev = pAC->dev[pRxPort->PortIndex];
18425- pMsg->protocol = eth_type_trans(pMsg,
18426- pAC->dev[pRxPort->PortIndex]);
18427- netif_rx(pMsg);
18428- pAC->dev[pRxPort->PortIndex]->last_rx = jiffies;
18429- }
18430- else {
18431- /* drop frame */
18432+ SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC,FrameLength,PortIndex);
18433+ pMsg->dev = pAC->dev[PortIndex];
18434+ pMsg->protocol = eth_type_trans(pMsg,pAC->dev[PortIndex]);
18435+ netif_rx(pMsg); /* frame for upper layer */
18436+ pAC->dev[PortIndex]->last_rx = jiffies;
18437+ } else {
18438 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18439- SK_DBGCAT_DRV_RX_PROGRESS,
18440- ("D"));
18441- DEV_KFREE_SKB(pMsg);
18442+ SK_DBGCAT_DRV_RX_PROGRESS,("D"));
18443+ DEV_KFREE_SKB(pMsg); /* drop frame */
18444 }
18445-
18446- } /* if not for rlmt */
18447- else {
18448- /* packet for rlmt */
18449+ } else { /* packet for RLMT stack */
18450 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18451- SK_DBGCAT_DRV_RX_PROGRESS, ("R"));
18452+ SK_DBGCAT_DRV_RX_PROGRESS,("R"));
18453 pRlmtMbuf = SkDrvAllocRlmtMbuf(pAC,
18454 pAC->IoBase, FrameLength);
18455 if (pRlmtMbuf != NULL) {
18456@@ -2237,32 +3482,22 @@
18457 }
18458
18459 SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
18460- SK_DBGCAT_DRV_RX_PROGRESS,
18461- ("Q"));
18462+ SK_DBGCAT_DRV_RX_PROGRESS,("Q"));
18463 }
18464- if ((pAC->dev[pRxPort->PortIndex]->flags &
18465- (IFF_PROMISC | IFF_ALLMULTI)) != 0 ||
18466- (ForRlmt & SK_RLMT_RX_PROTOCOL) ==
18467- SK_RLMT_RX_PROTOCOL) {
18468- pMsg->dev = pAC->dev[pRxPort->PortIndex];
18469- pMsg->protocol = eth_type_trans(pMsg,
18470- pAC->dev[pRxPort->PortIndex]);
18471+ if ((pAC->dev[PortIndex]->flags & (IFF_PROMISC | IFF_ALLMULTI)) ||
18472+ (RlmtNotifier & SK_RLMT_RX_PROTOCOL)) {
18473+ pMsg->dev = pAC->dev[PortIndex];
18474+ pMsg->protocol = eth_type_trans(pMsg,pAC->dev[PortIndex]);
18475 netif_rx(pMsg);
18476- pAC->dev[pRxPort->PortIndex]->last_rx = jiffies;
18477- }
18478- else {
18479+ pAC->dev[PortIndex]->last_rx = jiffies;
18480+ } else {
18481 DEV_KFREE_SKB(pMsg);
18482 }
18483-
18484- } /* if packet for rlmt */
18485+ } /* if packet for RLMT stack */
18486 } /* for ... scanning the RXD ring */
18487
18488 /* RXD ring is empty -> fill and restart */
18489 FillRxRing(pAC, pRxPort);
18490- /* do not start if called from Close */
18491- if (pAC->BoardLevel > SK_INIT_DATA) {
18492- ClearAndStartRx(pAC, PortIndex);
18493- }
18494 return;
18495
18496 rx_failed:
18497@@ -2276,7 +3511,7 @@
18498 PhysAddr |= (SK_U64) pRxd->VDataLow;
18499 pci_unmap_page(pAC->PciDev,
18500 PhysAddr,
18501- pAC->RxBufSize - 2,
18502+ pRxPort->RxBufSize - 2,
18503 PCI_DMA_FROMDEVICE);
18504 DEV_KFREE_SKB_IRQ(pRxd->pMBuf);
18505 pRxd->pMBuf = NULL;
18506@@ -2286,49 +3521,6 @@
18507
18508 } /* ReceiveIrq */
18509
18510-
18511-/*****************************************************************************
18512- *
18513- * ClearAndStartRx - give a start receive command to BMU, clear IRQ
18514- *
18515- * Description:
18516- * This function sends a start command and a clear interrupt
18517- * command for one receive queue to the BMU.
18518- *
18519- * Returns: N/A
18520- * none
18521- */
18522-static void ClearAndStartRx(
18523-SK_AC *pAC, /* pointer to the adapter context */
18524-int PortIndex) /* index of the receive port (XMAC) */
18525-{
18526- SK_OUT8(pAC->IoBase,
18527- RxQueueAddr[PortIndex]+Q_CSR,
18528- CSR_START | CSR_IRQ_CL_F);
18529-} /* ClearAndStartRx */
18530-
18531-
18532-/*****************************************************************************
18533- *
18534- * ClearTxIrq - give a clear transmit IRQ command to BMU
18535- *
18536- * Description:
18537- * This function sends a clear tx IRQ command for one
18538- * transmit queue to the BMU.
18539- *
18540- * Returns: N/A
18541- */
18542-static void ClearTxIrq(
18543-SK_AC *pAC, /* pointer to the adapter context */
18544-int PortIndex, /* index of the transmit port (XMAC) */
18545-int Prio) /* priority or normal queue */
18546-{
18547- SK_OUT8(pAC->IoBase,
18548- TxQueueAddr[PortIndex][Prio]+Q_CSR,
18549- CSR_IRQ_CL_F);
18550-} /* ClearTxIrq */
18551-
18552-
18553 /*****************************************************************************
18554 *
18555 * ClearRxRing - remove all buffers from the receive ring
18556@@ -2359,7 +3551,7 @@
18557 PhysAddr |= (SK_U64) pRxd->VDataLow;
18558 pci_unmap_page(pAC->PciDev,
18559 PhysAddr,
18560- pAC->RxBufSize - 2,
18561+ pRxPort->RxBufSize - 2,
18562 PCI_DMA_FROMDEVICE);
18563 DEV_KFREE_SKB(pRxd->pMBuf);
18564 pRxd->pMBuf = NULL;
18565@@ -2417,31 +3609,32 @@
18566 static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p)
18567 {
18568
18569-DEV_NET *pNet = netdev_priv(dev);
18570+DEV_NET *pNet = (DEV_NET*) dev->priv;
18571 SK_AC *pAC = pNet->pAC;
18572+int Ret;
18573
18574 struct sockaddr *addr = p;
18575 unsigned long Flags;
18576
18577 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
18578 ("SkGeSetMacAddr starts now...\n"));
18579- if(netif_running(dev))
18580- return -EBUSY;
18581
18582 memcpy(dev->dev_addr, addr->sa_data,dev->addr_len);
18583
18584 spin_lock_irqsave(&pAC->SlowPathLock, Flags);
18585
18586 if (pAC->RlmtNets == 2)
18587- SkAddrOverride(pAC, pAC->IoBase, pNet->NetNr,
18588+ Ret = SkAddrOverride(pAC, pAC->IoBase, pNet->NetNr,
18589 (SK_MAC_ADDR*)dev->dev_addr, SK_ADDR_VIRTUAL_ADDRESS);
18590 else
18591- SkAddrOverride(pAC, pAC->IoBase, pAC->ActivePort,
18592+ Ret = SkAddrOverride(pAC, pAC->IoBase, pAC->ActivePort,
18593 (SK_MAC_ADDR*)dev->dev_addr, SK_ADDR_VIRTUAL_ADDRESS);
18594-
18595-
18596
18597 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
18598+
18599+ if (Ret != SK_ADDR_OVERRIDE_SUCCESS)
18600+ return -EBUSY;
18601+
18602 return 0;
18603 } /* SkGeSetMacAddr */
18604
18605@@ -2474,7 +3667,7 @@
18606 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
18607 ("SkGeSetRxMode starts now... "));
18608
18609- pNet = netdev_priv(dev);
18610+ pNet = (DEV_NET*) dev->priv;
18611 pAC = pNet->pAC;
18612 if (pAC->RlmtNets == 1)
18613 PortIdx = pAC->ActivePort;
18614@@ -2523,6 +3716,45 @@
18615
18616 /*****************************************************************************
18617 *
18618+ * SkSetMtuBufferSize - set the MTU buffer to another value
18619+ *
18620+ * Description:
18621+ * This function sets the new buffers and is called whenever the MTU
18622+ * size is changed
18623+ *
18624+ * Returns:
18625+ * N/A
18626+ */
18627+
18628+static void SkSetMtuBufferSize(
18629+SK_AC *pAC, /* pointer to adapter context */
18630+int PortNr, /* Port number */
18631+int Mtu) /* pointer to tx prt struct */
18632+{
18633+ pAC->RxPort[PortNr].RxBufSize = Mtu + 32;
18634+
18635+ /* RxBufSize must be a multiple of 8 */
18636+ while (pAC->RxPort[PortNr].RxBufSize % 8) {
18637+ pAC->RxPort[PortNr].RxBufSize =
18638+ pAC->RxPort[PortNr].RxBufSize + 1;
18639+ }
18640+
18641+ if (Mtu > 1500) {
18642+ pAC->GIni.GP[PortNr].PPortUsage = SK_JUMBO_LINK;
18643+ } else {
18644+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
18645+ pAC->GIni.GP[PortNr].PPortUsage = SK_MUL_LINK;
18646+ } else {
18647+ pAC->GIni.GP[PortNr].PPortUsage = SK_RED_LINK;
18648+ }
18649+ }
18650+
18651+ return;
18652+}
18653+
18654+
18655+/*****************************************************************************
18656+ *
18657 * SkGeChangeMtu - set the MTU to another value
18658 *
18659 * Description:
18660@@ -2536,28 +3768,32 @@
18661 */
18662 static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int NewMtu)
18663 {
18664-DEV_NET *pNet;
18665-struct net_device *pOtherDev;
18666-SK_AC *pAC;
18667-unsigned long Flags;
18668-int i;
18669-SK_EVPARA EvPara;
18670+DEV_NET *pNet;
18671+SK_AC *pAC;
18672+unsigned long Flags;
18673+#ifdef CONFIG_SK98LIN_NAPI
18674+int WorkToDo = 1; // min(*budget, dev->quota);
18675+int WorkDone = 0;
18676+#endif
18677
18678 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
18679 ("SkGeChangeMtu starts now...\n"));
18680
18681- pNet = netdev_priv(dev);
18682+ pNet = (DEV_NET*) dev->priv;
18683 pAC = pNet->pAC;
18684
18685+ /* MTU size outside the spec */
18686 if ((NewMtu < 68) || (NewMtu > SK_JUMBO_MTU)) {
18687 return -EINVAL;
18688 }
18689
18690- if(pAC->BoardLevel != SK_INIT_RUN) {
18691+ /* MTU > 1500 on yukon ulra not allowed */
18692+ if ((pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U)
18693+ && (NewMtu > 1500)){
18694 return -EINVAL;
18695 }
18696
18697-#ifdef SK_DIAG_SUPPORT
18698+ /* Diag access active */
18699 if (pAC->DiagModeActive == DIAG_ACTIVE) {
18700 if (pAC->DiagFlowCtrl == SK_FALSE) {
18701 return -1; /* still in use, deny any actions of MTU */
18702@@ -2565,201 +3801,74 @@
18703 pAC->DiagFlowCtrl = SK_FALSE;
18704 }
18705 }
18706-#endif
18707-
18708- pOtherDev = pAC->dev[1 - pNet->NetNr];
18709-
18710- if ( netif_running(pOtherDev) && (pOtherDev->mtu > 1500)
18711- && (NewMtu <= 1500))
18712- return 0;
18713
18714- pAC->RxBufSize = NewMtu + 32;
18715 dev->mtu = NewMtu;
18716+ SkSetMtuBufferSize(pAC, pNet->PortNr, NewMtu);
18717
18718- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
18719- ("New MTU: %d\n", NewMtu));
18720+ if(!netif_running(dev)) {
18721+ /* Preset MTU size if device not ready/running */
18722+ return 0;
18723+ }
18724
18725- /*
18726- ** Prevent any reconfiguration while changing the MTU
18727- ** by disabling any interrupts
18728- */
18729+ /* Prevent any reconfiguration while changing the MTU
18730+ by disabling any interrupts */
18731 SK_OUT32(pAC->IoBase, B0_IMSK, 0);
18732 spin_lock_irqsave(&pAC->SlowPathLock, Flags);
18733
18734- /*
18735- ** Notify RLMT that any ports are to be stopped
18736- */
18737- EvPara.Para32[0] = 0;
18738- EvPara.Para32[1] = -1;
18739- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
18740- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
18741- EvPara.Para32[0] = 1;
18742- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
18743- } else {
18744- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
18745- }
18746-
18747- /*
18748- ** After calling the SkEventDispatcher(), RLMT is aware about
18749- ** the stopped ports -> configuration can take place!
18750- */
18751- SkEventDispatcher(pAC, pAC->IoBase);
18752-
18753- for (i=0; i<pAC->GIni.GIMacsFound; i++) {
18754- spin_lock(&pAC->TxPort[i][TX_PRIO_LOW].TxDesRingLock);
18755- netif_stop_queue(pAC->dev[i]);
18756+ /* Notify RLMT that the port has to be stopped */
18757+ netif_stop_queue(dev);
18758+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP,
18759+ pNet->PortNr, -1, SK_TRUE);
18760+ spin_lock(&pAC->TxPort[pNet->PortNr][TX_PRIO_LOW].TxDesRingLock);
18761
18762- }
18763
18764- /*
18765- ** Depending on the desired MTU size change, a different number of
18766- ** RX buffers need to be allocated
18767- */
18768- if (NewMtu > 1500) {
18769- /*
18770- ** Use less rx buffers
18771- */
18772- for (i=0; i<pAC->GIni.GIMacsFound; i++) {
18773- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
18774- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing -
18775- (pAC->RxDescrPerRing / 4);
18776- } else {
18777- if (i == pAC->ActivePort) {
18778- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing -
18779- (pAC->RxDescrPerRing / 4);
18780- } else {
18781- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing -
18782- (pAC->RxDescrPerRing / 10);
18783- }
18784- }
18785- }
18786+ /* Change RxFillLimit to 1 */
18787+ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
18788+ pAC->RxPort[pNet->PortNr].RxFillLimit = 1;
18789 } else {
18790- /*
18791- ** Use the normal amount of rx buffers
18792- */
18793- for (i=0; i<pAC->GIni.GIMacsFound; i++) {
18794- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
18795- pAC->RxPort[i].RxFillLimit = 1;
18796- } else {
18797- if (i == pAC->ActivePort) {
18798- pAC->RxPort[i].RxFillLimit = 1;
18799- } else {
18800- pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing -
18801- (pAC->RxDescrPerRing / 4);
18802- }
18803- }
18804- }
18805+ pAC->RxPort[1 - pNet->PortNr].RxFillLimit = 1;
18806+ pAC->RxPort[pNet->PortNr].RxFillLimit = pAC->RxDescrPerRing -
18807+ (pAC->RxDescrPerRing / 4);
18808 }
18809-
18810- SkGeDeInit(pAC, pAC->IoBase);
18811
18812- /*
18813- ** enable/disable hardware support for long frames
18814- */
18815- if (NewMtu > 1500) {
18816-// pAC->JumboActivated = SK_TRUE; /* is never set back !!! */
18817- pAC->GIni.GIPortUsage = SK_JUMBO_LINK;
18818+ /* clear and reinit the rx rings here, because of new MTU size */
18819+ if (CHIP_ID_YUKON_2(pAC)) {
18820+ SkY2PortStop(pAC, pAC->IoBase, pNet->PortNr, SK_STOP_ALL, SK_SOFT_RST);
18821+ SkY2AllocateRxBuffers(pAC, pAC->IoBase, pNet->PortNr);
18822+ SkY2PortStart(pAC, pAC->IoBase, pNet->PortNr);
18823 } else {
18824- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
18825- pAC->GIni.GIPortUsage = SK_MUL_LINK;
18826- } else {
18827- pAC->GIni.GIPortUsage = SK_RED_LINK;
18828- }
18829- }
18830+// SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr, SK_STOP_ALL, SK_SOFT_RST);
18831+#ifdef CONFIG_SK98LIN_NAPI
18832+ WorkToDo = 1;
18833+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE, &WorkDone, WorkToDo);
18834+#else
18835+ ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr], SK_TRUE);
18836+#endif
18837+ ClearRxRing(pAC, &pAC->RxPort[pNet->PortNr]);
18838+ FillRxRing(pAC, &pAC->RxPort[pNet->PortNr]);
18839
18840- SkGeInit( pAC, pAC->IoBase, SK_INIT_IO);
18841- SkI2cInit( pAC, pAC->IoBase, SK_INIT_IO);
18842- SkEventInit(pAC, pAC->IoBase, SK_INIT_IO);
18843- SkPnmiInit( pAC, pAC->IoBase, SK_INIT_IO);
18844- SkAddrInit( pAC, pAC->IoBase, SK_INIT_IO);
18845- SkRlmtInit( pAC, pAC->IoBase, SK_INIT_IO);
18846- SkTimerInit(pAC, pAC->IoBase, SK_INIT_IO);
18847-
18848- /*
18849- ** tschilling:
18850- ** Speed and others are set back to default in level 1 init!
18851- */
18852- GetConfiguration(pAC);
18853-
18854- SkGeInit( pAC, pAC->IoBase, SK_INIT_RUN);
18855- SkI2cInit( pAC, pAC->IoBase, SK_INIT_RUN);
18856- SkEventInit(pAC, pAC->IoBase, SK_INIT_RUN);
18857- SkPnmiInit( pAC, pAC->IoBase, SK_INIT_RUN);
18858- SkAddrInit( pAC, pAC->IoBase, SK_INIT_RUN);
18859- SkRlmtInit( pAC, pAC->IoBase, SK_INIT_RUN);
18860- SkTimerInit(pAC, pAC->IoBase, SK_INIT_RUN);
18861+ /* Enable transmit descriptor polling */
18862+ SkGePollTxD(pAC, pAC->IoBase, pNet->PortNr, SK_TRUE);
18863+ FillRxRing(pAC, &pAC->RxPort[pNet->PortNr]);
18864+ }
18865
18866- /*
18867- ** clear and reinit the rx rings here
18868- */
18869- for (i=0; i<pAC->GIni.GIMacsFound; i++) {
18870- ReceiveIrq(pAC, &pAC->RxPort[i], SK_TRUE);
18871- ClearRxRing(pAC, &pAC->RxPort[i]);
18872- FillRxRing(pAC, &pAC->RxPort[i]);
18873+ netif_start_queue(pAC->dev[pNet->PortNr]);
18874
18875- /*
18876- ** Enable transmit descriptor polling
18877- */
18878- SkGePollTxD(pAC, pAC->IoBase, i, SK_TRUE);
18879- FillRxRing(pAC, &pAC->RxPort[i]);
18880- };
18881+ spin_unlock(&pAC->TxPort[pNet->PortNr][TX_PRIO_LOW].TxDesRingLock);
18882
18883- SkGeYellowLED(pAC, pAC->IoBase, 1);
18884- SkDimEnableModerationIfNeeded(pAC);
18885- SkDimDisplayModerationSettings(pAC);
18886
18887- netif_start_queue(pAC->dev[pNet->PortNr]);
18888- for (i=pAC->GIni.GIMacsFound-1; i>=0; i--) {
18889- spin_unlock(&pAC->TxPort[i][TX_PRIO_LOW].TxDesRingLock);
18890- }
18891+ /* Notify RLMT about the changing and restarting one (or more) ports */
18892+ SkLocalEventQueue(pAC, SKGE_RLMT, SK_RLMT_START,
18893+ pNet->PortNr, -1, SK_TRUE);
18894
18895- /*
18896- ** Enable Interrupts again
18897- */
18898+ /* Enable Interrupts again */
18899 SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
18900 SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK);
18901
18902- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
18903- SkEventDispatcher(pAC, pAC->IoBase);
18904-
18905- /*
18906- ** Notify RLMT about the changing and restarting one (or more) ports
18907- */
18908- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
18909- EvPara.Para32[0] = pAC->RlmtNets;
18910- EvPara.Para32[1] = -1;
18911- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS, EvPara);
18912- EvPara.Para32[0] = pNet->PortNr;
18913- EvPara.Para32[1] = -1;
18914- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
18915-
18916- if (netif_running(pOtherDev)) {
18917- DEV_NET *pOtherNet = netdev_priv(pOtherDev);
18918- EvPara.Para32[0] = pOtherNet->PortNr;
18919- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
18920- }
18921- } else {
18922- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
18923- }
18924-
18925- SkEventDispatcher(pAC, pAC->IoBase);
18926 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
18927-
18928- /*
18929- ** While testing this driver with latest kernel 2.5 (2.5.70), it
18930- ** seems as if upper layers have a problem to handle a successful
18931- ** return value of '0'. If such a zero is returned, the complete
18932- ** system hangs for several minutes (!), which is in acceptable.
18933- **
18934- ** Currently it is not clear, what the exact reason for this problem
18935- ** is. The implemented workaround for 2.5 is to return the desired
18936- ** new MTU size if all needed changes for the new MTU size where
18937- ** performed. In kernels 2.2 and 2.4, a zero value is returned,
18938- ** which indicates the successful change of the mtu-size.
18939- */
18940- return NewMtu;
18941+ return 0;
18942
18943-} /* SkGeChangeMtu */
18944+}
18945
18946
18947 /*****************************************************************************
18948@@ -2775,75 +3884,67 @@
18949 */
18950 static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev)
18951 {
18952-DEV_NET *pNet = netdev_priv(dev);
18953-SK_AC *pAC = pNet->pAC;
18954-SK_PNMI_STRUCT_DATA *pPnmiStruct; /* structure for all Pnmi-Data */
18955-SK_PNMI_STAT *pPnmiStat; /* pointer to virtual XMAC stat. data */
18956-SK_PNMI_CONF *pPnmiConf; /* pointer to virtual link config. */
18957-unsigned int Size; /* size of pnmi struct */
18958-unsigned long Flags; /* for spin lock */
18959-
18960- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
18961- ("SkGeStats starts now...\n"));
18962- pPnmiStruct = &pAC->PnmiStruct;
18963+ DEV_NET *pNet = (DEV_NET*) dev->priv;
18964+ SK_AC *pAC = pNet->pAC;
18965+ unsigned long LateCollisions, ExcessiveCollisions, RxTooLong;
18966+ unsigned long Flags; /* for spin lock */
18967+ SK_U32 MaxNumOidEntries, Oid, Len;
18968+ char Buf[8];
18969+ struct {
18970+ SK_U32 Oid;
18971+ unsigned long *pVar;
18972+ } Vars[] = {
18973+ { OID_SKGE_STAT_TX_LATE_COL, &LateCollisions },
18974+ { OID_SKGE_STAT_TX_EXCESS_COL, &ExcessiveCollisions },
18975+ { OID_SKGE_STAT_RX_TOO_LONG, &RxTooLong },
18976+ { OID_SKGE_STAT_RX, &pAC->stats.rx_packets },
18977+ { OID_SKGE_STAT_TX, &pAC->stats.tx_packets },
18978+ { OID_SKGE_STAT_RX_OCTETS, &pAC->stats.rx_bytes },
18979+ { OID_SKGE_STAT_TX_OCTETS, &pAC->stats.tx_bytes },
18980+ { OID_SKGE_RX_NO_BUF_CTS, &pAC->stats.rx_dropped },
18981+ { OID_SKGE_TX_NO_BUF_CTS, &pAC->stats.tx_dropped },
18982+ { OID_SKGE_STAT_RX_MULTICAST, &pAC->stats.multicast },
18983+ { OID_SKGE_STAT_RX_RUNT, &pAC->stats.rx_length_errors },
18984+ { OID_SKGE_STAT_RX_FCS, &pAC->stats.rx_crc_errors },
18985+ { OID_SKGE_STAT_RX_FRAMING, &pAC->stats.rx_frame_errors },
18986+ { OID_SKGE_STAT_RX_OVERFLOW, &pAC->stats.rx_over_errors },
18987+ { OID_SKGE_STAT_RX_MISSED, &pAC->stats.rx_missed_errors },
18988+ { OID_SKGE_STAT_TX_CARRIER, &pAC->stats.tx_carrier_errors },
18989+ { OID_SKGE_STAT_TX_UNDERRUN, &pAC->stats.tx_fifo_errors },
18990+ };
18991+
18992+ if ((pAC->DiagModeActive == DIAG_NOTACTIVE) &&
18993+ (pAC->BoardLevel == SK_INIT_RUN)) {
18994+ memset(&pAC->stats, 0x00, sizeof(pAC->stats)); /* clean first */
18995+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
18996
18997-#ifdef SK_DIAG_SUPPORT
18998- if ((pAC->DiagModeActive == DIAG_NOTACTIVE) &&
18999- (pAC->BoardLevel == SK_INIT_RUN)) {
19000-#endif
19001- SK_MEMSET(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA));
19002- spin_lock_irqsave(&pAC->SlowPathLock, Flags);
19003- Size = SK_PNMI_STRUCT_SIZE;
19004- SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr);
19005- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
19006-#ifdef SK_DIAG_SUPPORT
19007- }
19008-#endif
19009+ MaxNumOidEntries = sizeof(Vars) / sizeof(Vars[0]);
19010+ for (Oid = 0; Oid < MaxNumOidEntries; Oid++) {
19011+ if (SkPnmiGetVar(pAC,pAC->IoBase, Vars[Oid].Oid,
19012+ &Buf, &Len, 1, pNet->NetNr) != SK_PNMI_ERR_OK) {
19013+ memset(Buf, 0x00, sizeof(Buf));
19014+ }
19015+ *Vars[Oid].pVar = (unsigned long) (*((SK_U64 *) Buf));
19016+ }
19017+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
19018
19019- pPnmiStat = &pPnmiStruct->Stat[0];
19020- pPnmiConf = &pPnmiStruct->Conf[0];
19021+ pAC->stats.collisions = LateCollisions + ExcessiveCollisions;
19022+ pAC->stats.tx_errors = pAC->stats.tx_carrier_errors +
19023+ pAC->stats.tx_fifo_errors;
19024+ pAC->stats.rx_errors = pAC->stats.rx_length_errors +
19025+ pAC->stats.rx_crc_errors +
19026+ pAC->stats.rx_frame_errors +
19027+ pAC->stats.rx_over_errors +
19028+ pAC->stats.rx_missed_errors;
19029
19030- pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF;
19031- pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF;
19032- pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts;
19033- pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts;
19034-
19035- if (dev->mtu <= 1500) {
19036- pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF;
19037- } else {
19038- pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts -
19039- pPnmiStat->StatRxTooLongCts) & 0xFFFFFFFF);
19040+ if (dev->mtu > 1500) {
19041+ pAC->stats.rx_errors = pAC->stats.rx_errors - RxTooLong;
19042+ }
19043 }
19044
19045-
19046- if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && pAC->HWRevision < 12)
19047- pAC->stats.rx_errors = pAC->stats.rx_errors - pPnmiStat->StatRxShortsCts;
19048-
19049- pAC->stats.tx_errors = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF;
19050- pAC->stats.rx_dropped = (SK_U32) pPnmiStruct->RxNoBufCts & 0xFFFFFFFF;
19051- pAC->stats.tx_dropped = (SK_U32) pPnmiStruct->TxNoBufCts & 0xFFFFFFFF;
19052- pAC->stats.multicast = (SK_U32) pPnmiStat->StatRxMulticastOkCts & 0xFFFFFFFF;
19053- pAC->stats.collisions = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF;
19054-
19055- /* detailed rx_errors: */
19056- pAC->stats.rx_length_errors = (SK_U32) pPnmiStat->StatRxRuntCts & 0xFFFFFFFF;
19057- pAC->stats.rx_over_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF;
19058- pAC->stats.rx_crc_errors = (SK_U32) pPnmiStat->StatRxFcsCts & 0xFFFFFFFF;
19059- pAC->stats.rx_frame_errors = (SK_U32) pPnmiStat->StatRxFramingCts & 0xFFFFFFFF;
19060- pAC->stats.rx_fifo_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF;
19061- pAC->stats.rx_missed_errors = (SK_U32) pPnmiStat->StatRxMissedCts & 0xFFFFFFFF;
19062-
19063- /* detailed tx_errors */
19064- pAC->stats.tx_aborted_errors = (SK_U32) 0;
19065- pAC->stats.tx_carrier_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF;
19066- pAC->stats.tx_fifo_errors = (SK_U32) pPnmiStat->StatTxFifoUnderrunCts & 0xFFFFFFFF;
19067- pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF;
19068- pAC->stats.tx_window_errors = (SK_U32) 0;
19069-
19070 return(&pAC->stats);
19071 } /* SkGeStats */
19072
19073-
19074 /*****************************************************************************
19075 *
19076 * SkGeIoctl - IO-control function
19077@@ -2851,38 +3952,41 @@
19078 * Description:
19079 * This function is called if an ioctl is issued on the device.
19080 * There are three subfunction for reading, writing and test-writing
19081- * the private MIB data structure (useful for SysKonnect-internal tools).
19082+ * the private MIB data structure (usefull for SysKonnect-internal tools).
19083 *
19084 * Returns:
19085 * 0, if everything is ok
19086 * !=0, on error
19087 */
19088-static int SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd)
19089-{
19090-DEV_NET *pNet;
19091-SK_AC *pAC;
19092-void *pMemBuf;
19093-struct pci_dev *pdev = NULL;
19094-SK_GE_IOCTL Ioctl;
19095-unsigned int Err = 0;
19096-int Size = 0;
19097-int Ret = 0;
19098-unsigned int Length = 0;
19099-int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32);
19100+static int SkGeIoctl(
19101+struct SK_NET_DEVICE *dev, /* the device the IOCTL is to be performed on */
19102+struct ifreq *rq, /* additional request structure containing data */
19103+int cmd) /* requested IOCTL command number */
19104+{
19105+ DEV_NET *pNet = (DEV_NET*) dev->priv;
19106+ SK_AC *pAC = pNet->pAC;
19107+ struct pci_dev *pdev = NULL;
19108+ void *pMemBuf;
19109+ SK_GE_IOCTL Ioctl;
19110+ unsigned long Flags; /* for spin lock */
19111+ unsigned int Err = 0;
19112+ unsigned int Length = 0;
19113+ int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32);
19114+ int Size = 0;
19115+ int Ret = 0;
19116
19117 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
19118 ("SkGeIoctl starts now...\n"));
19119
19120- pNet = netdev_priv(dev);
19121- pAC = pNet->pAC;
19122-
19123 if(copy_from_user(&Ioctl, rq->ifr_data, sizeof(SK_GE_IOCTL))) {
19124 return -EFAULT;
19125 }
19126
19127 switch(cmd) {
19128- case SK_IOCTL_SETMIB:
19129- case SK_IOCTL_PRESETMIB:
19130+ case SIOCETHTOOL:
19131+ return SkEthIoctl(dev, rq);
19132+ case SK_IOCTL_SETMIB: /* FALL THRU */
19133+ case SK_IOCTL_PRESETMIB: /* FALL THRU (if capable!) */
19134 if (!capable(CAP_NET_ADMIN)) return -EPERM;
19135 case SK_IOCTL_GETMIB:
19136 if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData,
19137@@ -2909,6 +4013,7 @@
19138 if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) {
19139 return -ENOMEM;
19140 }
19141+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
19142 if(copy_from_user(pMemBuf, Ioctl.pData, Length)) {
19143 Err = -EFAULT;
19144 goto fault_gen;
19145@@ -2927,10 +4032,10 @@
19146 goto fault_gen;
19147 }
19148 fault_gen:
19149+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
19150 kfree(pMemBuf); /* cleanup everything */
19151 break;
19152-#ifdef SK_DIAG_SUPPORT
19153- case SK_IOCTL_DIAG:
19154+ case SK_IOCTL_DIAG:
19155 if (!capable(CAP_NET_ADMIN)) return -EPERM;
19156 if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) {
19157 Length = Ioctl.Len;
19158@@ -2967,7 +4072,6 @@
19159 fault_diag:
19160 kfree(pMemBuf); /* cleanup everything */
19161 break;
19162-#endif
19163 default:
19164 Err = -EOPNOTSUPP;
19165 }
19166@@ -2999,12 +4103,12 @@
19167 unsigned int Size, /* length of ioctl data */
19168 int mode) /* flag for set/preset */
19169 {
19170-unsigned long Flags; /* for spin lock */
19171-SK_AC *pAC;
19172+ SK_AC *pAC = pNet->pAC;
19173+ unsigned long Flags; /* for spin lock */
19174
19175 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
19176 ("SkGeIocMib starts now...\n"));
19177- pAC = pNet->pAC;
19178+
19179 /* access MIB */
19180 spin_lock_irqsave(&pAC->SlowPathLock, Flags);
19181 switch(mode) {
19182@@ -3047,17 +4151,18 @@
19183 SK_I32 Port; /* preferred port */
19184 SK_BOOL AutoSet;
19185 SK_BOOL DupSet;
19186-int LinkSpeed = SK_LSPEED_AUTO; /* Link speed */
19187-int AutoNeg = 1; /* autoneg off (0) or on (1) */
19188-int DuplexCap = 0; /* 0=both,1=full,2=half */
19189-int FlowCtrl = SK_FLOW_MODE_SYM_OR_REM; /* FlowControl */
19190-int MSMode = SK_MS_MODE_AUTO; /* master/slave mode */
19191-
19192-SK_BOOL IsConTypeDefined = SK_TRUE;
19193-SK_BOOL IsLinkSpeedDefined = SK_TRUE;
19194-SK_BOOL IsFlowCtrlDefined = SK_TRUE;
19195-SK_BOOL IsRoleDefined = SK_TRUE;
19196-SK_BOOL IsModeDefined = SK_TRUE;
19197+int LinkSpeed = SK_LSPEED_AUTO; /* Link speed */
19198+int AutoNeg = 1; /* autoneg off (0) or on (1) */
19199+int DuplexCap = 0; /* 0=both,1=full,2=half */
19200+int FlowCtrl = SK_FLOW_MODE_SYM_OR_REM; /* FlowControl */
19201+int MSMode = SK_MS_MODE_AUTO; /* master/slave mode */
19202+int IrqModMaskOffset = 6; /* all ints moderated=default */
19203+
19204+SK_BOOL IsConTypeDefined = SK_TRUE;
19205+SK_BOOL IsLinkSpeedDefined = SK_TRUE;
19206+SK_BOOL IsFlowCtrlDefined = SK_TRUE;
19207+SK_BOOL IsRoleDefined = SK_TRUE;
19208+SK_BOOL IsModeDefined = SK_TRUE;
19209 /*
19210 * The two parameters AutoNeg. and DuplexCap. map to one configuration
19211 * parameter. The mapping is described by this table:
19212@@ -3075,6 +4180,15 @@
19213 {SK_LMODE_AUTOBOTH , SK_LMODE_AUTOFULL , SK_LMODE_AUTOHALF },
19214 {SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE} };
19215
19216+SK_U32 IrqModMask[7][2] =
19217+ { { IRQ_MASK_RX_ONLY , Y2_DRIVER_IRQS },
19218+ { IRQ_MASK_TX_ONLY , Y2_DRIVER_IRQS },
19219+ { IRQ_MASK_SP_ONLY , Y2_SPECIAL_IRQS },
19220+ { IRQ_MASK_SP_RX , Y2_IRQ_MASK },
19221+ { IRQ_MASK_TX_RX , Y2_DRIVER_IRQS },
19222+ { IRQ_MASK_SP_TX , Y2_IRQ_MASK },
19223+ { IRQ_MASK_RX_TX_SP, Y2_IRQ_MASK } };
19224+
19225 #define DC_BOTH 0
19226 #define DC_FULL 1
19227 #define DC_HALF 2
19228@@ -3114,7 +4228,7 @@
19229 **
19230 ** This ConType parameter is used for all ports of the adapter!
19231 */
19232- if ( (ConType != NULL) &&
19233+ if ( (ConType != NULL) &&
19234 (pAC->Index < SK_MAX_CARD_PARAM) &&
19235 (ConType[pAC->Index] != NULL) ) {
19236
19237@@ -3140,40 +4254,40 @@
19238 M_CurrPort.PMSMode = SK_MS_MODE_AUTO;
19239 M_CurrPort.PLinkSpeed = SK_LSPEED_AUTO;
19240 }
19241- } else if (strcmp(ConType[pAC->Index],"100FD")==0) {
19242+ } else if (strcmp(ConType[pAC->Index],"100FD")==0) {
19243 for (Port = 0; Port < SK_MAX_MACS; Port++) {
19244 M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_FULL];
19245 M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE;
19246 M_CurrPort.PMSMode = SK_MS_MODE_AUTO;
19247 M_CurrPort.PLinkSpeed = SK_LSPEED_100MBPS;
19248 }
19249- } else if (strcmp(ConType[pAC->Index],"100HD")==0) {
19250+ } else if (strcmp(ConType[pAC->Index],"100HD")==0) {
19251 for (Port = 0; Port < SK_MAX_MACS; Port++) {
19252 M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_HALF];
19253 M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE;
19254 M_CurrPort.PMSMode = SK_MS_MODE_AUTO;
19255 M_CurrPort.PLinkSpeed = SK_LSPEED_100MBPS;
19256 }
19257- } else if (strcmp(ConType[pAC->Index],"10FD")==0) {
19258+ } else if (strcmp(ConType[pAC->Index],"10FD")==0) {
19259 for (Port = 0; Port < SK_MAX_MACS; Port++) {
19260 M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_FULL];
19261 M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE;
19262 M_CurrPort.PMSMode = SK_MS_MODE_AUTO;
19263 M_CurrPort.PLinkSpeed = SK_LSPEED_10MBPS;
19264 }
19265- } else if (strcmp(ConType[pAC->Index],"10HD")==0) {
19266+ } else if (strcmp(ConType[pAC->Index],"10HD")==0) {
19267 for (Port = 0; Port < SK_MAX_MACS; Port++) {
19268 M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_HALF];
19269 M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE;
19270 M_CurrPort.PMSMode = SK_MS_MODE_AUTO;
19271 M_CurrPort.PLinkSpeed = SK_LSPEED_10MBPS;
19272 }
19273- } else {
19274+ } else {
19275 printk("sk98lin: Illegal value \"%s\" for ConType\n",
19276 ConType[pAC->Index]);
19277 IsConTypeDefined = SK_FALSE; /* Wrong ConType defined */
19278 }
19279- } else {
19280+ } else {
19281 IsConTypeDefined = SK_FALSE; /* No ConType defined */
19282 }
19283
19284@@ -3192,14 +4306,30 @@
19285 } else if (strcmp(Speed_A[pAC->Index],"100")==0) {
19286 LinkSpeed = SK_LSPEED_100MBPS;
19287 } else if (strcmp(Speed_A[pAC->Index],"1000")==0) {
19288- LinkSpeed = SK_LSPEED_1000MBPS;
19289+ if ((pAC->PciDev->vendor == 0x11ab ) &&
19290+ (pAC->PciDev->device == 0x4350)) {
19291+ LinkSpeed = SK_LSPEED_100MBPS;
19292+ printk("sk98lin: Illegal value \"%s\" for Speed_A.\n"
19293+ "Gigabit speed not possible with this chip revision!",
19294+ Speed_A[pAC->Index]);
19295+ } else {
19296+ LinkSpeed = SK_LSPEED_1000MBPS;
19297+ }
19298 } else {
19299 printk("sk98lin: Illegal value \"%s\" for Speed_A\n",
19300 Speed_A[pAC->Index]);
19301 IsLinkSpeedDefined = SK_FALSE;
19302 }
19303 } else {
19304- IsLinkSpeedDefined = SK_FALSE;
19305+ if ((pAC->PciDev->vendor == 0x11ab ) &&
19306+ (pAC->PciDev->device == 0x4350)) {
19307+ /* Gigabit speed not supported
19308+ * Swith to speed 100
19309+ */
19310+ LinkSpeed = SK_LSPEED_100MBPS;
19311+ } else {
19312+ IsLinkSpeedDefined = SK_FALSE;
19313+ }
19314 }
19315
19316 /*
19317@@ -3294,9 +4424,6 @@
19318 }
19319
19320 if (!AutoSet && DupSet) {
19321- printk("sk98lin: Port A: Duplex setting not"
19322- " possible in\n default AutoNegotiation mode"
19323- " (Sense).\n Using AutoNegotiation On\n");
19324 AutoNeg = AN_ON;
19325 }
19326
19327@@ -3324,7 +4451,7 @@
19328 FlowCtrl = SK_FLOW_MODE_NONE;
19329 } else {
19330 printk("sk98lin: Illegal value \"%s\" for FlowCtrl_A\n",
19331- FlowCtrl_A[pAC->Index]);
19332+ FlowCtrl_A[pAC->Index]);
19333 IsFlowCtrlDefined = SK_FALSE;
19334 }
19335 } else {
19336@@ -3416,7 +4543,7 @@
19337 ** Decide whether to set new config value if somethig valid has
19338 ** been received.
19339 */
19340- if (IsLinkSpeedDefined) {
19341+ if (IsLinkSpeedDefined) {
19342 pAC->GIni.GP[1].PLinkSpeed = LinkSpeed;
19343 }
19344
19345@@ -3492,9 +4619,6 @@
19346 }
19347
19348 if (!AutoSet && DupSet) {
19349- printk("sk98lin: Port B: Duplex setting not"
19350- " possible in\n default AutoNegotiation mode"
19351- " (Sense).\n Using AutoNegotiation On\n");
19352 AutoNeg = AN_ON;
19353 }
19354
19355@@ -3607,11 +4731,15 @@
19356 }
19357
19358 pAC->RlmtNets = 1;
19359+ pAC->RlmtMode = 0;
19360
19361 if (RlmtMode != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
19362 RlmtMode[pAC->Index] != NULL) {
19363 if (strcmp(RlmtMode[pAC->Index], "") == 0) {
19364- pAC->RlmtMode = 0;
19365+ if (pAC->GIni.GIMacsFound == 2) {
19366+ pAC->RlmtMode = SK_RLMT_CHECK_LINK;
19367+ pAC->RlmtNets = 2;
19368+ }
19369 } else if (strcmp(RlmtMode[pAC->Index], "CheckLinkState") == 0) {
19370 pAC->RlmtMode = SK_RLMT_CHECK_LINK;
19371 } else if (strcmp(RlmtMode[pAC->Index], "CheckLocalPort") == 0) {
19372@@ -3632,12 +4760,37 @@
19373 pAC->RlmtMode = 0;
19374 }
19375 } else {
19376- pAC->RlmtMode = 0;
19377+ if (pAC->GIni.GIMacsFound == 2) {
19378+ pAC->RlmtMode = SK_RLMT_CHECK_LINK;
19379+ pAC->RlmtNets = 2;
19380+ }
19381 }
19382-
19383+
19384+#ifdef SK_YUKON2
19385+ /*
19386+ ** use dualnet config per default
19387+ *
19388+ pAC->RlmtMode = SK_RLMT_CHECK_LINK;
19389+ pAC->RlmtNets = 2;
19390+ */
19391+#endif
19392+
19393+
19394+ /*
19395+ ** Check the LowLatance parameters
19396+ */
19397+ pAC->LowLatency = SK_FALSE;
19398+ if (LowLatency[pAC->Index] != NULL) {
19399+ if (strcmp(LowLatency[pAC->Index], "On") == 0) {
19400+ pAC->LowLatency = SK_TRUE;
19401+ }
19402+ }
19403+
19404+
19405 /*
19406 ** Check the interrupt moderation parameters
19407 */
19408+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
19409 if (Moderation[pAC->Index] != NULL) {
19410 if (strcmp(Moderation[pAC->Index], "") == 0) {
19411 pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
19412@@ -3651,70 +4804,49 @@
19413 printk("sk98lin: Illegal value \"%s\" for Moderation.\n"
19414 " Disable interrupt moderation.\n",
19415 Moderation[pAC->Index]);
19416- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
19417- }
19418- } else {
19419- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
19420- }
19421-
19422- if (Stats[pAC->Index] != NULL) {
19423- if (strcmp(Stats[pAC->Index], "Yes") == 0) {
19424- pAC->DynIrqModInfo.DisplayStats = SK_TRUE;
19425- } else {
19426- pAC->DynIrqModInfo.DisplayStats = SK_FALSE;
19427 }
19428 } else {
19429- pAC->DynIrqModInfo.DisplayStats = SK_FALSE;
19430+/* Set interrupt moderation if wished */
19431+#ifdef CONFIG_SK98LIN_STATINT
19432+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_STATIC;
19433+#endif
19434 }
19435
19436 if (ModerationMask[pAC->Index] != NULL) {
19437 if (strcmp(ModerationMask[pAC->Index], "Rx") == 0) {
19438- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY;
19439+ IrqModMaskOffset = 0;
19440 } else if (strcmp(ModerationMask[pAC->Index], "Tx") == 0) {
19441- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_ONLY;
19442+ IrqModMaskOffset = 1;
19443 } else if (strcmp(ModerationMask[pAC->Index], "Sp") == 0) {
19444- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_ONLY;
19445+ IrqModMaskOffset = 2;
19446 } else if (strcmp(ModerationMask[pAC->Index], "RxSp") == 0) {
19447- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX;
19448+ IrqModMaskOffset = 3;
19449 } else if (strcmp(ModerationMask[pAC->Index], "SpRx") == 0) {
19450- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX;
19451+ IrqModMaskOffset = 3;
19452 } else if (strcmp(ModerationMask[pAC->Index], "RxTx") == 0) {
19453- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
19454+ IrqModMaskOffset = 4;
19455 } else if (strcmp(ModerationMask[pAC->Index], "TxRx") == 0) {
19456- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
19457+ IrqModMaskOffset = 4;
19458 } else if (strcmp(ModerationMask[pAC->Index], "TxSp") == 0) {
19459- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX;
19460+ IrqModMaskOffset = 5;
19461 } else if (strcmp(ModerationMask[pAC->Index], "SpTx") == 0) {
19462- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX;
19463- } else if (strcmp(ModerationMask[pAC->Index], "RxTxSp") == 0) {
19464- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
19465- } else if (strcmp(ModerationMask[pAC->Index], "RxSpTx") == 0) {
19466- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
19467- } else if (strcmp(ModerationMask[pAC->Index], "TxRxSp") == 0) {
19468- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
19469- } else if (strcmp(ModerationMask[pAC->Index], "TxSpRx") == 0) {
19470- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
19471- } else if (strcmp(ModerationMask[pAC->Index], "SpTxRx") == 0) {
19472- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
19473- } else if (strcmp(ModerationMask[pAC->Index], "SpRxTx") == 0) {
19474- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
19475- } else { /* some rubbish */
19476- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY;
19477- }
19478- } else { /* operator has stated nothing */
19479- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
19480- }
19481-
19482- if (AutoSizing[pAC->Index] != NULL) {
19483- if (strcmp(AutoSizing[pAC->Index], "On") == 0) {
19484- pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
19485- } else {
19486- pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
19487+ IrqModMaskOffset = 5;
19488+ } else { /* some rubbish stated */
19489+ // IrqModMaskOffset = 6; ->has been initialized
19490+ // already at the begin of this function...
19491 }
19492- } else { /* operator has stated nothing */
19493- pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
19494+ }
19495+ if (!CHIP_ID_YUKON_2(pAC)) {
19496+ pAC->DynIrqModInfo.MaskIrqModeration = IrqModMask[IrqModMaskOffset][0];
19497+ } else {
19498+ pAC->DynIrqModInfo.MaskIrqModeration = IrqModMask[IrqModMaskOffset][1];
19499 }
19500
19501+ if (!CHIP_ID_YUKON_2(pAC)) {
19502+ pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT;
19503+ } else {
19504+ pAC->DynIrqModInfo.MaxModIntsPerSec = C_Y2_INTS_PER_SEC_DEFAULT;
19505+ }
19506 if (IntsPerSec[pAC->Index] != 0) {
19507 if ((IntsPerSec[pAC->Index]< C_INT_MOD_IPS_LOWER_RANGE) ||
19508 (IntsPerSec[pAC->Index] > C_INT_MOD_IPS_UPPER_RANGE)) {
19509@@ -3723,28 +4855,25 @@
19510 IntsPerSec[pAC->Index],
19511 C_INT_MOD_IPS_LOWER_RANGE,
19512 C_INT_MOD_IPS_UPPER_RANGE,
19513- C_INTS_PER_SEC_DEFAULT);
19514- pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT;
19515+ pAC->DynIrqModInfo.MaxModIntsPerSec);
19516 } else {
19517 pAC->DynIrqModInfo.MaxModIntsPerSec = IntsPerSec[pAC->Index];
19518 }
19519- } else {
19520- pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT;
19521- }
19522+ }
19523
19524 /*
19525 ** Evaluate upper and lower moderation threshold
19526 */
19527 pAC->DynIrqModInfo.MaxModIntsPerSecUpperLimit =
19528 pAC->DynIrqModInfo.MaxModIntsPerSec +
19529- (pAC->DynIrqModInfo.MaxModIntsPerSec / 2);
19530+ (pAC->DynIrqModInfo.MaxModIntsPerSec / 5);
19531
19532 pAC->DynIrqModInfo.MaxModIntsPerSecLowerLimit =
19533 pAC->DynIrqModInfo.MaxModIntsPerSec -
19534- (pAC->DynIrqModInfo.MaxModIntsPerSec / 2);
19535-
19536- pAC->DynIrqModInfo.PrevTimeVal = jiffies; /* initial value */
19537+ (pAC->DynIrqModInfo.MaxModIntsPerSec / 5);
19538
19539+ pAC->DynIrqModInfo.DynIrqModSampleInterval =
19540+ SK_DRV_MODERATION_TIMER_LENGTH;
19541
19542 } /* GetConfiguration */
19543
19544@@ -3759,62 +4888,22 @@
19545 *
19546 * Returns: N/A
19547 */
19548-static inline int ProductStr(
19549- SK_AC *pAC, /* pointer to adapter context */
19550- char *DeviceStr, /* result string */
19551- int StrLen /* length of the string */
19552-)
19553+static void ProductStr(SK_AC *pAC)
19554 {
19555-char Keyword[] = VPD_NAME; /* vpd productname identifier */
19556-int ReturnCode; /* return code from vpd_read */
19557-unsigned long Flags;
19558+ char Default[] = "Generic Marvell Yukon chipset Ethernet device";
19559+ char Key[] = VPD_NAME; /* VPD productname key */
19560+ int StrLen = 80; /* stringlen */
19561+ unsigned long Flags;
19562
19563 spin_lock_irqsave(&pAC->SlowPathLock, Flags);
19564- ReturnCode = VpdRead(pAC, pAC->IoBase, Keyword, DeviceStr, &StrLen);
19565+ if (VpdRead(pAC, pAC->IoBase, Key, pAC->DeviceStr, &StrLen)) {
19566+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ERROR,
19567+ ("Error reading VPD data: %d\n", ReturnCode));
19568+ strcpy(pAC->DeviceStr, Default);
19569+ }
19570 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
19571-
19572- return ReturnCode;
19573 } /* ProductStr */
19574
19575-/*****************************************************************************
19576- *
19577- * StartDrvCleanupTimer - Start timer to check for descriptors which
19578- * might be placed in descriptor ring, but
19579- * havent been handled up to now
19580- *
19581- * Description:
19582- * This function requests a HW-timer fo the Yukon card. The actions to
19583- * perform when this timer expires, are located in the SkDrvEvent().
19584- *
19585- * Returns: N/A
19586- */
19587-static void
19588-StartDrvCleanupTimer(SK_AC *pAC) {
19589- SK_EVPARA EventParam; /* Event struct for timer event */
19590-
19591- SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam));
19592- EventParam.Para32[0] = SK_DRV_RX_CLEANUP_TIMER;
19593- SkTimerStart(pAC, pAC->IoBase, &pAC->DrvCleanupTimer,
19594- SK_DRV_RX_CLEANUP_TIMER_LENGTH,
19595- SKGE_DRV, SK_DRV_TIMER, EventParam);
19596-}
19597-
19598-/*****************************************************************************
19599- *
19600- * StopDrvCleanupTimer - Stop timer to check for descriptors
19601- *
19602- * Description:
19603- * This function requests a HW-timer fo the Yukon card. The actions to
19604- * perform when this timer expires, are located in the SkDrvEvent().
19605- *
19606- * Returns: N/A
19607- */
19608-static void
19609-StopDrvCleanupTimer(SK_AC *pAC) {
19610- SkTimerStop(pAC, pAC->IoBase, &pAC->DrvCleanupTimer);
19611- SK_MEMSET((char *) &pAC->DrvCleanupTimer, 0, sizeof(SK_TIMER));
19612-}
19613-
19614 /****************************************************************************/
19615 /* functions for common modules *********************************************/
19616 /****************************************************************************/
19617@@ -3903,7 +4992,9 @@
19618 SK_U64 SkOsGetTime(SK_AC *pAC)
19619 {
19620 SK_U64 PrivateJiffies;
19621+
19622 SkOsGetTimeCurrent(pAC, &PrivateJiffies);
19623+
19624 return PrivateJiffies;
19625 } /* SkOsGetTime */
19626
19627@@ -3976,6 +5067,28 @@
19628
19629 /*****************************************************************************
19630 *
19631+ * SkPciWriteCfgDWord - write a 32 bit value to pci config space
19632+ *
19633+ * Description:
19634+ * This routine writes a 32 bit value to the pci configuration
19635+ * space.
19636+ *
19637+ * Returns:
19638+ * 0 - indicate everything worked ok.
19639+ * != 0 - error indication
19640+ */
19641+int SkPciWriteCfgDWord(
19642+SK_AC *pAC, /* Adapter Control structure pointer */
19643+int PciAddr, /* PCI register address */
19644+SK_U32 Val) /* pointer to store the read value */
19645+{
19646+ pci_write_config_dword(pAC->PciDev, PciAddr, Val);
19647+ return(0);
19648+} /* SkPciWriteCfgDWord */
19649+
19650+
19651+/*****************************************************************************
19652+ *
19653 * SkPciWriteCfgWord - write a 16 bit value to pci config space
19654 *
19655 * Description:
19656@@ -4036,29 +5149,27 @@
19657 *
19658 */
19659 int SkDrvEvent(
19660-SK_AC *pAC, /* pointer to adapter context */
19661-SK_IOC IoC, /* io-context */
19662-SK_U32 Event, /* event-id */
19663-SK_EVPARA Param) /* event-parameter */
19664-{
19665-SK_MBUF *pRlmtMbuf; /* pointer to a rlmt-mbuf structure */
19666-struct sk_buff *pMsg; /* pointer to a message block */
19667-int FromPort; /* the port from which we switch away */
19668-int ToPort; /* the port we switch to */
19669-SK_EVPARA NewPara; /* parameter for further events */
19670-int Stat;
19671-unsigned long Flags;
19672-SK_BOOL DualNet;
19673+SK_AC *pAC, /* pointer to adapter context */
19674+SK_IOC IoC, /* IO control context */
19675+SK_U32 Event, /* event-id */
19676+SK_EVPARA Param) /* event-parameter */
19677+{
19678+ SK_MBUF *pRlmtMbuf; /* pointer to a rlmt-mbuf structure */
19679+ struct sk_buff *pMsg; /* pointer to a message block */
19680+ SK_BOOL DualNet;
19681+ SK_U32 Reason;
19682+ unsigned long Flags;
19683+ unsigned long InitFlags;
19684+ int FromPort; /* the port from which we switch away */
19685+ int ToPort; /* the port we switch to */
19686+ int Stat;
19687+ DEV_NET *pNet = NULL;
19688+#ifdef CONFIG_SK98LIN_NAPI
19689+ int WorkToDo = 1; /* min(*budget, dev->quota); */
19690+ int WorkDone = 0;
19691+#endif
19692
19693 switch (Event) {
19694- case SK_DRV_ADAP_FAIL:
19695- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
19696- ("ADAPTER FAIL EVENT\n"));
19697- printk("%s: Adapter failed.\n", pAC->dev[0]->name);
19698- /* disable interrupts */
19699- SK_OUT32(pAC->IoBase, B0_IMSK, 0);
19700- /* cgoos */
19701- break;
19702 case SK_DRV_PORT_FAIL:
19703 FromPort = Param.Para32[0];
19704 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
19705@@ -4068,210 +5179,296 @@
19706 } else {
19707 printk("%s: Port B failed.\n", pAC->dev[1]->name);
19708 }
19709- /* cgoos */
19710 break;
19711- case SK_DRV_PORT_RESET: /* SK_U32 PortIdx */
19712- /* action list 4 */
19713+ case SK_DRV_PORT_RESET:
19714 FromPort = Param.Para32[0];
19715 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
19716 ("PORT RESET EVENT, Port: %d ", FromPort));
19717- NewPara.Para64 = FromPort;
19718- SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara);
19719+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET,
19720+ FromPort, SK_FALSE);
19721 spin_lock_irqsave(
19722 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
19723 Flags);
19724-
19725- SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST);
19726- netif_carrier_off(pAC->dev[Param.Para32[0]]);
19727+ if (CHIP_ID_YUKON_2(pAC)) {
19728+ SkY2PortStop(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST);
19729+ } else {
19730+ SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST);
19731+ }
19732+ pAC->dev[Param.Para32[0]]->flags &= ~IFF_RUNNING;
19733 spin_unlock_irqrestore(
19734 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
19735 Flags);
19736
19737- /* clear rx ring from received frames */
19738- ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE);
19739-
19740- ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]);
19741+ if (!CHIP_ID_YUKON_2(pAC)) {
19742+#ifdef CONFIG_SK98LIN_NAPI
19743+ WorkToDo = 1;
19744+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE, &WorkDone, WorkToDo);
19745+#else
19746+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE);
19747+#endif
19748+ ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]);
19749+ }
19750 spin_lock_irqsave(
19751 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
19752 Flags);
19753-
19754- /* tschilling: Handling of return value inserted. */
19755- if (SkGeInitPort(pAC, IoC, FromPort)) {
19756- if (FromPort == 0) {
19757- printk("%s: SkGeInitPort A failed.\n", pAC->dev[0]->name);
19758+
19759+#ifdef USE_TIST_FOR_RESET
19760+ if (pAC->GIni.GIYukon2) {
19761+#ifdef Y2_RECOVERY
19762+ /* for Yukon II we want to have tist enabled all the time */
19763+ if (!SK_ADAPTER_WAITING_FOR_TIST(pAC)) {
19764+ Y2_ENABLE_TIST(pAC->IoBase);
19765+ }
19766+#else
19767+ /* make sure that we do not accept any status LEs from now on */
19768+ if (SK_ADAPTER_WAITING_FOR_TIST(pAC)) {
19769+#endif
19770+ /* port already waiting for tist */
19771+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
19772+ ("Port %c is now waiting for specific Tist\n",
19773+ 'A' + FromPort));
19774+ SK_SET_WAIT_BIT_FOR_PORT(
19775+ pAC,
19776+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST,
19777+ FromPort);
19778+ /* get current timestamp */
19779+ Y2_GET_TIST_LOW_VAL(pAC->IoBase, &pAC->MinTistLo);
19780+ pAC->MinTistHi = pAC->GIni.GITimeStampCnt;
19781+#ifndef Y2_RECOVERY
19782 } else {
19783- printk("%s: SkGeInitPort B failed.\n", pAC->dev[1]->name);
19784+ /* nobody is waiting yet */
19785+ SK_SET_WAIT_BIT_FOR_PORT(
19786+ pAC,
19787+ SK_PSTATE_WAITING_FOR_ANY_TIST,
19788+ FromPort);
19789+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
19790+ ("Port %c is now waiting for any Tist (0x%X)\n",
19791+ 'A' + FromPort, pAC->AdapterResetState));
19792+ /* start tist */
19793+ Y2_ENABLE_TIST(pAC-IoBase);
19794+ }
19795+#endif
19796+ }
19797+#endif
19798+
19799+#ifdef Y2_LE_CHECK
19800+ /* mark entries invalid */
19801+ pAC->LastPort = 3;
19802+ pAC->LastOpc = 0xFF;
19803+#endif
19804+ if (CHIP_ID_YUKON_2(pAC)) {
19805+ SkY2PortStart(pAC, IoC, FromPort);
19806+ } else {
19807+ /* tschilling: Handling of return value inserted. */
19808+ if (SkGeInitPort(pAC, IoC, FromPort)) {
19809+ if (FromPort == 0) {
19810+ printk("%s: SkGeInitPort A failed.\n", pAC->dev[0]->name);
19811+ } else {
19812+ printk("%s: SkGeInitPort B failed.\n", pAC->dev[1]->name);
19813+ }
19814 }
19815+ SkAddrMcUpdate(pAC,IoC, FromPort);
19816+ PortReInitBmu(pAC, FromPort);
19817+ SkGePollTxD(pAC, IoC, FromPort, SK_TRUE);
19818+ CLEAR_AND_START_RX(FromPort);
19819 }
19820- SkAddrMcUpdate(pAC,IoC, FromPort);
19821- PortReInitBmu(pAC, FromPort);
19822- SkGePollTxD(pAC, IoC, FromPort, SK_TRUE);
19823- ClearAndStartRx(pAC, FromPort);
19824 spin_unlock_irqrestore(
19825 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
19826 Flags);
19827 break;
19828- case SK_DRV_NET_UP: /* SK_U32 PortIdx */
19829- { struct net_device *dev = pAC->dev[Param.Para32[0]];
19830- /* action list 5 */
19831+ case SK_DRV_NET_UP:
19832+ spin_lock_irqsave(&pAC->InitLock, InitFlags);
19833 FromPort = Param.Para32[0];
19834 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
19835- ("NET UP EVENT, Port: %d ", Param.Para32[0]));
19836- /* Mac update */
19837- SkAddrMcUpdate(pAC,IoC, FromPort);
19838-
19839+ ("NET UP EVENT, Port: %d ", FromPort));
19840+ SkAddrMcUpdate(pAC,IoC, FromPort); /* Mac update */
19841 if (DoPrintInterfaceChange) {
19842- printk("%s: network connection up using"
19843- " port %c\n", pAC->dev[Param.Para32[0]]->name, 'A'+Param.Para32[0]);
19844+ printk("%s: network connection up using port %c\n",
19845+ pAC->dev[FromPort]->name, 'A'+FromPort);
19846
19847- /* tschilling: Values changed according to LinkSpeedUsed. */
19848- Stat = pAC->GIni.GP[FromPort].PLinkSpeedUsed;
19849- if (Stat == SK_LSPEED_STAT_10MBPS) {
19850- printk(" speed: 10\n");
19851- } else if (Stat == SK_LSPEED_STAT_100MBPS) {
19852- printk(" speed: 100\n");
19853- } else if (Stat == SK_LSPEED_STAT_1000MBPS) {
19854- printk(" speed: 1000\n");
19855- } else {
19856- printk(" speed: unknown\n");
19857- }
19858+ /* tschilling: Values changed according to LinkSpeedUsed. */
19859+ Stat = pAC->GIni.GP[FromPort].PLinkSpeedUsed;
19860+ if (Stat == SK_LSPEED_STAT_10MBPS) {
19861+ printk(" speed: 10\n");
19862+ } else if (Stat == SK_LSPEED_STAT_100MBPS) {
19863+ printk(" speed: 100\n");
19864+ } else if (Stat == SK_LSPEED_STAT_1000MBPS) {
19865+ printk(" speed: 1000\n");
19866+ } else {
19867+ printk(" speed: unknown\n");
19868+ }
19869
19870+ Stat = pAC->GIni.GP[FromPort].PLinkModeStatus;
19871+ if ((Stat == SK_LMODE_STAT_AUTOHALF) ||
19872+ (Stat == SK_LMODE_STAT_AUTOFULL)) {
19873+ printk(" autonegotiation: yes\n");
19874+ } else {
19875+ printk(" autonegotiation: no\n");
19876+ }
19877
19878- Stat = pAC->GIni.GP[FromPort].PLinkModeStatus;
19879- if (Stat == SK_LMODE_STAT_AUTOHALF ||
19880- Stat == SK_LMODE_STAT_AUTOFULL) {
19881- printk(" autonegotiation: yes\n");
19882- }
19883- else {
19884- printk(" autonegotiation: no\n");
19885- }
19886- if (Stat == SK_LMODE_STAT_AUTOHALF ||
19887- Stat == SK_LMODE_STAT_HALF) {
19888- printk(" duplex mode: half\n");
19889- }
19890- else {
19891- printk(" duplex mode: full\n");
19892- }
19893- Stat = pAC->GIni.GP[FromPort].PFlowCtrlStatus;
19894- if (Stat == SK_FLOW_STAT_REM_SEND ) {
19895- printk(" flowctrl: remote send\n");
19896- }
19897- else if (Stat == SK_FLOW_STAT_LOC_SEND ){
19898- printk(" flowctrl: local send\n");
19899- }
19900- else if (Stat == SK_FLOW_STAT_SYMMETRIC ){
19901- printk(" flowctrl: symmetric\n");
19902- }
19903- else {
19904- printk(" flowctrl: none\n");
19905- }
19906-
19907- /* tschilling: Check against CopperType now. */
19908- if ((pAC->GIni.GICopperType == SK_TRUE) &&
19909- (pAC->GIni.GP[FromPort].PLinkSpeedUsed ==
19910- SK_LSPEED_STAT_1000MBPS)) {
19911- Stat = pAC->GIni.GP[FromPort].PMSStatus;
19912- if (Stat == SK_MS_STAT_MASTER ) {
19913- printk(" role: master\n");
19914+ if ((Stat == SK_LMODE_STAT_AUTOHALF) ||
19915+ (Stat == SK_LMODE_STAT_HALF)) {
19916+ printk(" duplex mode: half\n");
19917+ } else {
19918+ printk(" duplex mode: full\n");
19919 }
19920- else if (Stat == SK_MS_STAT_SLAVE ) {
19921- printk(" role: slave\n");
19922+
19923+ Stat = pAC->GIni.GP[FromPort].PFlowCtrlStatus;
19924+ if (Stat == SK_FLOW_STAT_REM_SEND ) {
19925+ printk(" flowctrl: remote send\n");
19926+ } else if (Stat == SK_FLOW_STAT_LOC_SEND ) {
19927+ printk(" flowctrl: local send\n");
19928+ } else if (Stat == SK_FLOW_STAT_SYMMETRIC ) {
19929+ printk(" flowctrl: symmetric\n");
19930+ } else {
19931+ printk(" flowctrl: none\n");
19932 }
19933- else {
19934- printk(" role: ???\n");
19935+
19936+ /* tschilling: Check against CopperType now. */
19937+ if ((pAC->GIni.GICopperType == SK_TRUE) &&
19938+ (pAC->GIni.GP[FromPort].PLinkSpeedUsed ==
19939+ SK_LSPEED_STAT_1000MBPS)) {
19940+ Stat = pAC->GIni.GP[FromPort].PMSStatus;
19941+ if (Stat == SK_MS_STAT_MASTER ) {
19942+ printk(" role: master\n");
19943+ } else if (Stat == SK_MS_STAT_SLAVE ) {
19944+ printk(" role: slave\n");
19945+ } else {
19946+ printk(" role: ???\n");
19947+ }
19948 }
19949- }
19950
19951- /*
19952- Display dim (dynamic interrupt moderation)
19953- informations
19954- */
19955- if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC)
19956- printk(" irq moderation: static (%d ints/sec)\n",
19957+ /* Display interrupt moderation informations */
19958+ if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) {
19959+ printk(" irq moderation: static (%d ints/sec)\n",
19960 pAC->DynIrqModInfo.MaxModIntsPerSec);
19961- else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC)
19962- printk(" irq moderation: dynamic (%d ints/sec)\n",
19963+ } else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
19964+ printk(" irq moderation: dynamic (%d ints/sec)\n",
19965 pAC->DynIrqModInfo.MaxModIntsPerSec);
19966- else
19967- printk(" irq moderation: disabled\n");
19968+ } else {
19969+ printk(" irq moderation: disabled\n");
19970+ }
19971+
19972+#ifdef NETIF_F_TSO
19973+ if (CHIP_ID_YUKON_2(pAC)) {
19974+ if (pAC->dev[FromPort]->features & NETIF_F_TSO) {
19975+ printk(" tcp offload: enabled\n");
19976+ } else {
19977+ printk(" tcp offload: disabled\n");
19978+ }
19979+ }
19980+#endif
19981
19982+ if (pAC->dev[FromPort]->features & NETIF_F_SG) {
19983+ printk(" scatter-gather: enabled\n");
19984+ } else {
19985+ printk(" scatter-gather: disabled\n");
19986+ }
19987
19988- printk(" scatter-gather: %s\n",
19989- (dev->features & NETIF_F_SG) ? "enabled" : "disabled");
19990- printk(" tx-checksum: %s\n",
19991- (dev->features & NETIF_F_IP_CSUM) ? "enabled" : "disabled");
19992- printk(" rx-checksum: %s\n",
19993- pAC->RxPort[Param.Para32[0]].RxCsum ? "enabled" : "disabled");
19994+ if (pAC->dev[FromPort]->features & NETIF_F_IP_CSUM) {
19995+ printk(" tx-checksum: enabled\n");
19996+ } else {
19997+ printk(" tx-checksum: disabled\n");
19998+ }
19999
20000+ if (pAC->RxPort[FromPort].UseRxCsum) {
20001+ printk(" rx-checksum: enabled\n");
20002+ } else {
20003+ printk(" rx-checksum: disabled\n");
20004+ }
20005+#ifdef CONFIG_SK98LIN_NAPI
20006+ printk(" rx-polling: enabled\n");
20007+#endif
20008+ if (pAC->LowLatency) {
20009+ printk(" low latency: enabled\n");
20010+ }
20011 } else {
20012- DoPrintInterfaceChange = SK_TRUE;
20013- }
20014+ DoPrintInterfaceChange = SK_TRUE;
20015+ }
20016
20017- if ((Param.Para32[0] != pAC->ActivePort) &&
20018- (pAC->RlmtNets == 1)) {
20019- NewPara.Para32[0] = pAC->ActivePort;
20020- NewPara.Para32[1] = Param.Para32[0];
20021- SkEventQueue(pAC, SKGE_DRV, SK_DRV_SWITCH_INTERN,
20022- NewPara);
20023+ if ((FromPort != pAC->ActivePort)&&(pAC->RlmtNets == 1)) {
20024+ SkLocalEventQueue(pAC, SKGE_DRV, SK_DRV_SWITCH_INTERN,
20025+ pAC->ActivePort, FromPort, SK_FALSE);
20026 }
20027
20028 /* Inform the world that link protocol is up. */
20029- netif_carrier_on(dev);
20030+ netif_wake_queue(pAC->dev[FromPort]);
20031+ netif_carrier_on(pAC->dev[FromPort]);
20032+ pAC->dev[FromPort]->flags |= IFF_RUNNING;
20033+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags);
20034 break;
20035- }
20036- case SK_DRV_NET_DOWN: /* SK_U32 Reason */
20037- /* action list 7 */
20038+ case SK_DRV_NET_DOWN:
20039+ Reason = Param.Para32[0];
20040+ FromPort = Param.Para32[1];
20041 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20042 ("NET DOWN EVENT "));
20043+
20044+ /* Stop queue and carrier */
20045+ netif_stop_queue(pAC->dev[FromPort]);
20046+ netif_carrier_off(pAC->dev[FromPort]);
20047+
20048+ /* Print link change */
20049 if (DoPrintInterfaceChange) {
20050- printk("%s: network connection down\n",
20051- pAC->dev[Param.Para32[1]]->name);
20052+ if (pAC->dev[FromPort]->flags & IFF_RUNNING) {
20053+ printk("%s: network connection down\n",
20054+ pAC->dev[FromPort]->name);
20055+ }
20056 } else {
20057 DoPrintInterfaceChange = SK_TRUE;
20058 }
20059- netif_carrier_off(pAC->dev[Param.Para32[1]]);
20060+ pAC->dev[FromPort]->flags &= ~IFF_RUNNING;
20061 break;
20062- case SK_DRV_SWITCH_HARD: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
20063- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20064- ("PORT SWITCH HARD "));
20065- case SK_DRV_SWITCH_SOFT: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
20066- /* action list 6 */
20067- printk("%s: switching to port %c\n", pAC->dev[0]->name,
20068- 'A'+Param.Para32[1]);
20069- case SK_DRV_SWITCH_INTERN: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
20070+ case SK_DRV_SWITCH_HARD: /* FALL THRU */
20071+ case SK_DRV_SWITCH_SOFT: /* FALL THRU */
20072+ case SK_DRV_SWITCH_INTERN:
20073 FromPort = Param.Para32[0];
20074- ToPort = Param.Para32[1];
20075+ ToPort = Param.Para32[1];
20076+ printk("%s: switching from port %c to port %c\n",
20077+ pAC->dev[0]->name, 'A'+FromPort, 'A'+ToPort);
20078 SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20079 ("PORT SWITCH EVENT, From: %d To: %d (Pref %d) ",
20080 FromPort, ToPort, pAC->Rlmt.Net[0].PrefPort));
20081- NewPara.Para64 = FromPort;
20082- SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara);
20083- NewPara.Para64 = ToPort;
20084- SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara);
20085+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET,
20086+ FromPort, SK_FALSE);
20087+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET,
20088+ ToPort, SK_FALSE);
20089 spin_lock_irqsave(
20090 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20091 Flags);
20092 spin_lock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock);
20093- SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST);
20094- SkGeStopPort(pAC, IoC, ToPort, SK_STOP_ALL, SK_SOFT_RST);
20095+ if (CHIP_ID_YUKON_2(pAC)) {
20096+ SkY2PortStop(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST);
20097+ SkY2PortStop(pAC, IoC, ToPort, SK_STOP_ALL, SK_SOFT_RST);
20098+ }
20099+ else {
20100+ SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST);
20101+ SkGeStopPort(pAC, IoC, ToPort, SK_STOP_ALL, SK_SOFT_RST);
20102+ }
20103 spin_unlock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock);
20104 spin_unlock_irqrestore(
20105 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20106 Flags);
20107
20108- ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE); /* clears rx ring */
20109- ReceiveIrq(pAC, &pAC->RxPort[ToPort], SK_FALSE); /* clears rx ring */
20110
20111- ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]);
20112- ClearTxRing(pAC, &pAC->TxPort[ToPort][TX_PRIO_LOW]);
20113+ if (!CHIP_ID_YUKON_2(pAC)) {
20114+#ifdef CONFIG_SK98LIN_NAPI
20115+ WorkToDo = 1;
20116+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE, &WorkDone, WorkToDo);
20117+ ReceiveIrq(pAC, &pAC->RxPort[ToPort], SK_FALSE, &WorkDone, WorkToDo);
20118+#else
20119+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE); /* clears rx ring */
20120+ ReceiveIrq(pAC, &pAC->RxPort[ToPort], SK_FALSE); /* clears rx ring */
20121+#endif
20122+ ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]);
20123+ ClearTxRing(pAC, &pAC->TxPort[ToPort][TX_PRIO_LOW]);
20124+ }
20125+
20126 spin_lock_irqsave(
20127 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20128 Flags);
20129 spin_lock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock);
20130 pAC->ActivePort = ToPort;
20131-#if 0
20132- SetQueueSizes(pAC);
20133-#else
20134+
20135 /* tschilling: New common function with minimum size check. */
20136 DualNet = SK_FALSE;
20137 if (pAC->RlmtNets == 2) {
20138@@ -4289,74 +5486,316 @@
20139 printk("SkGeInitAssignRamToQueues failed.\n");
20140 break;
20141 }
20142-#endif
20143- /* tschilling: Handling of return values inserted. */
20144- if (SkGeInitPort(pAC, IoC, FromPort) ||
20145- SkGeInitPort(pAC, IoC, ToPort)) {
20146- printk("%s: SkGeInitPort failed.\n", pAC->dev[0]->name);
20147+
20148+ if (!CHIP_ID_YUKON_2(pAC)) {
20149+ /* tschilling: Handling of return values inserted. */
20150+ if (SkGeInitPort(pAC, IoC, FromPort) ||
20151+ SkGeInitPort(pAC, IoC, ToPort)) {
20152+ printk("%s: SkGeInitPort failed.\n", pAC->dev[0]->name);
20153+ }
20154 }
20155- if (Event == SK_DRV_SWITCH_SOFT) {
20156- SkMacRxTxEnable(pAC, IoC, FromPort);
20157+ if (!CHIP_ID_YUKON_2(pAC)) {
20158+ if (Event == SK_DRV_SWITCH_SOFT) {
20159+ SkMacRxTxEnable(pAC, IoC, FromPort);
20160+ }
20161+ SkMacRxTxEnable(pAC, IoC, ToPort);
20162 }
20163- SkMacRxTxEnable(pAC, IoC, ToPort);
20164+
20165 SkAddrSwap(pAC, IoC, FromPort, ToPort);
20166 SkAddrMcUpdate(pAC, IoC, FromPort);
20167 SkAddrMcUpdate(pAC, IoC, ToPort);
20168- PortReInitBmu(pAC, FromPort);
20169- PortReInitBmu(pAC, ToPort);
20170- SkGePollTxD(pAC, IoC, FromPort, SK_TRUE);
20171- SkGePollTxD(pAC, IoC, ToPort, SK_TRUE);
20172- ClearAndStartRx(pAC, FromPort);
20173- ClearAndStartRx(pAC, ToPort);
20174+
20175+#ifdef USE_TIST_FOR_RESET
20176+ if (pAC->GIni.GIYukon2) {
20177+ /* make sure that we do not accept any status LEs from now on */
20178+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
20179+ ("both Ports now waiting for specific Tist\n"));
20180+ SK_SET_WAIT_BIT_FOR_PORT(
20181+ pAC,
20182+ SK_PSTATE_WAITING_FOR_ANY_TIST,
20183+ 0);
20184+ SK_SET_WAIT_BIT_FOR_PORT(
20185+ pAC,
20186+ SK_PSTATE_WAITING_FOR_ANY_TIST,
20187+ 1);
20188+
20189+ /* start tist */
20190+ Y2_ENABLE_TIST(pAC->IoBase);
20191+ }
20192+#endif
20193+ if (!CHIP_ID_YUKON_2(pAC)) {
20194+ PortReInitBmu(pAC, FromPort);
20195+ PortReInitBmu(pAC, ToPort);
20196+ SkGePollTxD(pAC, IoC, FromPort, SK_TRUE);
20197+ SkGePollTxD(pAC, IoC, ToPort, SK_TRUE);
20198+ CLEAR_AND_START_RX(FromPort);
20199+ CLEAR_AND_START_RX(ToPort);
20200+ } else {
20201+ SkY2PortStart(pAC, IoC, FromPort);
20202+ SkY2PortStart(pAC, IoC, ToPort);
20203+#ifdef SK_YUKON2
20204+ /* in yukon-II always port 0 has to be started first */
20205+ // SkY2PortStart(pAC, IoC, 0);
20206+ // SkY2PortStart(pAC, IoC, 1);
20207+#endif
20208+ }
20209 spin_unlock(&pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock);
20210 spin_unlock_irqrestore(
20211 &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20212 Flags);
20213 break;
20214 case SK_DRV_RLMT_SEND: /* SK_MBUF *pMb */
20215- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20216- ("RLS "));
20217+ SK_DBG_MSG(NULL,SK_DBGMOD_DRV,SK_DBGCAT_DRV_EVENT,("RLS "));
20218 pRlmtMbuf = (SK_MBUF*) Param.pParaPtr;
20219 pMsg = (struct sk_buff*) pRlmtMbuf->pOs;
20220 skb_put(pMsg, pRlmtMbuf->Length);
20221- if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW],
20222- pMsg) < 0)
20223+ if (!CHIP_ID_YUKON_2(pAC)) {
20224+ if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW],
20225+ pMsg) < 0) {
20226+ DEV_KFREE_SKB_ANY(pMsg);
20227+ }
20228+ } else {
20229+ if (SkY2RlmtSend(pAC, pRlmtMbuf->PortIdx, pMsg) < 0) {
20230+ DEV_KFREE_SKB_ANY(pMsg);
20231+ }
20232+ }
20233+ break;
20234+ case SK_DRV_TIMER:
20235+ if (Param.Para32[0] == SK_DRV_MODERATION_TIMER) {
20236+ /* check what IRQs are to be moderated */
20237+ SkDimStartModerationTimer(pAC);
20238+ SkDimModerate(pAC);
20239+ } else {
20240+ printk("Expiration of unknown timer\n");
20241+ }
20242+ break;
20243+ case SK_DRV_ADAP_FAIL:
20244+#if (!defined (Y2_RECOVERY) && !defined (Y2_LE_CHECK))
20245+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20246+ ("ADAPTER FAIL EVENT\n"));
20247+ printk("%s: Adapter failed.\n", pAC->dev[0]->name);
20248+ SK_OUT32(pAC->IoBase, B0_IMSK, 0); /* disable interrupts */
20249+ break;
20250+#endif
20251+
20252+#if (defined (Y2_RECOVERY) || defined (Y2_LE_CHECK))
20253+ case SK_DRV_RECOVER:
20254+ spin_lock_irqsave(&pAC->InitLock, InitFlags);
20255+ pNet = (DEV_NET *) pAC->dev[Param.Para32[0]]->priv;
20256+
20257+ /* Recover already in progress */
20258+ if (pNet->InRecover) {
20259+ break;
20260+ }
20261+
20262+ netif_stop_queue(pAC->dev[Param.Para32[0]]); /* stop device if running */
20263+ pNet->InRecover = SK_TRUE;
20264+
20265+ FromPort = Param.Para32[0];
20266+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20267+ ("PORT RESET EVENT, Port: %d ", FromPort));
20268+
20269+ /* Disable interrupts */
20270+ SK_OUT32(pAC->IoBase, B0_IMSK, 0);
20271+ SK_OUT32(pAC->IoBase, B0_HWE_IMSK, 0);
20272+
20273+ SkLocalEventQueue64(pAC, SKGE_PNMI, SK_PNMI_EVT_XMAC_RESET,
20274+ FromPort, SK_FALSE);
20275+ spin_lock_irqsave(
20276+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20277+ Flags);
20278+ if (CHIP_ID_YUKON_2(pAC)) {
20279+ SkY2PortStop(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST);
20280+ } else {
20281+ SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST);
20282+ }
20283+ pAC->dev[Param.Para32[0]]->flags &= ~IFF_RUNNING;
20284+ spin_unlock_irqrestore(
20285+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20286+ Flags);
20287+
20288+ if (!CHIP_ID_YUKON_2(pAC)) {
20289+#ifdef CONFIG_SK98LIN_NAPI
20290+ WorkToDo = 1;
20291+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE, &WorkDone, WorkToDo);
20292+#else
20293+ ReceiveIrq(pAC, &pAC->RxPort[FromPort], SK_FALSE);
20294+#endif
20295+ ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]);
20296+ }
20297+ spin_lock_irqsave(
20298+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20299+ Flags);
20300+
20301+#ifdef USE_TIST_FOR_RESET
20302+ if (pAC->GIni.GIYukon2) {
20303+#if 0
20304+ /* make sure that we do not accept any status LEs from now on */
20305+ Y2_ENABLE_TIST(pAC->IoBase);
20306+
20307+ /* get current timestamp */
20308+ Y2_GET_TIST_LOW_VAL(pAC->IoBase, &pAC->MinTistLo);
20309+ pAC->MinTistHi = pAC->GIni.GITimeStampCnt;
20310+
20311+ SK_SET_WAIT_BIT_FOR_PORT(
20312+ pAC,
20313+ SK_PSTATE_WAITING_FOR_SPECIFIC_TIST,
20314+ FromPort);
20315+#endif
20316+ SK_SET_WAIT_BIT_FOR_PORT(
20317+ pAC,
20318+ SK_PSTATE_WAITING_FOR_ANY_TIST,
20319+ FromPort);
20320+
20321+ /* start tist */
20322+ Y2_ENABLE_TIST(pAC->IoBase);
20323+ }
20324+#endif
20325+
20326+ /* Restart Receive BMU on Yukon-2 */
20327+ if (HW_FEATURE(pAC, HWF_WA_DEV_4167)) {
20328+ SkYuk2RestartRxBmu(pAC, IoC, FromPort);
20329+ }
20330+
20331+#ifdef Y2_LE_CHECK
20332+ /* mark entries invalid */
20333+ pAC->LastPort = 3;
20334+ pAC->LastOpc = 0xFF;
20335+#endif
20336+
20337+#endif
20338+ /* Restart ports but do not initialize PHY. */
20339+ if (CHIP_ID_YUKON_2(pAC)) {
20340+ SkY2PortStart(pAC, IoC, FromPort);
20341+ } else {
20342+ /* tschilling: Handling of return value inserted. */
20343+ if (SkGeInitPort(pAC, IoC, FromPort)) {
20344+ if (FromPort == 0) {
20345+ printk("%s: SkGeInitPort A failed.\n", pAC->dev[0]->name);
20346+ } else {
20347+ printk("%s: SkGeInitPort B failed.\n", pAC->dev[1]->name);
20348+ }
20349+ }
20350+ SkAddrMcUpdate(pAC,IoC, FromPort);
20351+ PortReInitBmu(pAC, FromPort);
20352+ SkGePollTxD(pAC, IoC, FromPort, SK_TRUE);
20353+ CLEAR_AND_START_RX(FromPort);
20354+ }
20355+ spin_unlock_irqrestore(
20356+ &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
20357+ Flags);
20358+
20359+ /* Map any waiting RX buffers to HW */
20360+ FillReceiveTableYukon2(pAC, pAC->IoBase, FromPort);
20361+
20362+ pNet->InRecover = SK_FALSE;
20363+ /* enable Interrupts */
20364+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
20365+ SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK);
20366+ netif_wake_queue(pAC->dev[FromPort]);
20367+ spin_unlock_irqrestore(&pAC->InitLock, InitFlags);
20368+ break;
20369+ default:
20370+ break;
20371+ }
20372+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20373+ ("END EVENT "));
20374+
20375+ return (0);
20376+} /* SkDrvEvent */
20377+
20378+
20379+/******************************************************************************
20380+ *
20381+ * SkLocalEventQueue() - add event to queue
20382+ *
20383+ * Description:
20384+ * This function adds an event to the event queue and run the
20385+ * SkEventDispatcher. At least Init Level 1 is required to queue events,
20386+ * but will be scheduled add Init Level 2.
20387+ *
20388+ * returns:
20389+ * nothing
20390+ */
20391+void SkLocalEventQueue(
20392+SK_AC *pAC, /* Adapters context */
20393+SK_U32 Class, /* Event Class */
20394+SK_U32 Event, /* Event to be queued */
20395+SK_U32 Param1, /* Event parameter 1 */
20396+SK_U32 Param2, /* Event parameter 2 */
20397+SK_BOOL Dispatcher) /* Dispatcher flag:
20398+ * TRUE == Call SkEventDispatcher
20399+ * FALSE == Don't execute SkEventDispatcher
20400+ */
20401+{
20402+ SK_EVPARA EvPara;
20403+ EvPara.Para32[0] = Param1;
20404+ EvPara.Para32[1] = Param2;
20405+
20406+
20407+ if (Class == SKGE_PNMI) {
20408+ SkPnmiEvent( pAC,
20409+ pAC->IoBase,
20410+ Event,
20411+ EvPara);
20412+ } else {
20413+ SkEventQueue( pAC,
20414+ Class,
20415+ Event,
20416+ EvPara);
20417+ }
20418+
20419+ /* Run the dispatcher */
20420+ if (Dispatcher) {
20421+ SkEventDispatcher(pAC, pAC->IoBase);
20422+ }
20423+
20424+}
20425+
20426+/******************************************************************************
20427+ *
20428+ * SkLocalEventQueue64() - add event to queue (64bit version)
20429+ *
20430+ * Description:
20431+ * This function adds an event to the event queue and run the
20432+ * SkEventDispatcher. At least Init Level 1 is required to queue events,
20433+ * but will be scheduled add Init Level 2.
20434+ *
20435+ * returns:
20436+ * nothing
20437+ */
20438+void SkLocalEventQueue64(
20439+SK_AC *pAC, /* Adapters context */
20440+SK_U32 Class, /* Event Class */
20441+SK_U32 Event, /* Event to be queued */
20442+SK_U64 Param, /* Event parameter */
20443+SK_BOOL Dispatcher) /* Dispatcher flag:
20444+ * TRUE == Call SkEventDispatcher
20445+ * FALSE == Don't execute SkEventDispatcher
20446+ */
20447+{
20448+ SK_EVPARA EvPara;
20449+ EvPara.Para64 = Param;
20450+
20451+
20452+ if (Class == SKGE_PNMI) {
20453+ SkPnmiEvent( pAC,
20454+ pAC->IoBase,
20455+ Event,
20456+ EvPara);
20457+ } else {
20458+ SkEventQueue( pAC,
20459+ Class,
20460+ Event,
20461+ EvPara);
20462+ }
20463
20464- DEV_KFREE_SKB_ANY(pMsg);
20465- break;
20466- case SK_DRV_TIMER:
20467- if (Param.Para32[0] == SK_DRV_MODERATION_TIMER) {
20468- /*
20469- ** expiration of the moderation timer implies that
20470- ** dynamic moderation is to be applied
20471- */
20472- SkDimStartModerationTimer(pAC);
20473- SkDimModerate(pAC);
20474- if (pAC->DynIrqModInfo.DisplayStats) {
20475- SkDimDisplayModerationSettings(pAC);
20476- }
20477- } else if (Param.Para32[0] == SK_DRV_RX_CLEANUP_TIMER) {
20478- /*
20479- ** check if we need to check for descriptors which
20480- ** haven't been handled the last millisecs
20481- */
20482- StartDrvCleanupTimer(pAC);
20483- if (pAC->GIni.GIMacsFound == 2) {
20484- ReceiveIrq(pAC, &pAC->RxPort[1], SK_FALSE);
20485- }
20486- ReceiveIrq(pAC, &pAC->RxPort[0], SK_FALSE);
20487- } else {
20488- printk("Expiration of unknown timer\n");
20489- }
20490- break;
20491- default:
20492- break;
20493+ /* Run the dispatcher */
20494+ if (Dispatcher) {
20495+ SkEventDispatcher(pAC, pAC->IoBase);
20496 }
20497- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
20498- ("END EVENT "));
20499-
20500- return (0);
20501-} /* SkDrvEvent */
20502+
20503+}
20504
20505
20506 /*****************************************************************************
20507@@ -4408,8 +5847,6 @@
20508
20509 } /* SkErrorLog */
20510
20511-#ifdef SK_DIAG_SUPPORT
20512-
20513 /*****************************************************************************
20514 *
20515 * SkDrvEnterDiagMode - handles DIAG attach request
20516@@ -4424,8 +5861,11 @@
20517 int SkDrvEnterDiagMode(
20518 SK_AC *pAc) /* pointer to adapter context */
20519 {
20520- DEV_NET *pNet = netdev_priv(pAc->dev[0]);
20521- SK_AC *pAC = pNet->pAC;
20522+ SK_AC *pAC = NULL;
20523+ DEV_NET *pNet = NULL;
20524+
20525+ pNet = (DEV_NET *) pAc->dev[0]->priv;
20526+ pAC = pNet->pAC;
20527
20528 SK_MEMCPY(&(pAc->PnmiBackup), &(pAc->PnmiStruct),
20529 sizeof(SK_PNMI_STRUCT_DATA));
20530@@ -4440,8 +5880,9 @@
20531 } else {
20532 pAC->WasIfUp[0] = SK_FALSE;
20533 }
20534- if (pNet != netdev_priv(pAC->dev[1])) {
20535- pNet = netdev_priv(pAC->dev[1]);
20536+
20537+ if (pNet != (DEV_NET *) pAc->dev[1]->priv) {
20538+ pNet = (DEV_NET *) pAc->dev[1]->priv;
20539 if (netif_running(pAC->dev[1])) {
20540 pAC->WasIfUp[1] = SK_TRUE;
20541 pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
20542@@ -4474,16 +5915,16 @@
20543 sizeof(SK_PNMI_STRUCT_DATA));
20544 pAc->DiagModeActive = DIAG_NOTACTIVE;
20545 pAc->Pnmi.DiagAttached = SK_DIAG_IDLE;
20546- if (pAc->WasIfUp[0] == SK_TRUE) {
20547- pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
20548+ if (pAc->WasIfUp[0] == SK_TRUE) {
20549+ pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
20550 DoPrintInterfaceChange = SK_FALSE;
20551- SkDrvInitAdapter(pAc, 0); /* first device */
20552- }
20553- if (pAc->WasIfUp[1] == SK_TRUE) {
20554- pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
20555+ SkDrvInitAdapter(pAc, 0); /* first device */
20556+ }
20557+ if (pAc->WasIfUp[1] == SK_TRUE) {
20558+ pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
20559 DoPrintInterfaceChange = SK_FALSE;
20560- SkDrvInitAdapter(pAc, 1); /* second device */
20561- }
20562+ SkDrvInitAdapter(pAc, 1); /* second device */
20563+ }
20564 return(0);
20565 }
20566
20567@@ -4563,11 +6004,20 @@
20568
20569 dev = pAC->dev[devNbr];
20570
20571- /* On Linux 2.6 the network driver does NOT mess with reference
20572- ** counts. The driver MUST be able to be unloaded at any time
20573- ** due to the possibility of hotplug.
20574+ /*
20575+ ** Function SkGeClose() uses MOD_DEC_USE_COUNT (2.2/2.4)
20576+ ** or module_put() (2.6) to decrease the number of users for
20577+ ** a device, but if a device is to be put under control of
20578+ ** the DIAG, that count is OK already and does not need to
20579+ ** be adapted! Hence the opposite MOD_INC_USE_COUNT or
20580+ ** try_module_get() needs to be used again to correct that.
20581 */
20582+ if (!try_module_get(THIS_MODULE)) {
20583+ return (-1);
20584+ }
20585+
20586 if (SkGeClose(dev) != 0) {
20587+ module_put(THIS_MODULE);
20588 return (-1);
20589 }
20590 return (0);
20591@@ -4596,6 +6046,17 @@
20592
20593 if (SkGeOpen(dev) != 0) {
20594 return (-1);
20595+ } else {
20596+ /*
20597+ ** Function SkGeOpen() uses MOD_INC_USE_COUNT (2.2/2.4)
20598+ ** or try_module_get() (2.6) to increase the number of
20599+ ** users for a device, but if a device was just under
20600+ ** control of the DIAG, that count is OK already and
20601+ ** does not need to be adapted! Hence the opposite
20602+ ** MOD_DEC_USE_COUNT or module_put() needs to be used
20603+ ** again to correct that.
20604+ */
20605+ module_put(THIS_MODULE);
20606 }
20607
20608 /*
20609@@ -4608,14 +6069,25 @@
20610
20611 } /* SkDrvInitAdapter */
20612
20613-#endif
20614+static int __init sk98lin_init(void)
20615+{
20616+ return pci_module_init(&sk98lin_driver);
20617+}
20618+
20619+static void __exit sk98lin_cleanup(void)
20620+{
20621+ pci_unregister_driver(&sk98lin_driver);
20622+}
20623+
20624+module_init(sk98lin_init);
20625+module_exit(sk98lin_cleanup);
20626+
20627
20628 #ifdef DEBUG
20629 /****************************************************************************/
20630 /* "debug only" section *****************************************************/
20631 /****************************************************************************/
20632
20633-
20634 /*****************************************************************************
20635 *
20636 * DumpMsg - print a frame
20637@@ -4626,9 +6098,11 @@
20638 * Returns: N/A
20639 *
20640 */
20641-static void DumpMsg(struct sk_buff *skb, char *str)
20642+static void DumpMsg(
20643+struct sk_buff *skb, /* linux' socket buffer */
20644+char *str) /* additional msg string */
20645 {
20646- int msglen;
20647+ int msglen = (skb->len > 64) ? 64 : skb->len;
20648
20649 if (skb == NULL) {
20650 printk("DumpMsg(): NULL-Message\n");
20651@@ -4640,19 +6114,14 @@
20652 return;
20653 }
20654
20655- msglen = skb->len;
20656- if (msglen > 64)
20657- msglen = 64;
20658-
20659- printk("--- Begin of message from %s , len %d (from %d) ----\n", str, msglen, skb->len);
20660-
20661+ printk("DumpMsg: PhysPage: %p\n",
20662+ page_address(virt_to_page(skb->data)));
20663+ printk("--- Begin of message from %s , len %d (from %d) ----\n",
20664+ str, msglen, skb->len);
20665 DumpData((char *)skb->data, msglen);
20666-
20667 printk("------- End of message ---------\n");
20668 } /* DumpMsg */
20669
20670-
20671-
20672 /*****************************************************************************
20673 *
20674 * DumpData - print a data area
20675@@ -4664,23 +6133,22 @@
20676 * Returns: N/A
20677 *
20678 */
20679-static void DumpData(char *p, int size)
20680-{
20681-register int i;
20682-int haddr, addr;
20683-char hex_buffer[180];
20684-char asc_buffer[180];
20685-char HEXCHAR[] = "0123456789ABCDEF";
20686-
20687- addr = 0;
20688- haddr = 0;
20689- hex_buffer[0] = 0;
20690- asc_buffer[0] = 0;
20691+static void DumpData(
20692+char *p, /* pointer to area containing the data */
20693+int size) /* the size of that data area in bytes */
20694+{
20695+ register int i;
20696+ int haddr = 0, addr = 0;
20697+ char hex_buffer[180] = { '\0' };
20698+ char asc_buffer[180] = { '\0' };
20699+ char HEXCHAR[] = "0123456789ABCDEF";
20700+
20701 for (i=0; i < size; ) {
20702- if (*p >= '0' && *p <='z')
20703+ if (*p >= '0' && *p <='z') {
20704 asc_buffer[addr] = *p;
20705- else
20706+ } else {
20707 asc_buffer[addr] = '.';
20708+ }
20709 addr++;
20710 asc_buffer[addr] = 0;
20711 hex_buffer[haddr] = HEXCHAR[(*p & 0xf0) >> 4];
20712@@ -4706,27 +6174,24 @@
20713 * DumpLong - print a data area as long values
20714 *
20715 * Description:
20716- * This function prints a area of data to the system logfile/to the
20717+ * This function prints a long variable to the system logfile/to the
20718 * console.
20719 *
20720 * Returns: N/A
20721 *
20722 */
20723-static void DumpLong(char *pc, int size)
20724-{
20725-register int i;
20726-int haddr, addr;
20727-char hex_buffer[180];
20728-char asc_buffer[180];
20729-char HEXCHAR[] = "0123456789ABCDEF";
20730-long *p;
20731-int l;
20732-
20733- addr = 0;
20734- haddr = 0;
20735- hex_buffer[0] = 0;
20736- asc_buffer[0] = 0;
20737- p = (long*) pc;
20738+static void DumpLong(
20739+char *pc, /* location of the variable to print */
20740+int size) /* how large is the variable? */
20741+{
20742+ register int i;
20743+ int haddr = 0, addr = 0;
20744+ char hex_buffer[180] = { '\0' };
20745+ char asc_buffer[180] = { '\0' };
20746+ char HEXCHAR[] = "0123456789ABCDEF";
20747+ long *p = (long*) pc;
20748+ int l;
20749+
20750 for (i=0; i < size; ) {
20751 l = (long) *p;
20752 hex_buffer[haddr] = HEXCHAR[(l >> 28) & 0xf];
20753@@ -4760,386 +6225,9 @@
20754
20755 #endif
20756
20757-static int __devinit skge_probe_one(struct pci_dev *pdev,
20758- const struct pci_device_id *ent)
20759-{
20760- SK_AC *pAC;
20761- DEV_NET *pNet = NULL;
20762- struct net_device *dev = NULL;
20763- static int boards_found = 0;
20764- int error = -ENODEV;
20765- int using_dac = 0;
20766- char DeviceStr[80];
20767-
20768- if (pci_enable_device(pdev))
20769- goto out;
20770-
20771- /* Configure DMA attributes. */
20772- if (sizeof(dma_addr_t) > sizeof(u32) &&
20773- !(error = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
20774- using_dac = 1;
20775- error = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
20776- if (error < 0) {
20777- printk(KERN_ERR "sk98lin %s unable to obtain 64 bit DMA "
20778- "for consistent allocations\n", pci_name(pdev));
20779- goto out_disable_device;
20780- }
20781- } else {
20782- error = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
20783- if (error) {
20784- printk(KERN_ERR "sk98lin %s no usable DMA configuration\n",
20785- pci_name(pdev));
20786- goto out_disable_device;
20787- }
20788- }
20789-
20790- error = -ENOMEM;
20791- dev = alloc_etherdev(sizeof(DEV_NET));
20792- if (!dev) {
20793- printk(KERN_ERR "sk98lin: unable to allocate etherdev "
20794- "structure!\n");
20795- goto out_disable_device;
20796- }
20797-
20798- pNet = netdev_priv(dev);
20799- pNet->pAC = kzalloc(sizeof(SK_AC), GFP_KERNEL);
20800- if (!pNet->pAC) {
20801- printk(KERN_ERR "sk98lin: unable to allocate adapter "
20802- "structure!\n");
20803- goto out_free_netdev;
20804- }
20805-
20806- pAC = pNet->pAC;
20807- pAC->PciDev = pdev;
20808-
20809- pAC->dev[0] = dev;
20810- pAC->dev[1] = dev;
20811- pAC->CheckQueue = SK_FALSE;
20812-
20813- dev->irq = pdev->irq;
20814-
20815- error = SkGeInitPCI(pAC);
20816- if (error) {
20817- printk(KERN_ERR "sk98lin: PCI setup failed: %i\n", error);
20818- goto out_free_netdev;
20819- }
20820-
20821- SET_MODULE_OWNER(dev);
20822- dev->open = &SkGeOpen;
20823- dev->stop = &SkGeClose;
20824- dev->hard_start_xmit = &SkGeXmit;
20825- dev->get_stats = &SkGeStats;
20826- dev->set_multicast_list = &SkGeSetRxMode;
20827- dev->set_mac_address = &SkGeSetMacAddr;
20828- dev->do_ioctl = &SkGeIoctl;
20829- dev->change_mtu = &SkGeChangeMtu;
20830-#ifdef CONFIG_NET_POLL_CONTROLLER
20831- dev->poll_controller = &SkGePollController;
20832-#endif
20833- SET_NETDEV_DEV(dev, &pdev->dev);
20834- SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
20835-
20836- /* Use only if yukon hardware */
20837- if (pAC->ChipsetType) {
20838-#ifdef USE_SK_TX_CHECKSUM
20839- dev->features |= NETIF_F_IP_CSUM;
20840-#endif
20841-#ifdef SK_ZEROCOPY
20842- dev->features |= NETIF_F_SG;
20843-#endif
20844-#ifdef USE_SK_RX_CHECKSUM
20845- pAC->RxPort[0].RxCsum = 1;
20846-#endif
20847- }
20848-
20849- if (using_dac)
20850- dev->features |= NETIF_F_HIGHDMA;
20851-
20852- pAC->Index = boards_found++;
20853-
20854- error = SkGeBoardInit(dev, pAC);
20855- if (error)
20856- goto out_free_netdev;
20857-
20858- /* Read Adapter name from VPD */
20859- if (ProductStr(pAC, DeviceStr, sizeof(DeviceStr)) != 0) {
20860- error = -EIO;
20861- printk(KERN_ERR "sk98lin: Could not read VPD data.\n");
20862- goto out_free_resources;
20863- }
20864-
20865- /* Register net device */
20866- error = register_netdev(dev);
20867- if (error) {
20868- printk(KERN_ERR "sk98lin: Could not register device.\n");
20869- goto out_free_resources;
20870- }
20871-
20872- /* Print adapter specific string from vpd */
20873- printk("%s: %s\n", dev->name, DeviceStr);
20874-
20875- /* Print configuration settings */
20876- printk(" PrefPort:%c RlmtMode:%s\n",
20877- 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber,
20878- (pAC->RlmtMode==0) ? "Check Link State" :
20879- ((pAC->RlmtMode==1) ? "Check Link State" :
20880- ((pAC->RlmtMode==3) ? "Check Local Port" :
20881- ((pAC->RlmtMode==7) ? "Check Segmentation" :
20882- ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error")))));
20883-
20884- SkGeYellowLED(pAC, pAC->IoBase, 1);
20885-
20886- memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6);
20887- memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
20888-
20889- pNet->PortNr = 0;
20890- pNet->NetNr = 0;
20891-
20892- boards_found++;
20893-
20894- pci_set_drvdata(pdev, dev);
20895-
20896- /* More then one port found */
20897- if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
20898- dev = alloc_etherdev(sizeof(DEV_NET));
20899- if (!dev) {
20900- printk(KERN_ERR "sk98lin: unable to allocate etherdev "
20901- "structure!\n");
20902- goto single_port;
20903- }
20904-
20905- pNet = netdev_priv(dev);
20906- pNet->PortNr = 1;
20907- pNet->NetNr = 1;
20908- pNet->pAC = pAC;
20909-
20910- dev->open = &SkGeOpen;
20911- dev->stop = &SkGeClose;
20912- dev->hard_start_xmit = &SkGeXmit;
20913- dev->get_stats = &SkGeStats;
20914- dev->set_multicast_list = &SkGeSetRxMode;
20915- dev->set_mac_address = &SkGeSetMacAddr;
20916- dev->do_ioctl = &SkGeIoctl;
20917- dev->change_mtu = &SkGeChangeMtu;
20918- SET_NETDEV_DEV(dev, &pdev->dev);
20919- SET_ETHTOOL_OPS(dev, &SkGeEthtoolOps);
20920-
20921- if (pAC->ChipsetType) {
20922-#ifdef USE_SK_TX_CHECKSUM
20923- dev->features |= NETIF_F_IP_CSUM;
20924-#endif
20925-#ifdef SK_ZEROCOPY
20926- dev->features |= NETIF_F_SG;
20927-#endif
20928-#ifdef USE_SK_RX_CHECKSUM
20929- pAC->RxPort[1].RxCsum = 1;
20930-#endif
20931- }
20932-
20933- if (using_dac)
20934- dev->features |= NETIF_F_HIGHDMA;
20935-
20936- error = register_netdev(dev);
20937- if (error) {
20938- printk(KERN_ERR "sk98lin: Could not register device"
20939- " for second port. (%d)\n", error);
20940- free_netdev(dev);
20941- goto single_port;
20942- }
20943-
20944- pAC->dev[1] = dev;
20945- memcpy(&dev->dev_addr,
20946- &pAC->Addr.Net[1].CurrentMacAddress, 6);
20947- memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
20948-
20949- printk("%s: %s\n", dev->name, DeviceStr);
20950- printk(" PrefPort:B RlmtMode:Dual Check Link State\n");
20951- }
20952-
20953-single_port:
20954-
20955- /* Save the hardware revision */
20956- pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) +
20957- (pAC->GIni.GIPciHwRev & 0x0F);
20958-
20959- /* Set driver globals */
20960- pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME;
20961- pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE;
20962-
20963- memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA));
20964- memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA));
20965-
20966- return 0;
20967-
20968- out_free_resources:
20969- FreeResources(dev);
20970- out_free_netdev:
20971- free_netdev(dev);
20972- out_disable_device:
20973- pci_disable_device(pdev);
20974- out:
20975- return error;
20976-}
20977-
20978-static void __devexit skge_remove_one(struct pci_dev *pdev)
20979-{
20980- struct net_device *dev = pci_get_drvdata(pdev);
20981- DEV_NET *pNet = netdev_priv(dev);
20982- SK_AC *pAC = pNet->pAC;
20983- struct net_device *otherdev = pAC->dev[1];
20984-
20985- unregister_netdev(dev);
20986-
20987- SkGeYellowLED(pAC, pAC->IoBase, 0);
20988-
20989- if (pAC->BoardLevel == SK_INIT_RUN) {
20990- SK_EVPARA EvPara;
20991- unsigned long Flags;
20992-
20993- /* board is still alive */
20994- spin_lock_irqsave(&pAC->SlowPathLock, Flags);
20995- EvPara.Para32[0] = 0;
20996- EvPara.Para32[1] = -1;
20997- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
20998- EvPara.Para32[0] = 1;
20999- EvPara.Para32[1] = -1;
21000- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
21001- SkEventDispatcher(pAC, pAC->IoBase);
21002- /* disable interrupts */
21003- SK_OUT32(pAC->IoBase, B0_IMSK, 0);
21004- SkGeDeInit(pAC, pAC->IoBase);
21005- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
21006- pAC->BoardLevel = SK_INIT_DATA;
21007- /* We do NOT check here, if IRQ was pending, of course*/
21008- }
21009-
21010- if (pAC->BoardLevel == SK_INIT_IO) {
21011- /* board is still alive */
21012- SkGeDeInit(pAC, pAC->IoBase);
21013- pAC->BoardLevel = SK_INIT_DATA;
21014- }
21015-
21016- FreeResources(dev);
21017- free_netdev(dev);
21018- if (otherdev != dev)
21019- free_netdev(otherdev);
21020- kfree(pAC);
21021-}
21022-
21023-#ifdef CONFIG_PM
21024-static int skge_suspend(struct pci_dev *pdev, pm_message_t state)
21025-{
21026- struct net_device *dev = pci_get_drvdata(pdev);
21027- DEV_NET *pNet = netdev_priv(dev);
21028- SK_AC *pAC = pNet->pAC;
21029- struct net_device *otherdev = pAC->dev[1];
21030-
21031- if (netif_running(dev)) {
21032- netif_carrier_off(dev);
21033- DoPrintInterfaceChange = SK_FALSE;
21034- SkDrvDeInitAdapter(pAC, 0); /* performs SkGeClose */
21035- netif_device_detach(dev);
21036- }
21037- if (otherdev != dev) {
21038- if (netif_running(otherdev)) {
21039- netif_carrier_off(otherdev);
21040- DoPrintInterfaceChange = SK_FALSE;
21041- SkDrvDeInitAdapter(pAC, 1); /* performs SkGeClose */
21042- netif_device_detach(otherdev);
21043- }
21044- }
21045-
21046- pci_save_state(pdev);
21047- pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
21048- if (pAC->AllocFlag & SK_ALLOC_IRQ) {
21049- free_irq(dev->irq, dev);
21050- }
21051- pci_disable_device(pdev);
21052- pci_set_power_state(pdev, pci_choose_state(pdev, state));
21053-
21054- return 0;
21055-}
21056-
21057-static int skge_resume(struct pci_dev *pdev)
21058-{
21059- struct net_device *dev = pci_get_drvdata(pdev);
21060- DEV_NET *pNet = netdev_priv(dev);
21061- SK_AC *pAC = pNet->pAC;
21062- struct net_device *otherdev = pAC->dev[1];
21063- int ret;
21064-
21065- pci_set_power_state(pdev, PCI_D0);
21066- pci_restore_state(pdev);
21067- pci_enable_device(pdev);
21068- pci_set_master(pdev);
21069- if (pAC->GIni.GIMacsFound == 2)
21070- ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, "sk98lin", dev);
21071- else
21072- ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ, "sk98lin", dev);
21073- if (ret) {
21074- printk(KERN_WARNING "sk98lin: unable to acquire IRQ %d\n", dev->irq);
21075- pAC->AllocFlag &= ~SK_ALLOC_IRQ;
21076- dev->irq = 0;
21077- pci_disable_device(pdev);
21078- return -EBUSY;
21079- }
21080-
21081- netif_device_attach(dev);
21082- if (netif_running(dev)) {
21083- DoPrintInterfaceChange = SK_FALSE;
21084- SkDrvInitAdapter(pAC, 0); /* first device */
21085- }
21086- if (otherdev != dev) {
21087- netif_device_attach(otherdev);
21088- if (netif_running(otherdev)) {
21089- DoPrintInterfaceChange = SK_FALSE;
21090- SkDrvInitAdapter(pAC, 1); /* second device */
21091- }
21092- }
21093-
21094- return 0;
21095-}
21096-#else
21097-#define skge_suspend NULL
21098-#define skge_resume NULL
21099-#endif
21100-
21101-static struct pci_device_id skge_pci_tbl[] = {
21102- { PCI_VENDOR_ID_3COM, 0x1700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21103- { PCI_VENDOR_ID_3COM, 0x80eb, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21104- { PCI_VENDOR_ID_SYSKONNECT, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21105- { PCI_VENDOR_ID_SYSKONNECT, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21106-/* DLink card does not have valid VPD so this driver gags
21107- * { PCI_VENDOR_ID_DLINK, 0x4c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21108- */
21109- { PCI_VENDOR_ID_MARVELL, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21110- { PCI_VENDOR_ID_MARVELL, 0x5005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21111- { PCI_VENDOR_ID_CNET, 0x434e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21112- { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0015, },
21113- { PCI_VENDOR_ID_LINKSYS, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
21114- { 0 }
21115-};
21116-
21117-MODULE_DEVICE_TABLE(pci, skge_pci_tbl);
21118-
21119-static struct pci_driver skge_driver = {
21120- .name = "sk98lin",
21121- .id_table = skge_pci_tbl,
21122- .probe = skge_probe_one,
21123- .remove = __devexit_p(skge_remove_one),
21124- .suspend = skge_suspend,
21125- .resume = skge_resume,
21126-};
21127-
21128-static int __init skge_init(void)
21129-{
21130- return pci_module_init(&skge_driver);
21131-}
21132-
21133-static void __exit skge_exit(void)
21134-{
21135- pci_unregister_driver(&skge_driver);
21136-}
21137+/*******************************************************************************
21138+ *
21139+ * End of file
21140+ *
21141+ ******************************************************************************/
21142
21143-module_init(skge_init);
21144-module_exit(skge_exit);
21145diff -ruN linux/drivers/net/sk98lin/skgehwt.c linux-new/drivers/net/sk98lin/skgehwt.c
21146--- linux/drivers/net/sk98lin/skgehwt.c 2006-04-11 19:19:28.000000000 +0200
21147+++ linux-new/drivers/net/sk98lin/skgehwt.c 2006-01-18 14:37:24.000000000 +0100
21148@@ -2,8 +2,8 @@
21149 *
21150 * Name: skgehwt.c
21151 * Project: Gigabit Ethernet Adapters, Event Scheduler Module
21152- * Version: $Revision$
21153- * Date: $Date$
21154+ * Version: $Revision$
21155+ * Date: $Date$
21156 * Purpose: Hardware Timer
21157 *
21158 ******************************************************************************/
21159@@ -11,7 +11,7 @@
21160 /******************************************************************************
21161 *
21162 * (C)Copyright 1998-2002 SysKonnect GmbH.
21163- * (C)Copyright 2002-2003 Marvell.
21164+ * (C)Copyright 2002-2004 Marvell.
21165 *
21166 * This program is free software; you can redistribute it and/or modify
21167 * it under the terms of the GNU General Public License as published by
21168@@ -27,7 +27,7 @@
21169 */
21170 #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
21171 static const char SysKonnectFileId[] =
21172- "@(#) $Id$ (C) Marvell.";
21173+ "@(#) $Id$ (C) Marvell.";
21174 #endif
21175
21176 #include "h/skdrv1st.h" /* Driver Specific Definitions */
21177@@ -44,10 +44,10 @@
21178 /*
21179 * Prototypes of local functions.
21180 */
21181-#define SK_HWT_MAX (65000)
21182+#define SK_HWT_MAX 65000UL * 160 /* ca. 10 sec. */
21183
21184 /* correction factor */
21185-#define SK_HWT_FAC (1000 * (SK_U32)pAC->GIni.GIHstClkFact / 100)
21186+#define SK_HWT_FAC (10 * (SK_U32)pAC->GIni.GIHstClkFact / 16)
21187
21188 /*
21189 * Initialize hardware timer.
21190@@ -73,29 +73,21 @@
21191 void SkHwtStart(
21192 SK_AC *pAC, /* Adapters context */
21193 SK_IOC Ioc, /* IoContext */
21194-SK_U32 Time) /* Time in units of 16us to load the timer with. */
21195+SK_U32 Time) /* Time in usec to load the timer */
21196 {
21197- SK_U32 Cnt;
21198-
21199 if (Time > SK_HWT_MAX)
21200 Time = SK_HWT_MAX;
21201
21202 pAC->Hwt.TStart = Time;
21203 pAC->Hwt.TStop = 0L;
21204
21205- Cnt = Time;
21206-
21207- /*
21208- * if time < 16 us
21209- * time = 16 us
21210- */
21211- if (!Cnt) {
21212- Cnt++;
21213+ if (!Time) {
21214+ Time = 1L;
21215 }
21216
21217- SK_OUT32(Ioc, B2_TI_INI, Cnt * SK_HWT_FAC);
21218-
21219- SK_OUT16(Ioc, B2_TI_CTRL, TIM_START); /* Start timer. */
21220+ SK_OUT32(Ioc, B2_TI_INI, Time * SK_HWT_FAC);
21221+
21222+ SK_OUT16(Ioc, B2_TI_CTRL, TIM_START); /* Start timer */
21223
21224 pAC->Hwt.TActive = SK_TRUE;
21225 }
21226@@ -109,13 +101,12 @@
21227 SK_IOC Ioc) /* IoContext */
21228 {
21229 SK_OUT16(Ioc, B2_TI_CTRL, TIM_STOP);
21230-
21231+
21232 SK_OUT16(Ioc, B2_TI_CTRL, TIM_CLR_IRQ);
21233
21234 pAC->Hwt.TActive = SK_FALSE;
21235 }
21236
21237-
21238 /*
21239 * Stop hardware timer and read time elapsed since last start.
21240 *
21241@@ -129,6 +120,9 @@
21242 {
21243 SK_U32 TRead;
21244 SK_U32 IStatus;
21245+ SK_U32 TimerInt;
21246+
21247+ TimerInt = CHIP_ID_YUKON_2(pAC) ? Y2_IS_TIMINT : IS_TIMINT;
21248
21249 if (pAC->Hwt.TActive) {
21250
21251@@ -139,15 +133,15 @@
21252
21253 SK_IN32(Ioc, B0_ISRC, &IStatus);
21254
21255- /* Check if timer expired (or wraped around) */
21256- if ((TRead > pAC->Hwt.TStart) || (IStatus & IS_TIMINT)) {
21257-
21258+ /* Check if timer expired (or wrapped around) */
21259+ if ((TRead > pAC->Hwt.TStart) || ((IStatus & TimerInt) != 0)) {
21260+
21261 SkHwtStop(pAC, Ioc);
21262-
21263+
21264 pAC->Hwt.TStop = pAC->Hwt.TStart;
21265 }
21266 else {
21267-
21268+
21269 pAC->Hwt.TStop = pAC->Hwt.TStart - TRead;
21270 }
21271 }
21272@@ -162,9 +156,9 @@
21273 SK_IOC Ioc) /* IoContext */
21274 {
21275 SkHwtStop(pAC, Ioc);
21276-
21277+
21278 pAC->Hwt.TStop = pAC->Hwt.TStart;
21279-
21280+
21281 SkTimerDone(pAC, Ioc);
21282 }
21283
21284diff -ruN linux/drivers/net/sk98lin/skgeinit.c linux-new/drivers/net/sk98lin/skgeinit.c
21285--- linux/drivers/net/sk98lin/skgeinit.c 2006-04-11 19:19:28.000000000 +0200
21286+++ linux-new/drivers/net/sk98lin/skgeinit.c 2006-01-18 14:37:24.000000000 +0100
21287@@ -2,23 +2,24 @@
21288 *
21289 * Name: skgeinit.c
21290 * Project: Gigabit Ethernet Adapters, Common Modules
21291- * Version: $Revision$
21292- * Date: $Date$
21293+ * Version: $Revision$
21294+ * Date: $Date$
21295 * Purpose: Contains functions to initialize the adapter
21296 *
21297 ******************************************************************************/
21298
21299 /******************************************************************************
21300 *
21301+ * LICENSE:
21302 * (C)Copyright 1998-2002 SysKonnect.
21303- * (C)Copyright 2002-2003 Marvell.
21304+ * (C)Copyright 2002-2005 Marvell.
21305 *
21306 * This program is free software; you can redistribute it and/or modify
21307 * it under the terms of the GNU General Public License as published by
21308 * the Free Software Foundation; either version 2 of the License, or
21309 * (at your option) any later version.
21310- *
21311 * The information in this file is provided "AS IS" without warranty.
21312+ * /LICENSE
21313 *
21314 ******************************************************************************/
21315
21316@@ -31,7 +32,7 @@
21317
21318 #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
21319 static const char SysKonnectFileId[] =
21320- "@(#) $Id$ (C) Marvell.";
21321+ "@(#) $Id$ (C) Marvell.";
21322 #endif
21323
21324 struct s_QOffTab {
21325@@ -39,6 +40,7 @@
21326 int XsQOff; /* Sync Tx Queue Address Offset */
21327 int XaQOff; /* Async Tx Queue Address Offset */
21328 };
21329+
21330 static struct s_QOffTab QOffTab[] = {
21331 {Q_R1, Q_XS1, Q_XA1}, {Q_R2, Q_XS2, Q_XA2}
21332 };
21333@@ -57,6 +59,97 @@
21334 #endif
21335 };
21336
21337+#ifndef SK_SLIM
21338+/******************************************************************************
21339+ *
21340+ * SkGePortVlan() - Enable / Disable VLAN support
21341+ *
21342+ * Description:
21343+ * Enable or disable the VLAN support of the selected port.
21344+ * The new configuration is *not* saved over any SkGeStopPort() and
21345+ * SkGeInitPort() calls.
21346+ * Currently this function is only supported on Yukon-2/EC adapters.
21347+ *
21348+ * Returns:
21349+ * nothing
21350+ */
21351+void SkGePortVlan(
21352+SK_AC *pAC, /* Adapter Context */
21353+SK_IOC IoC, /* I/O Context */
21354+int Port, /* Port number */
21355+SK_BOOL Enable) /* Flag */
21356+{
21357+ SK_U32 RxCtrl;
21358+ SK_U32 TxCtrl;
21359+
21360+ if (CHIP_ID_YUKON_2(pAC)) {
21361+ if (Enable) {
21362+ RxCtrl = RX_VLAN_STRIP_ON;
21363+ TxCtrl = TX_VLAN_TAG_ON;
21364+ }
21365+ else {
21366+ RxCtrl = RX_VLAN_STRIP_OFF;
21367+ TxCtrl = TX_VLAN_TAG_OFF;
21368+ }
21369+
21370+ SK_OUT32(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), RxCtrl);
21371+ SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), TxCtrl);
21372+ }
21373+} /* SkGePortVlan */
21374+
21375+
21376+/******************************************************************************
21377+ *
21378+ * SkGeRxRss() - Enable / Disable RSS Hash Calculation
21379+ *
21380+ * Description:
21381+ * Enable or disable the RSS hash calculation of the selected port.
21382+ * The new configuration is *not* saved over any SkGeStopPort() and
21383+ * SkGeInitPort() calls.
21384+ * Currently this function is only supported on Yukon-2/EC adapters.
21385+ *
21386+ * Returns:
21387+ * nothing
21388+ */
21389+void SkGeRxRss(
21390+SK_AC *pAC, /* Adapter Context */
21391+SK_IOC IoC, /* I/O Context */
21392+int Port, /* Port number */
21393+SK_BOOL Enable) /* Flag */
21394+{
21395+ if (CHIP_ID_YUKON_2(pAC)) {
21396+ SK_OUT32(IoC, Q_ADDR(pAC->GIni.GP[Port].PRxQOff, Q_CSR),
21397+ Enable ? BMU_ENA_RX_RSS_HASH : BMU_DIS_RX_RSS_HASH);
21398+ }
21399+} /* SkGeRxRss */
21400+
21401+
21402+/******************************************************************************
21403+ *
21404+ * SkGeRxCsum() - Enable / Disable Receive Checksum
21405+ *
21406+ * Description:
21407+ * Enable or disable the checksum of the selected port.
21408+ * The new configuration is *not* saved over any SkGeStopPort() and
21409+ * SkGeInitPort() calls.
21410+ * Currently this function is only supported on Yukon-2/EC adapters.
21411+ *
21412+ * Returns:
21413+ * nothing
21414+ */
21415+void SkGeRxCsum(
21416+SK_AC *pAC, /* Adapter Context */
21417+SK_IOC IoC, /* I/O Context */
21418+int Port, /* Port number */
21419+SK_BOOL Enable) /* Flag */
21420+{
21421+ if (CHIP_ID_YUKON_2(pAC)) {
21422+ SK_OUT32(IoC, Q_ADDR(pAC->GIni.GP[Port].PRxQOff, Q_CSR),
21423+ Enable ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
21424+ }
21425+} /* SkGeRxCsum */
21426+#endif /* !SK_SLIM */
21427+
21428 /******************************************************************************
21429 *
21430 * SkGePollRxD() - Enable / Disable Descriptor Polling of RxD Ring
21431@@ -71,8 +164,8 @@
21432 * nothing
21433 */
21434 void SkGePollRxD(
21435-SK_AC *pAC, /* adapter context */
21436-SK_IOC IoC, /* IO context */
21437+SK_AC *pAC, /* Adapter Context */
21438+SK_IOC IoC, /* I/O Context */
21439 int Port, /* Port Index (MAC_1 + n) */
21440 SK_BOOL PollRxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */
21441 {
21442@@ -80,8 +173,8 @@
21443
21444 pPrt = &pAC->GIni.GP[Port];
21445
21446- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (PollRxD) ?
21447- CSR_ENA_POL : CSR_DIS_POL);
21448+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (SK_U32)((PollRxD) ?
21449+ CSR_ENA_POL : CSR_DIS_POL));
21450 } /* SkGePollRxD */
21451
21452
21453@@ -99,8 +192,8 @@
21454 * nothing
21455 */
21456 void SkGePollTxD(
21457-SK_AC *pAC, /* adapter context */
21458-SK_IOC IoC, /* IO context */
21459+SK_AC *pAC, /* Adapter Context */
21460+SK_IOC IoC, /* I/O Context */
21461 int Port, /* Port Index (MAC_1 + n) */
21462 SK_BOOL PollTxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */
21463 {
21464@@ -114,13 +207,13 @@
21465 if (pPrt->PXSQSize != 0) {
21466 SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), DWord);
21467 }
21468-
21469+
21470 if (pPrt->PXAQSize != 0) {
21471 SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), DWord);
21472 }
21473 } /* SkGePollTxD */
21474
21475-
21476+#ifndef SK_SLIM
21477 /******************************************************************************
21478 *
21479 * SkGeYellowLED() - Switch the yellow LED on or off.
21480@@ -135,20 +228,30 @@
21481 * nothing
21482 */
21483 void SkGeYellowLED(
21484-SK_AC *pAC, /* adapter context */
21485-SK_IOC IoC, /* IO context */
21486+SK_AC *pAC, /* Adapter Context */
21487+SK_IOC IoC, /* I/O Context */
21488 int State) /* yellow LED state, 0 = OFF, 0 != ON */
21489 {
21490+ int LedReg;
21491+
21492+ if (CHIP_ID_YUKON_2(pAC)) {
21493+ /* different mapping on Yukon-2 */
21494+ LedReg = B0_CTST + 1;
21495+ }
21496+ else {
21497+ LedReg = B0_LED;
21498+ }
21499+
21500 if (State == 0) {
21501- /* Switch yellow LED OFF */
21502- SK_OUT8(IoC, B0_LED, LED_STAT_OFF);
21503+ /* Switch state LED OFF */
21504+ SK_OUT8(IoC, LedReg, LED_STAT_OFF);
21505 }
21506 else {
21507- /* Switch yellow LED ON */
21508- SK_OUT8(IoC, B0_LED, LED_STAT_ON);
21509+ /* Switch state LED ON */
21510+ SK_OUT8(IoC, LedReg, LED_STAT_ON);
21511 }
21512 } /* SkGeYellowLED */
21513-
21514+#endif /* !SK_SLIM */
21515
21516 #if (!defined(SK_SLIM) || defined(GENESIS))
21517 /******************************************************************************
21518@@ -169,8 +272,8 @@
21519 * nothing
21520 */
21521 void SkGeXmitLED(
21522-SK_AC *pAC, /* adapter context */
21523-SK_IOC IoC, /* IO context */
21524+SK_AC *pAC, /* Adapter Context */
21525+SK_IOC IoC, /* I/O Context */
21526 int Led, /* offset to the LED Init Value register */
21527 int Mode) /* Mode may be SK_LED_DIS, SK_LED_ENA, SK_LED_TST */
21528 {
21529@@ -195,18 +298,17 @@
21530 */
21531 SK_OUT32(IoC, Led + XMIT_LED_CNT, 0);
21532 SK_OUT8(IoC, Led + XMIT_LED_TST, LED_T_OFF);
21533- break;
21534 }
21535-
21536+
21537 /*
21538- * 1000BT: The Transmit LED is driven by the PHY.
21539+ * 1000BT: the Transmit LED is driven by the PHY.
21540 * But the default LED configuration is used for
21541 * Level One and Broadcom PHYs.
21542- * (Broadcom: It may be that PHY_B_PEC_EN_LTR has to be set.)
21543- * (In this case it has to be added here. But we will see. XXX)
21544+ * (Broadcom: It may be that PHY_B_PEC_EN_LTR has to be set.
21545+ * In this case it has to be added here.)
21546 */
21547 } /* SkGeXmitLED */
21548-#endif /* !SK_SLIM || GENESIS */
21549+#endif /* !SK_SLIM || GENESIS */
21550
21551
21552 /******************************************************************************
21553@@ -227,7 +329,7 @@
21554 * 1: configuration error
21555 */
21556 static int DoCalcAddr(
21557-SK_AC *pAC, /* adapter context */
21558+SK_AC *pAC, /* Adapter Context */
21559 SK_GEPORT SK_FAR *pPrt, /* port index */
21560 int QuSize, /* size of the queue to configure in kB */
21561 SK_U32 SK_FAR *StartVal, /* start value for address calculation */
21562@@ -264,12 +366,35 @@
21563
21564 /******************************************************************************
21565 *
21566+ * SkGeRoundQueueSize() - Round the given queue size to the adpaters QZ units
21567+ *
21568+ * Description:
21569+ * This function rounds the given queue size in kBs to adapter specific
21570+ * queue size units (Genesis and Yukon: 8 kB, Yukon-2/EC: 1 kB).
21571+ *
21572+ * Returns:
21573+ * the rounded queue size in kB
21574+ */
21575+static int SkGeRoundQueueSize(
21576+SK_AC *pAC, /* Adapter Context */
21577+int QueueSizeKB) /* Queue size in kB */
21578+{
21579+ int QueueSizeSteps;
21580+
21581+ QueueSizeSteps = (CHIP_ID_YUKON_2(pAC)) ? QZ_STEP_Y2 : QZ_STEP;
21582+
21583+ return((QueueSizeKB + QueueSizeSteps - 1) & ~(QueueSizeSteps - 1));
21584+} /* SkGeRoundQueueSize */
21585+
21586+
21587+/******************************************************************************
21588+ *
21589 * SkGeInitAssignRamToQueues() - allocate default queue sizes
21590 *
21591 * Description:
21592 * This function assigns the memory to the different queues and ports.
21593 * When DualNet is set to SK_TRUE all ports get the same amount of memory.
21594- * Otherwise the first port gets most of the memory and all the
21595+ * Otherwise the first port gets most of the memory and all the
21596 * other ports just the required minimum.
21597 * This function can only be called when pAC->GIni.GIRamSize and
21598 * pAC->GIni.GIMacsFound have been initialized, usually this happens
21599@@ -282,102 +407,146 @@
21600 */
21601
21602 int SkGeInitAssignRamToQueues(
21603-SK_AC *pAC, /* Adapter context */
21604+SK_AC *pAC, /* Adapter Context */
21605 int ActivePort, /* Active Port in RLMT mode */
21606-SK_BOOL DualNet) /* adapter context */
21607+SK_BOOL DualNet) /* Dual Net active */
21608 {
21609 int i;
21610 int UsedKilobytes; /* memory already assigned */
21611 int ActivePortKilobytes; /* memory available for active port */
21612- SK_GEPORT *pGePort;
21613-
21614- UsedKilobytes = 0;
21615+ int MinQueueSize; /* min. memory for queues */
21616+ int TotalRamSize; /* total memory for queues */
21617+ SK_BOOL DualPortYukon2;
21618+ SK_GEPORT *pPrt;
21619
21620 if (ActivePort >= pAC->GIni.GIMacsFound) {
21621+
21622 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
21623 ("SkGeInitAssignRamToQueues: ActivePort (%d) invalid\n",
21624 ActivePort));
21625 return(1);
21626 }
21627- if (((pAC->GIni.GIMacsFound * (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE)) +
21628- ((RAM_QUOTA_SYNC == 0) ? 0 : SK_MIN_TXQ_SIZE)) > pAC->GIni.GIRamSize) {
21629+
21630+ DualPortYukon2 = (CHIP_ID_YUKON_2(pAC) && pAC->GIni.GIMacsFound == 2);
21631+
21632+ TotalRamSize = pAC->GIni.GIRamSize;
21633+
21634+ if (DualPortYukon2) {
21635+ TotalRamSize *= 2;
21636+ }
21637+
21638+ MinQueueSize = SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE;
21639+
21640+ if (MinQueueSize > pAC->GIni.GIRamSize) {
21641+ MinQueueSize = pAC->GIni.GIRamSize;
21642+ }
21643+
21644+ if ((pAC->GIni.GIMacsFound * MinQueueSize +
21645+ RAM_QUOTA_SYNC * SK_MIN_TXQ_SIZE) > TotalRamSize) {
21646+
21647 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
21648 ("SkGeInitAssignRamToQueues: Not enough memory (%d)\n",
21649- pAC->GIni.GIRamSize));
21650+ TotalRamSize));
21651 return(2);
21652 }
21653
21654 if (DualNet) {
21655 /* every port gets the same amount of memory */
21656- ActivePortKilobytes = pAC->GIni.GIRamSize / pAC->GIni.GIMacsFound;
21657+ ActivePortKilobytes = TotalRamSize / pAC->GIni.GIMacsFound;
21658+
21659 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
21660
21661- pGePort = &pAC->GIni.GP[i];
21662-
21663+ pPrt = &pAC->GIni.GP[i];
21664+
21665+ if (DualPortYukon2) {
21666+ ActivePortKilobytes = pAC->GIni.GIRamSize;
21667+ }
21668 /* take away the minimum memory for active queues */
21669- ActivePortKilobytes -= (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE);
21670+ ActivePortKilobytes -= MinQueueSize;
21671
21672 /* receive queue gets the minimum + 80% of the rest */
21673- pGePort->PRxQSize = (int) (ROUND_QUEUE_SIZE_KB((
21674- ActivePortKilobytes * (unsigned long) RAM_QUOTA_RX) / 100))
21675+ pPrt->PRxQSize = SkGeRoundQueueSize(pAC,
21676+ (int)((long)ActivePortKilobytes * RAM_QUOTA_RX) / 100)
21677 + SK_MIN_RXQ_SIZE;
21678
21679- ActivePortKilobytes -= (pGePort->PRxQSize - SK_MIN_RXQ_SIZE);
21680+ ActivePortKilobytes -= (pPrt->PRxQSize - SK_MIN_RXQ_SIZE);
21681
21682 /* synchronous transmit queue */
21683- pGePort->PXSQSize = 0;
21684+ pPrt->PXSQSize = 0;
21685
21686 /* asynchronous transmit queue */
21687- pGePort->PXAQSize = (int) ROUND_QUEUE_SIZE_KB(ActivePortKilobytes +
21688- SK_MIN_TXQ_SIZE);
21689+ pPrt->PXAQSize = SkGeRoundQueueSize(pAC,
21690+ ActivePortKilobytes + SK_MIN_TXQ_SIZE);
21691 }
21692 }
21693- else {
21694- /* Rlmt Mode or single link adapter */
21695+ else { /* RLMT Mode or single link adapter */
21696+
21697+ UsedKilobytes = 0;
21698
21699- /* Set standby queue size defaults for all standby ports */
21700+ /* set standby queue size defaults for all standby ports */
21701 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
21702
21703 if (i != ActivePort) {
21704- pGePort = &pAC->GIni.GP[i];
21705+ pPrt = &pAC->GIni.GP[i];
21706
21707- pGePort->PRxQSize = SK_MIN_RXQ_SIZE;
21708- pGePort->PXAQSize = SK_MIN_TXQ_SIZE;
21709- pGePort->PXSQSize = 0;
21710+ if (DualPortYukon2) {
21711+ pPrt->PRxQSize = SkGeRoundQueueSize(pAC,
21712+ (int)((long)(pAC->GIni.GIRamSize - MinQueueSize) *
21713+ RAM_QUOTA_RX) / 100) + SK_MIN_RXQ_SIZE;
21714+
21715+ pPrt->PXAQSize = pAC->GIni.GIRamSize - pPrt->PRxQSize;
21716+ }
21717+ else {
21718+ pPrt->PRxQSize = SK_MIN_RXQ_SIZE;
21719+ pPrt->PXAQSize = SK_MIN_TXQ_SIZE;
21720+ }
21721+ pPrt->PXSQSize = 0;
21722
21723 /* Count used RAM */
21724- UsedKilobytes += pGePort->PRxQSize + pGePort->PXAQSize;
21725+ UsedKilobytes += pPrt->PRxQSize + pPrt->PXAQSize;
21726 }
21727 }
21728 /* what's left? */
21729- ActivePortKilobytes = pAC->GIni.GIRamSize - UsedKilobytes;
21730+ ActivePortKilobytes = TotalRamSize - UsedKilobytes;
21731
21732 /* assign it to the active port */
21733 /* first take away the minimum memory */
21734- ActivePortKilobytes -= (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE);
21735- pGePort = &pAC->GIni.GP[ActivePort];
21736+ ActivePortKilobytes -= MinQueueSize;
21737+ pPrt = &pAC->GIni.GP[ActivePort];
21738+
21739+ /* receive queue gets 80% of the rest */
21740+ pPrt->PRxQSize = SkGeRoundQueueSize(pAC,
21741+ (int)((long)ActivePortKilobytes * RAM_QUOTA_RX) / 100);
21742
21743- /* receive queue get's the minimum + 80% of the rest */
21744- pGePort->PRxQSize = (int) (ROUND_QUEUE_SIZE_KB((ActivePortKilobytes *
21745- (unsigned long) RAM_QUOTA_RX) / 100)) + SK_MIN_RXQ_SIZE;
21746+ ActivePortKilobytes -= pPrt->PRxQSize;
21747
21748- ActivePortKilobytes -= (pGePort->PRxQSize - SK_MIN_RXQ_SIZE);
21749+ /* add the minimum memory for Rx queue */
21750+ pPrt->PRxQSize += MinQueueSize/2;
21751
21752 /* synchronous transmit queue */
21753- pGePort->PXSQSize = 0;
21754+ pPrt->PXSQSize = 0;
21755
21756- /* asynchronous transmit queue */
21757- pGePort->PXAQSize = (int) ROUND_QUEUE_SIZE_KB(ActivePortKilobytes) +
21758- SK_MIN_TXQ_SIZE;
21759+ /* asynchronous transmit queue gets 20% of the rest */
21760+ pPrt->PXAQSize = SkGeRoundQueueSize(pAC, ActivePortKilobytes) +
21761+ /* add the minimum memory for Tx queue */
21762+ MinQueueSize/2;
21763 }
21764-#ifdef VCPU
21765- VCPUprintf(0, "PRxQSize=%u, PXSQSize=%u, PXAQSize=%u\n",
21766- pGePort->PRxQSize, pGePort->PXSQSize, pGePort->PXAQSize);
21767-#endif /* VCPU */
21768+
21769+#ifdef DEBUG
21770+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
21771+
21772+ pPrt = &pAC->GIni.GP[i];
21773+
21774+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
21775+ ("Port %d: RxQSize=%u, TxAQSize=%u, TxSQSize=%u\n",
21776+ i, pPrt->PRxQSize, pPrt->PXAQSize, pPrt->PXSQSize));
21777+ }
21778+#endif /* DEBUG */
21779
21780 return(0);
21781 } /* SkGeInitAssignRamToQueues */
21782
21783+
21784 /******************************************************************************
21785 *
21786 * SkGeCheckQSize() - Checks the Adapters Queue Size Configuration
21787@@ -388,12 +557,12 @@
21788 * used ports.
21789 * This requirements must be fullfilled to have a valid configuration:
21790 * - The size of all queues must not exceed GIRamSize.
21791- * - The queue sizes must be specified in units of 8 kB.
21792+ * - The queue sizes must be specified in units of 8 kB (Genesis & Yukon).
21793 * - The size of Rx queues of available ports must not be
21794- * smaller than 16 kB.
21795+ * smaller than 16 kB (Genesis & Yukon) resp. 10 kB (Yukon-2).
21796 * - The size of at least one Tx queue (synch. or asynch.)
21797- * of available ports must not be smaller than 16 kB
21798- * when Jumbo Frames are used.
21799+ * of available ports must not be smaller than 16 kB (Genesis & Yukon),
21800+ * resp. 10 kB (Yukon-2) when Jumbo Frames are used.
21801 * - The RAM start and end addresses must not be changed
21802 * for ports which are already initialized.
21803 * Furthermore SkGeCheckQSize() defines the Start and End Addresses
21804@@ -404,7 +573,7 @@
21805 * 1: Queue Size Configuration invalid
21806 */
21807 static int SkGeCheckQSize(
21808-SK_AC *pAC, /* adapter context */
21809+SK_AC *pAC, /* Adapter Context */
21810 int Port) /* port index */
21811 {
21812 SK_GEPORT *pPrt;
21813@@ -414,55 +583,68 @@
21814 SK_U32 StartAddr;
21815 #ifndef SK_SLIM
21816 int UsedMem; /* total memory used (max. found ports) */
21817-#endif
21818+#endif
21819
21820 Rtv = 0;
21821-
21822+
21823 #ifndef SK_SLIM
21824
21825 UsedMem = 0;
21826+
21827 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
21828 pPrt = &pAC->GIni.GP[i];
21829
21830- if ((pPrt->PRxQSize & QZ_UNITS) != 0 ||
21831- (pPrt->PXSQSize & QZ_UNITS) != 0 ||
21832- (pPrt->PXAQSize & QZ_UNITS) != 0) {
21833+ if (CHIP_ID_YUKON_2(pAC)) {
21834+ UsedMem = 0;
21835+ }
21836+ else if (((pPrt->PRxQSize & QZ_UNITS) != 0 ||
21837+ (pPrt->PXSQSize & QZ_UNITS) != 0 ||
21838+ (pPrt->PXAQSize & QZ_UNITS) != 0)) {
21839
21840 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG);
21841 return(1);
21842 }
21843
21844- if (i == Port && pPrt->PRxQSize < SK_MIN_RXQ_SIZE) {
21845+#ifndef SK_DIAG
21846+ if (i == Port && pAC->GIni.GIRamSize > SK_MIN_RXQ_SIZE &&
21847+ pPrt->PRxQSize < SK_MIN_RXQ_SIZE) {
21848 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E011, SKERR_HWI_E011MSG);
21849 return(1);
21850 }
21851-
21852+
21853 /*
21854 * the size of at least one Tx queue (synch. or asynch.) has to be > 0.
21855 * if Jumbo Frames are used, this size has to be >= 16 kB.
21856 */
21857 if ((i == Port && pPrt->PXSQSize == 0 && pPrt->PXAQSize == 0) ||
21858- (pAC->GIni.GIPortUsage == SK_JUMBO_LINK &&
21859- ((pPrt->PXSQSize > 0 && pPrt->PXSQSize < SK_MIN_TXQ_SIZE) ||
21860+ (pPrt->PPortUsage == SK_JUMBO_LINK &&
21861+ ((pPrt->PXSQSize > 0 && pPrt->PXSQSize < SK_MIN_TXQ_SIZE) ||
21862 (pPrt->PXAQSize > 0 && pPrt->PXAQSize < SK_MIN_TXQ_SIZE)))) {
21863 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E023, SKERR_HWI_E023MSG);
21864 return(1);
21865 }
21866-
21867+#endif /* !SK_DIAG */
21868+
21869 UsedMem += pPrt->PRxQSize + pPrt->PXSQSize + pPrt->PXAQSize;
21870+
21871+ if (UsedMem > pAC->GIni.GIRamSize) {
21872+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG);
21873+ return(1);
21874+ }
21875 }
21876-
21877- if (UsedMem > pAC->GIni.GIRamSize) {
21878- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG);
21879- return(1);
21880- }
21881-#endif /* !SK_SLIM */
21882+
21883+#endif /* !SK_SLIM */
21884
21885 /* Now start address calculation */
21886 StartAddr = pAC->GIni.GIRamOffs;
21887 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
21888+
21889 pPrt = &pAC->GIni.GP[i];
21890
21891+ if (CHIP_ID_YUKON_2(pAC)) {
21892+ StartAddr = 0;
21893+ }
21894+
21895 /* Calculate/Check values for the receive queue */
21896 Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PRxQSize, &StartAddr,
21897 &pPrt->PRxQRamStart, &pPrt->PRxQRamEnd);
21898@@ -502,8 +684,8 @@
21899 * nothing
21900 */
21901 static void SkGeInitMacArb(
21902-SK_AC *pAC, /* adapter context */
21903-SK_IOC IoC) /* IO context */
21904+SK_AC *pAC, /* Adapter Context */
21905+SK_IOC IoC) /* I/O Context */
21906 {
21907 /* release local reset */
21908 SK_OUT16(IoC, B3_MA_TO_CTRL, MA_RST_CLR);
21909@@ -542,8 +724,8 @@
21910 * nothing
21911 */
21912 static void SkGeInitPktArb(
21913-SK_AC *pAC, /* adapter context */
21914-SK_IOC IoC) /* IO context */
21915+SK_AC *pAC, /* Adapter Context */
21916+SK_IOC IoC) /* I/O Context */
21917 {
21918 /* release local reset */
21919 SK_OUT16(IoC, B3_PA_CTRL, PA_RST_CLR);
21920@@ -559,7 +741,8 @@
21921 * NOTE: the packet arbiter timeout interrupt is needed for
21922 * half duplex hangup workaround
21923 */
21924- if (pAC->GIni.GIPortUsage != SK_JUMBO_LINK) {
21925+ if (pAC->GIni.GP[MAC_1].PPortUsage != SK_JUMBO_LINK &&
21926+ pAC->GIni.GP[MAC_2].PPortUsage != SK_JUMBO_LINK) {
21927 if (pAC->GIni.GIMacsFound == 1) {
21928 SK_OUT16(IoC, B3_PA_CTRL, PA_ENA_TO_TX1);
21929 }
21930@@ -582,14 +765,11 @@
21931 * nothing
21932 */
21933 static void SkGeInitMacFifo(
21934-SK_AC *pAC, /* adapter context */
21935-SK_IOC IoC, /* IO context */
21936+SK_AC *pAC, /* Adapter Context */
21937+SK_IOC IoC, /* I/O Context */
21938 int Port) /* Port Index (MAC_1 + n) */
21939 {
21940 SK_U16 Word;
21941-#ifdef VCPU
21942- SK_U32 DWord;
21943-#endif /* VCPU */
21944 /*
21945 * For each FIFO:
21946 * - release local reset
21947@@ -597,63 +777,101 @@
21948 * - setup defaults for the control register
21949 * - enable the FIFO
21950 */
21951-
21952+
21953 #ifdef GENESIS
21954 if (pAC->GIni.GIGenesis) {
21955- /* Configure Rx MAC FIFO */
21956+ /* configure Rx MAC FIFO */
21957 SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_CLR);
21958 SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_RX_CTRL_DEF);
21959 SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_ENA_OP_MD);
21960-
21961- /* Configure Tx MAC FIFO */
21962+
21963+ /* configure Tx MAC FIFO */
21964 SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_RST_CLR);
21965 SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_TX_CTRL_DEF);
21966 SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_ENA_OP_MD);
21967-
21968- /* Enable frame flushing if jumbo frames used */
21969- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
21970+
21971+ /* enable frame flushing if jumbo frames used */
21972+ if (pAC->GIni.GP[Port].PPortUsage == SK_JUMBO_LINK) {
21973 SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_ENA_FLUSH);
21974 }
21975 }
21976 #endif /* GENESIS */
21977-
21978+
21979 #ifdef YUKON
21980 if (pAC->GIni.GIYukon) {
21981- /* set Rx GMAC FIFO Flush Mask */
21982- SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), (SK_U16)RX_FF_FL_DEF_MSK);
21983-
21984+
21985 Word = (SK_U16)GMF_RX_CTRL_DEF;
21986
21987 /* disable Rx GMAC FIFO Flush for YUKON-Lite Rev. A0 only */
21988- if (pAC->GIni.GIYukonLite && pAC->GIni.GIChipId == CHIP_ID_YUKON) {
21989+ if (pAC->GIni.GIYukonLite /* && pAC->GIni.GIChipId == CHIP_ID_YUKON */) {
21990
21991 Word &= ~GMF_RX_F_FL_ON;
21992 }
21993-
21994- /* Configure Rx MAC FIFO */
21995+
21996+ /* configure Rx GMAC FIFO */
21997 SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR);
21998 SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), Word);
21999-
22000- /* set Rx GMAC FIFO Flush Threshold (default: 0x0a -> 56 bytes) */
22001- SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF);
22002-
22003- /* Configure Tx MAC FIFO */
22004+
22005+ Word = RX_FF_FL_DEF_MSK;
22006+
22007+#ifndef SK_DIAG
22008+ if (HW_FEATURE(pAC, HWF_WA_DEV_4115)) {
22009+ /*
22010+ * Flushing must be enabled (needed for ASF see dev. #4.29),
22011+ * but the flushing mask should be disabled (see dev. #4.115)
22012+ */
22013+ Word = 0;
22014+ }
22015+#endif /* !SK_DIAG */
22016+
22017+ /* set Rx GMAC FIFO Flush Mask (after clearing reset) */
22018+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), Word);
22019+
22020+ /* default: 0x0a -> 56 bytes on Yukon-1 and 64 bytes on Yukon-2 */
22021+ Word = (SK_U16)RX_GMF_FL_THR_DEF;
22022+
22023+ if (CHIP_ID_YUKON_2(pAC)) {
22024+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC &&
22025+ pAC->GIni.GIAsfEnabled) {
22026+ /* WA for dev. #4.30 (reduce to 0x08 -> 48 bytes) */
22027+ Word -= 2;
22028+ }
22029+ }
22030+ else {
22031+ /*
22032+ * because Pause Packet Truncation in GMAC is not working
22033+ * we have to increase the Flush Threshold to 64 bytes
22034+ * in order to flush pause packets in Rx FIFO on Yukon-1
22035+ */
22036+ Word++;
22037+ }
22038+
22039+ /* set Rx GMAC FIFO Flush Threshold (after clearing reset) */
22040+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), Word);
22041+
22042+ /* configure Tx GMAC FIFO */
22043 SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR);
22044 SK_OUT16(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U16)GMF_TX_CTRL_DEF);
22045-
22046-#ifdef VCPU
22047- SK_IN32(IoC, MR_ADDR(Port, RX_GMF_AF_THR), &DWord);
22048- SK_IN32(IoC, MR_ADDR(Port, TX_GMF_AE_THR), &DWord);
22049-#endif /* VCPU */
22050-
22051- /* set Tx GMAC FIFO Almost Empty Threshold */
22052-/* SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_AE_THR), 0); */
22053+
22054+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) {
22055+ /* set Rx Pause Threshold */
22056+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_LP_THR), (SK_U16)SK_ECU_LLPP);
22057+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_UP_THR), (SK_U16)SK_ECU_ULPP);
22058+
22059+ if (pAC->GIni.GP[Port].PPortUsage == SK_JUMBO_LINK) {
22060+ /* set Tx GMAC FIFO Almost Empty Threshold */
22061+ SK_OUT16(IoC, MR_ADDR(Port, TX_GMF_AE_THR),
22062+ (SK_U16)SK_ECU_AE_THR);
22063+ /* disable Store & Forward mode for TX */
22064+ SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), TX_STFW_DIS);
22065+ }
22066+ }
22067 }
22068 #endif /* YUKON */
22069
22070 } /* SkGeInitMacFifo */
22071
22072-#ifdef SK_LNK_SYNC_CNT
22073+#ifdef SK_LNK_SYNC_CNT
22074 /******************************************************************************
22075 *
22076 * SkGeLoadLnkSyncCnt() - Load the Link Sync Counter and starts counting
22077@@ -674,8 +892,8 @@
22078 * nothing
22079 */
22080 void SkGeLoadLnkSyncCnt(
22081-SK_AC *pAC, /* adapter context */
22082-SK_IOC IoC, /* IO context */
22083+SK_AC *pAC, /* Adapter Context */
22084+SK_IOC IoC, /* I/O Context */
22085 int Port, /* Port Index (MAC_1 + n) */
22086 SK_U32 CntVal) /* Counter value */
22087 {
22088@@ -685,7 +903,7 @@
22089 SK_BOOL IrqPend;
22090
22091 /* stop counter */
22092- SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_STOP);
22093+ SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LNK_STOP);
22094
22095 /*
22096 * ASIC problem:
22097@@ -698,6 +916,7 @@
22098 IrqPend = SK_FALSE;
22099 SK_IN32(IoC, B0_ISRC, &ISrc);
22100 SK_IN32(IoC, B0_IMSK, &OrgIMsk);
22101+
22102 if (Port == MAC_1) {
22103 NewIMsk = OrgIMsk & ~IS_LNK_SYNC_M1;
22104 if ((ISrc & IS_LNK_SYNC_M1) != 0) {
22105@@ -710,6 +929,7 @@
22106 IrqPend = SK_TRUE;
22107 }
22108 }
22109+
22110 if (!IrqPend) {
22111 SK_OUT32(IoC, B0_IMSK, NewIMsk);
22112 }
22113@@ -718,15 +938,17 @@
22114 SK_OUT32(IoC, MR_ADDR(Port, LNK_SYNC_INI), CntVal);
22115
22116 /* start counter */
22117- SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_START);
22118+ SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LNK_START);
22119
22120 if (!IrqPend) {
22121- /* clear the unexpected IRQ, and restore the interrupt mask */
22122- SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_CLR_IRQ);
22123+ /* clear the unexpected IRQ */
22124+ SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LNK_CLR_IRQ);
22125+
22126+ /* restore the interrupt mask */
22127 SK_OUT32(IoC, B0_IMSK, OrgIMsk);
22128 }
22129 } /* SkGeLoadLnkSyncCnt*/
22130-#endif /* SK_LNK_SYNC_CNT */
22131+#endif /* SK_LNK_SYNC_CNT */
22132
22133 #if defined(SK_DIAG) || defined(SK_CFG_SYNC)
22134 /******************************************************************************
22135@@ -758,8 +980,8 @@
22136 * synchronous queue is configured
22137 */
22138 int SkGeCfgSync(
22139-SK_AC *pAC, /* adapter context */
22140-SK_IOC IoC, /* IO context */
22141+SK_AC *pAC, /* Adapter Context */
22142+SK_IOC IoC, /* I/O Context */
22143 int Port, /* Port Index (MAC_1 + n) */
22144 SK_U32 IntTime, /* Interval Timer Value in units of 8ns */
22145 SK_U32 LimCount, /* Number of bytes to transfer during IntTime */
22146@@ -777,16 +999,16 @@
22147 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG);
22148 return(1);
22149 }
22150-
22151+
22152 if (pAC->GIni.GP[Port].PXSQSize == 0) {
22153 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E009, SKERR_HWI_E009MSG);
22154 return(2);
22155 }
22156-
22157+
22158 /* calculate register values */
22159 IntTime = (IntTime / 2) * pAC->GIni.GIHstClkFact / 100;
22160 LimCount = LimCount / 8;
22161-
22162+
22163 if (IntTime > TXA_MAX_VAL || LimCount > TXA_MAX_VAL) {
22164 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG);
22165 return(1);
22166@@ -804,13 +1026,13 @@
22167 */
22168 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
22169 TXA_ENA_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
22170-
22171+
22172 SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), IntTime);
22173 SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), LimCount);
22174-
22175+
22176 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
22177 (SK_U8)(SyncMode & (TXA_ENA_ALLOC | TXA_DIS_ALLOC)));
22178-
22179+
22180 if (IntTime != 0 || LimCount != 0) {
22181 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), TXA_DIS_FSYNC | TXA_START_RC);
22182 }
22183@@ -831,10 +1053,10 @@
22184 * Returns:
22185 * nothing
22186 */
22187-static void DoInitRamQueue(
22188-SK_AC *pAC, /* adapter context */
22189-SK_IOC IoC, /* IO context */
22190-int QuIoOffs, /* Queue IO Address Offset */
22191+void DoInitRamQueue(
22192+SK_AC *pAC, /* Adapter Context */
22193+SK_IOC IoC, /* I/O Context */
22194+int QuIoOffs, /* Queue I/O Address Offset */
22195 SK_U32 QuStartAddr, /* Queue Start Address */
22196 SK_U32 QuEndAddr, /* Queue End Address */
22197 int QuType) /* Queue Type (SK_RX_SRAM_Q|SK_RX_BRAM_Q|SK_TX_RAM_Q) */
22198@@ -867,8 +1089,7 @@
22199
22200 /* continue with SK_RX_BRAM_Q */
22201 case SK_RX_BRAM_Q:
22202- /* write threshold for Rx Queue */
22203-
22204+ /* write threshold for Rx Queue (Pause packets) */
22205 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RX_UTPP), RxUpThresVal);
22206 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RX_LTPP), RxLoThresVal);
22207
22208@@ -882,7 +1103,8 @@
22209 * or YUKON is used ((GMAC Tx FIFO is only 1 kB)
22210 * we NEED Store & Forward of the RAM buffer.
22211 */
22212- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK ||
22213+ if (pAC->GIni.GP[MAC_1].PPortUsage == SK_JUMBO_LINK ||
22214+ pAC->GIni.GP[MAC_2].PPortUsage == SK_JUMBO_LINK ||
22215 pAC->GIni.GIYukon) {
22216 /* enable Store & Forward Mode for the Tx Side */
22217 SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_ENA_STFWD);
22218@@ -911,8 +1133,8 @@
22219 * nothing
22220 */
22221 static void SkGeInitRamBufs(
22222-SK_AC *pAC, /* adapter context */
22223-SK_IOC IoC, /* IO context */
22224+SK_AC *pAC, /* Adapter Context */
22225+SK_IOC IoC, /* I/O Context */
22226 int Port) /* Port Index (MAC_1 + n) */
22227 {
22228 SK_GEPORT *pPrt;
22229@@ -920,8 +1142,8 @@
22230
22231 pPrt = &pAC->GIni.GP[Port];
22232
22233- if (pPrt->PRxQSize == SK_MIN_RXQ_SIZE) {
22234- RxQType = SK_RX_SRAM_Q; /* small Rx Queue */
22235+ if (pPrt->PRxQSize <= SK_MIN_RXQ_SIZE) {
22236+ RxQType = SK_RX_SRAM_Q; /* small Rx Queue */
22237 }
22238 else {
22239 RxQType = SK_RX_BRAM_Q; /* big Rx Queue */
22240@@ -929,10 +1151,10 @@
22241
22242 DoInitRamQueue(pAC, IoC, pPrt->PRxQOff, pPrt->PRxQRamStart,
22243 pPrt->PRxQRamEnd, RxQType);
22244-
22245+
22246 DoInitRamQueue(pAC, IoC, pPrt->PXsQOff, pPrt->PXsQRamStart,
22247 pPrt->PXsQRamEnd, SK_TX_RAM_Q);
22248-
22249+
22250 DoInitRamQueue(pAC, IoC, pPrt->PXaQOff, pPrt->PXaQRamStart,
22251 pPrt->PXaQRamEnd, SK_TX_RAM_Q);
22252
22253@@ -953,26 +1175,37 @@
22254 * nothing
22255 */
22256 void SkGeInitRamIface(
22257-SK_AC *pAC, /* adapter context */
22258-SK_IOC IoC) /* IO context */
22259+SK_AC *pAC, /* Adapter Context */
22260+SK_IOC IoC) /* I/O Context */
22261 {
22262- /* release local reset */
22263- SK_OUT16(IoC, B3_RI_CTRL, RI_RST_CLR);
22264+ int i;
22265+ int RamBuffers;
22266
22267- /* configure timeout values */
22268- SK_OUT8(IoC, B3_RI_WTO_R1, SK_RI_TO_53);
22269- SK_OUT8(IoC, B3_RI_WTO_XA1, SK_RI_TO_53);
22270- SK_OUT8(IoC, B3_RI_WTO_XS1, SK_RI_TO_53);
22271- SK_OUT8(IoC, B3_RI_RTO_R1, SK_RI_TO_53);
22272- SK_OUT8(IoC, B3_RI_RTO_XA1, SK_RI_TO_53);
22273- SK_OUT8(IoC, B3_RI_RTO_XS1, SK_RI_TO_53);
22274- SK_OUT8(IoC, B3_RI_WTO_R2, SK_RI_TO_53);
22275- SK_OUT8(IoC, B3_RI_WTO_XA2, SK_RI_TO_53);
22276- SK_OUT8(IoC, B3_RI_WTO_XS2, SK_RI_TO_53);
22277- SK_OUT8(IoC, B3_RI_RTO_R2, SK_RI_TO_53);
22278- SK_OUT8(IoC, B3_RI_RTO_XA2, SK_RI_TO_53);
22279- SK_OUT8(IoC, B3_RI_RTO_XS2, SK_RI_TO_53);
22280+ if (CHIP_ID_YUKON_2(pAC)) {
22281+ RamBuffers = pAC->GIni.GIMacsFound;
22282+ }
22283+ else {
22284+ RamBuffers = 1;
22285+ }
22286+
22287+ for (i = 0; i < RamBuffers; i++) {
22288+ /* release local reset */
22289+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_CTRL), (SK_U8)RI_RST_CLR);
22290
22291+ /* configure timeout values */
22292+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_R1), SK_RI_TO_53);
22293+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XA1), SK_RI_TO_53);
22294+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XS1), SK_RI_TO_53);
22295+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_R1), SK_RI_TO_53);
22296+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XA1), SK_RI_TO_53);
22297+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XS1), SK_RI_TO_53);
22298+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_R2), SK_RI_TO_53);
22299+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XA2), SK_RI_TO_53);
22300+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_WTO_XS2), SK_RI_TO_53);
22301+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_R2), SK_RI_TO_53);
22302+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XA2), SK_RI_TO_53);
22303+ SK_OUT8(IoC, SELECT_RAM_BUFFER(i, B3_RI_RTO_XS2), SK_RI_TO_53);
22304+ }
22305 } /* SkGeInitRamIface */
22306
22307
22308@@ -987,41 +1220,91 @@
22309 * nothing
22310 */
22311 static void SkGeInitBmu(
22312-SK_AC *pAC, /* adapter context */
22313-SK_IOC IoC, /* IO context */
22314+SK_AC *pAC, /* Adapter Context */
22315+SK_IOC IoC, /* I/O Context */
22316 int Port) /* Port Index (MAC_1 + n) */
22317 {
22318 SK_GEPORT *pPrt;
22319- SK_U32 RxWm;
22320- SK_U32 TxWm;
22321+ SK_U16 RxWm;
22322+ SK_U16 TxWm;
22323
22324 pPrt = &pAC->GIni.GP[Port];
22325
22326 RxWm = SK_BMU_RX_WM;
22327 TxWm = SK_BMU_TX_WM;
22328-
22329- if (!pAC->GIni.GIPciSlot64 && !pAC->GIni.GIPciClock66) {
22330- /* for better performance */
22331- RxWm /= 2;
22332- TxWm /= 2;
22333- }
22334
22335- /* Rx Queue: Release all local resets and set the watermark */
22336- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_CLR_RESET);
22337- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), RxWm);
22338+ if (CHIP_ID_YUKON_2(pAC)) {
22339
22340- /*
22341- * Tx Queue: Release all local resets if the queue is used !
22342- * set watermark
22343- */
22344- if (pPrt->PXSQSize != 0) {
22345- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_CLR_RESET);
22346- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_F), TxWm);
22347+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) {
22348+ /* for better performance set it to 128 */
22349+ RxWm = SK_BMU_RX_WM_PEX;
22350+ }
22351+
22352+ /* Rx Queue: Release all local resets and set the watermark */
22353+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), BMU_CLR_RESET);
22354+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), BMU_OPER_INIT);
22355+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), BMU_FIFO_OP_ON);
22356+
22357+ SK_OUT16(IoC, Q_ADDR(pPrt->PRxQOff, Q_WM), RxWm);
22358+
22359+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U &&
22360+ pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A1) {
22361+ /* MAC Rx RAM Read is controlled by hardware */
22362+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), F_M_RX_RAM_DIS);
22363+ }
22364+
22365+ /*
22366+ * Tx Queue: Release all local resets if the queue is used !
22367+ * set watermark
22368+ */
22369+ if (pPrt->PXSQSize != 0 && HW_SYNC_TX_SUPPORTED(pAC)) {
22370+ /* Yukon-EC doesn't have a synchronous Tx queue */
22371+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), BMU_CLR_RESET);
22372+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), BMU_OPER_INIT);
22373+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), BMU_FIFO_OP_ON);
22374+
22375+ SK_OUT16(IoC, Q_ADDR(pPrt->PXsQOff, Q_WM), TxWm);
22376+ }
22377+
22378+ if (pPrt->PXAQSize != 0) {
22379+
22380+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), BMU_CLR_RESET);
22381+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), BMU_OPER_INIT);
22382+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), BMU_FIFO_OP_ON);
22383+
22384+ SK_OUT16(IoC, Q_ADDR(pPrt->PXaQOff, Q_WM), TxWm);
22385+
22386+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U &&
22387+ pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A0) {
22388+ /* fix for Yukon-EC Ultra: set BMU FIFO level */
22389+ SK_OUT16(IoC, Q_ADDR(pPrt->PXaQOff, Q_AL), SK_ECU_TXFF_LEV);
22390+ }
22391+ }
22392 }
22393-
22394- if (pPrt->PXAQSize != 0) {
22395- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_CLR_RESET);
22396- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_F), TxWm);
22397+ else {
22398+ if (!pAC->GIni.GIPciSlot64 && !pAC->GIni.GIPciClock66) {
22399+ /* for better performance */
22400+ RxWm /= 2;
22401+ TxWm /= 2;
22402+ }
22403+
22404+ /* Rx Queue: Release all local resets and set the watermark */
22405+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_CLR_RESET);
22406+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), RxWm);
22407+
22408+ /*
22409+ * Tx Queue: Release all local resets if the queue is used !
22410+ * set watermark
22411+ */
22412+ if (pPrt->PXSQSize != 0) {
22413+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_CLR_RESET);
22414+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_F), TxWm);
22415+ }
22416+
22417+ if (pPrt->PXAQSize != 0) {
22418+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_CLR_RESET);
22419+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_F), TxWm);
22420+ }
22421 }
22422 /*
22423 * Do NOT enable the descriptor poll timers here, because
22424@@ -1045,20 +1328,29 @@
22425 */
22426 static SK_U32 TestStopBit(
22427 SK_AC *pAC, /* Adapter Context */
22428-SK_IOC IoC, /* IO Context */
22429-int QuIoOffs) /* Queue IO Address Offset */
22430+SK_IOC IoC, /* I/O Context */
22431+int QuIoOffs) /* Queue I/O Address Offset */
22432 {
22433 SK_U32 QuCsr; /* CSR contents */
22434
22435 SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
22436-
22437- if ((QuCsr & (CSR_STOP | CSR_SV_IDLE)) == 0) {
22438- /* Stop Descriptor overridden by start command */
22439- SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), CSR_STOP);
22440
22441- SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
22442+ if (CHIP_ID_YUKON_2(pAC)) {
22443+ if ((QuCsr & (BMU_STOP | BMU_IDLE)) == 0) {
22444+ /* Stop Descriptor overridden by start command */
22445+ SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), BMU_STOP);
22446+
22447+ SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
22448+ }
22449+ }
22450+ else {
22451+ if ((QuCsr & (CSR_STOP | CSR_SV_IDLE)) == 0) {
22452+ /* Stop Descriptor overridden by start command */
22453+ SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), CSR_STOP);
22454+
22455+ SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
22456+ }
22457 }
22458-
22459 return(QuCsr);
22460 } /* TestStopBit */
22461
22462@@ -1082,8 +1374,8 @@
22463 * has to be stopped once before.
22464 * SK_STOP_ALL SK_STOP_TX + SK_STOP_RX
22465 *
22466- * RstMode = SK_SOFT_RST Resets the MAC. The PHY is still alive.
22467- * SK_HARD_RST Resets the MAC and the PHY.
22468+ * RstMode = SK_SOFT_RST Resets the MAC, the PHY is still alive.
22469+ * SK_HARD_RST Resets the MAC and the PHY.
22470 *
22471 * Example:
22472 * 1) A Link Down event was signaled for a port. Therefore the activity
22473@@ -1142,56 +1434,82 @@
22474 * SWITCH_PORT.
22475 */
22476 void SkGeStopPort(
22477-SK_AC *pAC, /* adapter context */
22478-SK_IOC IoC, /* I/O context */
22479-int Port, /* port to stop (MAC_1 + n) */
22480+SK_AC *pAC, /* Adapter Context */
22481+SK_IOC IoC, /* I/O Context */
22482+int Port, /* Port to stop (MAC_1 + n) */
22483 int Dir, /* Direction to Stop (SK_STOP_RX, SK_STOP_TX, SK_STOP_ALL) */
22484 int RstMode)/* Reset Mode (SK_SOFT_RST, SK_HARD_RST) */
22485 {
22486-#ifndef SK_DIAG
22487- SK_EVPARA Para;
22488-#endif /* !SK_DIAG */
22489 SK_GEPORT *pPrt;
22490- SK_U32 DWord;
22491+ SK_U32 RxCsr;
22492 SK_U32 XsCsr;
22493 SK_U32 XaCsr;
22494 SK_U64 ToutStart;
22495+ SK_U32 CsrStart;
22496+ SK_U32 CsrStop;
22497+ SK_U32 CsrIdle;
22498+ SK_U32 CsrTest;
22499+ SK_U8 rsl; /* FIFO read shadow level */
22500+ SK_U8 rl; /* FIFO read level */
22501 int i;
22502 int ToutCnt;
22503
22504 pPrt = &pAC->GIni.GP[Port];
22505
22506+ /* set the proper values of Q_CSR register layout depending on the chip */
22507+ if (CHIP_ID_YUKON_2(pAC)) {
22508+ CsrStart = BMU_START;
22509+ CsrStop = BMU_STOP;
22510+ CsrIdle = BMU_IDLE;
22511+ CsrTest = BMU_IDLE;
22512+ }
22513+ else {
22514+ CsrStart = CSR_START;
22515+ CsrStop = CSR_STOP;
22516+ CsrIdle = CSR_SV_IDLE;
22517+ CsrTest = CSR_SV_IDLE | CSR_STOP;
22518+ }
22519+
22520 if ((Dir & SK_STOP_TX) != 0) {
22521- /* disable receiver and transmitter */
22522- SkMacRxTxDisable(pAC, IoC, Port);
22523-
22524+
22525+ if (!pAC->GIni.GIAsfEnabled) {
22526+ /* disable receiver and transmitter */
22527+ SkMacRxTxDisable(pAC, IoC, Port);
22528+ }
22529+
22530 /* stop both transmit queues */
22531+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CsrStop);
22532+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CsrStop);
22533 /*
22534 * If the BMU is in the reset state CSR_STOP will terminate
22535 * immediately.
22536 */
22537- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_STOP);
22538- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_STOP);
22539
22540 ToutStart = SkOsGetTime(pAC);
22541 ToutCnt = 0;
22542 do {
22543- /*
22544- * Clear packet arbiter timeout to make sure
22545- * this loop will terminate.
22546- */
22547- SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ?
22548- PA_CLR_TO_TX1 : PA_CLR_TO_TX2));
22549-
22550- /*
22551- * If the transfer stucks at the MAC the STOP command will not
22552- * terminate if we don't flush the XMAC's transmit FIFO !
22553- */
22554- SkMacFlushTxFifo(pAC, IoC, Port);
22555+#ifdef GENESIS
22556+ if (pAC->GIni.GIGenesis) {
22557+ /* clear Tx packet arbiter timeout IRQ */
22558+ SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ?
22559+ PA_CLR_TO_TX1 : PA_CLR_TO_TX2));
22560+ /*
22561+ * If the transfer stucks at the XMAC the STOP command will not
22562+ * terminate if we don't flush the XMAC's transmit FIFO !
22563+ */
22564+ SkMacFlushTxFifo(pAC, IoC, Port);
22565+ }
22566+#endif /* GENESIS */
22567
22568- XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff);
22569 XaCsr = TestStopBit(pAC, IoC, pPrt->PXaQOff);
22570
22571+ if (HW_SYNC_TX_SUPPORTED(pAC)) {
22572+ XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff);
22573+ }
22574+ else {
22575+ XsCsr = XaCsr;
22576+ }
22577+
22578 if (SkOsGetTime(pAC) - ToutStart > (SK_TICKS_PER_SEC / 18)) {
22579 /*
22580 * Timeout of 1/18 second reached.
22581@@ -1199,67 +1517,115 @@
22582 */
22583 ToutCnt++;
22584 if (ToutCnt > 1) {
22585- /* Might be a problem when the driver event handler
22586- * calls StopPort again. XXX.
22587+ /*
22588+ * If BMU stop doesn't terminate, we assume that
22589+ * we have a stable state and can reset the BMU,
22590+ * the Prefetch Unit, and RAM buffer now.
22591 */
22592-
22593- /* Fatal Error, Loop aborted */
22594- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E018,
22595- SKERR_HWI_E018MSG);
22596-#ifndef SK_DIAG
22597- Para.Para64 = Port;
22598- SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
22599-#endif /* !SK_DIAG */
22600- return;
22601+ break; /* ===> leave do/while loop here */
22602 }
22603 /*
22604- * Cache incoherency workaround: Assume a start command
22605+ * Cache incoherency workaround: assume a start command
22606 * has been lost while sending the frame.
22607 */
22608 ToutStart = SkOsGetTime(pAC);
22609
22610- if ((XsCsr & CSR_STOP) != 0) {
22611- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_START);
22612+ if ((XsCsr & CsrStop) != 0) {
22613+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CsrStart);
22614 }
22615- if ((XaCsr & CSR_STOP) != 0) {
22616- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_START);
22617+
22618+ if ((XaCsr & CsrStop) != 0) {
22619+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CsrStart);
22620 }
22621- }
22622
22623+ /*
22624+ * After the previous operations the X(s|a)Csr does no
22625+ * longer contain the proper values
22626+ */
22627+ XaCsr = TestStopBit(pAC, IoC, pPrt->PXaQOff);
22628+
22629+ if (HW_SYNC_TX_SUPPORTED(pAC)) {
22630+ XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff);
22631+ }
22632+ else {
22633+ XsCsr = XaCsr;
22634+ }
22635+ }
22636 /*
22637 * Because of the ASIC problem report entry from 21.08.1998 it is
22638 * required to wait until CSR_STOP is reset and CSR_SV_IDLE is set.
22639+ * (valid for GENESIS only)
22640 */
22641- } while ((XsCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE ||
22642- (XaCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE);
22643+ } while (((XsCsr & CsrTest) != CsrIdle ||
22644+ (XaCsr & CsrTest) != CsrIdle));
22645+
22646+ if (pAC->GIni.GIAsfEnabled) {
22647
22648- /* Reset the MAC depending on the RstMode */
22649- if (RstMode == SK_SOFT_RST) {
22650- SkMacSoftRst(pAC, IoC, Port);
22651+ pPrt->PState = (RstMode == SK_SOFT_RST) ? SK_PRT_STOP :
22652+ SK_PRT_RESET;
22653 }
22654 else {
22655- SkMacHardRst(pAC, IoC, Port);
22656- }
22657-
22658- /* Disable Force Sync bit and Enable Alloc bit */
22659- SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
22660+ /* Reset the MAC depending on the RstMode */
22661+ if (RstMode == SK_SOFT_RST) {
22662+
22663+ SkMacSoftRst(pAC, IoC, Port);
22664+ }
22665+ else {
22666+#ifdef SK_DIAG
22667+ if (HW_FEATURE(pAC, HWF_WA_DEV_472) && Port == MAC_1 &&
22668+ pAC->GIni.GP[MAC_2].PState == SK_PRT_RUN) {
22669+
22670+ pAC->GIni.GP[MAC_1].PState = SK_PRT_RESET;
22671+
22672+ /* set GPHY Control reset */
22673+ SK_OUT8(IoC, MR_ADDR(MAC_1, GPHY_CTRL), (SK_U8)GPC_RST_SET);
22674+ }
22675+ else {
22676+
22677+ SkMacHardRst(pAC, IoC, Port);
22678+ }
22679+#else /* !SK_DIAG */
22680+ SkMacHardRst(pAC, IoC, Port);
22681+#endif /* !SK_DIAG */
22682+ }
22683+ }
22684+
22685+ /* disable Force Sync bit and Enable Alloc bit */
22686+ SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
22687 TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
22688-
22689+
22690 /* Stop Interval Timer and Limit Counter of Tx Arbiter */
22691 SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), 0L);
22692 SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), 0L);
22693
22694 /* Perform a local reset of the port's Tx path */
22695+ if (CHIP_ID_YUKON_2(pAC)) {
22696+ /* Reset the PCI FIFO of the async Tx queue */
22697+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR),
22698+ BMU_RST_SET | BMU_FIFO_RST);
22699+
22700+ /* Reset the PCI FIFO of the sync Tx queue */
22701+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR),
22702+ BMU_RST_SET | BMU_FIFO_RST);
22703+
22704+ /* Reset the Tx prefetch units */
22705+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(pPrt->PXaQOff, PREF_UNIT_CTRL_REG),
22706+ PREF_UNIT_RST_SET);
22707+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(pPrt->PXsQOff, PREF_UNIT_CTRL_REG),
22708+ PREF_UNIT_RST_SET);
22709+ }
22710+ else {
22711+ /* Reset the PCI FIFO of the async Tx queue */
22712+ SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_SET_RESET);
22713+ /* Reset the PCI FIFO of the sync Tx queue */
22714+ SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_SET_RESET);
22715+ }
22716
22717- /* Reset the PCI FIFO of the async Tx queue */
22718- SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_SET_RESET);
22719- /* Reset the PCI FIFO of the sync Tx queue */
22720- SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_SET_RESET);
22721 /* Reset the RAM Buffer async Tx queue */
22722 SK_OUT8(IoC, RB_ADDR(pPrt->PXaQOff, RB_CTRL), RB_RST_SET);
22723 /* Reset the RAM Buffer sync Tx queue */
22724 SK_OUT8(IoC, RB_ADDR(pPrt->PXsQOff, RB_CTRL), RB_RST_SET);
22725-
22726+
22727 /* Reset Tx MAC FIFO */
22728 #ifdef GENESIS
22729 if (pAC->GIni.GIGenesis) {
22730@@ -1271,74 +1637,129 @@
22731 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_DIS);
22732 }
22733 #endif /* GENESIS */
22734-
22735+
22736 #ifdef YUKON
22737 if (pAC->GIni.GIYukon) {
22738- /* Reset TX MAC FIFO */
22739- SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_SET);
22740+ /* do the reset only if ASF is not enabled */
22741+ if (!pAC->GIni.GIAsfEnabled) {
22742+ /* Reset Tx MAC FIFO */
22743+ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_SET);
22744+ }
22745+
22746+ /* set Pause Off */
22747+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_PAUSE_OFF);
22748 }
22749 #endif /* YUKON */
22750 }
22751
22752 if ((Dir & SK_STOP_RX) != 0) {
22753- /*
22754- * The RX Stop Command will not terminate if no buffers
22755- * are queued in the RxD ring. But it will always reach
22756- * the Idle state. Therefore we can use this feature to
22757- * stop the transfer of received packets.
22758- */
22759- /* stop the port's receive queue */
22760- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_STOP);
22761-
22762- i = 100;
22763- do {
22764+
22765+ if (CHIP_ID_YUKON_2(pAC)) {
22766 /*
22767- * Clear packet arbiter timeout to make sure
22768- * this loop will terminate
22769+ * The RX Stop command will not work for Yukon-2 if the BMU does not
22770+ * reach the end of packet and since we can't make sure that we have
22771+ * incoming data, we must reset the BMU while it is not during a DMA
22772+ * transfer. Since it is possible that the RX path is still active,
22773+ * the RX RAM buffer will be stopped first, so any possible incoming
22774+ * data will not trigger a DMA. After the RAM buffer is stopped, the
22775+ * BMU is polled until any DMA in progress is ended and only then it
22776+ * will be reset.
22777 */
22778- SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ?
22779- PA_CLR_TO_RX1 : PA_CLR_TO_RX2));
22780
22781- DWord = TestStopBit(pAC, IoC, pPrt->PRxQOff);
22782+ /* disable the RAM Buffer receive queue */
22783+ SK_OUT8(IoC, RB_ADDR(pPrt->PRxQOff, RB_CTRL), RB_DIS_OP_MD);
22784
22785- /* timeout if i==0 (bug fix for #10748) */
22786- if (--i == 0) {
22787- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E024,
22788- SKERR_HWI_E024MSG);
22789- break;
22790+ i = 0xffff;
22791+ while (--i) {
22792+ SK_IN8(IoC, RB_ADDR(pPrt->PRxQOff, Q_RX_RSL), &rsl);
22793+ SK_IN8(IoC, RB_ADDR(pPrt->PRxQOff, Q_RX_RL), &rl);
22794+
22795+ if (rsl == rl) {
22796+ break;
22797+ }
22798 }
22799+
22800 /*
22801- * because of the ASIC problem report entry from 21.08.98
22802- * it is required to wait until CSR_STOP is reset and
22803- * CSR_SV_IDLE is set.
22804+ * If the Rx side is blocked, the above loop cannot terminate.
22805+ * But, if there was any traffic it should be terminated, now.
22806+ * However, stop the Rx BMU and the Prefetch Unit !
22807 */
22808- } while ((DWord & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE);
22809+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR),
22810+ BMU_RST_SET | BMU_FIFO_RST);
22811+ /* reset the Rx prefetch unit */
22812+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(pPrt->PRxQOff, PREF_UNIT_CTRL_REG),
22813+ PREF_UNIT_RST_SET);
22814+ }
22815+ else {
22816+ /*
22817+ * The RX Stop Command will not terminate if no buffers
22818+ * are queued in the RxD ring. But it will always reach
22819+ * the Idle state. Therefore we can use this feature to
22820+ * stop the transfer of received packets.
22821+ */
22822+ /* stop the port's receive queue */
22823+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CsrStop);
22824
22825- /* The path data transfer activity is fully stopped now */
22826+ i = 100;
22827+ do {
22828+#ifdef GENESIS
22829+ if (pAC->GIni.GIGenesis) {
22830+ /* clear Rx packet arbiter timeout IRQ */
22831+ SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ?
22832+ PA_CLR_TO_RX1 : PA_CLR_TO_RX2));
22833+ }
22834+#endif /* GENESIS */
22835+
22836+ RxCsr = TestStopBit(pAC, IoC, pPrt->PRxQOff);
22837+
22838+ /* timeout if i==0 (bug fix for #10748) */
22839+ if (--i == 0) {
22840+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E024,
22841+ SKERR_HWI_E024MSG);
22842+ break;
22843+ }
22844+ /*
22845+ * Because of the ASIC problem report entry from 21.08.1998 it is
22846+ * required to wait until CSR_STOP is reset and CSR_SV_IDLE is set.
22847+ * (valid for GENESIS only)
22848+ */
22849+ } while ((RxCsr & CsrTest) != CsrIdle);
22850+ /* The path data transfer activity is fully stopped now */
22851
22852- /* Perform a local reset of the port's Rx path */
22853+ /* Perform a local reset of the port's Rx path */
22854+ /* Reset the PCI FIFO of the Rx queue */
22855+ SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_SET_RESET);
22856+ }
22857
22858- /* Reset the PCI FIFO of the Rx queue */
22859- SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_SET_RESET);
22860 /* Reset the RAM Buffer receive queue */
22861 SK_OUT8(IoC, RB_ADDR(pPrt->PRxQOff, RB_CTRL), RB_RST_SET);
22862
22863 /* Reset Rx MAC FIFO */
22864 #ifdef GENESIS
22865 if (pAC->GIni.GIGenesis) {
22866-
22867+
22868 SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_SET);
22869
22870 /* switch Rx LED off, stop the LED counter */
22871 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_DIS);
22872 }
22873 #endif /* GENESIS */
22874-
22875 #ifdef YUKON
22876- if (pAC->GIni.GIYukon) {
22877+ if (pAC->GIni.GIYukon && !pAC->GIni.GIAsfEnabled) {
22878 /* Reset Rx MAC FIFO */
22879 SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_SET);
22880 }
22881+
22882+ if (((pAC->GIni.GIChipId == CHIP_ID_YUKON) ||
22883+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE)) &&
22884+ (RstMode == SK_HARD_RST)) {
22885+ /* set Link Control reset */
22886+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_SET);
22887+
22888+ /* clear Link Control reset */
22889+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_CLR);
22890+ }
22891+
22892 #endif /* YUKON */
22893 }
22894 } /* SkGeStopPort */
22895@@ -1355,8 +1776,8 @@
22896 * nothing
22897 */
22898 static void SkGeInit0(
22899-SK_AC *pAC, /* adapter context */
22900-SK_IOC IoC) /* IO context */
22901+SK_AC *pAC, /* Adapter Context */
22902+SK_IOC IoC) /* I/O Context */
22903 {
22904 int i;
22905 SK_GEPORT *pPrt;
22906@@ -1365,6 +1786,7 @@
22907 pPrt = &pAC->GIni.GP[i];
22908
22909 pPrt->PState = SK_PRT_RESET;
22910+ pPrt->PPortUsage = SK_RED_LINK;
22911 pPrt->PRxQOff = QOffTab[i].RxQOff;
22912 pPrt->PXsQOff = QOffTab[i].XsQOff;
22913 pPrt->PXaQOff = QOffTab[i].XaQOff;
22914@@ -1393,24 +1815,30 @@
22915 pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN;
22916 pPrt->PAutoNegFail = SK_FALSE;
22917 pPrt->PHWLinkUp = SK_FALSE;
22918- pPrt->PLinkBroken = SK_TRUE; /* See WA code */
22919+ pPrt->PLinkBroken = SK_TRUE; /* See WA code */
22920 pPrt->PPhyPowerState = PHY_PM_OPERATIONAL_MODE;
22921 pPrt->PMacColThres = TX_COL_DEF;
22922 pPrt->PMacJamLen = TX_JAM_LEN_DEF;
22923 pPrt->PMacJamIpgVal = TX_JAM_IPG_DEF;
22924 pPrt->PMacJamIpgData = TX_IPG_JAM_DEF;
22925+ pPrt->PMacBackOffLim = TX_BOF_LIM_DEF;
22926+ pPrt->PMacDataBlind = DATA_BLIND_DEF;
22927 pPrt->PMacIpgData = IPG_DATA_DEF;
22928 pPrt->PMacLimit4 = SK_FALSE;
22929 }
22930
22931- pAC->GIni.GIPortUsage = SK_RED_LINK;
22932 pAC->GIni.GILedBlinkCtrl = (SK_U16)OemConfig.Value;
22933- pAC->GIni.GIValIrqMask = IS_ALL_MSK;
22934+ pAC->GIni.GIChipCap = 0;
22935+
22936+ for (i = 0; i < 4; i++) {
22937+ pAC->GIni.HwF.Features[i]= 0x00000000;
22938+ pAC->GIni.HwF.OnMask[i] = 0x00000000;
22939+ pAC->GIni.HwF.OffMask[i] = 0x00000000;
22940+ }
22941
22942 } /* SkGeInit0*/
22943
22944 #ifdef SK_PCI_RESET
22945-
22946 /******************************************************************************
22947 *
22948 * SkGePciReset() - Reset PCI interface
22949@@ -1426,8 +1854,8 @@
22950 * 1: Power state could not be changed to 3.
22951 */
22952 static int SkGePciReset(
22953-SK_AC *pAC, /* adapter context */
22954-SK_IOC IoC) /* IO context */
22955+SK_AC *pAC, /* Adapter Context */
22956+SK_IOC IoC) /* I/O Context */
22957 {
22958 int i;
22959 SK_U16 PmCtlSts;
22960@@ -1450,7 +1878,7 @@
22961 /* We know the RAM Interface Arbiter is enabled. */
22962 SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D3);
22963 SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
22964-
22965+
22966 if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D3) {
22967 return(1);
22968 }
22969@@ -1460,7 +1888,7 @@
22970
22971 /* Check for D0 state. */
22972 SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
22973-
22974+
22975 if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D0) {
22976 return(1);
22977 }
22978@@ -1469,11 +1897,24 @@
22979 SkPciReadCfgWord(pAC, PCI_COMMAND, &PciCmd);
22980 SkPciReadCfgByte(pAC, PCI_CACHE_LSZ, &Cls);
22981 SkPciReadCfgDWord(pAC, PCI_BASE_1ST, &Bp1);
22982- SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2);
22983+
22984+ /*
22985+ * Compute the location in PCI config space of BAR2
22986+ * relativ to the location of BAR1
22987+ */
22988+ if ((Bp1 & PCI_MEM_TYP_MSK) == PCI_MEM64BIT) {
22989+ /* BAR1 is 64 bits wide */
22990+ i = 8;
22991+ }
22992+ else {
22993+ i = 4;
22994+ }
22995+
22996+ SkPciReadCfgDWord(pAC, PCI_BASE_1ST + i, &Bp2);
22997 SkPciReadCfgByte(pAC, PCI_LAT_TIM, &Lat);
22998-
22999- if (PciCmd != 0 || Cls != (SK_U8)0 || Lat != (SK_U8)0 ||
23000- (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1) {
23001+
23002+ if (PciCmd != 0 || Cls != 0 || (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1 ||
23003+ Lat != 0) {
23004 return(1);
23005 }
23006
23007@@ -1484,9 +1925,115 @@
23008
23009 return(0);
23010 } /* SkGePciReset */
23011-
23012 #endif /* SK_PCI_RESET */
23013
23014+
23015+#ifndef SK_SLIM
23016+/******************************************************************************
23017+ *
23018+ * SkGeSetUpSupFeatures() - Collect Feature List for HW_FEATURE Macro
23019+ *
23020+ * Description:
23021+ * This function collects the available features and required
23022+ * deviation services of the Adapter and provides these
23023+ * information in the GIHwF struct. This information is used as
23024+ * default value and may be overritten by the driver using the
23025+ * SET_HW_FEATURE_MASK() macro in its Init0 phase.
23026+ *
23027+ * Notice:
23028+ * Using the On and Off mask: Never switch on the same bit in both
23029+ * masks simultaneously. However, if doing the Off mask will win.
23030+ *
23031+ * Returns:
23032+ * nothing
23033+ */
23034+static void SkGeSetUpSupFeatures(
23035+SK_AC *pAC, /* Adapter Context */
23036+SK_IOC IoC) /* I/O Context */
23037+{
23038+ int i;
23039+ SK_U16 Word;
23040+
23041+ switch (pAC->GIni.GIChipId) {
23042+ case CHIP_ID_YUKON_EC:
23043+ if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_A1) {
23044+ /* A0/A1 */
23045+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23046+ HWF_WA_DEV_42 | HWF_WA_DEV_46 | HWF_WA_DEV_43_418 |
23047+ HWF_WA_DEV_420 | HWF_WA_DEV_423 |
23048+ HWF_WA_DEV_424 | HWF_WA_DEV_425 | HWF_WA_DEV_427 |
23049+ HWF_WA_DEV_428 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 |
23050+ HWF_WA_DEV_4152| HWF_WA_DEV_4167;
23051+ }
23052+ else {
23053+ /* A2/A3 */
23054+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23055+ HWF_WA_DEV_424 | HWF_WA_DEV_425 | HWF_WA_DEV_427 |
23056+ HWF_WA_DEV_428 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 |
23057+ HWF_WA_DEV_4152| HWF_WA_DEV_4167;
23058+ }
23059+ break;
23060+ case CHIP_ID_YUKON_FE:
23061+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23062+ HWF_WA_DEV_427 | HWF_WA_DEV_4109 |
23063+ HWF_WA_DEV_4152| HWF_WA_DEV_4167;
23064+ break;
23065+ case CHIP_ID_YUKON_XL:
23066+ switch (pAC->GIni.GIChipRev) {
23067+ case CHIP_REV_YU_XL_A0: /* still needed for Diag */
23068+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23069+ HWF_WA_DEV_427 | HWF_WA_DEV_463 | HWF_WA_DEV_472 |
23070+ HWF_WA_DEV_479 | HWF_WA_DEV_483 | HWF_WA_DEV_4115 |
23071+ HWF_WA_DEV_4152| HWF_WA_DEV_4167;
23072+ break;
23073+
23074+ case CHIP_REV_YU_XL_A1:
23075+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23076+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 |
23077+ HWF_WA_DEV_4115| HWF_WA_DEV_4152| HWF_WA_DEV_4167;
23078+ break;
23079+
23080+ case CHIP_REV_YU_XL_A2:
23081+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23082+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 |
23083+ HWF_WA_DEV_4115 |HWF_WA_DEV_4167;
23084+ break;
23085+
23086+ case CHIP_REV_YU_XL_A3:
23087+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23088+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109 |
23089+ HWF_WA_DEV_4115;
23090+ break;
23091+ }
23092+ break;
23093+ case CHIP_ID_YUKON_EC_U:
23094+ if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A0) {
23095+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23096+ HWF_WA_DEV_427 | HWF_WA_DEV_483 | HWF_WA_DEV_4109;
23097+ }
23098+ else if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A1) {
23099+ pAC->GIni.HwF.Features[HW_DEV_LIST] =
23100+ HWF_WA_DEV_427 | HWF_WA_DEV_4109 | HWF_WA_DEV_4185;
23101+
23102+ /* check for A1b */
23103+ SK_IN16(IoC, Q_ADDR(Q_XA1, Q_WM), &Word);
23104+ if (Word == 0) {
23105+ pAC->GIni.HwF.Features[HW_DEV_LIST] |=
23106+ HWF_WA_DEV_4185CS | HWF_WA_DEV_4200;
23107+ }
23108+ }
23109+ break;
23110+ }
23111+
23112+ for (i = 0; i < 4; i++) {
23113+ pAC->GIni.HwF.Features[i] =
23114+ (pAC->GIni.HwF.Features[i] | pAC->GIni.HwF.OnMask[i]) &
23115+ ~pAC->GIni.HwF.OffMask[i];
23116+ }
23117+} /* SkGeSetUpSupFeatures */
23118+#endif /* !SK_SLIM */
23119+
23120+
23121 /******************************************************************************
23122 *
23123 * SkGeInit1() - Level 1 Initialization
23124@@ -1509,80 +2056,235 @@
23125 * 6: HW self test failed
23126 */
23127 static int SkGeInit1(
23128-SK_AC *pAC, /* adapter context */
23129-SK_IOC IoC) /* IO context */
23130+SK_AC *pAC, /* Adapter Context */
23131+SK_IOC IoC) /* I/O Context */
23132 {
23133 SK_U8 Byte;
23134 SK_U16 Word;
23135- SK_U16 CtrlStat;
23136+ SK_U32 CtrlStat;
23137+ SK_U32 VauxAvail;
23138 SK_U32 DWord;
23139+ SK_U32 Our1;
23140+ SK_U32 PowerDownBit;
23141+ SK_BOOL FiberType;
23142+ SK_GEPORT *pPrt;
23143 int RetVal;
23144- int i;
23145+ int i, j;
23146
23147 RetVal = 0;
23148
23149- /* save CLK_RUN bits (YUKON-Lite) */
23150- SK_IN16(IoC, B0_CTST, &CtrlStat);
23151+ /* save CLK_RUN & ASF_ENABLE bits (YUKON-Lite, YUKON-EC) */
23152+ SK_IN32(IoC, B0_CTST, &CtrlStat);
23153
23154 #ifdef SK_PCI_RESET
23155 (void)SkGePciReset(pAC, IoC);
23156 #endif /* SK_PCI_RESET */
23157
23158- /* do the SW-reset */
23159- SK_OUT8(IoC, B0_CTST, CS_RST_SET);
23160-
23161 /* release the SW-reset */
23162+ /* Important: SW-reset has to be cleared here, to ensure
23163+ * the CHIP_ID can be read IO-mapped based, too -
23164+ * remember the RAP register can only be written if
23165+ * SW-reset is cleared.
23166+ */
23167 SK_OUT8(IoC, B0_CTST, CS_RST_CLR);
23168
23169+ /* read Chip Identification Number */
23170+ SK_IN8(IoC, B2_CHIP_ID, &Byte);
23171+ pAC->GIni.GIChipId = Byte;
23172+
23173+ pAC->GIni.GIAsfEnabled = SK_FALSE;
23174+
23175+ /* ASF support only for Yukon-2 */
23176+ if ((pAC->GIni.GIChipId >= CHIP_ID_YUKON_XL) &&
23177+ (pAC->GIni.GIChipId <= CHIP_ID_YUKON_EC)) {
23178+#ifdef SK_ASF
23179+ if ((CtrlStat & Y2_ASF_ENABLE) != 0) {
23180+ /* do the SW-reset only if ASF is not enabled */
23181+ pAC->GIni.GIAsfEnabled = SK_TRUE;
23182+ }
23183+#else /* !SK_ASF */
23184+
23185+ SK_IN8(IoC, B28_Y2_ASF_STAT_CMD, &Byte);
23186+
23187+ pAC->GIni.GIAsfRunning = Byte & Y2_ASF_RUNNING;
23188+
23189+ /* put ASF system in reset state */
23190+ SK_OUT8(IoC, B28_Y2_ASF_STAT_CMD, (SK_U8)Y2_ASF_RESET);
23191+
23192+ /* disable ASF Unit */
23193+ SK_OUT16(IoC, B0_CTST, Y2_ASF_DISABLE);
23194+#endif /* !SK_ASF */
23195+ }
23196+
23197+ if (!pAC->GIni.GIAsfEnabled) {
23198+ /* Yukon-2: required for Diag and Power Management */
23199+ /* set the SW-reset */
23200+ SK_OUT8(IoC, B0_CTST, CS_RST_SET);
23201+
23202+ /* release the SW-reset */
23203+ SK_OUT8(IoC, B0_CTST, CS_RST_CLR);
23204+ }
23205+
23206+ /* enable Config Write */
23207+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
23208+
23209 /* reset all error bits in the PCI STATUS register */
23210 /*
23211 * Note: PCI Cfg cycles cannot be used, because they are not
23212 * available on some platforms after 'boot time'.
23213 */
23214- SK_IN16(IoC, PCI_C(PCI_STATUS), &Word);
23215-
23216- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
23217- SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS));
23218- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
23219+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word);
23220+
23221+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), Word | (SK_U16)PCI_ERRBITS);
23222
23223 /* release Master Reset */
23224 SK_OUT8(IoC, B0_CTST, CS_MRST_CLR);
23225
23226 #ifdef CLK_RUN
23227 CtrlStat |= CS_CLK_RUN_ENA;
23228-#endif /* CLK_RUN */
23229
23230 /* restore CLK_RUN bits */
23231 SK_OUT16(IoC, B0_CTST, (SK_U16)(CtrlStat &
23232 (CS_CLK_RUN_HOT | CS_CLK_RUN_RST | CS_CLK_RUN_ENA)));
23233+#endif /* CLK_RUN */
23234+
23235+ if ((pAC->GIni.GIChipId >= CHIP_ID_YUKON_XL) &&
23236+ (pAC->GIni.GIChipId <= CHIP_ID_YUKON_FE)) {
23237+
23238+ pAC->GIni.GIYukon2 = SK_TRUE;
23239+ pAC->GIni.GIValIrqMask = Y2_IS_ALL_MSK;
23240+ pAC->GIni.GIValHwIrqMask = Y2_HWE_ALL_MSK;
23241+
23242+ VauxAvail = Y2_VAUX_AVAIL;
23243+
23244+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_STATUS), &DWord);
23245+
23246+ if ((DWord & PCI_OS_PCI_X) != 0) {
23247+#ifndef SK_SLIM
23248+ /* this is a PCI / PCI-X bus */
23249+ if ((DWord & PCI_OS_PCIX) != 0) {
23250+ /* this is a PCI-X bus */
23251+ pAC->GIni.GIPciBus = SK_PCIX_BUS;
23252+
23253+ /* PCI-X is always 64-bit wide */
23254+ pAC->GIni.GIPciSlot64 = SK_TRUE;
23255+
23256+ pAC->GIni.GIPciMode = (SK_U8)(PCI_OS_SPEED(DWord));
23257+ }
23258+ else {
23259+ /* this is a conventional PCI bus */
23260+ pAC->GIni.GIPciBus = SK_PCI_BUS;
23261+
23262+ SK_IN16(IoC, PCI_C(pAC, PCI_OUR_REG_2), &Word);
23263+
23264+ /* check if 64-bit width is used */
23265+ pAC->GIni.GIPciSlot64 = (SK_BOOL)
23266+ (((DWord & PCI_OS_PCI64B) != 0) &&
23267+ ((Word & PCI_USEDATA64) != 0));
23268+
23269+ /* check if 66 MHz PCI Clock is active */
23270+ pAC->GIni.GIPciClock66 = (SK_BOOL)((DWord & PCI_OS_PCI66M) != 0);
23271+ }
23272+#endif /* !SK_SLIM */
23273+ }
23274+ else {
23275+ /* this is a PEX bus */
23276+ pAC->GIni.GIPciBus = SK_PEX_BUS;
23277+
23278+ /* clear any PEX errors */
23279+ SK_OUT32(IoC, PCI_C(pAC, PEX_UNC_ERR_STAT), 0xffffffffUL);
23280+
23281+ SK_IN16(IoC, PCI_C(pAC, PEX_LNK_STAT), &Word);
23282+
23283+ pAC->GIni.GIPexWidth = (SK_U8)((Word & PEX_LS_LINK_WI_MSK) >> 4);
23284+ }
23285+ /*
23286+ * Yukon-2 chips family has a different way of providing
23287+ * the number of MACs available
23288+ */
23289+ pAC->GIni.GIMacsFound = 1;
23290+
23291+ SK_IN8(IoC, B2_Y2_HW_RES, &Byte);
23292+
23293+ if (CHIP_ID_YUKON_2(pAC)) {
23294+ /*
23295+ * OEM config value is overwritten and should not
23296+ * be used for Yukon-2
23297+ */
23298+ pAC->GIni.GILedBlinkCtrl |= SK_ACT_LED_BLINK;
23299+
23300+ if (CFG_LED_MODE(Byte) == CFG_LED_DUAL_ACT_LNK) {
23301+
23302+ pAC->GIni.GILedBlinkCtrl |= SK_DUAL_LED_ACT_LNK;
23303+ }
23304+ }
23305+
23306+ if ((Byte & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) {
23307+
23308+ SK_IN8(IoC, B2_Y2_CLK_GATE, &Byte);
23309+
23310+ if (!(Byte & Y2_STATUS_LNK2_INAC)) {
23311+ /* Link 2 activ */
23312+ pAC->GIni.GIMacsFound++;
23313+ }
23314+ }
23315+
23316+#ifdef VCPU
23317+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL) {
23318+ /* temporary WA for reported number of links */
23319+ pAC->GIni.GIMacsFound = 2;
23320+ }
23321+#endif /* VCPU */
23322+
23323+#ifdef REPLAY_TIMER
23324+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) {
23325+ SK_OUT16(IoC, PCI_C(pAC, PEX_ACK_RPLY_TOX1), 0x2710); /* 40 us */
23326+ }
23327+#endif
23328+
23329+ /* read Chip Revision */
23330+ SK_IN8(IoC, B2_MAC_CFG, &Byte);
23331+
23332+ pAC->GIni.GIChipCap = Byte & 0x0f;
23333+ }
23334+ else {
23335+ pAC->GIni.GIYukon2 = SK_FALSE;
23336+ pAC->GIni.GIValIrqMask = IS_ALL_MSK;
23337+ pAC->GIni.GIValHwIrqMask = 0; /* not activated */
23338+
23339+ VauxAvail = CS_VAUX_AVAIL;
23340+
23341+ /* read number of MACs and Chip Revision */
23342+ SK_IN8(IoC, B2_MAC_CFG, &Byte);
23343+
23344+ pAC->GIni.GIMacsFound = (Byte & CFG_SNG_MAC) ? 1 : 2;
23345+ }
23346
23347- /* read Chip Identification Number */
23348- SK_IN8(IoC, B2_CHIP_ID, &Byte);
23349- pAC->GIni.GIChipId = Byte;
23350-
23351- /* read number of MACs */
23352- SK_IN8(IoC, B2_MAC_CFG, &Byte);
23353- pAC->GIni.GIMacsFound = (Byte & CFG_SNG_MAC) ? 1 : 2;
23354-
23355 /* get Chip Revision Number */
23356 pAC->GIni.GIChipRev = (SK_U8)((Byte & CFG_CHIP_R_MSK) >> 4);
23357
23358- /* get diff. PCI parameters */
23359- SK_IN16(IoC, B0_CTST, &CtrlStat);
23360-
23361+#ifndef SK_DIAG
23362+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL &&
23363+ pAC->GIni.GIChipRev == CHIP_REV_YU_XL_A0) {
23364+ /* Yukon-2 Chip Rev. A0 */
23365+ return(6);
23366+ }
23367+#endif /* !SK_DIAG */
23368+
23369 /* read the adapters RAM size */
23370 SK_IN8(IoC, B2_E_0, &Byte);
23371-
23372+
23373 pAC->GIni.GIGenesis = SK_FALSE;
23374 pAC->GIni.GIYukon = SK_FALSE;
23375 pAC->GIni.GIYukonLite = SK_FALSE;
23376+ pAC->GIni.GIVauxAvail = SK_FALSE;
23377
23378 #ifdef GENESIS
23379 if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {
23380
23381 pAC->GIni.GIGenesis = SK_TRUE;
23382
23383- if (Byte == (SK_U8)3) {
23384+ if (Byte == (SK_U8)3) {
23385 /* special case: 4 x 64k x 36, offset = 0x80000 */
23386 pAC->GIni.GIRamSize = 1024;
23387 pAC->GIni.GIRamOffs = (SK_U32)512 * 1024;
23388@@ -1591,57 +2293,83 @@
23389 pAC->GIni.GIRamSize = (int)Byte * 512;
23390 pAC->GIni.GIRamOffs = 0;
23391 }
23392- /* all GE adapters work with 53.125 MHz host clock */
23393+ /* all GENESIS adapters work with 53.125 MHz host clock */
23394 pAC->GIni.GIHstClkFact = SK_FACT_53;
23395-
23396+
23397 /* set Descr. Poll Timer Init Value to 250 ms */
23398 pAC->GIni.GIPollTimerVal =
23399 SK_DPOLL_DEF * (SK_U32)pAC->GIni.GIHstClkFact / 100;
23400 }
23401 #endif /* GENESIS */
23402-
23403+
23404 #ifdef YUKON
23405 if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) {
23406-
23407+
23408 pAC->GIni.GIYukon = SK_TRUE;
23409-
23410+
23411 pAC->GIni.GIRamSize = (Byte == (SK_U8)0) ? 128 : (int)Byte * 4;
23412-
23413+
23414+#ifndef SK_SLIM
23415 pAC->GIni.GIRamOffs = 0;
23416-
23417- /* WA for chip Rev. A */
23418+
23419+ /* WA for Yukon chip Rev. A */
23420 pAC->GIni.GIWolOffs = (pAC->GIni.GIChipId == CHIP_ID_YUKON &&
23421 pAC->GIni.GIChipRev == 0) ? WOL_REG_OFFS : 0;
23422-
23423+
23424 /* get PM Capabilities of PCI config space */
23425- SK_IN16(IoC, PCI_C(PCI_PM_CAP_REG), &Word);
23426+ SK_IN16(IoC, PCI_C(pAC, PCI_PM_CAP_REG), &Word);
23427
23428 /* check if VAUX is available */
23429- if (((CtrlStat & CS_VAUX_AVAIL) != 0) &&
23430+ if (((CtrlStat & VauxAvail) != 0) &&
23431 /* check also if PME from D3cold is set */
23432 ((Word & PCI_PME_D3C_SUP) != 0)) {
23433 /* set entry in GE init struct */
23434 pAC->GIni.GIVauxAvail = SK_TRUE;
23435 }
23436-
23437- if (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) {
23438- /* this is Rev. A1 */
23439- pAC->GIni.GIYukonLite = SK_TRUE;
23440- }
23441- else {
23442- /* save Flash-Address Register */
23443- SK_IN32(IoC, B2_FAR, &DWord);
23444+#endif /* !SK_SLIM */
23445
23446- /* test Flash-Address Register */
23447- SK_OUT8(IoC, B2_FAR + 3, 0xff);
23448- SK_IN8(IoC, B2_FAR + 3, &Byte);
23449+ if (!CHIP_ID_YUKON_2(pAC)) {
23450
23451- if (Byte != 0) {
23452- /* this is Rev. A0 */
23453+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) {
23454+ /* this is Rev. A1 */
23455 pAC->GIni.GIYukonLite = SK_TRUE;
23456+ }
23457+#ifndef SK_SLIM
23458+ else {
23459+ /* save Flash-Address Register */
23460+ SK_IN32(IoC, B2_FAR, &DWord);
23461
23462- /* restore Flash-Address Register */
23463- SK_OUT32(IoC, B2_FAR, DWord);
23464+ /* test Flash-Address Register */
23465+ SK_OUT8(IoC, B2_FAR + 3, 0xff);
23466+ SK_IN8(IoC, B2_FAR + 3, &Byte);
23467+
23468+ if (Byte != 0) {
23469+ /* this is Rev. A0 */
23470+ pAC->GIni.GIYukonLite = SK_TRUE;
23471+
23472+ /* restore Flash-Address Register */
23473+ SK_OUT32(IoC, B2_FAR, DWord);
23474+ }
23475+ }
23476+#endif /* !SK_SLIM */
23477+ }
23478+ else {
23479+ /* Check for CLS = 0 (dev. #4.55) */
23480+ if (pAC->GIni.GIPciBus != SK_PEX_BUS) {
23481+ /* PCI and PCI-X */
23482+ SK_IN8(IoC, PCI_C(pAC, PCI_CACHE_LSZ), &Byte);
23483+
23484+ if (Byte == 0) {
23485+ /* set CLS to 2 if configured to 0 */
23486+ SK_OUT8(IoC, PCI_C(pAC, PCI_CACHE_LSZ), 2);
23487+ }
23488+
23489+ if (pAC->GIni.GIPciBus == SK_PCIX_BUS) {
23490+ /* set Cache Line Size opt. */
23491+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &DWord);
23492+ DWord |= PCI_CLS_OPT;
23493+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), DWord);
23494+ }
23495 }
23496 }
23497
23498@@ -1649,138 +2377,282 @@
23499 SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA |
23500 PC_VAUX_OFF | PC_VCC_ON));
23501
23502- /* read the Interrupt source */
23503- SK_IN32(IoC, B0_ISRC, &DWord);
23504-
23505- if ((DWord & IS_HW_ERR) != 0) {
23506- /* read the HW Error Interrupt source */
23507- SK_IN32(IoC, B0_HWE_ISRC, &DWord);
23508-
23509- if ((DWord & IS_IRQ_SENSOR) != 0) {
23510- /* disable HW Error IRQ */
23511- pAC->GIni.GIValIrqMask &= ~IS_HW_ERR;
23512+ Byte = 0;
23513+
23514+ if (CHIP_ID_YUKON_2(pAC)) {
23515+ switch (pAC->GIni.GIChipId) {
23516+ /* PEX adapters work with different host clock */
23517+ case CHIP_ID_YUKON_EC:
23518+ case CHIP_ID_YUKON_EC_U:
23519+ /* Yukon-EC works with 125 MHz host clock */
23520+ pAC->GIni.GIHstClkFact = SK_FACT_125;
23521+ break;
23522+ case CHIP_ID_YUKON_FE:
23523+ /* Yukon-FE works with 100 MHz host clock */
23524+ pAC->GIni.GIHstClkFact = SK_FACT_100;
23525+ break;
23526+ case CHIP_ID_YUKON_XL:
23527+ /* all Yukon-2 adapters work with 156 MHz host clock */
23528+ pAC->GIni.GIHstClkFact = 2 * SK_FACT_78;
23529+
23530+ if (pAC->GIni.GIChipRev > CHIP_REV_YU_XL_A1) {
23531+ /* enable bits are inverted */
23532+ Byte = (SK_U8)(Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
23533+ Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
23534+ Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS);
23535+ }
23536+ break;
23537+ default:
23538+ SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E006,
23539+ SKERR_HWI_E006MSG);
23540+ }
23541+
23542+ pAC->GIni.GIPollTimerVal =
23543+ SK_DPOLL_DEF_Y2 * (SK_U32)pAC->GIni.GIHstClkFact / 100;
23544+
23545+ /* set power down bit */
23546+ PowerDownBit = PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD;
23547+
23548+ /* disable Core Clock Division, set Clock Select to 0 (Yukon-2) */
23549+ SK_OUT32(IoC, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS);
23550+
23551+ /* enable MAC/PHY, PCI and Core Clock for both Links */
23552+ SK_OUT8(IoC, B2_Y2_CLK_GATE, Byte);
23553+ }
23554+ else {
23555+ /* YUKON adapters work with 78 MHz host clock */
23556+ pAC->GIni.GIHstClkFact = SK_FACT_78;
23557+
23558+ pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX; /* 215 ms */
23559+
23560+ /* read the Interrupt source */
23561+ SK_IN32(IoC, B0_ISRC, &DWord);
23562+
23563+ if ((DWord & IS_HW_ERR) != 0) {
23564+ /* read the HW Error Interrupt source */
23565+ SK_IN32(IoC, B0_HWE_ISRC, &DWord);
23566+
23567+ if ((DWord & IS_IRQ_SENSOR) != 0) {
23568+ /* disable HW Error IRQ */
23569+ pAC->GIni.GIValIrqMask &= ~IS_HW_ERR;
23570+ }
23571 }
23572+ /* set power down bit */
23573+ PowerDownBit = PCI_PHY_COMA;
23574 }
23575-
23576- for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
23577- /* set GMAC Link Control reset */
23578- SK_OUT16(IoC, MR_ADDR(i, GMAC_LINK_CTRL), GMLC_RST_SET);
23579
23580- /* clear GMAC Link Control reset */
23581- SK_OUT16(IoC, MR_ADDR(i, GMAC_LINK_CTRL), GMLC_RST_CLR);
23582+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &Our1);
23583+
23584+ Our1 &= ~PowerDownBit;
23585+
23586+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL &&
23587+ pAC->GIni.GIChipRev > CHIP_REV_YU_XL_A1) {
23588+ /* deassert Low Power for 1st PHY */
23589+ Our1 |= PCI_Y2_PHY1_COMA;
23590+
23591+ if (pAC->GIni.GIMacsFound > 1) {
23592+ /* deassert Low Power for 2nd PHY */
23593+ Our1 |= PCI_Y2_PHY2_COMA;
23594+ }
23595+ }
23596+ else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) {
23597+ /* enable HW WOL */
23598+ SK_OUT16(IoC, B0_CTST, (SK_U16)Y2_HW_WOL_ON);
23599+
23600+ /* enable all clocks */
23601+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_3), 0);
23602+
23603+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord);
23604+
23605+ DWord &= P_ASPM_CONTROL_MSK;
23606+ /* set all bits to 0 except bits 15..12 */
23607+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord);
23608+
23609+ /* set to default value */
23610+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5), 0);
23611+ }
23612+
23613+ /* release PHY from PowerDown/COMA Mode */
23614+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), Our1);
23615+
23616+ if (!pAC->GIni.GIAsfEnabled) {
23617+
23618+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
23619+ /* set Link Control reset */
23620+ SK_OUT8(IoC, MR_ADDR(i, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_SET);
23621+
23622+ /* clear Link Control reset */
23623+ SK_OUT8(IoC, MR_ADDR(i, GMAC_LINK_CTRL), (SK_U8)GMLC_RST_CLR);
23624+ }
23625 }
23626- /* all YU chips work with 78.125 MHz host clock */
23627- pAC->GIni.GIHstClkFact = SK_FACT_78;
23628-
23629- pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX; /* 215 ms */
23630 }
23631 #endif /* YUKON */
23632
23633- /* check if 64-bit PCI Slot is present */
23634- pAC->GIni.GIPciSlot64 = (SK_BOOL)((CtrlStat & CS_BUS_SLOT_SZ) != 0);
23635-
23636- /* check if 66 MHz PCI Clock is active */
23637- pAC->GIni.GIPciClock66 = (SK_BOOL)((CtrlStat & CS_BUS_CLOCK) != 0);
23638+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
23639+
23640+#ifndef SK_SLIM
23641+ if (!CHIP_ID_YUKON_2(pAC)) {
23642+ /* this is a conventional PCI bus */
23643+ pAC->GIni.GIPciBus = SK_PCI_BUS;
23644+
23645+ /* check if 64-bit PCI Slot is present */
23646+ pAC->GIni.GIPciSlot64 = (SK_BOOL)((CtrlStat & CS_BUS_SLOT_SZ) != 0);
23647+
23648+ /* check if 66 MHz PCI Clock is active */
23649+ pAC->GIni.GIPciClock66 = (SK_BOOL)((CtrlStat & CS_BUS_CLOCK) != 0);
23650+ }
23651
23652 /* read PCI HW Revision Id. */
23653- SK_IN8(IoC, PCI_C(PCI_REV_ID), &Byte);
23654+ SK_IN8(IoC, PCI_C(pAC, PCI_REV_ID), &Byte);
23655 pAC->GIni.GIPciHwRev = Byte;
23656
23657+ /* read connector type */
23658+ SK_IN8(IoC, B2_CONN_TYP, &pAC->GIni.GIConTyp);
23659+#endif /* !SK_SLIM */
23660+
23661 /* read the PMD type */
23662 SK_IN8(IoC, B2_PMD_TYP, &Byte);
23663- pAC->GIni.GICopperType = (SK_U8)(Byte == 'T');
23664
23665- /* read the PHY type */
23666+ pAC->GIni.GIPmdTyp = Byte;
23667+
23668+ FiberType = (Byte == 'L' || Byte == 'S' || Byte == 'P');
23669+
23670+ pAC->GIni.GICopperType = (SK_BOOL)(Byte == 'T' || Byte == '1' ||
23671+ (pAC->GIni.GIYukon2 && !FiberType));
23672+
23673+ /* read the PHY type (Yukon and Genesis) */
23674 SK_IN8(IoC, B2_E_1, &Byte);
23675
23676 Byte &= 0x0f; /* the PHY type is stored in the lower nibble */
23677 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
23678-
23679+
23680+ pPrt = &pAC->GIni.GP[i];
23681+
23682+ /* get the MAC addresses */
23683+ for (j = 0; j < 3; j++) {
23684+ SK_IN16(IoC, B2_MAC_1 + i * 8 + j * 2, &pPrt->PMacAddr[j]);
23685+ }
23686+
23687 #ifdef GENESIS
23688 if (pAC->GIni.GIGenesis) {
23689 switch (Byte) {
23690 case SK_PHY_XMAC:
23691- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_XMAC;
23692+ pPrt->PhyAddr = PHY_ADDR_XMAC;
23693 break;
23694 case SK_PHY_BCOM:
23695- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_BCOM;
23696- pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO |
23697+ pPrt->PhyAddr = PHY_ADDR_BCOM;
23698+ pPrt->PMSCap = (SK_U8)(SK_MS_CAP_AUTO |
23699 SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE);
23700 break;
23701 #ifdef OTHER_PHY
23702 case SK_PHY_LONE:
23703- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_LONE;
23704+ pPrt->PhyAddr = PHY_ADDR_LONE;
23705 break;
23706 case SK_PHY_NAT:
23707- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_NAT;
23708+ pPrt->PhyAddr = PHY_ADDR_NAT;
23709 break;
23710 #endif /* OTHER_PHY */
23711 default:
23712 /* ERROR: unexpected PHY type detected */
23713 RetVal = 5;
23714- break;
23715 }
23716 }
23717 #endif /* GENESIS */
23718-
23719+
23720 #ifdef YUKON
23721 if (pAC->GIni.GIYukon) {
23722-
23723- if (Byte < (SK_U8)SK_PHY_MARV_COPPER) {
23724+
23725+ if (((Byte < (SK_U8)SK_PHY_MARV_COPPER) || pAC->GIni.GIYukon2) &&
23726+ !FiberType) {
23727 /* if this field is not initialized */
23728 Byte = (SK_U8)SK_PHY_MARV_COPPER;
23729-
23730+
23731 pAC->GIni.GICopperType = SK_TRUE;
23732 }
23733-
23734- pAC->GIni.GP[i].PhyAddr = PHY_ADDR_MARV;
23735-
23736+
23737+ pPrt->PhyAddr = PHY_ADDR_MARV;
23738+
23739 if (pAC->GIni.GICopperType) {
23740
23741- pAC->GIni.GP[i].PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_AUTO |
23742- SK_LSPEED_CAP_10MBPS | SK_LSPEED_CAP_100MBPS |
23743- SK_LSPEED_CAP_1000MBPS);
23744-
23745- pAC->GIni.GP[i].PLinkSpeed = (SK_U8)SK_LSPEED_AUTO;
23746-
23747- pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO |
23748+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE ||
23749+ (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC &&
23750+ pAC->GIni.GIChipCap == 2)) {
23751+
23752+ pPrt->PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_100MBPS |
23753+ SK_LSPEED_CAP_10MBPS);
23754+
23755+ pAC->GIni.GIRamSize = 4;
23756+ }
23757+ else {
23758+ pPrt->PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_1000MBPS |
23759+ SK_LSPEED_CAP_100MBPS | SK_LSPEED_CAP_10MBPS |
23760+ SK_LSPEED_CAP_AUTO);
23761+ }
23762+
23763+ pPrt->PLinkSpeed = (SK_U8)SK_LSPEED_AUTO;
23764+
23765+ pPrt->PMSCap = (SK_U8)(SK_MS_CAP_AUTO |
23766 SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE);
23767 }
23768 else {
23769 Byte = (SK_U8)SK_PHY_MARV_FIBER;
23770 }
23771 }
23772+
23773+ /* clear TWSI IRQ */
23774+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
23775+
23776 #endif /* YUKON */
23777-
23778- pAC->GIni.GP[i].PhyType = (int)Byte;
23779-
23780+
23781+ pPrt->PhyType = (int)Byte;
23782+
23783 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
23784- ("PHY type: %d PHY addr: %04x\n", Byte,
23785- pAC->GIni.GP[i].PhyAddr));
23786+ ("PHY type: %d PHY addr: %04x\n",
23787+ Byte, pPrt->PhyAddr));
23788 }
23789-
23790+
23791 /* get MAC Type & set function pointers dependent on */
23792 #ifdef GENESIS
23793 if (pAC->GIni.GIGenesis) {
23794-
23795+
23796 pAC->GIni.GIMacType = SK_MAC_XMAC;
23797
23798 pAC->GIni.GIFunc.pFnMacUpdateStats = SkXmUpdateStats;
23799 pAC->GIni.GIFunc.pFnMacStatistic = SkXmMacStatistic;
23800 pAC->GIni.GIFunc.pFnMacResetCounter = SkXmResetCounter;
23801 pAC->GIni.GIFunc.pFnMacOverflow = SkXmOverflowStatus;
23802+#ifdef SK_DIAG
23803+ pAC->GIni.GIFunc.pFnMacPhyRead = SkXmPhyRead;
23804+ pAC->GIni.GIFunc.pFnMacPhyWrite = SkXmPhyWrite;
23805+#else /* SK_DIAG */
23806+ pAC->GIni.GIFunc.pSkGeSirqIsr = SkGeYuSirqIsr;
23807+#endif /* !SK_DIAG */
23808 }
23809 #endif /* GENESIS */
23810-
23811+
23812 #ifdef YUKON
23813 if (pAC->GIni.GIYukon) {
23814-
23815+
23816+#ifndef SK_SLIM
23817 pAC->GIni.GIMacType = SK_MAC_GMAC;
23818
23819 pAC->GIni.GIFunc.pFnMacUpdateStats = SkGmUpdateStats;
23820 pAC->GIni.GIFunc.pFnMacStatistic = SkGmMacStatistic;
23821 pAC->GIni.GIFunc.pFnMacResetCounter = SkGmResetCounter;
23822 pAC->GIni.GIFunc.pFnMacOverflow = SkGmOverflowStatus;
23823+#endif /* !SK_SLIM */
23824+
23825+#ifdef SK_DIAG
23826+ pAC->GIni.GIFunc.pFnMacPhyRead = SkGmPhyRead;
23827+ pAC->GIni.GIFunc.pFnMacPhyWrite = SkGmPhyWrite;
23828+#else /* SK_DIAG */
23829+ if (CHIP_ID_YUKON_2(pAC)) {
23830+ pAC->GIni.GIFunc.pSkGeSirqIsr = SkYuk2SirqIsr;
23831+ }
23832+ else {
23833+ pAC->GIni.GIFunc.pSkGeSirqIsr = SkGeYuSirqIsr;
23834+ }
23835+#endif /* !SK_DIAG */
23836
23837 #ifdef SPECIAL_HANDLING
23838 if (pAC->GIni.GIChipId == CHIP_ID_YUKON) {
23839@@ -1793,7 +2665,13 @@
23840 #endif
23841 }
23842 #endif /* YUKON */
23843-
23844+
23845+#ifndef SK_SLIM
23846+
23847+ SkGeSetUpSupFeatures(pAC, IoC);
23848+
23849+#endif /* !SK_SLIM */
23850+
23851 return(RetVal);
23852 } /* SkGeInit1 */
23853
23854@@ -1814,9 +2692,12 @@
23855 * nothing
23856 */
23857 static void SkGeInit2(
23858-SK_AC *pAC, /* adapter context */
23859-SK_IOC IoC) /* IO context */
23860+SK_AC *pAC, /* Adapter Context */
23861+SK_IOC IoC) /* I/O Context */
23862 {
23863+#ifdef YUKON
23864+ SK_U16 Word;
23865+#endif /* YUKON */
23866 #ifdef GENESIS
23867 SK_U32 DWord;
23868 #endif /* GENESIS */
23869@@ -1850,13 +2731,13 @@
23870 SkGeInitPktArb(pAC, IoC);
23871 }
23872 #endif /* GENESIS */
23873-
23874-#ifdef YUKON
23875+
23876+#ifdef xSK_DIAG
23877 if (pAC->GIni.GIYukon) {
23878 /* start Time Stamp Timer */
23879 SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8)GMT_ST_START);
23880 }
23881-#endif /* YUKON */
23882+#endif /* SK_DIAG */
23883
23884 /* enable the Tx Arbiters */
23885 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
23886@@ -1866,8 +2747,34 @@
23887 /* enable the RAM Interface Arbiter */
23888 SkGeInitRamIface(pAC, IoC);
23889
23890+#ifdef YUKON
23891+ if (CHIP_ID_YUKON_2(pAC)) {
23892+
23893+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) {
23894+
23895+ SK_IN16(IoC, PCI_C(pAC, PEX_DEV_CTRL), &Word);
23896+
23897+ /* change Max. Read Request Size to 2048 bytes */
23898+ Word &= ~PEX_DC_MAX_RRS_MSK;
23899+ Word |= PEX_DC_MAX_RD_RQ_SIZE(4);
23900+
23901+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
23902+
23903+ SK_OUT16(IoC, PCI_C(pAC, PEX_DEV_CTRL), Word);
23904+
23905+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
23906+ }
23907+
23908+ /*
23909+ * Writing the HW Error Mask Reg. will not generate an IRQ
23910+ * as long as the B0_IMSK is not set by the driver.
23911+ */
23912+ SK_OUT32(IoC, B0_HWE_IMSK, pAC->GIni.GIValHwIrqMask);
23913+ }
23914+#endif /* YUKON */
23915 } /* SkGeInit2 */
23916
23917+
23918 /******************************************************************************
23919 *
23920 * SkGeInit() - Initialize the GE Adapter with the specified level.
23921@@ -1889,7 +2796,7 @@
23922 * if Number of MACs > SK_MAX_MACS
23923 *
23924 * After returning from Level 0 the adapter
23925- * may be accessed with IO operations.
23926+ * may be accessed with I/O operations.
23927 *
23928 * Level 2: start the Blink Source Counter
23929 *
23930@@ -1898,14 +2805,14 @@
23931 * 1: Number of MACs exceeds SK_MAX_MACS (after level 1)
23932 * 2: Adapter not present or not accessible
23933 * 3: Illegal initialization level
23934- * 4: Initialization Level 1 Call missing
23935+ * 4: Initialization level 1 call missing
23936 * 5: Unexpected PHY type detected
23937 * 6: HW self test failed
23938 */
23939 int SkGeInit(
23940-SK_AC *pAC, /* adapter context */
23941-SK_IOC IoC, /* IO context */
23942-int Level) /* initialization level */
23943+SK_AC *pAC, /* Adapter Context */
23944+SK_IOC IoC, /* I/O Context */
23945+int Level) /* Initialization Level */
23946 {
23947 int RetVal; /* return value */
23948 SK_U32 DWord;
23949@@ -1920,7 +2827,7 @@
23950 SkGeInit0(pAC, IoC);
23951 pAC->GIni.GILevel = SK_INIT_DATA;
23952 break;
23953-
23954+
23955 case SK_INIT_IO:
23956 /* Initialization Level 1 */
23957 RetVal = SkGeInit1(pAC, IoC);
23958@@ -1932,22 +2839,24 @@
23959 SK_OUT32(IoC, B2_IRQM_INI, SK_TEST_VAL);
23960 SK_IN32(IoC, B2_IRQM_INI, &DWord);
23961 SK_OUT32(IoC, B2_IRQM_INI, 0L);
23962-
23963+
23964 if (DWord != SK_TEST_VAL) {
23965 RetVal = 2;
23966 break;
23967 }
23968
23969+#ifdef DEBUG
23970 /* check if the number of GIMacsFound matches SK_MAX_MACS */
23971 if (pAC->GIni.GIMacsFound > SK_MAX_MACS) {
23972 RetVal = 1;
23973 break;
23974 }
23975+#endif /* DEBUG */
23976
23977 /* Level 1 successfully passed */
23978 pAC->GIni.GILevel = SK_INIT_IO;
23979 break;
23980-
23981+
23982 case SK_INIT_RUN:
23983 /* Initialization Level 2 */
23984 if (pAC->GIni.GILevel != SK_INIT_IO) {
23985@@ -1957,12 +2866,13 @@
23986 RetVal = 4;
23987 break;
23988 }
23989+
23990 SkGeInit2(pAC, IoC);
23991
23992 /* Level 2 successfully passed */
23993 pAC->GIni.GILevel = SK_INIT_RUN;
23994 break;
23995-
23996+
23997 default:
23998 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E003, SKERR_HWI_E003MSG);
23999 RetVal = 3;
24000@@ -1985,77 +2895,82 @@
24001 * nothing
24002 */
24003 void SkGeDeInit(
24004-SK_AC *pAC, /* adapter context */
24005-SK_IOC IoC) /* IO context */
24006+SK_AC *pAC, /* Adapter Context */
24007+SK_IOC IoC) /* I/O Context */
24008 {
24009 int i;
24010 SK_U16 Word;
24011
24012-#ifdef SK_PHY_LP_MODE
24013- SK_U8 Byte;
24014+#ifdef SK_PHY_LP_MODE_DEEP_SLEEP
24015 SK_U16 PmCtlSts;
24016-#endif /* SK_PHY_LP_MODE */
24017+#endif
24018
24019 #if (!defined(SK_SLIM) && !defined(VCPU))
24020 /* ensure I2C is ready */
24021 SkI2cWaitIrq(pAC, IoC);
24022-#endif
24023-
24024- /* stop all current transfer activity */
24025- for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
24026- if (pAC->GIni.GP[i].PState != SK_PRT_STOP &&
24027- pAC->GIni.GP[i].PState != SK_PRT_RESET) {
24028-
24029- SkGeStopPort(pAC, IoC, i, SK_STOP_ALL, SK_HARD_RST);
24030- }
24031- }
24032+#endif
24033
24034-#ifdef SK_PHY_LP_MODE
24035- /*
24036+#ifdef SK_PHY_LP_MODE_DEEP_SLEEP
24037+ /*
24038 * for power saving purposes within mobile environments
24039- * we set the PHY to coma mode and switch to D3 power state.
24040+ * we set the PHY to coma mode.
24041 */
24042- if (pAC->GIni.GIYukonLite &&
24043- pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
24044+#ifdef XXX
24045+ if (pAC->GIni.GIVauxAvail) {
24046+ /* switch power to VAUX */
24047+ SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA |
24048+ PC_VAUX_ON | PC_VCC_OFF));
24049+ }
24050+#endif /* XXX */
24051+
24052+ if (CHIP_ID_YUKON_2(pAC) && /* pAC->GIni.GIMacsFound == 1 && */
24053+ !pAC->GIni.GIAsfEnabled
24054+#ifdef XXX
24055+ || (pAC->GIni.GIYukonLite && pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3)
24056+#endif /* XXX */
24057+ ) {
24058+
24059+ /* flag for SkGmEnterLowPowerMode() that the call was from here */
24060+ pAC->GIni.GILevel = SK_INIT_IO;
24061
24062 /* for all ports switch PHY to coma mode */
24063 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
24064-
24065- SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP);
24066- }
24067-
24068- if (pAC->GIni.GIVauxAvail) {
24069- /* switch power to VAUX */
24070- Byte = PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF;
24071
24072- SK_OUT8(IoC, B0_POWER_CTRL, Byte);
24073+ (void)SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP);
24074 }
24075-
24076- /* switch to D3 state */
24077- SK_IN16(IoC, PCI_C(PCI_PM_CTL_STS), &PmCtlSts);
24078-
24079- PmCtlSts |= PCI_PM_STATE_D3;
24080+ }
24081+#else /* !SK_PHY_LP_MODE_DEEP_SLEEP */
24082
24083- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
24084+ if (!pAC->GIni.GIAsfEnabled) {
24085+ /* stop all current transfer activity */
24086+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
24087+ if (pAC->GIni.GP[i].PState != SK_PRT_STOP &&
24088+ pAC->GIni.GP[i].PState != SK_PRT_RESET) {
24089
24090- SK_OUT16(IoC, PCI_C(PCI_PM_CTL_STS), PmCtlSts);
24091+ SkGeStopPort(pAC, IoC, i, SK_STOP_ALL, SK_HARD_RST);
24092+ }
24093+ }
24094 }
24095-#endif /* SK_PHY_LP_MODE */
24096
24097- /* Reset all bits in the PCI STATUS register */
24098+ /* reset all bits in the PCI STATUS register */
24099 /*
24100 * Note: PCI Cfg cycles cannot be used, because they are not
24101 * available on some platforms after 'boot time'.
24102 */
24103- SK_IN16(IoC, PCI_C(PCI_STATUS), &Word);
24104-
24105+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word);
24106+
24107 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
24108- SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS));
24109+
24110+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), Word | (SK_U16)PCI_ERRBITS);
24111+
24112 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
24113
24114- /* do the reset, all LEDs are switched off now */
24115- SK_OUT8(IoC, B0_CTST, CS_RST_SET);
24116-
24117+ if (!pAC->GIni.GIAsfEnabled) {
24118+ /* set the SW-reset */
24119+ SK_OUT8(IoC, B0_CTST, CS_RST_SET);
24120+ }
24121+#endif /* !SK_PHY_LP_MODE_DEEP_SLEEP */
24122+
24123 pAC->GIni.GILevel = SK_INIT_DATA;
24124 } /* SkGeDeInit */
24125
24126@@ -2089,8 +3004,8 @@
24127 * 2: The port has to be stopped before it can be initialized again.
24128 */
24129 int SkGeInitPort(
24130-SK_AC *pAC, /* adapter context */
24131-SK_IOC IoC, /* IO context */
24132+SK_AC *pAC, /* Adapter Context */
24133+SK_IOC IoC, /* I/O Context */
24134 int Port) /* Port to configure */
24135 {
24136 SK_GEPORT *pPrt;
24137@@ -2101,8 +3016,8 @@
24138 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E004, SKERR_HWI_E004MSG);
24139 return(1);
24140 }
24141-
24142- if (pPrt->PState == SK_PRT_INIT || pPrt->PState == SK_PRT_RUN) {
24143+
24144+ if (pPrt->PState >= SK_PRT_INIT) {
24145 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E005, SKERR_HWI_E005MSG);
24146 return(2);
24147 }
24148@@ -2119,29 +3034,29 @@
24149 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_ENA);
24150 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_ENA);
24151 /* The Link LED is initialized by RLMT or Diagnostics itself */
24152-
24153+
24154 SkXmInitMac(pAC, IoC, Port);
24155 }
24156 #endif /* GENESIS */
24157-
24158+
24159 #ifdef YUKON
24160 if (pAC->GIni.GIYukon) {
24161
24162 SkGmInitMac(pAC, IoC, Port);
24163 }
24164 #endif /* YUKON */
24165-
24166+
24167 /* do NOT initialize the Link Sync Counter */
24168
24169 SkGeInitMacFifo(pAC, IoC, Port);
24170-
24171+
24172 SkGeInitRamBufs(pAC, IoC, Port);
24173-
24174+
24175 if (pPrt->PXSQSize != 0) {
24176 /* enable Force Sync bit if synchronous queue available */
24177 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), TXA_ENA_FSYNC);
24178 }
24179-
24180+
24181 SkGeInitBmu(pAC, IoC, Port);
24182
24183 /* mark port as initialized */
24184@@ -2149,3 +3064,192 @@
24185
24186 return(0);
24187 } /* SkGeInitPort */
24188+
24189+
24190+#if (defined(YUK2) && !defined(SK_SLIM))
24191+/******************************************************************************
24192+ *
24193+ * SkGeRamWrite() - Writes One quadword to RAM
24194+ *
24195+ * Returns:
24196+ * 0
24197+ */
24198+static void SkGeRamWrite(
24199+SK_AC *pAC, /* Adapter Context */
24200+SK_IOC IoC, /* I/O Context */
24201+SK_U32 Addr, /* Address to be written to (in quadwords) */
24202+SK_U32 LowDword, /* Lower Dword to be written */
24203+SK_U32 HighDword, /* Upper Dword to be written */
24204+int Port) /* Select RAM buffer (Yukon-2 has 2 RAM buffers) */
24205+{
24206+ SK_OUT32(IoC, SELECT_RAM_BUFFER(Port, B3_RAM_ADDR), Addr);
24207+
24208+ /* Write Access is initiated by writing the upper Dword */
24209+ SK_OUT32(IoC, SELECT_RAM_BUFFER(Port, B3_RAM_DATA_LO), LowDword);
24210+ SK_OUT32(IoC, SELECT_RAM_BUFFER(Port, B3_RAM_DATA_HI), HighDword);
24211+}
24212+
24213+/******************************************************************************
24214+ *
24215+ * SkYuk2RestartRxBmu() - Restart Receive BMU on Yukon-2
24216+ *
24217+ * return:
24218+ * 0 o.k.
24219+ * 1 timeout
24220+ */
24221+int SkYuk2RestartRxBmu(
24222+SK_AC *pAC, /* Adapter Context */
24223+SK_IOC IoC, /* I/O Context */
24224+int Port) /* Port Index (MAC_1 + n) */
24225+{
24226+ SK_U16 Word;
24227+ SK_U16 MacCtrl;
24228+ SK_U16 RxCtrl;
24229+ SK_U16 FlushMask;
24230+ SK_U16 FlushTrsh;
24231+ SK_U32 RamAdr;
24232+ SK_U32 StartTime;
24233+ SK_U32 CurrTime;
24234+ SK_U32 Delta;
24235+ SK_U32 TimeOut;
24236+ SK_GEPORT *pPrt; /* GIni Port struct pointer */
24237+ int Rtv;
24238+
24239+ Rtv = 0;
24240+
24241+ pPrt = &pAC->GIni.GP[Port];
24242+
24243+/*
24244+ 1. save Rx MAC FIFO Flush Mask and Rx MAC FIFO Flush Threshold
24245+ 2. save GMAC Rx Control Register
24246+ 3. re-initialize MAC Rx FIFO, Rx RAM Buffer Queue, PCI Rx FIFO,
24247+ Rx BMU and Rx Prefetch Unit of the link.
24248+ 4. set Rx MAC FIFO Flush Mask to 0xffff
24249+ set Rx MAC FIFO Flush Threshold to a high value, e.g. 0x20
24250+ 5. set GMAC to loopback mode and switch GMAC back to Rx/Tx enable
24251+ 6. clear Rx/Tx Frame Complete IRQ in Rx/T MAC FIFO Control Register
24252+ 7. send one packet with a size of 64bytes (size below flush threshold)
24253+ from TXA RAM Buffer Queue to set the rx_sop flop:
24254+ - set TxAQ Write Pointer to (packet size in qwords + 2)
24255+ - set TxAQ Level to (packet size in qwords + 2)
24256+ - write Internal Status Word 1 and 2 to TxAQ RAM Buffer Queue QWord 0,1
24257+ according to figure 61 on page 330 of Yukon-2 Spec.
24258+ - write MAC header with Destination Address = own MAC address to
24259+ TxAQ RAM Buffer Queue QWords 2 and 3
24260+ - set TxAQ Packet Counter to 1 -> packet is transmitted immediately
24261+ 8. poll GMAC IRQ Source Register for IRQ Rx/Tx Frame Complete
24262+ 9. restore GMAC Rx Control Register
24263+10. restore Rx MAC FIFO Flush Mask and Rx MAC FIFO Flush Threshold
24264+11. set GMAC back to GMII mode
24265+*/
24266+
24267+ /* save Rx GMAC FIFO Flush Mask */
24268+ SK_IN16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), &FlushMask);
24269+
24270+ /* save Rx GMAC FIFO Flush Threshold */
24271+ SK_IN16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), &FlushTrsh);
24272+
24273+ /* save GMAC Rx Control Register */
24274+ GM_IN16(IoC, Port, GM_RX_CTRL, &RxCtrl);
24275+
24276+ /* configure the GMAC FIFOs */
24277+ SkGeInitMacFifo(pAC, IoC, Port);
24278+
24279+ SkGeInitRamBufs(pAC, IoC, Port);
24280+
24281+ SkGeInitBmu(pAC, IoC, Port);
24282+
24283+ /* configure Rx GMAC FIFO */
24284+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), GMF_RX_CTRL_DEF);
24285+
24286+ /* set Rx GMAC FIFO Flush Mask */
24287+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), 0xffff);
24288+
24289+ /* set Rx GMAC FIFO Flush Threshold */
24290+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), 0x20);
24291+
24292+ /* set to promiscuous mode */
24293+ Word = RxCtrl & ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
24294+
24295+ /* set GMAC Rx Control Register */
24296+ GM_OUT16(IoC, Port, GM_RX_CTRL, Word);
24297+
24298+ /* get General Purpose Control */
24299+ GM_IN16(IoC, Port, GM_GP_CTRL, &MacCtrl);
24300+
24301+ /* enable MAC Loopback Mode*/
24302+ GM_OUT16(IoC, Port, GM_GP_CTRL, MacCtrl | GM_GPCR_LOOP_ENA);
24303+
24304+ /* enable MAC Loopback Mode and Rx/Tx */
24305+ GM_OUT16(IoC, Port, GM_GP_CTRL, MacCtrl | GM_GPCR_LOOP_ENA |
24306+ GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
24307+
24308+ /* clear GMAC IRQ Rx Frame Complete */
24309+ SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_CLI_RX_FC);
24310+
24311+ /* clear GMAC IRQ Tx Frame Complete */
24312+ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_CLI_TX_FC);
24313+
24314+ /* send one packet with a size of 64bytes from RAM buffer*/
24315+
24316+ RamAdr = pPrt->PXaQRamStart / 8;
24317+
24318+ SK_OUT32(IoC, RB_ADDR(pPrt->PXaQOff, RB_WP), RamAdr + 10);
24319+
24320+ SK_OUT32(IoC, RB_ADDR(pPrt->PXaQOff, RB_LEV), 10);
24321+
24322+ /* write 1st status quad word (packet end address in RAM, packet length */
24323+ SkGeRamWrite(pAC, IoC, RamAdr, (RamAdr + 9) << 16, 64, Port);
24324+
24325+ /* write 2nd status quad word */
24326+ SkGeRamWrite(pAC, IoC, RamAdr + 1, 0, 0, Port);
24327+
24328+ /* write DA to MAC header */
24329+ SkGeRamWrite(pAC, IoC, RamAdr + 2, *(SK_U32 *)&pPrt->PMacAddr[0],
24330+ *(SK_U32 *)&pPrt->PMacAddr[2], Port);
24331+
24332+ SK_OUT32(IoC, RB_ADDR(pPrt->PXaQOff, RB_PC), 1);
24333+
24334+ SK_IN32(IoC, GMAC_TI_ST_VAL, &StartTime);
24335+
24336+ /* set timeout to 10 ms */
24337+ TimeOut = HW_MS_TO_TICKS(pAC, 10);
24338+
24339+ do {
24340+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime);
24341+
24342+ if (CurrTime >= StartTime) {
24343+ Delta = CurrTime - StartTime;
24344+ }
24345+ else {
24346+ Delta = CurrTime + ~StartTime + 1;
24347+ }
24348+
24349+ if (Delta > TimeOut) {
24350+ Rtv = 1;
24351+ break;
24352+ }
24353+
24354+ /* read the GMAC Interrupt source register */
24355+ SK_IN16(IoC, MR_ADDR(Port, GMAC_IRQ_SRC), &Word);
24356+
24357+ } while ((Word & (GM_IS_TX_COMPL | GM_IS_RX_COMPL)) !=
24358+ (GM_IS_TX_COMPL | GM_IS_RX_COMPL));
24359+
24360+ /* disable MAC Loopback Mode and Rx/Tx */
24361+ GM_OUT16(IoC, Port, GM_GP_CTRL, MacCtrl);
24362+
24363+ /* restore GMAC Rx Control Register */
24364+ GM_OUT16(IoC, Port, GM_RX_CTRL, RxCtrl);
24365+
24366+ /* restore Rx GMAC FIFO Flush Mask */
24367+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), FlushMask);
24368+
24369+ /* restore Rx GMAC FIFO Flush Threshold */
24370+ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), FlushTrsh);
24371+
24372+ return(Rtv);
24373+
24374+} /* SkYuk2RestartRxBmu */
24375+#endif /* YUK2 && !SK_SLIM */
24376+
24377diff -ruN linux/drivers/net/sk98lin/skgemib.c linux-new/drivers/net/sk98lin/skgemib.c
24378--- linux/drivers/net/sk98lin/skgemib.c 2006-04-11 19:19:28.000000000 +0200
24379+++ linux-new/drivers/net/sk98lin/skgemib.c 2006-01-18 14:37:24.000000000 +0100
24380@@ -1,1082 +1,1264 @@
24381-/*****************************************************************************
24382- *
24383- * Name: skgemib.c
24384- * Project: GEnesis, PCI Gigabit Ethernet Adapter
24385- * Version: $Revision$
24386- * Date: $Date$
24387- * Purpose: Private Network Management Interface Management Database
24388- *
24389- ****************************************************************************/
24390-
24391-/******************************************************************************
24392- *
24393- * (C)Copyright 1998-2002 SysKonnect GmbH.
24394- * (C)Copyright 2002-2003 Marvell.
24395- *
24396- * This program is free software; you can redistribute it and/or modify
24397- * it under the terms of the GNU General Public License as published by
24398- * the Free Software Foundation; either version 2 of the License, or
24399- * (at your option) any later version.
24400- *
24401- * The information in this file is provided "AS IS" without warranty.
24402- *
24403- ******************************************************************************/
24404-
24405-/*
24406- * PRIVATE OID handler function prototypes
24407- */
24408-PNMI_STATIC int Addr(SK_AC *pAC, SK_IOC IoC, int action,
24409- SK_U32 Id, char *pBuf, unsigned int *pLen, SK_U32 Instance,
24410- unsigned int TableIndex, SK_U32 NetIndex);
24411-PNMI_STATIC int CsumStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24412- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24413- unsigned int TableIndex, SK_U32 NetIndex);
24414-PNMI_STATIC int General(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24415- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24416- unsigned int TableIndex, SK_U32 NetIndex);
24417-PNMI_STATIC int Mac8023Stat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24418- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24419- unsigned int TableIndex, SK_U32 NetIndex);
24420-PNMI_STATIC int MacPrivateConf(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24421- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24422- unsigned int TableIndex, SK_U32 NetIndex);
24423-PNMI_STATIC int MacPrivateStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24424- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24425- unsigned int TableIndex, SK_U32 NetIndex);
24426-PNMI_STATIC int Monitor(SK_AC *pAC, SK_IOC IoC, int action,
24427- SK_U32 Id, char *pBuf, unsigned int *pLen, SK_U32 Instance,
24428- unsigned int TableIndex, SK_U32 NetIndex);
24429-PNMI_STATIC int OidStruct(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24430- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24431- unsigned int TableIndex, SK_U32 NetIndex);
24432-PNMI_STATIC int Perform(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24433- char *pBuf, unsigned int* pLen, SK_U32 Instance,
24434- unsigned int TableIndex, SK_U32 NetIndex);
24435-PNMI_STATIC int Rlmt(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24436- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24437- unsigned int TableIndex, SK_U32 NetIndex);
24438-PNMI_STATIC int RlmtStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24439- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24440- unsigned int TableIndex, SK_U32 NetIndex);
24441-PNMI_STATIC int SensorStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24442- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24443- unsigned int TableIndex, SK_U32 NetIndex);
24444-PNMI_STATIC int Vpd(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24445- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24446- unsigned int TableIndex, SK_U32 NetIndex);
24447-PNMI_STATIC int Vct(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24448- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24449- unsigned int TableIndex, SK_U32 NetIndex);
24450-
24451-#ifdef SK_POWER_MGMT
24452-PNMI_STATIC int PowerManagement(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24453- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24454- unsigned int TableIndex, SK_U32 NetIndex);
24455-#endif /* SK_POWER_MGMT */
24456-
24457-#ifdef SK_DIAG_SUPPORT
24458-PNMI_STATIC int DiagActions(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
24459- char *pBuf, unsigned int *pLen, SK_U32 Instance,
24460- unsigned int TableIndex, SK_U32 NetIndex);
24461-#endif /* SK_DIAG_SUPPORT */
24462-
24463-
24464-/* defines *******************************************************************/
24465-#define ID_TABLE_SIZE (sizeof(IdTable)/sizeof(IdTable[0]))
24466-
24467-
24468-/* global variables **********************************************************/
24469-
24470-/*
24471- * Table to correlate OID with handler function and index to
24472- * hardware register stored in StatAddress if applicable.
24473- */
24474-PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTable[] = {
24475- {OID_GEN_XMIT_OK,
24476- 0,
24477- 0,
24478- 0,
24479- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX},
24480- {OID_GEN_RCV_OK,
24481- 0,
24482- 0,
24483- 0,
24484- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX},
24485- {OID_GEN_XMIT_ERROR,
24486- 0,
24487- 0,
24488- 0,
24489- SK_PNMI_RO, General, 0},
24490- {OID_GEN_RCV_ERROR,
24491- 0,
24492- 0,
24493- 0,
24494- SK_PNMI_RO, General, 0},
24495- {OID_GEN_RCV_NO_BUFFER,
24496- 0,
24497- 0,
24498- 0,
24499- SK_PNMI_RO, General, 0},
24500- {OID_GEN_DIRECTED_FRAMES_XMIT,
24501- 0,
24502- 0,
24503- 0,
24504- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_UNICAST},
24505- {OID_GEN_MULTICAST_FRAMES_XMIT,
24506- 0,
24507- 0,
24508- 0,
24509- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_MULTICAST},
24510- {OID_GEN_BROADCAST_FRAMES_XMIT,
24511- 0,
24512- 0,
24513- 0,
24514- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_BROADCAST},
24515- {OID_GEN_DIRECTED_FRAMES_RCV,
24516- 0,
24517- 0,
24518- 0,
24519- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_UNICAST},
24520- {OID_GEN_MULTICAST_FRAMES_RCV,
24521- 0,
24522- 0,
24523- 0,
24524- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_MULTICAST},
24525- {OID_GEN_BROADCAST_FRAMES_RCV,
24526- 0,
24527- 0,
24528- 0,
24529- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_BROADCAST},
24530- {OID_GEN_RCV_CRC_ERROR,
24531- 0,
24532- 0,
24533- 0,
24534- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_FCS},
24535- {OID_GEN_TRANSMIT_QUEUE_LENGTH,
24536- 0,
24537- 0,
24538- 0,
24539- SK_PNMI_RO, General, 0},
24540- {OID_802_3_PERMANENT_ADDRESS,
24541- 0,
24542- 0,
24543- 0,
24544- SK_PNMI_RO, Mac8023Stat, 0},
24545- {OID_802_3_CURRENT_ADDRESS,
24546- 0,
24547- 0,
24548- 0,
24549- SK_PNMI_RO, Mac8023Stat, 0},
24550- {OID_802_3_RCV_ERROR_ALIGNMENT,
24551- 0,
24552- 0,
24553- 0,
24554- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_FRAMING},
24555- {OID_802_3_XMIT_ONE_COLLISION,
24556- 0,
24557- 0,
24558- 0,
24559- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_SINGLE_COL},
24560- {OID_802_3_XMIT_MORE_COLLISIONS,
24561- 0,
24562- 0,
24563- 0,
24564- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_MULTI_COL},
24565- {OID_802_3_XMIT_DEFERRED,
24566- 0,
24567- 0,
24568- 0,
24569- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_DEFFERAL},
24570- {OID_802_3_XMIT_MAX_COLLISIONS,
24571- 0,
24572- 0,
24573- 0,
24574- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_EXCESS_COL},
24575- {OID_802_3_RCV_OVERRUN,
24576- 0,
24577- 0,
24578- 0,
24579- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_OVERFLOW},
24580- {OID_802_3_XMIT_UNDERRUN,
24581- 0,
24582- 0,
24583- 0,
24584- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_UNDERRUN},
24585- {OID_802_3_XMIT_TIMES_CRS_LOST,
24586- 0,
24587- 0,
24588- 0,
24589- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_CARRIER},
24590- {OID_802_3_XMIT_LATE_COLLISIONS,
24591- 0,
24592- 0,
24593- 0,
24594- SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_LATE_COL},
24595-#ifdef SK_POWER_MGMT
24596- {OID_PNP_CAPABILITIES,
24597- 0,
24598- 0,
24599- 0,
24600- SK_PNMI_RO, PowerManagement, 0},
24601- {OID_PNP_SET_POWER,
24602- 0,
24603- 0,
24604- 0,
24605- SK_PNMI_WO, PowerManagement, 0},
24606- {OID_PNP_QUERY_POWER,
24607- 0,
24608- 0,
24609- 0,
24610- SK_PNMI_RO, PowerManagement, 0},
24611- {OID_PNP_ADD_WAKE_UP_PATTERN,
24612- 0,
24613- 0,
24614- 0,
24615- SK_PNMI_WO, PowerManagement, 0},
24616- {OID_PNP_REMOVE_WAKE_UP_PATTERN,
24617- 0,
24618- 0,
24619- 0,
24620- SK_PNMI_WO, PowerManagement, 0},
24621- {OID_PNP_ENABLE_WAKE_UP,
24622- 0,
24623- 0,
24624- 0,
24625- SK_PNMI_RW, PowerManagement, 0},
24626-#endif /* SK_POWER_MGMT */
24627-#ifdef SK_DIAG_SUPPORT
24628- {OID_SKGE_DIAG_MODE,
24629- 0,
24630- 0,
24631- 0,
24632- SK_PNMI_RW, DiagActions, 0},
24633-#endif /* SK_DIAG_SUPPORT */
24634- {OID_SKGE_MDB_VERSION,
24635- 1,
24636- 0,
24637- SK_PNMI_MAI_OFF(MgmtDBVersion),
24638- SK_PNMI_RO, General, 0},
24639- {OID_SKGE_SUPPORTED_LIST,
24640- 0,
24641- 0,
24642- 0,
24643- SK_PNMI_RO, General, 0},
24644- {OID_SKGE_ALL_DATA,
24645- 0,
24646- 0,
24647- 0,
24648- SK_PNMI_RW, OidStruct, 0},
24649- {OID_SKGE_VPD_FREE_BYTES,
24650- 1,
24651- 0,
24652- SK_PNMI_MAI_OFF(VpdFreeBytes),
24653- SK_PNMI_RO, Vpd, 0},
24654- {OID_SKGE_VPD_ENTRIES_LIST,
24655- 1,
24656- 0,
24657- SK_PNMI_MAI_OFF(VpdEntriesList),
24658- SK_PNMI_RO, Vpd, 0},
24659- {OID_SKGE_VPD_ENTRIES_NUMBER,
24660- 1,
24661- 0,
24662- SK_PNMI_MAI_OFF(VpdEntriesNumber),
24663- SK_PNMI_RO, Vpd, 0},
24664- {OID_SKGE_VPD_KEY,
24665- SK_PNMI_VPD_ENTRIES,
24666- sizeof(SK_PNMI_VPD),
24667- SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdKey),
24668- SK_PNMI_RO, Vpd, 0},
24669- {OID_SKGE_VPD_VALUE,
24670- SK_PNMI_VPD_ENTRIES,
24671- sizeof(SK_PNMI_VPD),
24672- SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdValue),
24673- SK_PNMI_RO, Vpd, 0},
24674- {OID_SKGE_VPD_ACCESS,
24675- SK_PNMI_VPD_ENTRIES,
24676- sizeof(SK_PNMI_VPD),
24677- SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdAccess),
24678- SK_PNMI_RO, Vpd, 0},
24679- {OID_SKGE_VPD_ACTION,
24680- SK_PNMI_VPD_ENTRIES,
24681- sizeof(SK_PNMI_VPD),
24682- SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdAction),
24683- SK_PNMI_RW, Vpd, 0},
24684- {OID_SKGE_PORT_NUMBER,
24685- 1,
24686- 0,
24687- SK_PNMI_MAI_OFF(PortNumber),
24688- SK_PNMI_RO, General, 0},
24689- {OID_SKGE_DEVICE_TYPE,
24690- 1,
24691- 0,
24692- SK_PNMI_MAI_OFF(DeviceType),
24693- SK_PNMI_RO, General, 0},
24694- {OID_SKGE_DRIVER_DESCR,
24695- 1,
24696- 0,
24697- SK_PNMI_MAI_OFF(DriverDescr),
24698- SK_PNMI_RO, General, 0},
24699- {OID_SKGE_DRIVER_VERSION,
24700- 1,
24701- 0,
24702- SK_PNMI_MAI_OFF(DriverVersion),
24703- SK_PNMI_RO, General, 0},
24704- {OID_SKGE_DRIVER_RELDATE,
24705- 1,
24706- 0,
24707- SK_PNMI_MAI_OFF(DriverReleaseDate),
24708- SK_PNMI_RO, General, 0},
24709- {OID_SKGE_DRIVER_FILENAME,
24710- 1,
24711- 0,
24712- SK_PNMI_MAI_OFF(DriverFileName),
24713- SK_PNMI_RO, General, 0},
24714- {OID_SKGE_HW_DESCR,
24715- 1,
24716- 0,
24717- SK_PNMI_MAI_OFF(HwDescr),
24718- SK_PNMI_RO, General, 0},
24719- {OID_SKGE_HW_VERSION,
24720- 1,
24721- 0,
24722- SK_PNMI_MAI_OFF(HwVersion),
24723- SK_PNMI_RO, General, 0},
24724- {OID_SKGE_CHIPSET,
24725- 1,
24726- 0,
24727- SK_PNMI_MAI_OFF(Chipset),
24728- SK_PNMI_RO, General, 0},
24729- {OID_SKGE_CHIPID,
24730- 1,
24731- 0,
24732- SK_PNMI_MAI_OFF(ChipId),
24733- SK_PNMI_RO, General, 0},
24734- {OID_SKGE_RAMSIZE,
24735- 1,
24736- 0,
24737- SK_PNMI_MAI_OFF(RamSize),
24738- SK_PNMI_RO, General, 0},
24739- {OID_SKGE_VAUXAVAIL,
24740- 1,
24741- 0,
24742- SK_PNMI_MAI_OFF(VauxAvail),
24743- SK_PNMI_RO, General, 0},
24744- {OID_SKGE_ACTION,
24745- 1,
24746- 0,
24747- SK_PNMI_MAI_OFF(Action),
24748- SK_PNMI_RW, Perform, 0},
24749- {OID_SKGE_RESULT,
24750- 1,
24751- 0,
24752- SK_PNMI_MAI_OFF(TestResult),
24753- SK_PNMI_RO, General, 0},
24754- {OID_SKGE_BUS_TYPE,
24755- 1,
24756- 0,
24757- SK_PNMI_MAI_OFF(BusType),
24758- SK_PNMI_RO, General, 0},
24759- {OID_SKGE_BUS_SPEED,
24760- 1,
24761- 0,
24762- SK_PNMI_MAI_OFF(BusSpeed),
24763- SK_PNMI_RO, General, 0},
24764- {OID_SKGE_BUS_WIDTH,
24765- 1,
24766- 0,
24767- SK_PNMI_MAI_OFF(BusWidth),
24768- SK_PNMI_RO, General, 0},
24769- {OID_SKGE_TX_SW_QUEUE_LEN,
24770- 1,
24771- 0,
24772- SK_PNMI_MAI_OFF(TxSwQueueLen),
24773- SK_PNMI_RO, General, 0},
24774- {OID_SKGE_TX_SW_QUEUE_MAX,
24775- 1,
24776- 0,
24777- SK_PNMI_MAI_OFF(TxSwQueueMax),
24778- SK_PNMI_RO, General, 0},
24779- {OID_SKGE_TX_RETRY,
24780- 1,
24781- 0,
24782- SK_PNMI_MAI_OFF(TxRetryCts),
24783- SK_PNMI_RO, General, 0},
24784- {OID_SKGE_RX_INTR_CTS,
24785- 1,
24786- 0,
24787- SK_PNMI_MAI_OFF(RxIntrCts),
24788- SK_PNMI_RO, General, 0},
24789- {OID_SKGE_TX_INTR_CTS,
24790- 1,
24791- 0,
24792- SK_PNMI_MAI_OFF(TxIntrCts),
24793- SK_PNMI_RO, General, 0},
24794- {OID_SKGE_RX_NO_BUF_CTS,
24795- 1,
24796- 0,
24797- SK_PNMI_MAI_OFF(RxNoBufCts),
24798- SK_PNMI_RO, General, 0},
24799- {OID_SKGE_TX_NO_BUF_CTS,
24800- 1,
24801- 0,
24802- SK_PNMI_MAI_OFF(TxNoBufCts),
24803- SK_PNMI_RO, General, 0},
24804- {OID_SKGE_TX_USED_DESCR_NO,
24805- 1,
24806- 0,
24807- SK_PNMI_MAI_OFF(TxUsedDescrNo),
24808- SK_PNMI_RO, General, 0},
24809- {OID_SKGE_RX_DELIVERED_CTS,
24810- 1,
24811- 0,
24812- SK_PNMI_MAI_OFF(RxDeliveredCts),
24813- SK_PNMI_RO, General, 0},
24814- {OID_SKGE_RX_OCTETS_DELIV_CTS,
24815- 1,
24816- 0,
24817- SK_PNMI_MAI_OFF(RxOctetsDeliveredCts),
24818- SK_PNMI_RO, General, 0},
24819- {OID_SKGE_RX_HW_ERROR_CTS,
24820- 1,
24821- 0,
24822- SK_PNMI_MAI_OFF(RxHwErrorsCts),
24823- SK_PNMI_RO, General, 0},
24824- {OID_SKGE_TX_HW_ERROR_CTS,
24825- 1,
24826- 0,
24827- SK_PNMI_MAI_OFF(TxHwErrorsCts),
24828- SK_PNMI_RO, General, 0},
24829- {OID_SKGE_IN_ERRORS_CTS,
24830- 1,
24831- 0,
24832- SK_PNMI_MAI_OFF(InErrorsCts),
24833- SK_PNMI_RO, General, 0},
24834- {OID_SKGE_OUT_ERROR_CTS,
24835- 1,
24836- 0,
24837- SK_PNMI_MAI_OFF(OutErrorsCts),
24838- SK_PNMI_RO, General, 0},
24839- {OID_SKGE_ERR_RECOVERY_CTS,
24840- 1,
24841- 0,
24842- SK_PNMI_MAI_OFF(ErrRecoveryCts),
24843- SK_PNMI_RO, General, 0},
24844- {OID_SKGE_SYSUPTIME,
24845- 1,
24846- 0,
24847- SK_PNMI_MAI_OFF(SysUpTime),
24848- SK_PNMI_RO, General, 0},
24849- {OID_SKGE_SENSOR_NUMBER,
24850- 1,
24851- 0,
24852- SK_PNMI_MAI_OFF(SensorNumber),
24853- SK_PNMI_RO, General, 0},
24854- {OID_SKGE_SENSOR_INDEX,
24855- SK_PNMI_SENSOR_ENTRIES,
24856- sizeof(SK_PNMI_SENSOR),
24857- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorIndex),
24858- SK_PNMI_RO, SensorStat, 0},
24859- {OID_SKGE_SENSOR_DESCR,
24860- SK_PNMI_SENSOR_ENTRIES,
24861- sizeof(SK_PNMI_SENSOR),
24862- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorDescr),
24863- SK_PNMI_RO, SensorStat, 0},
24864- {OID_SKGE_SENSOR_TYPE,
24865- SK_PNMI_SENSOR_ENTRIES,
24866- sizeof(SK_PNMI_SENSOR),
24867- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorType),
24868- SK_PNMI_RO, SensorStat, 0},
24869- {OID_SKGE_SENSOR_VALUE,
24870- SK_PNMI_SENSOR_ENTRIES,
24871- sizeof(SK_PNMI_SENSOR),
24872- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorValue),
24873- SK_PNMI_RO, SensorStat, 0},
24874- {OID_SKGE_SENSOR_WAR_THRES_LOW,
24875- SK_PNMI_SENSOR_ENTRIES,
24876- sizeof(SK_PNMI_SENSOR),
24877- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningThresholdLow),
24878- SK_PNMI_RO, SensorStat, 0},
24879- {OID_SKGE_SENSOR_WAR_THRES_UPP,
24880- SK_PNMI_SENSOR_ENTRIES,
24881- sizeof(SK_PNMI_SENSOR),
24882- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningThresholdHigh),
24883- SK_PNMI_RO, SensorStat, 0},
24884- {OID_SKGE_SENSOR_ERR_THRES_LOW,
24885- SK_PNMI_SENSOR_ENTRIES,
24886- sizeof(SK_PNMI_SENSOR),
24887- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorThresholdLow),
24888- SK_PNMI_RO, SensorStat, 0},
24889- {OID_SKGE_SENSOR_ERR_THRES_UPP,
24890- SK_PNMI_SENSOR_ENTRIES,
24891- sizeof(SK_PNMI_SENSOR),
24892- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorThresholdHigh),
24893- SK_PNMI_RO, SensorStat, 0},
24894- {OID_SKGE_SENSOR_STATUS,
24895- SK_PNMI_SENSOR_ENTRIES,
24896- sizeof(SK_PNMI_SENSOR),
24897- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorStatus),
24898- SK_PNMI_RO, SensorStat, 0},
24899- {OID_SKGE_SENSOR_WAR_CTS,
24900- SK_PNMI_SENSOR_ENTRIES,
24901- sizeof(SK_PNMI_SENSOR),
24902- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningCts),
24903- SK_PNMI_RO, SensorStat, 0},
24904- {OID_SKGE_SENSOR_ERR_CTS,
24905- SK_PNMI_SENSOR_ENTRIES,
24906- sizeof(SK_PNMI_SENSOR),
24907- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorCts),
24908- SK_PNMI_RO, SensorStat, 0},
24909- {OID_SKGE_SENSOR_WAR_TIME,
24910- SK_PNMI_SENSOR_ENTRIES,
24911- sizeof(SK_PNMI_SENSOR),
24912- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningTimestamp),
24913- SK_PNMI_RO, SensorStat, 0},
24914- {OID_SKGE_SENSOR_ERR_TIME,
24915- SK_PNMI_SENSOR_ENTRIES,
24916- sizeof(SK_PNMI_SENSOR),
24917- SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorTimestamp),
24918- SK_PNMI_RO, SensorStat, 0},
24919- {OID_SKGE_CHKSM_NUMBER,
24920- 1,
24921- 0,
24922- SK_PNMI_MAI_OFF(ChecksumNumber),
24923- SK_PNMI_RO, General, 0},
24924- {OID_SKGE_CHKSM_RX_OK_CTS,
24925- SKCS_NUM_PROTOCOLS,
24926- sizeof(SK_PNMI_CHECKSUM),
24927- SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxOkCts),
24928- SK_PNMI_RO, CsumStat, 0},
24929- {OID_SKGE_CHKSM_RX_UNABLE_CTS,
24930- SKCS_NUM_PROTOCOLS,
24931- sizeof(SK_PNMI_CHECKSUM),
24932- SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxUnableCts),
24933- SK_PNMI_RO, CsumStat, 0},
24934- {OID_SKGE_CHKSM_RX_ERR_CTS,
24935- SKCS_NUM_PROTOCOLS,
24936- sizeof(SK_PNMI_CHECKSUM),
24937- SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxErrCts),
24938- SK_PNMI_RO, CsumStat, 0},
24939- {OID_SKGE_CHKSM_TX_OK_CTS,
24940- SKCS_NUM_PROTOCOLS,
24941- sizeof(SK_PNMI_CHECKSUM),
24942- SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumTxOkCts),
24943- SK_PNMI_RO, CsumStat, 0},
24944- {OID_SKGE_CHKSM_TX_UNABLE_CTS,
24945- SKCS_NUM_PROTOCOLS,
24946- sizeof(SK_PNMI_CHECKSUM),
24947- SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumTxUnableCts),
24948- SK_PNMI_RO, CsumStat, 0},
24949- {OID_SKGE_STAT_TX,
24950- SK_PNMI_MAC_ENTRIES,
24951- sizeof(SK_PNMI_STAT),
24952- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxOkCts),
24953- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX},
24954- {OID_SKGE_STAT_TX_OCTETS,
24955- SK_PNMI_MAC_ENTRIES,
24956- sizeof(SK_PNMI_STAT),
24957- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxOctetsOkCts),
24958- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_OCTET},
24959- {OID_SKGE_STAT_TX_BROADCAST,
24960- SK_PNMI_MAC_ENTRIES,
24961- sizeof(SK_PNMI_STAT),
24962- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxBroadcastOkCts),
24963- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_BROADCAST},
24964- {OID_SKGE_STAT_TX_MULTICAST,
24965- SK_PNMI_MAC_ENTRIES,
24966- sizeof(SK_PNMI_STAT),
24967- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMulticastOkCts),
24968- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MULTICAST},
24969- {OID_SKGE_STAT_TX_UNICAST,
24970- SK_PNMI_MAC_ENTRIES,
24971- sizeof(SK_PNMI_STAT),
24972- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxUnicastOkCts),
24973- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_UNICAST},
24974- {OID_SKGE_STAT_TX_LONGFRAMES,
24975- SK_PNMI_MAC_ENTRIES,
24976- sizeof(SK_PNMI_STAT),
24977- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxLongFramesCts),
24978- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_LONGFRAMES},
24979- {OID_SKGE_STAT_TX_BURST,
24980- SK_PNMI_MAC_ENTRIES,
24981- sizeof(SK_PNMI_STAT),
24982- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxBurstCts),
24983- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_BURST},
24984- {OID_SKGE_STAT_TX_PFLOWC,
24985- SK_PNMI_MAC_ENTRIES,
24986- sizeof(SK_PNMI_STAT),
24987- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxPauseMacCtrlCts),
24988- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_PMACC},
24989- {OID_SKGE_STAT_TX_FLOWC,
24990- SK_PNMI_MAC_ENTRIES,
24991- sizeof(SK_PNMI_STAT),
24992- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMacCtrlCts),
24993- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MACC},
24994- {OID_SKGE_STAT_TX_SINGLE_COL,
24995- SK_PNMI_MAC_ENTRIES,
24996- sizeof(SK_PNMI_STAT),
24997- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSingleCollisionCts),
24998- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SINGLE_COL},
24999- {OID_SKGE_STAT_TX_MULTI_COL,
25000- SK_PNMI_MAC_ENTRIES,
25001- sizeof(SK_PNMI_STAT),
25002- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMultipleCollisionCts),
25003- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MULTI_COL},
25004- {OID_SKGE_STAT_TX_EXCESS_COL,
25005- SK_PNMI_MAC_ENTRIES,
25006- sizeof(SK_PNMI_STAT),
25007- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxExcessiveCollisionCts),
25008- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_EXCESS_COL},
25009- {OID_SKGE_STAT_TX_LATE_COL,
25010- SK_PNMI_MAC_ENTRIES,
25011- sizeof(SK_PNMI_STAT),
25012- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxLateCollisionCts),
25013- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_LATE_COL},
25014- {OID_SKGE_STAT_TX_DEFFERAL,
25015- SK_PNMI_MAC_ENTRIES,
25016- sizeof(SK_PNMI_STAT),
25017- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxDeferralCts),
25018- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_DEFFERAL},
25019- {OID_SKGE_STAT_TX_EXCESS_DEF,
25020- SK_PNMI_MAC_ENTRIES,
25021- sizeof(SK_PNMI_STAT),
25022- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxExcessiveDeferralCts),
25023- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_EXCESS_DEF},
25024- {OID_SKGE_STAT_TX_UNDERRUN,
25025- SK_PNMI_MAC_ENTRIES,
25026- sizeof(SK_PNMI_STAT),
25027- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxFifoUnderrunCts),
25028- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_UNDERRUN},
25029- {OID_SKGE_STAT_TX_CARRIER,
25030- SK_PNMI_MAC_ENTRIES,
25031- sizeof(SK_PNMI_STAT),
25032- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxCarrierCts),
25033- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_CARRIER},
25034-/* {OID_SKGE_STAT_TX_UTIL,
25035- SK_PNMI_MAC_ENTRIES,
25036- sizeof(SK_PNMI_STAT),
25037- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxUtilization),
25038- SK_PNMI_RO, MacPrivateStat, (SK_U16)(-1)}, */
25039- {OID_SKGE_STAT_TX_64,
25040- SK_PNMI_MAC_ENTRIES,
25041- sizeof(SK_PNMI_STAT),
25042- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx64Cts),
25043- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_64},
25044- {OID_SKGE_STAT_TX_127,
25045- SK_PNMI_MAC_ENTRIES,
25046- sizeof(SK_PNMI_STAT),
25047- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx127Cts),
25048- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_127},
25049- {OID_SKGE_STAT_TX_255,
25050- SK_PNMI_MAC_ENTRIES,
25051- sizeof(SK_PNMI_STAT),
25052- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx255Cts),
25053- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_255},
25054- {OID_SKGE_STAT_TX_511,
25055- SK_PNMI_MAC_ENTRIES,
25056- sizeof(SK_PNMI_STAT),
25057- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx511Cts),
25058- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_511},
25059- {OID_SKGE_STAT_TX_1023,
25060- SK_PNMI_MAC_ENTRIES,
25061- sizeof(SK_PNMI_STAT),
25062- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx1023Cts),
25063- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_1023},
25064- {OID_SKGE_STAT_TX_MAX,
25065- SK_PNMI_MAC_ENTRIES,
25066- sizeof(SK_PNMI_STAT),
25067- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMaxCts),
25068- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MAX},
25069- {OID_SKGE_STAT_TX_SYNC,
25070- SK_PNMI_MAC_ENTRIES,
25071- sizeof(SK_PNMI_STAT),
25072- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSyncCts),
25073- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SYNC},
25074- {OID_SKGE_STAT_TX_SYNC_OCTETS,
25075- SK_PNMI_MAC_ENTRIES,
25076- sizeof(SK_PNMI_STAT),
25077- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSyncOctetsCts),
25078- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SYNC_OCTET},
25079- {OID_SKGE_STAT_RX,
25080- SK_PNMI_MAC_ENTRIES,
25081- sizeof(SK_PNMI_STAT),
25082- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxOkCts),
25083- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX},
25084- {OID_SKGE_STAT_RX_OCTETS,
25085- SK_PNMI_MAC_ENTRIES,
25086- sizeof(SK_PNMI_STAT),
25087- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxOctetsOkCts),
25088- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_OCTET},
25089- {OID_SKGE_STAT_RX_BROADCAST,
25090- SK_PNMI_MAC_ENTRIES,
25091- sizeof(SK_PNMI_STAT),
25092- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxBroadcastOkCts),
25093- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_BROADCAST},
25094- {OID_SKGE_STAT_RX_MULTICAST,
25095- SK_PNMI_MAC_ENTRIES,
25096- sizeof(SK_PNMI_STAT),
25097- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMulticastOkCts),
25098- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MULTICAST},
25099- {OID_SKGE_STAT_RX_UNICAST,
25100- SK_PNMI_MAC_ENTRIES,
25101- sizeof(SK_PNMI_STAT),
25102- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxUnicastOkCts),
25103- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_UNICAST},
25104- {OID_SKGE_STAT_RX_LONGFRAMES,
25105- SK_PNMI_MAC_ENTRIES,
25106- sizeof(SK_PNMI_STAT),
25107- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxLongFramesCts),
25108- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_LONGFRAMES},
25109- {OID_SKGE_STAT_RX_PFLOWC,
25110- SK_PNMI_MAC_ENTRIES,
25111- sizeof(SK_PNMI_STAT),
25112- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxPauseMacCtrlCts),
25113- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_PMACC},
25114- {OID_SKGE_STAT_RX_FLOWC,
25115- SK_PNMI_MAC_ENTRIES,
25116- sizeof(SK_PNMI_STAT),
25117- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMacCtrlCts),
25118- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MACC},
25119- {OID_SKGE_STAT_RX_PFLOWC_ERR,
25120- SK_PNMI_MAC_ENTRIES,
25121- sizeof(SK_PNMI_STAT),
25122- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxPauseMacCtrlErrorCts),
25123- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_PMACC_ERR},
25124- {OID_SKGE_STAT_RX_FLOWC_UNKWN,
25125- SK_PNMI_MAC_ENTRIES,
25126- sizeof(SK_PNMI_STAT),
25127- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMacCtrlUnknownCts),
25128- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MACC_UNKWN},
25129- {OID_SKGE_STAT_RX_BURST,
25130- SK_PNMI_MAC_ENTRIES,
25131- sizeof(SK_PNMI_STAT),
25132- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxBurstCts),
25133- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_BURST},
25134- {OID_SKGE_STAT_RX_MISSED,
25135- SK_PNMI_MAC_ENTRIES,
25136- sizeof(SK_PNMI_STAT),
25137- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMissedCts),
25138- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MISSED},
25139- {OID_SKGE_STAT_RX_FRAMING,
25140- SK_PNMI_MAC_ENTRIES,
25141- sizeof(SK_PNMI_STAT),
25142- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFramingCts),
25143- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_FRAMING},
25144- {OID_SKGE_STAT_RX_OVERFLOW,
25145- SK_PNMI_MAC_ENTRIES,
25146- sizeof(SK_PNMI_STAT),
25147- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFifoOverflowCts),
25148- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_OVERFLOW},
25149- {OID_SKGE_STAT_RX_JABBER,
25150- SK_PNMI_MAC_ENTRIES,
25151- sizeof(SK_PNMI_STAT),
25152- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxJabberCts),
25153- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_JABBER},
25154- {OID_SKGE_STAT_RX_CARRIER,
25155- SK_PNMI_MAC_ENTRIES,
25156- sizeof(SK_PNMI_STAT),
25157- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxCarrierCts),
25158- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_CARRIER},
25159- {OID_SKGE_STAT_RX_IR_LENGTH,
25160- SK_PNMI_MAC_ENTRIES,
25161- sizeof(SK_PNMI_STAT),
25162- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxIRLengthCts),
25163- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_IRLENGTH},
25164- {OID_SKGE_STAT_RX_SYMBOL,
25165- SK_PNMI_MAC_ENTRIES,
25166- sizeof(SK_PNMI_STAT),
25167- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxSymbolCts),
25168- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_SYMBOL},
25169- {OID_SKGE_STAT_RX_SHORTS,
25170- SK_PNMI_MAC_ENTRIES,
25171- sizeof(SK_PNMI_STAT),
25172- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxShortsCts),
25173- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_SHORTS},
25174- {OID_SKGE_STAT_RX_RUNT,
25175- SK_PNMI_MAC_ENTRIES,
25176- sizeof(SK_PNMI_STAT),
25177- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxRuntCts),
25178- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_RUNT},
25179- {OID_SKGE_STAT_RX_CEXT,
25180- SK_PNMI_MAC_ENTRIES,
25181- sizeof(SK_PNMI_STAT),
25182- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxCextCts),
25183- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_CEXT},
25184- {OID_SKGE_STAT_RX_TOO_LONG,
25185- SK_PNMI_MAC_ENTRIES,
25186- sizeof(SK_PNMI_STAT),
25187- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxTooLongCts),
25188- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_TOO_LONG},
25189- {OID_SKGE_STAT_RX_FCS,
25190- SK_PNMI_MAC_ENTRIES,
25191- sizeof(SK_PNMI_STAT),
25192- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFcsCts),
25193- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_FCS},
25194-/* {OID_SKGE_STAT_RX_UTIL,
25195- SK_PNMI_MAC_ENTRIES,
25196- sizeof(SK_PNMI_STAT),
25197- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxUtilization),
25198- SK_PNMI_RO, MacPrivateStat, (SK_U16)(-1)}, */
25199- {OID_SKGE_STAT_RX_64,
25200- SK_PNMI_MAC_ENTRIES,
25201- sizeof(SK_PNMI_STAT),
25202- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx64Cts),
25203- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_64},
25204- {OID_SKGE_STAT_RX_127,
25205- SK_PNMI_MAC_ENTRIES,
25206- sizeof(SK_PNMI_STAT),
25207- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx127Cts),
25208- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_127},
25209- {OID_SKGE_STAT_RX_255,
25210- SK_PNMI_MAC_ENTRIES,
25211- sizeof(SK_PNMI_STAT),
25212- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx255Cts),
25213- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_255},
25214- {OID_SKGE_STAT_RX_511,
25215- SK_PNMI_MAC_ENTRIES,
25216- sizeof(SK_PNMI_STAT),
25217- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx511Cts),
25218- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_511},
25219- {OID_SKGE_STAT_RX_1023,
25220- SK_PNMI_MAC_ENTRIES,
25221- sizeof(SK_PNMI_STAT),
25222- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx1023Cts),
25223- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_1023},
25224- {OID_SKGE_STAT_RX_MAX,
25225- SK_PNMI_MAC_ENTRIES,
25226- sizeof(SK_PNMI_STAT),
25227- SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMaxCts),
25228- SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MAX},
25229- {OID_SKGE_PHYS_CUR_ADDR,
25230- SK_PNMI_MAC_ENTRIES,
25231- sizeof(SK_PNMI_CONF),
25232- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfMacCurrentAddr),
25233- SK_PNMI_RW, Addr, 0},
25234- {OID_SKGE_PHYS_FAC_ADDR,
25235- SK_PNMI_MAC_ENTRIES,
25236- sizeof(SK_PNMI_CONF),
25237- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfMacFactoryAddr),
25238- SK_PNMI_RO, Addr, 0},
25239- {OID_SKGE_PMD,
25240- SK_PNMI_MAC_ENTRIES,
25241- sizeof(SK_PNMI_CONF),
25242- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPMD),
25243- SK_PNMI_RO, MacPrivateConf, 0},
25244- {OID_SKGE_CONNECTOR,
25245- SK_PNMI_MAC_ENTRIES,
25246- sizeof(SK_PNMI_CONF),
25247- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfConnector),
25248- SK_PNMI_RO, MacPrivateConf, 0},
25249- {OID_SKGE_PHY_TYPE,
25250- SK_PNMI_MAC_ENTRIES,
25251- sizeof(SK_PNMI_CONF),
25252- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType),
25253- SK_PNMI_RO, MacPrivateConf, 0},
25254-#ifdef SK_PHY_LP_MODE
25255- {OID_SKGE_PHY_LP_MODE,
25256- SK_PNMI_MAC_ENTRIES,
25257- sizeof(SK_PNMI_CONF),
25258- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyMode),
25259- SK_PNMI_RW, MacPrivateConf, 0},
25260-#endif
25261- {OID_SKGE_LINK_CAP,
25262- SK_PNMI_MAC_ENTRIES,
25263- sizeof(SK_PNMI_CONF),
25264- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkCapability),
25265- SK_PNMI_RO, MacPrivateConf, 0},
25266- {OID_SKGE_LINK_MODE,
25267- SK_PNMI_MAC_ENTRIES,
25268- sizeof(SK_PNMI_CONF),
25269- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkMode),
25270- SK_PNMI_RW, MacPrivateConf, 0},
25271- {OID_SKGE_LINK_MODE_STATUS,
25272- SK_PNMI_MAC_ENTRIES,
25273- sizeof(SK_PNMI_CONF),
25274- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkModeStatus),
25275- SK_PNMI_RO, MacPrivateConf, 0},
25276- {OID_SKGE_LINK_STATUS,
25277- SK_PNMI_MAC_ENTRIES,
25278- sizeof(SK_PNMI_CONF),
25279- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkStatus),
25280- SK_PNMI_RO, MacPrivateConf, 0},
25281- {OID_SKGE_FLOWCTRL_CAP,
25282- SK_PNMI_MAC_ENTRIES,
25283- sizeof(SK_PNMI_CONF),
25284- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlCapability),
25285- SK_PNMI_RO, MacPrivateConf, 0},
25286- {OID_SKGE_FLOWCTRL_MODE,
25287- SK_PNMI_MAC_ENTRIES,
25288- sizeof(SK_PNMI_CONF),
25289- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlMode),
25290- SK_PNMI_RW, MacPrivateConf, 0},
25291- {OID_SKGE_FLOWCTRL_STATUS,
25292- SK_PNMI_MAC_ENTRIES,
25293- sizeof(SK_PNMI_CONF),
25294- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlStatus),
25295- SK_PNMI_RO, MacPrivateConf, 0},
25296- {OID_SKGE_PHY_OPERATION_CAP,
25297- SK_PNMI_MAC_ENTRIES,
25298- sizeof(SK_PNMI_CONF),
25299- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationCapability),
25300- SK_PNMI_RO, MacPrivateConf, 0},
25301- {OID_SKGE_PHY_OPERATION_MODE,
25302- SK_PNMI_MAC_ENTRIES,
25303- sizeof(SK_PNMI_CONF),
25304- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationMode),
25305- SK_PNMI_RW, MacPrivateConf, 0},
25306- {OID_SKGE_PHY_OPERATION_STATUS,
25307- SK_PNMI_MAC_ENTRIES,
25308- sizeof(SK_PNMI_CONF),
25309- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationStatus),
25310- SK_PNMI_RO, MacPrivateConf, 0},
25311- {OID_SKGE_SPEED_CAP,
25312- SK_PNMI_MAC_ENTRIES,
25313- sizeof(SK_PNMI_CONF),
25314- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfSpeedCapability),
25315- SK_PNMI_RO, MacPrivateConf, 0},
25316- {OID_SKGE_SPEED_MODE,
25317- SK_PNMI_MAC_ENTRIES,
25318- sizeof(SK_PNMI_CONF),
25319- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfSpeedMode),
25320- SK_PNMI_RW, MacPrivateConf, 0},
25321- {OID_SKGE_SPEED_STATUS,
25322- SK_PNMI_MAC_ENTRIES,
25323- sizeof(SK_PNMI_CONF),
25324- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfSpeedStatus),
25325- SK_PNMI_RO, MacPrivateConf, 0},
25326- {OID_SKGE_TRAP,
25327- 1,
25328- 0,
25329- SK_PNMI_MAI_OFF(Trap),
25330- SK_PNMI_RO, General, 0},
25331- {OID_SKGE_TRAP_NUMBER,
25332- 1,
25333- 0,
25334- SK_PNMI_MAI_OFF(TrapNumber),
25335- SK_PNMI_RO, General, 0},
25336- {OID_SKGE_RLMT_MODE,
25337- 1,
25338- 0,
25339- SK_PNMI_MAI_OFF(RlmtMode),
25340- SK_PNMI_RW, Rlmt, 0},
25341- {OID_SKGE_RLMT_PORT_NUMBER,
25342- 1,
25343- 0,
25344- SK_PNMI_MAI_OFF(RlmtPortNumber),
25345- SK_PNMI_RO, Rlmt, 0},
25346- {OID_SKGE_RLMT_PORT_ACTIVE,
25347- 1,
25348- 0,
25349- SK_PNMI_MAI_OFF(RlmtPortActive),
25350- SK_PNMI_RO, Rlmt, 0},
25351- {OID_SKGE_RLMT_PORT_PREFERRED,
25352- 1,
25353- 0,
25354- SK_PNMI_MAI_OFF(RlmtPortPreferred),
25355- SK_PNMI_RW, Rlmt, 0},
25356- {OID_SKGE_RLMT_CHANGE_CTS,
25357- 1,
25358- 0,
25359- SK_PNMI_MAI_OFF(RlmtChangeCts),
25360- SK_PNMI_RO, Rlmt, 0},
25361- {OID_SKGE_RLMT_CHANGE_TIME,
25362- 1,
25363- 0,
25364- SK_PNMI_MAI_OFF(RlmtChangeTime),
25365- SK_PNMI_RO, Rlmt, 0},
25366- {OID_SKGE_RLMT_CHANGE_ESTIM,
25367- 1,
25368- 0,
25369- SK_PNMI_MAI_OFF(RlmtChangeEstimate),
25370- SK_PNMI_RO, Rlmt, 0},
25371- {OID_SKGE_RLMT_CHANGE_THRES,
25372- 1,
25373- 0,
25374- SK_PNMI_MAI_OFF(RlmtChangeThreshold),
25375- SK_PNMI_RW, Rlmt, 0},
25376- {OID_SKGE_RLMT_PORT_INDEX,
25377- SK_PNMI_MAC_ENTRIES,
25378- sizeof(SK_PNMI_RLMT),
25379- SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtIndex),
25380- SK_PNMI_RO, RlmtStat, 0},
25381- {OID_SKGE_RLMT_STATUS,
25382- SK_PNMI_MAC_ENTRIES,
25383- sizeof(SK_PNMI_RLMT),
25384- SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtStatus),
25385- SK_PNMI_RO, RlmtStat, 0},
25386- {OID_SKGE_RLMT_TX_HELLO_CTS,
25387- SK_PNMI_MAC_ENTRIES,
25388- sizeof(SK_PNMI_RLMT),
25389- SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtTxHelloCts),
25390- SK_PNMI_RO, RlmtStat, 0},
25391- {OID_SKGE_RLMT_RX_HELLO_CTS,
25392- SK_PNMI_MAC_ENTRIES,
25393- sizeof(SK_PNMI_RLMT),
25394- SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtRxHelloCts),
25395- SK_PNMI_RO, RlmtStat, 0},
25396- {OID_SKGE_RLMT_TX_SP_REQ_CTS,
25397- SK_PNMI_MAC_ENTRIES,
25398- sizeof(SK_PNMI_RLMT),
25399- SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtTxSpHelloReqCts),
25400- SK_PNMI_RO, RlmtStat, 0},
25401- {OID_SKGE_RLMT_RX_SP_CTS,
25402- SK_PNMI_MAC_ENTRIES,
25403- sizeof(SK_PNMI_RLMT),
25404- SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtRxSpHelloCts),
25405- SK_PNMI_RO, RlmtStat, 0},
25406- {OID_SKGE_RLMT_MONITOR_NUMBER,
25407- 1,
25408- 0,
25409- SK_PNMI_MAI_OFF(RlmtMonitorNumber),
25410- SK_PNMI_RO, General, 0},
25411- {OID_SKGE_RLMT_MONITOR_INDEX,
25412- SK_PNMI_MONITOR_ENTRIES,
25413- sizeof(SK_PNMI_RLMT_MONITOR),
25414- SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorIndex),
25415- SK_PNMI_RO, Monitor, 0},
25416- {OID_SKGE_RLMT_MONITOR_ADDR,
25417- SK_PNMI_MONITOR_ENTRIES,
25418- sizeof(SK_PNMI_RLMT_MONITOR),
25419- SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorAddr),
25420- SK_PNMI_RO, Monitor, 0},
25421- {OID_SKGE_RLMT_MONITOR_ERRS,
25422- SK_PNMI_MONITOR_ENTRIES,
25423- sizeof(SK_PNMI_RLMT_MONITOR),
25424- SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorErrorCts),
25425- SK_PNMI_RO, Monitor, 0},
25426- {OID_SKGE_RLMT_MONITOR_TIMESTAMP,
25427- SK_PNMI_MONITOR_ENTRIES,
25428- sizeof(SK_PNMI_RLMT_MONITOR),
25429- SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorTimestamp),
25430- SK_PNMI_RO, Monitor, 0},
25431- {OID_SKGE_RLMT_MONITOR_ADMIN,
25432- SK_PNMI_MONITOR_ENTRIES,
25433- sizeof(SK_PNMI_RLMT_MONITOR),
25434- SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorAdmin),
25435- SK_PNMI_RW, Monitor, 0},
25436- {OID_SKGE_MTU,
25437- 1,
25438- 0,
25439- SK_PNMI_MAI_OFF(MtuSize),
25440- SK_PNMI_RW, MacPrivateConf, 0},
25441- {OID_SKGE_VCT_GET,
25442- 0,
25443- 0,
25444- 0,
25445- SK_PNMI_RO, Vct, 0},
25446- {OID_SKGE_VCT_SET,
25447- 0,
25448- 0,
25449- 0,
25450- SK_PNMI_WO, Vct, 0},
25451- {OID_SKGE_VCT_STATUS,
25452- 0,
25453- 0,
25454- 0,
25455- SK_PNMI_RO, Vct, 0},
25456- {OID_SKGE_BOARDLEVEL,
25457- 0,
25458- 0,
25459- 0,
25460- SK_PNMI_RO, General, 0},
25461-};
25462-
25463+/*****************************************************************************\r
25464+ *\r
25465+ * Name: skgemib.c\r
25466+ * Project: GEnesis, PCI Gigabit Ethernet Adapter\r
25467+ * Version: $Revision$\r
25468+ * Date: $Date$\r
25469+ * Purpose: Private Network Management Interface Management Database\r
25470+ *\r
25471+ ****************************************************************************/\r
25472+\r
25473+/******************************************************************************\r
25474+ *\r
25475+ * (C)Copyright 1998-2002 SysKonnect GmbH.\r
25476+ * (C)Copyright 2002-2003 Marvell.\r
25477+ *\r
25478+ * This program is free software; you can redistribute it and/or modify\r
25479+ * it under the terms of the GNU General Public License as published by\r
25480+ * the Free Software Foundation; either version 2 of the License, or\r
25481+ * (at your option) any later version.\r
25482+ *\r
25483+ * The information in this file is provided "AS IS" without warranty.\r
25484+ *\r
25485+ ******************************************************************************/\r
25486+\r
25487+/*\r
25488+ * PRIVATE OID handler function prototypes\r
25489+ */\r
25490+PNMI_STATIC int Addr(SK_AC *pAC, SK_IOC IoC, int action,\r
25491+ SK_U32 Id, char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25492+ unsigned int TableIndex, SK_U32 NetIndex);\r
25493+PNMI_STATIC int CsumStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25494+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25495+ unsigned int TableIndex, SK_U32 NetIndex);\r
25496+PNMI_STATIC int General(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25497+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25498+ unsigned int TableIndex, SK_U32 NetIndex);\r
25499+PNMI_STATIC int Mac8023Stat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25500+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25501+ unsigned int TableIndex, SK_U32 NetIndex);\r
25502+PNMI_STATIC int MacPrivateConf(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25503+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25504+ unsigned int TableIndex, SK_U32 NetIndex);\r
25505+PNMI_STATIC int MacPrivateStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25506+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25507+ unsigned int TableIndex, SK_U32 NetIndex);\r
25508+PNMI_STATIC int Monitor(SK_AC *pAC, SK_IOC IoC, int action,\r
25509+ SK_U32 Id, char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25510+ unsigned int TableIndex, SK_U32 NetIndex);\r
25511+PNMI_STATIC int OidStruct(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25512+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25513+ unsigned int TableIndex, SK_U32 NetIndex);\r
25514+PNMI_STATIC int Perform(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25515+ char *pBuf, unsigned int* pLen, SK_U32 Instance,\r
25516+ unsigned int TableIndex, SK_U32 NetIndex);\r
25517+PNMI_STATIC int Rlmt(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25518+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25519+ unsigned int TableIndex, SK_U32 NetIndex);\r
25520+PNMI_STATIC int RlmtStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25521+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25522+ unsigned int TableIndex, SK_U32 NetIndex);\r
25523+PNMI_STATIC int SensorStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25524+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25525+ unsigned int TableIndex, SK_U32 NetIndex);\r
25526+PNMI_STATIC int Vpd(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25527+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25528+ unsigned int TableIndex, SK_U32 NetIndex);\r
25529+PNMI_STATIC int Vct(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25530+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25531+ unsigned int TableIndex, SK_U32 NetIndex);\r
25532+\r
25533+#ifdef SK_POWER_MGMT\r
25534+PNMI_STATIC int PowerManagement(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25535+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25536+ unsigned int TableIndex, SK_U32 NetIndex);\r
25537+#endif /* SK_POWER_MGMT */\r
25538+\r
25539+#ifdef SK_DIAG_SUPPORT\r
25540+PNMI_STATIC int DiagActions(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
25541+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
25542+ unsigned int TableIndex, SK_U32 NetIndex);\r
25543+#endif /* SK_DIAG_SUPPORT */\r
25544+\r
25545+\r
25546+/* defines *******************************************************************/\r
25547+#define ID_TABLE_SIZE (sizeof(IdTable)/sizeof(IdTable[0]))\r
25548+\r
25549+\r
25550+/* global variables **********************************************************/\r
25551+\r
25552+/*\r
25553+ * Table to correlate OID with handler function and index to\r
25554+ * hardware register stored in StatAddress if applicable.\r
25555+ */\r
25556+PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTable[] = {\r
25557+ {OID_GEN_XMIT_OK,\r
25558+ 0,\r
25559+ 0,\r
25560+ 0,\r
25561+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX},\r
25562+ {OID_GEN_RCV_OK,\r
25563+ 0,\r
25564+ 0,\r
25565+ 0,\r
25566+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX},\r
25567+ {OID_GEN_XMIT_ERROR,\r
25568+ 0,\r
25569+ 0,\r
25570+ 0,\r
25571+ SK_PNMI_RO, General, 0},\r
25572+ {OID_GEN_RCV_ERROR,\r
25573+ 0,\r
25574+ 0,\r
25575+ 0,\r
25576+ SK_PNMI_RO, General, 0},\r
25577+ {OID_GEN_RCV_NO_BUFFER,\r
25578+ 0,\r
25579+ 0,\r
25580+ 0,\r
25581+ SK_PNMI_RO, General, 0},\r
25582+ {OID_GEN_DIRECTED_FRAMES_XMIT,\r
25583+ 0,\r
25584+ 0,\r
25585+ 0,\r
25586+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_UNICAST},\r
25587+ {OID_GEN_MULTICAST_FRAMES_XMIT,\r
25588+ 0,\r
25589+ 0,\r
25590+ 0,\r
25591+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_MULTICAST},\r
25592+ {OID_GEN_BROADCAST_FRAMES_XMIT,\r
25593+ 0,\r
25594+ 0,\r
25595+ 0,\r
25596+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_BROADCAST},\r
25597+ {OID_GEN_DIRECTED_FRAMES_RCV,\r
25598+ 0,\r
25599+ 0,\r
25600+ 0,\r
25601+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_UNICAST},\r
25602+ {OID_GEN_MULTICAST_FRAMES_RCV,\r
25603+ 0,\r
25604+ 0,\r
25605+ 0,\r
25606+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_MULTICAST},\r
25607+ {OID_GEN_BROADCAST_FRAMES_RCV,\r
25608+ 0,\r
25609+ 0,\r
25610+ 0,\r
25611+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_BROADCAST},\r
25612+ {OID_GEN_RCV_CRC_ERROR,\r
25613+ 0,\r
25614+ 0,\r
25615+ 0,\r
25616+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_FCS},\r
25617+ {OID_GEN_TRANSMIT_QUEUE_LENGTH,\r
25618+ 0,\r
25619+ 0,\r
25620+ 0,\r
25621+ SK_PNMI_RO, General, 0},\r
25622+ {OID_802_3_PERMANENT_ADDRESS,\r
25623+ 0,\r
25624+ 0,\r
25625+ 0,\r
25626+ SK_PNMI_RO, Mac8023Stat, 0},\r
25627+ {OID_802_3_CURRENT_ADDRESS,\r
25628+ 0,\r
25629+ 0,\r
25630+ 0,\r
25631+ SK_PNMI_RO, Mac8023Stat, 0},\r
25632+ {OID_802_3_RCV_ERROR_ALIGNMENT,\r
25633+ 0,\r
25634+ 0,\r
25635+ 0,\r
25636+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_FRAMING},\r
25637+ {OID_802_3_XMIT_ONE_COLLISION,\r
25638+ 0,\r
25639+ 0,\r
25640+ 0,\r
25641+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_SINGLE_COL},\r
25642+ {OID_802_3_XMIT_MORE_COLLISIONS,\r
25643+ 0,\r
25644+ 0,\r
25645+ 0,\r
25646+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_MULTI_COL},\r
25647+ {OID_802_3_XMIT_DEFERRED,\r
25648+ 0,\r
25649+ 0,\r
25650+ 0,\r
25651+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_DEFFERAL},\r
25652+ {OID_802_3_XMIT_MAX_COLLISIONS,\r
25653+ 0,\r
25654+ 0,\r
25655+ 0,\r
25656+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_EXCESS_COL},\r
25657+ {OID_802_3_RCV_OVERRUN,\r
25658+ 0,\r
25659+ 0,\r
25660+ 0,\r
25661+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_OVERFLOW},\r
25662+ {OID_802_3_XMIT_UNDERRUN,\r
25663+ 0,\r
25664+ 0,\r
25665+ 0,\r
25666+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_UNDERRUN},\r
25667+ {OID_802_3_XMIT_TIMES_CRS_LOST,\r
25668+ 0,\r
25669+ 0,\r
25670+ 0,\r
25671+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_CARRIER},\r
25672+ {OID_802_3_XMIT_LATE_COLLISIONS,\r
25673+ 0,\r
25674+ 0,\r
25675+ 0,\r
25676+ SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_LATE_COL},\r
25677+#ifdef SK_POWER_MGMT\r
25678+ {OID_PNP_CAPABILITIES,\r
25679+ 0,\r
25680+ 0,\r
25681+ 0,\r
25682+ SK_PNMI_RO, PowerManagement, 0},\r
25683+ {OID_PNP_SET_POWER,\r
25684+ 0,\r
25685+ 0,\r
25686+ 0,\r
25687+ SK_PNMI_WO, PowerManagement, 0},\r
25688+ {OID_PNP_QUERY_POWER,\r
25689+ 0,\r
25690+ 0,\r
25691+ 0,\r
25692+ SK_PNMI_RO, PowerManagement, 0},\r
25693+ {OID_PNP_ADD_WAKE_UP_PATTERN,\r
25694+ 0,\r
25695+ 0,\r
25696+ 0,\r
25697+ SK_PNMI_WO, PowerManagement, 0},\r
25698+ {OID_PNP_REMOVE_WAKE_UP_PATTERN,\r
25699+ 0,\r
25700+ 0,\r
25701+ 0,\r
25702+ SK_PNMI_WO, PowerManagement, 0},\r
25703+ {OID_PNP_ENABLE_WAKE_UP,\r
25704+ 0,\r
25705+ 0,\r
25706+ 0,\r
25707+ SK_PNMI_RW, PowerManagement, 0},\r
25708+#endif /* SK_POWER_MGMT */\r
25709+#ifdef SK_DIAG_SUPPORT\r
25710+ {OID_SKGE_DIAG_MODE,\r
25711+ 0,\r
25712+ 0,\r
25713+ 0,\r
25714+ SK_PNMI_RW, DiagActions, 0},\r
25715+#endif /* SK_DIAG_SUPPORT */\r
25716+#ifdef SK_ASF\r
25717+ {OID_SKGE_ASF,\r
25718+ 0,\r
25719+ 0,\r
25720+ 0,\r
25721+ SK_PNMI_RW, Asf, 0},\r
25722+ {OID_SKGE_ASF_STORE_CONFIG,\r
25723+ 0,\r
25724+ 0,\r
25725+ 0,\r
25726+ SK_PNMI_RW, Asf, 0},\r
25727+ {OID_SKGE_ASF_ENA,\r
25728+ 0,\r
25729+ 0,\r
25730+ 0,\r
25731+ SK_PNMI_RW, Asf, 0},\r
25732+ {OID_SKGE_ASF_RETRANS,\r
25733+ 0,\r
25734+ 0,\r
25735+ 0,\r
25736+ SK_PNMI_RW, Asf, 0},\r
25737+ {OID_SKGE_ASF_RETRANS_INT,\r
25738+ 0,\r
25739+ 0,\r
25740+ 0,\r
25741+ SK_PNMI_RW, Asf, 0},\r
25742+ {OID_SKGE_ASF_HB_ENA,\r
25743+ 0,\r
25744+ 0,\r
25745+ 0,\r
25746+ SK_PNMI_RW, Asf, 0},\r
25747+ {OID_SKGE_ASF_HB_INT,\r
25748+ 0,\r
25749+ 0,\r
25750+ 0,\r
25751+ SK_PNMI_RW, Asf, 0},\r
25752+ {OID_SKGE_ASF_WD_ENA,\r
25753+ 0,\r
25754+ 0,\r
25755+ 0,\r
25756+ SK_PNMI_RW, Asf, 0},\r
25757+ {OID_SKGE_ASF_WD_TIME,\r
25758+ 0,\r
25759+ 0,\r
25760+ 0,\r
25761+ SK_PNMI_RW, Asf, 0},\r
25762+ {OID_SKGE_ASF_IP_SOURCE,\r
25763+ 0,\r
25764+ 0,\r
25765+ 0,\r
25766+ SK_PNMI_RW, Asf, 0},\r
25767+ {OID_SKGE_ASF_MAC_SOURCE,\r
25768+ 0,\r
25769+ 0,\r
25770+ 0,\r
25771+ SK_PNMI_RW, Asf, 0},\r
25772+ {OID_SKGE_ASF_IP_DEST,\r
25773+ 0,\r
25774+ 0,\r
25775+ 0,\r
25776+ SK_PNMI_RW, Asf, 0},\r
25777+ {OID_SKGE_ASF_MAC_DEST,\r
25778+ 0,\r
25779+ 0,\r
25780+ 0,\r
25781+ SK_PNMI_RW, Asf, 0},\r
25782+ {OID_SKGE_ASF_COMMUNITY_NAME,\r
25783+ 0,\r
25784+ 0,\r
25785+ 0,\r
25786+ SK_PNMI_RW, Asf, 0},\r
25787+ {OID_SKGE_ASF_RSP_ENA,\r
25788+ 0,\r
25789+ 0,\r
25790+ 0,\r
25791+ SK_PNMI_RW, Asf, 0},\r
25792+ {OID_SKGE_ASF_RETRANS_COUNT_MIN,\r
25793+ 0,\r
25794+ 0,\r
25795+ 0,\r
25796+ SK_PNMI_RW, Asf, 0},\r
25797+ {OID_SKGE_ASF_RETRANS_COUNT_MAX,\r
25798+ 0,\r
25799+ 0,\r
25800+ 0,\r
25801+ SK_PNMI_RW, Asf, 0},\r
25802+ {OID_SKGE_ASF_RETRANS_INT_MIN,\r
25803+ 0,\r
25804+ 0,\r
25805+ 0,\r
25806+ SK_PNMI_RW, Asf, 0},\r
25807+ {OID_SKGE_ASF_RETRANS_INT_MAX,\r
25808+ 0,\r
25809+ 0,\r
25810+ 0,\r
25811+ SK_PNMI_RW, Asf, 0},\r
25812+ {OID_SKGE_ASF_HB_INT_MIN,\r
25813+ 0,\r
25814+ 0,\r
25815+ 0,\r
25816+ SK_PNMI_RW, Asf, 0},\r
25817+ {OID_SKGE_ASF_HB_INT_MAX,\r
25818+ 0,\r
25819+ 0,\r
25820+ 0,\r
25821+ SK_PNMI_RW, Asf, 0},\r
25822+ {OID_SKGE_ASF_WD_TIME_MIN,\r
25823+ 0,\r
25824+ 0,\r
25825+ 0,\r
25826+ SK_PNMI_RW, Asf, 0},\r
25827+ {OID_SKGE_ASF_WD_TIME_MAX,\r
25828+ 0,\r
25829+ 0,\r
25830+ 0,\r
25831+ SK_PNMI_RW, Asf, 0},\r
25832+ {OID_SKGE_ASF_HB_CAP,\r
25833+ 0,\r
25834+ 0,\r
25835+ 0,\r
25836+ SK_PNMI_RW, Asf, 0},\r
25837+ {OID_SKGE_ASF_WD_TIMER_RES,\r
25838+ 0,\r
25839+ 0,\r
25840+ 0,\r
25841+ SK_PNMI_RW, Asf, 0},\r
25842+ {OID_SKGE_ASF_GUID,\r
25843+ 0,\r
25844+ 0,\r
25845+ 0,\r
25846+ SK_PNMI_RW, Asf, 0},\r
25847+ {OID_SKGE_ASF_KEY_OP,\r
25848+ 0,\r
25849+ 0,\r
25850+ 0,\r
25851+ SK_PNMI_RW, Asf, 0},\r
25852+ {OID_SKGE_ASF_KEY_ADM,\r
25853+ 0,\r
25854+ 0,\r
25855+ 0,\r
25856+ SK_PNMI_RW, Asf, 0},\r
25857+ {OID_SKGE_ASF_KEY_GEN,\r
25858+ 0,\r
25859+ 0,\r
25860+ 0,\r
25861+ SK_PNMI_RW, Asf, 0},\r
25862+ {OID_SKGE_ASF_CAP,\r
25863+ 0,\r
25864+ 0,\r
25865+ 0,\r
25866+ SK_PNMI_RW, Asf, 0},\r
25867+ {OID_SKGE_ASF_PAR_1,\r
25868+ 0,\r
25869+ 0,\r
25870+ 0,\r
25871+ SK_PNMI_RW, Asf, 0},\r
25872+ {OID_SKGE_ASF_OVERALL_OID,\r
25873+ 0,\r
25874+ 0,\r
25875+ 0,\r
25876+ SK_PNMI_RW, Asf, 0},\r
25877+ {OID_SKGE_ASF_FWVER_OID,\r
25878+ 0,\r
25879+ 0,\r
25880+ 0,\r
25881+ SK_PNMI_RO, Asf, 0},\r
25882+ {OID_SKGE_ASF_ACPI_OID,\r
25883+ 0,\r
25884+ 0,\r
25885+ 0,\r
25886+ SK_PNMI_RO, Asf, 0},\r
25887+ {OID_SKGE_ASF_SMBUS_OID,\r
25888+ 0,\r
25889+ 0,\r
25890+ 0,\r
25891+ SK_PNMI_RO, Asf, 0},\r
25892+#endif /* SK_ASF */\r
25893+ {OID_SKGE_MDB_VERSION,\r
25894+ 1,\r
25895+ 0,\r
25896+ SK_PNMI_MAI_OFF(MgmtDBVersion),\r
25897+ SK_PNMI_RO, General, 0},\r
25898+ {OID_SKGE_SUPPORTED_LIST,\r
25899+ 0,\r
25900+ 0,\r
25901+ 0,\r
25902+ SK_PNMI_RO, General, 0},\r
25903+ {OID_SKGE_ALL_DATA,\r
25904+ 0,\r
25905+ 0,\r
25906+ 0,\r
25907+ SK_PNMI_RW, OidStruct, 0},\r
25908+ {OID_SKGE_VPD_FREE_BYTES,\r
25909+ 1,\r
25910+ 0,\r
25911+ SK_PNMI_MAI_OFF(VpdFreeBytes),\r
25912+ SK_PNMI_RO, Vpd, 0},\r
25913+ {OID_SKGE_VPD_ENTRIES_LIST,\r
25914+ 1,\r
25915+ 0,\r
25916+ SK_PNMI_MAI_OFF(VpdEntriesList),\r
25917+ SK_PNMI_RO, Vpd, 0},\r
25918+ {OID_SKGE_VPD_ENTRIES_NUMBER,\r
25919+ 1,\r
25920+ 0,\r
25921+ SK_PNMI_MAI_OFF(VpdEntriesNumber),\r
25922+ SK_PNMI_RO, Vpd, 0},\r
25923+ {OID_SKGE_VPD_KEY,\r
25924+ SK_PNMI_VPD_ENTRIES,\r
25925+ sizeof(SK_PNMI_VPD),\r
25926+ SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdKey),\r
25927+ SK_PNMI_RO, Vpd, 0},\r
25928+ {OID_SKGE_VPD_VALUE,\r
25929+ SK_PNMI_VPD_ENTRIES,\r
25930+ sizeof(SK_PNMI_VPD),\r
25931+ SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdValue),\r
25932+ SK_PNMI_RO, Vpd, 0},\r
25933+ {OID_SKGE_VPD_ACCESS,\r
25934+ SK_PNMI_VPD_ENTRIES,\r
25935+ sizeof(SK_PNMI_VPD),\r
25936+ SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdAccess),\r
25937+ SK_PNMI_RO, Vpd, 0},\r
25938+ {OID_SKGE_VPD_ACTION,\r
25939+ SK_PNMI_VPD_ENTRIES,\r
25940+ sizeof(SK_PNMI_VPD),\r
25941+ SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdAction),\r
25942+ SK_PNMI_RW, Vpd, 0},\r
25943+ {OID_SKGE_PORT_NUMBER, \r
25944+ 1,\r
25945+ 0,\r
25946+ SK_PNMI_MAI_OFF(PortNumber),\r
25947+ SK_PNMI_RO, General, 0},\r
25948+ {OID_SKGE_DEVICE_TYPE,\r
25949+ 1,\r
25950+ 0,\r
25951+ SK_PNMI_MAI_OFF(DeviceType),\r
25952+ SK_PNMI_RO, General, 0},\r
25953+ {OID_SKGE_DRIVER_DESCR,\r
25954+ 1,\r
25955+ 0,\r
25956+ SK_PNMI_MAI_OFF(DriverDescr),\r
25957+ SK_PNMI_RO, General, 0},\r
25958+ {OID_SKGE_DRIVER_VERSION,\r
25959+ 1,\r
25960+ 0,\r
25961+ SK_PNMI_MAI_OFF(DriverVersion),\r
25962+ SK_PNMI_RO, General, 0},\r
25963+ {OID_SKGE_DRIVER_RELDATE,\r
25964+ 1,\r
25965+ 0,\r
25966+ SK_PNMI_MAI_OFF(DriverReleaseDate),\r
25967+ SK_PNMI_RO, General, 0},\r
25968+ {OID_SKGE_DRIVER_FILENAME,\r
25969+ 1,\r
25970+ 0,\r
25971+ SK_PNMI_MAI_OFF(DriverFileName),\r
25972+ SK_PNMI_RO, General, 0},\r
25973+ {OID_SKGE_HW_DESCR,\r
25974+ 1,\r
25975+ 0,\r
25976+ SK_PNMI_MAI_OFF(HwDescr),\r
25977+ SK_PNMI_RO, General, 0},\r
25978+ {OID_SKGE_HW_VERSION,\r
25979+ 1,\r
25980+ 0,\r
25981+ SK_PNMI_MAI_OFF(HwVersion),\r
25982+ SK_PNMI_RO, General, 0},\r
25983+ {OID_SKGE_CHIPSET,\r
25984+ 1,\r
25985+ 0,\r
25986+ SK_PNMI_MAI_OFF(Chipset),\r
25987+ SK_PNMI_RO, General, 0},\r
25988+ {OID_SKGE_CHIPID,\r
25989+ 1,\r
25990+ 0,\r
25991+ SK_PNMI_MAI_OFF(ChipId),\r
25992+ SK_PNMI_RO, General, 0},\r
25993+ {OID_SKGE_RAMSIZE,\r
25994+ 1,\r
25995+ 0,\r
25996+ SK_PNMI_MAI_OFF(RamSize),\r
25997+ SK_PNMI_RO, General, 0},\r
25998+ {OID_SKGE_VAUXAVAIL,\r
25999+ 1,\r
26000+ 0,\r
26001+ SK_PNMI_MAI_OFF(VauxAvail),\r
26002+ SK_PNMI_RO, General, 0},\r
26003+ {OID_SKGE_ACTION,\r
26004+ 1,\r
26005+ 0,\r
26006+ SK_PNMI_MAI_OFF(Action),\r
26007+ SK_PNMI_RW, Perform, 0},\r
26008+ {OID_SKGE_RESULT,\r
26009+ 1,\r
26010+ 0,\r
26011+ SK_PNMI_MAI_OFF(TestResult),\r
26012+ SK_PNMI_RO, General, 0},\r
26013+ {OID_SKGE_BUS_TYPE,\r
26014+ 1,\r
26015+ 0,\r
26016+ SK_PNMI_MAI_OFF(BusType),\r
26017+ SK_PNMI_RO, General, 0},\r
26018+ {OID_SKGE_BUS_SPEED,\r
26019+ 1,\r
26020+ 0,\r
26021+ SK_PNMI_MAI_OFF(BusSpeed),\r
26022+ SK_PNMI_RO, General, 0},\r
26023+ {OID_SKGE_BUS_WIDTH,\r
26024+ 1,\r
26025+ 0,\r
26026+ SK_PNMI_MAI_OFF(BusWidth),\r
26027+ SK_PNMI_RO, General, 0},\r
26028+ {OID_SKGE_TX_SW_QUEUE_LEN,\r
26029+ 1,\r
26030+ 0,\r
26031+ SK_PNMI_MAI_OFF(TxSwQueueLen),\r
26032+ SK_PNMI_RO, General, 0},\r
26033+ {OID_SKGE_TX_SW_QUEUE_MAX,\r
26034+ 1,\r
26035+ 0,\r
26036+ SK_PNMI_MAI_OFF(TxSwQueueMax),\r
26037+ SK_PNMI_RO, General, 0},\r
26038+ {OID_SKGE_TX_RETRY,\r
26039+ 1,\r
26040+ 0,\r
26041+ SK_PNMI_MAI_OFF(TxRetryCts),\r
26042+ SK_PNMI_RO, General, 0},\r
26043+ {OID_SKGE_RX_INTR_CTS,\r
26044+ 1,\r
26045+ 0,\r
26046+ SK_PNMI_MAI_OFF(RxIntrCts),\r
26047+ SK_PNMI_RO, General, 0},\r
26048+ {OID_SKGE_TX_INTR_CTS,\r
26049+ 1,\r
26050+ 0,\r
26051+ SK_PNMI_MAI_OFF(TxIntrCts),\r
26052+ SK_PNMI_RO, General, 0},\r
26053+ {OID_SKGE_RX_NO_BUF_CTS,\r
26054+ 1,\r
26055+ 0,\r
26056+ SK_PNMI_MAI_OFF(RxNoBufCts),\r
26057+ SK_PNMI_RO, General, 0},\r
26058+ {OID_SKGE_TX_NO_BUF_CTS,\r
26059+ 1,\r
26060+ 0,\r
26061+ SK_PNMI_MAI_OFF(TxNoBufCts),\r
26062+ SK_PNMI_RO, General, 0},\r
26063+ {OID_SKGE_TX_USED_DESCR_NO,\r
26064+ 1,\r
26065+ 0,\r
26066+ SK_PNMI_MAI_OFF(TxUsedDescrNo),\r
26067+ SK_PNMI_RO, General, 0},\r
26068+ {OID_SKGE_RX_DELIVERED_CTS,\r
26069+ 1,\r
26070+ 0,\r
26071+ SK_PNMI_MAI_OFF(RxDeliveredCts),\r
26072+ SK_PNMI_RO, General, 0},\r
26073+ {OID_SKGE_RX_OCTETS_DELIV_CTS,\r
26074+ 1,\r
26075+ 0,\r
26076+ SK_PNMI_MAI_OFF(RxOctetsDeliveredCts),\r
26077+ SK_PNMI_RO, General, 0},\r
26078+ {OID_SKGE_RX_HW_ERROR_CTS,\r
26079+ 1,\r
26080+ 0,\r
26081+ SK_PNMI_MAI_OFF(RxHwErrorsCts),\r
26082+ SK_PNMI_RO, General, 0},\r
26083+ {OID_SKGE_TX_HW_ERROR_CTS,\r
26084+ 1,\r
26085+ 0,\r
26086+ SK_PNMI_MAI_OFF(TxHwErrorsCts),\r
26087+ SK_PNMI_RO, General, 0},\r
26088+ {OID_SKGE_IN_ERRORS_CTS,\r
26089+ 1,\r
26090+ 0,\r
26091+ SK_PNMI_MAI_OFF(InErrorsCts),\r
26092+ SK_PNMI_RO, General, 0},\r
26093+ {OID_SKGE_OUT_ERROR_CTS,\r
26094+ 1,\r
26095+ 0,\r
26096+ SK_PNMI_MAI_OFF(OutErrorsCts),\r
26097+ SK_PNMI_RO, General, 0},\r
26098+ {OID_SKGE_ERR_RECOVERY_CTS,\r
26099+ 1,\r
26100+ 0,\r
26101+ SK_PNMI_MAI_OFF(ErrRecoveryCts),\r
26102+ SK_PNMI_RO, General, 0},\r
26103+ {OID_SKGE_SYSUPTIME,\r
26104+ 1,\r
26105+ 0,\r
26106+ SK_PNMI_MAI_OFF(SysUpTime),\r
26107+ SK_PNMI_RO, General, 0},\r
26108+ {OID_SKGE_SENSOR_NUMBER,\r
26109+ 1,\r
26110+ 0,\r
26111+ SK_PNMI_MAI_OFF(SensorNumber),\r
26112+ SK_PNMI_RO, General, 0},\r
26113+ {OID_SKGE_SENSOR_INDEX,\r
26114+ SK_PNMI_SENSOR_ENTRIES,\r
26115+ sizeof(SK_PNMI_SENSOR),\r
26116+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorIndex),\r
26117+ SK_PNMI_RO, SensorStat, 0},\r
26118+ {OID_SKGE_SENSOR_DESCR,\r
26119+ SK_PNMI_SENSOR_ENTRIES,\r
26120+ sizeof(SK_PNMI_SENSOR),\r
26121+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorDescr),\r
26122+ SK_PNMI_RO, SensorStat, 0},\r
26123+ {OID_SKGE_SENSOR_TYPE,\r
26124+ SK_PNMI_SENSOR_ENTRIES,\r
26125+ sizeof(SK_PNMI_SENSOR),\r
26126+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorType),\r
26127+ SK_PNMI_RO, SensorStat, 0},\r
26128+ {OID_SKGE_SENSOR_VALUE,\r
26129+ SK_PNMI_SENSOR_ENTRIES,\r
26130+ sizeof(SK_PNMI_SENSOR),\r
26131+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorValue),\r
26132+ SK_PNMI_RO, SensorStat, 0},\r
26133+ {OID_SKGE_SENSOR_WAR_THRES_LOW,\r
26134+ SK_PNMI_SENSOR_ENTRIES,\r
26135+ sizeof(SK_PNMI_SENSOR),\r
26136+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningThresholdLow),\r
26137+ SK_PNMI_RO, SensorStat, 0},\r
26138+ {OID_SKGE_SENSOR_WAR_THRES_UPP,\r
26139+ SK_PNMI_SENSOR_ENTRIES,\r
26140+ sizeof(SK_PNMI_SENSOR),\r
26141+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningThresholdHigh),\r
26142+ SK_PNMI_RO, SensorStat, 0},\r
26143+ {OID_SKGE_SENSOR_ERR_THRES_LOW,\r
26144+ SK_PNMI_SENSOR_ENTRIES,\r
26145+ sizeof(SK_PNMI_SENSOR),\r
26146+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorThresholdLow),\r
26147+ SK_PNMI_RO, SensorStat, 0},\r
26148+ {OID_SKGE_SENSOR_ERR_THRES_UPP,\r
26149+ SK_PNMI_SENSOR_ENTRIES,\r
26150+ sizeof(SK_PNMI_SENSOR),\r
26151+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorThresholdHigh),\r
26152+ SK_PNMI_RO, SensorStat, 0},\r
26153+ {OID_SKGE_SENSOR_STATUS,\r
26154+ SK_PNMI_SENSOR_ENTRIES,\r
26155+ sizeof(SK_PNMI_SENSOR),\r
26156+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorStatus),\r
26157+ SK_PNMI_RO, SensorStat, 0},\r
26158+ {OID_SKGE_SENSOR_WAR_CTS,\r
26159+ SK_PNMI_SENSOR_ENTRIES,\r
26160+ sizeof(SK_PNMI_SENSOR),\r
26161+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningCts),\r
26162+ SK_PNMI_RO, SensorStat, 0},\r
26163+ {OID_SKGE_SENSOR_ERR_CTS,\r
26164+ SK_PNMI_SENSOR_ENTRIES,\r
26165+ sizeof(SK_PNMI_SENSOR),\r
26166+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorCts),\r
26167+ SK_PNMI_RO, SensorStat, 0},\r
26168+ {OID_SKGE_SENSOR_WAR_TIME,\r
26169+ SK_PNMI_SENSOR_ENTRIES,\r
26170+ sizeof(SK_PNMI_SENSOR),\r
26171+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningTimestamp),\r
26172+ SK_PNMI_RO, SensorStat, 0},\r
26173+ {OID_SKGE_SENSOR_ERR_TIME,\r
26174+ SK_PNMI_SENSOR_ENTRIES,\r
26175+ sizeof(SK_PNMI_SENSOR),\r
26176+ SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorTimestamp),\r
26177+ SK_PNMI_RO, SensorStat, 0},\r
26178+ {OID_SKGE_CHKSM_NUMBER,\r
26179+ 1,\r
26180+ 0,\r
26181+ SK_PNMI_MAI_OFF(ChecksumNumber),\r
26182+ SK_PNMI_RO, General, 0},\r
26183+ {OID_SKGE_CHKSM_RX_OK_CTS,\r
26184+ SKCS_NUM_PROTOCOLS,\r
26185+ sizeof(SK_PNMI_CHECKSUM),\r
26186+ SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxOkCts),\r
26187+ SK_PNMI_RO, CsumStat, 0},\r
26188+ {OID_SKGE_CHKSM_RX_UNABLE_CTS,\r
26189+ SKCS_NUM_PROTOCOLS,\r
26190+ sizeof(SK_PNMI_CHECKSUM),\r
26191+ SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxUnableCts),\r
26192+ SK_PNMI_RO, CsumStat, 0},\r
26193+ {OID_SKGE_CHKSM_RX_ERR_CTS,\r
26194+ SKCS_NUM_PROTOCOLS,\r
26195+ sizeof(SK_PNMI_CHECKSUM),\r
26196+ SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxErrCts),\r
26197+ SK_PNMI_RO, CsumStat, 0},\r
26198+ {OID_SKGE_CHKSM_TX_OK_CTS,\r
26199+ SKCS_NUM_PROTOCOLS,\r
26200+ sizeof(SK_PNMI_CHECKSUM),\r
26201+ SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumTxOkCts),\r
26202+ SK_PNMI_RO, CsumStat, 0},\r
26203+ {OID_SKGE_CHKSM_TX_UNABLE_CTS,\r
26204+ SKCS_NUM_PROTOCOLS,\r
26205+ sizeof(SK_PNMI_CHECKSUM),\r
26206+ SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumTxUnableCts),\r
26207+ SK_PNMI_RO, CsumStat, 0},\r
26208+ {OID_SKGE_STAT_TX,\r
26209+ SK_PNMI_MAC_ENTRIES,\r
26210+ sizeof(SK_PNMI_STAT),\r
26211+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxOkCts),\r
26212+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX},\r
26213+ {OID_SKGE_STAT_TX_OCTETS,\r
26214+ SK_PNMI_MAC_ENTRIES,\r
26215+ sizeof(SK_PNMI_STAT),\r
26216+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxOctetsOkCts),\r
26217+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_OCTET},\r
26218+ {OID_SKGE_STAT_TX_BROADCAST,\r
26219+ SK_PNMI_MAC_ENTRIES,\r
26220+ sizeof(SK_PNMI_STAT),\r
26221+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxBroadcastOkCts),\r
26222+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_BROADCAST},\r
26223+ {OID_SKGE_STAT_TX_MULTICAST,\r
26224+ SK_PNMI_MAC_ENTRIES,\r
26225+ sizeof(SK_PNMI_STAT),\r
26226+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMulticastOkCts),\r
26227+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MULTICAST},\r
26228+ {OID_SKGE_STAT_TX_UNICAST,\r
26229+ SK_PNMI_MAC_ENTRIES,\r
26230+ sizeof(SK_PNMI_STAT),\r
26231+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxUnicastOkCts),\r
26232+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_UNICAST},\r
26233+ {OID_SKGE_STAT_TX_LONGFRAMES,\r
26234+ SK_PNMI_MAC_ENTRIES,\r
26235+ sizeof(SK_PNMI_STAT),\r
26236+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxLongFramesCts),\r
26237+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_LONGFRAMES},\r
26238+ {OID_SKGE_STAT_TX_BURST,\r
26239+ SK_PNMI_MAC_ENTRIES,\r
26240+ sizeof(SK_PNMI_STAT),\r
26241+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxBurstCts),\r
26242+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_BURST},\r
26243+ {OID_SKGE_STAT_TX_PFLOWC,\r
26244+ SK_PNMI_MAC_ENTRIES,\r
26245+ sizeof(SK_PNMI_STAT),\r
26246+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxPauseMacCtrlCts),\r
26247+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_PMACC},\r
26248+ {OID_SKGE_STAT_TX_FLOWC,\r
26249+ SK_PNMI_MAC_ENTRIES,\r
26250+ sizeof(SK_PNMI_STAT),\r
26251+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMacCtrlCts),\r
26252+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MACC},\r
26253+ {OID_SKGE_STAT_TX_SINGLE_COL,\r
26254+ SK_PNMI_MAC_ENTRIES,\r
26255+ sizeof(SK_PNMI_STAT),\r
26256+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSingleCollisionCts),\r
26257+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SINGLE_COL},\r
26258+ {OID_SKGE_STAT_TX_MULTI_COL,\r
26259+ SK_PNMI_MAC_ENTRIES,\r
26260+ sizeof(SK_PNMI_STAT),\r
26261+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMultipleCollisionCts),\r
26262+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MULTI_COL},\r
26263+ {OID_SKGE_STAT_TX_EXCESS_COL,\r
26264+ SK_PNMI_MAC_ENTRIES,\r
26265+ sizeof(SK_PNMI_STAT),\r
26266+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxExcessiveCollisionCts),\r
26267+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_EXCESS_COL},\r
26268+ {OID_SKGE_STAT_TX_LATE_COL,\r
26269+ SK_PNMI_MAC_ENTRIES,\r
26270+ sizeof(SK_PNMI_STAT),\r
26271+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxLateCollisionCts),\r
26272+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_LATE_COL},\r
26273+ {OID_SKGE_STAT_TX_DEFFERAL,\r
26274+ SK_PNMI_MAC_ENTRIES,\r
26275+ sizeof(SK_PNMI_STAT),\r
26276+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxDeferralCts),\r
26277+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_DEFFERAL},\r
26278+ {OID_SKGE_STAT_TX_EXCESS_DEF,\r
26279+ SK_PNMI_MAC_ENTRIES,\r
26280+ sizeof(SK_PNMI_STAT),\r
26281+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxExcessiveDeferralCts),\r
26282+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_EXCESS_DEF},\r
26283+ {OID_SKGE_STAT_TX_UNDERRUN,\r
26284+ SK_PNMI_MAC_ENTRIES,\r
26285+ sizeof(SK_PNMI_STAT),\r
26286+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxFifoUnderrunCts),\r
26287+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_UNDERRUN},\r
26288+ {OID_SKGE_STAT_TX_CARRIER,\r
26289+ SK_PNMI_MAC_ENTRIES,\r
26290+ sizeof(SK_PNMI_STAT),\r
26291+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxCarrierCts),\r
26292+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_CARRIER},\r
26293+/* {OID_SKGE_STAT_TX_UTIL,\r
26294+ SK_PNMI_MAC_ENTRIES,\r
26295+ sizeof(SK_PNMI_STAT),\r
26296+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxUtilization),\r
26297+ SK_PNMI_RO, MacPrivateStat, (SK_U16)(-1)}, */\r
26298+ {OID_SKGE_STAT_TX_64,\r
26299+ SK_PNMI_MAC_ENTRIES,\r
26300+ sizeof(SK_PNMI_STAT),\r
26301+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx64Cts),\r
26302+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_64},\r
26303+ {OID_SKGE_STAT_TX_127,\r
26304+ SK_PNMI_MAC_ENTRIES,\r
26305+ sizeof(SK_PNMI_STAT),\r
26306+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx127Cts),\r
26307+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_127},\r
26308+ {OID_SKGE_STAT_TX_255,\r
26309+ SK_PNMI_MAC_ENTRIES,\r
26310+ sizeof(SK_PNMI_STAT),\r
26311+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx255Cts),\r
26312+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_255},\r
26313+ {OID_SKGE_STAT_TX_511,\r
26314+ SK_PNMI_MAC_ENTRIES,\r
26315+ sizeof(SK_PNMI_STAT),\r
26316+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx511Cts),\r
26317+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_511},\r
26318+ {OID_SKGE_STAT_TX_1023,\r
26319+ SK_PNMI_MAC_ENTRIES,\r
26320+ sizeof(SK_PNMI_STAT),\r
26321+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx1023Cts),\r
26322+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_1023},\r
26323+ {OID_SKGE_STAT_TX_MAX,\r
26324+ SK_PNMI_MAC_ENTRIES,\r
26325+ sizeof(SK_PNMI_STAT),\r
26326+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMaxCts),\r
26327+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MAX},\r
26328+ {OID_SKGE_STAT_TX_SYNC,\r
26329+ SK_PNMI_MAC_ENTRIES,\r
26330+ sizeof(SK_PNMI_STAT),\r
26331+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSyncCts),\r
26332+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SYNC},\r
26333+ {OID_SKGE_STAT_TX_SYNC_OCTETS,\r
26334+ SK_PNMI_MAC_ENTRIES,\r
26335+ sizeof(SK_PNMI_STAT),\r
26336+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSyncOctetsCts),\r
26337+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SYNC_OCTET},\r
26338+ {OID_SKGE_STAT_RX,\r
26339+ SK_PNMI_MAC_ENTRIES,\r
26340+ sizeof(SK_PNMI_STAT),\r
26341+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxOkCts),\r
26342+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX},\r
26343+ {OID_SKGE_STAT_RX_OCTETS,\r
26344+ SK_PNMI_MAC_ENTRIES,\r
26345+ sizeof(SK_PNMI_STAT),\r
26346+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxOctetsOkCts),\r
26347+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_OCTET},\r
26348+ {OID_SKGE_STAT_RX_BROADCAST,\r
26349+ SK_PNMI_MAC_ENTRIES,\r
26350+ sizeof(SK_PNMI_STAT),\r
26351+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxBroadcastOkCts),\r
26352+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_BROADCAST},\r
26353+ {OID_SKGE_STAT_RX_MULTICAST,\r
26354+ SK_PNMI_MAC_ENTRIES,\r
26355+ sizeof(SK_PNMI_STAT),\r
26356+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMulticastOkCts),\r
26357+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MULTICAST},\r
26358+ {OID_SKGE_STAT_RX_UNICAST,\r
26359+ SK_PNMI_MAC_ENTRIES,\r
26360+ sizeof(SK_PNMI_STAT),\r
26361+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxUnicastOkCts),\r
26362+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_UNICAST},\r
26363+ {OID_SKGE_STAT_RX_LONGFRAMES,\r
26364+ SK_PNMI_MAC_ENTRIES,\r
26365+ sizeof(SK_PNMI_STAT),\r
26366+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxLongFramesCts),\r
26367+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_LONGFRAMES},\r
26368+ {OID_SKGE_STAT_RX_PFLOWC,\r
26369+ SK_PNMI_MAC_ENTRIES,\r
26370+ sizeof(SK_PNMI_STAT),\r
26371+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxPauseMacCtrlCts),\r
26372+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_PMACC},\r
26373+ {OID_SKGE_STAT_RX_FLOWC,\r
26374+ SK_PNMI_MAC_ENTRIES,\r
26375+ sizeof(SK_PNMI_STAT),\r
26376+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMacCtrlCts),\r
26377+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MACC},\r
26378+ {OID_SKGE_STAT_RX_PFLOWC_ERR,\r
26379+ SK_PNMI_MAC_ENTRIES,\r
26380+ sizeof(SK_PNMI_STAT),\r
26381+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxPauseMacCtrlErrorCts),\r
26382+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_PMACC_ERR},\r
26383+ {OID_SKGE_STAT_RX_FLOWC_UNKWN,\r
26384+ SK_PNMI_MAC_ENTRIES,\r
26385+ sizeof(SK_PNMI_STAT),\r
26386+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMacCtrlUnknownCts),\r
26387+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MACC_UNKWN},\r
26388+ {OID_SKGE_STAT_RX_BURST,\r
26389+ SK_PNMI_MAC_ENTRIES,\r
26390+ sizeof(SK_PNMI_STAT),\r
26391+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxBurstCts),\r
26392+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_BURST},\r
26393+ {OID_SKGE_STAT_RX_MISSED,\r
26394+ SK_PNMI_MAC_ENTRIES,\r
26395+ sizeof(SK_PNMI_STAT),\r
26396+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMissedCts),\r
26397+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MISSED},\r
26398+ {OID_SKGE_STAT_RX_FRAMING,\r
26399+ SK_PNMI_MAC_ENTRIES,\r
26400+ sizeof(SK_PNMI_STAT),\r
26401+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFramingCts),\r
26402+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_FRAMING},\r
26403+ {OID_SKGE_STAT_RX_OVERFLOW,\r
26404+ SK_PNMI_MAC_ENTRIES,\r
26405+ sizeof(SK_PNMI_STAT),\r
26406+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFifoOverflowCts),\r
26407+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_OVERFLOW},\r
26408+ {OID_SKGE_STAT_RX_JABBER,\r
26409+ SK_PNMI_MAC_ENTRIES,\r
26410+ sizeof(SK_PNMI_STAT),\r
26411+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxJabberCts),\r
26412+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_JABBER},\r
26413+ {OID_SKGE_STAT_RX_CARRIER,\r
26414+ SK_PNMI_MAC_ENTRIES,\r
26415+ sizeof(SK_PNMI_STAT),\r
26416+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxCarrierCts),\r
26417+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_CARRIER},\r
26418+ {OID_SKGE_STAT_RX_IR_LENGTH,\r
26419+ SK_PNMI_MAC_ENTRIES,\r
26420+ sizeof(SK_PNMI_STAT),\r
26421+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxIRLengthCts),\r
26422+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_IRLENGTH},\r
26423+ {OID_SKGE_STAT_RX_SYMBOL,\r
26424+ SK_PNMI_MAC_ENTRIES,\r
26425+ sizeof(SK_PNMI_STAT),\r
26426+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxSymbolCts),\r
26427+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_SYMBOL},\r
26428+ {OID_SKGE_STAT_RX_SHORTS,\r
26429+ SK_PNMI_MAC_ENTRIES,\r
26430+ sizeof(SK_PNMI_STAT),\r
26431+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxShortsCts),\r
26432+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_SHORTS},\r
26433+ {OID_SKGE_STAT_RX_RUNT,\r
26434+ SK_PNMI_MAC_ENTRIES,\r
26435+ sizeof(SK_PNMI_STAT),\r
26436+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxRuntCts),\r
26437+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_RUNT},\r
26438+ {OID_SKGE_STAT_RX_CEXT,\r
26439+ SK_PNMI_MAC_ENTRIES,\r
26440+ sizeof(SK_PNMI_STAT),\r
26441+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxCextCts),\r
26442+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_CEXT},\r
26443+ {OID_SKGE_STAT_RX_TOO_LONG,\r
26444+ SK_PNMI_MAC_ENTRIES,\r
26445+ sizeof(SK_PNMI_STAT),\r
26446+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxTooLongCts),\r
26447+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_TOO_LONG},\r
26448+ {OID_SKGE_STAT_RX_FCS,\r
26449+ SK_PNMI_MAC_ENTRIES,\r
26450+ sizeof(SK_PNMI_STAT),\r
26451+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFcsCts),\r
26452+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_FCS},\r
26453+/* {OID_SKGE_STAT_RX_UTIL,\r
26454+ SK_PNMI_MAC_ENTRIES,\r
26455+ sizeof(SK_PNMI_STAT),\r
26456+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxUtilization),\r
26457+ SK_PNMI_RO, MacPrivateStat, (SK_U16)(-1)}, */\r
26458+ {OID_SKGE_STAT_RX_64,\r
26459+ SK_PNMI_MAC_ENTRIES,\r
26460+ sizeof(SK_PNMI_STAT),\r
26461+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx64Cts),\r
26462+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_64},\r
26463+ {OID_SKGE_STAT_RX_127,\r
26464+ SK_PNMI_MAC_ENTRIES,\r
26465+ sizeof(SK_PNMI_STAT),\r
26466+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx127Cts),\r
26467+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_127},\r
26468+ {OID_SKGE_STAT_RX_255,\r
26469+ SK_PNMI_MAC_ENTRIES,\r
26470+ sizeof(SK_PNMI_STAT),\r
26471+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx255Cts),\r
26472+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_255},\r
26473+ {OID_SKGE_STAT_RX_511,\r
26474+ SK_PNMI_MAC_ENTRIES,\r
26475+ sizeof(SK_PNMI_STAT),\r
26476+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx511Cts),\r
26477+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_511},\r
26478+ {OID_SKGE_STAT_RX_1023,\r
26479+ SK_PNMI_MAC_ENTRIES,\r
26480+ sizeof(SK_PNMI_STAT),\r
26481+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx1023Cts),\r
26482+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_1023},\r
26483+ {OID_SKGE_STAT_RX_MAX,\r
26484+ SK_PNMI_MAC_ENTRIES,\r
26485+ sizeof(SK_PNMI_STAT),\r
26486+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMaxCts),\r
26487+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MAX},\r
26488+ {OID_SKGE_PHYS_CUR_ADDR,\r
26489+ SK_PNMI_MAC_ENTRIES,\r
26490+ sizeof(SK_PNMI_CONF),\r
26491+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfMacCurrentAddr),\r
26492+ SK_PNMI_RW, Addr, 0},\r
26493+ {OID_SKGE_PHYS_FAC_ADDR,\r
26494+ SK_PNMI_MAC_ENTRIES,\r
26495+ sizeof(SK_PNMI_CONF),\r
26496+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfMacFactoryAddr),\r
26497+ SK_PNMI_RO, Addr, 0},\r
26498+ {OID_SKGE_PMD,\r
26499+ SK_PNMI_MAC_ENTRIES,\r
26500+ sizeof(SK_PNMI_CONF),\r
26501+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPMD),\r
26502+ SK_PNMI_RO, MacPrivateConf, 0},\r
26503+ {OID_SKGE_CONNECTOR,\r
26504+ SK_PNMI_MAC_ENTRIES,\r
26505+ sizeof(SK_PNMI_CONF),\r
26506+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfConnector),\r
26507+ SK_PNMI_RO, MacPrivateConf, 0},\r
26508+ {OID_SKGE_PHY_TYPE,\r
26509+ SK_PNMI_MAC_ENTRIES,\r
26510+ sizeof(SK_PNMI_CONF),\r
26511+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType),\r
26512+ SK_PNMI_RO, MacPrivateConf, 0},\r
26513+#ifdef SK_PHY_LP_MODE\r
26514+ {OID_SKGE_PHY_LP_MODE,\r
26515+ SK_PNMI_MAC_ENTRIES,\r
26516+ sizeof(SK_PNMI_CONF),\r
26517+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyMode),\r
26518+ SK_PNMI_RW, MacPrivateConf, 0},\r
26519+#endif \r
26520+ {OID_SKGE_LINK_CAP,\r
26521+ SK_PNMI_MAC_ENTRIES,\r
26522+ sizeof(SK_PNMI_CONF),\r
26523+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkCapability),\r
26524+ SK_PNMI_RO, MacPrivateConf, 0},\r
26525+ {OID_SKGE_LINK_MODE,\r
26526+ SK_PNMI_MAC_ENTRIES,\r
26527+ sizeof(SK_PNMI_CONF),\r
26528+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkMode),\r
26529+ SK_PNMI_RW, MacPrivateConf, 0},\r
26530+ {OID_SKGE_LINK_MODE_STATUS,\r
26531+ SK_PNMI_MAC_ENTRIES,\r
26532+ sizeof(SK_PNMI_CONF),\r
26533+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkModeStatus),\r
26534+ SK_PNMI_RO, MacPrivateConf, 0},\r
26535+ {OID_SKGE_LINK_STATUS,\r
26536+ SK_PNMI_MAC_ENTRIES,\r
26537+ sizeof(SK_PNMI_CONF),\r
26538+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkStatus),\r
26539+ SK_PNMI_RO, MacPrivateConf, 0},\r
26540+ {OID_SKGE_FLOWCTRL_CAP,\r
26541+ SK_PNMI_MAC_ENTRIES,\r
26542+ sizeof(SK_PNMI_CONF),\r
26543+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlCapability),\r
26544+ SK_PNMI_RO, MacPrivateConf, 0},\r
26545+ {OID_SKGE_FLOWCTRL_MODE,\r
26546+ SK_PNMI_MAC_ENTRIES,\r
26547+ sizeof(SK_PNMI_CONF),\r
26548+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlMode),\r
26549+ SK_PNMI_RW, MacPrivateConf, 0},\r
26550+ {OID_SKGE_FLOWCTRL_STATUS,\r
26551+ SK_PNMI_MAC_ENTRIES,\r
26552+ sizeof(SK_PNMI_CONF),\r
26553+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlStatus),\r
26554+ SK_PNMI_RO, MacPrivateConf, 0},\r
26555+ {OID_SKGE_PHY_OPERATION_CAP,\r
26556+ SK_PNMI_MAC_ENTRIES,\r
26557+ sizeof(SK_PNMI_CONF),\r
26558+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationCapability),\r
26559+ SK_PNMI_RO, MacPrivateConf, 0},\r
26560+ {OID_SKGE_PHY_OPERATION_MODE,\r
26561+ SK_PNMI_MAC_ENTRIES,\r
26562+ sizeof(SK_PNMI_CONF),\r
26563+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationMode),\r
26564+ SK_PNMI_RW, MacPrivateConf, 0},\r
26565+ {OID_SKGE_PHY_OPERATION_STATUS,\r
26566+ SK_PNMI_MAC_ENTRIES,\r
26567+ sizeof(SK_PNMI_CONF),\r
26568+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationStatus),\r
26569+ SK_PNMI_RO, MacPrivateConf, 0},\r
26570+ {OID_SKGE_SPEED_CAP,\r
26571+ SK_PNMI_MAC_ENTRIES,\r
26572+ sizeof(SK_PNMI_CONF),\r
26573+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfSpeedCapability),\r
26574+ SK_PNMI_RO, MacPrivateConf, 0},\r
26575+ {OID_SKGE_SPEED_MODE,\r
26576+ SK_PNMI_MAC_ENTRIES,\r
26577+ sizeof(SK_PNMI_CONF),\r
26578+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfSpeedMode),\r
26579+ SK_PNMI_RW, MacPrivateConf, 0},\r
26580+ {OID_SKGE_SPEED_STATUS,\r
26581+ SK_PNMI_MAC_ENTRIES,\r
26582+ sizeof(SK_PNMI_CONF),\r
26583+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfSpeedStatus),\r
26584+ SK_PNMI_RO, MacPrivateConf, 0},\r
26585+ {OID_SKGE_TRAP,\r
26586+ 1,\r
26587+ 0,\r
26588+ SK_PNMI_MAI_OFF(Trap),\r
26589+ SK_PNMI_RO, General, 0},\r
26590+ {OID_SKGE_TRAP_NUMBER,\r
26591+ 1,\r
26592+ 0,\r
26593+ SK_PNMI_MAI_OFF(TrapNumber),\r
26594+ SK_PNMI_RO, General, 0},\r
26595+ {OID_SKGE_RLMT_MODE,\r
26596+ 1,\r
26597+ 0,\r
26598+ SK_PNMI_MAI_OFF(RlmtMode),\r
26599+ SK_PNMI_RW, Rlmt, 0},\r
26600+ {OID_SKGE_RLMT_PORT_NUMBER,\r
26601+ 1,\r
26602+ 0,\r
26603+ SK_PNMI_MAI_OFF(RlmtPortNumber),\r
26604+ SK_PNMI_RO, Rlmt, 0},\r
26605+ {OID_SKGE_RLMT_PORT_ACTIVE,\r
26606+ 1,\r
26607+ 0,\r
26608+ SK_PNMI_MAI_OFF(RlmtPortActive),\r
26609+ SK_PNMI_RO, Rlmt, 0},\r
26610+ {OID_SKGE_RLMT_PORT_PREFERRED,\r
26611+ 1,\r
26612+ 0,\r
26613+ SK_PNMI_MAI_OFF(RlmtPortPreferred),\r
26614+ SK_PNMI_RW, Rlmt, 0},\r
26615+ {OID_SKGE_RLMT_CHANGE_CTS,\r
26616+ 1,\r
26617+ 0,\r
26618+ SK_PNMI_MAI_OFF(RlmtChangeCts),\r
26619+ SK_PNMI_RO, Rlmt, 0},\r
26620+ {OID_SKGE_RLMT_CHANGE_TIME,\r
26621+ 1,\r
26622+ 0,\r
26623+ SK_PNMI_MAI_OFF(RlmtChangeTime),\r
26624+ SK_PNMI_RO, Rlmt, 0},\r
26625+ {OID_SKGE_RLMT_CHANGE_ESTIM,\r
26626+ 1,\r
26627+ 0,\r
26628+ SK_PNMI_MAI_OFF(RlmtChangeEstimate),\r
26629+ SK_PNMI_RO, Rlmt, 0},\r
26630+ {OID_SKGE_RLMT_CHANGE_THRES,\r
26631+ 1,\r
26632+ 0,\r
26633+ SK_PNMI_MAI_OFF(RlmtChangeThreshold),\r
26634+ SK_PNMI_RW, Rlmt, 0},\r
26635+ {OID_SKGE_RLMT_PORT_INDEX,\r
26636+ SK_PNMI_MAC_ENTRIES,\r
26637+ sizeof(SK_PNMI_RLMT),\r
26638+ SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtIndex),\r
26639+ SK_PNMI_RO, RlmtStat, 0},\r
26640+ {OID_SKGE_RLMT_STATUS,\r
26641+ SK_PNMI_MAC_ENTRIES,\r
26642+ sizeof(SK_PNMI_RLMT),\r
26643+ SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtStatus),\r
26644+ SK_PNMI_RO, RlmtStat, 0},\r
26645+ {OID_SKGE_RLMT_TX_HELLO_CTS,\r
26646+ SK_PNMI_MAC_ENTRIES,\r
26647+ sizeof(SK_PNMI_RLMT),\r
26648+ SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtTxHelloCts),\r
26649+ SK_PNMI_RO, RlmtStat, 0},\r
26650+ {OID_SKGE_RLMT_RX_HELLO_CTS,\r
26651+ SK_PNMI_MAC_ENTRIES,\r
26652+ sizeof(SK_PNMI_RLMT),\r
26653+ SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtRxHelloCts),\r
26654+ SK_PNMI_RO, RlmtStat, 0},\r
26655+ {OID_SKGE_RLMT_TX_SP_REQ_CTS,\r
26656+ SK_PNMI_MAC_ENTRIES,\r
26657+ sizeof(SK_PNMI_RLMT),\r
26658+ SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtTxSpHelloReqCts),\r
26659+ SK_PNMI_RO, RlmtStat, 0},\r
26660+ {OID_SKGE_RLMT_RX_SP_CTS,\r
26661+ SK_PNMI_MAC_ENTRIES,\r
26662+ sizeof(SK_PNMI_RLMT),\r
26663+ SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtRxSpHelloCts),\r
26664+ SK_PNMI_RO, RlmtStat, 0},\r
26665+ {OID_SKGE_RLMT_MONITOR_NUMBER,\r
26666+ 1,\r
26667+ 0,\r
26668+ SK_PNMI_MAI_OFF(RlmtMonitorNumber),\r
26669+ SK_PNMI_RO, General, 0},\r
26670+ {OID_SKGE_RLMT_MONITOR_INDEX,\r
26671+ SK_PNMI_MONITOR_ENTRIES,\r
26672+ sizeof(SK_PNMI_RLMT_MONITOR),\r
26673+ SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorIndex),\r
26674+ SK_PNMI_RO, Monitor, 0},\r
26675+ {OID_SKGE_RLMT_MONITOR_ADDR,\r
26676+ SK_PNMI_MONITOR_ENTRIES,\r
26677+ sizeof(SK_PNMI_RLMT_MONITOR),\r
26678+ SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorAddr),\r
26679+ SK_PNMI_RO, Monitor, 0},\r
26680+ {OID_SKGE_RLMT_MONITOR_ERRS,\r
26681+ SK_PNMI_MONITOR_ENTRIES,\r
26682+ sizeof(SK_PNMI_RLMT_MONITOR),\r
26683+ SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorErrorCts),\r
26684+ SK_PNMI_RO, Monitor, 0},\r
26685+ {OID_SKGE_RLMT_MONITOR_TIMESTAMP,\r
26686+ SK_PNMI_MONITOR_ENTRIES,\r
26687+ sizeof(SK_PNMI_RLMT_MONITOR),\r
26688+ SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorTimestamp),\r
26689+ SK_PNMI_RO, Monitor, 0},\r
26690+ {OID_SKGE_RLMT_MONITOR_ADMIN,\r
26691+ SK_PNMI_MONITOR_ENTRIES,\r
26692+ sizeof(SK_PNMI_RLMT_MONITOR),\r
26693+ SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorAdmin),\r
26694+ SK_PNMI_RW, Monitor, 0},\r
26695+ {OID_SKGE_MTU,\r
26696+ 1,\r
26697+ 0,\r
26698+ SK_PNMI_MAI_OFF(MtuSize),\r
26699+ SK_PNMI_RW, MacPrivateConf, 0},\r
26700+ {OID_SKGE_VCT_GET,\r
26701+ 0,\r
26702+ 0,\r
26703+ 0,\r
26704+ SK_PNMI_RO, Vct, 0},\r
26705+ {OID_SKGE_VCT_SET,\r
26706+ 0,\r
26707+ 0,\r
26708+ 0,\r
26709+ SK_PNMI_WO, Vct, 0},\r
26710+ {OID_SKGE_VCT_STATUS,\r
26711+ 0,\r
26712+ 0,\r
26713+ 0,\r
26714+ SK_PNMI_RO, Vct, 0},\r
26715+ {OID_SKGE_VCT_CAPABILITIES,\r
26716+ 0,\r
26717+ 0,\r
26718+ 0,\r
26719+ SK_PNMI_RO, Vct, 0},\r
26720+ {OID_SKGE_BOARDLEVEL,\r
26721+ 0,\r
26722+ 0,\r
26723+ 0,\r
26724+ SK_PNMI_RO, General, 0},\r
26725+};\r
26726+\r
26727diff -ruN linux/drivers/net/sk98lin/skgepnmi.c linux-new/drivers/net/sk98lin/skgepnmi.c
26728--- linux/drivers/net/sk98lin/skgepnmi.c 2006-04-11 19:19:28.000000000 +0200
26729+++ linux-new/drivers/net/sk98lin/skgepnmi.c 2006-01-18 14:37:24.000000000 +0100
26730@@ -1,8359 +1,8351 @@
26731-/*****************************************************************************
26732- *
26733- * Name: skgepnmi.c
26734- * Project: GEnesis, PCI Gigabit Ethernet Adapter
26735- * Version: $Revision$
26736- * Date: $Date$
26737- * Purpose: Private Network Management Interface
26738- *
26739- ****************************************************************************/
26740-
26741-/******************************************************************************
26742- *
26743- * (C)Copyright 1998-2002 SysKonnect GmbH.
26744- * (C)Copyright 2002-2003 Marvell.
26745- *
26746- * This program is free software; you can redistribute it and/or modify
26747- * it under the terms of the GNU General Public License as published by
26748- * the Free Software Foundation; either version 2 of the License, or
26749- * (at your option) any later version.
26750- *
26751- * The information in this file is provided "AS IS" without warranty.
26752- *
26753- ******************************************************************************/
26754-
26755-
26756-#ifndef _lint
26757-static const char SysKonnectFileId[] =
26758- "@(#) $Id$ (C) Marvell.";
26759-#endif /* !_lint */
26760-
26761-#include "h/skdrv1st.h"
26762-#include "h/sktypes.h"
26763-#include "h/xmac_ii.h"
26764-#include "h/skdebug.h"
26765-#include "h/skqueue.h"
26766-#include "h/skgepnmi.h"
26767-#include "h/skgesirq.h"
26768-#include "h/skcsum.h"
26769-#include "h/skvpd.h"
26770-#include "h/skgehw.h"
26771-#include "h/skgeinit.h"
26772-#include "h/skdrv2nd.h"
26773-#include "h/skgepnm2.h"
26774-#ifdef SK_POWER_MGMT
26775-#include "h/skgepmgt.h"
26776-#endif
26777-/* defines *******************************************************************/
26778-
26779-#ifndef DEBUG
26780-#define PNMI_STATIC static
26781-#else /* DEBUG */
26782-#define PNMI_STATIC
26783-#endif /* DEBUG */
26784-
26785-/*
26786- * Public Function prototypes
26787- */
26788-int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int level);
26789-int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
26790- unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
26791-int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
26792- unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
26793-int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
26794- unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
26795-int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,
26796- unsigned int *pLen, SK_U32 NetIndex);
26797-int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,
26798- unsigned int *pLen, SK_U32 NetIndex);
26799-int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,
26800- unsigned int *pLen, SK_U32 NetIndex);
26801-int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Param);
26802-int SkPnmiGenIoctl(SK_AC *pAC, SK_IOC IoC, void * pBuf,
26803- unsigned int * pLen, SK_U32 NetIndex);
26804-
26805-
26806-/*
26807- * Private Function prototypes
26808- */
26809-
26810-PNMI_STATIC SK_U8 CalculateLinkModeStatus(SK_AC *pAC, SK_IOC IoC, unsigned int
26811- PhysPortIndex);
26812-PNMI_STATIC SK_U8 CalculateLinkStatus(SK_AC *pAC, SK_IOC IoC, unsigned int
26813- PhysPortIndex);
26814-PNMI_STATIC void CopyMac(char *pDst, SK_MAC_ADDR *pMac);
26815-PNMI_STATIC void CopyTrapQueue(SK_AC *pAC, char *pDstBuf);
26816-PNMI_STATIC SK_U64 GetPhysStatVal(SK_AC *pAC, SK_IOC IoC,
26817- unsigned int PhysPortIndex, unsigned int StatIndex);
26818-PNMI_STATIC SK_U64 GetStatVal(SK_AC *pAC, SK_IOC IoC, unsigned int LogPortIndex,
26819- unsigned int StatIndex, SK_U32 NetIndex);
26820-PNMI_STATIC char* GetTrapEntry(SK_AC *pAC, SK_U32 TrapId, unsigned int Size);
26821-PNMI_STATIC void GetTrapQueueLen(SK_AC *pAC, unsigned int *pLen,
26822- unsigned int *pEntries);
26823-PNMI_STATIC int GetVpdKeyArr(SK_AC *pAC, SK_IOC IoC, char *pKeyArr,
26824- unsigned int KeyArrLen, unsigned int *pKeyNo);
26825-PNMI_STATIC int LookupId(SK_U32 Id);
26826-PNMI_STATIC int MacUpdate(SK_AC *pAC, SK_IOC IoC, unsigned int FirstMac,
26827- unsigned int LastMac);
26828-PNMI_STATIC int PnmiStruct(SK_AC *pAC, SK_IOC IoC, int Action, char *pBuf,
26829- unsigned int *pLen, SK_U32 NetIndex);
26830-PNMI_STATIC int PnmiVar(SK_AC *pAC, SK_IOC IoC, int Action, SK_U32 Id,
26831- char *pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
26832-PNMI_STATIC void QueueRlmtNewMacTrap(SK_AC *pAC, unsigned int ActiveMac);
26833-PNMI_STATIC void QueueRlmtPortTrap(SK_AC *pAC, SK_U32 TrapId,
26834- unsigned int PortIndex);
26835-PNMI_STATIC void QueueSensorTrap(SK_AC *pAC, SK_U32 TrapId,
26836- unsigned int SensorIndex);
26837-PNMI_STATIC void QueueSimpleTrap(SK_AC *pAC, SK_U32 TrapId);
26838-PNMI_STATIC void ResetCounter(SK_AC *pAC, SK_IOC IoC, SK_U32 NetIndex);
26839-PNMI_STATIC int RlmtUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 NetIndex);
26840-PNMI_STATIC int SirqUpdate(SK_AC *pAC, SK_IOC IoC);
26841-PNMI_STATIC void VirtualConf(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, char *pBuf);
26842-PNMI_STATIC int Vct(SK_AC *pAC, SK_IOC IoC, int Action, SK_U32 Id, char *pBuf,
26843- unsigned int *pLen, SK_U32 Instance, unsigned int TableIndex, SK_U32 NetIndex);
26844-PNMI_STATIC void CheckVctStatus(SK_AC *, SK_IOC, char *, SK_U32, SK_U32);
26845-
26846-/*
26847- * Table to correlate OID with handler function and index to
26848- * hardware register stored in StatAddress if applicable.
26849- */
26850-#include "skgemib.c"
26851-
26852-/* global variables **********************************************************/
26853-
26854-/*
26855- * Overflow status register bit table and corresponding counter
26856- * dependent on MAC type - the number relates to the size of overflow
26857- * mask returned by the pFnMacOverflow function
26858- */
26859-PNMI_STATIC const SK_U16 StatOvrflwBit[][SK_PNMI_MAC_TYPES] = {
26860-/* Bit0 */ { SK_PNMI_HTX, SK_PNMI_HTX_UNICAST},
26861-/* Bit1 */ { SK_PNMI_HTX_OCTETHIGH, SK_PNMI_HTX_BROADCAST},
26862-/* Bit2 */ { SK_PNMI_HTX_OCTETLOW, SK_PNMI_HTX_PMACC},
26863-/* Bit3 */ { SK_PNMI_HTX_BROADCAST, SK_PNMI_HTX_MULTICAST},
26864-/* Bit4 */ { SK_PNMI_HTX_MULTICAST, SK_PNMI_HTX_OCTETLOW},
26865-/* Bit5 */ { SK_PNMI_HTX_UNICAST, SK_PNMI_HTX_OCTETHIGH},
26866-/* Bit6 */ { SK_PNMI_HTX_LONGFRAMES, SK_PNMI_HTX_64},
26867-/* Bit7 */ { SK_PNMI_HTX_BURST, SK_PNMI_HTX_127},
26868-/* Bit8 */ { SK_PNMI_HTX_PMACC, SK_PNMI_HTX_255},
26869-/* Bit9 */ { SK_PNMI_HTX_MACC, SK_PNMI_HTX_511},
26870-/* Bit10 */ { SK_PNMI_HTX_SINGLE_COL, SK_PNMI_HTX_1023},
26871-/* Bit11 */ { SK_PNMI_HTX_MULTI_COL, SK_PNMI_HTX_MAX},
26872-/* Bit12 */ { SK_PNMI_HTX_EXCESS_COL, SK_PNMI_HTX_LONGFRAMES},
26873-/* Bit13 */ { SK_PNMI_HTX_LATE_COL, SK_PNMI_HTX_RESERVED},
26874-/* Bit14 */ { SK_PNMI_HTX_DEFFERAL, SK_PNMI_HTX_COL},
26875-/* Bit15 */ { SK_PNMI_HTX_EXCESS_DEF, SK_PNMI_HTX_LATE_COL},
26876-/* Bit16 */ { SK_PNMI_HTX_UNDERRUN, SK_PNMI_HTX_EXCESS_COL},
26877-/* Bit17 */ { SK_PNMI_HTX_CARRIER, SK_PNMI_HTX_MULTI_COL},
26878-/* Bit18 */ { SK_PNMI_HTX_UTILUNDER, SK_PNMI_HTX_SINGLE_COL},
26879-/* Bit19 */ { SK_PNMI_HTX_UTILOVER, SK_PNMI_HTX_UNDERRUN},
26880-/* Bit20 */ { SK_PNMI_HTX_64, SK_PNMI_HTX_RESERVED},
26881-/* Bit21 */ { SK_PNMI_HTX_127, SK_PNMI_HTX_RESERVED},
26882-/* Bit22 */ { SK_PNMI_HTX_255, SK_PNMI_HTX_RESERVED},
26883-/* Bit23 */ { SK_PNMI_HTX_511, SK_PNMI_HTX_RESERVED},
26884-/* Bit24 */ { SK_PNMI_HTX_1023, SK_PNMI_HTX_RESERVED},
26885-/* Bit25 */ { SK_PNMI_HTX_MAX, SK_PNMI_HTX_RESERVED},
26886-/* Bit26 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},
26887-/* Bit27 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},
26888-/* Bit28 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},
26889-/* Bit29 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},
26890-/* Bit30 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},
26891-/* Bit31 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},
26892-/* Bit32 */ { SK_PNMI_HRX, SK_PNMI_HRX_UNICAST},
26893-/* Bit33 */ { SK_PNMI_HRX_OCTETHIGH, SK_PNMI_HRX_BROADCAST},
26894-/* Bit34 */ { SK_PNMI_HRX_OCTETLOW, SK_PNMI_HRX_PMACC},
26895-/* Bit35 */ { SK_PNMI_HRX_BROADCAST, SK_PNMI_HRX_MULTICAST},
26896-/* Bit36 */ { SK_PNMI_HRX_MULTICAST, SK_PNMI_HRX_FCS},
26897-/* Bit37 */ { SK_PNMI_HRX_UNICAST, SK_PNMI_HRX_RESERVED},
26898-/* Bit38 */ { SK_PNMI_HRX_PMACC, SK_PNMI_HRX_OCTETLOW},
26899-/* Bit39 */ { SK_PNMI_HRX_MACC, SK_PNMI_HRX_OCTETHIGH},
26900-/* Bit40 */ { SK_PNMI_HRX_PMACC_ERR, SK_PNMI_HRX_BADOCTETLOW},
26901-/* Bit41 */ { SK_PNMI_HRX_MACC_UNKWN, SK_PNMI_HRX_BADOCTETHIGH},
26902-/* Bit42 */ { SK_PNMI_HRX_BURST, SK_PNMI_HRX_UNDERSIZE},
26903-/* Bit43 */ { SK_PNMI_HRX_MISSED, SK_PNMI_HRX_RUNT},
26904-/* Bit44 */ { SK_PNMI_HRX_FRAMING, SK_PNMI_HRX_64},
26905-/* Bit45 */ { SK_PNMI_HRX_OVERFLOW, SK_PNMI_HRX_127},
26906-/* Bit46 */ { SK_PNMI_HRX_JABBER, SK_PNMI_HRX_255},
26907-/* Bit47 */ { SK_PNMI_HRX_CARRIER, SK_PNMI_HRX_511},
26908-/* Bit48 */ { SK_PNMI_HRX_IRLENGTH, SK_PNMI_HRX_1023},
26909-/* Bit49 */ { SK_PNMI_HRX_SYMBOL, SK_PNMI_HRX_MAX},
26910-/* Bit50 */ { SK_PNMI_HRX_SHORTS, SK_PNMI_HRX_LONGFRAMES},
26911-/* Bit51 */ { SK_PNMI_HRX_RUNT, SK_PNMI_HRX_TOO_LONG},
26912-/* Bit52 */ { SK_PNMI_HRX_TOO_LONG, SK_PNMI_HRX_JABBER},
26913-/* Bit53 */ { SK_PNMI_HRX_FCS, SK_PNMI_HRX_RESERVED},
26914-/* Bit54 */ { SK_PNMI_HRX_RESERVED, SK_PNMI_HRX_OVERFLOW},
26915-/* Bit55 */ { SK_PNMI_HRX_CEXT, SK_PNMI_HRX_RESERVED},
26916-/* Bit56 */ { SK_PNMI_HRX_UTILUNDER, SK_PNMI_HRX_RESERVED},
26917-/* Bit57 */ { SK_PNMI_HRX_UTILOVER, SK_PNMI_HRX_RESERVED},
26918-/* Bit58 */ { SK_PNMI_HRX_64, SK_PNMI_HRX_RESERVED},
26919-/* Bit59 */ { SK_PNMI_HRX_127, SK_PNMI_HRX_RESERVED},
26920-/* Bit60 */ { SK_PNMI_HRX_255, SK_PNMI_HRX_RESERVED},
26921-/* Bit61 */ { SK_PNMI_HRX_511, SK_PNMI_HRX_RESERVED},
26922-/* Bit62 */ { SK_PNMI_HRX_1023, SK_PNMI_HRX_RESERVED},
26923-/* Bit63 */ { SK_PNMI_HRX_MAX, SK_PNMI_HRX_RESERVED}
26924-};
26925-
26926-/*
26927- * Table for hardware register saving on resets and port switches
26928- */
26929-PNMI_STATIC const SK_PNMI_STATADDR StatAddr[SK_PNMI_MAX_IDX][SK_PNMI_MAC_TYPES] = {
26930- /* SK_PNMI_HTX */
26931- {{XM_TXF_OK, SK_TRUE}, {0, SK_FALSE}},
26932- /* SK_PNMI_HTX_OCTETHIGH */
26933- {{XM_TXO_OK_HI, SK_TRUE}, {GM_TXO_OK_HI, SK_TRUE}},
26934- /* SK_PNMI_HTX_OCTETLOW */
26935- {{XM_TXO_OK_LO, SK_FALSE}, {GM_TXO_OK_LO, SK_FALSE}},
26936- /* SK_PNMI_HTX_BROADCAST */
26937- {{XM_TXF_BC_OK, SK_TRUE}, {GM_TXF_BC_OK, SK_TRUE}},
26938- /* SK_PNMI_HTX_MULTICAST */
26939- {{XM_TXF_MC_OK, SK_TRUE}, {GM_TXF_MC_OK, SK_TRUE}},
26940- /* SK_PNMI_HTX_UNICAST */
26941- {{XM_TXF_UC_OK, SK_TRUE}, {GM_TXF_UC_OK, SK_TRUE}},
26942- /* SK_PNMI_HTX_BURST */
26943- {{XM_TXE_BURST, SK_TRUE}, {0, SK_FALSE}},
26944- /* SK_PNMI_HTX_PMACC */
26945- {{XM_TXF_MPAUSE, SK_TRUE}, {GM_TXF_MPAUSE, SK_TRUE}},
26946- /* SK_PNMI_HTX_MACC */
26947- {{XM_TXF_MCTRL, SK_TRUE}, {0, SK_FALSE}},
26948- /* SK_PNMI_HTX_COL */
26949- {{0, SK_FALSE}, {GM_TXF_COL, SK_TRUE}},
26950- /* SK_PNMI_HTX_SINGLE_COL */
26951- {{XM_TXF_SNG_COL, SK_TRUE}, {GM_TXF_SNG_COL, SK_TRUE}},
26952- /* SK_PNMI_HTX_MULTI_COL */
26953- {{XM_TXF_MUL_COL, SK_TRUE}, {GM_TXF_MUL_COL, SK_TRUE}},
26954- /* SK_PNMI_HTX_EXCESS_COL */
26955- {{XM_TXF_ABO_COL, SK_TRUE}, {GM_TXF_ABO_COL, SK_TRUE}},
26956- /* SK_PNMI_HTX_LATE_COL */
26957- {{XM_TXF_LAT_COL, SK_TRUE}, {GM_TXF_LAT_COL, SK_TRUE}},
26958- /* SK_PNMI_HTX_DEFFERAL */
26959- {{XM_TXF_DEF, SK_TRUE}, {0, SK_FALSE}},
26960- /* SK_PNMI_HTX_EXCESS_DEF */
26961- {{XM_TXF_EX_DEF, SK_TRUE}, {0, SK_FALSE}},
26962- /* SK_PNMI_HTX_UNDERRUN */
26963- {{XM_TXE_FIFO_UR, SK_TRUE}, {GM_TXE_FIFO_UR, SK_TRUE}},
26964- /* SK_PNMI_HTX_CARRIER */
26965- {{XM_TXE_CS_ERR, SK_TRUE}, {0, SK_FALSE}},
26966- /* SK_PNMI_HTX_UTILUNDER */
26967- {{0, SK_FALSE}, {0, SK_FALSE}},
26968- /* SK_PNMI_HTX_UTILOVER */
26969- {{0, SK_FALSE}, {0, SK_FALSE}},
26970- /* SK_PNMI_HTX_64 */
26971- {{XM_TXF_64B, SK_TRUE}, {GM_TXF_64B, SK_TRUE}},
26972- /* SK_PNMI_HTX_127 */
26973- {{XM_TXF_127B, SK_TRUE}, {GM_TXF_127B, SK_TRUE}},
26974- /* SK_PNMI_HTX_255 */
26975- {{XM_TXF_255B, SK_TRUE}, {GM_TXF_255B, SK_TRUE}},
26976- /* SK_PNMI_HTX_511 */
26977- {{XM_TXF_511B, SK_TRUE}, {GM_TXF_511B, SK_TRUE}},
26978- /* SK_PNMI_HTX_1023 */
26979- {{XM_TXF_1023B, SK_TRUE}, {GM_TXF_1023B, SK_TRUE}},
26980- /* SK_PNMI_HTX_MAX */
26981- {{XM_TXF_MAX_SZ, SK_TRUE}, {GM_TXF_1518B, SK_TRUE}},
26982- /* SK_PNMI_HTX_LONGFRAMES */
26983- {{XM_TXF_LONG, SK_TRUE}, {GM_TXF_MAX_SZ, SK_TRUE}},
26984- /* SK_PNMI_HTX_SYNC */
26985- {{0, SK_FALSE}, {0, SK_FALSE}},
26986- /* SK_PNMI_HTX_SYNC_OCTET */
26987- {{0, SK_FALSE}, {0, SK_FALSE}},
26988- /* SK_PNMI_HTX_RESERVED */
26989- {{0, SK_FALSE}, {0, SK_FALSE}},
26990- /* SK_PNMI_HRX */
26991- {{XM_RXF_OK, SK_TRUE}, {0, SK_FALSE}},
26992- /* SK_PNMI_HRX_OCTETHIGH */
26993- {{XM_RXO_OK_HI, SK_TRUE}, {GM_RXO_OK_HI, SK_TRUE}},
26994- /* SK_PNMI_HRX_OCTETLOW */
26995- {{XM_RXO_OK_LO, SK_FALSE}, {GM_RXO_OK_LO, SK_FALSE}},
26996- /* SK_PNMI_HRX_BADOCTETHIGH */
26997- {{0, SK_FALSE}, {GM_RXO_ERR_HI, SK_TRUE}},
26998- /* SK_PNMI_HRX_BADOCTETLOW */
26999- {{0, SK_FALSE}, {GM_RXO_ERR_LO, SK_TRUE}},
27000- /* SK_PNMI_HRX_BROADCAST */
27001- {{XM_RXF_BC_OK, SK_TRUE}, {GM_RXF_BC_OK, SK_TRUE}},
27002- /* SK_PNMI_HRX_MULTICAST */
27003- {{XM_RXF_MC_OK, SK_TRUE}, {GM_RXF_MC_OK, SK_TRUE}},
27004- /* SK_PNMI_HRX_UNICAST */
27005- {{XM_RXF_UC_OK, SK_TRUE}, {GM_RXF_UC_OK, SK_TRUE}},
27006- /* SK_PNMI_HRX_PMACC */
27007- {{XM_RXF_MPAUSE, SK_TRUE}, {GM_RXF_MPAUSE, SK_TRUE}},
27008- /* SK_PNMI_HRX_MACC */
27009- {{XM_RXF_MCTRL, SK_TRUE}, {0, SK_FALSE}},
27010- /* SK_PNMI_HRX_PMACC_ERR */
27011- {{XM_RXF_INV_MP, SK_TRUE}, {0, SK_FALSE}},
27012- /* SK_PNMI_HRX_MACC_UNKWN */
27013- {{XM_RXF_INV_MOC, SK_TRUE}, {0, SK_FALSE}},
27014- /* SK_PNMI_HRX_BURST */
27015- {{XM_RXE_BURST, SK_TRUE}, {0, SK_FALSE}},
27016- /* SK_PNMI_HRX_MISSED */
27017- {{XM_RXE_FMISS, SK_TRUE}, {0, SK_FALSE}},
27018- /* SK_PNMI_HRX_FRAMING */
27019- {{XM_RXF_FRA_ERR, SK_TRUE}, {0, SK_FALSE}},
27020- /* SK_PNMI_HRX_UNDERSIZE */
27021- {{0, SK_FALSE}, {GM_RXF_SHT, SK_TRUE}},
27022- /* SK_PNMI_HRX_OVERFLOW */
27023- {{XM_RXE_FIFO_OV, SK_TRUE}, {GM_RXE_FIFO_OV, SK_TRUE}},
27024- /* SK_PNMI_HRX_JABBER */
27025- {{XM_RXF_JAB_PKT, SK_TRUE}, {GM_RXF_JAB_PKT, SK_TRUE}},
27026- /* SK_PNMI_HRX_CARRIER */
27027- {{XM_RXE_CAR_ERR, SK_TRUE}, {0, SK_FALSE}},
27028- /* SK_PNMI_HRX_IRLENGTH */
27029- {{XM_RXF_LEN_ERR, SK_TRUE}, {0, SK_FALSE}},
27030- /* SK_PNMI_HRX_SYMBOL */
27031- {{XM_RXE_SYM_ERR, SK_TRUE}, {0, SK_FALSE}},
27032- /* SK_PNMI_HRX_SHORTS */
27033- {{XM_RXE_SHT_ERR, SK_TRUE}, {0, SK_FALSE}},
27034- /* SK_PNMI_HRX_RUNT */
27035- {{XM_RXE_RUNT, SK_TRUE}, {GM_RXE_FRAG, SK_TRUE}},
27036- /* SK_PNMI_HRX_TOO_LONG */
27037- {{XM_RXF_LNG_ERR, SK_TRUE}, {GM_RXF_LNG_ERR, SK_TRUE}},
27038- /* SK_PNMI_HRX_FCS */
27039- {{XM_RXF_FCS_ERR, SK_TRUE}, {GM_RXF_FCS_ERR, SK_TRUE}},
27040- /* SK_PNMI_HRX_CEXT */
27041- {{XM_RXF_CEX_ERR, SK_TRUE}, {0, SK_FALSE}},
27042- /* SK_PNMI_HRX_UTILUNDER */
27043- {{0, SK_FALSE}, {0, SK_FALSE}},
27044- /* SK_PNMI_HRX_UTILOVER */
27045- {{0, SK_FALSE}, {0, SK_FALSE}},
27046- /* SK_PNMI_HRX_64 */
27047- {{XM_RXF_64B, SK_TRUE}, {GM_RXF_64B, SK_TRUE}},
27048- /* SK_PNMI_HRX_127 */
27049- {{XM_RXF_127B, SK_TRUE}, {GM_RXF_127B, SK_TRUE}},
27050- /* SK_PNMI_HRX_255 */
27051- {{XM_RXF_255B, SK_TRUE}, {GM_RXF_255B, SK_TRUE}},
27052- /* SK_PNMI_HRX_511 */
27053- {{XM_RXF_511B, SK_TRUE}, {GM_RXF_511B, SK_TRUE}},
27054- /* SK_PNMI_HRX_1023 */
27055- {{XM_RXF_1023B, SK_TRUE}, {GM_RXF_1023B, SK_TRUE}},
27056- /* SK_PNMI_HRX_MAX */
27057- {{XM_RXF_MAX_SZ, SK_TRUE}, {GM_RXF_1518B, SK_TRUE}},
27058- /* SK_PNMI_HRX_LONGFRAMES */
27059- {{0, SK_FALSE}, {GM_RXF_MAX_SZ, SK_TRUE}},
27060- /* SK_PNMI_HRX_RESERVED */
27061- {{0, SK_FALSE}, {0, SK_FALSE}}
27062-};
27063-
27064-
27065-/*****************************************************************************
27066- *
27067- * Public functions
27068- *
27069- */
27070-
27071-/*****************************************************************************
27072- *
27073- * SkPnmiInit - Init function of PNMI
27074- *
27075- * Description:
27076- * SK_INIT_DATA: Initialises the data structures
27077- * SK_INIT_IO: Resets the XMAC statistics, determines the device and
27078- * connector type.
27079- * SK_INIT_RUN: Starts a timer event for port switch per hour
27080- * calculation.
27081- *
27082- * Returns:
27083- * Always 0
27084- */
27085-int SkPnmiInit(
27086-SK_AC *pAC, /* Pointer to adapter context */
27087-SK_IOC IoC, /* IO context handle */
27088-int Level) /* Initialization level */
27089-{
27090- unsigned int PortMax; /* Number of ports */
27091- unsigned int PortIndex; /* Current port index in loop */
27092- SK_U16 Val16; /* Multiple purpose 16 bit variable */
27093- SK_U8 Val8; /* Mulitple purpose 8 bit variable */
27094- SK_EVPARA EventParam; /* Event struct for timer event */
27095- SK_PNMI_VCT *pVctBackupData;
27096-
27097-
27098- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27099- ("PNMI: SkPnmiInit: Called, level=%d\n", Level));
27100-
27101- switch (Level) {
27102-
27103- case SK_INIT_DATA:
27104- SK_MEMSET((char *)&pAC->Pnmi, 0, sizeof(pAC->Pnmi));
27105- pAC->Pnmi.TrapBufFree = SK_PNMI_TRAP_QUEUE_LEN;
27106- pAC->Pnmi.StartUpTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));
27107- pAC->Pnmi.RlmtChangeThreshold = SK_PNMI_DEF_RLMT_CHG_THRES;
27108- for (PortIndex = 0; PortIndex < SK_MAX_MACS; PortIndex ++) {
27109-
27110- pAC->Pnmi.Port[PortIndex].ActiveFlag = SK_FALSE;
27111- pAC->Pnmi.DualNetActiveFlag = SK_FALSE;
27112- }
27113-
27114-#ifdef SK_PNMI_CHECK
27115- if (SK_PNMI_MAX_IDX != SK_PNMI_CNT_NO) {
27116-
27117- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR049, SK_PNMI_ERR049MSG);
27118-
27119- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_INIT | SK_DBGCAT_FATAL,
27120- ("CounterOffset struct size (%d) differs from"
27121- "SK_PNMI_MAX_IDX (%d)\n",
27122- SK_PNMI_CNT_NO, SK_PNMI_MAX_IDX));
27123- }
27124-
27125- if (SK_PNMI_MAX_IDX !=
27126- (sizeof(StatAddr) / (sizeof(SK_PNMI_STATADDR) * SK_PNMI_MAC_TYPES))) {
27127-
27128- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR050, SK_PNMI_ERR050MSG);
27129-
27130- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_INIT | SK_DBGCAT_FATAL,
27131- ("StatAddr table size (%d) differs from "
27132- "SK_PNMI_MAX_IDX (%d)\n",
27133- (sizeof(StatAddr) /
27134- (sizeof(SK_PNMI_STATADDR) * SK_PNMI_MAC_TYPES)),
27135- SK_PNMI_MAX_IDX));
27136- }
27137-#endif /* SK_PNMI_CHECK */
27138- break;
27139-
27140- case SK_INIT_IO:
27141- /*
27142- * Reset MAC counters
27143- */
27144- PortMax = pAC->GIni.GIMacsFound;
27145-
27146- for (PortIndex = 0; PortIndex < PortMax; PortIndex ++) {
27147-
27148- pAC->GIni.GIFunc.pFnMacResetCounter(pAC, IoC, PortIndex);
27149- }
27150-
27151- /* Initialize DSP variables for Vct() to 0xff => Never written! */
27152- for (PortIndex = 0; PortIndex < PortMax; PortIndex ++) {
27153- pAC->GIni.GP[PortIndex].PCableLen = 0xff;
27154- pVctBackupData = &pAC->Pnmi.VctBackup[PortIndex];
27155- pVctBackupData->PCableLen = 0xff;
27156- }
27157-
27158- /*
27159- * Get pci bus speed
27160- */
27161- SK_IN16(IoC, B0_CTST, &Val16);
27162- if ((Val16 & CS_BUS_CLOCK) == 0) {
27163-
27164- pAC->Pnmi.PciBusSpeed = 33;
27165- }
27166- else {
27167- pAC->Pnmi.PciBusSpeed = 66;
27168- }
27169-
27170- /*
27171- * Get pci bus width
27172- */
27173- SK_IN16(IoC, B0_CTST, &Val16);
27174- if ((Val16 & CS_BUS_SLOT_SZ) == 0) {
27175-
27176- pAC->Pnmi.PciBusWidth = 32;
27177- }
27178- else {
27179- pAC->Pnmi.PciBusWidth = 64;
27180- }
27181-
27182- /*
27183- * Get chipset
27184- */
27185- switch (pAC->GIni.GIChipId) {
27186- case CHIP_ID_GENESIS:
27187- pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_XMAC;
27188- break;
27189-
27190- case CHIP_ID_YUKON:
27191- pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON;
27192- break;
27193-
27194- default:
27195- break;
27196- }
27197-
27198- /*
27199- * Get PMD and DeviceType
27200- */
27201- SK_IN8(IoC, B2_PMD_TYP, &Val8);
27202- switch (Val8) {
27203- case 'S':
27204- pAC->Pnmi.PMD = 3;
27205- if (pAC->GIni.GIMacsFound > 1) {
27206-
27207- pAC->Pnmi.DeviceType = 0x00020002;
27208- }
27209- else {
27210- pAC->Pnmi.DeviceType = 0x00020001;
27211- }
27212- break;
27213-
27214- case 'L':
27215- pAC->Pnmi.PMD = 2;
27216- if (pAC->GIni.GIMacsFound > 1) {
27217-
27218- pAC->Pnmi.DeviceType = 0x00020004;
27219- }
27220- else {
27221- pAC->Pnmi.DeviceType = 0x00020003;
27222- }
27223- break;
27224-
27225- case 'C':
27226- pAC->Pnmi.PMD = 4;
27227- if (pAC->GIni.GIMacsFound > 1) {
27228-
27229- pAC->Pnmi.DeviceType = 0x00020006;
27230- }
27231- else {
27232- pAC->Pnmi.DeviceType = 0x00020005;
27233- }
27234- break;
27235-
27236- case 'T':
27237- pAC->Pnmi.PMD = 5;
27238- if (pAC->GIni.GIMacsFound > 1) {
27239-
27240- pAC->Pnmi.DeviceType = 0x00020008;
27241- }
27242- else {
27243- pAC->Pnmi.DeviceType = 0x00020007;
27244- }
27245- break;
27246-
27247- default :
27248- pAC->Pnmi.PMD = 1;
27249- pAC->Pnmi.DeviceType = 0;
27250- break;
27251- }
27252-
27253- /*
27254- * Get connector
27255- */
27256- SK_IN8(IoC, B2_CONN_TYP, &Val8);
27257- switch (Val8) {
27258- case 'C':
27259- pAC->Pnmi.Connector = 2;
27260- break;
27261-
27262- case 'D':
27263- pAC->Pnmi.Connector = 3;
27264- break;
27265-
27266- case 'F':
27267- pAC->Pnmi.Connector = 4;
27268- break;
27269-
27270- case 'J':
27271- pAC->Pnmi.Connector = 5;
27272- break;
27273-
27274- case 'V':
27275- pAC->Pnmi.Connector = 6;
27276- break;
27277-
27278- default:
27279- pAC->Pnmi.Connector = 1;
27280- break;
27281- }
27282- break;
27283-
27284- case SK_INIT_RUN:
27285- /*
27286- * Start timer for RLMT change counter
27287- */
27288- SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
27289- SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer,
27290- 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER,
27291- EventParam);
27292- break;
27293-
27294- default:
27295- break; /* Nothing todo */
27296- }
27297-
27298- return (0);
27299-}
27300-
27301-/*****************************************************************************
27302- *
27303- * SkPnmiGetVar - Retrieves the value of a single OID
27304- *
27305- * Description:
27306- * Calls a general sub-function for all this stuff. If the instance
27307- * -1 is passed, the values of all instances are returned in an
27308- * array of values.
27309- *
27310- * Returns:
27311- * SK_PNMI_ERR_OK The request was successfully performed
27312- * SK_PNMI_ERR_GENERAL A general severe internal error occured
27313- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take
27314- * the data.
27315- * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown
27316- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
27317- * exist (e.g. port instance 3 on a two port
27318- * adapter.
27319- */
27320-int SkPnmiGetVar(
27321-SK_AC *pAC, /* Pointer to adapter context */
27322-SK_IOC IoC, /* IO context handle */
27323-SK_U32 Id, /* Object ID that is to be processed */
27324-void *pBuf, /* Buffer to which the management data will be copied */
27325-unsigned int *pLen, /* On call: buffer length. On return: used buffer */
27326-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
27327-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
27328-{
27329- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27330- ("PNMI: SkPnmiGetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n",
27331- Id, *pLen, Instance, NetIndex));
27332-
27333- return (PnmiVar(pAC, IoC, SK_PNMI_GET, Id, (char *)pBuf, pLen,
27334- Instance, NetIndex));
27335-}
27336-
27337-/*****************************************************************************
27338- *
27339- * SkPnmiPreSetVar - Presets the value of a single OID
27340- *
27341- * Description:
27342- * Calls a general sub-function for all this stuff. The preset does
27343- * the same as a set, but returns just before finally setting the
27344- * new value. This is useful to check if a set might be successfull.
27345- * If the instance -1 is passed, an array of values is supposed and
27346- * all instances of the OID will be set.
27347- *
27348- * Returns:
27349- * SK_PNMI_ERR_OK The request was successfully performed.
27350- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
27351- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
27352- * the correct data (e.g. a 32bit value is
27353- * needed, but a 16 bit value was passed).
27354- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
27355- * value range.
27356- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
27357- * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown.
27358- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
27359- * exist (e.g. port instance 3 on a two port
27360- * adapter.
27361- */
27362-int SkPnmiPreSetVar(
27363-SK_AC *pAC, /* Pointer to adapter context */
27364-SK_IOC IoC, /* IO context handle */
27365-SK_U32 Id, /* Object ID that is to be processed */
27366-void *pBuf, /* Buffer to which the management data will be copied */
27367-unsigned int *pLen, /* Total length of management data */
27368-SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */
27369-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
27370-{
27371- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27372- ("PNMI: SkPnmiPreSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n",
27373- Id, *pLen, Instance, NetIndex));
27374-
27375-
27376- return (PnmiVar(pAC, IoC, SK_PNMI_PRESET, Id, (char *)pBuf, pLen,
27377- Instance, NetIndex));
27378-}
27379-
27380-/*****************************************************************************
27381- *
27382- * SkPnmiSetVar - Sets the value of a single OID
27383- *
27384- * Description:
27385- * Calls a general sub-function for all this stuff. The preset does
27386- * the same as a set, but returns just before finally setting the
27387- * new value. This is useful to check if a set might be successfull.
27388- * If the instance -1 is passed, an array of values is supposed and
27389- * all instances of the OID will be set.
27390- *
27391- * Returns:
27392- * SK_PNMI_ERR_OK The request was successfully performed.
27393- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
27394- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
27395- * the correct data (e.g. a 32bit value is
27396- * needed, but a 16 bit value was passed).
27397- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
27398- * value range.
27399- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
27400- * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown.
27401- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
27402- * exist (e.g. port instance 3 on a two port
27403- * adapter.
27404- */
27405-int SkPnmiSetVar(
27406-SK_AC *pAC, /* Pointer to adapter context */
27407-SK_IOC IoC, /* IO context handle */
27408-SK_U32 Id, /* Object ID that is to be processed */
27409-void *pBuf, /* Buffer to which the management data will be copied */
27410-unsigned int *pLen, /* Total length of management data */
27411-SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */
27412-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
27413-{
27414- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27415- ("PNMI: SkPnmiSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n",
27416- Id, *pLen, Instance, NetIndex));
27417-
27418- return (PnmiVar(pAC, IoC, SK_PNMI_SET, Id, (char *)pBuf, pLen,
27419- Instance, NetIndex));
27420-}
27421-
27422-/*****************************************************************************
27423- *
27424- * SkPnmiGetStruct - Retrieves the management database in SK_PNMI_STRUCT_DATA
27425- *
27426- * Description:
27427- * Runs through the IdTable, queries the single OIDs and stores the
27428- * returned data into the management database structure
27429- * SK_PNMI_STRUCT_DATA. The offset of the OID in the structure
27430- * is stored in the IdTable. The return value of the function will also
27431- * be stored in SK_PNMI_STRUCT_DATA if the passed buffer has the
27432- * minimum size of SK_PNMI_MIN_STRUCT_SIZE.
27433- *
27434- * Returns:
27435- * SK_PNMI_ERR_OK The request was successfully performed
27436- * SK_PNMI_ERR_GENERAL A general severe internal error occured
27437- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take
27438- * the data.
27439- * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist
27440- */
27441-int SkPnmiGetStruct(
27442-SK_AC *pAC, /* Pointer to adapter context */
27443-SK_IOC IoC, /* IO context handle */
27444-void *pBuf, /* Buffer to which the management data will be copied. */
27445-unsigned int *pLen, /* Length of buffer */
27446-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
27447-{
27448- int Ret;
27449- unsigned int TableIndex;
27450- unsigned int DstOffset;
27451- unsigned int InstanceNo;
27452- unsigned int InstanceCnt;
27453- SK_U32 Instance;
27454- unsigned int TmpLen;
27455- char KeyArr[SK_PNMI_VPD_ENTRIES][SK_PNMI_VPD_KEY_SIZE];
27456-
27457-
27458- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27459- ("PNMI: SkPnmiGetStruct: Called, BufLen=%d, NetIndex=%d\n",
27460- *pLen, NetIndex));
27461-
27462- if (*pLen < SK_PNMI_STRUCT_SIZE) {
27463-
27464- if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) {
27465-
27466- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT,
27467- (SK_U32)(-1));
27468- }
27469-
27470- *pLen = SK_PNMI_STRUCT_SIZE;
27471- return (SK_PNMI_ERR_TOO_SHORT);
27472- }
27473-
27474- /*
27475- * Check NetIndex
27476- */
27477- if (NetIndex >= pAC->Rlmt.NumNets) {
27478- return (SK_PNMI_ERR_UNKNOWN_NET);
27479- }
27480-
27481- /* Update statistic */
27482- SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On call");
27483-
27484- if ((Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1)) !=
27485- SK_PNMI_ERR_OK) {
27486-
27487- SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
27488- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
27489- return (Ret);
27490- }
27491-
27492- if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {
27493-
27494- SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
27495- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
27496- return (Ret);
27497- }
27498-
27499- if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {
27500-
27501- SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
27502- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
27503- return (Ret);
27504- }
27505-
27506- /*
27507- * Increment semaphores to indicate that an update was
27508- * already done
27509- */
27510- pAC->Pnmi.MacUpdatedFlag ++;
27511- pAC->Pnmi.RlmtUpdatedFlag ++;
27512- pAC->Pnmi.SirqUpdatedFlag ++;
27513-
27514- /* Get vpd keys for instance calculation */
27515- Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &TmpLen);
27516- if (Ret != SK_PNMI_ERR_OK) {
27517-
27518- pAC->Pnmi.MacUpdatedFlag --;
27519- pAC->Pnmi.RlmtUpdatedFlag --;
27520- pAC->Pnmi.SirqUpdatedFlag --;
27521-
27522- SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");
27523- SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
27524- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
27525- return (SK_PNMI_ERR_GENERAL);
27526- }
27527-
27528- /* Retrieve values */
27529- SK_MEMSET((char *)pBuf, 0, SK_PNMI_STRUCT_SIZE);
27530- for (TableIndex = 0; TableIndex < ID_TABLE_SIZE; TableIndex ++) {
27531-
27532- InstanceNo = IdTable[TableIndex].InstanceNo;
27533- for (InstanceCnt = 1; InstanceCnt <= InstanceNo;
27534- InstanceCnt ++) {
27535-
27536- DstOffset = IdTable[TableIndex].Offset +
27537- (InstanceCnt - 1) *
27538- IdTable[TableIndex].StructSize;
27539-
27540- /*
27541- * For the VPD the instance is not an index number
27542- * but the key itself. Determin with the instance
27543- * counter the VPD key to be used.
27544- */
27545- if (IdTable[TableIndex].Id == OID_SKGE_VPD_KEY ||
27546- IdTable[TableIndex].Id == OID_SKGE_VPD_VALUE ||
27547- IdTable[TableIndex].Id == OID_SKGE_VPD_ACCESS ||
27548- IdTable[TableIndex].Id == OID_SKGE_VPD_ACTION) {
27549-
27550- SK_STRNCPY((char *)&Instance, KeyArr[InstanceCnt - 1], 4);
27551- }
27552- else {
27553- Instance = (SK_U32)InstanceCnt;
27554- }
27555-
27556- TmpLen = *pLen - DstOffset;
27557- Ret = IdTable[TableIndex].Func(pAC, IoC, SK_PNMI_GET,
27558- IdTable[TableIndex].Id, (char *)pBuf +
27559- DstOffset, &TmpLen, Instance, TableIndex, NetIndex);
27560-
27561- /*
27562- * An unknown instance error means that we reached
27563- * the last instance of that variable. Proceed with
27564- * the next OID in the table and ignore the return
27565- * code.
27566- */
27567- if (Ret == SK_PNMI_ERR_UNKNOWN_INST) {
27568-
27569- break;
27570- }
27571-
27572- if (Ret != SK_PNMI_ERR_OK) {
27573-
27574- pAC->Pnmi.MacUpdatedFlag --;
27575- pAC->Pnmi.RlmtUpdatedFlag --;
27576- pAC->Pnmi.SirqUpdatedFlag --;
27577-
27578- SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");
27579- SK_PNMI_SET_STAT(pBuf, Ret, DstOffset);
27580- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
27581- return (Ret);
27582- }
27583- }
27584- }
27585-
27586- pAC->Pnmi.MacUpdatedFlag --;
27587- pAC->Pnmi.RlmtUpdatedFlag --;
27588- pAC->Pnmi.SirqUpdatedFlag --;
27589-
27590- *pLen = SK_PNMI_STRUCT_SIZE;
27591- SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");
27592- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_OK, (SK_U32)(-1));
27593- return (SK_PNMI_ERR_OK);
27594-}
27595-
27596-/*****************************************************************************
27597- *
27598- * SkPnmiPreSetStruct - Presets the management database in SK_PNMI_STRUCT_DATA
27599- *
27600- * Description:
27601- * Calls a general sub-function for all this set stuff. The preset does
27602- * the same as a set, but returns just before finally setting the
27603- * new value. This is useful to check if a set might be successfull.
27604- * The sub-function runs through the IdTable, checks which OIDs are able
27605- * to set, and calls the handler function of the OID to perform the
27606- * preset. The return value of the function will also be stored in
27607- * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of
27608- * SK_PNMI_MIN_STRUCT_SIZE.
27609- *
27610- * Returns:
27611- * SK_PNMI_ERR_OK The request was successfully performed.
27612- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
27613- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
27614- * the correct data (e.g. a 32bit value is
27615- * needed, but a 16 bit value was passed).
27616- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
27617- * value range.
27618- */
27619-int SkPnmiPreSetStruct(
27620-SK_AC *pAC, /* Pointer to adapter context */
27621-SK_IOC IoC, /* IO context handle */
27622-void *pBuf, /* Buffer which contains the data to be set */
27623-unsigned int *pLen, /* Length of buffer */
27624-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
27625-{
27626- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27627- ("PNMI: SkPnmiPreSetStruct: Called, BufLen=%d, NetIndex=%d\n",
27628- *pLen, NetIndex));
27629-
27630- return (PnmiStruct(pAC, IoC, SK_PNMI_PRESET, (char *)pBuf,
27631- pLen, NetIndex));
27632-}
27633-
27634-/*****************************************************************************
27635- *
27636- * SkPnmiSetStruct - Sets the management database in SK_PNMI_STRUCT_DATA
27637- *
27638- * Description:
27639- * Calls a general sub-function for all this set stuff. The return value
27640- * of the function will also be stored in SK_PNMI_STRUCT_DATA if the
27641- * passed buffer has the minimum size of SK_PNMI_MIN_STRUCT_SIZE.
27642- * The sub-function runs through the IdTable, checks which OIDs are able
27643- * to set, and calls the handler function of the OID to perform the
27644- * set. The return value of the function will also be stored in
27645- * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of
27646- * SK_PNMI_MIN_STRUCT_SIZE.
27647- *
27648- * Returns:
27649- * SK_PNMI_ERR_OK The request was successfully performed.
27650- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
27651- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
27652- * the correct data (e.g. a 32bit value is
27653- * needed, but a 16 bit value was passed).
27654- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
27655- * value range.
27656- */
27657-int SkPnmiSetStruct(
27658-SK_AC *pAC, /* Pointer to adapter context */
27659-SK_IOC IoC, /* IO context handle */
27660-void *pBuf, /* Buffer which contains the data to be set */
27661-unsigned int *pLen, /* Length of buffer */
27662-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
27663-{
27664- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27665- ("PNMI: SkPnmiSetStruct: Called, BufLen=%d, NetIndex=%d\n",
27666- *pLen, NetIndex));
27667-
27668- return (PnmiStruct(pAC, IoC, SK_PNMI_SET, (char *)pBuf,
27669- pLen, NetIndex));
27670-}
27671-
27672-/*****************************************************************************
27673- *
27674- * SkPnmiEvent - Event handler
27675- *
27676- * Description:
27677- * Handles the following events:
27678- * SK_PNMI_EVT_SIRQ_OVERFLOW When a hardware counter overflows an
27679- * interrupt will be generated which is
27680- * first handled by SIRQ which generates a
27681- * this event. The event increments the
27682- * upper 32 bit of the 64 bit counter.
27683- * SK_PNMI_EVT_SEN_XXX The event is generated by the I2C module
27684- * when a sensor reports a warning or
27685- * error. The event will store a trap
27686- * message in the trap buffer.
27687- * SK_PNMI_EVT_CHG_EST_TIMER The timer event was initiated by this
27688- * module and is used to calculate the
27689- * port switches per hour.
27690- * SK_PNMI_EVT_CLEAR_COUNTER The event clears all counters and
27691- * timestamps.
27692- * SK_PNMI_EVT_XMAC_RESET The event is generated by the driver
27693- * before a hard reset of the XMAC is
27694- * performed. All counters will be saved
27695- * and added to the hardware counter
27696- * values after reset to grant continuous
27697- * counter values.
27698- * SK_PNMI_EVT_RLMT_PORT_UP Generated by RLMT to notify that a port
27699- * went logically up. A trap message will
27700- * be stored to the trap buffer.
27701- * SK_PNMI_EVT_RLMT_PORT_DOWN Generated by RLMT to notify that a port
27702- * went logically down. A trap message will
27703- * be stored to the trap buffer.
27704- * SK_PNMI_EVT_RLMT_SEGMENTATION Generated by RLMT to notify that two
27705- * spanning tree root bridges were
27706- * detected. A trap message will be stored
27707- * to the trap buffer.
27708- * SK_PNMI_EVT_RLMT_ACTIVE_DOWN Notifies PNMI that an active port went
27709- * down. PNMI will not further add the
27710- * statistic values to the virtual port.
27711- * SK_PNMI_EVT_RLMT_ACTIVE_UP Notifies PNMI that a port went up and
27712- * is now an active port. PNMI will now
27713- * add the statistic data of this port to
27714- * the virtual port.
27715- * SK_PNMI_EVT_RLMT_SET_NETS Notifies PNMI about the net mode. The first parameter
27716- * contains the number of nets. 1 means single net, 2 means
27717- * dual net. The second parameter is -1
27718- *
27719- * Returns:
27720- * Always 0
27721- */
27722-int SkPnmiEvent(
27723-SK_AC *pAC, /* Pointer to adapter context */
27724-SK_IOC IoC, /* IO context handle */
27725-SK_U32 Event, /* Event-Id */
27726-SK_EVPARA Param) /* Event dependent parameter */
27727-{
27728- unsigned int PhysPortIndex;
27729- unsigned int MaxNetNumber;
27730- int CounterIndex;
27731- int Ret;
27732- SK_U16 MacStatus;
27733- SK_U64 OverflowStatus;
27734- SK_U64 Mask;
27735- int MacType;
27736- SK_U64 Value;
27737- SK_U32 Val32;
27738- SK_U16 Register;
27739- SK_EVPARA EventParam;
27740- SK_U64 NewestValue;
27741- SK_U64 OldestValue;
27742- SK_U64 Delta;
27743- SK_PNMI_ESTIMATE *pEst;
27744- SK_U32 NetIndex;
27745- SK_GEPORT *pPrt;
27746- SK_PNMI_VCT *pVctBackupData;
27747- SK_U32 RetCode;
27748- int i;
27749- SK_U32 CableLength;
27750-
27751-
27752-#ifdef DEBUG
27753- if (Event != SK_PNMI_EVT_XMAC_RESET) {
27754-
27755- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27756- ("PNMI: SkPnmiEvent: Called, Event=0x%x, Param=0x%x\n",
27757- (unsigned int)Event, (unsigned int)Param.Para64));
27758- }
27759-#endif /* DEBUG */
27760- SK_PNMI_CHECKFLAGS("SkPnmiEvent: On call");
27761-
27762- MacType = pAC->GIni.GIMacType;
27763-
27764- switch (Event) {
27765-
27766- case SK_PNMI_EVT_SIRQ_OVERFLOW:
27767- PhysPortIndex = (int)Param.Para32[0];
27768- MacStatus = (SK_U16)Param.Para32[1];
27769-#ifdef DEBUG
27770- if (PhysPortIndex >= SK_MAX_MACS) {
27771-
27772- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27773- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SIRQ_OVERFLOW parameter"
27774- " wrong, PhysPortIndex=0x%x\n",
27775- PhysPortIndex));
27776- return (0);
27777- }
27778-#endif /* DEBUG */
27779- OverflowStatus = 0;
27780-
27781- /*
27782- * Check which source caused an overflow interrupt.
27783- */
27784- if ((pAC->GIni.GIFunc.pFnMacOverflow(pAC, IoC, PhysPortIndex,
27785- MacStatus, &OverflowStatus) != 0) ||
27786- (OverflowStatus == 0)) {
27787-
27788- SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
27789- return (0);
27790- }
27791-
27792- /*
27793- * Check the overflow status register and increment
27794- * the upper dword of corresponding counter.
27795- */
27796- for (CounterIndex = 0; CounterIndex < sizeof(Mask) * 8;
27797- CounterIndex ++) {
27798-
27799- Mask = (SK_U64)1 << CounterIndex;
27800- if ((OverflowStatus & Mask) == 0) {
27801-
27802- continue;
27803- }
27804-
27805- switch (StatOvrflwBit[CounterIndex][MacType]) {
27806-
27807- case SK_PNMI_HTX_UTILUNDER:
27808- case SK_PNMI_HTX_UTILOVER:
27809- if (MacType == SK_MAC_XMAC) {
27810- XM_IN16(IoC, PhysPortIndex, XM_TX_CMD, &Register);
27811- Register |= XM_TX_SAM_LINE;
27812- XM_OUT16(IoC, PhysPortIndex, XM_TX_CMD, Register);
27813- }
27814- break;
27815-
27816- case SK_PNMI_HRX_UTILUNDER:
27817- case SK_PNMI_HRX_UTILOVER:
27818- if (MacType == SK_MAC_XMAC) {
27819- XM_IN16(IoC, PhysPortIndex, XM_RX_CMD, &Register);
27820- Register |= XM_RX_SAM_LINE;
27821- XM_OUT16(IoC, PhysPortIndex, XM_RX_CMD, Register);
27822- }
27823- break;
27824-
27825- case SK_PNMI_HTX_OCTETHIGH:
27826- case SK_PNMI_HTX_OCTETLOW:
27827- case SK_PNMI_HTX_RESERVED:
27828- case SK_PNMI_HRX_OCTETHIGH:
27829- case SK_PNMI_HRX_OCTETLOW:
27830- case SK_PNMI_HRX_IRLENGTH:
27831- case SK_PNMI_HRX_RESERVED:
27832-
27833- /*
27834- * the following counters aren't be handled (id > 63)
27835- */
27836- case SK_PNMI_HTX_SYNC:
27837- case SK_PNMI_HTX_SYNC_OCTET:
27838- break;
27839-
27840- case SK_PNMI_HRX_LONGFRAMES:
27841- if (MacType == SK_MAC_GMAC) {
27842- pAC->Pnmi.Port[PhysPortIndex].
27843- CounterHigh[CounterIndex] ++;
27844- }
27845- break;
27846-
27847- default:
27848- pAC->Pnmi.Port[PhysPortIndex].
27849- CounterHigh[CounterIndex] ++;
27850- }
27851- }
27852- break;
27853-
27854- case SK_PNMI_EVT_SEN_WAR_LOW:
27855-#ifdef DEBUG
27856- if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
27857-
27858- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27859- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_LOW parameter wrong, SensorIndex=%d\n",
27860- (unsigned int)Param.Para64));
27861- return (0);
27862- }
27863-#endif /* DEBUG */
27864-
27865- /*
27866- * Store a trap message in the trap buffer and generate
27867- * an event for user space applications with the
27868- * SK_DRIVER_SENDEVENT macro.
27869- */
27870- QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_WAR_LOW,
27871- (unsigned int)Param.Para64);
27872- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
27873- break;
27874-
27875- case SK_PNMI_EVT_SEN_WAR_UPP:
27876-#ifdef DEBUG
27877- if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
27878-
27879- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27880- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_UPP parameter wrong, SensorIndex=%d\n",
27881- (unsigned int)Param.Para64));
27882- return (0);
27883- }
27884-#endif /* DEBUG */
27885-
27886- /*
27887- * Store a trap message in the trap buffer and generate
27888- * an event for user space applications with the
27889- * SK_DRIVER_SENDEVENT macro.
27890- */
27891- QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_WAR_UPP,
27892- (unsigned int)Param.Para64);
27893- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
27894- break;
27895-
27896- case SK_PNMI_EVT_SEN_ERR_LOW:
27897-#ifdef DEBUG
27898- if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
27899-
27900- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27901- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_ERR_LOW parameter wrong, SensorIndex=%d\n",
27902- (unsigned int)Param.Para64));
27903- return (0);
27904- }
27905-#endif /* DEBUG */
27906-
27907- /*
27908- * Store a trap message in the trap buffer and generate
27909- * an event for user space applications with the
27910- * SK_DRIVER_SENDEVENT macro.
27911- */
27912- QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_ERR_LOW,
27913- (unsigned int)Param.Para64);
27914- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
27915- break;
27916-
27917- case SK_PNMI_EVT_SEN_ERR_UPP:
27918-#ifdef DEBUG
27919- if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
27920-
27921- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
27922- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_ERR_UPP parameter wrong, SensorIndex=%d\n",
27923- (unsigned int)Param.Para64));
27924- return (0);
27925- }
27926-#endif /* DEBUG */
27927-
27928- /*
27929- * Store a trap message in the trap buffer and generate
27930- * an event for user space applications with the
27931- * SK_DRIVER_SENDEVENT macro.
27932- */
27933- QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_ERR_UPP,
27934- (unsigned int)Param.Para64);
27935- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
27936- break;
27937-
27938- case SK_PNMI_EVT_CHG_EST_TIMER:
27939- /*
27940- * Calculate port switch average on a per hour basis
27941- * Time interval for check : 28125 ms
27942- * Number of values for average : 8
27943- *
27944- * Be careful in changing these values, on change check
27945- * - typedef of SK_PNMI_ESTIMATE (Size of EstValue
27946- * array one less than value number)
27947- * - Timer initialization SkTimerStart() in SkPnmiInit
27948- * - Delta value below must be multiplicated with
27949- * power of 2
27950- *
27951- */
27952- pEst = &pAC->Pnmi.RlmtChangeEstimate;
27953- CounterIndex = pEst->EstValueIndex + 1;
27954- if (CounterIndex == 7) {
27955-
27956- CounterIndex = 0;
27957- }
27958- pEst->EstValueIndex = CounterIndex;
27959-
27960- NewestValue = pAC->Pnmi.RlmtChangeCts;
27961- OldestValue = pEst->EstValue[CounterIndex];
27962- pEst->EstValue[CounterIndex] = NewestValue;
27963-
27964- /*
27965- * Calculate average. Delta stores the number of
27966- * port switches per 28125 * 8 = 225000 ms
27967- */
27968- if (NewestValue >= OldestValue) {
27969-
27970- Delta = NewestValue - OldestValue;
27971- }
27972- else {
27973- /* Overflow situation */
27974- Delta = (SK_U64)(0 - OldestValue) + NewestValue;
27975- }
27976-
27977- /*
27978- * Extrapolate delta to port switches per hour.
27979- * Estimate = Delta * (3600000 / 225000)
27980- * = Delta * 16
27981- * = Delta << 4
27982- */
27983- pAC->Pnmi.RlmtChangeEstimate.Estimate = Delta << 4;
27984-
27985- /*
27986- * Check if threshold is exceeded. If the threshold is
27987- * permanently exceeded every 28125 ms an event will be
27988- * generated to remind the user of this condition.
27989- */
27990- if ((pAC->Pnmi.RlmtChangeThreshold != 0) &&
27991- (pAC->Pnmi.RlmtChangeEstimate.Estimate >=
27992- pAC->Pnmi.RlmtChangeThreshold)) {
27993-
27994- QueueSimpleTrap(pAC, OID_SKGE_TRAP_RLMT_CHANGE_THRES);
27995- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
27996- }
27997-
27998- SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
27999- SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer,
28000- 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER,
28001- EventParam);
28002- break;
28003-
28004- case SK_PNMI_EVT_CLEAR_COUNTER:
28005- /*
28006- * Param.Para32[0] contains the NetIndex (0 ..1).
28007- * Param.Para32[1] is reserved, contains -1.
28008- */
28009- NetIndex = (SK_U32)Param.Para32[0];
28010-
28011-#ifdef DEBUG
28012- if (NetIndex >= pAC->Rlmt.NumNets) {
28013-
28014- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28015- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_CLEAR_COUNTER parameter wrong, NetIndex=%d\n",
28016- NetIndex));
28017-
28018- return (0);
28019- }
28020-#endif /* DEBUG */
28021-
28022- /*
28023- * Set all counters and timestamps to zero.
28024- * The according NetIndex is required as a
28025- * parameter of the event.
28026- */
28027- ResetCounter(pAC, IoC, NetIndex);
28028- break;
28029-
28030- case SK_PNMI_EVT_XMAC_RESET:
28031- /*
28032- * To grant continuous counter values store the current
28033- * XMAC statistic values to the entries 1..n of the
28034- * CounterOffset array. XMAC Errata #2
28035- */
28036-#ifdef DEBUG
28037- if ((unsigned int)Param.Para64 >= SK_MAX_MACS) {
28038-
28039- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28040- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_XMAC_RESET parameter wrong, PhysPortIndex=%d\n",
28041- (unsigned int)Param.Para64));
28042- return (0);
28043- }
28044-#endif
28045- PhysPortIndex = (unsigned int)Param.Para64;
28046-
28047- /*
28048- * Update XMAC statistic to get fresh values
28049- */
28050- Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);
28051- if (Ret != SK_PNMI_ERR_OK) {
28052-
28053- SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
28054- return (0);
28055- }
28056- /*
28057- * Increment semaphore to indicate that an update was
28058- * already done
28059- */
28060- pAC->Pnmi.MacUpdatedFlag ++;
28061-
28062- for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;
28063- CounterIndex ++) {
28064-
28065- if (!StatAddr[CounterIndex][MacType].GetOffset) {
28066-
28067- continue;
28068- }
28069-
28070- pAC->Pnmi.Port[PhysPortIndex].CounterOffset[CounterIndex] =
28071- GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);
28072-
28073- pAC->Pnmi.Port[PhysPortIndex].CounterHigh[CounterIndex] = 0;
28074- }
28075-
28076- pAC->Pnmi.MacUpdatedFlag --;
28077- break;
28078-
28079- case SK_PNMI_EVT_RLMT_PORT_UP:
28080- PhysPortIndex = (unsigned int)Param.Para32[0];
28081-#ifdef DEBUG
28082- if (PhysPortIndex >= SK_MAX_MACS) {
28083-
28084- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28085- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_PORT_UP parameter"
28086- " wrong, PhysPortIndex=%d\n", PhysPortIndex));
28087-
28088- return (0);
28089- }
28090-#endif /* DEBUG */
28091-
28092- /*
28093- * Store a trap message in the trap buffer and generate an event for
28094- * user space applications with the SK_DRIVER_SENDEVENT macro.
28095- */
28096- QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_UP, PhysPortIndex);
28097- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
28098-
28099- /* Bugfix for XMAC errata (#10620)*/
28100- if (MacType == SK_MAC_XMAC) {
28101- /* Add incremental difference to offset (#10620)*/
28102- (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex,
28103- XM_RXE_SHT_ERR, &Val32);
28104-
28105- Value = (((SK_U64)pAC->Pnmi.Port[PhysPortIndex].
28106- CounterHigh[SK_PNMI_HRX_SHORTS] << 32) | (SK_U64)Val32);
28107- pAC->Pnmi.Port[PhysPortIndex].CounterOffset[SK_PNMI_HRX_SHORTS] +=
28108- Value - pAC->Pnmi.Port[PhysPortIndex].RxShortZeroMark;
28109- }
28110-
28111- /* Tell VctStatus() that a link was up meanwhile. */
28112- pAC->Pnmi.VctStatus[PhysPortIndex] |= SK_PNMI_VCT_LINK;
28113- break;
28114-
28115- case SK_PNMI_EVT_RLMT_PORT_DOWN:
28116- PhysPortIndex = (unsigned int)Param.Para32[0];
28117-
28118-#ifdef DEBUG
28119- if (PhysPortIndex >= SK_MAX_MACS) {
28120-
28121- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28122- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_PORT_DOWN parameter"
28123- " wrong, PhysPortIndex=%d\n", PhysPortIndex));
28124-
28125- return (0);
28126- }
28127-#endif /* DEBUG */
28128-
28129- /*
28130- * Store a trap message in the trap buffer and generate an event for
28131- * user space applications with the SK_DRIVER_SENDEVENT macro.
28132- */
28133- QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_DOWN, PhysPortIndex);
28134- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
28135-
28136- /* Bugfix #10620 - get zero level for incremental difference */
28137- if (MacType == SK_MAC_XMAC) {
28138-
28139- (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex,
28140- XM_RXE_SHT_ERR, &Val32);
28141-
28142- pAC->Pnmi.Port[PhysPortIndex].RxShortZeroMark =
28143- (((SK_U64)pAC->Pnmi.Port[PhysPortIndex].
28144- CounterHigh[SK_PNMI_HRX_SHORTS] << 32) | (SK_U64)Val32);
28145- }
28146- break;
28147-
28148- case SK_PNMI_EVT_RLMT_ACTIVE_DOWN:
28149- PhysPortIndex = (unsigned int)Param.Para32[0];
28150- NetIndex = (SK_U32)Param.Para32[1];
28151-
28152-#ifdef DEBUG
28153- if (PhysPortIndex >= SK_MAX_MACS) {
28154-
28155- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28156- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_DOWN parameter too high, PhysPort=%d\n",
28157- PhysPortIndex));
28158- }
28159-
28160- if (NetIndex >= pAC->Rlmt.NumNets) {
28161-
28162- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28163- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_DOWN parameter too high, NetIndex=%d\n",
28164- NetIndex));
28165- }
28166-#endif /* DEBUG */
28167-
28168- /*
28169- * For now, ignore event if NetIndex != 0.
28170- */
28171- if (Param.Para32[1] != 0) {
28172-
28173- return (0);
28174- }
28175-
28176- /*
28177- * Nothing to do if port is already inactive
28178- */
28179- if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
28180-
28181- return (0);
28182- }
28183-
28184- /*
28185- * Update statistic counters to calculate new offset for the virtual
28186- * port and increment semaphore to indicate that an update was already
28187- * done.
28188- */
28189- if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) !=
28190- SK_PNMI_ERR_OK) {
28191-
28192- SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
28193- return (0);
28194- }
28195- pAC->Pnmi.MacUpdatedFlag ++;
28196-
28197- /*
28198- * Calculate new counter offset for virtual port to grant continous
28199- * counting on port switches. The virtual port consists of all currently
28200- * active ports. The port down event indicates that a port is removed
28201- * from the virtual port. Therefore add the counter value of the removed
28202- * port to the CounterOffset for the virtual port to grant the same
28203- * counter value.
28204- */
28205- for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;
28206- CounterIndex ++) {
28207-
28208- if (!StatAddr[CounterIndex][MacType].GetOffset) {
28209-
28210- continue;
28211- }
28212-
28213- Value = GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);
28214-
28215- pAC->Pnmi.VirtualCounterOffset[CounterIndex] += Value;
28216- }
28217-
28218- /*
28219- * Set port to inactive
28220- */
28221- pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_FALSE;
28222-
28223- pAC->Pnmi.MacUpdatedFlag --;
28224- break;
28225-
28226- case SK_PNMI_EVT_RLMT_ACTIVE_UP:
28227- PhysPortIndex = (unsigned int)Param.Para32[0];
28228- NetIndex = (SK_U32)Param.Para32[1];
28229-
28230-#ifdef DEBUG
28231- if (PhysPortIndex >= SK_MAX_MACS) {
28232-
28233- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28234- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_UP parameter too high, PhysPort=%d\n",
28235- PhysPortIndex));
28236- }
28237-
28238- if (NetIndex >= pAC->Rlmt.NumNets) {
28239-
28240- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
28241- ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_UP parameter too high, NetIndex=%d\n",
28242- NetIndex));
28243- }
28244-#endif /* DEBUG */
28245-
28246- /*
28247- * For now, ignore event if NetIndex != 0.
28248- */
28249- if (Param.Para32[1] != 0) {
28250-
28251- return (0);
28252- }
28253-
28254- /*
28255- * Nothing to do if port is already active
28256- */
28257- if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
28258-
28259- return (0);
28260- }
28261-
28262- /*
28263- * Statistic maintenance
28264- */
28265- pAC->Pnmi.RlmtChangeCts ++;
28266- pAC->Pnmi.RlmtChangeTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));
28267-
28268- /*
28269- * Store a trap message in the trap buffer and generate an event for
28270- * user space applications with the SK_DRIVER_SENDEVENT macro.
28271- */
28272- QueueRlmtNewMacTrap(pAC, PhysPortIndex);
28273- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
28274-
28275- /*
28276- * Update statistic counters to calculate new offset for the virtual
28277- * port and increment semaphore to indicate that an update was
28278- * already done.
28279- */
28280- if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) !=
28281- SK_PNMI_ERR_OK) {
28282-
28283- SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
28284- return (0);
28285- }
28286- pAC->Pnmi.MacUpdatedFlag ++;
28287-
28288- /*
28289- * Calculate new counter offset for virtual port to grant continous
28290- * counting on port switches. A new port is added to the virtual port.
28291- * Therefore substract the counter value of the new port from the
28292- * CounterOffset for the virtual port to grant the same value.
28293- */
28294- for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;
28295- CounterIndex ++) {
28296-
28297- if (!StatAddr[CounterIndex][MacType].GetOffset) {
28298-
28299- continue;
28300- }
28301-
28302- Value = GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);
28303-
28304- pAC->Pnmi.VirtualCounterOffset[CounterIndex] -= Value;
28305- }
28306-
28307- /* Set port to active */
28308- pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_TRUE;
28309-
28310- pAC->Pnmi.MacUpdatedFlag --;
28311- break;
28312-
28313- case SK_PNMI_EVT_RLMT_SEGMENTATION:
28314- /*
28315- * Para.Para32[0] contains the NetIndex.
28316- */
28317-
28318- /*
28319- * Store a trap message in the trap buffer and generate an event for
28320- * user space applications with the SK_DRIVER_SENDEVENT macro.
28321- */
28322- QueueSimpleTrap(pAC, OID_SKGE_TRAP_RLMT_SEGMENTATION);
28323- (void)SK_DRIVER_SENDEVENT(pAC, IoC);
28324- break;
28325-
28326- case SK_PNMI_EVT_RLMT_SET_NETS:
28327- /*
28328- * Param.Para32[0] contains the number of Nets.
28329- * Param.Para32[1] is reserved, contains -1.
28330- */
28331- /*
28332- * Check number of nets
28333- */
28334- MaxNetNumber = pAC->GIni.GIMacsFound;
28335- if (((unsigned int)Param.Para32[0] < 1)
28336- || ((unsigned int)Param.Para32[0] > MaxNetNumber)) {
28337- return (SK_PNMI_ERR_UNKNOWN_NET);
28338- }
28339-
28340- if ((unsigned int)Param.Para32[0] == 1) { /* single net mode */
28341- pAC->Pnmi.DualNetActiveFlag = SK_FALSE;
28342- }
28343- else { /* dual net mode */
28344- pAC->Pnmi.DualNetActiveFlag = SK_TRUE;
28345- }
28346- break;
28347-
28348- case SK_PNMI_EVT_VCT_RESET:
28349- PhysPortIndex = Param.Para32[0];
28350- pPrt = &pAC->GIni.GP[PhysPortIndex];
28351- pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex];
28352-
28353- if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING) {
28354- RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE);
28355- if (RetCode == 2) {
28356- /*
28357- * VCT test is still running.
28358- * Start VCT timer counter again.
28359- */
28360- SK_MEMSET((char *) &Param, 0, sizeof(Param));
28361- Param.Para32[0] = PhysPortIndex;
28362- Param.Para32[1] = -1;
28363- SkTimerStart(pAC, IoC,
28364- &pAC->Pnmi.VctTimeout[PhysPortIndex].VctTimer,
28365- 4000000, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Param);
28366- break;
28367- }
28368- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_PENDING;
28369- pAC->Pnmi.VctStatus[PhysPortIndex] |=
28370- (SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_TEST_DONE);
28371-
28372- /* Copy results for later use to PNMI struct. */
28373- for (i = 0; i < 4; i++) {
28374- if (pPrt->PMdiPairSts[i] == SK_PNMI_VCT_NORMAL_CABLE) {
28375- if ((pPrt->PMdiPairLen[i] > 35) &&
28376- (pPrt->PMdiPairLen[i] < 0xff)) {
28377- pPrt->PMdiPairSts[i] = SK_PNMI_VCT_IMPEDANCE_MISMATCH;
28378- }
28379- }
28380- if ((pPrt->PMdiPairLen[i] > 35) &&
28381- (pPrt->PMdiPairLen[i] != 0xff)) {
28382- CableLength = 1000 *
28383- (((175 * pPrt->PMdiPairLen[i]) / 210) - 28);
28384- }
28385- else {
28386- CableLength = 0;
28387- }
28388- pVctBackupData->PMdiPairLen[i] = CableLength;
28389- pVctBackupData->PMdiPairSts[i] = pPrt->PMdiPairSts[i];
28390- }
28391-
28392- Param.Para32[0] = PhysPortIndex;
28393- Param.Para32[1] = -1;
28394- SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Param);
28395- SkEventDispatcher(pAC, IoC);
28396- }
28397-
28398- break;
28399-
28400- default:
28401- break;
28402- }
28403-
28404- SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
28405- return (0);
28406-}
28407-
28408-
28409-/******************************************************************************
28410- *
28411- * Private functions
28412- *
28413- */
28414-
28415-/*****************************************************************************
28416- *
28417- * PnmiVar - Gets, presets, and sets single OIDs
28418- *
28419- * Description:
28420- * Looks up the requested OID, calls the corresponding handler
28421- * function, and passes the parameters with the get, preset, or
28422- * set command. The function is called by SkGePnmiGetVar,
28423- * SkGePnmiPreSetVar, or SkGePnmiSetVar.
28424- *
28425- * Returns:
28426- * SK_PNMI_ERR_XXX. For details have a look at the description of the
28427- * calling functions.
28428- * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist
28429- */
28430-PNMI_STATIC int PnmiVar(
28431-SK_AC *pAC, /* Pointer to adapter context */
28432-SK_IOC IoC, /* IO context handle */
28433-int Action, /* GET/PRESET/SET action */
28434-SK_U32 Id, /* Object ID that is to be processed */
28435-char *pBuf, /* Buffer used for the management data transfer */
28436-unsigned int *pLen, /* Total length of pBuf management data */
28437-SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */
28438-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
28439-{
28440- unsigned int TableIndex;
28441- int Ret;
28442-
28443-
28444- if ((TableIndex = LookupId(Id)) == (unsigned int)(-1)) {
28445-
28446- *pLen = 0;
28447- return (SK_PNMI_ERR_UNKNOWN_OID);
28448- }
28449-
28450- /* Check NetIndex */
28451- if (NetIndex >= pAC->Rlmt.NumNets) {
28452- return (SK_PNMI_ERR_UNKNOWN_NET);
28453- }
28454-
28455- SK_PNMI_CHECKFLAGS("PnmiVar: On call");
28456-
28457- Ret = IdTable[TableIndex].Func(pAC, IoC, Action, Id, pBuf, pLen,
28458- Instance, TableIndex, NetIndex);
28459-
28460- SK_PNMI_CHECKFLAGS("PnmiVar: On return");
28461-
28462- return (Ret);
28463-}
28464-
28465-/*****************************************************************************
28466- *
28467- * PnmiStruct - Presets and Sets data in structure SK_PNMI_STRUCT_DATA
28468- *
28469- * Description:
28470- * The return value of the function will also be stored in
28471- * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of
28472- * SK_PNMI_MIN_STRUCT_SIZE. The sub-function runs through the IdTable,
28473- * checks which OIDs are able to set, and calls the handler function of
28474- * the OID to perform the set. The return value of the function will
28475- * also be stored in SK_PNMI_STRUCT_DATA if the passed buffer has the
28476- * minimum size of SK_PNMI_MIN_STRUCT_SIZE. The function is called
28477- * by SkGePnmiPreSetStruct and SkGePnmiSetStruct.
28478- *
28479- * Returns:
28480- * SK_PNMI_ERR_XXX. The codes are described in the calling functions.
28481- * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist
28482- */
28483-PNMI_STATIC int PnmiStruct(
28484-SK_AC *pAC, /* Pointer to adapter context */
28485-SK_IOC IoC, /* IO context handle */
28486-int Action, /* PRESET/SET action to be performed */
28487-char *pBuf, /* Buffer used for the management data transfer */
28488-unsigned int *pLen, /* Length of pBuf management data buffer */
28489-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
28490-{
28491- int Ret;
28492- unsigned int TableIndex;
28493- unsigned int DstOffset;
28494- unsigned int Len;
28495- unsigned int InstanceNo;
28496- unsigned int InstanceCnt;
28497- SK_U32 Instance;
28498- SK_U32 Id;
28499-
28500-
28501- /* Check if the passed buffer has the right size */
28502- if (*pLen < SK_PNMI_STRUCT_SIZE) {
28503-
28504- /* Check if we can return the error within the buffer */
28505- if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) {
28506-
28507- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT,
28508- (SK_U32)(-1));
28509- }
28510-
28511- *pLen = SK_PNMI_STRUCT_SIZE;
28512- return (SK_PNMI_ERR_TOO_SHORT);
28513- }
28514-
28515- /* Check NetIndex */
28516- if (NetIndex >= pAC->Rlmt.NumNets) {
28517- return (SK_PNMI_ERR_UNKNOWN_NET);
28518- }
28519-
28520- SK_PNMI_CHECKFLAGS("PnmiStruct: On call");
28521-
28522- /*
28523- * Update the values of RLMT and SIRQ and increment semaphores to
28524- * indicate that an update was already done.
28525- */
28526- if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {
28527-
28528- SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
28529- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
28530- return (Ret);
28531- }
28532-
28533- if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {
28534-
28535- SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
28536- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
28537- return (Ret);
28538- }
28539-
28540- pAC->Pnmi.RlmtUpdatedFlag ++;
28541- pAC->Pnmi.SirqUpdatedFlag ++;
28542-
28543- /* Preset/Set values */
28544- for (TableIndex = 0; TableIndex < ID_TABLE_SIZE; TableIndex ++) {
28545-
28546- if ((IdTable[TableIndex].Access != SK_PNMI_RW) &&
28547- (IdTable[TableIndex].Access != SK_PNMI_WO)) {
28548-
28549- continue;
28550- }
28551-
28552- InstanceNo = IdTable[TableIndex].InstanceNo;
28553- Id = IdTable[TableIndex].Id;
28554-
28555- for (InstanceCnt = 1; InstanceCnt <= InstanceNo;
28556- InstanceCnt ++) {
28557-
28558- DstOffset = IdTable[TableIndex].Offset +
28559- (InstanceCnt - 1) *
28560- IdTable[TableIndex].StructSize;
28561-
28562- /*
28563- * Because VPD multiple instance variables are
28564- * not setable we do not need to evaluate VPD
28565- * instances. Have a look to VPD instance
28566- * calculation in SkPnmiGetStruct().
28567- */
28568- Instance = (SK_U32)InstanceCnt;
28569-
28570- /*
28571- * Evaluate needed buffer length
28572- */
28573- Len = 0;
28574- Ret = IdTable[TableIndex].Func(pAC, IoC,
28575- SK_PNMI_GET, IdTable[TableIndex].Id,
28576- NULL, &Len, Instance, TableIndex, NetIndex);
28577-
28578- if (Ret == SK_PNMI_ERR_UNKNOWN_INST) {
28579-
28580- break;
28581- }
28582- if (Ret != SK_PNMI_ERR_TOO_SHORT) {
28583-
28584- pAC->Pnmi.RlmtUpdatedFlag --;
28585- pAC->Pnmi.SirqUpdatedFlag --;
28586-
28587- SK_PNMI_CHECKFLAGS("PnmiStruct: On return");
28588- SK_PNMI_SET_STAT(pBuf,
28589- SK_PNMI_ERR_GENERAL, DstOffset);
28590- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
28591- return (SK_PNMI_ERR_GENERAL);
28592- }
28593- if (Id == OID_SKGE_VPD_ACTION) {
28594-
28595- switch (*(pBuf + DstOffset)) {
28596-
28597- case SK_PNMI_VPD_CREATE:
28598- Len = 3 + *(pBuf + DstOffset + 3);
28599- break;
28600-
28601- case SK_PNMI_VPD_DELETE:
28602- Len = 3;
28603- break;
28604-
28605- default:
28606- Len = 1;
28607- break;
28608- }
28609- }
28610-
28611- /* Call the OID handler function */
28612- Ret = IdTable[TableIndex].Func(pAC, IoC, Action,
28613- IdTable[TableIndex].Id, pBuf + DstOffset,
28614- &Len, Instance, TableIndex, NetIndex);
28615-
28616- if (Ret != SK_PNMI_ERR_OK) {
28617-
28618- pAC->Pnmi.RlmtUpdatedFlag --;
28619- pAC->Pnmi.SirqUpdatedFlag --;
28620-
28621- SK_PNMI_CHECKFLAGS("PnmiStruct: On return");
28622- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_BAD_VALUE,
28623- DstOffset);
28624- *pLen = SK_PNMI_MIN_STRUCT_SIZE;
28625- return (SK_PNMI_ERR_BAD_VALUE);
28626- }
28627- }
28628- }
28629-
28630- pAC->Pnmi.RlmtUpdatedFlag --;
28631- pAC->Pnmi.SirqUpdatedFlag --;
28632-
28633- SK_PNMI_CHECKFLAGS("PnmiStruct: On return");
28634- SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_OK, (SK_U32)(-1));
28635- return (SK_PNMI_ERR_OK);
28636-}
28637-
28638-/*****************************************************************************
28639- *
28640- * LookupId - Lookup an OID in the IdTable
28641- *
28642- * Description:
28643- * Scans the IdTable to find the table entry of an OID.
28644- *
28645- * Returns:
28646- * The table index or -1 if not found.
28647- */
28648-PNMI_STATIC int LookupId(
28649-SK_U32 Id) /* Object identifier to be searched */
28650-{
28651- int i;
28652-
28653- for (i = 0; i < ID_TABLE_SIZE; i++) {
28654-
28655- if (IdTable[i].Id == Id) {
28656-
28657- return i;
28658- }
28659- }
28660-
28661- return (-1);
28662-}
28663-
28664-/*****************************************************************************
28665- *
28666- * OidStruct - Handler of OID_SKGE_ALL_DATA
28667- *
28668- * Description:
28669- * This OID performs a Get/Preset/SetStruct call and returns all data
28670- * in a SK_PNMI_STRUCT_DATA structure.
28671- *
28672- * Returns:
28673- * SK_PNMI_ERR_OK The request was successfully performed.
28674- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
28675- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
28676- * the correct data (e.g. a 32bit value is
28677- * needed, but a 16 bit value was passed).
28678- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
28679- * value range.
28680- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
28681- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
28682- * exist (e.g. port instance 3 on a two port
28683- * adapter.
28684- */
28685-PNMI_STATIC int OidStruct(
28686-SK_AC *pAC, /* Pointer to adapter context */
28687-SK_IOC IoC, /* IO context handle */
28688-int Action, /* GET/PRESET/SET action */
28689-SK_U32 Id, /* Object ID that is to be processed */
28690-char *pBuf, /* Buffer used for the management data transfer */
28691-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
28692-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
28693-unsigned int TableIndex, /* Index to the Id table */
28694-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
28695-{
28696- if (Id != OID_SKGE_ALL_DATA) {
28697-
28698- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR003,
28699- SK_PNMI_ERR003MSG);
28700-
28701- *pLen = 0;
28702- return (SK_PNMI_ERR_GENERAL);
28703- }
28704-
28705- /*
28706- * Check instance. We only handle single instance variables
28707- */
28708- if (Instance != (SK_U32)(-1) && Instance != 1) {
28709-
28710- *pLen = 0;
28711- return (SK_PNMI_ERR_UNKNOWN_INST);
28712- }
28713-
28714- switch (Action) {
28715-
28716- case SK_PNMI_GET:
28717- return (SkPnmiGetStruct(pAC, IoC, pBuf, pLen, NetIndex));
28718-
28719- case SK_PNMI_PRESET:
28720- return (SkPnmiPreSetStruct(pAC, IoC, pBuf, pLen, NetIndex));
28721-
28722- case SK_PNMI_SET:
28723- return (SkPnmiSetStruct(pAC, IoC, pBuf, pLen, NetIndex));
28724- }
28725-
28726- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR004, SK_PNMI_ERR004MSG);
28727-
28728- *pLen = 0;
28729- return (SK_PNMI_ERR_GENERAL);
28730-}
28731-
28732-/*****************************************************************************
28733- *
28734- * Perform - OID handler of OID_SKGE_ACTION
28735- *
28736- * Description:
28737- * None.
28738- *
28739- * Returns:
28740- * SK_PNMI_ERR_OK The request was successfully performed.
28741- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
28742- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
28743- * the correct data (e.g. a 32bit value is
28744- * needed, but a 16 bit value was passed).
28745- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
28746- * value range.
28747- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
28748- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
28749- * exist (e.g. port instance 3 on a two port
28750- * adapter.
28751- */
28752-PNMI_STATIC int Perform(
28753-SK_AC *pAC, /* Pointer to adapter context */
28754-SK_IOC IoC, /* IO context handle */
28755-int Action, /* GET/PRESET/SET action */
28756-SK_U32 Id, /* Object ID that is to be processed */
28757-char *pBuf, /* Buffer used for the management data transfer */
28758-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
28759-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
28760-unsigned int TableIndex, /* Index to the Id table */
28761-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
28762-{
28763- int Ret;
28764- SK_U32 ActionOp;
28765-
28766-
28767- /*
28768- * Check instance. We only handle single instance variables
28769- */
28770- if (Instance != (SK_U32)(-1) && Instance != 1) {
28771-
28772- *pLen = 0;
28773- return (SK_PNMI_ERR_UNKNOWN_INST);
28774- }
28775-
28776- if (*pLen < sizeof(SK_U32)) {
28777-
28778- *pLen = sizeof(SK_U32);
28779- return (SK_PNMI_ERR_TOO_SHORT);
28780- }
28781-
28782- /* Check if a get should be performed */
28783- if (Action == SK_PNMI_GET) {
28784-
28785- /* A get is easy. We always return the same value */
28786- ActionOp = (SK_U32)SK_PNMI_ACT_IDLE;
28787- SK_PNMI_STORE_U32(pBuf, ActionOp);
28788- *pLen = sizeof(SK_U32);
28789-
28790- return (SK_PNMI_ERR_OK);
28791- }
28792-
28793- /* Continue with PRESET/SET action */
28794- if (*pLen > sizeof(SK_U32)) {
28795-
28796- return (SK_PNMI_ERR_BAD_VALUE);
28797- }
28798-
28799- /* Check if the command is a known one */
28800- SK_PNMI_READ_U32(pBuf, ActionOp);
28801- if (*pLen > sizeof(SK_U32) ||
28802- (ActionOp != SK_PNMI_ACT_IDLE &&
28803- ActionOp != SK_PNMI_ACT_RESET &&
28804- ActionOp != SK_PNMI_ACT_SELFTEST &&
28805- ActionOp != SK_PNMI_ACT_RESETCNT)) {
28806-
28807- *pLen = 0;
28808- return (SK_PNMI_ERR_BAD_VALUE);
28809- }
28810-
28811- /* A preset ends here */
28812- if (Action == SK_PNMI_PRESET) {
28813-
28814- return (SK_PNMI_ERR_OK);
28815- }
28816-
28817- switch (ActionOp) {
28818-
28819- case SK_PNMI_ACT_IDLE:
28820- /* Nothing to do */
28821- break;
28822-
28823- case SK_PNMI_ACT_RESET:
28824- /*
28825- * Perform a driver reset or something that comes near
28826- * to this.
28827- */
28828- Ret = SK_DRIVER_RESET(pAC, IoC);
28829- if (Ret != 0) {
28830-
28831- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR005,
28832- SK_PNMI_ERR005MSG);
28833-
28834- return (SK_PNMI_ERR_GENERAL);
28835- }
28836- break;
28837-
28838- case SK_PNMI_ACT_SELFTEST:
28839- /*
28840- * Perform a driver selftest or something similar to this.
28841- * Currently this feature is not used and will probably
28842- * implemented in another way.
28843- */
28844- Ret = SK_DRIVER_SELFTEST(pAC, IoC);
28845- pAC->Pnmi.TestResult = Ret;
28846- break;
28847-
28848- case SK_PNMI_ACT_RESETCNT:
28849- /* Set all counters and timestamps to zero */
28850- ResetCounter(pAC, IoC, NetIndex);
28851- break;
28852-
28853- default:
28854- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR006,
28855- SK_PNMI_ERR006MSG);
28856-
28857- return (SK_PNMI_ERR_GENERAL);
28858- }
28859-
28860- return (SK_PNMI_ERR_OK);
28861-}
28862-
28863-/*****************************************************************************
28864- *
28865- * Mac8023Stat - OID handler of OID_GEN_XXX and OID_802_3_XXX
28866- *
28867- * Description:
28868- * Retrieves the statistic values of the virtual port (logical
28869- * index 0). Only special OIDs of NDIS are handled which consist
28870- * of a 32 bit instead of a 64 bit value. The OIDs are public
28871- * because perhaps some other platform can use them too.
28872- *
28873- * Returns:
28874- * SK_PNMI_ERR_OK The request was successfully performed.
28875- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
28876- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
28877- * the correct data (e.g. a 32bit value is
28878- * needed, but a 16 bit value was passed).
28879- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
28880- * exist (e.g. port instance 3 on a two port
28881- * adapter.
28882- */
28883-PNMI_STATIC int Mac8023Stat(
28884-SK_AC *pAC, /* Pointer to adapter context */
28885-SK_IOC IoC, /* IO context handle */
28886-int Action, /* GET/PRESET/SET action */
28887-SK_U32 Id, /* Object ID that is to be processed */
28888-char *pBuf, /* Buffer used for the management data transfer */
28889-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
28890-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
28891-unsigned int TableIndex, /* Index to the Id table */
28892-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
28893-{
28894- int Ret;
28895- SK_U64 StatVal;
28896- SK_U32 StatVal32;
28897- SK_BOOL Is64BitReq = SK_FALSE;
28898-
28899- /*
28900- * Only the active Mac is returned
28901- */
28902- if (Instance != (SK_U32)(-1) && Instance != 1) {
28903-
28904- *pLen = 0;
28905- return (SK_PNMI_ERR_UNKNOWN_INST);
28906- }
28907-
28908- /*
28909- * Check action type
28910- */
28911- if (Action != SK_PNMI_GET) {
28912-
28913- *pLen = 0;
28914- return (SK_PNMI_ERR_READ_ONLY);
28915- }
28916-
28917- /* Check length */
28918- switch (Id) {
28919-
28920- case OID_802_3_PERMANENT_ADDRESS:
28921- case OID_802_3_CURRENT_ADDRESS:
28922- if (*pLen < sizeof(SK_MAC_ADDR)) {
28923-
28924- *pLen = sizeof(SK_MAC_ADDR);
28925- return (SK_PNMI_ERR_TOO_SHORT);
28926- }
28927- break;
28928-
28929- default:
28930-#ifndef SK_NDIS_64BIT_CTR
28931- if (*pLen < sizeof(SK_U32)) {
28932- *pLen = sizeof(SK_U32);
28933- return (SK_PNMI_ERR_TOO_SHORT);
28934- }
28935-
28936-#else /* SK_NDIS_64BIT_CTR */
28937-
28938- /* for compatibility, at least 32bit are required for OID */
28939- if (*pLen < sizeof(SK_U32)) {
28940- /*
28941- * but indicate handling for 64bit values,
28942- * if insufficient space is provided
28943- */
28944- *pLen = sizeof(SK_U64);
28945- return (SK_PNMI_ERR_TOO_SHORT);
28946- }
28947-
28948- Is64BitReq = (*pLen < sizeof(SK_U64)) ? SK_FALSE : SK_TRUE;
28949-#endif /* SK_NDIS_64BIT_CTR */
28950- break;
28951- }
28952-
28953- /*
28954- * Update all statistics, because we retrieve virtual MAC, which
28955- * consists of multiple physical statistics and increment semaphore
28956- * to indicate that an update was already done.
28957- */
28958- Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);
28959- if ( Ret != SK_PNMI_ERR_OK) {
28960-
28961- *pLen = 0;
28962- return (Ret);
28963- }
28964- pAC->Pnmi.MacUpdatedFlag ++;
28965-
28966- /*
28967- * Get value (MAC Index 0 identifies the virtual MAC)
28968- */
28969- switch (Id) {
28970-
28971- case OID_802_3_PERMANENT_ADDRESS:
28972- CopyMac(pBuf, &pAC->Addr.Net[NetIndex].PermanentMacAddress);
28973- *pLen = sizeof(SK_MAC_ADDR);
28974- break;
28975-
28976- case OID_802_3_CURRENT_ADDRESS:
28977- CopyMac(pBuf, &pAC->Addr.Net[NetIndex].CurrentMacAddress);
28978- *pLen = sizeof(SK_MAC_ADDR);
28979- break;
28980-
28981- default:
28982- StatVal = GetStatVal(pAC, IoC, 0, IdTable[TableIndex].Param, NetIndex);
28983-
28984- /* by default 32bit values are evaluated */
28985- if (!Is64BitReq) {
28986- StatVal32 = (SK_U32)StatVal;
28987- SK_PNMI_STORE_U32(pBuf, StatVal32);
28988- *pLen = sizeof(SK_U32);
28989- }
28990- else {
28991- SK_PNMI_STORE_U64(pBuf, StatVal);
28992- *pLen = sizeof(SK_U64);
28993- }
28994- break;
28995- }
28996-
28997- pAC->Pnmi.MacUpdatedFlag --;
28998-
28999- return (SK_PNMI_ERR_OK);
29000-}
29001-
29002-/*****************************************************************************
29003- *
29004- * MacPrivateStat - OID handler function of OID_SKGE_STAT_XXX
29005- *
29006- * Description:
29007- * Retrieves the MAC statistic data.
29008- *
29009- * Returns:
29010- * SK_PNMI_ERR_OK The request was successfully performed.
29011- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
29012- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
29013- * the correct data (e.g. a 32bit value is
29014- * needed, but a 16 bit value was passed).
29015- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
29016- * exist (e.g. port instance 3 on a two port
29017- * adapter.
29018- */
29019-PNMI_STATIC int MacPrivateStat(
29020-SK_AC *pAC, /* Pointer to adapter context */
29021-SK_IOC IoC, /* IO context handle */
29022-int Action, /* GET/PRESET/SET action */
29023-SK_U32 Id, /* Object ID that is to be processed */
29024-char *pBuf, /* Buffer used for the management data transfer */
29025-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
29026-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
29027-unsigned int TableIndex, /* Index to the Id table */
29028-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
29029-{
29030- unsigned int LogPortMax;
29031- unsigned int LogPortIndex;
29032- unsigned int PhysPortMax;
29033- unsigned int Limit;
29034- unsigned int Offset;
29035- int MacType;
29036- int Ret;
29037- SK_U64 StatVal;
29038-
29039-
29040-
29041- /* Calculate instance if wished. MAC index 0 is the virtual MAC */
29042- PhysPortMax = pAC->GIni.GIMacsFound;
29043- LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);
29044-
29045- MacType = pAC->GIni.GIMacType;
29046-
29047- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */
29048- LogPortMax--;
29049- }
29050-
29051- if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */
29052- /* Check instance range */
29053- if ((Instance < 1) || (Instance > LogPortMax)) {
29054-
29055- *pLen = 0;
29056- return (SK_PNMI_ERR_UNKNOWN_INST);
29057- }
29058- LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);
29059- Limit = LogPortIndex + 1;
29060- }
29061-
29062- else { /* Instance == (SK_U32)(-1), get all Instances of that OID */
29063-
29064- LogPortIndex = 0;
29065- Limit = LogPortMax;
29066- }
29067-
29068- /* Check action */
29069- if (Action != SK_PNMI_GET) {
29070-
29071- *pLen = 0;
29072- return (SK_PNMI_ERR_READ_ONLY);
29073- }
29074-
29075- /* Check length */
29076- if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U64)) {
29077-
29078- *pLen = (Limit - LogPortIndex) * sizeof(SK_U64);
29079- return (SK_PNMI_ERR_TOO_SHORT);
29080- }
29081-
29082- /*
29083- * Update MAC statistic and increment semaphore to indicate that
29084- * an update was already done.
29085- */
29086- Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);
29087- if (Ret != SK_PNMI_ERR_OK) {
29088-
29089- *pLen = 0;
29090- return (Ret);
29091- }
29092- pAC->Pnmi.MacUpdatedFlag ++;
29093-
29094- /* Get value */
29095- Offset = 0;
29096- for (; LogPortIndex < Limit; LogPortIndex ++) {
29097-
29098- switch (Id) {
29099-
29100-/* XXX not yet implemented due to XMAC problems
29101- case OID_SKGE_STAT_TX_UTIL:
29102- return (SK_PNMI_ERR_GENERAL);
29103-*/
29104-/* XXX not yet implemented due to XMAC problems
29105- case OID_SKGE_STAT_RX_UTIL:
29106- return (SK_PNMI_ERR_GENERAL);
29107-*/
29108- case OID_SKGE_STAT_RX:
29109- if (MacType == SK_MAC_GMAC) {
29110- StatVal =
29111- GetStatVal(pAC, IoC, LogPortIndex,
29112- SK_PNMI_HRX_BROADCAST, NetIndex) +
29113- GetStatVal(pAC, IoC, LogPortIndex,
29114- SK_PNMI_HRX_MULTICAST, NetIndex) +
29115- GetStatVal(pAC, IoC, LogPortIndex,
29116- SK_PNMI_HRX_UNICAST, NetIndex) +
29117- GetStatVal(pAC, IoC, LogPortIndex,
29118- SK_PNMI_HRX_UNDERSIZE, NetIndex);
29119- }
29120- else {
29121- StatVal = GetStatVal(pAC, IoC, LogPortIndex,
29122- IdTable[TableIndex].Param, NetIndex);
29123- }
29124- break;
29125-
29126- case OID_SKGE_STAT_TX:
29127- if (MacType == SK_MAC_GMAC) {
29128- StatVal =
29129- GetStatVal(pAC, IoC, LogPortIndex,
29130- SK_PNMI_HTX_BROADCAST, NetIndex) +
29131- GetStatVal(pAC, IoC, LogPortIndex,
29132- SK_PNMI_HTX_MULTICAST, NetIndex) +
29133- GetStatVal(pAC, IoC, LogPortIndex,
29134- SK_PNMI_HTX_UNICAST, NetIndex);
29135- }
29136- else {
29137- StatVal = GetStatVal(pAC, IoC, LogPortIndex,
29138- IdTable[TableIndex].Param, NetIndex);
29139- }
29140- break;
29141-
29142- default:
29143- StatVal = GetStatVal(pAC, IoC, LogPortIndex,
29144- IdTable[TableIndex].Param, NetIndex);
29145- }
29146- SK_PNMI_STORE_U64(pBuf + Offset, StatVal);
29147-
29148- Offset += sizeof(SK_U64);
29149- }
29150- *pLen = Offset;
29151-
29152- pAC->Pnmi.MacUpdatedFlag --;
29153-
29154- return (SK_PNMI_ERR_OK);
29155-}
29156-
29157-/*****************************************************************************
29158- *
29159- * Addr - OID handler function of OID_SKGE_PHYS_CUR_ADDR and _FAC_ADDR
29160- *
29161- * Description:
29162- * Get/Presets/Sets the current and factory MAC address. The MAC
29163- * address of the virtual port, which is reported to the OS, may
29164- * not be changed, but the physical ones. A set to the virtual port
29165- * will be ignored. No error should be reported because otherwise
29166- * a multiple instance set (-1) would always fail.
29167- *
29168- * Returns:
29169- * SK_PNMI_ERR_OK The request was successfully performed.
29170- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
29171- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
29172- * the correct data (e.g. a 32bit value is
29173- * needed, but a 16 bit value was passed).
29174- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
29175- * value range.
29176- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
29177- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
29178- * exist (e.g. port instance 3 on a two port
29179- * adapter.
29180- */
29181-PNMI_STATIC int Addr(
29182-SK_AC *pAC, /* Pointer to adapter context */
29183-SK_IOC IoC, /* IO context handle */
29184-int Action, /* GET/PRESET/SET action */
29185-SK_U32 Id, /* Object ID that is to be processed */
29186-char *pBuf, /* Buffer used for the management data transfer */
29187-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
29188-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
29189-unsigned int TableIndex, /* Index to the Id table */
29190-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
29191-{
29192- int Ret;
29193- unsigned int LogPortMax;
29194- unsigned int PhysPortMax;
29195- unsigned int LogPortIndex;
29196- unsigned int PhysPortIndex;
29197- unsigned int Limit;
29198- unsigned int Offset = 0;
29199-
29200- /*
29201- * Calculate instance if wished. MAC index 0 is the virtual
29202- * MAC.
29203- */
29204- PhysPortMax = pAC->GIni.GIMacsFound;
29205- LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);
29206-
29207- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */
29208- LogPortMax--;
29209- }
29210-
29211- if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */
29212- /* Check instance range */
29213- if ((Instance < 1) || (Instance > LogPortMax)) {
29214-
29215- *pLen = 0;
29216- return (SK_PNMI_ERR_UNKNOWN_INST);
29217- }
29218- LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);
29219- Limit = LogPortIndex + 1;
29220- }
29221- else { /* Instance == (SK_U32)(-1), get all Instances of that OID */
29222-
29223- LogPortIndex = 0;
29224- Limit = LogPortMax;
29225- }
29226-
29227- /*
29228- * Perform Action
29229- */
29230- if (Action == SK_PNMI_GET) {
29231-
29232- /* Check length */
29233- if (*pLen < (Limit - LogPortIndex) * 6) {
29234-
29235- *pLen = (Limit - LogPortIndex) * 6;
29236- return (SK_PNMI_ERR_TOO_SHORT);
29237- }
29238-
29239- /*
29240- * Get value
29241- */
29242- for (; LogPortIndex < Limit; LogPortIndex ++) {
29243-
29244- switch (Id) {
29245-
29246- case OID_SKGE_PHYS_CUR_ADDR:
29247- if (LogPortIndex == 0) {
29248- CopyMac(pBuf + Offset, &pAC->Addr.Net[NetIndex].CurrentMacAddress);
29249- }
29250- else {
29251- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
29252-
29253- CopyMac(pBuf + Offset,
29254- &pAC->Addr.Port[PhysPortIndex].CurrentMacAddress);
29255- }
29256- Offset += 6;
29257- break;
29258-
29259- case OID_SKGE_PHYS_FAC_ADDR:
29260- if (LogPortIndex == 0) {
29261- CopyMac(pBuf + Offset,
29262- &pAC->Addr.Net[NetIndex].PermanentMacAddress);
29263- }
29264- else {
29265- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
29266- pAC, LogPortIndex);
29267-
29268- CopyMac(pBuf + Offset,
29269- &pAC->Addr.Port[PhysPortIndex].PermanentMacAddress);
29270- }
29271- Offset += 6;
29272- break;
29273-
29274- default:
29275- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR008,
29276- SK_PNMI_ERR008MSG);
29277-
29278- *pLen = 0;
29279- return (SK_PNMI_ERR_GENERAL);
29280- }
29281- }
29282-
29283- *pLen = Offset;
29284- }
29285- else {
29286- /*
29287- * The logical MAC address may not be changed only
29288- * the physical ones
29289- */
29290- if (Id == OID_SKGE_PHYS_FAC_ADDR) {
29291-
29292- *pLen = 0;
29293- return (SK_PNMI_ERR_READ_ONLY);
29294- }
29295-
29296- /*
29297- * Only the current address may be changed
29298- */
29299- if (Id != OID_SKGE_PHYS_CUR_ADDR) {
29300-
29301- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR009,
29302- SK_PNMI_ERR009MSG);
29303-
29304- *pLen = 0;
29305- return (SK_PNMI_ERR_GENERAL);
29306- }
29307-
29308- /* Check length */
29309- if (*pLen < (Limit - LogPortIndex) * 6) {
29310-
29311- *pLen = (Limit - LogPortIndex) * 6;
29312- return (SK_PNMI_ERR_TOO_SHORT);
29313- }
29314- if (*pLen > (Limit - LogPortIndex) * 6) {
29315-
29316- *pLen = 0;
29317- return (SK_PNMI_ERR_BAD_VALUE);
29318- }
29319-
29320- /*
29321- * Check Action
29322- */
29323- if (Action == SK_PNMI_PRESET) {
29324-
29325- *pLen = 0;
29326- return (SK_PNMI_ERR_OK);
29327- }
29328-
29329- /*
29330- * Set OID_SKGE_MAC_CUR_ADDR
29331- */
29332- for (; LogPortIndex < Limit; LogPortIndex ++, Offset += 6) {
29333-
29334- /*
29335- * A set to virtual port and set of broadcast
29336- * address will be ignored
29337- */
29338- if (LogPortIndex == 0 || SK_MEMCMP(pBuf + Offset,
29339- "\xff\xff\xff\xff\xff\xff", 6) == 0) {
29340-
29341- continue;
29342- }
29343-
29344- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC,
29345- LogPortIndex);
29346-
29347- Ret = SkAddrOverride(pAC, IoC, PhysPortIndex,
29348- (SK_MAC_ADDR *)(pBuf + Offset),
29349- (LogPortIndex == 0 ? SK_ADDR_VIRTUAL_ADDRESS :
29350- SK_ADDR_PHYSICAL_ADDRESS));
29351- if (Ret != SK_ADDR_OVERRIDE_SUCCESS) {
29352-
29353- return (SK_PNMI_ERR_GENERAL);
29354- }
29355- }
29356- *pLen = Offset;
29357- }
29358-
29359- return (SK_PNMI_ERR_OK);
29360-}
29361-
29362-/*****************************************************************************
29363- *
29364- * CsumStat - OID handler function of OID_SKGE_CHKSM_XXX
29365- *
29366- * Description:
29367- * Retrieves the statistic values of the CSUM module. The CSUM data
29368- * structure must be available in the SK_AC even if the CSUM module
29369- * is not included, because PNMI reads the statistic data from the
29370- * CSUM part of SK_AC directly.
29371- *
29372- * Returns:
29373- * SK_PNMI_ERR_OK The request was successfully performed.
29374- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
29375- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
29376- * the correct data (e.g. a 32bit value is
29377- * needed, but a 16 bit value was passed).
29378- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
29379- * exist (e.g. port instance 3 on a two port
29380- * adapter.
29381- */
29382-PNMI_STATIC int CsumStat(
29383-SK_AC *pAC, /* Pointer to adapter context */
29384-SK_IOC IoC, /* IO context handle */
29385-int Action, /* GET/PRESET/SET action */
29386-SK_U32 Id, /* Object ID that is to be processed */
29387-char *pBuf, /* Buffer used for the management data transfer */
29388-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
29389-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
29390-unsigned int TableIndex, /* Index to the Id table */
29391-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
29392-{
29393- unsigned int Index;
29394- unsigned int Limit;
29395- unsigned int Offset = 0;
29396- SK_U64 StatVal;
29397-
29398-
29399- /*
29400- * Calculate instance if wished
29401- */
29402- if (Instance != (SK_U32)(-1)) {
29403-
29404- if ((Instance < 1) || (Instance > SKCS_NUM_PROTOCOLS)) {
29405-
29406- *pLen = 0;
29407- return (SK_PNMI_ERR_UNKNOWN_INST);
29408- }
29409- Index = (unsigned int)Instance - 1;
29410- Limit = Index + 1;
29411- }
29412- else {
29413- Index = 0;
29414- Limit = SKCS_NUM_PROTOCOLS;
29415- }
29416-
29417- /*
29418- * Check action
29419- */
29420- if (Action != SK_PNMI_GET) {
29421-
29422- *pLen = 0;
29423- return (SK_PNMI_ERR_READ_ONLY);
29424- }
29425-
29426- /* Check length */
29427- if (*pLen < (Limit - Index) * sizeof(SK_U64)) {
29428-
29429- *pLen = (Limit - Index) * sizeof(SK_U64);
29430- return (SK_PNMI_ERR_TOO_SHORT);
29431- }
29432-
29433- /*
29434- * Get value
29435- */
29436- for (; Index < Limit; Index ++) {
29437-
29438- switch (Id) {
29439-
29440- case OID_SKGE_CHKSM_RX_OK_CTS:
29441- StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxOkCts;
29442- break;
29443-
29444- case OID_SKGE_CHKSM_RX_UNABLE_CTS:
29445- StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxUnableCts;
29446- break;
29447-
29448- case OID_SKGE_CHKSM_RX_ERR_CTS:
29449- StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxErrCts;
29450- break;
29451-
29452- case OID_SKGE_CHKSM_TX_OK_CTS:
29453- StatVal = pAC->Csum.ProtoStats[NetIndex][Index].TxOkCts;
29454- break;
29455-
29456- case OID_SKGE_CHKSM_TX_UNABLE_CTS:
29457- StatVal = pAC->Csum.ProtoStats[NetIndex][Index].TxUnableCts;
29458- break;
29459-
29460- default:
29461- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR010,
29462- SK_PNMI_ERR010MSG);
29463-
29464- *pLen = 0;
29465- return (SK_PNMI_ERR_GENERAL);
29466- }
29467-
29468- SK_PNMI_STORE_U64(pBuf + Offset, StatVal);
29469- Offset += sizeof(SK_U64);
29470- }
29471-
29472- /*
29473- * Store used buffer space
29474- */
29475- *pLen = Offset;
29476-
29477- return (SK_PNMI_ERR_OK);
29478-}
29479-
29480-/*****************************************************************************
29481- *
29482- * SensorStat - OID handler function of OID_SKGE_SENSOR_XXX
29483- *
29484- * Description:
29485- * Retrieves the statistic values of the I2C module, which handles
29486- * the temperature and voltage sensors.
29487- *
29488- * Returns:
29489- * SK_PNMI_ERR_OK The request was successfully performed.
29490- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
29491- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
29492- * the correct data (e.g. a 32bit value is
29493- * needed, but a 16 bit value was passed).
29494- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
29495- * exist (e.g. port instance 3 on a two port
29496- * adapter.
29497- */
29498-PNMI_STATIC int SensorStat(
29499-SK_AC *pAC, /* Pointer to adapter context */
29500-SK_IOC IoC, /* IO context handle */
29501-int Action, /* GET/PRESET/SET action */
29502-SK_U32 Id, /* Object ID that is to be processed */
29503-char *pBuf, /* Buffer used for the management data transfer */
29504-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
29505-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
29506-unsigned int TableIndex, /* Index to the Id table */
29507-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
29508-{
29509- unsigned int i;
29510- unsigned int Index;
29511- unsigned int Limit;
29512- unsigned int Offset;
29513- unsigned int Len;
29514- SK_U32 Val32;
29515- SK_U64 Val64;
29516-
29517-
29518- /*
29519- * Calculate instance if wished
29520- */
29521- if ((Instance != (SK_U32)(-1))) {
29522-
29523- if ((Instance < 1) || (Instance > (SK_U32)pAC->I2c.MaxSens)) {
29524-
29525- *pLen = 0;
29526- return (SK_PNMI_ERR_UNKNOWN_INST);
29527- }
29528-
29529- Index = (unsigned int)Instance -1;
29530- Limit = (unsigned int)Instance;
29531- }
29532- else {
29533- Index = 0;
29534- Limit = (unsigned int) pAC->I2c.MaxSens;
29535- }
29536-
29537- /*
29538- * Check action
29539- */
29540- if (Action != SK_PNMI_GET) {
29541-
29542- *pLen = 0;
29543- return (SK_PNMI_ERR_READ_ONLY);
29544- }
29545-
29546- /* Check length */
29547- switch (Id) {
29548-
29549- case OID_SKGE_SENSOR_VALUE:
29550- case OID_SKGE_SENSOR_WAR_THRES_LOW:
29551- case OID_SKGE_SENSOR_WAR_THRES_UPP:
29552- case OID_SKGE_SENSOR_ERR_THRES_LOW:
29553- case OID_SKGE_SENSOR_ERR_THRES_UPP:
29554- if (*pLen < (Limit - Index) * sizeof(SK_U32)) {
29555-
29556- *pLen = (Limit - Index) * sizeof(SK_U32);
29557- return (SK_PNMI_ERR_TOO_SHORT);
29558- }
29559- break;
29560-
29561- case OID_SKGE_SENSOR_DESCR:
29562- for (Offset = 0, i = Index; i < Limit; i ++) {
29563-
29564- Len = (unsigned int)
29565- SK_STRLEN(pAC->I2c.SenTable[i].SenDesc) + 1;
29566- if (Len >= SK_PNMI_STRINGLEN2) {
29567-
29568- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR011,
29569- SK_PNMI_ERR011MSG);
29570-
29571- *pLen = 0;
29572- return (SK_PNMI_ERR_GENERAL);
29573- }
29574- Offset += Len;
29575- }
29576- if (*pLen < Offset) {
29577-
29578- *pLen = Offset;
29579- return (SK_PNMI_ERR_TOO_SHORT);
29580- }
29581- break;
29582-
29583- case OID_SKGE_SENSOR_INDEX:
29584- case OID_SKGE_SENSOR_TYPE:
29585- case OID_SKGE_SENSOR_STATUS:
29586- if (*pLen < Limit - Index) {
29587-
29588- *pLen = Limit - Index;
29589- return (SK_PNMI_ERR_TOO_SHORT);
29590- }
29591- break;
29592-
29593- case OID_SKGE_SENSOR_WAR_CTS:
29594- case OID_SKGE_SENSOR_WAR_TIME:
29595- case OID_SKGE_SENSOR_ERR_CTS:
29596- case OID_SKGE_SENSOR_ERR_TIME:
29597- if (*pLen < (Limit - Index) * sizeof(SK_U64)) {
29598-
29599- *pLen = (Limit - Index) * sizeof(SK_U64);
29600- return (SK_PNMI_ERR_TOO_SHORT);
29601- }
29602- break;
29603-
29604- default:
29605- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR012,
29606- SK_PNMI_ERR012MSG);
29607-
29608- *pLen = 0;
29609- return (SK_PNMI_ERR_GENERAL);
29610-
29611- }
29612-
29613- /*
29614- * Get value
29615- */
29616- for (Offset = 0; Index < Limit; Index ++) {
29617-
29618- switch (Id) {
29619-
29620- case OID_SKGE_SENSOR_INDEX:
29621- *(pBuf + Offset) = (char)Index;
29622- Offset += sizeof(char);
29623- break;
29624-
29625- case OID_SKGE_SENSOR_DESCR:
29626- Len = SK_STRLEN(pAC->I2c.SenTable[Index].SenDesc);
29627- SK_MEMCPY(pBuf + Offset + 1,
29628- pAC->I2c.SenTable[Index].SenDesc, Len);
29629- *(pBuf + Offset) = (char)Len;
29630- Offset += Len + 1;
29631- break;
29632-
29633- case OID_SKGE_SENSOR_TYPE:
29634- *(pBuf + Offset) =
29635- (char)pAC->I2c.SenTable[Index].SenType;
29636- Offset += sizeof(char);
29637- break;
29638-
29639- case OID_SKGE_SENSOR_VALUE:
29640- Val32 = (SK_U32)pAC->I2c.SenTable[Index].SenValue;
29641- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
29642- Offset += sizeof(SK_U32);
29643- break;
29644-
29645- case OID_SKGE_SENSOR_WAR_THRES_LOW:
29646- Val32 = (SK_U32)pAC->I2c.SenTable[Index].
29647- SenThreWarnLow;
29648- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
29649- Offset += sizeof(SK_U32);
29650- break;
29651-
29652- case OID_SKGE_SENSOR_WAR_THRES_UPP:
29653- Val32 = (SK_U32)pAC->I2c.SenTable[Index].
29654- SenThreWarnHigh;
29655- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
29656- Offset += sizeof(SK_U32);
29657- break;
29658-
29659- case OID_SKGE_SENSOR_ERR_THRES_LOW:
29660- Val32 = (SK_U32)pAC->I2c.SenTable[Index].
29661- SenThreErrLow;
29662- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
29663- Offset += sizeof(SK_U32);
29664- break;
29665-
29666- case OID_SKGE_SENSOR_ERR_THRES_UPP:
29667- Val32 = pAC->I2c.SenTable[Index].SenThreErrHigh;
29668- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
29669- Offset += sizeof(SK_U32);
29670- break;
29671-
29672- case OID_SKGE_SENSOR_STATUS:
29673- *(pBuf + Offset) =
29674- (char)pAC->I2c.SenTable[Index].SenErrFlag;
29675- Offset += sizeof(char);
29676- break;
29677-
29678- case OID_SKGE_SENSOR_WAR_CTS:
29679- Val64 = pAC->I2c.SenTable[Index].SenWarnCts;
29680- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
29681- Offset += sizeof(SK_U64);
29682- break;
29683-
29684- case OID_SKGE_SENSOR_ERR_CTS:
29685- Val64 = pAC->I2c.SenTable[Index].SenErrCts;
29686- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
29687- Offset += sizeof(SK_U64);
29688- break;
29689-
29690- case OID_SKGE_SENSOR_WAR_TIME:
29691- Val64 = SK_PNMI_HUNDREDS_SEC(pAC->I2c.SenTable[Index].
29692- SenBegWarnTS);
29693- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
29694- Offset += sizeof(SK_U64);
29695- break;
29696-
29697- case OID_SKGE_SENSOR_ERR_TIME:
29698- Val64 = SK_PNMI_HUNDREDS_SEC(pAC->I2c.SenTable[Index].
29699- SenBegErrTS);
29700- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
29701- Offset += sizeof(SK_U64);
29702- break;
29703-
29704- default:
29705- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,
29706- ("SensorStat: Unknown OID should be handled before"));
29707-
29708- return (SK_PNMI_ERR_GENERAL);
29709- }
29710- }
29711-
29712- /*
29713- * Store used buffer space
29714- */
29715- *pLen = Offset;
29716-
29717- return (SK_PNMI_ERR_OK);
29718-}
29719-
29720-/*****************************************************************************
29721- *
29722- * Vpd - OID handler function of OID_SKGE_VPD_XXX
29723- *
29724- * Description:
29725- * Get/preset/set of VPD data. As instance the name of a VPD key
29726- * can be passed. The Instance parameter is a SK_U32 and can be
29727- * used as a string buffer for the VPD key, because their maximum
29728- * length is 4 byte.
29729- *
29730- * Returns:
29731- * SK_PNMI_ERR_OK The request was successfully performed.
29732- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
29733- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
29734- * the correct data (e.g. a 32bit value is
29735- * needed, but a 16 bit value was passed).
29736- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
29737- * value range.
29738- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
29739- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
29740- * exist (e.g. port instance 3 on a two port
29741- * adapter.
29742- */
29743-PNMI_STATIC int Vpd(
29744-SK_AC *pAC, /* Pointer to adapter context */
29745-SK_IOC IoC, /* IO context handle */
29746-int Action, /* GET/PRESET/SET action */
29747-SK_U32 Id, /* Object ID that is to be processed */
29748-char *pBuf, /* Buffer used for the management data transfer */
29749-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
29750-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
29751-unsigned int TableIndex, /* Index to the Id table */
29752-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
29753-{
29754- SK_VPD_STATUS *pVpdStatus;
29755- unsigned int BufLen;
29756- char Buf[256];
29757- char KeyArr[SK_PNMI_VPD_ENTRIES][SK_PNMI_VPD_KEY_SIZE];
29758- char KeyStr[SK_PNMI_VPD_KEY_SIZE];
29759- unsigned int KeyNo;
29760- unsigned int Offset;
29761- unsigned int Index;
29762- unsigned int FirstIndex;
29763- unsigned int LastIndex;
29764- unsigned int Len;
29765- int Ret;
29766- SK_U32 Val32;
29767-
29768- /*
29769- * Get array of all currently stored VPD keys
29770- */
29771- Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &KeyNo);
29772- if (Ret != SK_PNMI_ERR_OK) {
29773- *pLen = 0;
29774- return (Ret);
29775- }
29776-
29777- /*
29778- * If instance is not -1, try to find the requested VPD key for
29779- * the multiple instance variables. The other OIDs as for example
29780- * OID VPD_ACTION are single instance variables and must be
29781- * handled separatly.
29782- */
29783- FirstIndex = 0;
29784- LastIndex = KeyNo;
29785-
29786- if ((Instance != (SK_U32)(-1))) {
29787-
29788- if (Id == OID_SKGE_VPD_KEY || Id == OID_SKGE_VPD_VALUE ||
29789- Id == OID_SKGE_VPD_ACCESS) {
29790-
29791- SK_STRNCPY(KeyStr, (char *)&Instance, 4);
29792- KeyStr[4] = 0;
29793-
29794- for (Index = 0; Index < KeyNo; Index ++) {
29795-
29796- if (SK_STRCMP(KeyStr, KeyArr[Index]) == 0) {
29797- FirstIndex = Index;
29798- LastIndex = Index+1;
29799- break;
29800- }
29801- }
29802- if (Index == KeyNo) {
29803-
29804- *pLen = 0;
29805- return (SK_PNMI_ERR_UNKNOWN_INST);
29806- }
29807- }
29808- else if (Instance != 1) {
29809-
29810- *pLen = 0;
29811- return (SK_PNMI_ERR_UNKNOWN_INST);
29812- }
29813- }
29814-
29815- /*
29816- * Get value, if a query should be performed
29817- */
29818- if (Action == SK_PNMI_GET) {
29819-
29820- switch (Id) {
29821-
29822- case OID_SKGE_VPD_FREE_BYTES:
29823- /* Check length of buffer */
29824- if (*pLen < sizeof(SK_U32)) {
29825-
29826- *pLen = sizeof(SK_U32);
29827- return (SK_PNMI_ERR_TOO_SHORT);
29828- }
29829- /* Get number of free bytes */
29830- pVpdStatus = VpdStat(pAC, IoC);
29831- if (pVpdStatus == NULL) {
29832-
29833- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR017,
29834- SK_PNMI_ERR017MSG);
29835-
29836- *pLen = 0;
29837- return (SK_PNMI_ERR_GENERAL);
29838- }
29839- if ((pVpdStatus->vpd_status & VPD_VALID) == 0) {
29840-
29841- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR018,
29842- SK_PNMI_ERR018MSG);
29843-
29844- *pLen = 0;
29845- return (SK_PNMI_ERR_GENERAL);
29846- }
29847-
29848- Val32 = (SK_U32)pVpdStatus->vpd_free_rw;
29849- SK_PNMI_STORE_U32(pBuf, Val32);
29850- *pLen = sizeof(SK_U32);
29851- break;
29852-
29853- case OID_SKGE_VPD_ENTRIES_LIST:
29854- /* Check length */
29855- for (Len = 0, Index = 0; Index < KeyNo; Index ++) {
29856-
29857- Len += SK_STRLEN(KeyArr[Index]) + 1;
29858- }
29859- if (*pLen < Len) {
29860-
29861- *pLen = Len;
29862- return (SK_PNMI_ERR_TOO_SHORT);
29863- }
29864-
29865- /* Get value */
29866- *(pBuf) = (char)Len - 1;
29867- for (Offset = 1, Index = 0; Index < KeyNo; Index ++) {
29868-
29869- Len = SK_STRLEN(KeyArr[Index]);
29870- SK_MEMCPY(pBuf + Offset, KeyArr[Index], Len);
29871-
29872- Offset += Len;
29873-
29874- if (Index < KeyNo - 1) {
29875-
29876- *(pBuf + Offset) = ' ';
29877- Offset ++;
29878- }
29879- }
29880- *pLen = Offset;
29881- break;
29882-
29883- case OID_SKGE_VPD_ENTRIES_NUMBER:
29884- /* Check length */
29885- if (*pLen < sizeof(SK_U32)) {
29886-
29887- *pLen = sizeof(SK_U32);
29888- return (SK_PNMI_ERR_TOO_SHORT);
29889- }
29890-
29891- Val32 = (SK_U32)KeyNo;
29892- SK_PNMI_STORE_U32(pBuf, Val32);
29893- *pLen = sizeof(SK_U32);
29894- break;
29895-
29896- case OID_SKGE_VPD_KEY:
29897- /* Check buffer length, if it is large enough */
29898- for (Len = 0, Index = FirstIndex;
29899- Index < LastIndex; Index ++) {
29900-
29901- Len += SK_STRLEN(KeyArr[Index]) + 1;
29902- }
29903- if (*pLen < Len) {
29904-
29905- *pLen = Len;
29906- return (SK_PNMI_ERR_TOO_SHORT);
29907- }
29908-
29909- /*
29910- * Get the key to an intermediate buffer, because
29911- * we have to prepend a length byte.
29912- */
29913- for (Offset = 0, Index = FirstIndex;
29914- Index < LastIndex; Index ++) {
29915-
29916- Len = SK_STRLEN(KeyArr[Index]);
29917-
29918- *(pBuf + Offset) = (char)Len;
29919- SK_MEMCPY(pBuf + Offset + 1, KeyArr[Index],
29920- Len);
29921- Offset += Len + 1;
29922- }
29923- *pLen = Offset;
29924- break;
29925-
29926- case OID_SKGE_VPD_VALUE:
29927- /* Check the buffer length if it is large enough */
29928- for (Offset = 0, Index = FirstIndex;
29929- Index < LastIndex; Index ++) {
29930-
29931- BufLen = 256;
29932- if (VpdRead(pAC, IoC, KeyArr[Index], Buf,
29933- (int *)&BufLen) > 0 ||
29934- BufLen >= SK_PNMI_VPD_DATALEN) {
29935-
29936- SK_ERR_LOG(pAC, SK_ERRCL_SW,
29937- SK_PNMI_ERR021,
29938- SK_PNMI_ERR021MSG);
29939-
29940- return (SK_PNMI_ERR_GENERAL);
29941- }
29942- Offset += BufLen + 1;
29943- }
29944- if (*pLen < Offset) {
29945-
29946- *pLen = Offset;
29947- return (SK_PNMI_ERR_TOO_SHORT);
29948- }
29949-
29950- /*
29951- * Get the value to an intermediate buffer, because
29952- * we have to prepend a length byte.
29953- */
29954- for (Offset = 0, Index = FirstIndex;
29955- Index < LastIndex; Index ++) {
29956-
29957- BufLen = 256;
29958- if (VpdRead(pAC, IoC, KeyArr[Index], Buf,
29959- (int *)&BufLen) > 0 ||
29960- BufLen >= SK_PNMI_VPD_DATALEN) {
29961-
29962- SK_ERR_LOG(pAC, SK_ERRCL_SW,
29963- SK_PNMI_ERR022,
29964- SK_PNMI_ERR022MSG);
29965-
29966- *pLen = 0;
29967- return (SK_PNMI_ERR_GENERAL);
29968- }
29969-
29970- *(pBuf + Offset) = (char)BufLen;
29971- SK_MEMCPY(pBuf + Offset + 1, Buf, BufLen);
29972- Offset += BufLen + 1;
29973- }
29974- *pLen = Offset;
29975- break;
29976-
29977- case OID_SKGE_VPD_ACCESS:
29978- if (*pLen < LastIndex - FirstIndex) {
29979-
29980- *pLen = LastIndex - FirstIndex;
29981- return (SK_PNMI_ERR_TOO_SHORT);
29982- }
29983-
29984- for (Offset = 0, Index = FirstIndex;
29985- Index < LastIndex; Index ++) {
29986-
29987- if (VpdMayWrite(KeyArr[Index])) {
29988-
29989- *(pBuf + Offset) = SK_PNMI_VPD_RW;
29990- }
29991- else {
29992- *(pBuf + Offset) = SK_PNMI_VPD_RO;
29993- }
29994- Offset ++;
29995- }
29996- *pLen = Offset;
29997- break;
29998-
29999- case OID_SKGE_VPD_ACTION:
30000- Offset = LastIndex - FirstIndex;
30001- if (*pLen < Offset) {
30002-
30003- *pLen = Offset;
30004- return (SK_PNMI_ERR_TOO_SHORT);
30005- }
30006- SK_MEMSET(pBuf, 0, Offset);
30007- *pLen = Offset;
30008- break;
30009-
30010- default:
30011- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR023,
30012- SK_PNMI_ERR023MSG);
30013-
30014- *pLen = 0;
30015- return (SK_PNMI_ERR_GENERAL);
30016- }
30017- }
30018- else {
30019- /* The only OID which can be set is VPD_ACTION */
30020- if (Id != OID_SKGE_VPD_ACTION) {
30021-
30022- if (Id == OID_SKGE_VPD_FREE_BYTES ||
30023- Id == OID_SKGE_VPD_ENTRIES_LIST ||
30024- Id == OID_SKGE_VPD_ENTRIES_NUMBER ||
30025- Id == OID_SKGE_VPD_KEY ||
30026- Id == OID_SKGE_VPD_VALUE ||
30027- Id == OID_SKGE_VPD_ACCESS) {
30028-
30029- *pLen = 0;
30030- return (SK_PNMI_ERR_READ_ONLY);
30031- }
30032-
30033- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR024,
30034- SK_PNMI_ERR024MSG);
30035-
30036- *pLen = 0;
30037- return (SK_PNMI_ERR_GENERAL);
30038- }
30039-
30040- /*
30041- * From this point we handle VPD_ACTION. Check the buffer
30042- * length. It should at least have the size of one byte.
30043- */
30044- if (*pLen < 1) {
30045-
30046- *pLen = 1;
30047- return (SK_PNMI_ERR_TOO_SHORT);
30048- }
30049-
30050- /*
30051- * The first byte contains the VPD action type we should
30052- * perform.
30053- */
30054- switch (*pBuf) {
30055-
30056- case SK_PNMI_VPD_IGNORE:
30057- /* Nothing to do */
30058- break;
30059-
30060- case SK_PNMI_VPD_CREATE:
30061- /*
30062- * We have to create a new VPD entry or we modify
30063- * an existing one. Check first the buffer length.
30064- */
30065- if (*pLen < 4) {
30066-
30067- *pLen = 4;
30068- return (SK_PNMI_ERR_TOO_SHORT);
30069- }
30070- KeyStr[0] = pBuf[1];
30071- KeyStr[1] = pBuf[2];
30072- KeyStr[2] = 0;
30073-
30074- /*
30075- * Is the entry writable or does it belong to the
30076- * read-only area?
30077- */
30078- if (!VpdMayWrite(KeyStr)) {
30079-
30080- *pLen = 0;
30081- return (SK_PNMI_ERR_BAD_VALUE);
30082- }
30083-
30084- Offset = (int)pBuf[3] & 0xFF;
30085-
30086- SK_MEMCPY(Buf, pBuf + 4, Offset);
30087- Buf[Offset] = 0;
30088-
30089- /* A preset ends here */
30090- if (Action == SK_PNMI_PRESET) {
30091-
30092- return (SK_PNMI_ERR_OK);
30093- }
30094-
30095- /* Write the new entry or modify an existing one */
30096- Ret = VpdWrite(pAC, IoC, KeyStr, Buf);
30097- if (Ret == SK_PNMI_VPD_NOWRITE ) {
30098-
30099- *pLen = 0;
30100- return (SK_PNMI_ERR_BAD_VALUE);
30101- }
30102- else if (Ret != SK_PNMI_VPD_OK) {
30103-
30104- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR025,
30105- SK_PNMI_ERR025MSG);
30106-
30107- *pLen = 0;
30108- return (SK_PNMI_ERR_GENERAL);
30109- }
30110-
30111- /*
30112- * Perform an update of the VPD data. This is
30113- * not mandantory, but just to be sure.
30114- */
30115- Ret = VpdUpdate(pAC, IoC);
30116- if (Ret != SK_PNMI_VPD_OK) {
30117-
30118- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR026,
30119- SK_PNMI_ERR026MSG);
30120-
30121- *pLen = 0;
30122- return (SK_PNMI_ERR_GENERAL);
30123- }
30124- break;
30125-
30126- case SK_PNMI_VPD_DELETE:
30127- /* Check if the buffer size is plausible */
30128- if (*pLen < 3) {
30129-
30130- *pLen = 3;
30131- return (SK_PNMI_ERR_TOO_SHORT);
30132- }
30133- if (*pLen > 3) {
30134-
30135- *pLen = 0;
30136- return (SK_PNMI_ERR_BAD_VALUE);
30137- }
30138- KeyStr[0] = pBuf[1];
30139- KeyStr[1] = pBuf[2];
30140- KeyStr[2] = 0;
30141-
30142- /* Find the passed key in the array */
30143- for (Index = 0; Index < KeyNo; Index ++) {
30144-
30145- if (SK_STRCMP(KeyStr, KeyArr[Index]) == 0) {
30146-
30147- break;
30148- }
30149- }
30150- /*
30151- * If we cannot find the key it is wrong, so we
30152- * return an appropriate error value.
30153- */
30154- if (Index == KeyNo) {
30155-
30156- *pLen = 0;
30157- return (SK_PNMI_ERR_BAD_VALUE);
30158- }
30159-
30160- if (Action == SK_PNMI_PRESET) {
30161-
30162- return (SK_PNMI_ERR_OK);
30163- }
30164-
30165- /* Ok, you wanted it and you will get it */
30166- Ret = VpdDelete(pAC, IoC, KeyStr);
30167- if (Ret != SK_PNMI_VPD_OK) {
30168-
30169- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR027,
30170- SK_PNMI_ERR027MSG);
30171-
30172- *pLen = 0;
30173- return (SK_PNMI_ERR_GENERAL);
30174- }
30175-
30176- /*
30177- * Perform an update of the VPD data. This is
30178- * not mandantory, but just to be sure.
30179- */
30180- Ret = VpdUpdate(pAC, IoC);
30181- if (Ret != SK_PNMI_VPD_OK) {
30182-
30183- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR028,
30184- SK_PNMI_ERR028MSG);
30185-
30186- *pLen = 0;
30187- return (SK_PNMI_ERR_GENERAL);
30188- }
30189- break;
30190-
30191- default:
30192- *pLen = 0;
30193- return (SK_PNMI_ERR_BAD_VALUE);
30194- }
30195- }
30196-
30197- return (SK_PNMI_ERR_OK);
30198-}
30199-
30200-/*****************************************************************************
30201- *
30202- * General - OID handler function of various single instance OIDs
30203- *
30204- * Description:
30205- * The code is simple. No description necessary.
30206- *
30207- * Returns:
30208- * SK_PNMI_ERR_OK The request was successfully performed.
30209- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
30210- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
30211- * the correct data (e.g. a 32bit value is
30212- * needed, but a 16 bit value was passed).
30213- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
30214- * exist (e.g. port instance 3 on a two port
30215- * adapter.
30216- */
30217-PNMI_STATIC int General(
30218-SK_AC *pAC, /* Pointer to adapter context */
30219-SK_IOC IoC, /* IO context handle */
30220-int Action, /* GET/PRESET/SET action */
30221-SK_U32 Id, /* Object ID that is to be processed */
30222-char *pBuf, /* Buffer used for the management data transfer */
30223-unsigned int *pLen, /* On call: buffer length. On return: used buffer */
30224-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
30225-unsigned int TableIndex, /* Index to the Id table */
30226-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
30227-{
30228- int Ret;
30229- unsigned int Index;
30230- unsigned int Len;
30231- unsigned int Offset;
30232- unsigned int Val;
30233- SK_U8 Val8;
30234- SK_U16 Val16;
30235- SK_U32 Val32;
30236- SK_U64 Val64;
30237- SK_U64 Val64RxHwErrs = 0;
30238- SK_U64 Val64TxHwErrs = 0;
30239- SK_BOOL Is64BitReq = SK_FALSE;
30240- char Buf[256];
30241- int MacType;
30242-
30243- /*
30244- * Check instance. We only handle single instance variables.
30245- */
30246- if (Instance != (SK_U32)(-1) && Instance != 1) {
30247-
30248- *pLen = 0;
30249- return (SK_PNMI_ERR_UNKNOWN_INST);
30250- }
30251-
30252- /*
30253- * Check action. We only allow get requests.
30254- */
30255- if (Action != SK_PNMI_GET) {
30256-
30257- *pLen = 0;
30258- return (SK_PNMI_ERR_READ_ONLY);
30259- }
30260-
30261- MacType = pAC->GIni.GIMacType;
30262-
30263- /*
30264- * Check length for the various supported OIDs
30265- */
30266- switch (Id) {
30267-
30268- case OID_GEN_XMIT_ERROR:
30269- case OID_GEN_RCV_ERROR:
30270- case OID_GEN_RCV_NO_BUFFER:
30271-#ifndef SK_NDIS_64BIT_CTR
30272- if (*pLen < sizeof(SK_U32)) {
30273- *pLen = sizeof(SK_U32);
30274- return (SK_PNMI_ERR_TOO_SHORT);
30275- }
30276-
30277-#else /* SK_NDIS_64BIT_CTR */
30278-
30279- /*
30280- * for compatibility, at least 32bit are required for oid
30281- */
30282- if (*pLen < sizeof(SK_U32)) {
30283- /*
30284- * but indicate handling for 64bit values,
30285- * if insufficient space is provided
30286- */
30287- *pLen = sizeof(SK_U64);
30288- return (SK_PNMI_ERR_TOO_SHORT);
30289- }
30290-
30291- Is64BitReq = (*pLen < sizeof(SK_U64)) ? SK_FALSE : SK_TRUE;
30292-#endif /* SK_NDIS_64BIT_CTR */
30293- break;
30294-
30295- case OID_SKGE_PORT_NUMBER:
30296- case OID_SKGE_DEVICE_TYPE:
30297- case OID_SKGE_RESULT:
30298- case OID_SKGE_RLMT_MONITOR_NUMBER:
30299- case OID_GEN_TRANSMIT_QUEUE_LENGTH:
30300- case OID_SKGE_TRAP_NUMBER:
30301- case OID_SKGE_MDB_VERSION:
30302- case OID_SKGE_BOARDLEVEL:
30303- case OID_SKGE_CHIPID:
30304- case OID_SKGE_RAMSIZE:
30305- if (*pLen < sizeof(SK_U32)) {
30306-
30307- *pLen = sizeof(SK_U32);
30308- return (SK_PNMI_ERR_TOO_SHORT);
30309- }
30310- break;
30311-
30312- case OID_SKGE_CHIPSET:
30313- if (*pLen < sizeof(SK_U16)) {
30314-
30315- *pLen = sizeof(SK_U16);
30316- return (SK_PNMI_ERR_TOO_SHORT);
30317- }
30318- break;
30319-
30320- case OID_SKGE_BUS_TYPE:
30321- case OID_SKGE_BUS_SPEED:
30322- case OID_SKGE_BUS_WIDTH:
30323- case OID_SKGE_SENSOR_NUMBER:
30324- case OID_SKGE_CHKSM_NUMBER:
30325- case OID_SKGE_VAUXAVAIL:
30326- if (*pLen < sizeof(SK_U8)) {
30327-
30328- *pLen = sizeof(SK_U8);
30329- return (SK_PNMI_ERR_TOO_SHORT);
30330- }
30331- break;
30332-
30333- case OID_SKGE_TX_SW_QUEUE_LEN:
30334- case OID_SKGE_TX_SW_QUEUE_MAX:
30335- case OID_SKGE_TX_RETRY:
30336- case OID_SKGE_RX_INTR_CTS:
30337- case OID_SKGE_TX_INTR_CTS:
30338- case OID_SKGE_RX_NO_BUF_CTS:
30339- case OID_SKGE_TX_NO_BUF_CTS:
30340- case OID_SKGE_TX_USED_DESCR_NO:
30341- case OID_SKGE_RX_DELIVERED_CTS:
30342- case OID_SKGE_RX_OCTETS_DELIV_CTS:
30343- case OID_SKGE_RX_HW_ERROR_CTS:
30344- case OID_SKGE_TX_HW_ERROR_CTS:
30345- case OID_SKGE_IN_ERRORS_CTS:
30346- case OID_SKGE_OUT_ERROR_CTS:
30347- case OID_SKGE_ERR_RECOVERY_CTS:
30348- case OID_SKGE_SYSUPTIME:
30349- if (*pLen < sizeof(SK_U64)) {
30350-
30351- *pLen = sizeof(SK_U64);
30352- return (SK_PNMI_ERR_TOO_SHORT);
30353- }
30354- break;
30355-
30356- default:
30357- /* Checked later */
30358- break;
30359- }
30360-
30361- /* Update statistic */
30362- if (Id == OID_SKGE_RX_HW_ERROR_CTS ||
30363- Id == OID_SKGE_TX_HW_ERROR_CTS ||
30364- Id == OID_SKGE_IN_ERRORS_CTS ||
30365- Id == OID_SKGE_OUT_ERROR_CTS ||
30366- Id == OID_GEN_XMIT_ERROR ||
30367- Id == OID_GEN_RCV_ERROR) {
30368-
30369- /* Force the XMAC to update its statistic counters and
30370- * Increment semaphore to indicate that an update was
30371- * already done.
30372- */
30373- Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);
30374- if (Ret != SK_PNMI_ERR_OK) {
30375-
30376- *pLen = 0;
30377- return (Ret);
30378- }
30379- pAC->Pnmi.MacUpdatedFlag ++;
30380-
30381- /*
30382- * Some OIDs consist of multiple hardware counters. Those
30383- * values which are contained in all of them will be added
30384- * now.
30385- */
30386- switch (Id) {
30387-
30388- case OID_SKGE_RX_HW_ERROR_CTS:
30389- case OID_SKGE_IN_ERRORS_CTS:
30390- case OID_GEN_RCV_ERROR:
30391- Val64RxHwErrs =
30392- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_MISSED, NetIndex) +
30393- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FRAMING, NetIndex) +
30394- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex) +
30395- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_JABBER, NetIndex) +
30396- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_CARRIER, NetIndex) +
30397- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_IRLENGTH, NetIndex) +
30398- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SYMBOL, NetIndex) +
30399- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SHORTS, NetIndex) +
30400- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_RUNT, NetIndex) +
30401- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_TOO_LONG, NetIndex) +
30402- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FCS, NetIndex) +
30403- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_CEXT, NetIndex);
30404- break;
30405-
30406- case OID_SKGE_TX_HW_ERROR_CTS:
30407- case OID_SKGE_OUT_ERROR_CTS:
30408- case OID_GEN_XMIT_ERROR:
30409- Val64TxHwErrs =
30410- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_EXCESS_COL, NetIndex) +
30411- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_LATE_COL, NetIndex) +
30412- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_UNDERRUN, NetIndex) +
30413- GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_CARRIER, NetIndex);
30414- break;
30415- }
30416- }
30417-
30418- /*
30419- * Retrieve value
30420- */
30421- switch (Id) {
30422-
30423- case OID_SKGE_SUPPORTED_LIST:
30424- Len = ID_TABLE_SIZE * sizeof(SK_U32);
30425- if (*pLen < Len) {
30426-
30427- *pLen = Len;
30428- return (SK_PNMI_ERR_TOO_SHORT);
30429- }
30430- for (Offset = 0, Index = 0; Offset < Len;
30431- Offset += sizeof(SK_U32), Index ++) {
30432-
30433- Val32 = (SK_U32)IdTable[Index].Id;
30434- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
30435- }
30436- *pLen = Len;
30437- break;
30438-
30439- case OID_SKGE_BOARDLEVEL:
30440- Val32 = (SK_U32)pAC->GIni.GILevel;
30441- SK_PNMI_STORE_U32(pBuf, Val32);
30442- *pLen = sizeof(SK_U32);
30443- break;
30444-
30445- case OID_SKGE_PORT_NUMBER:
30446- Val32 = (SK_U32)pAC->GIni.GIMacsFound;
30447- SK_PNMI_STORE_U32(pBuf, Val32);
30448- *pLen = sizeof(SK_U32);
30449- break;
30450-
30451- case OID_SKGE_DEVICE_TYPE:
30452- Val32 = (SK_U32)pAC->Pnmi.DeviceType;
30453- SK_PNMI_STORE_U32(pBuf, Val32);
30454- *pLen = sizeof(SK_U32);
30455- break;
30456-
30457- case OID_SKGE_DRIVER_DESCR:
30458- if (pAC->Pnmi.pDriverDescription == NULL) {
30459-
30460- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR007,
30461- SK_PNMI_ERR007MSG);
30462-
30463- *pLen = 0;
30464- return (SK_PNMI_ERR_GENERAL);
30465- }
30466-
30467- Len = SK_STRLEN(pAC->Pnmi.pDriverDescription) + 1;
30468- if (Len > SK_PNMI_STRINGLEN1) {
30469-
30470- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR029,
30471- SK_PNMI_ERR029MSG);
30472-
30473- *pLen = 0;
30474- return (SK_PNMI_ERR_GENERAL);
30475- }
30476-
30477- if (*pLen < Len) {
30478-
30479- *pLen = Len;
30480- return (SK_PNMI_ERR_TOO_SHORT);
30481- }
30482- *pBuf = (char)(Len - 1);
30483- SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverDescription, Len - 1);
30484- *pLen = Len;
30485- break;
30486-
30487- case OID_SKGE_DRIVER_VERSION:
30488- if (pAC->Pnmi.pDriverVersion == NULL) {
30489-
30490- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030,
30491- SK_PNMI_ERR030MSG);
30492-
30493- *pLen = 0;
30494- return (SK_PNMI_ERR_GENERAL);
30495- }
30496-
30497- Len = SK_STRLEN(pAC->Pnmi.pDriverVersion) + 1;
30498- if (Len > SK_PNMI_STRINGLEN1) {
30499-
30500- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031,
30501- SK_PNMI_ERR031MSG);
30502-
30503- *pLen = 0;
30504- return (SK_PNMI_ERR_GENERAL);
30505- }
30506-
30507- if (*pLen < Len) {
30508-
30509- *pLen = Len;
30510- return (SK_PNMI_ERR_TOO_SHORT);
30511- }
30512- *pBuf = (char)(Len - 1);
30513- SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverVersion, Len - 1);
30514- *pLen = Len;
30515- break;
30516-
30517- case OID_SKGE_DRIVER_RELDATE:
30518- if (pAC->Pnmi.pDriverReleaseDate == NULL) {
30519-
30520- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030,
30521- SK_PNMI_ERR053MSG);
30522-
30523- *pLen = 0;
30524- return (SK_PNMI_ERR_GENERAL);
30525- }
30526-
30527- Len = SK_STRLEN(pAC->Pnmi.pDriverReleaseDate) + 1;
30528- if (Len > SK_PNMI_STRINGLEN1) {
30529-
30530- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031,
30531- SK_PNMI_ERR054MSG);
30532-
30533- *pLen = 0;
30534- return (SK_PNMI_ERR_GENERAL);
30535- }
30536-
30537- if (*pLen < Len) {
30538-
30539- *pLen = Len;
30540- return (SK_PNMI_ERR_TOO_SHORT);
30541- }
30542- *pBuf = (char)(Len - 1);
30543- SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverReleaseDate, Len - 1);
30544- *pLen = Len;
30545- break;
30546-
30547- case OID_SKGE_DRIVER_FILENAME:
30548- if (pAC->Pnmi.pDriverFileName == NULL) {
30549-
30550- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030,
30551- SK_PNMI_ERR055MSG);
30552-
30553- *pLen = 0;
30554- return (SK_PNMI_ERR_GENERAL);
30555- }
30556-
30557- Len = SK_STRLEN(pAC->Pnmi.pDriverFileName) + 1;
30558- if (Len > SK_PNMI_STRINGLEN1) {
30559-
30560- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031,
30561- SK_PNMI_ERR056MSG);
30562-
30563- *pLen = 0;
30564- return (SK_PNMI_ERR_GENERAL);
30565- }
30566-
30567- if (*pLen < Len) {
30568-
30569- *pLen = Len;
30570- return (SK_PNMI_ERR_TOO_SHORT);
30571- }
30572- *pBuf = (char)(Len - 1);
30573- SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverFileName, Len - 1);
30574- *pLen = Len;
30575- break;
30576-
30577- case OID_SKGE_HW_DESCR:
30578- /*
30579- * The hardware description is located in the VPD. This
30580- * query may move to the initialisation routine. But
30581- * the VPD data is cached and therefore a call here
30582- * will not make much difference.
30583- */
30584- Len = 256;
30585- if (VpdRead(pAC, IoC, VPD_NAME, Buf, (int *)&Len) > 0) {
30586-
30587- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR032,
30588- SK_PNMI_ERR032MSG);
30589-
30590- *pLen = 0;
30591- return (SK_PNMI_ERR_GENERAL);
30592- }
30593- Len ++;
30594- if (Len > SK_PNMI_STRINGLEN1) {
30595-
30596- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR033,
30597- SK_PNMI_ERR033MSG);
30598-
30599- *pLen = 0;
30600- return (SK_PNMI_ERR_GENERAL);
30601- }
30602- if (*pLen < Len) {
30603-
30604- *pLen = Len;
30605- return (SK_PNMI_ERR_TOO_SHORT);
30606- }
30607- *pBuf = (char)(Len - 1);
30608- SK_MEMCPY(pBuf + 1, Buf, Len - 1);
30609- *pLen = Len;
30610- break;
30611-
30612- case OID_SKGE_HW_VERSION:
30613- /* Oh, I love to do some string manipulation */
30614- if (*pLen < 5) {
30615-
30616- *pLen = 5;
30617- return (SK_PNMI_ERR_TOO_SHORT);
30618- }
30619- Val8 = (SK_U8)pAC->GIni.GIPciHwRev;
30620- pBuf[0] = 4;
30621- pBuf[1] = 'v';
30622- pBuf[2] = (char)(0x30 | ((Val8 >> 4) & 0x0F));
30623- pBuf[3] = '.';
30624- pBuf[4] = (char)(0x30 | (Val8 & 0x0F));
30625- *pLen = 5;
30626- break;
30627-
30628- case OID_SKGE_CHIPSET:
30629- Val16 = pAC->Pnmi.Chipset;
30630- SK_PNMI_STORE_U16(pBuf, Val16);
30631- *pLen = sizeof(SK_U16);
30632- break;
30633-
30634- case OID_SKGE_CHIPID:
30635- Val32 = pAC->GIni.GIChipId;
30636- SK_PNMI_STORE_U32(pBuf, Val32);
30637- *pLen = sizeof(SK_U32);
30638- break;
30639-
30640- case OID_SKGE_RAMSIZE:
30641- Val32 = pAC->GIni.GIRamSize;
30642- SK_PNMI_STORE_U32(pBuf, Val32);
30643- *pLen = sizeof(SK_U32);
30644- break;
30645-
30646- case OID_SKGE_VAUXAVAIL:
30647- *pBuf = (char) pAC->GIni.GIVauxAvail;
30648- *pLen = sizeof(char);
30649- break;
30650-
30651- case OID_SKGE_BUS_TYPE:
30652- *pBuf = (char) SK_PNMI_BUS_PCI;
30653- *pLen = sizeof(char);
30654- break;
30655-
30656- case OID_SKGE_BUS_SPEED:
30657- *pBuf = pAC->Pnmi.PciBusSpeed;
30658- *pLen = sizeof(char);
30659- break;
30660-
30661- case OID_SKGE_BUS_WIDTH:
30662- *pBuf = pAC->Pnmi.PciBusWidth;
30663- *pLen = sizeof(char);
30664- break;
30665-
30666- case OID_SKGE_RESULT:
30667- Val32 = pAC->Pnmi.TestResult;
30668- SK_PNMI_STORE_U32(pBuf, Val32);
30669- *pLen = sizeof(SK_U32);
30670- break;
30671-
30672- case OID_SKGE_SENSOR_NUMBER:
30673- *pBuf = (char)pAC->I2c.MaxSens;
30674- *pLen = sizeof(char);
30675- break;
30676-
30677- case OID_SKGE_CHKSM_NUMBER:
30678- *pBuf = SKCS_NUM_PROTOCOLS;
30679- *pLen = sizeof(char);
30680- break;
30681-
30682- case OID_SKGE_TRAP_NUMBER:
30683- GetTrapQueueLen(pAC, &Len, &Val);
30684- Val32 = (SK_U32)Val;
30685- SK_PNMI_STORE_U32(pBuf, Val32);
30686- *pLen = sizeof(SK_U32);
30687- break;
30688-
30689- case OID_SKGE_TRAP:
30690- GetTrapQueueLen(pAC, &Len, &Val);
30691- if (*pLen < Len) {
30692-
30693- *pLen = Len;
30694- return (SK_PNMI_ERR_TOO_SHORT);
30695- }
30696- CopyTrapQueue(pAC, pBuf);
30697- *pLen = Len;
30698- break;
30699-
30700- case OID_SKGE_RLMT_MONITOR_NUMBER:
30701-/* XXX Not yet implemented by RLMT therefore we return zero elements */
30702- Val32 = 0;
30703- SK_PNMI_STORE_U32(pBuf, Val32);
30704- *pLen = sizeof(SK_U32);
30705- break;
30706-
30707- case OID_SKGE_TX_SW_QUEUE_LEN:
30708- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30709- if (MacType == SK_MAC_XMAC) {
30710- /* Dual net mode */
30711- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30712- Val64 = pAC->Pnmi.BufPort[NetIndex].TxSwQueueLen;
30713- }
30714- /* Single net mode */
30715- else {
30716- Val64 = pAC->Pnmi.BufPort[0].TxSwQueueLen +
30717- pAC->Pnmi.BufPort[1].TxSwQueueLen;
30718- }
30719- }
30720- else {
30721- /* Dual net mode */
30722- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30723- Val64 = pAC->Pnmi.Port[NetIndex].TxSwQueueLen;
30724- }
30725- /* Single net mode */
30726- else {
30727- Val64 = pAC->Pnmi.Port[0].TxSwQueueLen +
30728- pAC->Pnmi.Port[1].TxSwQueueLen;
30729- }
30730- }
30731- SK_PNMI_STORE_U64(pBuf, Val64);
30732- *pLen = sizeof(SK_U64);
30733- break;
30734-
30735-
30736- case OID_SKGE_TX_SW_QUEUE_MAX:
30737- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30738- if (MacType == SK_MAC_XMAC) {
30739- /* Dual net mode */
30740- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30741- Val64 = pAC->Pnmi.BufPort[NetIndex].TxSwQueueMax;
30742- }
30743- /* Single net mode */
30744- else {
30745- Val64 = pAC->Pnmi.BufPort[0].TxSwQueueMax +
30746- pAC->Pnmi.BufPort[1].TxSwQueueMax;
30747- }
30748- }
30749- else {
30750- /* Dual net mode */
30751- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30752- Val64 = pAC->Pnmi.Port[NetIndex].TxSwQueueMax;
30753- }
30754- /* Single net mode */
30755- else {
30756- Val64 = pAC->Pnmi.Port[0].TxSwQueueMax +
30757- pAC->Pnmi.Port[1].TxSwQueueMax;
30758- }
30759- }
30760- SK_PNMI_STORE_U64(pBuf, Val64);
30761- *pLen = sizeof(SK_U64);
30762- break;
30763-
30764- case OID_SKGE_TX_RETRY:
30765- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30766- if (MacType == SK_MAC_XMAC) {
30767- /* Dual net mode */
30768- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30769- Val64 = pAC->Pnmi.BufPort[NetIndex].TxRetryCts;
30770- }
30771- /* Single net mode */
30772- else {
30773- Val64 = pAC->Pnmi.BufPort[0].TxRetryCts +
30774- pAC->Pnmi.BufPort[1].TxRetryCts;
30775- }
30776- }
30777- else {
30778- /* Dual net mode */
30779- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30780- Val64 = pAC->Pnmi.Port[NetIndex].TxRetryCts;
30781- }
30782- /* Single net mode */
30783- else {
30784- Val64 = pAC->Pnmi.Port[0].TxRetryCts +
30785- pAC->Pnmi.Port[1].TxRetryCts;
30786- }
30787- }
30788- SK_PNMI_STORE_U64(pBuf, Val64);
30789- *pLen = sizeof(SK_U64);
30790- break;
30791-
30792- case OID_SKGE_RX_INTR_CTS:
30793- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30794- if (MacType == SK_MAC_XMAC) {
30795- /* Dual net mode */
30796- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30797- Val64 = pAC->Pnmi.BufPort[NetIndex].RxIntrCts;
30798- }
30799- /* Single net mode */
30800- else {
30801- Val64 = pAC->Pnmi.BufPort[0].RxIntrCts +
30802- pAC->Pnmi.BufPort[1].RxIntrCts;
30803- }
30804- }
30805- else {
30806- /* Dual net mode */
30807- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30808- Val64 = pAC->Pnmi.Port[NetIndex].RxIntrCts;
30809- }
30810- /* Single net mode */
30811- else {
30812- Val64 = pAC->Pnmi.Port[0].RxIntrCts +
30813- pAC->Pnmi.Port[1].RxIntrCts;
30814- }
30815- }
30816- SK_PNMI_STORE_U64(pBuf, Val64);
30817- *pLen = sizeof(SK_U64);
30818- break;
30819-
30820- case OID_SKGE_TX_INTR_CTS:
30821- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30822- if (MacType == SK_MAC_XMAC) {
30823- /* Dual net mode */
30824- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30825- Val64 = pAC->Pnmi.BufPort[NetIndex].TxIntrCts;
30826- }
30827- /* Single net mode */
30828- else {
30829- Val64 = pAC->Pnmi.BufPort[0].TxIntrCts +
30830- pAC->Pnmi.BufPort[1].TxIntrCts;
30831- }
30832- }
30833- else {
30834- /* Dual net mode */
30835- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30836- Val64 = pAC->Pnmi.Port[NetIndex].TxIntrCts;
30837- }
30838- /* Single net mode */
30839- else {
30840- Val64 = pAC->Pnmi.Port[0].TxIntrCts +
30841- pAC->Pnmi.Port[1].TxIntrCts;
30842- }
30843- }
30844- SK_PNMI_STORE_U64(pBuf, Val64);
30845- *pLen = sizeof(SK_U64);
30846- break;
30847-
30848- case OID_SKGE_RX_NO_BUF_CTS:
30849- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30850- if (MacType == SK_MAC_XMAC) {
30851- /* Dual net mode */
30852- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30853- Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts;
30854- }
30855- /* Single net mode */
30856- else {
30857- Val64 = pAC->Pnmi.BufPort[0].RxNoBufCts +
30858- pAC->Pnmi.BufPort[1].RxNoBufCts;
30859- }
30860- }
30861- else {
30862- /* Dual net mode */
30863- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30864- Val64 = pAC->Pnmi.Port[NetIndex].RxNoBufCts;
30865- }
30866- /* Single net mode */
30867- else {
30868- Val64 = pAC->Pnmi.Port[0].RxNoBufCts +
30869- pAC->Pnmi.Port[1].RxNoBufCts;
30870- }
30871- }
30872- SK_PNMI_STORE_U64(pBuf, Val64);
30873- *pLen = sizeof(SK_U64);
30874- break;
30875-
30876- case OID_SKGE_TX_NO_BUF_CTS:
30877- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30878- if (MacType == SK_MAC_XMAC) {
30879- /* Dual net mode */
30880- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30881- Val64 = pAC->Pnmi.BufPort[NetIndex].TxNoBufCts;
30882- }
30883- /* Single net mode */
30884- else {
30885- Val64 = pAC->Pnmi.BufPort[0].TxNoBufCts +
30886- pAC->Pnmi.BufPort[1].TxNoBufCts;
30887- }
30888- }
30889- else {
30890- /* Dual net mode */
30891- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30892- Val64 = pAC->Pnmi.Port[NetIndex].TxNoBufCts;
30893- }
30894- /* Single net mode */
30895- else {
30896- Val64 = pAC->Pnmi.Port[0].TxNoBufCts +
30897- pAC->Pnmi.Port[1].TxNoBufCts;
30898- }
30899- }
30900- SK_PNMI_STORE_U64(pBuf, Val64);
30901- *pLen = sizeof(SK_U64);
30902- break;
30903-
30904- case OID_SKGE_TX_USED_DESCR_NO:
30905- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30906- if (MacType == SK_MAC_XMAC) {
30907- /* Dual net mode */
30908- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30909- Val64 = pAC->Pnmi.BufPort[NetIndex].TxUsedDescrNo;
30910- }
30911- /* Single net mode */
30912- else {
30913- Val64 = pAC->Pnmi.BufPort[0].TxUsedDescrNo +
30914- pAC->Pnmi.BufPort[1].TxUsedDescrNo;
30915- }
30916- }
30917- else {
30918- /* Dual net mode */
30919- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30920- Val64 = pAC->Pnmi.Port[NetIndex].TxUsedDescrNo;
30921- }
30922- /* Single net mode */
30923- else {
30924- Val64 = pAC->Pnmi.Port[0].TxUsedDescrNo +
30925- pAC->Pnmi.Port[1].TxUsedDescrNo;
30926- }
30927- }
30928- SK_PNMI_STORE_U64(pBuf, Val64);
30929- *pLen = sizeof(SK_U64);
30930- break;
30931-
30932- case OID_SKGE_RX_DELIVERED_CTS:
30933- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30934- if (MacType == SK_MAC_XMAC) {
30935- /* Dual net mode */
30936- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30937- Val64 = pAC->Pnmi.BufPort[NetIndex].RxDeliveredCts;
30938- }
30939- /* Single net mode */
30940- else {
30941- Val64 = pAC->Pnmi.BufPort[0].RxDeliveredCts +
30942- pAC->Pnmi.BufPort[1].RxDeliveredCts;
30943- }
30944- }
30945- else {
30946- /* Dual net mode */
30947- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30948- Val64 = pAC->Pnmi.Port[NetIndex].RxDeliveredCts;
30949- }
30950- /* Single net mode */
30951- else {
30952- Val64 = pAC->Pnmi.Port[0].RxDeliveredCts +
30953- pAC->Pnmi.Port[1].RxDeliveredCts;
30954- }
30955- }
30956- SK_PNMI_STORE_U64(pBuf, Val64);
30957- *pLen = sizeof(SK_U64);
30958- break;
30959-
30960- case OID_SKGE_RX_OCTETS_DELIV_CTS:
30961- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
30962- if (MacType == SK_MAC_XMAC) {
30963- /* Dual net mode */
30964- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30965- Val64 = pAC->Pnmi.BufPort[NetIndex].RxOctetsDeliveredCts;
30966- }
30967- /* Single net mode */
30968- else {
30969- Val64 = pAC->Pnmi.BufPort[0].RxOctetsDeliveredCts +
30970- pAC->Pnmi.BufPort[1].RxOctetsDeliveredCts;
30971- }
30972- }
30973- else {
30974- /* Dual net mode */
30975- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
30976- Val64 = pAC->Pnmi.Port[NetIndex].RxOctetsDeliveredCts;
30977- }
30978- /* Single net mode */
30979- else {
30980- Val64 = pAC->Pnmi.Port[0].RxOctetsDeliveredCts +
30981- pAC->Pnmi.Port[1].RxOctetsDeliveredCts;
30982- }
30983- }
30984- SK_PNMI_STORE_U64(pBuf, Val64);
30985- *pLen = sizeof(SK_U64);
30986- break;
30987-
30988- case OID_SKGE_RX_HW_ERROR_CTS:
30989- SK_PNMI_STORE_U64(pBuf, Val64RxHwErrs);
30990- *pLen = sizeof(SK_U64);
30991- break;
30992-
30993- case OID_SKGE_TX_HW_ERROR_CTS:
30994- SK_PNMI_STORE_U64(pBuf, Val64TxHwErrs);
30995- *pLen = sizeof(SK_U64);
30996- break;
30997-
30998- case OID_SKGE_IN_ERRORS_CTS:
30999- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
31000- if (MacType == SK_MAC_XMAC) {
31001- /* Dual net mode */
31002- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31003- Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[NetIndex].RxNoBufCts;
31004- }
31005- /* Single net mode */
31006- else {
31007- Val64 = Val64RxHwErrs +
31008- pAC->Pnmi.BufPort[0].RxNoBufCts +
31009- pAC->Pnmi.BufPort[1].RxNoBufCts;
31010- }
31011- }
31012- else {
31013- /* Dual net mode */
31014- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31015- Val64 = Val64RxHwErrs + pAC->Pnmi.Port[NetIndex].RxNoBufCts;
31016- }
31017- /* Single net mode */
31018- else {
31019- Val64 = Val64RxHwErrs +
31020- pAC->Pnmi.Port[0].RxNoBufCts +
31021- pAC->Pnmi.Port[1].RxNoBufCts;
31022- }
31023- }
31024- SK_PNMI_STORE_U64(pBuf, Val64);
31025- *pLen = sizeof(SK_U64);
31026- break;
31027-
31028- case OID_SKGE_OUT_ERROR_CTS:
31029- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
31030- if (MacType == SK_MAC_XMAC) {
31031- /* Dual net mode */
31032- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31033- Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[NetIndex].TxNoBufCts;
31034- }
31035- /* Single net mode */
31036- else {
31037- Val64 = Val64TxHwErrs +
31038- pAC->Pnmi.BufPort[0].TxNoBufCts +
31039- pAC->Pnmi.BufPort[1].TxNoBufCts;
31040- }
31041- }
31042- else {
31043- /* Dual net mode */
31044- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31045- Val64 = Val64TxHwErrs + pAC->Pnmi.Port[NetIndex].TxNoBufCts;
31046- }
31047- /* Single net mode */
31048- else {
31049- Val64 = Val64TxHwErrs +
31050- pAC->Pnmi.Port[0].TxNoBufCts +
31051- pAC->Pnmi.Port[1].TxNoBufCts;
31052- }
31053- }
31054- SK_PNMI_STORE_U64(pBuf, Val64);
31055- *pLen = sizeof(SK_U64);
31056- break;
31057-
31058- case OID_SKGE_ERR_RECOVERY_CTS:
31059- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
31060- if (MacType == SK_MAC_XMAC) {
31061- /* Dual net mode */
31062- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31063- Val64 = pAC->Pnmi.BufPort[NetIndex].ErrRecoveryCts;
31064- }
31065- /* Single net mode */
31066- else {
31067- Val64 = pAC->Pnmi.BufPort[0].ErrRecoveryCts +
31068- pAC->Pnmi.BufPort[1].ErrRecoveryCts;
31069- }
31070- }
31071- else {
31072- /* Dual net mode */
31073- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31074- Val64 = pAC->Pnmi.Port[NetIndex].ErrRecoveryCts;
31075- }
31076- /* Single net mode */
31077- else {
31078- Val64 = pAC->Pnmi.Port[0].ErrRecoveryCts +
31079- pAC->Pnmi.Port[1].ErrRecoveryCts;
31080- }
31081- }
31082- SK_PNMI_STORE_U64(pBuf, Val64);
31083- *pLen = sizeof(SK_U64);
31084- break;
31085-
31086- case OID_SKGE_SYSUPTIME:
31087- Val64 = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));
31088- Val64 -= pAC->Pnmi.StartUpTime;
31089- SK_PNMI_STORE_U64(pBuf, Val64);
31090- *pLen = sizeof(SK_U64);
31091- break;
31092-
31093- case OID_SKGE_MDB_VERSION:
31094- Val32 = SK_PNMI_MDB_VERSION;
31095- SK_PNMI_STORE_U32(pBuf, Val32);
31096- *pLen = sizeof(SK_U32);
31097- break;
31098-
31099- case OID_GEN_RCV_ERROR:
31100- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
31101- if (MacType == SK_MAC_XMAC) {
31102- Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[NetIndex].RxNoBufCts;
31103- }
31104- else {
31105- Val64 = Val64RxHwErrs + pAC->Pnmi.Port[NetIndex].RxNoBufCts;
31106- }
31107-
31108- /*
31109- * by default 32bit values are evaluated
31110- */
31111- if (!Is64BitReq) {
31112- Val32 = (SK_U32)Val64;
31113- SK_PNMI_STORE_U32(pBuf, Val32);
31114- *pLen = sizeof(SK_U32);
31115- }
31116- else {
31117- SK_PNMI_STORE_U64(pBuf, Val64);
31118- *pLen = sizeof(SK_U64);
31119- }
31120- break;
31121-
31122- case OID_GEN_XMIT_ERROR:
31123- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
31124- if (MacType == SK_MAC_XMAC) {
31125- Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[NetIndex].TxNoBufCts;
31126- }
31127- else {
31128- Val64 = Val64TxHwErrs + pAC->Pnmi.Port[NetIndex].TxNoBufCts;
31129- }
31130-
31131- /*
31132- * by default 32bit values are evaluated
31133- */
31134- if (!Is64BitReq) {
31135- Val32 = (SK_U32)Val64;
31136- SK_PNMI_STORE_U32(pBuf, Val32);
31137- *pLen = sizeof(SK_U32);
31138- }
31139- else {
31140- SK_PNMI_STORE_U64(pBuf, Val64);
31141- *pLen = sizeof(SK_U64);
31142- }
31143- break;
31144-
31145- case OID_GEN_RCV_NO_BUFFER:
31146- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
31147- if (MacType == SK_MAC_XMAC) {
31148- Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts;
31149- }
31150- else {
31151- Val64 = pAC->Pnmi.Port[NetIndex].RxNoBufCts;
31152- }
31153-
31154- /*
31155- * by default 32bit values are evaluated
31156- */
31157- if (!Is64BitReq) {
31158- Val32 = (SK_U32)Val64;
31159- SK_PNMI_STORE_U32(pBuf, Val32);
31160- *pLen = sizeof(SK_U32);
31161- }
31162- else {
31163- SK_PNMI_STORE_U64(pBuf, Val64);
31164- *pLen = sizeof(SK_U64);
31165- }
31166- break;
31167-
31168- case OID_GEN_TRANSMIT_QUEUE_LENGTH:
31169- Val32 = (SK_U32)pAC->Pnmi.Port[NetIndex].TxSwQueueLen;
31170- SK_PNMI_STORE_U32(pBuf, Val32);
31171- *pLen = sizeof(SK_U32);
31172- break;
31173-
31174- default:
31175- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR034,
31176- SK_PNMI_ERR034MSG);
31177-
31178- *pLen = 0;
31179- return (SK_PNMI_ERR_GENERAL);
31180- }
31181-
31182- if (Id == OID_SKGE_RX_HW_ERROR_CTS ||
31183- Id == OID_SKGE_TX_HW_ERROR_CTS ||
31184- Id == OID_SKGE_IN_ERRORS_CTS ||
31185- Id == OID_SKGE_OUT_ERROR_CTS ||
31186- Id == OID_GEN_XMIT_ERROR ||
31187- Id == OID_GEN_RCV_ERROR) {
31188-
31189- pAC->Pnmi.MacUpdatedFlag --;
31190- }
31191-
31192- return (SK_PNMI_ERR_OK);
31193-}
31194-
31195-/*****************************************************************************
31196- *
31197- * Rlmt - OID handler function of OID_SKGE_RLMT_XXX single instance.
31198- *
31199- * Description:
31200- * Get/Presets/Sets the RLMT OIDs.
31201- *
31202- * Returns:
31203- * SK_PNMI_ERR_OK The request was successfully performed.
31204- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
31205- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
31206- * the correct data (e.g. a 32bit value is
31207- * needed, but a 16 bit value was passed).
31208- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
31209- * value range.
31210- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
31211- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
31212- * exist (e.g. port instance 3 on a two port
31213- * adapter.
31214- */
31215-PNMI_STATIC int Rlmt(
31216-SK_AC *pAC, /* Pointer to adapter context */
31217-SK_IOC IoC, /* IO context handle */
31218-int Action, /* GET/PRESET/SET action */
31219-SK_U32 Id, /* Object ID that is to be processed */
31220-char *pBuf, /* Buffer used for the management data transfer */
31221-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
31222-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
31223-unsigned int TableIndex, /* Index to the Id table */
31224-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
31225-{
31226- int Ret;
31227- unsigned int PhysPortIndex;
31228- unsigned int PhysPortMax;
31229- SK_EVPARA EventParam;
31230- SK_U32 Val32;
31231- SK_U64 Val64;
31232-
31233-
31234- /*
31235- * Check instance. Only single instance OIDs are allowed here.
31236- */
31237- if (Instance != (SK_U32)(-1) && Instance != 1) {
31238-
31239- *pLen = 0;
31240- return (SK_PNMI_ERR_UNKNOWN_INST);
31241- }
31242-
31243- /*
31244- * Perform the requested action.
31245- */
31246- if (Action == SK_PNMI_GET) {
31247-
31248- /*
31249- * Check if the buffer length is large enough.
31250- */
31251-
31252- switch (Id) {
31253-
31254- case OID_SKGE_RLMT_MODE:
31255- case OID_SKGE_RLMT_PORT_ACTIVE:
31256- case OID_SKGE_RLMT_PORT_PREFERRED:
31257- if (*pLen < sizeof(SK_U8)) {
31258-
31259- *pLen = sizeof(SK_U8);
31260- return (SK_PNMI_ERR_TOO_SHORT);
31261- }
31262- break;
31263-
31264- case OID_SKGE_RLMT_PORT_NUMBER:
31265- if (*pLen < sizeof(SK_U32)) {
31266-
31267- *pLen = sizeof(SK_U32);
31268- return (SK_PNMI_ERR_TOO_SHORT);
31269- }
31270- break;
31271-
31272- case OID_SKGE_RLMT_CHANGE_CTS:
31273- case OID_SKGE_RLMT_CHANGE_TIME:
31274- case OID_SKGE_RLMT_CHANGE_ESTIM:
31275- case OID_SKGE_RLMT_CHANGE_THRES:
31276- if (*pLen < sizeof(SK_U64)) {
31277-
31278- *pLen = sizeof(SK_U64);
31279- return (SK_PNMI_ERR_TOO_SHORT);
31280- }
31281- break;
31282-
31283- default:
31284- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR035,
31285- SK_PNMI_ERR035MSG);
31286-
31287- *pLen = 0;
31288- return (SK_PNMI_ERR_GENERAL);
31289- }
31290-
31291- /*
31292- * Update RLMT statistic and increment semaphores to indicate
31293- * that an update was already done. Maybe RLMT will hold its
31294- * statistic always up to date some time. Then we can
31295- * remove this type of call.
31296- */
31297- if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {
31298-
31299- *pLen = 0;
31300- return (Ret);
31301- }
31302- pAC->Pnmi.RlmtUpdatedFlag ++;
31303-
31304- /*
31305- * Retrieve Value
31306- */
31307- switch (Id) {
31308-
31309- case OID_SKGE_RLMT_MODE:
31310- *pBuf = (char)pAC->Rlmt.Net[0].RlmtMode;
31311- *pLen = sizeof(char);
31312- break;
31313-
31314- case OID_SKGE_RLMT_PORT_NUMBER:
31315- Val32 = (SK_U32)pAC->GIni.GIMacsFound;
31316- SK_PNMI_STORE_U32(pBuf, Val32);
31317- *pLen = sizeof(SK_U32);
31318- break;
31319-
31320- case OID_SKGE_RLMT_PORT_ACTIVE:
31321- *pBuf = 0;
31322- /*
31323- * If multiple ports may become active this OID
31324- * doesn't make sense any more. A new variable in
31325- * the port structure should be created. However,
31326- * for this variable the first active port is
31327- * returned.
31328- */
31329- PhysPortMax = pAC->GIni.GIMacsFound;
31330-
31331- for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;
31332- PhysPortIndex ++) {
31333-
31334- if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
31335-
31336- *pBuf = (char)SK_PNMI_PORT_PHYS2LOG(PhysPortIndex);
31337- break;
31338- }
31339- }
31340- *pLen = sizeof(char);
31341- break;
31342-
31343- case OID_SKGE_RLMT_PORT_PREFERRED:
31344- *pBuf = (char)SK_PNMI_PORT_PHYS2LOG(pAC->Rlmt.Net[NetIndex].Preference);
31345- *pLen = sizeof(char);
31346- break;
31347-
31348- case OID_SKGE_RLMT_CHANGE_CTS:
31349- Val64 = pAC->Pnmi.RlmtChangeCts;
31350- SK_PNMI_STORE_U64(pBuf, Val64);
31351- *pLen = sizeof(SK_U64);
31352- break;
31353-
31354- case OID_SKGE_RLMT_CHANGE_TIME:
31355- Val64 = pAC->Pnmi.RlmtChangeTime;
31356- SK_PNMI_STORE_U64(pBuf, Val64);
31357- *pLen = sizeof(SK_U64);
31358- break;
31359-
31360- case OID_SKGE_RLMT_CHANGE_ESTIM:
31361- Val64 = pAC->Pnmi.RlmtChangeEstimate.Estimate;
31362- SK_PNMI_STORE_U64(pBuf, Val64);
31363- *pLen = sizeof(SK_U64);
31364- break;
31365-
31366- case OID_SKGE_RLMT_CHANGE_THRES:
31367- Val64 = pAC->Pnmi.RlmtChangeThreshold;
31368- SK_PNMI_STORE_U64(pBuf, Val64);
31369- *pLen = sizeof(SK_U64);
31370- break;
31371-
31372- default:
31373- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,
31374- ("Rlmt: Unknown OID should be handled before"));
31375-
31376- pAC->Pnmi.RlmtUpdatedFlag --;
31377- *pLen = 0;
31378- return (SK_PNMI_ERR_GENERAL);
31379- }
31380-
31381- pAC->Pnmi.RlmtUpdatedFlag --;
31382- }
31383- else {
31384- /* Perform a preset or set */
31385- switch (Id) {
31386-
31387- case OID_SKGE_RLMT_MODE:
31388- /* Check if the buffer length is plausible */
31389- if (*pLen < sizeof(char)) {
31390-
31391- *pLen = sizeof(char);
31392- return (SK_PNMI_ERR_TOO_SHORT);
31393- }
31394- /* Check if the value range is correct */
31395- if (*pLen != sizeof(char) ||
31396- (*pBuf & SK_PNMI_RLMT_MODE_CHK_LINK) == 0 ||
31397- *(SK_U8 *)pBuf > 15) {
31398-
31399- *pLen = 0;
31400- return (SK_PNMI_ERR_BAD_VALUE);
31401- }
31402- /* The preset ends here */
31403- if (Action == SK_PNMI_PRESET) {
31404-
31405- *pLen = 0;
31406- return (SK_PNMI_ERR_OK);
31407- }
31408- /* Send an event to RLMT to change the mode */
31409- SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
31410- EventParam.Para32[0] |= (SK_U32)(*pBuf);
31411- EventParam.Para32[1] = 0;
31412- if (SkRlmtEvent(pAC, IoC, SK_RLMT_MODE_CHANGE,
31413- EventParam) > 0) {
31414-
31415- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR037,
31416- SK_PNMI_ERR037MSG);
31417-
31418- *pLen = 0;
31419- return (SK_PNMI_ERR_GENERAL);
31420- }
31421- break;
31422-
31423- case OID_SKGE_RLMT_PORT_PREFERRED:
31424- /* Check if the buffer length is plausible */
31425- if (*pLen < sizeof(char)) {
31426-
31427- *pLen = sizeof(char);
31428- return (SK_PNMI_ERR_TOO_SHORT);
31429- }
31430- /* Check if the value range is correct */
31431- if (*pLen != sizeof(char) || *(SK_U8 *)pBuf >
31432- (SK_U8)pAC->GIni.GIMacsFound) {
31433-
31434- *pLen = 0;
31435- return (SK_PNMI_ERR_BAD_VALUE);
31436- }
31437- /* The preset ends here */
31438- if (Action == SK_PNMI_PRESET) {
31439-
31440- *pLen = 0;
31441- return (SK_PNMI_ERR_OK);
31442- }
31443-
31444- /*
31445- * Send an event to RLMT change the preferred port.
31446- * A param of -1 means automatic mode. RLMT will
31447- * make the decision which is the preferred port.
31448- */
31449- SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
31450- EventParam.Para32[0] = (SK_U32)(*pBuf) - 1;
31451- EventParam.Para32[1] = NetIndex;
31452- if (SkRlmtEvent(pAC, IoC, SK_RLMT_PREFPORT_CHANGE,
31453- EventParam) > 0) {
31454-
31455- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR038,
31456- SK_PNMI_ERR038MSG);
31457-
31458- *pLen = 0;
31459- return (SK_PNMI_ERR_GENERAL);
31460- }
31461- break;
31462-
31463- case OID_SKGE_RLMT_CHANGE_THRES:
31464- /* Check if the buffer length is plausible */
31465- if (*pLen < sizeof(SK_U64)) {
31466-
31467- *pLen = sizeof(SK_U64);
31468- return (SK_PNMI_ERR_TOO_SHORT);
31469- }
31470- /*
31471- * There are not many restrictions to the
31472- * value range.
31473- */
31474- if (*pLen != sizeof(SK_U64)) {
31475-
31476- *pLen = 0;
31477- return (SK_PNMI_ERR_BAD_VALUE);
31478- }
31479- /* A preset ends here */
31480- if (Action == SK_PNMI_PRESET) {
31481-
31482- *pLen = 0;
31483- return (SK_PNMI_ERR_OK);
31484- }
31485- /*
31486- * Store the new threshold, which will be taken
31487- * on the next timer event.
31488- */
31489- SK_PNMI_READ_U64(pBuf, Val64);
31490- pAC->Pnmi.RlmtChangeThreshold = Val64;
31491- break;
31492-
31493- default:
31494- /* The other OIDs are not be able for set */
31495- *pLen = 0;
31496- return (SK_PNMI_ERR_READ_ONLY);
31497- }
31498- }
31499-
31500- return (SK_PNMI_ERR_OK);
31501-}
31502-
31503-/*****************************************************************************
31504- *
31505- * RlmtStat - OID handler function of OID_SKGE_RLMT_XXX multiple instance.
31506- *
31507- * Description:
31508- * Performs get requests on multiple instance variables.
31509- *
31510- * Returns:
31511- * SK_PNMI_ERR_OK The request was successfully performed.
31512- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
31513- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
31514- * the correct data (e.g. a 32bit value is
31515- * needed, but a 16 bit value was passed).
31516- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
31517- * exist (e.g. port instance 3 on a two port
31518- * adapter.
31519- */
31520-PNMI_STATIC int RlmtStat(
31521-SK_AC *pAC, /* Pointer to adapter context */
31522-SK_IOC IoC, /* IO context handle */
31523-int Action, /* GET/PRESET/SET action */
31524-SK_U32 Id, /* Object ID that is to be processed */
31525-char *pBuf, /* Buffer used for the management data transfer */
31526-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
31527-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
31528-unsigned int TableIndex, /* Index to the Id table */
31529-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
31530-{
31531- unsigned int PhysPortMax;
31532- unsigned int PhysPortIndex;
31533- unsigned int Limit;
31534- unsigned int Offset;
31535- int Ret;
31536- SK_U32 Val32;
31537- SK_U64 Val64;
31538-
31539- /*
31540- * Calculate the port indexes from the instance.
31541- */
31542- PhysPortMax = pAC->GIni.GIMacsFound;
31543-
31544- if ((Instance != (SK_U32)(-1))) {
31545- /* Check instance range */
31546- if ((Instance < 1) || (Instance > PhysPortMax)) {
31547-
31548- *pLen = 0;
31549- return (SK_PNMI_ERR_UNKNOWN_INST);
31550- }
31551-
31552- /* Single net mode */
31553- PhysPortIndex = Instance - 1;
31554-
31555- /* Dual net mode */
31556- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31557- PhysPortIndex = NetIndex;
31558- }
31559-
31560- /* Both net modes */
31561- Limit = PhysPortIndex + 1;
31562- }
31563- else {
31564- /* Single net mode */
31565- PhysPortIndex = 0;
31566- Limit = PhysPortMax;
31567-
31568- /* Dual net mode */
31569- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
31570- PhysPortIndex = NetIndex;
31571- Limit = PhysPortIndex + 1;
31572- }
31573- }
31574-
31575- /*
31576- * Currently only get requests are allowed.
31577- */
31578- if (Action != SK_PNMI_GET) {
31579-
31580- *pLen = 0;
31581- return (SK_PNMI_ERR_READ_ONLY);
31582- }
31583-
31584- /*
31585- * Check if the buffer length is large enough.
31586- */
31587- switch (Id) {
31588-
31589- case OID_SKGE_RLMT_PORT_INDEX:
31590- case OID_SKGE_RLMT_STATUS:
31591- if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U32)) {
31592-
31593- *pLen = (Limit - PhysPortIndex) * sizeof(SK_U32);
31594- return (SK_PNMI_ERR_TOO_SHORT);
31595- }
31596- break;
31597-
31598- case OID_SKGE_RLMT_TX_HELLO_CTS:
31599- case OID_SKGE_RLMT_RX_HELLO_CTS:
31600- case OID_SKGE_RLMT_TX_SP_REQ_CTS:
31601- case OID_SKGE_RLMT_RX_SP_CTS:
31602- if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U64)) {
31603-
31604- *pLen = (Limit - PhysPortIndex) * sizeof(SK_U64);
31605- return (SK_PNMI_ERR_TOO_SHORT);
31606- }
31607- break;
31608-
31609- default:
31610- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR039,
31611- SK_PNMI_ERR039MSG);
31612-
31613- *pLen = 0;
31614- return (SK_PNMI_ERR_GENERAL);
31615-
31616- }
31617-
31618- /*
31619- * Update statistic and increment semaphores to indicate that
31620- * an update was already done.
31621- */
31622- if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {
31623-
31624- *pLen = 0;
31625- return (Ret);
31626- }
31627- pAC->Pnmi.RlmtUpdatedFlag ++;
31628-
31629- /*
31630- * Get value
31631- */
31632- Offset = 0;
31633- for (; PhysPortIndex < Limit; PhysPortIndex ++) {
31634-
31635- switch (Id) {
31636-
31637- case OID_SKGE_RLMT_PORT_INDEX:
31638- Val32 = PhysPortIndex;
31639- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
31640- Offset += sizeof(SK_U32);
31641- break;
31642-
31643- case OID_SKGE_RLMT_STATUS:
31644- if (pAC->Rlmt.Port[PhysPortIndex].PortState ==
31645- SK_RLMT_PS_INIT ||
31646- pAC->Rlmt.Port[PhysPortIndex].PortState ==
31647- SK_RLMT_PS_DOWN) {
31648-
31649- Val32 = SK_PNMI_RLMT_STATUS_ERROR;
31650- }
31651- else if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
31652-
31653- Val32 = SK_PNMI_RLMT_STATUS_ACTIVE;
31654- }
31655- else {
31656- Val32 = SK_PNMI_RLMT_STATUS_STANDBY;
31657- }
31658- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
31659- Offset += sizeof(SK_U32);
31660- break;
31661-
31662- case OID_SKGE_RLMT_TX_HELLO_CTS:
31663- Val64 = pAC->Rlmt.Port[PhysPortIndex].TxHelloCts;
31664- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
31665- Offset += sizeof(SK_U64);
31666- break;
31667-
31668- case OID_SKGE_RLMT_RX_HELLO_CTS:
31669- Val64 = pAC->Rlmt.Port[PhysPortIndex].RxHelloCts;
31670- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
31671- Offset += sizeof(SK_U64);
31672- break;
31673-
31674- case OID_SKGE_RLMT_TX_SP_REQ_CTS:
31675- Val64 = pAC->Rlmt.Port[PhysPortIndex].TxSpHelloReqCts;
31676- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
31677- Offset += sizeof(SK_U64);
31678- break;
31679-
31680- case OID_SKGE_RLMT_RX_SP_CTS:
31681- Val64 = pAC->Rlmt.Port[PhysPortIndex].RxSpHelloCts;
31682- SK_PNMI_STORE_U64(pBuf + Offset, Val64);
31683- Offset += sizeof(SK_U64);
31684- break;
31685-
31686- default:
31687- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,
31688- ("RlmtStat: Unknown OID should be errored before"));
31689-
31690- pAC->Pnmi.RlmtUpdatedFlag --;
31691- *pLen = 0;
31692- return (SK_PNMI_ERR_GENERAL);
31693- }
31694- }
31695- *pLen = Offset;
31696-
31697- pAC->Pnmi.RlmtUpdatedFlag --;
31698-
31699- return (SK_PNMI_ERR_OK);
31700-}
31701-
31702-/*****************************************************************************
31703- *
31704- * MacPrivateConf - OID handler function of OIDs concerning the configuration
31705- *
31706- * Description:
31707- * Get/Presets/Sets the OIDs concerning the configuration.
31708- *
31709- * Returns:
31710- * SK_PNMI_ERR_OK The request was successfully performed.
31711- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
31712- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
31713- * the correct data (e.g. a 32bit value is
31714- * needed, but a 16 bit value was passed).
31715- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
31716- * value range.
31717- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
31718- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
31719- * exist (e.g. port instance 3 on a two port
31720- * adapter.
31721- */
31722-PNMI_STATIC int MacPrivateConf(
31723-SK_AC *pAC, /* Pointer to adapter context */
31724-SK_IOC IoC, /* IO context handle */
31725-int Action, /* GET/PRESET/SET action */
31726-SK_U32 Id, /* Object ID that is to be processed */
31727-char *pBuf, /* Buffer used for the management data transfer */
31728-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
31729-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
31730-unsigned int TableIndex, /* Index to the Id table */
31731-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
31732-{
31733- unsigned int PhysPortMax;
31734- unsigned int PhysPortIndex;
31735- unsigned int LogPortMax;
31736- unsigned int LogPortIndex;
31737- unsigned int Limit;
31738- unsigned int Offset;
31739- char Val8;
31740- char *pBufPtr;
31741- int Ret;
31742- SK_EVPARA EventParam;
31743- SK_U32 Val32;
31744-
31745- /*
31746- * Calculate instance if wished. MAC index 0 is the virtual MAC.
31747- */
31748- PhysPortMax = pAC->GIni.GIMacsFound;
31749- LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);
31750-
31751- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */
31752- LogPortMax--;
31753- }
31754-
31755- if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */
31756- /* Check instance range */
31757- if ((Instance < 1) || (Instance > LogPortMax)) {
31758-
31759- *pLen = 0;
31760- return (SK_PNMI_ERR_UNKNOWN_INST);
31761- }
31762- LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);
31763- Limit = LogPortIndex + 1;
31764- }
31765-
31766- else { /* Instance == (SK_U32)(-1), get all Instances of that OID */
31767-
31768- LogPortIndex = 0;
31769- Limit = LogPortMax;
31770- }
31771-
31772- /*
31773- * Perform action
31774- */
31775- if (Action == SK_PNMI_GET) {
31776-
31777- /* Check length */
31778- switch (Id) {
31779-
31780- case OID_SKGE_PMD:
31781- case OID_SKGE_CONNECTOR:
31782- case OID_SKGE_LINK_CAP:
31783- case OID_SKGE_LINK_MODE:
31784- case OID_SKGE_LINK_MODE_STATUS:
31785- case OID_SKGE_LINK_STATUS:
31786- case OID_SKGE_FLOWCTRL_CAP:
31787- case OID_SKGE_FLOWCTRL_MODE:
31788- case OID_SKGE_FLOWCTRL_STATUS:
31789- case OID_SKGE_PHY_OPERATION_CAP:
31790- case OID_SKGE_PHY_OPERATION_MODE:
31791- case OID_SKGE_PHY_OPERATION_STATUS:
31792- case OID_SKGE_SPEED_CAP:
31793- case OID_SKGE_SPEED_MODE:
31794- case OID_SKGE_SPEED_STATUS:
31795-#ifdef SK_PHY_LP_MODE
31796- case OID_SKGE_PHY_LP_MODE:
31797-#endif
31798- if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U8)) {
31799-
31800- *pLen = (Limit - LogPortIndex) * sizeof(SK_U8);
31801- return (SK_PNMI_ERR_TOO_SHORT);
31802- }
31803- break;
31804-
31805- case OID_SKGE_MTU:
31806- case OID_SKGE_PHY_TYPE:
31807- if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U32)) {
31808-
31809- *pLen = (Limit - LogPortIndex) * sizeof(SK_U32);
31810- return (SK_PNMI_ERR_TOO_SHORT);
31811- }
31812- break;
31813-
31814- default:
31815- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR041,
31816- SK_PNMI_ERR041MSG);
31817- *pLen = 0;
31818- return (SK_PNMI_ERR_GENERAL);
31819- }
31820-
31821- /*
31822- * Update statistic and increment semaphore to indicate
31823- * that an update was already done.
31824- */
31825- if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {
31826-
31827- *pLen = 0;
31828- return (Ret);
31829- }
31830- pAC->Pnmi.SirqUpdatedFlag ++;
31831-
31832- /*
31833- * Get value
31834- */
31835- Offset = 0;
31836- for (; LogPortIndex < Limit; LogPortIndex ++) {
31837-
31838- pBufPtr = pBuf + Offset;
31839-
31840- switch (Id) {
31841-
31842- case OID_SKGE_PMD:
31843- *pBufPtr = pAC->Pnmi.PMD;
31844- Offset += sizeof(char);
31845- break;
31846-
31847- case OID_SKGE_CONNECTOR:
31848- *pBufPtr = pAC->Pnmi.Connector;
31849- Offset += sizeof(char);
31850- break;
31851-
31852- case OID_SKGE_PHY_TYPE:
31853- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
31854- if (LogPortIndex == 0) {
31855- continue;
31856- }
31857- else {
31858- /* Get value for physical ports */
31859- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
31860- pAC, LogPortIndex);
31861- Val32 = pAC->GIni.GP[PhysPortIndex].PhyType;
31862- SK_PNMI_STORE_U32(pBufPtr, Val32);
31863- }
31864- }
31865- else { /* DualNetMode */
31866-
31867- Val32 = pAC->GIni.GP[NetIndex].PhyType;
31868- SK_PNMI_STORE_U32(pBufPtr, Val32);
31869- }
31870- Offset += sizeof(SK_U32);
31871- break;
31872-
31873-#ifdef SK_PHY_LP_MODE
31874- case OID_SKGE_PHY_LP_MODE:
31875- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
31876- if (LogPortIndex == 0) {
31877- continue;
31878- }
31879- else {
31880- /* Get value for physical ports */
31881- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
31882- Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState;
31883- *pBufPtr = Val8;
31884- }
31885- }
31886- else { /* DualNetMode */
31887-
31888- Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState;
31889- *pBufPtr = Val8;
31890- }
31891- Offset += sizeof(SK_U8);
31892- break;
31893-#endif
31894-
31895- case OID_SKGE_LINK_CAP:
31896- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
31897- if (LogPortIndex == 0) {
31898- /* Get value for virtual port */
31899- VirtualConf(pAC, IoC, Id, pBufPtr);
31900- }
31901- else {
31902- /* Get value for physical ports */
31903- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
31904- pAC, LogPortIndex);
31905-
31906- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkCap;
31907- }
31908- }
31909- else { /* DualNetMode */
31910-
31911- *pBufPtr = pAC->GIni.GP[NetIndex].PLinkCap;
31912- }
31913- Offset += sizeof(char);
31914- break;
31915-
31916- case OID_SKGE_LINK_MODE:
31917- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
31918- if (LogPortIndex == 0) {
31919- /* Get value for virtual port */
31920- VirtualConf(pAC, IoC, Id, pBufPtr);
31921- }
31922- else {
31923- /* Get value for physical ports */
31924- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
31925- pAC, LogPortIndex);
31926-
31927- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkModeConf;
31928- }
31929- }
31930- else { /* DualNetMode */
31931-
31932- *pBufPtr = pAC->GIni.GP[NetIndex].PLinkModeConf;
31933- }
31934- Offset += sizeof(char);
31935- break;
31936-
31937- case OID_SKGE_LINK_MODE_STATUS:
31938- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
31939- if (LogPortIndex == 0) {
31940- /* Get value for virtual port */
31941- VirtualConf(pAC, IoC, Id, pBufPtr);
31942- }
31943- else {
31944- /* Get value for physical port */
31945- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
31946- pAC, LogPortIndex);
31947-
31948- *pBufPtr =
31949- CalculateLinkModeStatus(pAC, IoC, PhysPortIndex);
31950- }
31951- }
31952- else { /* DualNetMode */
31953-
31954- *pBufPtr = CalculateLinkModeStatus(pAC, IoC, NetIndex);
31955- }
31956- Offset += sizeof(char);
31957- break;
31958-
31959- case OID_SKGE_LINK_STATUS:
31960- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
31961- if (LogPortIndex == 0) {
31962- /* Get value for virtual port */
31963- VirtualConf(pAC, IoC, Id, pBufPtr);
31964- }
31965- else {
31966- /* Get value for physical ports */
31967- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
31968- pAC, LogPortIndex);
31969-
31970- *pBufPtr = CalculateLinkStatus(pAC, IoC, PhysPortIndex);
31971- }
31972- }
31973- else { /* DualNetMode */
31974-
31975- *pBufPtr = CalculateLinkStatus(pAC, IoC, NetIndex);
31976- }
31977- Offset += sizeof(char);
31978- break;
31979-
31980- case OID_SKGE_FLOWCTRL_CAP:
31981- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
31982- if (LogPortIndex == 0) {
31983- /* Get value for virtual port */
31984- VirtualConf(pAC, IoC, Id, pBufPtr);
31985- }
31986- else {
31987- /* Get value for physical ports */
31988- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
31989- pAC, LogPortIndex);
31990-
31991- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlCap;
31992- }
31993- }
31994- else { /* DualNetMode */
31995-
31996- *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlCap;
31997- }
31998- Offset += sizeof(char);
31999- break;
32000-
32001- case OID_SKGE_FLOWCTRL_MODE:
32002- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32003- if (LogPortIndex == 0) {
32004- /* Get value for virtual port */
32005- VirtualConf(pAC, IoC, Id, pBufPtr);
32006- }
32007- else {
32008- /* Get value for physical port */
32009- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32010- pAC, LogPortIndex);
32011-
32012- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlMode;
32013- }
32014- }
32015- else { /* DualNetMode */
32016-
32017- *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlMode;
32018- }
32019- Offset += sizeof(char);
32020- break;
32021-
32022- case OID_SKGE_FLOWCTRL_STATUS:
32023- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32024- if (LogPortIndex == 0) {
32025- /* Get value for virtual port */
32026- VirtualConf(pAC, IoC, Id, pBufPtr);
32027- }
32028- else {
32029- /* Get value for physical port */
32030- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32031- pAC, LogPortIndex);
32032-
32033- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlStatus;
32034- }
32035- }
32036- else { /* DualNetMode */
32037-
32038- *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlStatus;
32039- }
32040- Offset += sizeof(char);
32041- break;
32042-
32043- case OID_SKGE_PHY_OPERATION_CAP:
32044- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32045- if (LogPortIndex == 0) {
32046- /* Get value for virtual port */
32047- VirtualConf(pAC, IoC, Id, pBufPtr);
32048- }
32049- else {
32050- /* Get value for physical ports */
32051- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32052- pAC, LogPortIndex);
32053-
32054- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSCap;
32055- }
32056- }
32057- else { /* DualNetMode */
32058-
32059- *pBufPtr = pAC->GIni.GP[NetIndex].PMSCap;
32060- }
32061- Offset += sizeof(char);
32062- break;
32063-
32064- case OID_SKGE_PHY_OPERATION_MODE:
32065- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32066- if (LogPortIndex == 0) {
32067- /* Get value for virtual port */
32068- VirtualConf(pAC, IoC, Id, pBufPtr);
32069- }
32070- else {
32071- /* Get value for physical port */
32072- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32073- pAC, LogPortIndex);
32074-
32075- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSMode;
32076- }
32077- }
32078- else { /* DualNetMode */
32079-
32080- *pBufPtr = pAC->GIni.GP[NetIndex].PMSMode;
32081- }
32082- Offset += sizeof(char);
32083- break;
32084-
32085- case OID_SKGE_PHY_OPERATION_STATUS:
32086- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32087- if (LogPortIndex == 0) {
32088- /* Get value for virtual port */
32089- VirtualConf(pAC, IoC, Id, pBufPtr);
32090- }
32091- else {
32092- /* Get value for physical port */
32093- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32094- pAC, LogPortIndex);
32095-
32096- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSStatus;
32097- }
32098- }
32099- else {
32100-
32101- *pBufPtr = pAC->GIni.GP[NetIndex].PMSStatus;
32102- }
32103- Offset += sizeof(char);
32104- break;
32105-
32106- case OID_SKGE_SPEED_CAP:
32107- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32108- if (LogPortIndex == 0) {
32109- /* Get value for virtual port */
32110- VirtualConf(pAC, IoC, Id, pBufPtr);
32111- }
32112- else {
32113- /* Get value for physical ports */
32114- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32115- pAC, LogPortIndex);
32116-
32117- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedCap;
32118- }
32119- }
32120- else { /* DualNetMode */
32121-
32122- *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedCap;
32123- }
32124- Offset += sizeof(char);
32125- break;
32126-
32127- case OID_SKGE_SPEED_MODE:
32128- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32129- if (LogPortIndex == 0) {
32130- /* Get value for virtual port */
32131- VirtualConf(pAC, IoC, Id, pBufPtr);
32132- }
32133- else {
32134- /* Get value for physical port */
32135- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32136- pAC, LogPortIndex);
32137-
32138- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeed;
32139- }
32140- }
32141- else { /* DualNetMode */
32142-
32143- *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeed;
32144- }
32145- Offset += sizeof(char);
32146- break;
32147-
32148- case OID_SKGE_SPEED_STATUS:
32149- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32150- if (LogPortIndex == 0) {
32151- /* Get value for virtual port */
32152- VirtualConf(pAC, IoC, Id, pBufPtr);
32153- }
32154- else {
32155- /* Get value for physical port */
32156- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
32157- pAC, LogPortIndex);
32158-
32159- *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed;
32160- }
32161- }
32162- else { /* DualNetMode */
32163-
32164- *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedUsed;
32165- }
32166- Offset += sizeof(char);
32167- break;
32168-
32169- case OID_SKGE_MTU:
32170- Val32 = SK_DRIVER_GET_MTU(pAC, IoC, NetIndex);
32171- SK_PNMI_STORE_U32(pBufPtr, Val32);
32172- Offset += sizeof(SK_U32);
32173- break;
32174-
32175- default:
32176- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,
32177- ("MacPrivateConf: Unknown OID should be handled before"));
32178-
32179- pAC->Pnmi.SirqUpdatedFlag --;
32180- return (SK_PNMI_ERR_GENERAL);
32181- }
32182- }
32183- *pLen = Offset;
32184- pAC->Pnmi.SirqUpdatedFlag --;
32185-
32186- return (SK_PNMI_ERR_OK);
32187- }
32188-
32189- /*
32190- * From here SET or PRESET action. Check if the passed
32191- * buffer length is plausible.
32192- */
32193- switch (Id) {
32194-
32195- case OID_SKGE_LINK_MODE:
32196- case OID_SKGE_FLOWCTRL_MODE:
32197- case OID_SKGE_PHY_OPERATION_MODE:
32198- case OID_SKGE_SPEED_MODE:
32199- if (*pLen < Limit - LogPortIndex) {
32200-
32201- *pLen = Limit - LogPortIndex;
32202- return (SK_PNMI_ERR_TOO_SHORT);
32203- }
32204- if (*pLen != Limit - LogPortIndex) {
32205-
32206- *pLen = 0;
32207- return (SK_PNMI_ERR_BAD_VALUE);
32208- }
32209- break;
32210-
32211-#ifdef SK_PHY_LP_MODE
32212- case OID_SKGE_PHY_LP_MODE:
32213- if (*pLen < Limit - LogPortIndex) {
32214-
32215- *pLen = Limit - LogPortIndex;
32216- return (SK_PNMI_ERR_TOO_SHORT);
32217- }
32218- break;
32219-#endif
32220-
32221- case OID_SKGE_MTU:
32222- if (*pLen < sizeof(SK_U32)) {
32223-
32224- *pLen = sizeof(SK_U32);
32225- return (SK_PNMI_ERR_TOO_SHORT);
32226- }
32227- if (*pLen != sizeof(SK_U32)) {
32228-
32229- *pLen = 0;
32230- return (SK_PNMI_ERR_BAD_VALUE);
32231- }
32232- break;
32233-
32234- default:
32235- *pLen = 0;
32236- return (SK_PNMI_ERR_READ_ONLY);
32237- }
32238-
32239- /*
32240- * Perform preset or set
32241- */
32242- Offset = 0;
32243- for (; LogPortIndex < Limit; LogPortIndex ++) {
32244-
32245- switch (Id) {
32246-
32247- case OID_SKGE_LINK_MODE:
32248- /* Check the value range */
32249- Val8 = *(pBuf + Offset);
32250- if (Val8 == 0) {
32251-
32252- Offset += sizeof(char);
32253- break;
32254- }
32255- if (Val8 < SK_LMODE_HALF ||
32256- (LogPortIndex != 0 && Val8 > SK_LMODE_AUTOSENSE) ||
32257- (LogPortIndex == 0 && Val8 > SK_LMODE_INDETERMINATED)) {
32258-
32259- *pLen = 0;
32260- return (SK_PNMI_ERR_BAD_VALUE);
32261- }
32262-
32263- /* The preset ends here */
32264- if (Action == SK_PNMI_PRESET) {
32265-
32266- return (SK_PNMI_ERR_OK);
32267- }
32268-
32269- if (LogPortIndex == 0) {
32270-
32271- /*
32272- * The virtual port consists of all currently
32273- * active ports. Find them and send an event
32274- * with the new link mode to SIRQ.
32275- */
32276- for (PhysPortIndex = 0;
32277- PhysPortIndex < PhysPortMax;
32278- PhysPortIndex ++) {
32279-
32280- if (!pAC->Pnmi.Port[PhysPortIndex].
32281- ActiveFlag) {
32282-
32283- continue;
32284- }
32285-
32286- EventParam.Para32[0] = PhysPortIndex;
32287- EventParam.Para32[1] = (SK_U32)Val8;
32288- if (SkGeSirqEvent(pAC, IoC,
32289- SK_HWEV_SET_LMODE,
32290- EventParam) > 0) {
32291-
32292- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32293- SK_PNMI_ERR043,
32294- SK_PNMI_ERR043MSG);
32295-
32296- *pLen = 0;
32297- return (SK_PNMI_ERR_GENERAL);
32298- }
32299- }
32300- }
32301- else {
32302- /*
32303- * Send an event with the new link mode to
32304- * the SIRQ module.
32305- */
32306- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(
32307- pAC, LogPortIndex);
32308- EventParam.Para32[1] = (SK_U32)Val8;
32309- if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_LMODE,
32310- EventParam) > 0) {
32311-
32312- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32313- SK_PNMI_ERR043,
32314- SK_PNMI_ERR043MSG);
32315-
32316- *pLen = 0;
32317- return (SK_PNMI_ERR_GENERAL);
32318- }
32319- }
32320- Offset += sizeof(char);
32321- break;
32322-
32323- case OID_SKGE_FLOWCTRL_MODE:
32324- /* Check the value range */
32325- Val8 = *(pBuf + Offset);
32326- if (Val8 == 0) {
32327-
32328- Offset += sizeof(char);
32329- break;
32330- }
32331- if (Val8 < SK_FLOW_MODE_NONE ||
32332- (LogPortIndex != 0 && Val8 > SK_FLOW_MODE_SYM_OR_REM) ||
32333- (LogPortIndex == 0 && Val8 > SK_FLOW_MODE_INDETERMINATED)) {
32334-
32335- *pLen = 0;
32336- return (SK_PNMI_ERR_BAD_VALUE);
32337- }
32338-
32339- /* The preset ends here */
32340- if (Action == SK_PNMI_PRESET) {
32341-
32342- return (SK_PNMI_ERR_OK);
32343- }
32344-
32345- if (LogPortIndex == 0) {
32346-
32347- /*
32348- * The virtual port consists of all currently
32349- * active ports. Find them and send an event
32350- * with the new flow control mode to SIRQ.
32351- */
32352- for (PhysPortIndex = 0;
32353- PhysPortIndex < PhysPortMax;
32354- PhysPortIndex ++) {
32355-
32356- if (!pAC->Pnmi.Port[PhysPortIndex].
32357- ActiveFlag) {
32358-
32359- continue;
32360- }
32361-
32362- EventParam.Para32[0] = PhysPortIndex;
32363- EventParam.Para32[1] = (SK_U32)Val8;
32364- if (SkGeSirqEvent(pAC, IoC,
32365- SK_HWEV_SET_FLOWMODE,
32366- EventParam) > 0) {
32367-
32368- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32369- SK_PNMI_ERR044,
32370- SK_PNMI_ERR044MSG);
32371-
32372- *pLen = 0;
32373- return (SK_PNMI_ERR_GENERAL);
32374- }
32375- }
32376- }
32377- else {
32378- /*
32379- * Send an event with the new flow control
32380- * mode to the SIRQ module.
32381- */
32382- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(
32383- pAC, LogPortIndex);
32384- EventParam.Para32[1] = (SK_U32)Val8;
32385- if (SkGeSirqEvent(pAC, IoC,
32386- SK_HWEV_SET_FLOWMODE, EventParam)
32387- > 0) {
32388-
32389- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32390- SK_PNMI_ERR044,
32391- SK_PNMI_ERR044MSG);
32392-
32393- *pLen = 0;
32394- return (SK_PNMI_ERR_GENERAL);
32395- }
32396- }
32397- Offset += sizeof(char);
32398- break;
32399-
32400- case OID_SKGE_PHY_OPERATION_MODE :
32401- /* Check the value range */
32402- Val8 = *(pBuf + Offset);
32403- if (Val8 == 0) {
32404- /* mode of this port remains unchanged */
32405- Offset += sizeof(char);
32406- break;
32407- }
32408- if (Val8 < SK_MS_MODE_AUTO ||
32409- (LogPortIndex != 0 && Val8 > SK_MS_MODE_SLAVE) ||
32410- (LogPortIndex == 0 && Val8 > SK_MS_MODE_INDETERMINATED)) {
32411-
32412- *pLen = 0;
32413- return (SK_PNMI_ERR_BAD_VALUE);
32414- }
32415-
32416- /* The preset ends here */
32417- if (Action == SK_PNMI_PRESET) {
32418-
32419- return (SK_PNMI_ERR_OK);
32420- }
32421-
32422- if (LogPortIndex == 0) {
32423-
32424- /*
32425- * The virtual port consists of all currently
32426- * active ports. Find them and send an event
32427- * with new master/slave (role) mode to SIRQ.
32428- */
32429- for (PhysPortIndex = 0;
32430- PhysPortIndex < PhysPortMax;
32431- PhysPortIndex ++) {
32432-
32433- if (!pAC->Pnmi.Port[PhysPortIndex].
32434- ActiveFlag) {
32435-
32436- continue;
32437- }
32438-
32439- EventParam.Para32[0] = PhysPortIndex;
32440- EventParam.Para32[1] = (SK_U32)Val8;
32441- if (SkGeSirqEvent(pAC, IoC,
32442- SK_HWEV_SET_ROLE,
32443- EventParam) > 0) {
32444-
32445- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32446- SK_PNMI_ERR042,
32447- SK_PNMI_ERR042MSG);
32448-
32449- *pLen = 0;
32450- return (SK_PNMI_ERR_GENERAL);
32451- }
32452- }
32453- }
32454- else {
32455- /*
32456- * Send an event with the new master/slave
32457- * (role) mode to the SIRQ module.
32458- */
32459- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(
32460- pAC, LogPortIndex);
32461- EventParam.Para32[1] = (SK_U32)Val8;
32462- if (SkGeSirqEvent(pAC, IoC,
32463- SK_HWEV_SET_ROLE, EventParam) > 0) {
32464-
32465- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32466- SK_PNMI_ERR042,
32467- SK_PNMI_ERR042MSG);
32468-
32469- *pLen = 0;
32470- return (SK_PNMI_ERR_GENERAL);
32471- }
32472- }
32473-
32474- Offset += sizeof(char);
32475- break;
32476-
32477- case OID_SKGE_SPEED_MODE:
32478- /* Check the value range */
32479- Val8 = *(pBuf + Offset);
32480- if (Val8 == 0) {
32481-
32482- Offset += sizeof(char);
32483- break;
32484- }
32485- if (Val8 < (SK_LSPEED_AUTO) ||
32486- (LogPortIndex != 0 && Val8 > (SK_LSPEED_1000MBPS)) ||
32487- (LogPortIndex == 0 && Val8 > (SK_LSPEED_INDETERMINATED))) {
32488-
32489- *pLen = 0;
32490- return (SK_PNMI_ERR_BAD_VALUE);
32491- }
32492-
32493- /* The preset ends here */
32494- if (Action == SK_PNMI_PRESET) {
32495-
32496- return (SK_PNMI_ERR_OK);
32497- }
32498-
32499- if (LogPortIndex == 0) {
32500-
32501- /*
32502- * The virtual port consists of all currently
32503- * active ports. Find them and send an event
32504- * with the new flow control mode to SIRQ.
32505- */
32506- for (PhysPortIndex = 0;
32507- PhysPortIndex < PhysPortMax;
32508- PhysPortIndex ++) {
32509-
32510- if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
32511-
32512- continue;
32513- }
32514-
32515- EventParam.Para32[0] = PhysPortIndex;
32516- EventParam.Para32[1] = (SK_U32)Val8;
32517- if (SkGeSirqEvent(pAC, IoC,
32518- SK_HWEV_SET_SPEED,
32519- EventParam) > 0) {
32520-
32521- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32522- SK_PNMI_ERR045,
32523- SK_PNMI_ERR045MSG);
32524-
32525- *pLen = 0;
32526- return (SK_PNMI_ERR_GENERAL);
32527- }
32528- }
32529- }
32530- else {
32531- /*
32532- * Send an event with the new flow control
32533- * mode to the SIRQ module.
32534- */
32535- EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(
32536- pAC, LogPortIndex);
32537- EventParam.Para32[1] = (SK_U32)Val8;
32538- if (SkGeSirqEvent(pAC, IoC,
32539- SK_HWEV_SET_SPEED,
32540- EventParam) > 0) {
32541-
32542- SK_ERR_LOG(pAC, SK_ERRCL_SW,
32543- SK_PNMI_ERR045,
32544- SK_PNMI_ERR045MSG);
32545-
32546- *pLen = 0;
32547- return (SK_PNMI_ERR_GENERAL);
32548- }
32549- }
32550- Offset += sizeof(char);
32551- break;
32552-
32553- case OID_SKGE_MTU :
32554- /* Check the value range */
32555- Val32 = *(SK_U32*)(pBuf + Offset);
32556- if (Val32 == 0) {
32557- /* mtu of this port remains unchanged */
32558- Offset += sizeof(SK_U32);
32559- break;
32560- }
32561- if (SK_DRIVER_PRESET_MTU(pAC, IoC, NetIndex, Val32) != 0) {
32562- *pLen = 0;
32563- return (SK_PNMI_ERR_BAD_VALUE);
32564- }
32565-
32566- /* The preset ends here */
32567- if (Action == SK_PNMI_PRESET) {
32568- return (SK_PNMI_ERR_OK);
32569- }
32570-
32571- if (SK_DRIVER_SET_MTU(pAC, IoC, NetIndex, Val32) != 0) {
32572- return (SK_PNMI_ERR_GENERAL);
32573- }
32574-
32575- Offset += sizeof(SK_U32);
32576- break;
32577-
32578-#ifdef SK_PHY_LP_MODE
32579- case OID_SKGE_PHY_LP_MODE:
32580- /* The preset ends here */
32581- if (Action == SK_PNMI_PRESET) {
32582-
32583- return (SK_PNMI_ERR_OK);
32584- }
32585-
32586- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
32587- if (LogPortIndex == 0) {
32588- Offset = 0;
32589- continue;
32590- }
32591- else {
32592- /* Set value for physical ports */
32593- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
32594-
32595- switch (*(pBuf + Offset)) {
32596- case 0:
32597- /* If LowPowerMode is active, we can leave it. */
32598- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
32599-
32600- Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex);
32601-
32602- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) {
32603-
32604- SkDrvInitAdapter(pAC);
32605- }
32606- break;
32607- }
32608- else {
32609- *pLen = 0;
32610- return (SK_PNMI_ERR_GENERAL);
32611- }
32612- case 1:
32613- case 2:
32614- case 3:
32615- case 4:
32616- /* If no LowPowerMode is active, we can enter it. */
32617- if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
32618-
32619- if ((*(pBuf + Offset)) < 3) {
32620-
32621- SkDrvDeInitAdapter(pAC);
32622- }
32623-
32624- Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf);
32625- break;
32626- }
32627- else {
32628- *pLen = 0;
32629- return (SK_PNMI_ERR_GENERAL);
32630- }
32631- default:
32632- *pLen = 0;
32633- return (SK_PNMI_ERR_BAD_VALUE);
32634- }
32635- }
32636- }
32637- else { /* DualNetMode */
32638-
32639- switch (*(pBuf + Offset)) {
32640- case 0:
32641- /* If we are in a LowPowerMode, we can leave it. */
32642- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
32643-
32644- Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex);
32645-
32646- if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) {
32647-
32648- SkDrvInitAdapter(pAC);
32649- }
32650- break;
32651- }
32652- else {
32653- *pLen = 0;
32654- return (SK_PNMI_ERR_GENERAL);
32655- }
32656-
32657- case 1:
32658- case 2:
32659- case 3:
32660- case 4:
32661- /* If we are not already in LowPowerMode, we can enter it. */
32662- if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
32663-
32664- if ((*(pBuf + Offset)) < 3) {
32665-
32666- SkDrvDeInitAdapter(pAC);
32667- }
32668- else {
32669-
32670- Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf);
32671- }
32672- break;
32673- }
32674- else {
32675- *pLen = 0;
32676- return (SK_PNMI_ERR_GENERAL);
32677- }
32678-
32679- default:
32680- *pLen = 0;
32681- return (SK_PNMI_ERR_BAD_VALUE);
32682- }
32683- }
32684- Offset += sizeof(SK_U8);
32685- break;
32686-#endif
32687-
32688- default:
32689- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,
32690- ("MacPrivateConf: Unknown OID should be handled before set"));
32691-
32692- *pLen = 0;
32693- return (SK_PNMI_ERR_GENERAL);
32694- }
32695- }
32696-
32697- return (SK_PNMI_ERR_OK);
32698-}
32699-
32700-/*****************************************************************************
32701- *
32702- * Monitor - OID handler function for RLMT_MONITOR_XXX
32703- *
32704- * Description:
32705- * Because RLMT currently does not support the monitoring of
32706- * remote adapter cards, we return always an empty table.
32707- *
32708- * Returns:
32709- * SK_PNMI_ERR_OK The request was successfully performed.
32710- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
32711- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
32712- * the correct data (e.g. a 32bit value is
32713- * needed, but a 16 bit value was passed).
32714- * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid
32715- * value range.
32716- * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.
32717- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
32718- * exist (e.g. port instance 3 on a two port
32719- * adapter.
32720- */
32721-PNMI_STATIC int Monitor(
32722-SK_AC *pAC, /* Pointer to adapter context */
32723-SK_IOC IoC, /* IO context handle */
32724-int Action, /* GET/PRESET/SET action */
32725-SK_U32 Id, /* Object ID that is to be processed */
32726-char *pBuf, /* Buffer used for the management data transfer */
32727-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
32728-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
32729-unsigned int TableIndex, /* Index to the Id table */
32730-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
32731-{
32732- unsigned int Index;
32733- unsigned int Limit;
32734- unsigned int Offset;
32735- unsigned int Entries;
32736-
32737-
32738- /*
32739- * Calculate instance if wished.
32740- */
32741- /* XXX Not yet implemented. Return always an empty table. */
32742- Entries = 0;
32743-
32744- if ((Instance != (SK_U32)(-1))) {
32745-
32746- if ((Instance < 1) || (Instance > Entries)) {
32747-
32748- *pLen = 0;
32749- return (SK_PNMI_ERR_UNKNOWN_INST);
32750- }
32751-
32752- Index = (unsigned int)Instance - 1;
32753- Limit = (unsigned int)Instance;
32754- }
32755- else {
32756- Index = 0;
32757- Limit = Entries;
32758- }
32759-
32760- /*
32761- * Get/Set value
32762- */
32763- if (Action == SK_PNMI_GET) {
32764-
32765- for (Offset=0; Index < Limit; Index ++) {
32766-
32767- switch (Id) {
32768-
32769- case OID_SKGE_RLMT_MONITOR_INDEX:
32770- case OID_SKGE_RLMT_MONITOR_ADDR:
32771- case OID_SKGE_RLMT_MONITOR_ERRS:
32772- case OID_SKGE_RLMT_MONITOR_TIMESTAMP:
32773- case OID_SKGE_RLMT_MONITOR_ADMIN:
32774- break;
32775-
32776- default:
32777- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR046,
32778- SK_PNMI_ERR046MSG);
32779-
32780- *pLen = 0;
32781- return (SK_PNMI_ERR_GENERAL);
32782- }
32783- }
32784- *pLen = Offset;
32785- }
32786- else {
32787- /* Only MONITOR_ADMIN can be set */
32788- if (Id != OID_SKGE_RLMT_MONITOR_ADMIN) {
32789-
32790- *pLen = 0;
32791- return (SK_PNMI_ERR_READ_ONLY);
32792- }
32793-
32794- /* Check if the length is plausible */
32795- if (*pLen < (Limit - Index)) {
32796-
32797- return (SK_PNMI_ERR_TOO_SHORT);
32798- }
32799- /* Okay, we have a wide value range */
32800- if (*pLen != (Limit - Index)) {
32801-
32802- *pLen = 0;
32803- return (SK_PNMI_ERR_BAD_VALUE);
32804- }
32805-/*
32806- for (Offset=0; Index < Limit; Index ++) {
32807- }
32808-*/
32809-/*
32810- * XXX Not yet implemented. Return always BAD_VALUE, because the table
32811- * is empty.
32812- */
32813- *pLen = 0;
32814- return (SK_PNMI_ERR_BAD_VALUE);
32815- }
32816-
32817- return (SK_PNMI_ERR_OK);
32818-}
32819-
32820-/*****************************************************************************
32821- *
32822- * VirtualConf - Calculates the values of configuration OIDs for virtual port
32823- *
32824- * Description:
32825- * We handle here the get of the configuration group OIDs, which are
32826- * a little bit complicated. The virtual port consists of all currently
32827- * active physical ports. If multiple ports are active and configured
32828- * differently we get in some trouble to return a single value. So we
32829- * get the value of the first active port and compare it with that of
32830- * the other active ports. If they are not the same, we return a value
32831- * that indicates that the state is indeterminated.
32832- *
32833- * Returns:
32834- * Nothing
32835- */
32836-PNMI_STATIC void VirtualConf(
32837-SK_AC *pAC, /* Pointer to adapter context */
32838-SK_IOC IoC, /* IO context handle */
32839-SK_U32 Id, /* Object ID that is to be processed */
32840-char *pBuf) /* Buffer used for the management data transfer */
32841-{
32842- unsigned int PhysPortMax;
32843- unsigned int PhysPortIndex;
32844- SK_U8 Val8;
32845- SK_U32 Val32;
32846- SK_BOOL PortActiveFlag;
32847- SK_GEPORT *pPrt;
32848-
32849- *pBuf = 0;
32850- PortActiveFlag = SK_FALSE;
32851- PhysPortMax = pAC->GIni.GIMacsFound;
32852-
32853- for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;
32854- PhysPortIndex ++) {
32855-
32856- pPrt = &pAC->GIni.GP[PhysPortIndex];
32857-
32858- /* Check if the physical port is active */
32859- if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
32860-
32861- continue;
32862- }
32863-
32864- PortActiveFlag = SK_TRUE;
32865-
32866- switch (Id) {
32867-
32868- case OID_SKGE_PHY_TYPE:
32869- /* Check if it is the first active port */
32870- if (*pBuf == 0) {
32871- Val32 = pPrt->PhyType;
32872- SK_PNMI_STORE_U32(pBuf, Val32);
32873- continue;
32874- }
32875-
32876- case OID_SKGE_LINK_CAP:
32877-
32878- /*
32879- * Different capabilities should not happen, but
32880- * in the case of the cases OR them all together.
32881- * From a curious point of view the virtual port
32882- * is capable of all found capabilities.
32883- */
32884- *pBuf |= pPrt->PLinkCap;
32885- break;
32886-
32887- case OID_SKGE_LINK_MODE:
32888- /* Check if it is the first active port */
32889- if (*pBuf == 0) {
32890-
32891- *pBuf = pPrt->PLinkModeConf;
32892- continue;
32893- }
32894-
32895- /*
32896- * If we find an active port with a different link
32897- * mode than the first one we return a value that
32898- * indicates that the link mode is indeterminated.
32899- */
32900- if (*pBuf != pPrt->PLinkModeConf) {
32901-
32902- *pBuf = SK_LMODE_INDETERMINATED;
32903- }
32904- break;
32905-
32906- case OID_SKGE_LINK_MODE_STATUS:
32907- /* Get the link mode of the physical port */
32908- Val8 = CalculateLinkModeStatus(pAC, IoC, PhysPortIndex);
32909-
32910- /* Check if it is the first active port */
32911- if (*pBuf == 0) {
32912-
32913- *pBuf = Val8;
32914- continue;
32915- }
32916-
32917- /*
32918- * If we find an active port with a different link
32919- * mode status than the first one we return a value
32920- * that indicates that the link mode status is
32921- * indeterminated.
32922- */
32923- if (*pBuf != Val8) {
32924-
32925- *pBuf = SK_LMODE_STAT_INDETERMINATED;
32926- }
32927- break;
32928-
32929- case OID_SKGE_LINK_STATUS:
32930- /* Get the link status of the physical port */
32931- Val8 = CalculateLinkStatus(pAC, IoC, PhysPortIndex);
32932-
32933- /* Check if it is the first active port */
32934- if (*pBuf == 0) {
32935-
32936- *pBuf = Val8;
32937- continue;
32938- }
32939-
32940- /*
32941- * If we find an active port with a different link
32942- * status than the first one, we return a value
32943- * that indicates that the link status is
32944- * indeterminated.
32945- */
32946- if (*pBuf != Val8) {
32947-
32948- *pBuf = SK_PNMI_RLMT_LSTAT_INDETERMINATED;
32949- }
32950- break;
32951-
32952- case OID_SKGE_FLOWCTRL_CAP:
32953- /* Check if it is the first active port */
32954- if (*pBuf == 0) {
32955-
32956- *pBuf = pPrt->PFlowCtrlCap;
32957- continue;
32958- }
32959-
32960- /*
32961- * From a curious point of view the virtual port
32962- * is capable of all found capabilities.
32963- */
32964- *pBuf |= pPrt->PFlowCtrlCap;
32965- break;
32966-
32967- case OID_SKGE_FLOWCTRL_MODE:
32968- /* Check if it is the first active port */
32969- if (*pBuf == 0) {
32970-
32971- *pBuf = pPrt->PFlowCtrlMode;
32972- continue;
32973- }
32974-
32975- /*
32976- * If we find an active port with a different flow
32977- * control mode than the first one, we return a value
32978- * that indicates that the mode is indeterminated.
32979- */
32980- if (*pBuf != pPrt->PFlowCtrlMode) {
32981-
32982- *pBuf = SK_FLOW_MODE_INDETERMINATED;
32983- }
32984- break;
32985-
32986- case OID_SKGE_FLOWCTRL_STATUS:
32987- /* Check if it is the first active port */
32988- if (*pBuf == 0) {
32989-
32990- *pBuf = pPrt->PFlowCtrlStatus;
32991- continue;
32992- }
32993-
32994- /*
32995- * If we find an active port with a different flow
32996- * control status than the first one, we return a
32997- * value that indicates that the status is
32998- * indeterminated.
32999- */
33000- if (*pBuf != pPrt->PFlowCtrlStatus) {
33001-
33002- *pBuf = SK_FLOW_STAT_INDETERMINATED;
33003- }
33004- break;
33005-
33006- case OID_SKGE_PHY_OPERATION_CAP:
33007- /* Check if it is the first active port */
33008- if (*pBuf == 0) {
33009-
33010- *pBuf = pPrt->PMSCap;
33011- continue;
33012- }
33013-
33014- /*
33015- * From a curious point of view the virtual port
33016- * is capable of all found capabilities.
33017- */
33018- *pBuf |= pPrt->PMSCap;
33019- break;
33020-
33021- case OID_SKGE_PHY_OPERATION_MODE:
33022- /* Check if it is the first active port */
33023- if (*pBuf == 0) {
33024-
33025- *pBuf = pPrt->PMSMode;
33026- continue;
33027- }
33028-
33029- /*
33030- * If we find an active port with a different master/
33031- * slave mode than the first one, we return a value
33032- * that indicates that the mode is indeterminated.
33033- */
33034- if (*pBuf != pPrt->PMSMode) {
33035-
33036- *pBuf = SK_MS_MODE_INDETERMINATED;
33037- }
33038- break;
33039-
33040- case OID_SKGE_PHY_OPERATION_STATUS:
33041- /* Check if it is the first active port */
33042- if (*pBuf == 0) {
33043-
33044- *pBuf = pPrt->PMSStatus;
33045- continue;
33046- }
33047-
33048- /*
33049- * If we find an active port with a different master/
33050- * slave status than the first one, we return a
33051- * value that indicates that the status is
33052- * indeterminated.
33053- */
33054- if (*pBuf != pPrt->PMSStatus) {
33055-
33056- *pBuf = SK_MS_STAT_INDETERMINATED;
33057- }
33058- break;
33059-
33060- case OID_SKGE_SPEED_MODE:
33061- /* Check if it is the first active port */
33062- if (*pBuf == 0) {
33063-
33064- *pBuf = pPrt->PLinkSpeed;
33065- continue;
33066- }
33067-
33068- /*
33069- * If we find an active port with a different flow
33070- * control mode than the first one, we return a value
33071- * that indicates that the mode is indeterminated.
33072- */
33073- if (*pBuf != pPrt->PLinkSpeed) {
33074-
33075- *pBuf = SK_LSPEED_INDETERMINATED;
33076- }
33077- break;
33078-
33079- case OID_SKGE_SPEED_STATUS:
33080- /* Check if it is the first active port */
33081- if (*pBuf == 0) {
33082-
33083- *pBuf = pPrt->PLinkSpeedUsed;
33084- continue;
33085- }
33086-
33087- /*
33088- * If we find an active port with a different flow
33089- * control status than the first one, we return a
33090- * value that indicates that the status is
33091- * indeterminated.
33092- */
33093- if (*pBuf != pPrt->PLinkSpeedUsed) {
33094-
33095- *pBuf = SK_LSPEED_STAT_INDETERMINATED;
33096- }
33097- break;
33098- }
33099- }
33100-
33101- /*
33102- * If no port is active return an indeterminated answer
33103- */
33104- if (!PortActiveFlag) {
33105-
33106- switch (Id) {
33107-
33108- case OID_SKGE_LINK_CAP:
33109- *pBuf = SK_LMODE_CAP_INDETERMINATED;
33110- break;
33111-
33112- case OID_SKGE_LINK_MODE:
33113- *pBuf = SK_LMODE_INDETERMINATED;
33114- break;
33115-
33116- case OID_SKGE_LINK_MODE_STATUS:
33117- *pBuf = SK_LMODE_STAT_INDETERMINATED;
33118- break;
33119-
33120- case OID_SKGE_LINK_STATUS:
33121- *pBuf = SK_PNMI_RLMT_LSTAT_INDETERMINATED;
33122- break;
33123-
33124- case OID_SKGE_FLOWCTRL_CAP:
33125- case OID_SKGE_FLOWCTRL_MODE:
33126- *pBuf = SK_FLOW_MODE_INDETERMINATED;
33127- break;
33128-
33129- case OID_SKGE_FLOWCTRL_STATUS:
33130- *pBuf = SK_FLOW_STAT_INDETERMINATED;
33131- break;
33132-
33133- case OID_SKGE_PHY_OPERATION_CAP:
33134- *pBuf = SK_MS_CAP_INDETERMINATED;
33135- break;
33136-
33137- case OID_SKGE_PHY_OPERATION_MODE:
33138- *pBuf = SK_MS_MODE_INDETERMINATED;
33139- break;
33140-
33141- case OID_SKGE_PHY_OPERATION_STATUS:
33142- *pBuf = SK_MS_STAT_INDETERMINATED;
33143- break;
33144- case OID_SKGE_SPEED_CAP:
33145- *pBuf = SK_LSPEED_CAP_INDETERMINATED;
33146- break;
33147-
33148- case OID_SKGE_SPEED_MODE:
33149- *pBuf = SK_LSPEED_INDETERMINATED;
33150- break;
33151-
33152- case OID_SKGE_SPEED_STATUS:
33153- *pBuf = SK_LSPEED_STAT_INDETERMINATED;
33154- break;
33155- }
33156- }
33157-}
33158-
33159-/*****************************************************************************
33160- *
33161- * CalculateLinkStatus - Determins the link status of a physical port
33162- *
33163- * Description:
33164- * Determins the link status the following way:
33165- * LSTAT_PHY_DOWN: Link is down
33166- * LSTAT_AUTONEG: Auto-negotiation failed
33167- * LSTAT_LOG_DOWN: Link is up but RLMT did not yet put the port
33168- * logically up.
33169- * LSTAT_LOG_UP: RLMT marked the port as up
33170- *
33171- * Returns:
33172- * Link status of physical port
33173- */
33174-PNMI_STATIC SK_U8 CalculateLinkStatus(
33175-SK_AC *pAC, /* Pointer to adapter context */
33176-SK_IOC IoC, /* IO context handle */
33177-unsigned int PhysPortIndex) /* Physical port index */
33178-{
33179- SK_U8 Result;
33180-
33181- if (!pAC->GIni.GP[PhysPortIndex].PHWLinkUp) {
33182-
33183- Result = SK_PNMI_RLMT_LSTAT_PHY_DOWN;
33184- }
33185- else if (pAC->GIni.GP[PhysPortIndex].PAutoNegFail > 0) {
33186-
33187- Result = SK_PNMI_RLMT_LSTAT_AUTONEG;
33188- }
33189- else if (!pAC->Rlmt.Port[PhysPortIndex].PortDown) {
33190-
33191- Result = SK_PNMI_RLMT_LSTAT_LOG_UP;
33192- }
33193- else {
33194- Result = SK_PNMI_RLMT_LSTAT_LOG_DOWN;
33195- }
33196-
33197- return (Result);
33198-}
33199-
33200-/*****************************************************************************
33201- *
33202- * CalculateLinkModeStatus - Determins the link mode status of a phys. port
33203- *
33204- * Description:
33205- * The COMMON module only tells us if the mode is half or full duplex.
33206- * But in the decade of auto sensing it is useful for the user to
33207- * know if the mode was negotiated or forced. Therefore we have a
33208- * look to the mode, which was last used by the negotiation process.
33209- *
33210- * Returns:
33211- * The link mode status
33212- */
33213-PNMI_STATIC SK_U8 CalculateLinkModeStatus(
33214-SK_AC *pAC, /* Pointer to adapter context */
33215-SK_IOC IoC, /* IO context handle */
33216-unsigned int PhysPortIndex) /* Physical port index */
33217-{
33218- SK_U8 Result;
33219-
33220- /* Get the current mode, which can be full or half duplex */
33221- Result = pAC->GIni.GP[PhysPortIndex].PLinkModeStatus;
33222-
33223- /* Check if no valid mode could be found (link is down) */
33224- if (Result < SK_LMODE_STAT_HALF) {
33225-
33226- Result = SK_LMODE_STAT_UNKNOWN;
33227- }
33228- else if (pAC->GIni.GP[PhysPortIndex].PLinkMode >= SK_LMODE_AUTOHALF) {
33229-
33230- /*
33231- * Auto-negotiation was used to bring up the link. Change
33232- * the already found duplex status that it indicates
33233- * auto-negotiation was involved.
33234- */
33235- if (Result == SK_LMODE_STAT_HALF) {
33236-
33237- Result = SK_LMODE_STAT_AUTOHALF;
33238- }
33239- else if (Result == SK_LMODE_STAT_FULL) {
33240-
33241- Result = SK_LMODE_STAT_AUTOFULL;
33242- }
33243- }
33244-
33245- return (Result);
33246-}
33247-
33248-/*****************************************************************************
33249- *
33250- * GetVpdKeyArr - Obtain an array of VPD keys
33251- *
33252- * Description:
33253- * Read the VPD keys and build an array of VPD keys, which are
33254- * easy to access.
33255- *
33256- * Returns:
33257- * SK_PNMI_ERR_OK Task successfully performed.
33258- * SK_PNMI_ERR_GENERAL Something went wrong.
33259- */
33260-PNMI_STATIC int GetVpdKeyArr(
33261-SK_AC *pAC, /* Pointer to adapter context */
33262-SK_IOC IoC, /* IO context handle */
33263-char *pKeyArr, /* Ptr KeyArray */
33264-unsigned int KeyArrLen, /* Length of array in bytes */
33265-unsigned int *pKeyNo) /* Number of keys */
33266-{
33267- unsigned int BufKeysLen = SK_PNMI_VPD_BUFSIZE;
33268- char BufKeys[SK_PNMI_VPD_BUFSIZE];
33269- unsigned int StartOffset;
33270- unsigned int Offset;
33271- int Index;
33272- int Ret;
33273-
33274-
33275- SK_MEMSET(pKeyArr, 0, KeyArrLen);
33276-
33277- /*
33278- * Get VPD key list
33279- */
33280- Ret = VpdKeys(pAC, IoC, (char *)&BufKeys, (int *)&BufKeysLen,
33281- (int *)pKeyNo);
33282- if (Ret > 0) {
33283-
33284- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR014,
33285- SK_PNMI_ERR014MSG);
33286-
33287- return (SK_PNMI_ERR_GENERAL);
33288- }
33289- /* If no keys are available return now */
33290- if (*pKeyNo == 0 || BufKeysLen == 0) {
33291-
33292- return (SK_PNMI_ERR_OK);
33293- }
33294- /*
33295- * If the key list is too long for us trunc it and give a
33296- * errorlog notification. This case should not happen because
33297- * the maximum number of keys is limited due to RAM limitations
33298- */
33299- if (*pKeyNo > SK_PNMI_VPD_ENTRIES) {
33300-
33301- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR015,
33302- SK_PNMI_ERR015MSG);
33303-
33304- *pKeyNo = SK_PNMI_VPD_ENTRIES;
33305- }
33306-
33307- /*
33308- * Now build an array of fixed string length size and copy
33309- * the keys together.
33310- */
33311- for (Index = 0, StartOffset = 0, Offset = 0; Offset < BufKeysLen;
33312- Offset ++) {
33313-
33314- if (BufKeys[Offset] != 0) {
33315-
33316- continue;
33317- }
33318-
33319- if (Offset - StartOffset > SK_PNMI_VPD_KEY_SIZE) {
33320-
33321- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR016,
33322- SK_PNMI_ERR016MSG);
33323- return (SK_PNMI_ERR_GENERAL);
33324- }
33325-
33326- SK_STRNCPY(pKeyArr + Index * SK_PNMI_VPD_KEY_SIZE,
33327- &BufKeys[StartOffset], SK_PNMI_VPD_KEY_SIZE);
33328-
33329- Index ++;
33330- StartOffset = Offset + 1;
33331- }
33332-
33333- /* Last key not zero terminated? Get it anyway */
33334- if (StartOffset < Offset) {
33335-
33336- SK_STRNCPY(pKeyArr + Index * SK_PNMI_VPD_KEY_SIZE,
33337- &BufKeys[StartOffset], SK_PNMI_VPD_KEY_SIZE);
33338- }
33339-
33340- return (SK_PNMI_ERR_OK);
33341-}
33342-
33343-/*****************************************************************************
33344- *
33345- * SirqUpdate - Let the SIRQ update its internal values
33346- *
33347- * Description:
33348- * Just to be sure that the SIRQ module holds its internal data
33349- * structures up to date, we send an update event before we make
33350- * any access.
33351- *
33352- * Returns:
33353- * SK_PNMI_ERR_OK Task successfully performed.
33354- * SK_PNMI_ERR_GENERAL Something went wrong.
33355- */
33356-PNMI_STATIC int SirqUpdate(
33357-SK_AC *pAC, /* Pointer to adapter context */
33358-SK_IOC IoC) /* IO context handle */
33359-{
33360- SK_EVPARA EventParam;
33361-
33362-
33363- /* Was the module already updated during the current PNMI call? */
33364- if (pAC->Pnmi.SirqUpdatedFlag > 0) {
33365-
33366- return (SK_PNMI_ERR_OK);
33367- }
33368-
33369- /* Send an synchronuous update event to the module */
33370- SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
33371- if (SkGeSirqEvent(pAC, IoC, SK_HWEV_UPDATE_STAT, EventParam) > 0) {
33372-
33373- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR047,
33374- SK_PNMI_ERR047MSG);
33375-
33376- return (SK_PNMI_ERR_GENERAL);
33377- }
33378-
33379- return (SK_PNMI_ERR_OK);
33380-}
33381-
33382-/*****************************************************************************
33383- *
33384- * RlmtUpdate - Let the RLMT update its internal values
33385- *
33386- * Description:
33387- * Just to be sure that the RLMT module holds its internal data
33388- * structures up to date, we send an update event before we make
33389- * any access.
33390- *
33391- * Returns:
33392- * SK_PNMI_ERR_OK Task successfully performed.
33393- * SK_PNMI_ERR_GENERAL Something went wrong.
33394- */
33395-PNMI_STATIC int RlmtUpdate(
33396-SK_AC *pAC, /* Pointer to adapter context */
33397-SK_IOC IoC, /* IO context handle */
33398-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
33399-{
33400- SK_EVPARA EventParam;
33401-
33402-
33403- /* Was the module already updated during the current PNMI call? */
33404- if (pAC->Pnmi.RlmtUpdatedFlag > 0) {
33405-
33406- return (SK_PNMI_ERR_OK);
33407- }
33408-
33409- /* Send an synchronuous update event to the module */
33410- SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
33411- EventParam.Para32[0] = NetIndex;
33412- EventParam.Para32[1] = (SK_U32)-1;
33413- if (SkRlmtEvent(pAC, IoC, SK_RLMT_STATS_UPDATE, EventParam) > 0) {
33414-
33415- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR048,
33416- SK_PNMI_ERR048MSG);
33417-
33418- return (SK_PNMI_ERR_GENERAL);
33419- }
33420-
33421- return (SK_PNMI_ERR_OK);
33422-}
33423-
33424-/*****************************************************************************
33425- *
33426- * MacUpdate - Force the XMAC to output the current statistic
33427- *
33428- * Description:
33429- * The XMAC holds its statistic internally. To obtain the current
33430- * values we must send a command so that the statistic data will
33431- * be written to a predefined memory area on the adapter.
33432- *
33433- * Returns:
33434- * SK_PNMI_ERR_OK Task successfully performed.
33435- * SK_PNMI_ERR_GENERAL Something went wrong.
33436- */
33437-PNMI_STATIC int MacUpdate(
33438-SK_AC *pAC, /* Pointer to adapter context */
33439-SK_IOC IoC, /* IO context handle */
33440-unsigned int FirstMac, /* Index of the first Mac to be updated */
33441-unsigned int LastMac) /* Index of the last Mac to be updated */
33442-{
33443- unsigned int MacIndex;
33444-
33445- /*
33446- * Were the statistics already updated during the
33447- * current PNMI call?
33448- */
33449- if (pAC->Pnmi.MacUpdatedFlag > 0) {
33450-
33451- return (SK_PNMI_ERR_OK);
33452- }
33453-
33454- /* Send an update command to all MACs specified */
33455- for (MacIndex = FirstMac; MacIndex <= LastMac; MacIndex ++) {
33456-
33457- /*
33458- * 2002-09-13 pweber: Freeze the current SW counters.
33459- * (That should be done as close as
33460- * possible to the update of the
33461- * HW counters)
33462- */
33463- if (pAC->GIni.GIMacType == SK_MAC_XMAC) {
33464- pAC->Pnmi.BufPort[MacIndex] = pAC->Pnmi.Port[MacIndex];
33465- }
33466-
33467- /* 2002-09-13 pweber: Update the HW counter */
33468- if (pAC->GIni.GIFunc.pFnMacUpdateStats(pAC, IoC, MacIndex) != 0) {
33469-
33470- return (SK_PNMI_ERR_GENERAL);
33471- }
33472- }
33473-
33474- return (SK_PNMI_ERR_OK);
33475-}
33476-
33477-/*****************************************************************************
33478- *
33479- * GetStatVal - Retrieve an XMAC statistic counter
33480- *
33481- * Description:
33482- * Retrieves the statistic counter of a virtual or physical port. The
33483- * virtual port is identified by the index 0. It consists of all
33484- * currently active ports. To obtain the counter value for this port
33485- * we must add the statistic counter of all active ports. To grant
33486- * continuous counter values for the virtual port even when port
33487- * switches occur we must additionally add a delta value, which was
33488- * calculated during a SK_PNMI_EVT_RLMT_ACTIVE_UP event.
33489- *
33490- * Returns:
33491- * Requested statistic value
33492- */
33493-PNMI_STATIC SK_U64 GetStatVal(
33494-SK_AC *pAC, /* Pointer to adapter context */
33495-SK_IOC IoC, /* IO context handle */
33496-unsigned int LogPortIndex, /* Index of the logical Port to be processed */
33497-unsigned int StatIndex, /* Index to statistic value */
33498-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
33499-{
33500- unsigned int PhysPortIndex;
33501- unsigned int PhysPortMax;
33502- SK_U64 Val = 0;
33503-
33504-
33505- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */
33506-
33507- PhysPortIndex = NetIndex;
33508-
33509- Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex);
33510- }
33511- else { /* Single Net mode */
33512-
33513- if (LogPortIndex == 0) {
33514-
33515- PhysPortMax = pAC->GIni.GIMacsFound;
33516-
33517- /* Add counter of all active ports */
33518- for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;
33519- PhysPortIndex ++) {
33520-
33521- if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
33522-
33523- Val += GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex);
33524- }
33525- }
33526-
33527- /* Correct value because of port switches */
33528- Val += pAC->Pnmi.VirtualCounterOffset[StatIndex];
33529- }
33530- else {
33531- /* Get counter value of physical port */
33532- PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
33533-
33534- Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex);
33535- }
33536- }
33537- return (Val);
33538-}
33539-
33540-/*****************************************************************************
33541- *
33542- * GetPhysStatVal - Get counter value for physical port
33543- *
33544- * Description:
33545- * Builds a 64bit counter value. Except for the octet counters
33546- * the lower 32bit are counted in hardware and the upper 32bit
33547- * in software by monitoring counter overflow interrupts in the
33548- * event handler. To grant continous counter values during XMAC
33549- * resets (caused by a workaround) we must add a delta value.
33550- * The delta was calculated in the event handler when a
33551- * SK_PNMI_EVT_XMAC_RESET was received.
33552- *
33553- * Returns:
33554- * Counter value
33555- */
33556-PNMI_STATIC SK_U64 GetPhysStatVal(
33557-SK_AC *pAC, /* Pointer to adapter context */
33558-SK_IOC IoC, /* IO context handle */
33559-unsigned int PhysPortIndex, /* Index of the logical Port to be processed */
33560-unsigned int StatIndex) /* Index to statistic value */
33561-{
33562- SK_U64 Val = 0;
33563- SK_U32 LowVal = 0;
33564- SK_U32 HighVal = 0;
33565- SK_U16 Word;
33566- int MacType;
33567- unsigned int HelpIndex;
33568- SK_GEPORT *pPrt;
33569-
33570- SK_PNMI_PORT *pPnmiPrt;
33571- SK_GEMACFUNC *pFnMac;
33572-
33573- pPrt = &pAC->GIni.GP[PhysPortIndex];
33574-
33575- MacType = pAC->GIni.GIMacType;
33576-
33577- /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */
33578- if (MacType == SK_MAC_XMAC) {
33579- pPnmiPrt = &pAC->Pnmi.BufPort[PhysPortIndex];
33580- }
33581- else {
33582- pPnmiPrt = &pAC->Pnmi.Port[PhysPortIndex];
33583- }
33584-
33585- pFnMac = &pAC->GIni.GIFunc;
33586-
33587- switch (StatIndex) {
33588- case SK_PNMI_HTX:
33589- if (MacType == SK_MAC_GMAC) {
33590- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33591- StatAddr[SK_PNMI_HTX_BROADCAST][MacType].Reg,
33592- &LowVal);
33593- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33594- StatAddr[SK_PNMI_HTX_MULTICAST][MacType].Reg,
33595- &HighVal);
33596- LowVal += HighVal;
33597- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33598- StatAddr[SK_PNMI_HTX_UNICAST][MacType].Reg,
33599- &HighVal);
33600- LowVal += HighVal;
33601- }
33602- else {
33603- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33604- StatAddr[StatIndex][MacType].Reg,
33605- &LowVal);
33606- }
33607- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33608- break;
33609-
33610- case SK_PNMI_HRX:
33611- if (MacType == SK_MAC_GMAC) {
33612- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33613- StatAddr[SK_PNMI_HRX_BROADCAST][MacType].Reg,
33614- &LowVal);
33615- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33616- StatAddr[SK_PNMI_HRX_MULTICAST][MacType].Reg,
33617- &HighVal);
33618- LowVal += HighVal;
33619- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33620- StatAddr[SK_PNMI_HRX_UNICAST][MacType].Reg,
33621- &HighVal);
33622- LowVal += HighVal;
33623- }
33624- else {
33625- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33626- StatAddr[StatIndex][MacType].Reg,
33627- &LowVal);
33628- }
33629- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33630- break;
33631-
33632- case SK_PNMI_HTX_OCTET:
33633- case SK_PNMI_HRX_OCTET:
33634- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33635- StatAddr[StatIndex][MacType].Reg,
33636- &HighVal);
33637- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33638- StatAddr[StatIndex + 1][MacType].Reg,
33639- &LowVal);
33640- break;
33641-
33642- case SK_PNMI_HTX_BURST:
33643- case SK_PNMI_HTX_EXCESS_DEF:
33644- case SK_PNMI_HTX_CARRIER:
33645- /* Not supported by GMAC */
33646- if (MacType == SK_MAC_GMAC) {
33647- return (Val);
33648- }
33649-
33650- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33651- StatAddr[StatIndex][MacType].Reg,
33652- &LowVal);
33653- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33654- break;
33655-
33656- case SK_PNMI_HTX_MACC:
33657- /* GMAC only supports PAUSE MAC control frames */
33658- if (MacType == SK_MAC_GMAC) {
33659- HelpIndex = SK_PNMI_HTX_PMACC;
33660- }
33661- else {
33662- HelpIndex = StatIndex;
33663- }
33664-
33665- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33666- StatAddr[HelpIndex][MacType].Reg,
33667- &LowVal);
33668-
33669- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33670- break;
33671-
33672- case SK_PNMI_HTX_COL:
33673- case SK_PNMI_HRX_UNDERSIZE:
33674- /* Not supported by XMAC */
33675- if (MacType == SK_MAC_XMAC) {
33676- return (Val);
33677- }
33678-
33679- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33680- StatAddr[StatIndex][MacType].Reg,
33681- &LowVal);
33682- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33683- break;
33684-
33685- case SK_PNMI_HTX_DEFFERAL:
33686- /* Not supported by GMAC */
33687- if (MacType == SK_MAC_GMAC) {
33688- return (Val);
33689- }
33690-
33691- /*
33692- * XMAC counts frames with deferred transmission
33693- * even in full-duplex mode.
33694- *
33695- * In full-duplex mode the counter remains constant!
33696- */
33697- if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOFULL) ||
33698- (pPrt->PLinkModeStatus == SK_LMODE_STAT_FULL)) {
33699-
33700- LowVal = 0;
33701- HighVal = 0;
33702- }
33703- else {
33704- /* Otherwise get contents of hardware register */
33705- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33706- StatAddr[StatIndex][MacType].Reg,
33707- &LowVal);
33708- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33709- }
33710- break;
33711-
33712- case SK_PNMI_HRX_BADOCTET:
33713- /* Not supported by XMAC */
33714- if (MacType == SK_MAC_XMAC) {
33715- return (Val);
33716- }
33717-
33718- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33719- StatAddr[StatIndex][MacType].Reg,
33720- &HighVal);
33721- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33722- StatAddr[StatIndex + 1][MacType].Reg,
33723- &LowVal);
33724- break;
33725-
33726- case SK_PNMI_HTX_OCTETLOW:
33727- case SK_PNMI_HRX_OCTETLOW:
33728- case SK_PNMI_HRX_BADOCTETLOW:
33729- return (Val);
33730-
33731- case SK_PNMI_HRX_LONGFRAMES:
33732- /* For XMAC the SW counter is managed by PNMI */
33733- if (MacType == SK_MAC_XMAC) {
33734- return (pPnmiPrt->StatRxLongFrameCts);
33735- }
33736-
33737- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33738- StatAddr[StatIndex][MacType].Reg,
33739- &LowVal);
33740- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33741- break;
33742-
33743- case SK_PNMI_HRX_TOO_LONG:
33744- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33745- StatAddr[StatIndex][MacType].Reg,
33746- &LowVal);
33747- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33748-
33749- Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal);
33750-
33751- if (MacType == SK_MAC_GMAC) {
33752- /* For GMAC the SW counter is additionally managed by PNMI */
33753- Val += pPnmiPrt->StatRxFrameTooLongCts;
33754- }
33755- else {
33756- /*
33757- * Frames longer than IEEE 802.3 frame max size are counted
33758- * by XMAC in frame_too_long counter even reception of long
33759- * frames was enabled and the frame was correct.
33760- * So correct the value by subtracting RxLongFrame counter.
33761- */
33762- Val -= pPnmiPrt->StatRxLongFrameCts;
33763- }
33764-
33765- LowVal = (SK_U32)Val;
33766- HighVal = (SK_U32)(Val >> 32);
33767- break;
33768-
33769- case SK_PNMI_HRX_SHORTS:
33770- /* Not supported by GMAC */
33771- if (MacType == SK_MAC_GMAC) {
33772- /* GM_RXE_FRAG?? */
33773- return (Val);
33774- }
33775-
33776- /*
33777- * XMAC counts short frame errors even if link down (#10620)
33778- *
33779- * If link-down the counter remains constant
33780- */
33781- if (pPrt->PLinkModeStatus != SK_LMODE_STAT_UNKNOWN) {
33782-
33783- /* Otherwise get incremental difference */
33784- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33785- StatAddr[StatIndex][MacType].Reg,
33786- &LowVal);
33787- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33788-
33789- Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal);
33790- Val -= pPnmiPrt->RxShortZeroMark;
33791-
33792- LowVal = (SK_U32)Val;
33793- HighVal = (SK_U32)(Val >> 32);
33794- }
33795- break;
33796-
33797- case SK_PNMI_HRX_MACC:
33798- case SK_PNMI_HRX_MACC_UNKWN:
33799- case SK_PNMI_HRX_BURST:
33800- case SK_PNMI_HRX_MISSED:
33801- case SK_PNMI_HRX_FRAMING:
33802- case SK_PNMI_HRX_CARRIER:
33803- case SK_PNMI_HRX_IRLENGTH:
33804- case SK_PNMI_HRX_SYMBOL:
33805- case SK_PNMI_HRX_CEXT:
33806- /* Not supported by GMAC */
33807- if (MacType == SK_MAC_GMAC) {
33808- return (Val);
33809- }
33810-
33811- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33812- StatAddr[StatIndex][MacType].Reg,
33813- &LowVal);
33814- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33815- break;
33816-
33817- case SK_PNMI_HRX_PMACC_ERR:
33818- /* For GMAC the SW counter is managed by PNMI */
33819- if (MacType == SK_MAC_GMAC) {
33820- return (pPnmiPrt->StatRxPMaccErr);
33821- }
33822-
33823- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33824- StatAddr[StatIndex][MacType].Reg,
33825- &LowVal);
33826- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33827- break;
33828-
33829- /* SW counter managed by PNMI */
33830- case SK_PNMI_HTX_SYNC:
33831- LowVal = (SK_U32)pPnmiPrt->StatSyncCts;
33832- HighVal = (SK_U32)(pPnmiPrt->StatSyncCts >> 32);
33833- break;
33834-
33835- /* SW counter managed by PNMI */
33836- case SK_PNMI_HTX_SYNC_OCTET:
33837- LowVal = (SK_U32)pPnmiPrt->StatSyncOctetsCts;
33838- HighVal = (SK_U32)(pPnmiPrt->StatSyncOctetsCts >> 32);
33839- break;
33840-
33841- case SK_PNMI_HRX_FCS:
33842- /*
33843- * Broadcom filters FCS errors and counts it in
33844- * Receive Error Counter register
33845- */
33846- if (pPrt->PhyType == SK_PHY_BCOM) {
33847- /* do not read while not initialized (PHY_READ hangs!)*/
33848- if (pPrt->PState != SK_PRT_RESET) {
33849- SkXmPhyRead(pAC, IoC, PhysPortIndex, PHY_BCOM_RE_CTR, &Word);
33850-
33851- LowVal = Word;
33852- }
33853- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33854- }
33855- else {
33856- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33857- StatAddr[StatIndex][MacType].Reg,
33858- &LowVal);
33859- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33860- }
33861- break;
33862-
33863- default:
33864- (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,
33865- StatAddr[StatIndex][MacType].Reg,
33866- &LowVal);
33867- HighVal = pPnmiPrt->CounterHigh[StatIndex];
33868- break;
33869- }
33870-
33871- Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal);
33872-
33873- /* Correct value because of possible XMAC reset. XMAC Errata #2 */
33874- Val += pPnmiPrt->CounterOffset[StatIndex];
33875-
33876- return (Val);
33877-}
33878-
33879-/*****************************************************************************
33880- *
33881- * ResetCounter - Set all counters and timestamps to zero
33882- *
33883- * Description:
33884- * Notifies other common modules which store statistic data to
33885- * reset their counters and finally reset our own counters.
33886- *
33887- * Returns:
33888- * Nothing
33889- */
33890-PNMI_STATIC void ResetCounter(
33891-SK_AC *pAC, /* Pointer to adapter context */
33892-SK_IOC IoC, /* IO context handle */
33893-SK_U32 NetIndex)
33894-{
33895- unsigned int PhysPortIndex;
33896- SK_EVPARA EventParam;
33897-
33898-
33899- SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
33900-
33901- /* Notify sensor module */
33902- SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_CLEAR, EventParam);
33903-
33904- /* Notify RLMT module */
33905- EventParam.Para32[0] = NetIndex;
33906- EventParam.Para32[1] = (SK_U32)-1;
33907- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STATS_CLEAR, EventParam);
33908- EventParam.Para32[1] = 0;
33909-
33910- /* Notify SIRQ module */
33911- SkEventQueue(pAC, SKGE_HWAC, SK_HWEV_CLEAR_STAT, EventParam);
33912-
33913- /* Notify CSUM module */
33914-#ifdef SK_USE_CSUM
33915- EventParam.Para32[0] = NetIndex;
33916- EventParam.Para32[1] = (SK_U32)-1;
33917- SkEventQueue(pAC, SKGE_CSUM, SK_CSUM_EVENT_CLEAR_PROTO_STATS,
33918- EventParam);
33919-#endif /* SK_USE_CSUM */
33920-
33921- /* Clear XMAC statistic */
33922- for (PhysPortIndex = 0; PhysPortIndex <
33923- (unsigned int)pAC->GIni.GIMacsFound; PhysPortIndex ++) {
33924-
33925- (void)pAC->GIni.GIFunc.pFnMacResetCounter(pAC, IoC, PhysPortIndex);
33926-
33927- SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].CounterHigh,
33928- 0, sizeof(pAC->Pnmi.Port[PhysPortIndex].CounterHigh));
33929- SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].
33930- CounterOffset, 0, sizeof(pAC->Pnmi.Port[
33931- PhysPortIndex].CounterOffset));
33932- SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].StatSyncCts,
33933- 0, sizeof(pAC->Pnmi.Port[PhysPortIndex].StatSyncCts));
33934- SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].
33935- StatSyncOctetsCts, 0, sizeof(pAC->Pnmi.Port[
33936- PhysPortIndex].StatSyncOctetsCts));
33937- SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].
33938- StatRxLongFrameCts, 0, sizeof(pAC->Pnmi.Port[
33939- PhysPortIndex].StatRxLongFrameCts));
33940- SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].
33941- StatRxFrameTooLongCts, 0, sizeof(pAC->Pnmi.Port[
33942- PhysPortIndex].StatRxFrameTooLongCts));
33943- SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].
33944- StatRxPMaccErr, 0, sizeof(pAC->Pnmi.Port[
33945- PhysPortIndex].StatRxPMaccErr));
33946- }
33947-
33948- /*
33949- * Clear local statistics
33950- */
33951- SK_MEMSET((char *)&pAC->Pnmi.VirtualCounterOffset, 0,
33952- sizeof(pAC->Pnmi.VirtualCounterOffset));
33953- pAC->Pnmi.RlmtChangeCts = 0;
33954- pAC->Pnmi.RlmtChangeTime = 0;
33955- SK_MEMSET((char *)&pAC->Pnmi.RlmtChangeEstimate.EstValue[0], 0,
33956- sizeof(pAC->Pnmi.RlmtChangeEstimate.EstValue));
33957- pAC->Pnmi.RlmtChangeEstimate.EstValueIndex = 0;
33958- pAC->Pnmi.RlmtChangeEstimate.Estimate = 0;
33959- pAC->Pnmi.Port[NetIndex].TxSwQueueMax = 0;
33960- pAC->Pnmi.Port[NetIndex].TxRetryCts = 0;
33961- pAC->Pnmi.Port[NetIndex].RxIntrCts = 0;
33962- pAC->Pnmi.Port[NetIndex].TxIntrCts = 0;
33963- pAC->Pnmi.Port[NetIndex].RxNoBufCts = 0;
33964- pAC->Pnmi.Port[NetIndex].TxNoBufCts = 0;
33965- pAC->Pnmi.Port[NetIndex].TxUsedDescrNo = 0;
33966- pAC->Pnmi.Port[NetIndex].RxDeliveredCts = 0;
33967- pAC->Pnmi.Port[NetIndex].RxOctetsDeliveredCts = 0;
33968- pAC->Pnmi.Port[NetIndex].ErrRecoveryCts = 0;
33969-}
33970-
33971-/*****************************************************************************
33972- *
33973- * GetTrapEntry - Get an entry in the trap buffer
33974- *
33975- * Description:
33976- * The trap buffer stores various events. A user application somehow
33977- * gets notified that an event occured and retrieves the trap buffer
33978- * contens (or simply polls the buffer). The buffer is organized as
33979- * a ring which stores the newest traps at the beginning. The oldest
33980- * traps are overwritten by the newest ones. Each trap entry has a
33981- * unique number, so that applications may detect new trap entries.
33982- *
33983- * Returns:
33984- * A pointer to the trap entry
33985- */
33986-PNMI_STATIC char* GetTrapEntry(
33987-SK_AC *pAC, /* Pointer to adapter context */
33988-SK_U32 TrapId, /* SNMP ID of the trap */
33989-unsigned int Size) /* Space needed for trap entry */
33990-{
33991- unsigned int BufPad = pAC->Pnmi.TrapBufPad;
33992- unsigned int BufFree = pAC->Pnmi.TrapBufFree;
33993- unsigned int Beg = pAC->Pnmi.TrapQueueBeg;
33994- unsigned int End = pAC->Pnmi.TrapQueueEnd;
33995- char *pBuf = &pAC->Pnmi.TrapBuf[0];
33996- int Wrap;
33997- unsigned int NeededSpace;
33998- unsigned int EntrySize;
33999- SK_U32 Val32;
34000- SK_U64 Val64;
34001-
34002-
34003- /* Last byte of entry will get a copy of the entry length */
34004- Size ++;
34005-
34006- /*
34007- * Calculate needed buffer space */
34008- if (Beg >= Size) {
34009-
34010- NeededSpace = Size;
34011- Wrap = SK_FALSE;
34012- }
34013- else {
34014- NeededSpace = Beg + Size;
34015- Wrap = SK_TRUE;
34016- }
34017-
34018- /*
34019- * Check if enough buffer space is provided. Otherwise
34020- * free some entries. Leave one byte space between begin
34021- * and end of buffer to make it possible to detect whether
34022- * the buffer is full or empty
34023- */
34024- while (BufFree < NeededSpace + 1) {
34025-
34026- if (End == 0) {
34027-
34028- End = SK_PNMI_TRAP_QUEUE_LEN;
34029- }
34030-
34031- EntrySize = (unsigned int)*((unsigned char *)pBuf + End - 1);
34032- BufFree += EntrySize;
34033- End -= EntrySize;
34034-#ifdef DEBUG
34035- SK_MEMSET(pBuf + End, (char)(-1), EntrySize);
34036-#endif /* DEBUG */
34037- if (End == BufPad) {
34038-#ifdef DEBUG
34039- SK_MEMSET(pBuf, (char)(-1), End);
34040-#endif /* DEBUG */
34041- BufFree += End;
34042- End = 0;
34043- BufPad = 0;
34044- }
34045- }
34046-
34047- /*
34048- * Insert new entry as first entry. Newest entries are
34049- * stored at the beginning of the queue.
34050- */
34051- if (Wrap) {
34052-
34053- BufPad = Beg;
34054- Beg = SK_PNMI_TRAP_QUEUE_LEN - Size;
34055- }
34056- else {
34057- Beg = Beg - Size;
34058- }
34059- BufFree -= NeededSpace;
34060-
34061- /* Save the current offsets */
34062- pAC->Pnmi.TrapQueueBeg = Beg;
34063- pAC->Pnmi.TrapQueueEnd = End;
34064- pAC->Pnmi.TrapBufPad = BufPad;
34065- pAC->Pnmi.TrapBufFree = BufFree;
34066-
34067- /* Initialize the trap entry */
34068- *(pBuf + Beg + Size - 1) = (char)Size;
34069- *(pBuf + Beg) = (char)Size;
34070- Val32 = (pAC->Pnmi.TrapUnique) ++;
34071- SK_PNMI_STORE_U32(pBuf + Beg + 1, Val32);
34072- SK_PNMI_STORE_U32(pBuf + Beg + 1 + sizeof(SK_U32), TrapId);
34073- Val64 = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));
34074- SK_PNMI_STORE_U64(pBuf + Beg + 1 + 2 * sizeof(SK_U32), Val64);
34075-
34076- return (pBuf + Beg);
34077-}
34078-
34079-/*****************************************************************************
34080- *
34081- * CopyTrapQueue - Copies the trap buffer for the TRAP OID
34082- *
34083- * Description:
34084- * On a query of the TRAP OID the trap buffer contents will be
34085- * copied continuously to the request buffer, which must be large
34086- * enough. No length check is performed.
34087- *
34088- * Returns:
34089- * Nothing
34090- */
34091-PNMI_STATIC void CopyTrapQueue(
34092-SK_AC *pAC, /* Pointer to adapter context */
34093-char *pDstBuf) /* Buffer to which the queued traps will be copied */
34094-{
34095- unsigned int BufPad = pAC->Pnmi.TrapBufPad;
34096- unsigned int Trap = pAC->Pnmi.TrapQueueBeg;
34097- unsigned int End = pAC->Pnmi.TrapQueueEnd;
34098- char *pBuf = &pAC->Pnmi.TrapBuf[0];
34099- unsigned int Len;
34100- unsigned int DstOff = 0;
34101-
34102-
34103- while (Trap != End) {
34104-
34105- Len = (unsigned int)*(pBuf + Trap);
34106-
34107- /*
34108- * Last byte containing a copy of the length will
34109- * not be copied.
34110- */
34111- *(pDstBuf + DstOff) = (char)(Len - 1);
34112- SK_MEMCPY(pDstBuf + DstOff + 1, pBuf + Trap + 1, Len - 2);
34113- DstOff += Len - 1;
34114-
34115- Trap += Len;
34116- if (Trap == SK_PNMI_TRAP_QUEUE_LEN) {
34117-
34118- Trap = BufPad;
34119- }
34120- }
34121-}
34122-
34123-/*****************************************************************************
34124- *
34125- * GetTrapQueueLen - Get the length of the trap buffer
34126- *
34127- * Description:
34128- * Evaluates the number of currently stored traps and the needed
34129- * buffer size to retrieve them.
34130- *
34131- * Returns:
34132- * Nothing
34133- */
34134-PNMI_STATIC void GetTrapQueueLen(
34135-SK_AC *pAC, /* Pointer to adapter context */
34136-unsigned int *pLen, /* Length in Bytes of all queued traps */
34137-unsigned int *pEntries) /* Returns number of trapes stored in queue */
34138-{
34139- unsigned int BufPad = pAC->Pnmi.TrapBufPad;
34140- unsigned int Trap = pAC->Pnmi.TrapQueueBeg;
34141- unsigned int End = pAC->Pnmi.TrapQueueEnd;
34142- char *pBuf = &pAC->Pnmi.TrapBuf[0];
34143- unsigned int Len;
34144- unsigned int Entries = 0;
34145- unsigned int TotalLen = 0;
34146-
34147-
34148- while (Trap != End) {
34149-
34150- Len = (unsigned int)*(pBuf + Trap);
34151- TotalLen += Len - 1;
34152- Entries ++;
34153-
34154- Trap += Len;
34155- if (Trap == SK_PNMI_TRAP_QUEUE_LEN) {
34156-
34157- Trap = BufPad;
34158- }
34159- }
34160-
34161- *pEntries = Entries;
34162- *pLen = TotalLen;
34163-}
34164-
34165-/*****************************************************************************
34166- *
34167- * QueueSimpleTrap - Store a simple trap to the trap buffer
34168- *
34169- * Description:
34170- * A simple trap is a trap with now additional data. It consists
34171- * simply of a trap code.
34172- *
34173- * Returns:
34174- * Nothing
34175- */
34176-PNMI_STATIC void QueueSimpleTrap(
34177-SK_AC *pAC, /* Pointer to adapter context */
34178-SK_U32 TrapId) /* Type of sensor trap */
34179-{
34180- GetTrapEntry(pAC, TrapId, SK_PNMI_TRAP_SIMPLE_LEN);
34181-}
34182-
34183-/*****************************************************************************
34184- *
34185- * QueueSensorTrap - Stores a sensor trap in the trap buffer
34186- *
34187- * Description:
34188- * Gets an entry in the trap buffer and fills it with sensor related
34189- * data.
34190- *
34191- * Returns:
34192- * Nothing
34193- */
34194-PNMI_STATIC void QueueSensorTrap(
34195-SK_AC *pAC, /* Pointer to adapter context */
34196-SK_U32 TrapId, /* Type of sensor trap */
34197-unsigned int SensorIndex) /* Index of sensor which caused the trap */
34198-{
34199- char *pBuf;
34200- unsigned int Offset;
34201- unsigned int DescrLen;
34202- SK_U32 Val32;
34203-
34204-
34205- /* Get trap buffer entry */
34206- DescrLen = SK_STRLEN(pAC->I2c.SenTable[SensorIndex].SenDesc);
34207- pBuf = GetTrapEntry(pAC, TrapId,
34208- SK_PNMI_TRAP_SENSOR_LEN_BASE + DescrLen);
34209- Offset = SK_PNMI_TRAP_SIMPLE_LEN;
34210-
34211- /* Store additionally sensor trap related data */
34212- Val32 = OID_SKGE_SENSOR_INDEX;
34213- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
34214- *(pBuf + Offset + 4) = 4;
34215- Val32 = (SK_U32)SensorIndex;
34216- SK_PNMI_STORE_U32(pBuf + Offset + 5, Val32);
34217- Offset += 9;
34218-
34219- Val32 = (SK_U32)OID_SKGE_SENSOR_DESCR;
34220- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
34221- *(pBuf + Offset + 4) = (char)DescrLen;
34222- SK_MEMCPY(pBuf + Offset + 5, pAC->I2c.SenTable[SensorIndex].SenDesc,
34223- DescrLen);
34224- Offset += DescrLen + 5;
34225-
34226- Val32 = OID_SKGE_SENSOR_TYPE;
34227- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
34228- *(pBuf + Offset + 4) = 1;
34229- *(pBuf + Offset + 5) = (char)pAC->I2c.SenTable[SensorIndex].SenType;
34230- Offset += 6;
34231-
34232- Val32 = OID_SKGE_SENSOR_VALUE;
34233- SK_PNMI_STORE_U32(pBuf + Offset, Val32);
34234- *(pBuf + Offset + 4) = 4;
34235- Val32 = (SK_U32)pAC->I2c.SenTable[SensorIndex].SenValue;
34236- SK_PNMI_STORE_U32(pBuf + Offset + 5, Val32);
34237-}
34238-
34239-/*****************************************************************************
34240- *
34241- * QueueRlmtNewMacTrap - Store a port switch trap in the trap buffer
34242- *
34243- * Description:
34244- * Nothing further to explain.
34245- *
34246- * Returns:
34247- * Nothing
34248- */
34249-PNMI_STATIC void QueueRlmtNewMacTrap(
34250-SK_AC *pAC, /* Pointer to adapter context */
34251-unsigned int ActiveMac) /* Index (0..n) of the currently active port */
34252-{
34253- char *pBuf;
34254- SK_U32 Val32;
34255-
34256-
34257- pBuf = GetTrapEntry(pAC, OID_SKGE_TRAP_RLMT_CHANGE_PORT,
34258- SK_PNMI_TRAP_RLMT_CHANGE_LEN);
34259-
34260- Val32 = OID_SKGE_RLMT_PORT_ACTIVE;
34261- SK_PNMI_STORE_U32(pBuf + SK_PNMI_TRAP_SIMPLE_LEN, Val32);
34262- *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 4) = 1;
34263- *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 5) = (char)ActiveMac;
34264-}
34265-
34266-/*****************************************************************************
34267- *
34268- * QueueRlmtPortTrap - Store port related RLMT trap to trap buffer
34269- *
34270- * Description:
34271- * Nothing further to explain.
34272- *
34273- * Returns:
34274- * Nothing
34275- */
34276-PNMI_STATIC void QueueRlmtPortTrap(
34277-SK_AC *pAC, /* Pointer to adapter context */
34278-SK_U32 TrapId, /* Type of RLMT port trap */
34279-unsigned int PortIndex) /* Index of the port, which changed its state */
34280-{
34281- char *pBuf;
34282- SK_U32 Val32;
34283-
34284-
34285- pBuf = GetTrapEntry(pAC, TrapId, SK_PNMI_TRAP_RLMT_PORT_LEN);
34286-
34287- Val32 = OID_SKGE_RLMT_PORT_INDEX;
34288- SK_PNMI_STORE_U32(pBuf + SK_PNMI_TRAP_SIMPLE_LEN, Val32);
34289- *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 4) = 1;
34290- *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 5) = (char)PortIndex;
34291-}
34292-
34293-/*****************************************************************************
34294- *
34295- * CopyMac - Copies a MAC address
34296- *
34297- * Description:
34298- * Nothing further to explain.
34299- *
34300- * Returns:
34301- * Nothing
34302- */
34303-PNMI_STATIC void CopyMac(
34304-char *pDst, /* Pointer to destination buffer */
34305-SK_MAC_ADDR *pMac) /* Pointer of Source */
34306-{
34307- int i;
34308-
34309-
34310- for (i = 0; i < sizeof(SK_MAC_ADDR); i ++) {
34311-
34312- *(pDst + i) = pMac->a[i];
34313- }
34314-}
34315-
34316-#ifdef SK_POWER_MGMT
34317-/*****************************************************************************
34318- *
34319- * PowerManagement - OID handler function of PowerManagement OIDs
34320- *
34321- * Description:
34322- * The code is simple. No description necessary.
34323- *
34324- * Returns:
34325- * SK_PNMI_ERR_OK The request was successfully performed.
34326- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
34327- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
34328- * the correct data (e.g. a 32bit value is
34329- * needed, but a 16 bit value was passed).
34330- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
34331- * exist (e.g. port instance 3 on a two port
34332- * adapter.
34333- */
34334-
34335-PNMI_STATIC int PowerManagement(
34336-SK_AC *pAC, /* Pointer to adapter context */
34337-SK_IOC IoC, /* IO context handle */
34338-int Action, /* Get/PreSet/Set action */
34339-SK_U32 Id, /* Object ID that is to be processed */
34340-char *pBuf, /* Buffer to which to mgmt data will be retrieved */
34341-unsigned int *pLen, /* On call: buffer length. On return: used buffer */
34342-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
34343-unsigned int TableIndex, /* Index to the Id table */
34344-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
34345-{
34346-
34347- SK_U32 RetCode = SK_PNMI_ERR_GENERAL;
34348-
34349- /*
34350- * Check instance. We only handle single instance variables
34351- */
34352- if (Instance != (SK_U32)(-1) && Instance != 1) {
34353-
34354- *pLen = 0;
34355- return (SK_PNMI_ERR_UNKNOWN_INST);
34356- }
34357-
34358-
34359- /* Check length */
34360- switch (Id) {
34361-
34362- case OID_PNP_CAPABILITIES:
34363- if (*pLen < sizeof(SK_PNP_CAPABILITIES)) {
34364-
34365- *pLen = sizeof(SK_PNP_CAPABILITIES);
34366- return (SK_PNMI_ERR_TOO_SHORT);
34367- }
34368- break;
34369-
34370- case OID_PNP_SET_POWER:
34371- case OID_PNP_QUERY_POWER:
34372- if (*pLen < sizeof(SK_DEVICE_POWER_STATE))
34373- {
34374- *pLen = sizeof(SK_DEVICE_POWER_STATE);
34375- return (SK_PNMI_ERR_TOO_SHORT);
34376- }
34377- break;
34378-
34379- case OID_PNP_ADD_WAKE_UP_PATTERN:
34380- case OID_PNP_REMOVE_WAKE_UP_PATTERN:
34381- if (*pLen < sizeof(SK_PM_PACKET_PATTERN)) {
34382-
34383- *pLen = sizeof(SK_PM_PACKET_PATTERN);
34384- return (SK_PNMI_ERR_TOO_SHORT);
34385- }
34386- break;
34387-
34388- case OID_PNP_ENABLE_WAKE_UP:
34389- if (*pLen < sizeof(SK_U32)) {
34390-
34391- *pLen = sizeof(SK_U32);
34392- return (SK_PNMI_ERR_TOO_SHORT);
34393- }
34394- break;
34395- }
34396-
34397- /*
34398- * Perform action
34399- */
34400- if (Action == SK_PNMI_GET) {
34401-
34402- /*
34403- * Get value
34404- */
34405- switch (Id) {
34406-
34407- case OID_PNP_CAPABILITIES:
34408- RetCode = SkPowerQueryPnPCapabilities(pAC, IoC, pBuf, pLen);
34409- break;
34410-
34411- case OID_PNP_QUERY_POWER:
34412- /* The Windows DDK describes: An OID_PNP_QUERY_POWER requests
34413- the miniport to indicate whether it can transition its NIC
34414- to the low-power state.
34415- A miniport driver must always return NDIS_STATUS_SUCCESS
34416- to a query of OID_PNP_QUERY_POWER. */
34417- *pLen = sizeof(SK_DEVICE_POWER_STATE);
34418- RetCode = SK_PNMI_ERR_OK;
34419- break;
34420-
34421- /* NDIS handles these OIDs as write-only.
34422- * So in case of get action the buffer with written length = 0
34423- * is returned
34424- */
34425- case OID_PNP_SET_POWER:
34426- case OID_PNP_ADD_WAKE_UP_PATTERN:
34427- case OID_PNP_REMOVE_WAKE_UP_PATTERN:
34428- *pLen = 0;
34429- RetCode = SK_PNMI_ERR_NOT_SUPPORTED;
34430- break;
34431-
34432- case OID_PNP_ENABLE_WAKE_UP:
34433- RetCode = SkPowerGetEnableWakeUp(pAC, IoC, pBuf, pLen);
34434- break;
34435-
34436- default:
34437- RetCode = SK_PNMI_ERR_GENERAL;
34438- break;
34439- }
34440-
34441- return (RetCode);
34442- }
34443-
34444-
34445- /*
34446- * Perform preset or set
34447- */
34448-
34449- /* POWER module does not support PRESET action */
34450- if (Action == SK_PNMI_PRESET) {
34451- return (SK_PNMI_ERR_OK);
34452- }
34453-
34454- switch (Id) {
34455- case OID_PNP_SET_POWER:
34456- RetCode = SkPowerSetPower(pAC, IoC, pBuf, pLen);
34457- break;
34458-
34459- case OID_PNP_ADD_WAKE_UP_PATTERN:
34460- RetCode = SkPowerAddWakeUpPattern(pAC, IoC, pBuf, pLen);
34461- break;
34462-
34463- case OID_PNP_REMOVE_WAKE_UP_PATTERN:
34464- RetCode = SkPowerRemoveWakeUpPattern(pAC, IoC, pBuf, pLen);
34465- break;
34466-
34467- case OID_PNP_ENABLE_WAKE_UP:
34468- RetCode = SkPowerSetEnableWakeUp(pAC, IoC, pBuf, pLen);
34469- break;
34470-
34471- default:
34472- RetCode = SK_PNMI_ERR_READ_ONLY;
34473- }
34474-
34475- return (RetCode);
34476-}
34477-#endif /* SK_POWER_MGMT */
34478-
34479-#ifdef SK_DIAG_SUPPORT
34480-/*****************************************************************************
34481- *
34482- * DiagActions - OID handler function of Diagnostic driver
34483- *
34484- * Description:
34485- * The code is simple. No description necessary.
34486- *
34487- * Returns:
34488- * SK_PNMI_ERR_OK The request was successfully performed.
34489- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
34490- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
34491- * the correct data (e.g. a 32bit value is
34492- * needed, but a 16 bit value was passed).
34493- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
34494- * exist (e.g. port instance 3 on a two port
34495- * adapter.
34496- */
34497-
34498-PNMI_STATIC int DiagActions(
34499-SK_AC *pAC, /* Pointer to adapter context */
34500-SK_IOC IoC, /* IO context handle */
34501-int Action, /* GET/PRESET/SET action */
34502-SK_U32 Id, /* Object ID that is to be processed */
34503-char *pBuf, /* Buffer used for the management data transfer */
34504-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
34505-SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
34506-unsigned int TableIndex, /* Index to the Id table */
34507-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
34508-{
34509-
34510- SK_U32 DiagStatus;
34511- SK_U32 RetCode = SK_PNMI_ERR_GENERAL;
34512-
34513- /*
34514- * Check instance. We only handle single instance variables.
34515- */
34516- if (Instance != (SK_U32)(-1) && Instance != 1) {
34517-
34518- *pLen = 0;
34519- return (SK_PNMI_ERR_UNKNOWN_INST);
34520- }
34521-
34522- /*
34523- * Check length.
34524- */
34525- switch (Id) {
34526-
34527- case OID_SKGE_DIAG_MODE:
34528- if (*pLen < sizeof(SK_U32)) {
34529-
34530- *pLen = sizeof(SK_U32);
34531- return (SK_PNMI_ERR_TOO_SHORT);
34532- }
34533- break;
34534-
34535- default:
34536- SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR040, SK_PNMI_ERR040MSG);
34537- *pLen = 0;
34538- return (SK_PNMI_ERR_GENERAL);
34539- }
34540-
34541- /* Perform action. */
34542-
34543- /* GET value. */
34544- if (Action == SK_PNMI_GET) {
34545-
34546- switch (Id) {
34547-
34548- case OID_SKGE_DIAG_MODE:
34549- DiagStatus = pAC->Pnmi.DiagAttached;
34550- SK_PNMI_STORE_U32(pBuf, DiagStatus);
34551- *pLen = sizeof(SK_U32);
34552- RetCode = SK_PNMI_ERR_OK;
34553- break;
34554-
34555- default:
34556- *pLen = 0;
34557- RetCode = SK_PNMI_ERR_GENERAL;
34558- break;
34559- }
34560- return (RetCode);
34561- }
34562-
34563- /* From here SET or PRESET value. */
34564-
34565- /* PRESET value is not supported. */
34566- if (Action == SK_PNMI_PRESET) {
34567- return (SK_PNMI_ERR_OK);
34568- }
34569-
34570- /* SET value. */
34571- switch (Id) {
34572- case OID_SKGE_DIAG_MODE:
34573-
34574- /* Handle the SET. */
34575- switch (*pBuf) {
34576-
34577- /* Attach the DIAG to this adapter. */
34578- case SK_DIAG_ATTACHED:
34579- /* Check if we come from running */
34580- if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {
34581-
34582- RetCode = SkDrvLeaveDiagMode(pAC);
34583-
34584- }
34585- else if (pAC->Pnmi.DiagAttached == SK_DIAG_IDLE) {
34586-
34587- RetCode = SK_PNMI_ERR_OK;
34588- }
34589-
34590- else {
34591-
34592- RetCode = SK_PNMI_ERR_GENERAL;
34593-
34594- }
34595-
34596- if (RetCode == SK_PNMI_ERR_OK) {
34597-
34598- pAC->Pnmi.DiagAttached = SK_DIAG_ATTACHED;
34599- }
34600- break;
34601-
34602- /* Enter the DIAG mode in the driver. */
34603- case SK_DIAG_RUNNING:
34604- RetCode = SK_PNMI_ERR_OK;
34605-
34606- /*
34607- * If DiagAttached is set, we can tell the driver
34608- * to enter the DIAG mode.
34609- */
34610- if (pAC->Pnmi.DiagAttached == SK_DIAG_ATTACHED) {
34611- /* If DiagMode is not active, we can enter it. */
34612- if (!pAC->DiagModeActive) {
34613-
34614- RetCode = SkDrvEnterDiagMode(pAC);
34615- }
34616- else {
34617-
34618- RetCode = SK_PNMI_ERR_GENERAL;
34619- }
34620- }
34621- else {
34622-
34623- RetCode = SK_PNMI_ERR_GENERAL;
34624- }
34625-
34626- if (RetCode == SK_PNMI_ERR_OK) {
34627-
34628- pAC->Pnmi.DiagAttached = SK_DIAG_RUNNING;
34629- }
34630- break;
34631-
34632- case SK_DIAG_IDLE:
34633- /* Check if we come from running */
34634- if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {
34635-
34636- RetCode = SkDrvLeaveDiagMode(pAC);
34637-
34638- }
34639- else if (pAC->Pnmi.DiagAttached == SK_DIAG_ATTACHED) {
34640-
34641- RetCode = SK_PNMI_ERR_OK;
34642- }
34643-
34644- else {
34645-
34646- RetCode = SK_PNMI_ERR_GENERAL;
34647-
34648- }
34649-
34650- if (RetCode == SK_PNMI_ERR_OK) {
34651-
34652- pAC->Pnmi.DiagAttached = SK_DIAG_IDLE;
34653- }
34654- break;
34655-
34656- default:
34657- RetCode = SK_PNMI_ERR_BAD_VALUE;
34658- break;
34659- }
34660- break;
34661-
34662- default:
34663- RetCode = SK_PNMI_ERR_GENERAL;
34664- }
34665-
34666- if (RetCode == SK_PNMI_ERR_OK) {
34667- *pLen = sizeof(SK_U32);
34668- }
34669- else {
34670-
34671- *pLen = 0;
34672- }
34673- return (RetCode);
34674-}
34675-#endif /* SK_DIAG_SUPPORT */
34676-
34677-/*****************************************************************************
34678- *
34679- * Vct - OID handler function of OIDs
34680- *
34681- * Description:
34682- * The code is simple. No description necessary.
34683- *
34684- * Returns:
34685- * SK_PNMI_ERR_OK The request was performed successfully.
34686- * SK_PNMI_ERR_GENERAL A general severe internal error occured.
34687- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain
34688- * the correct data (e.g. a 32bit value is
34689- * needed, but a 16 bit value was passed).
34690- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
34691- * exist (e.g. port instance 3 on a two port
34692- * adapter).
34693- * SK_PNMI_ERR_READ_ONLY Only the Get action is allowed.
34694- *
34695- */
34696-
34697-PNMI_STATIC int Vct(
34698-SK_AC *pAC, /* Pointer to adapter context */
34699-SK_IOC IoC, /* IO context handle */
34700-int Action, /* GET/PRESET/SET action */
34701-SK_U32 Id, /* Object ID that is to be processed */
34702-char *pBuf, /* Buffer used for the management data transfer */
34703-unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */
34704-SK_U32 Instance, /* Instance (-1,2..n) that is to be queried */
34705-unsigned int TableIndex, /* Index to the Id table */
34706-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
34707-{
34708- SK_GEPORT *pPrt;
34709- SK_PNMI_VCT *pVctBackupData;
34710- SK_U32 LogPortMax;
34711- SK_U32 PhysPortMax;
34712- SK_U32 PhysPortIndex;
34713- SK_U32 Limit;
34714- SK_U32 Offset;
34715- SK_BOOL Link;
34716- SK_U32 RetCode = SK_PNMI_ERR_GENERAL;
34717- int i;
34718- SK_EVPARA Para;
34719- SK_U32 CableLength;
34720-
34721- /*
34722- * Calculate the port indexes from the instance.
34723- */
34724- PhysPortMax = pAC->GIni.GIMacsFound;
34725- LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);
34726-
34727- /* Dual net mode? */
34728- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
34729- LogPortMax--;
34730- }
34731-
34732- if ((Instance != (SK_U32) (-1))) {
34733- /* Check instance range. */
34734- if ((Instance < 2) || (Instance > LogPortMax)) {
34735- *pLen = 0;
34736- return (SK_PNMI_ERR_UNKNOWN_INST);
34737- }
34738-
34739- if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {
34740- PhysPortIndex = NetIndex;
34741- }
34742- else {
34743- PhysPortIndex = Instance - 2;
34744- }
34745- Limit = PhysPortIndex + 1;
34746- }
34747- else {
34748- /*
34749- * Instance == (SK_U32) (-1), get all Instances of that OID.
34750- *
34751- * Not implemented yet. May be used in future releases.
34752- */
34753- PhysPortIndex = 0;
34754- Limit = PhysPortMax;
34755- }
34756-
34757- pPrt = &pAC->GIni.GP[PhysPortIndex];
34758- if (pPrt->PHWLinkUp) {
34759- Link = SK_TRUE;
34760- }
34761- else {
34762- Link = SK_FALSE;
34763- }
34764-
34765- /* Check MAC type */
34766- if (pPrt->PhyType != SK_PHY_MARV_COPPER) {
34767- *pLen = 0;
34768- return (SK_PNMI_ERR_GENERAL);
34769- }
34770-
34771- /* Initialize backup data pointer. */
34772- pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex];
34773-
34774- /* Check action type */
34775- if (Action == SK_PNMI_GET) {
34776- /* Check length */
34777- switch (Id) {
34778-
34779- case OID_SKGE_VCT_GET:
34780- if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_PNMI_VCT)) {
34781- *pLen = (Limit - PhysPortIndex) * sizeof(SK_PNMI_VCT);
34782- return (SK_PNMI_ERR_TOO_SHORT);
34783- }
34784- break;
34785-
34786- case OID_SKGE_VCT_STATUS:
34787- if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U8)) {
34788- *pLen = (Limit - PhysPortIndex) * sizeof(SK_U8);
34789- return (SK_PNMI_ERR_TOO_SHORT);
34790- }
34791- break;
34792-
34793- default:
34794- *pLen = 0;
34795- return (SK_PNMI_ERR_GENERAL);
34796- }
34797-
34798- /* Get value */
34799- Offset = 0;
34800- for (; PhysPortIndex < Limit; PhysPortIndex++) {
34801- switch (Id) {
34802-
34803- case OID_SKGE_VCT_GET:
34804- if ((Link == SK_FALSE) &&
34805- (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING)) {
34806- RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE);
34807- if (RetCode == 0) {
34808- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_PENDING;
34809- pAC->Pnmi.VctStatus[PhysPortIndex] |=
34810- (SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_TEST_DONE);
34811-
34812- /* Copy results for later use to PNMI struct. */
34813- for (i = 0; i < 4; i++) {
34814- if (pPrt->PMdiPairSts[i] == SK_PNMI_VCT_NORMAL_CABLE) {
34815- if ((pPrt->PMdiPairLen[i] > 35) && (pPrt->PMdiPairLen[i] < 0xff)) {
34816- pPrt->PMdiPairSts[i] = SK_PNMI_VCT_IMPEDANCE_MISMATCH;
34817- }
34818- }
34819- if ((pPrt->PMdiPairLen[i] > 35) && (pPrt->PMdiPairLen[i] != 0xff)) {
34820- CableLength = 1000 * (((175 * pPrt->PMdiPairLen[i]) / 210) - 28);
34821- }
34822- else {
34823- CableLength = 0;
34824- }
34825- pVctBackupData->PMdiPairLen[i] = CableLength;
34826- pVctBackupData->PMdiPairSts[i] = pPrt->PMdiPairSts[i];
34827- }
34828-
34829- Para.Para32[0] = PhysPortIndex;
34830- Para.Para32[1] = -1;
34831- SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Para);
34832- SkEventDispatcher(pAC, IoC);
34833- }
34834- else {
34835- ; /* VCT test is running. */
34836- }
34837- }
34838-
34839- /* Get all results. */
34840- CheckVctStatus(pAC, IoC, pBuf, Offset, PhysPortIndex);
34841- Offset += sizeof(SK_U8);
34842- *(pBuf + Offset) = pPrt->PCableLen;
34843- Offset += sizeof(SK_U8);
34844- for (i = 0; i < 4; i++) {
34845- SK_PNMI_STORE_U32((pBuf + Offset), pVctBackupData->PMdiPairLen[i]);
34846- Offset += sizeof(SK_U32);
34847- }
34848- for (i = 0; i < 4; i++) {
34849- *(pBuf + Offset) = pVctBackupData->PMdiPairSts[i];
34850- Offset += sizeof(SK_U8);
34851- }
34852-
34853- RetCode = SK_PNMI_ERR_OK;
34854- break;
34855-
34856- case OID_SKGE_VCT_STATUS:
34857- CheckVctStatus(pAC, IoC, pBuf, Offset, PhysPortIndex);
34858- Offset += sizeof(SK_U8);
34859- RetCode = SK_PNMI_ERR_OK;
34860- break;
34861-
34862- default:
34863- *pLen = 0;
34864- return (SK_PNMI_ERR_GENERAL);
34865- }
34866- } /* for */
34867- *pLen = Offset;
34868- return (RetCode);
34869-
34870- } /* if SK_PNMI_GET */
34871-
34872- /*
34873- * From here SET or PRESET action. Check if the passed
34874- * buffer length is plausible.
34875- */
34876-
34877- /* Check length */
34878- switch (Id) {
34879- case OID_SKGE_VCT_SET:
34880- if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U32)) {
34881- *pLen = (Limit - PhysPortIndex) * sizeof(SK_U32);
34882- return (SK_PNMI_ERR_TOO_SHORT);
34883- }
34884- break;
34885-
34886- default:
34887- *pLen = 0;
34888- return (SK_PNMI_ERR_GENERAL);
34889- }
34890-
34891- /*
34892- * Perform preset or set.
34893- */
34894-
34895- /* VCT does not support PRESET action. */
34896- if (Action == SK_PNMI_PRESET) {
34897- return (SK_PNMI_ERR_OK);
34898- }
34899-
34900- Offset = 0;
34901- for (; PhysPortIndex < Limit; PhysPortIndex++) {
34902- switch (Id) {
34903- case OID_SKGE_VCT_SET: /* Start VCT test. */
34904- if (Link == SK_FALSE) {
34905- SkGeStopPort(pAC, IoC, PhysPortIndex, SK_STOP_ALL, SK_SOFT_RST);
34906-
34907- RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_TRUE);
34908- if (RetCode == 0) { /* RetCode: 0 => Start! */
34909- pAC->Pnmi.VctStatus[PhysPortIndex] |= SK_PNMI_VCT_PENDING;
34910- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_NEW_VCT_DATA;
34911- pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_LINK;
34912-
34913- /*
34914- * Start VCT timer counter.
34915- */
34916- SK_MEMSET((char *) &Para, 0, sizeof(Para));
34917- Para.Para32[0] = PhysPortIndex;
34918- Para.Para32[1] = -1;
34919- SkTimerStart(pAC, IoC, &pAC->Pnmi.VctTimeout[PhysPortIndex].VctTimer,
34920- 4000000, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Para);
34921- SK_PNMI_STORE_U32((pBuf + Offset), RetCode);
34922- RetCode = SK_PNMI_ERR_OK;
34923- }
34924- else { /* RetCode: 2 => Running! */
34925- SK_PNMI_STORE_U32((pBuf + Offset), RetCode);
34926- RetCode = SK_PNMI_ERR_OK;
34927- }
34928- }
34929- else { /* RetCode: 4 => Link! */
34930- RetCode = 4;
34931- SK_PNMI_STORE_U32((pBuf + Offset), RetCode);
34932- RetCode = SK_PNMI_ERR_OK;
34933- }
34934- Offset += sizeof(SK_U32);
34935- break;
34936-
34937- default:
34938- *pLen = 0;
34939- return (SK_PNMI_ERR_GENERAL);
34940- }
34941- } /* for */
34942- *pLen = Offset;
34943- return (RetCode);
34944-
34945-} /* Vct */
34946-
34947-
34948-PNMI_STATIC void CheckVctStatus(
34949-SK_AC *pAC,
34950-SK_IOC IoC,
34951-char *pBuf,
34952-SK_U32 Offset,
34953-SK_U32 PhysPortIndex)
34954-{
34955- SK_GEPORT *pPrt;
34956- SK_PNMI_VCT *pVctData;
34957- SK_U32 RetCode;
34958-
34959- pPrt = &pAC->GIni.GP[PhysPortIndex];
34960-
34961- pVctData = (SK_PNMI_VCT *) (pBuf + Offset);
34962- pVctData->VctStatus = SK_PNMI_VCT_NONE;
34963-
34964- if (!pPrt->PHWLinkUp) {
34965-
34966- /* Was a VCT test ever made before? */
34967- if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_TEST_DONE) {
34968- if ((pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_LINK)) {
34969- pVctData->VctStatus |= SK_PNMI_VCT_OLD_VCT_DATA;
34970- }
34971- else {
34972- pVctData->VctStatus |= SK_PNMI_VCT_NEW_VCT_DATA;
34973- }
34974- }
34975-
34976- /* Check VCT test status. */
34977- RetCode = SkGmCableDiagStatus(pAC,IoC, PhysPortIndex, SK_FALSE);
34978- if (RetCode == 2) { /* VCT test is running. */
34979- pVctData->VctStatus |= SK_PNMI_VCT_RUNNING;
34980- }
34981- else { /* VCT data was copied to pAC here. Check PENDING state. */
34982- if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING) {
34983- pVctData->VctStatus |= SK_PNMI_VCT_NEW_VCT_DATA;
34984- }
34985- }
34986-
34987- if (pPrt->PCableLen != 0xff) { /* Old DSP value. */
34988- pVctData->VctStatus |= SK_PNMI_VCT_OLD_DSP_DATA;
34989- }
34990- }
34991- else {
34992-
34993- /* Was a VCT test ever made before? */
34994- if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_TEST_DONE) {
34995- pVctData->VctStatus &= ~SK_PNMI_VCT_NEW_VCT_DATA;
34996- pVctData->VctStatus |= SK_PNMI_VCT_OLD_VCT_DATA;
34997- }
34998-
34999- /* DSP only valid in 100/1000 modes. */
35000- if (pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed !=
35001- SK_LSPEED_STAT_10MBPS) {
35002- pVctData->VctStatus |= SK_PNMI_VCT_NEW_DSP_DATA;
35003- }
35004- }
35005-} /* CheckVctStatus */
35006-
35007-
35008-/*****************************************************************************
35009- *
35010- * SkPnmiGenIoctl - Handles new generic PNMI IOCTL, calls the needed
35011- * PNMI function depending on the subcommand and
35012- * returns all data belonging to the complete database
35013- * or OID request.
35014- *
35015- * Description:
35016- * Looks up the requested subcommand, calls the corresponding handler
35017- * function and passes all required parameters to it.
35018- * The function is called by the driver. It is needed to handle the new
35019- * generic PNMI IOCTL. This IOCTL is given to the driver and contains both
35020- * the OID and a subcommand to decide what kind of request has to be done.
35021- *
35022- * Returns:
35023- * SK_PNMI_ERR_OK The request was successfully performed
35024- * SK_PNMI_ERR_GENERAL A general severe internal error occured
35025- * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take
35026- * the data.
35027- * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown
35028- * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
35029- * exist (e.g. port instance 3 on a two port
35030- * adapter.
35031- */
35032-int SkPnmiGenIoctl(
35033-SK_AC *pAC, /* Pointer to adapter context struct */
35034-SK_IOC IoC, /* I/O context */
35035-void *pBuf, /* Buffer used for the management data transfer */
35036-unsigned int *pLen, /* Length of buffer */
35037-SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
35038-{
35039-SK_I32 Mode; /* Store value of subcommand. */
35040-SK_U32 Oid; /* Store value of OID. */
35041-int ReturnCode; /* Store return value to show status of PNMI action. */
35042-int HeaderLength; /* Length of desired action plus OID. */
35043-
35044- ReturnCode = SK_PNMI_ERR_GENERAL;
35045-
35046- SK_MEMCPY(&Mode, pBuf, sizeof(SK_I32));
35047- SK_MEMCPY(&Oid, (char *) pBuf + sizeof(SK_I32), sizeof(SK_U32));
35048- HeaderLength = sizeof(SK_I32) + sizeof(SK_U32);
35049- *pLen = *pLen - HeaderLength;
35050- SK_MEMCPY((char *) pBuf + sizeof(SK_I32), (char *) pBuf + HeaderLength, *pLen);
35051-
35052- switch(Mode) {
35053- case SK_GET_SINGLE_VAR:
35054- ReturnCode = SkPnmiGetVar(pAC, IoC, Oid,
35055- (char *) pBuf + sizeof(SK_I32), pLen,
35056- ((SK_U32) (-1)), NetIndex);
35057- SK_PNMI_STORE_U32(pBuf, ReturnCode);
35058- *pLen = *pLen + sizeof(SK_I32);
35059- break;
35060- case SK_PRESET_SINGLE_VAR:
35061- ReturnCode = SkPnmiPreSetVar(pAC, IoC, Oid,
35062- (char *) pBuf + sizeof(SK_I32), pLen,
35063- ((SK_U32) (-1)), NetIndex);
35064- SK_PNMI_STORE_U32(pBuf, ReturnCode);
35065- *pLen = *pLen + sizeof(SK_I32);
35066- break;
35067- case SK_SET_SINGLE_VAR:
35068- ReturnCode = SkPnmiSetVar(pAC, IoC, Oid,
35069- (char *) pBuf + sizeof(SK_I32), pLen,
35070- ((SK_U32) (-1)), NetIndex);
35071- SK_PNMI_STORE_U32(pBuf, ReturnCode);
35072- *pLen = *pLen + sizeof(SK_I32);
35073- break;
35074- case SK_GET_FULL_MIB:
35075- ReturnCode = SkPnmiGetStruct(pAC, IoC, pBuf, pLen, NetIndex);
35076- break;
35077- case SK_PRESET_FULL_MIB:
35078- ReturnCode = SkPnmiPreSetStruct(pAC, IoC, pBuf, pLen, NetIndex);
35079- break;
35080- case SK_SET_FULL_MIB:
35081- ReturnCode = SkPnmiSetStruct(pAC, IoC, pBuf, pLen, NetIndex);
35082- break;
35083- default:
35084- break;
35085- }
35086-
35087- return (ReturnCode);
35088-
35089-} /* SkGeIocGen */
35090+/*****************************************************************************\r
35091+ *\r
35092+ * Name: skgepnmi.c\r
35093+ * Project: Gigabit Ethernet Adapters, PNMI-Module\r
35094+ * Version: $Revision$\r
35095+ * Date: $Date$\r
35096+ * Purpose: Private Network Management Interface\r
35097+ *\r
35098+ ****************************************************************************/\r
35099+\r
35100+/******************************************************************************\r
35101+ *\r
35102+ * (C)Copyright 1998-2002 SysKonnect GmbH.\r
35103+ * (C)Copyright 2002-2003 Marvell.\r
35104+ *\r
35105+ * This program is free software; you can redistribute it and/or modify\r
35106+ * it under the terms of the GNU General Public License as published by\r
35107+ * the Free Software Foundation; either version 2 of the License, or\r
35108+ * (at your option) any later version.\r
35109+ *\r
35110+ * The information in this file is provided "AS IS" without warranty.\r
35111+ *\r
35112+ ******************************************************************************/\r
35113+\r
35114+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))\r
35115+static const char SysKonnectFileId[] =\r
35116+ "@(#) $Id$ (C) Marvell.";\r
35117+#endif\r
35118+\r
35119+#include "h/skdrv1st.h"\r
35120+#include "h/sktypes.h"\r
35121+#include "h/xmac_ii.h"\r
35122+#include "h/skdebug.h"\r
35123+#include "h/skqueue.h"\r
35124+#include "h/skgepnmi.h"\r
35125+#include "h/skgesirq.h"\r
35126+#include "h/skcsum.h"\r
35127+#include "h/skvpd.h"\r
35128+#include "h/skgehw.h"\r
35129+#include "h/sky2le.h"\r
35130+#include "h/skgeinit.h"\r
35131+#include "h/skdrv2nd.h"\r
35132+#include "h/skgepnm2.h"\r
35133+#ifdef SK_POWER_MGMT\r
35134+#include "h/skgepmgt.h"\r
35135+#endif /* SK_POWER_MGMT */\r
35136+\r
35137+/* defines *******************************************************************/\r
35138+\r
35139+#ifndef DEBUG\r
35140+#define PNMI_STATIC static\r
35141+#else /* DEBUG */\r
35142+#define PNMI_STATIC\r
35143+#endif /* DEBUG */\r
35144+\r
35145+/*\r
35146+ * Public Function prototypes\r
35147+ */\r
35148+int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int level);\r
35149+int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,\r
35150+ unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);\r
35151+int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,\r
35152+ unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);\r
35153+int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,\r
35154+ unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);\r
35155+int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,\r
35156+ unsigned int *pLen, SK_U32 NetIndex);\r
35157+int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,\r
35158+ unsigned int *pLen, SK_U32 NetIndex);\r
35159+int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,\r
35160+ unsigned int *pLen, SK_U32 NetIndex);\r
35161+int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Param);\r
35162+int SkPnmiGenIoctl(SK_AC *pAC, SK_IOC IoC, void * pBuf,\r
35163+ unsigned int * pLen, SK_U32 NetIndex);\r
35164+\r
35165+/*\r
35166+ * Private Function prototypes\r
35167+ */\r
35168+\r
35169+PNMI_STATIC SK_U8 CalculateLinkModeStatus(SK_AC *pAC, SK_IOC IoC, unsigned int\r
35170+ PhysPortIndex);\r
35171+PNMI_STATIC SK_U8 CalculateLinkStatus(SK_AC *pAC, SK_IOC IoC, unsigned int\r
35172+ PhysPortIndex);\r
35173+PNMI_STATIC void CopyMac(char *pDst, SK_MAC_ADDR *pMac);\r
35174+PNMI_STATIC void CopyTrapQueue(SK_AC *pAC, char *pDstBuf);\r
35175+PNMI_STATIC SK_U64 GetPhysStatVal(SK_AC *pAC, SK_IOC IoC,\r
35176+ unsigned int PhysPortIndex, unsigned int StatIndex);\r
35177+PNMI_STATIC SK_U64 GetStatVal(SK_AC *pAC, SK_IOC IoC, unsigned int LogPortIndex,\r
35178+ unsigned int StatIndex, SK_U32 NetIndex);\r
35179+PNMI_STATIC char* GetTrapEntry(SK_AC *pAC, SK_U32 TrapId, unsigned int Size);\r
35180+PNMI_STATIC void GetTrapQueueLen(SK_AC *pAC, unsigned int *pLen,\r
35181+ unsigned int *pEntries);\r
35182+PNMI_STATIC int GetVpdKeyArr(SK_AC *pAC, SK_IOC IoC, char *pKeyArr,\r
35183+ unsigned int KeyArrLen, unsigned int *pKeyNo);\r
35184+PNMI_STATIC int LookupId(SK_U32 Id);\r
35185+PNMI_STATIC int MacUpdate(SK_AC *pAC, SK_IOC IoC, unsigned int FirstMac,\r
35186+ unsigned int LastMac);\r
35187+PNMI_STATIC int PnmiStruct(SK_AC *pAC, SK_IOC IoC, int Action, char *pBuf,\r
35188+ unsigned int *pLen, SK_U32 NetIndex);\r
35189+PNMI_STATIC int PnmiVar(SK_AC *pAC, SK_IOC IoC, int Action, SK_U32 Id,\r
35190+ char *pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);\r
35191+PNMI_STATIC void QueueRlmtNewMacTrap(SK_AC *pAC, unsigned int ActiveMac);\r
35192+PNMI_STATIC void QueueRlmtPortTrap(SK_AC *pAC, SK_U32 TrapId,\r
35193+ unsigned int PortIndex);\r
35194+PNMI_STATIC void QueueSensorTrap(SK_AC *pAC, SK_U32 TrapId,\r
35195+ unsigned int SensorIndex);\r
35196+PNMI_STATIC void QueueSimpleTrap(SK_AC *pAC, SK_U32 TrapId);\r
35197+PNMI_STATIC void ResetCounter(SK_AC *pAC, SK_IOC IoC, SK_U32 NetIndex);\r
35198+PNMI_STATIC int RlmtUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 NetIndex);\r
35199+PNMI_STATIC int SirqUpdate(SK_AC *pAC, SK_IOC IoC);\r
35200+PNMI_STATIC void VirtualConf(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, char *pBuf);\r
35201+PNMI_STATIC int Vct(SK_AC *pAC, SK_IOC IoC, int Action, SK_U32 Id, char *pBuf,\r
35202+ unsigned int *pLen, SK_U32 Instance, unsigned int TableIndex, SK_U32 NetIndex);\r
35203+PNMI_STATIC void CheckVctStatus(SK_AC *, SK_IOC, char *, SK_U32, SK_U32);\r
35204+PNMI_STATIC void VctGetResults(SK_AC *, SK_IOC, SK_U32);\r
35205+#ifdef SK_ASF\r
35206+PNMI_STATIC int Asf(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,\r
35207+ char *pBuf, unsigned int *pLen, SK_U32 Instance,\r
35208+ unsigned int TableIndex, SK_U32 NetIndex);\r
35209+#endif /* SK_ASF */\r
35210+\r
35211+/*\r
35212+ * Table to correlate OID with handler function and index to\r
35213+ * hardware register stored in StatAddress if applicable.\r
35214+ */\r
35215+#include "skgemib.c"\r
35216+\r
35217+/* global variables **********************************************************/\r
35218+\r
35219+/*\r
35220+ * Overflow status register bit table and corresponding counter\r
35221+ * dependent on MAC type - the number relates to the size of overflow\r
35222+ * mask returned by the pFnMacOverflow function\r
35223+ */\r
35224+PNMI_STATIC const SK_U16 StatOvrflwBit[][SK_PNMI_MAC_TYPES] = {\r
35225+/* Bit0 */ { SK_PNMI_HTX, SK_PNMI_HTX_UNICAST},\r
35226+/* Bit1 */ { SK_PNMI_HTX_OCTETHIGH, SK_PNMI_HTX_BROADCAST},\r
35227+/* Bit2 */ { SK_PNMI_HTX_OCTETLOW, SK_PNMI_HTX_PMACC},\r
35228+/* Bit3 */ { SK_PNMI_HTX_BROADCAST, SK_PNMI_HTX_MULTICAST},\r
35229+/* Bit4 */ { SK_PNMI_HTX_MULTICAST, SK_PNMI_HTX_OCTETLOW},\r
35230+/* Bit5 */ { SK_PNMI_HTX_UNICAST, SK_PNMI_HTX_OCTETHIGH},\r
35231+/* Bit6 */ { SK_PNMI_HTX_LONGFRAMES, SK_PNMI_HTX_64},\r
35232+/* Bit7 */ { SK_PNMI_HTX_BURST, SK_PNMI_HTX_127},\r
35233+/* Bit8 */ { SK_PNMI_HTX_PMACC, SK_PNMI_HTX_255},\r
35234+/* Bit9 */ { SK_PNMI_HTX_MACC, SK_PNMI_HTX_511},\r
35235+/* Bit10 */ { SK_PNMI_HTX_SINGLE_COL, SK_PNMI_HTX_1023},\r
35236+/* Bit11 */ { SK_PNMI_HTX_MULTI_COL, SK_PNMI_HTX_MAX},\r
35237+/* Bit12 */ { SK_PNMI_HTX_EXCESS_COL, SK_PNMI_HTX_LONGFRAMES},\r
35238+/* Bit13 */ { SK_PNMI_HTX_LATE_COL, SK_PNMI_HTX_RESERVED},\r
35239+/* Bit14 */ { SK_PNMI_HTX_DEFFERAL, SK_PNMI_HTX_COL},\r
35240+/* Bit15 */ { SK_PNMI_HTX_EXCESS_DEF, SK_PNMI_HTX_LATE_COL},\r
35241+/* Bit16 */ { SK_PNMI_HTX_UNDERRUN, SK_PNMI_HTX_EXCESS_COL},\r
35242+/* Bit17 */ { SK_PNMI_HTX_CARRIER, SK_PNMI_HTX_MULTI_COL},\r
35243+/* Bit18 */ { SK_PNMI_HTX_UTILUNDER, SK_PNMI_HTX_SINGLE_COL},\r
35244+/* Bit19 */ { SK_PNMI_HTX_UTILOVER, SK_PNMI_HTX_UNDERRUN},\r
35245+/* Bit20 */ { SK_PNMI_HTX_64, SK_PNMI_HTX_RESERVED},\r
35246+/* Bit21 */ { SK_PNMI_HTX_127, SK_PNMI_HTX_RESERVED},\r
35247+/* Bit22 */ { SK_PNMI_HTX_255, SK_PNMI_HTX_RESERVED},\r
35248+/* Bit23 */ { SK_PNMI_HTX_511, SK_PNMI_HTX_RESERVED},\r
35249+/* Bit24 */ { SK_PNMI_HTX_1023, SK_PNMI_HTX_RESERVED},\r
35250+/* Bit25 */ { SK_PNMI_HTX_MAX, SK_PNMI_HTX_RESERVED},\r
35251+/* Bit26 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},\r
35252+/* Bit27 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},\r
35253+/* Bit28 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},\r
35254+/* Bit29 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},\r
35255+/* Bit30 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},\r
35256+/* Bit31 */ { SK_PNMI_HTX_RESERVED, SK_PNMI_HTX_RESERVED},\r
35257+/* Bit32 */ { SK_PNMI_HRX, SK_PNMI_HRX_UNICAST},\r
35258+/* Bit33 */ { SK_PNMI_HRX_OCTETHIGH, SK_PNMI_HRX_BROADCAST},\r
35259+/* Bit34 */ { SK_PNMI_HRX_OCTETLOW, SK_PNMI_HRX_PMACC},\r
35260+/* Bit35 */ { SK_PNMI_HRX_BROADCAST, SK_PNMI_HRX_MULTICAST},\r
35261+/* Bit36 */ { SK_PNMI_HRX_MULTICAST, SK_PNMI_HRX_FCS},\r
35262+/* Bit37 */ { SK_PNMI_HRX_UNICAST, SK_PNMI_HRX_RESERVED},\r
35263+/* Bit38 */ { SK_PNMI_HRX_PMACC, SK_PNMI_HRX_OCTETLOW},\r
35264+/* Bit39 */ { SK_PNMI_HRX_MACC, SK_PNMI_HRX_OCTETHIGH},\r
35265+/* Bit40 */ { SK_PNMI_HRX_PMACC_ERR, SK_PNMI_HRX_BADOCTETLOW},\r
35266+/* Bit41 */ { SK_PNMI_HRX_MACC_UNKWN, SK_PNMI_HRX_BADOCTETHIGH},\r
35267+/* Bit42 */ { SK_PNMI_HRX_BURST, SK_PNMI_HRX_UNDERSIZE},\r
35268+/* Bit43 */ { SK_PNMI_HRX_MISSED, SK_PNMI_HRX_RUNT},\r
35269+/* Bit44 */ { SK_PNMI_HRX_FRAMING, SK_PNMI_HRX_64},\r
35270+/* Bit45 */ { SK_PNMI_HRX_OVERFLOW, SK_PNMI_HRX_127},\r
35271+/* Bit46 */ { SK_PNMI_HRX_JABBER, SK_PNMI_HRX_255},\r
35272+/* Bit47 */ { SK_PNMI_HRX_CARRIER, SK_PNMI_HRX_511},\r
35273+/* Bit48 */ { SK_PNMI_HRX_IRLENGTH, SK_PNMI_HRX_1023},\r
35274+/* Bit49 */ { SK_PNMI_HRX_SYMBOL, SK_PNMI_HRX_MAX},\r
35275+/* Bit50 */ { SK_PNMI_HRX_SHORTS, SK_PNMI_HRX_LONGFRAMES},\r
35276+/* Bit51 */ { SK_PNMI_HRX_RUNT, SK_PNMI_HRX_TOO_LONG},\r
35277+/* Bit52 */ { SK_PNMI_HRX_TOO_LONG, SK_PNMI_HRX_JABBER},\r
35278+/* Bit53 */ { SK_PNMI_HRX_FCS, SK_PNMI_HRX_RESERVED},\r
35279+/* Bit54 */ { SK_PNMI_HRX_RESERVED, SK_PNMI_HRX_OVERFLOW},\r
35280+/* Bit55 */ { SK_PNMI_HRX_CEXT, SK_PNMI_HRX_RESERVED},\r
35281+/* Bit56 */ { SK_PNMI_HRX_UTILUNDER, SK_PNMI_HRX_RESERVED},\r
35282+/* Bit57 */ { SK_PNMI_HRX_UTILOVER, SK_PNMI_HRX_RESERVED},\r
35283+/* Bit58 */ { SK_PNMI_HRX_64, SK_PNMI_HRX_RESERVED},\r
35284+/* Bit59 */ { SK_PNMI_HRX_127, SK_PNMI_HRX_RESERVED},\r
35285+/* Bit60 */ { SK_PNMI_HRX_255, SK_PNMI_HRX_RESERVED},\r
35286+/* Bit61 */ { SK_PNMI_HRX_511, SK_PNMI_HRX_RESERVED},\r
35287+/* Bit62 */ { SK_PNMI_HRX_1023, SK_PNMI_HRX_RESERVED},\r
35288+/* Bit63 */ { SK_PNMI_HRX_MAX, SK_PNMI_HRX_RESERVED}\r
35289+};\r
35290+\r
35291+/*\r
35292+ * Table for hardware register saving on resets and port switches\r
35293+ */\r
35294+PNMI_STATIC const SK_PNMI_STATADDR StatAddr[SK_PNMI_MAX_IDX][SK_PNMI_MAC_TYPES] = {\r
35295+ /* SK_PNMI_HTX */\r
35296+ {{XM_TXF_OK, SK_TRUE}, {0, SK_FALSE}},\r
35297+ /* SK_PNMI_HTX_OCTETHIGH */\r
35298+ {{XM_TXO_OK_HI, SK_TRUE}, {GM_TXO_OK_HI, SK_TRUE}},\r
35299+ /* SK_PNMI_HTX_OCTETLOW */\r
35300+ {{XM_TXO_OK_LO, SK_FALSE}, {GM_TXO_OK_LO, SK_FALSE}},\r
35301+ /* SK_PNMI_HTX_BROADCAST */\r
35302+ {{XM_TXF_BC_OK, SK_TRUE}, {GM_TXF_BC_OK, SK_TRUE}},\r
35303+ /* SK_PNMI_HTX_MULTICAST */\r
35304+ {{XM_TXF_MC_OK, SK_TRUE}, {GM_TXF_MC_OK, SK_TRUE}},\r
35305+ /* SK_PNMI_HTX_UNICAST */\r
35306+ {{XM_TXF_UC_OK, SK_TRUE}, {GM_TXF_UC_OK, SK_TRUE}},\r
35307+ /* SK_PNMI_HTX_BURST */\r
35308+ {{XM_TXE_BURST, SK_TRUE}, {0, SK_FALSE}},\r
35309+ /* SK_PNMI_HTX_PMACC */\r
35310+ {{XM_TXF_MPAUSE, SK_TRUE}, {GM_TXF_MPAUSE, SK_TRUE}},\r
35311+ /* SK_PNMI_HTX_MACC */\r
35312+ {{XM_TXF_MCTRL, SK_TRUE}, {0, SK_FALSE}},\r
35313+ /* SK_PNMI_HTX_COL */\r
35314+ {{0, SK_FALSE}, {GM_TXF_COL, SK_TRUE}},\r
35315+ /* SK_PNMI_HTX_SINGLE_COL */\r
35316+ {{XM_TXF_SNG_COL, SK_TRUE}, {GM_TXF_SNG_COL, SK_TRUE}},\r
35317+ /* SK_PNMI_HTX_MULTI_COL */\r
35318+ {{XM_TXF_MUL_COL, SK_TRUE}, {GM_TXF_MUL_COL, SK_TRUE}},\r
35319+ /* SK_PNMI_HTX_EXCESS_COL */\r
35320+ {{XM_TXF_ABO_COL, SK_TRUE}, {GM_TXF_ABO_COL, SK_TRUE}},\r
35321+ /* SK_PNMI_HTX_LATE_COL */\r
35322+ {{XM_TXF_LAT_COL, SK_TRUE}, {GM_TXF_LAT_COL, SK_TRUE}},\r
35323+ /* SK_PNMI_HTX_DEFFERAL */\r
35324+ {{XM_TXF_DEF, SK_TRUE}, {0, SK_FALSE}},\r
35325+ /* SK_PNMI_HTX_EXCESS_DEF */\r
35326+ {{XM_TXF_EX_DEF, SK_TRUE}, {0, SK_FALSE}},\r
35327+ /* SK_PNMI_HTX_UNDERRUN */\r
35328+ {{XM_TXE_FIFO_UR, SK_TRUE}, {GM_TXE_FIFO_UR, SK_TRUE}},\r
35329+ /* SK_PNMI_HTX_CARRIER */\r
35330+ {{XM_TXE_CS_ERR, SK_TRUE}, {0, SK_FALSE}},\r
35331+ /* SK_PNMI_HTX_UTILUNDER */\r
35332+ {{0, SK_FALSE}, {0, SK_FALSE}},\r
35333+ /* SK_PNMI_HTX_UTILOVER */\r
35334+ {{0, SK_FALSE}, {0, SK_FALSE}},\r
35335+ /* SK_PNMI_HTX_64 */\r
35336+ {{XM_TXF_64B, SK_TRUE}, {GM_TXF_64B, SK_TRUE}},\r
35337+ /* SK_PNMI_HTX_127 */\r
35338+ {{XM_TXF_127B, SK_TRUE}, {GM_TXF_127B, SK_TRUE}},\r
35339+ /* SK_PNMI_HTX_255 */\r
35340+ {{XM_TXF_255B, SK_TRUE}, {GM_TXF_255B, SK_TRUE}},\r
35341+ /* SK_PNMI_HTX_511 */\r
35342+ {{XM_TXF_511B, SK_TRUE}, {GM_TXF_511B, SK_TRUE}},\r
35343+ /* SK_PNMI_HTX_1023 */\r
35344+ {{XM_TXF_1023B, SK_TRUE}, {GM_TXF_1023B, SK_TRUE}},\r
35345+ /* SK_PNMI_HTX_MAX */\r
35346+ {{XM_TXF_MAX_SZ, SK_TRUE}, {GM_TXF_1518B, SK_TRUE}},\r
35347+ /* SK_PNMI_HTX_LONGFRAMES */\r
35348+ {{XM_TXF_LONG, SK_TRUE}, {GM_TXF_MAX_SZ, SK_TRUE}},\r
35349+ /* SK_PNMI_HTX_SYNC */\r
35350+ {{0, SK_FALSE}, {0, SK_FALSE}},\r
35351+ /* SK_PNMI_HTX_SYNC_OCTET */\r
35352+ {{0, SK_FALSE}, {0, SK_FALSE}},\r
35353+ /* SK_PNMI_HTX_RESERVED */\r
35354+ {{0, SK_FALSE}, {0, SK_FALSE}},\r
35355+ /* SK_PNMI_HRX */\r
35356+ {{XM_RXF_OK, SK_TRUE}, {0, SK_FALSE}},\r
35357+ /* SK_PNMI_HRX_OCTETHIGH */\r
35358+ {{XM_RXO_OK_HI, SK_TRUE}, {GM_RXO_OK_HI, SK_TRUE}},\r
35359+ /* SK_PNMI_HRX_OCTETLOW */\r
35360+ {{XM_RXO_OK_LO, SK_FALSE}, {GM_RXO_OK_LO, SK_FALSE}},\r
35361+ /* SK_PNMI_HRX_BADOCTETHIGH */\r
35362+ {{0, SK_FALSE}, {GM_RXO_ERR_HI, SK_TRUE}},\r
35363+ /* SK_PNMI_HRX_BADOCTETLOW */\r
35364+ {{0, SK_FALSE}, {GM_RXO_ERR_LO, SK_TRUE}},\r
35365+ /* SK_PNMI_HRX_BROADCAST */\r
35366+ {{XM_RXF_BC_OK, SK_TRUE}, {GM_RXF_BC_OK, SK_TRUE}},\r
35367+ /* SK_PNMI_HRX_MULTICAST */\r
35368+ {{XM_RXF_MC_OK, SK_TRUE}, {GM_RXF_MC_OK, SK_TRUE}},\r
35369+ /* SK_PNMI_HRX_UNICAST */\r
35370+ {{XM_RXF_UC_OK, SK_TRUE}, {GM_RXF_UC_OK, SK_TRUE}},\r
35371+ /* SK_PNMI_HRX_PMACC */\r
35372+ {{XM_RXF_MPAUSE, SK_TRUE}, {GM_RXF_MPAUSE, SK_TRUE}},\r
35373+ /* SK_PNMI_HRX_MACC */\r
35374+ {{XM_RXF_MCTRL, SK_TRUE}, {0, SK_FALSE}},\r
35375+ /* SK_PNMI_HRX_PMACC_ERR */\r
35376+ {{XM_RXF_INV_MP, SK_TRUE}, {0, SK_FALSE}},\r
35377+ /* SK_PNMI_HRX_MACC_UNKWN */\r
35378+ {{XM_RXF_INV_MOC, SK_TRUE}, {0, SK_FALSE}},\r
35379+ /* SK_PNMI_HRX_BURST */\r
35380+ {{XM_RXE_BURST, SK_TRUE}, {0, SK_FALSE}},\r
35381+ /* SK_PNMI_HRX_MISSED */\r
35382+ {{XM_RXE_FMISS, SK_TRUE}, {0, SK_FALSE}},\r
35383+ /* SK_PNMI_HRX_FRAMING */\r
35384+ {{XM_RXF_FRA_ERR, SK_TRUE}, {0, SK_FALSE}},\r
35385+ /* SK_PNMI_HRX_UNDERSIZE */\r
35386+ {{0, SK_FALSE}, {GM_RXF_SHT, SK_TRUE}},\r
35387+ /* SK_PNMI_HRX_OVERFLOW */\r
35388+ {{XM_RXE_FIFO_OV, SK_TRUE}, {GM_RXE_FIFO_OV, SK_TRUE}},\r
35389+ /* SK_PNMI_HRX_JABBER */\r
35390+ {{XM_RXF_JAB_PKT, SK_TRUE}, {GM_RXF_JAB_PKT, SK_TRUE}},\r
35391+ /* SK_PNMI_HRX_CARRIER */\r
35392+ {{XM_RXE_CAR_ERR, SK_TRUE}, {0, SK_FALSE}},\r
35393+ /* SK_PNMI_HRX_IRLENGTH */\r
35394+ {{XM_RXF_LEN_ERR, SK_TRUE}, {0, SK_FALSE}},\r
35395+ /* SK_PNMI_HRX_SYMBOL */\r
35396+ {{XM_RXE_SYM_ERR, SK_TRUE}, {0, SK_FALSE}},\r
35397+ /* SK_PNMI_HRX_SHORTS */\r
35398+ {{XM_RXE_SHT_ERR, SK_TRUE}, {0, SK_FALSE}},\r
35399+ /* SK_PNMI_HRX_RUNT */\r
35400+ {{XM_RXE_RUNT, SK_TRUE}, {GM_RXE_FRAG, SK_TRUE}},\r
35401+ /* SK_PNMI_HRX_TOO_LONG */\r
35402+ {{XM_RXF_LNG_ERR, SK_TRUE}, {GM_RXF_LNG_ERR, SK_TRUE}},\r
35403+ /* SK_PNMI_HRX_FCS */\r
35404+ {{XM_RXF_FCS_ERR, SK_TRUE}, {GM_RXF_FCS_ERR, SK_TRUE}},\r
35405+ /* SK_PNMI_HRX_CEXT */\r
35406+ {{XM_RXF_CEX_ERR, SK_TRUE}, {0, SK_FALSE}},\r
35407+ /* SK_PNMI_HRX_UTILUNDER */\r
35408+ {{0, SK_FALSE}, {0, SK_FALSE}},\r
35409+ /* SK_PNMI_HRX_UTILOVER */\r
35410+ {{0, SK_FALSE}, {0, SK_FALSE}},\r
35411+ /* SK_PNMI_HRX_64 */\r
35412+ {{XM_RXF_64B, SK_TRUE}, {GM_RXF_64B, SK_TRUE}},\r
35413+ /* SK_PNMI_HRX_127 */\r
35414+ {{XM_RXF_127B, SK_TRUE}, {GM_RXF_127B, SK_TRUE}},\r
35415+ /* SK_PNMI_HRX_255 */\r
35416+ {{XM_RXF_255B, SK_TRUE}, {GM_RXF_255B, SK_TRUE}},\r
35417+ /* SK_PNMI_HRX_511 */\r
35418+ {{XM_RXF_511B, SK_TRUE}, {GM_RXF_511B, SK_TRUE}},\r
35419+ /* SK_PNMI_HRX_1023 */\r
35420+ {{XM_RXF_1023B, SK_TRUE}, {GM_RXF_1023B, SK_TRUE}},\r
35421+ /* SK_PNMI_HRX_MAX */\r
35422+ {{XM_RXF_MAX_SZ, SK_TRUE}, {GM_RXF_1518B, SK_TRUE}},\r
35423+ /* SK_PNMI_HRX_LONGFRAMES */\r
35424+ {{0, SK_FALSE}, {GM_RXF_MAX_SZ, SK_TRUE}},\r
35425+ /* SK_PNMI_HRX_RESERVED */\r
35426+ {{0, SK_FALSE}, {0, SK_FALSE}}\r
35427+};\r
35428+\r
35429+\r
35430+/*****************************************************************************\r
35431+ *\r
35432+ * Public functions\r
35433+ *\r
35434+ */\r
35435+\r
35436+/*****************************************************************************\r
35437+ *\r
35438+ * SkPnmiInit - Init function of PNMI\r
35439+ *\r
35440+ * Description:\r
35441+ * SK_INIT_DATA: Initialises the data structures\r
35442+ * SK_INIT_IO: Resets the XMAC statistics, determines the device and\r
35443+ * connector type.\r
35444+ * SK_INIT_RUN: Starts a timer event for port switch per hour\r
35445+ * calculation.\r
35446+ *\r
35447+ * Returns:\r
35448+ * Always 0\r
35449+ */\r
35450+int SkPnmiInit(\r
35451+SK_AC *pAC, /* Pointer to adapter context */\r
35452+SK_IOC IoC, /* IO context handle */\r
35453+int Level) /* Initialization level */\r
35454+{\r
35455+ unsigned int PortMax; /* Number of ports */\r
35456+ unsigned int PortIndex; /* Current port index in loop */\r
35457+ SK_EVPARA EventParam; /* Event struct for timer event */\r
35458+\r
35459+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
35460+ ("PNMI: SkPnmiInit: Called, level=%d\n", Level));\r
35461+\r
35462+ switch (Level) {\r
35463+\r
35464+ case SK_INIT_DATA:\r
35465+ SK_MEMSET((char *)&pAC->Pnmi, 0, sizeof(pAC->Pnmi));\r
35466+ \r
35467+ pAC->Pnmi.TrapBufFree = SK_PNMI_TRAP_QUEUE_LEN;\r
35468+ pAC->Pnmi.StartUpTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));\r
35469+ pAC->Pnmi.RlmtChangeThreshold = SK_PNMI_DEF_RLMT_CHG_THRES;\r
35470+ \r
35471+ for (PortIndex = 0; PortIndex < SK_MAX_MACS; PortIndex ++) {\r
35472+\r
35473+ pAC->Pnmi.Port[PortIndex].ActiveFlag = SK_FALSE;\r
35474+ pAC->Pnmi.DualNetActiveFlag = SK_FALSE;\r
35475+\r
35476+ /* Initialize DSP variables for Vct() to 0xff => Never written! */ \r
35477+ pAC->GIni.GP[PortIndex].PCableLen = 0xff;\r
35478+ pAC->Pnmi.VctBackup[PortIndex].CableLen = 0xff;\r
35479+ }\r
35480+\r
35481+#ifdef SK_PNMI_CHECK\r
35482+ if (SK_PNMI_MAX_IDX != SK_PNMI_CNT_NO) {\r
35483+ \r
35484+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR049, SK_PNMI_ERR049MSG);\r
35485+\r
35486+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_INIT | SK_DBGCAT_FATAL,\r
35487+ ("CounterOffset struct size (%d) differs from"\r
35488+ "SK_PNMI_MAX_IDX (%d)\n",\r
35489+ SK_PNMI_CNT_NO, SK_PNMI_MAX_IDX));\r
35490+ }\r
35491+\r
35492+ if (SK_PNMI_MAX_IDX !=\r
35493+ (sizeof(StatAddr) / (sizeof(SK_PNMI_STATADDR) * SK_PNMI_MAC_TYPES))) {\r
35494+ \r
35495+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR050, SK_PNMI_ERR050MSG);\r
35496+\r
35497+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_INIT | SK_DBGCAT_FATAL,\r
35498+ ("StatAddr table size (%d) differs from "\r
35499+ "SK_PNMI_MAX_IDX (%d)\n",\r
35500+ (sizeof(StatAddr) /\r
35501+ (sizeof(SK_PNMI_STATADDR) * SK_PNMI_MAC_TYPES)),\r
35502+ SK_PNMI_MAX_IDX));\r
35503+ }\r
35504+#endif /* SK_PNMI_CHECK */\r
35505+ break;\r
35506+\r
35507+ case SK_INIT_IO:\r
35508+\r
35509+ /* Reset MAC counters. */\r
35510+ PortMax = pAC->GIni.GIMacsFound;\r
35511+\r
35512+ for (PortIndex = 0; PortIndex < PortMax; PortIndex ++) {\r
35513+\r
35514+ pAC->GIni.GIFunc.pFnMacResetCounter(pAC, IoC, PortIndex);\r
35515+ }\r
35516+\r
35517+ /* Get PCI bus speed. */\r
35518+ if (pAC->GIni.GIPciClock66) {\r
35519+\r
35520+ pAC->Pnmi.PciBusSpeed = 66;\r
35521+ }\r
35522+ else {\r
35523+ pAC->Pnmi.PciBusSpeed = 33;\r
35524+ }\r
35525+\r
35526+ /* Get PCI bus width. */\r
35527+ if (pAC->GIni.GIPciSlot64) {\r
35528+\r
35529+ pAC->Pnmi.PciBusWidth = 64;\r
35530+ }\r
35531+ else {\r
35532+ pAC->Pnmi.PciBusWidth = 32;\r
35533+ }\r
35534+\r
35535+ /* Get chipset. */\r
35536+ switch (pAC->GIni.GIChipId) {\r
35537+\r
35538+ case CHIP_ID_GENESIS:\r
35539+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_XMAC;\r
35540+ break;\r
35541+\r
35542+ case CHIP_ID_YUKON:\r
35543+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON;\r
35544+ break;\r
35545+\r
35546+ case CHIP_ID_YUKON_LITE:\r
35547+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_LITE;\r
35548+ break;\r
35549+\r
35550+ case CHIP_ID_YUKON_LP:\r
35551+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_LP;\r
35552+ break;\r
35553+\r
35554+ case CHIP_ID_YUKON_XL:\r
35555+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_XL;\r
35556+ break;\r
35557+\r
35558+ case CHIP_ID_YUKON_EC:\r
35559+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_EC;\r
35560+ break;\r
35561+\r
35562+ case CHIP_ID_YUKON_FE:\r
35563+ pAC->Pnmi.Chipset = SK_PNMI_CHIPSET_YUKON_FE;\r
35564+ break;\r
35565+\r
35566+ default:\r
35567+ break;\r
35568+ }\r
35569+\r
35570+ /* Get PMD and Device Type. */\r
35571+ switch (pAC->GIni.GIPmdTyp) {\r
35572+ \r
35573+ case 'S':\r
35574+ pAC->Pnmi.PMD = 3;\r
35575+ pAC->Pnmi.DeviceType = 0x00020001;\r
35576+ break;\r
35577+\r
35578+ case 'L':\r
35579+ pAC->Pnmi.PMD = 2;\r
35580+ pAC->Pnmi.DeviceType = 0x00020003;\r
35581+ break;\r
35582+\r
35583+ case 'C':\r
35584+ pAC->Pnmi.PMD = 4;\r
35585+ pAC->Pnmi.DeviceType = 0x00020005;\r
35586+ break;\r
35587+\r
35588+ case 'T':\r
35589+ pAC->Pnmi.PMD = 5;\r
35590+ pAC->Pnmi.DeviceType = 0x00020007;\r
35591+ break;\r
35592+\r
35593+ default :\r
35594+ pAC->Pnmi.PMD = 1;\r
35595+ pAC->Pnmi.DeviceType = 0;\r
35596+ break;\r
35597+ }\r
35598+\r
35599+ if (pAC->GIni.GIMacsFound > 1) {\r
35600+\r
35601+ pAC->Pnmi.DeviceType++;\r
35602+ }\r
35603+ \r
35604+ /* Get connector type. */\r
35605+ switch (pAC->GIni.GIConTyp) {\r
35606+ \r
35607+ case 'C':\r
35608+ pAC->Pnmi.Connector = 2;\r
35609+ break;\r
35610+\r
35611+ case 'D':\r
35612+ pAC->Pnmi.Connector = 3;\r
35613+ break;\r
35614+\r
35615+ case 'F':\r
35616+ pAC->Pnmi.Connector = 4;\r
35617+ break;\r
35618+\r
35619+ case 'J':\r
35620+ pAC->Pnmi.Connector = 5;\r
35621+ break;\r
35622+\r
35623+ case 'V':\r
35624+ pAC->Pnmi.Connector = 6;\r
35625+ break;\r
35626+\r
35627+ default:\r
35628+ pAC->Pnmi.Connector = 1;\r
35629+ break;\r
35630+ }\r
35631+ break;\r
35632+\r
35633+ case SK_INIT_RUN:\r
35634+\r
35635+ /* Start timer for RLMT change counter. */\r
35636+ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));\r
35637+ \r
35638+ SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer,\r
35639+ SK_PNMI_EVT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER,\r
35640+ EventParam);\r
35641+ break;\r
35642+\r
35643+ default:\r
35644+ break; /* Nothing to do. */\r
35645+ }\r
35646+\r
35647+ return (0);\r
35648+}\r
35649+\r
35650+/*****************************************************************************\r
35651+ *\r
35652+ * SkPnmiGetVar - Retrieves the value of a single OID\r
35653+ *\r
35654+ * Description:\r
35655+ * Calls a general sub-function for all this stuff. If the instance\r
35656+ * -1 is passed, the values of all instances are returned in an\r
35657+ * array of values.\r
35658+ *\r
35659+ * Returns:\r
35660+ * SK_PNMI_ERR_OK The request was successfully performed\r
35661+ * SK_PNMI_ERR_GENERAL A general severe internal error occured\r
35662+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take\r
35663+ * the data.\r
35664+ * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown\r
35665+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
35666+ * exist (e.g. port instance 3 on a two port\r
35667+ * adapter.\r
35668+ */\r
35669+int SkPnmiGetVar(\r
35670+SK_AC *pAC, /* Pointer to adapter context */\r
35671+SK_IOC IoC, /* IO context handle */\r
35672+SK_U32 Id, /* Object ID that is to be processed */\r
35673+void *pBuf, /* Buffer to which the management data will be copied */\r
35674+unsigned int *pLen, /* On call: buffer length. On return: used buffer */\r
35675+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
35676+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
35677+{\r
35678+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
35679+ ("PNMI: SkPnmiGetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n",\r
35680+ Id, *pLen, Instance, NetIndex));\r
35681+\r
35682+ return (PnmiVar(pAC, IoC, SK_PNMI_GET, Id, (char *)pBuf, pLen,\r
35683+ Instance, NetIndex));\r
35684+}\r
35685+\r
35686+/*****************************************************************************\r
35687+ *\r
35688+ * SkPnmiPreSetVar - Presets the value of a single OID\r
35689+ *\r
35690+ * Description:\r
35691+ * Calls a general sub-function for all this stuff. The preset does\r
35692+ * the same as a set, but returns just before finally setting the\r
35693+ * new value. This is usefull to check if a set might be successfull.\r
35694+ * If the instance -1 is passed, an array of values is supposed and\r
35695+ * all instances of the OID will be set.\r
35696+ *\r
35697+ * Returns:\r
35698+ * SK_PNMI_ERR_OK The request was successfully performed.\r
35699+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
35700+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
35701+ * the correct data (e.g. a 32bit value is\r
35702+ * needed, but a 16 bit value was passed).\r
35703+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
35704+ * value range.\r
35705+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
35706+ * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown.\r
35707+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
35708+ * exist (e.g. port instance 3 on a two port\r
35709+ * adapter.\r
35710+ */\r
35711+int SkPnmiPreSetVar(\r
35712+SK_AC *pAC, /* Pointer to adapter context */\r
35713+SK_IOC IoC, /* IO context handle */\r
35714+SK_U32 Id, /* Object ID that is to be processed */\r
35715+void *pBuf, /* Buffer to which the management data will be copied */\r
35716+unsigned int *pLen, /* Total length of management data */\r
35717+SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */\r
35718+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
35719+{\r
35720+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
35721+ ("PNMI: SkPnmiPreSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n",\r
35722+ Id, *pLen, Instance, NetIndex));\r
35723+\r
35724+ return (PnmiVar(pAC, IoC, SK_PNMI_PRESET, Id, (char *)pBuf, pLen,\r
35725+ Instance, NetIndex));\r
35726+}\r
35727+\r
35728+/*****************************************************************************\r
35729+ *\r
35730+ * SkPnmiSetVar - Sets the value of a single OID\r
35731+ *\r
35732+ * Description:\r
35733+ * Calls a general sub-function for all this stuff. The preset does\r
35734+ * the same as a set, but returns just before finally setting the\r
35735+ * new value. This is usefull to check if a set might be successfull.\r
35736+ * If the instance -1 is passed, an array of values is supposed and\r
35737+ * all instances of the OID will be set.\r
35738+ *\r
35739+ * Returns:\r
35740+ * SK_PNMI_ERR_OK The request was successfully performed.\r
35741+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
35742+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
35743+ * the correct data (e.g. a 32bit value is\r
35744+ * needed, but a 16 bit value was passed).\r
35745+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
35746+ * value range.\r
35747+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
35748+ * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown.\r
35749+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
35750+ * exist (e.g. port instance 3 on a two port\r
35751+ * adapter.\r
35752+ */\r
35753+int SkPnmiSetVar(\r
35754+SK_AC *pAC, /* Pointer to adapter context */\r
35755+SK_IOC IoC, /* IO context handle */\r
35756+SK_U32 Id, /* Object ID that is to be processed */\r
35757+void *pBuf, /* Buffer to which the management data will be copied */\r
35758+unsigned int *pLen, /* Total length of management data */\r
35759+SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */\r
35760+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
35761+{\r
35762+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
35763+ ("PNMI: SkPnmiSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n",\r
35764+ Id, *pLen, Instance, NetIndex));\r
35765+\r
35766+ return (PnmiVar(pAC, IoC, SK_PNMI_SET, Id, (char *)pBuf, pLen,\r
35767+ Instance, NetIndex));\r
35768+}\r
35769+\r
35770+/*****************************************************************************\r
35771+ *\r
35772+ * SkPnmiGetStruct - Retrieves the management database in SK_PNMI_STRUCT_DATA\r
35773+ *\r
35774+ * Description:\r
35775+ * Runs through the IdTable, queries the single OIDs and stores the\r
35776+ * returned data into the management database structure\r
35777+ * SK_PNMI_STRUCT_DATA. The offset of the OID in the structure\r
35778+ * is stored in the IdTable. The return value of the function will also\r
35779+ * be stored in SK_PNMI_STRUCT_DATA if the passed buffer has the\r
35780+ * minimum size of SK_PNMI_MIN_STRUCT_SIZE.\r
35781+ *\r
35782+ * Returns:\r
35783+ * SK_PNMI_ERR_OK The request was successfully performed\r
35784+ * SK_PNMI_ERR_GENERAL A general severe internal error occured\r
35785+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take\r
35786+ * the data.\r
35787+ * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist\r
35788+ */\r
35789+int SkPnmiGetStruct(\r
35790+SK_AC *pAC, /* Pointer to adapter context */\r
35791+SK_IOC IoC, /* IO context handle */\r
35792+void *pBuf, /* Buffer to which the management data will be copied. */\r
35793+unsigned int *pLen, /* Length of buffer */\r
35794+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
35795+{\r
35796+ int Ret;\r
35797+ unsigned int TableIndex;\r
35798+ unsigned int DstOffset;\r
35799+ unsigned int InstanceNo;\r
35800+ unsigned int InstanceCnt;\r
35801+ SK_U32 Instance;\r
35802+ unsigned int TmpLen;\r
35803+ char KeyArr[SK_PNMI_VPD_ENTRIES][SK_PNMI_VPD_KEY_SIZE];\r
35804+\r
35805+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
35806+ ("PNMI: SkPnmiGetStruct: Called, BufLen=%d, NetIndex=%d\n",\r
35807+ *pLen, NetIndex));\r
35808+\r
35809+ if (*pLen < SK_PNMI_STRUCT_SIZE) {\r
35810+\r
35811+ if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) {\r
35812+\r
35813+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT, (SK_U32)(-1));\r
35814+ }\r
35815+\r
35816+ *pLen = SK_PNMI_STRUCT_SIZE;\r
35817+ return (SK_PNMI_ERR_TOO_SHORT);\r
35818+ }\r
35819+\r
35820+ /* Check NetIndex. */\r
35821+ if (NetIndex >= pAC->Rlmt.NumNets) {\r
35822+ return (SK_PNMI_ERR_UNKNOWN_NET);\r
35823+ }\r
35824+\r
35825+ /* Update statistics. */\r
35826+ SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On call");\r
35827+\r
35828+ if ((Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1)) !=\r
35829+ SK_PNMI_ERR_OK) {\r
35830+\r
35831+ SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));\r
35832+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
35833+ return (Ret);\r
35834+ }\r
35835+\r
35836+ if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {\r
35837+\r
35838+ SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));\r
35839+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
35840+ return (Ret);\r
35841+ }\r
35842+\r
35843+ if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {\r
35844+\r
35845+ SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));\r
35846+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
35847+ return (Ret);\r
35848+ }\r
35849+\r
35850+ /* Increment semaphores to indicate that an update was already done. */\r
35851+ pAC->Pnmi.MacUpdatedFlag ++;\r
35852+ pAC->Pnmi.RlmtUpdatedFlag ++;\r
35853+ pAC->Pnmi.SirqUpdatedFlag ++;\r
35854+\r
35855+ /*\r
35856+ * Get VPD keys for instance calculation.\r
35857+ * Please read comment in Vpd().\r
35858+ */\r
35859+ if (pAC->Pnmi.VpdKeyReadError == SK_FALSE) {\r
35860+ Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &TmpLen);\r
35861+ if (Ret != SK_PNMI_ERR_OK) {\r
35862+\r
35863+ pAC->Pnmi.MacUpdatedFlag --;\r
35864+ pAC->Pnmi.RlmtUpdatedFlag --;\r
35865+ pAC->Pnmi.SirqUpdatedFlag --;\r
35866+\r
35867+ SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");\r
35868+ SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));\r
35869+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
35870+ return (SK_PNMI_ERR_GENERAL);\r
35871+ }\r
35872+ }\r
35873+\r
35874+ /* Retrieve values. */\r
35875+ SK_MEMSET((char *)pBuf, 0, SK_PNMI_STRUCT_SIZE);\r
35876+ \r
35877+ for (TableIndex = 0; TableIndex < ID_TABLE_SIZE; TableIndex ++) {\r
35878+\r
35879+ InstanceNo = IdTable[TableIndex].InstanceNo;\r
35880+ for (InstanceCnt = 1; InstanceCnt <= InstanceNo; InstanceCnt ++) {\r
35881+\r
35882+ DstOffset = IdTable[TableIndex].Offset +\r
35883+ (InstanceCnt - 1) *\r
35884+ IdTable[TableIndex].StructSize;\r
35885+\r
35886+ /*\r
35887+ * For the VPD the instance is not an index number\r
35888+ * but the key itself. Determin with the instance\r
35889+ * counter the VPD key to be used.\r
35890+ */\r
35891+ if (IdTable[TableIndex].Id == OID_SKGE_VPD_KEY ||\r
35892+ IdTable[TableIndex].Id == OID_SKGE_VPD_VALUE ||\r
35893+ IdTable[TableIndex].Id == OID_SKGE_VPD_ACCESS ||\r
35894+ IdTable[TableIndex].Id == OID_SKGE_VPD_ACTION) {\r
35895+\r
35896+ SK_STRNCPY((char *)&Instance, KeyArr[InstanceCnt - 1], 4);\r
35897+ }\r
35898+ else {\r
35899+ Instance = (SK_U32)InstanceCnt;\r
35900+ }\r
35901+\r
35902+ TmpLen = *pLen - DstOffset;\r
35903+ Ret = IdTable[TableIndex].Func(pAC, IoC, SK_PNMI_GET,\r
35904+ IdTable[TableIndex].Id, (char *)pBuf +\r
35905+ DstOffset, &TmpLen, Instance, TableIndex, NetIndex);\r
35906+\r
35907+ /*\r
35908+ * An unknown instance error means that we reached\r
35909+ * the last instance of that variable. Proceed with\r
35910+ * the next OID in the table and ignore the return\r
35911+ * code.\r
35912+ */\r
35913+ if (Ret == SK_PNMI_ERR_UNKNOWN_INST) {\r
35914+\r
35915+ break;\r
35916+ }\r
35917+\r
35918+ if (Ret != SK_PNMI_ERR_OK) {\r
35919+\r
35920+ pAC->Pnmi.MacUpdatedFlag --;\r
35921+ pAC->Pnmi.RlmtUpdatedFlag --;\r
35922+ pAC->Pnmi.SirqUpdatedFlag --;\r
35923+\r
35924+ SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");\r
35925+ SK_PNMI_SET_STAT(pBuf, Ret, DstOffset);\r
35926+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
35927+ return (Ret);\r
35928+ }\r
35929+ }\r
35930+ }\r
35931+\r
35932+ pAC->Pnmi.MacUpdatedFlag --;\r
35933+ pAC->Pnmi.RlmtUpdatedFlag --;\r
35934+ pAC->Pnmi.SirqUpdatedFlag --;\r
35935+\r
35936+ *pLen = SK_PNMI_STRUCT_SIZE;\r
35937+ SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");\r
35938+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_OK, (SK_U32)(-1));\r
35939+ return (SK_PNMI_ERR_OK);\r
35940+}\r
35941+\r
35942+/*****************************************************************************\r
35943+ *\r
35944+ * SkPnmiPreSetStruct - Presets the management database in SK_PNMI_STRUCT_DATA\r
35945+ *\r
35946+ * Description:\r
35947+ * Calls a general sub-function for all this set stuff. The preset does\r
35948+ * the same as a set, but returns just before finally setting the\r
35949+ * new value. This is usefull to check if a set might be successfull.\r
35950+ * The sub-function runs through the IdTable, checks which OIDs are able\r
35951+ * to set, and calls the handler function of the OID to perform the\r
35952+ * preset. The return value of the function will also be stored in\r
35953+ * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of\r
35954+ * SK_PNMI_MIN_STRUCT_SIZE.\r
35955+ *\r
35956+ * Returns:\r
35957+ * SK_PNMI_ERR_OK The request was successfully performed.\r
35958+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
35959+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
35960+ * the correct data (e.g. a 32bit value is\r
35961+ * needed, but a 16 bit value was passed).\r
35962+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
35963+ * value range.\r
35964+ */\r
35965+int SkPnmiPreSetStruct(\r
35966+SK_AC *pAC, /* Pointer to adapter context */\r
35967+SK_IOC IoC, /* IO context handle */\r
35968+void *pBuf, /* Buffer which contains the data to be set */\r
35969+unsigned int *pLen, /* Length of buffer */\r
35970+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
35971+{\r
35972+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
35973+ ("PNMI: SkPnmiPreSetStruct: Called, BufLen=%d, NetIndex=%d\n",\r
35974+ *pLen, NetIndex));\r
35975+\r
35976+ return (PnmiStruct(pAC, IoC, SK_PNMI_PRESET, (char *)pBuf,\r
35977+ pLen, NetIndex));\r
35978+}\r
35979+\r
35980+/*****************************************************************************\r
35981+ *\r
35982+ * SkPnmiSetStruct - Sets the management database in SK_PNMI_STRUCT_DATA\r
35983+ *\r
35984+ * Description:\r
35985+ * Calls a general sub-function for all this set stuff. The return value\r
35986+ * of the function will also be stored in SK_PNMI_STRUCT_DATA if the\r
35987+ * passed buffer has the minimum size of SK_PNMI_MIN_STRUCT_SIZE.\r
35988+ * The sub-function runs through the IdTable, checks which OIDs are able\r
35989+ * to set, and calls the handler function of the OID to perform the\r
35990+ * set. The return value of the function will also be stored in\r
35991+ * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of\r
35992+ * SK_PNMI_MIN_STRUCT_SIZE.\r
35993+ *\r
35994+ * Returns:\r
35995+ * SK_PNMI_ERR_OK The request was successfully performed.\r
35996+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
35997+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
35998+ * the correct data (e.g. a 32bit value is\r
35999+ * needed, but a 16 bit value was passed).\r
36000+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
36001+ * value range.\r
36002+ */\r
36003+int SkPnmiSetStruct(\r
36004+SK_AC *pAC, /* Pointer to adapter context */\r
36005+SK_IOC IoC, /* IO context handle */\r
36006+void *pBuf, /* Buffer which contains the data to be set */\r
36007+unsigned int *pLen, /* Length of buffer */\r
36008+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
36009+{\r
36010+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36011+ ("PNMI: SkPnmiSetStruct: Called, BufLen=%d, NetIndex=%d\n",\r
36012+ *pLen, NetIndex));\r
36013+\r
36014+ return (PnmiStruct(pAC, IoC, SK_PNMI_SET, (char *)pBuf,\r
36015+ pLen, NetIndex));\r
36016+}\r
36017+\r
36018+/*****************************************************************************\r
36019+ *\r
36020+ * SkPnmiEvent - Event handler\r
36021+ *\r
36022+ * Description:\r
36023+ * Handles the following events:\r
36024+ * SK_PNMI_EVT_SIRQ_OVERFLOW When a hardware counter overflows an\r
36025+ * interrupt will be generated which is\r
36026+ * first handled by SIRQ which generates a\r
36027+ * this event. The event increments the\r
36028+ * upper 32 bit of the 64 bit counter.\r
36029+ * SK_PNMI_EVT_SEN_XXX The event is generated by the I2C module\r
36030+ * when a sensor reports a warning or\r
36031+ * error. The event will store a trap\r
36032+ * message in the trap buffer.\r
36033+ * SK_PNMI_EVT_CHG_EST_TIMER The timer event was initiated by this\r
36034+ * module and is used to calculate the\r
36035+ * port switches per hour.\r
36036+ * SK_PNMI_EVT_CLEAR_COUNTER The event clears all counters and\r
36037+ * timestamps.\r
36038+ * SK_PNMI_EVT_XMAC_RESET The event is generated by the driver\r
36039+ * before a hard reset of the XMAC is\r
36040+ * performed. All counters will be saved\r
36041+ * and added to the hardware counter\r
36042+ * values after reset to grant continuous\r
36043+ * counter values.\r
36044+ * SK_PNMI_EVT_RLMT_PORT_UP Generated by RLMT to notify that a port\r
36045+ * went logically up. A trap message will\r
36046+ * be stored to the trap buffer.\r
36047+ * SK_PNMI_EVT_RLMT_PORT_DOWN Generated by RLMT to notify that a port\r
36048+ * went logically down. A trap message will\r
36049+ * be stored to the trap buffer.\r
36050+ * SK_PNMI_EVT_RLMT_SEGMENTATION Generated by RLMT to notify that two\r
36051+ * spanning tree root bridges were\r
36052+ * detected. A trap message will be stored\r
36053+ * to the trap buffer.\r
36054+ * SK_PNMI_EVT_RLMT_ACTIVE_DOWN Notifies PNMI that an active port went\r
36055+ * down. PNMI will not further add the\r
36056+ * statistic values to the virtual port.\r
36057+ * SK_PNMI_EVT_RLMT_ACTIVE_UP Notifies PNMI that a port went up and\r
36058+ * is now an active port. PNMI will now\r
36059+ * add the statistic data of this port to\r
36060+ * the virtual port.\r
36061+ * SK_PNMI_EVT_RLMT_SET_NETS Notifies PNMI about the net mode. The first parameter\r
36062+ * contains the number of nets. 1 means single net, 2 means\r
36063+ * dual net. The second parameter is -1\r
36064+ *\r
36065+ * Returns:\r
36066+ * Always 0\r
36067+ */\r
36068+int SkPnmiEvent(\r
36069+SK_AC *pAC, /* Pointer to adapter context */\r
36070+SK_IOC IoC, /* IO context handle */\r
36071+SK_U32 Event, /* Event-Id */\r
36072+SK_EVPARA Param) /* Event dependent parameter */\r
36073+{\r
36074+ unsigned int PhysPortIndex;\r
36075+ unsigned int MaxNetNumber;\r
36076+ int CounterIndex;\r
36077+ SK_U16 MacStatus;\r
36078+ SK_U64 OverflowStatus;\r
36079+ SK_U64 Mask;\r
36080+ int MacType;\r
36081+ SK_U64 Value;\r
36082+ SK_U32 Val32;\r
36083+ SK_U16 Register;\r
36084+ SK_EVPARA EventParam;\r
36085+ SK_U64 NewestValue;\r
36086+ SK_U64 OldestValue;\r
36087+ SK_U64 Delta;\r
36088+ SK_PNMI_ESTIMATE *pEst;\r
36089+ SK_U32 NetIndex;\r
36090+ SK_U32 RetCode;\r
36091+\r
36092+#ifdef DEBUG\r
36093+ if (Event != SK_PNMI_EVT_XMAC_RESET) {\r
36094+\r
36095+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36096+ ("PNMI: SkPnmiEvent: Called, Event=0x%x, Param=0x%x\n",\r
36097+ (unsigned int)Event, (unsigned int)Param.Para64));\r
36098+ }\r
36099+#endif /* DEBUG */\r
36100+ SK_PNMI_CHECKFLAGS("SkPnmiEvent: On call");\r
36101+\r
36102+ MacType = pAC->GIni.GIMacType;\r
36103+ \r
36104+ switch (Event) {\r
36105+\r
36106+ case SK_PNMI_EVT_SIRQ_OVERFLOW:\r
36107+ PhysPortIndex = (int)Param.Para32[0];\r
36108+ MacStatus = (SK_U16)Param.Para32[1];\r
36109+#ifdef DEBUG\r
36110+ if (PhysPortIndex >= SK_MAX_MACS) {\r
36111+\r
36112+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36113+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SIRQ_OVERFLOW parameter"\r
36114+ " wrong, PhysPortIndex=0x%x\n",\r
36115+ PhysPortIndex));\r
36116+ return (0);\r
36117+ }\r
36118+#endif /* DEBUG */\r
36119+ OverflowStatus = 0;\r
36120+\r
36121+ /* Check which source caused an overflow interrupt. */\r
36122+ if ((pAC->GIni.GIFunc.pFnMacOverflow(pAC, IoC, PhysPortIndex,\r
36123+ MacStatus, &OverflowStatus) != 0) ||\r
36124+ (OverflowStatus == 0)) {\r
36125+\r
36126+ SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");\r
36127+ return (0);\r
36128+ }\r
36129+\r
36130+ /*\r
36131+ * Check the overflow status register and increment\r
36132+ * the upper dword of corresponding counter.\r
36133+ */\r
36134+ for (CounterIndex = 0; CounterIndex < sizeof(Mask) * 8;\r
36135+ CounterIndex ++) {\r
36136+\r
36137+ Mask = (SK_U64)1 << CounterIndex;\r
36138+ if ((OverflowStatus & Mask) == 0) {\r
36139+ continue;\r
36140+ }\r
36141+\r
36142+ switch (StatOvrflwBit[CounterIndex][MacType]) {\r
36143+\r
36144+ case SK_PNMI_HTX_UTILUNDER:\r
36145+ case SK_PNMI_HTX_UTILOVER:\r
36146+ if (MacType == SK_MAC_XMAC) {\r
36147+ XM_IN16(IoC, PhysPortIndex, XM_TX_CMD, &Register);\r
36148+ Register |= XM_TX_SAM_LINE;\r
36149+ XM_OUT16(IoC, PhysPortIndex, XM_TX_CMD, Register);\r
36150+ }\r
36151+ break;\r
36152+\r
36153+ case SK_PNMI_HRX_UTILUNDER:\r
36154+ case SK_PNMI_HRX_UTILOVER:\r
36155+ if (MacType == SK_MAC_XMAC) {\r
36156+ XM_IN16(IoC, PhysPortIndex, XM_RX_CMD, &Register);\r
36157+ Register |= XM_RX_SAM_LINE;\r
36158+ XM_OUT16(IoC, PhysPortIndex, XM_RX_CMD, Register);\r
36159+ }\r
36160+ break;\r
36161+\r
36162+ case SK_PNMI_HTX_OCTETHIGH:\r
36163+ case SK_PNMI_HTX_OCTETLOW:\r
36164+ case SK_PNMI_HTX_RESERVED:\r
36165+ case SK_PNMI_HRX_OCTETHIGH:\r
36166+ case SK_PNMI_HRX_OCTETLOW:\r
36167+ case SK_PNMI_HRX_IRLENGTH:\r
36168+ case SK_PNMI_HRX_RESERVED:\r
36169+ \r
36170+ /* The following counters aren't be handled (id > 63). */\r
36171+ case SK_PNMI_HTX_SYNC:\r
36172+ case SK_PNMI_HTX_SYNC_OCTET:\r
36173+ break;\r
36174+\r
36175+ case SK_PNMI_HRX_LONGFRAMES:\r
36176+ if (MacType == SK_MAC_GMAC) {\r
36177+ pAC->Pnmi.Port[PhysPortIndex].\r
36178+ CounterHigh[CounterIndex] ++;\r
36179+ }\r
36180+ break;\r
36181+\r
36182+ default:\r
36183+ pAC->Pnmi.Port[PhysPortIndex].\r
36184+ CounterHigh[CounterIndex] ++;\r
36185+ }\r
36186+ }\r
36187+ break;\r
36188+\r
36189+ case SK_PNMI_EVT_SEN_WAR_LOW:\r
36190+#ifdef DEBUG\r
36191+ if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {\r
36192+\r
36193+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36194+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_LOW parameter wrong, SensorIndex=%d\n",\r
36195+ (unsigned int)Param.Para64));\r
36196+ return (0);\r
36197+ }\r
36198+#endif /* DEBUG */\r
36199+\r
36200+ /*\r
36201+ * Store a trap message in the trap buffer and generate\r
36202+ * an event for user space applications with the\r
36203+ * SK_DRIVER_SENDEVENT macro.\r
36204+ */\r
36205+ QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_WAR_LOW,\r
36206+ (unsigned int)Param.Para64);\r
36207+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36208+ break;\r
36209+\r
36210+ case SK_PNMI_EVT_SEN_WAR_UPP:\r
36211+#ifdef DEBUG\r
36212+ if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {\r
36213+\r
36214+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36215+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_UPP parameter wrong, SensorIndex=%d\n",\r
36216+ (unsigned int)Param.Para64));\r
36217+ return (0);\r
36218+ }\r
36219+#endif /* DEBUG */\r
36220+\r
36221+ /*\r
36222+ * Store a trap message in the trap buffer and generate\r
36223+ * an event for user space applications with the\r
36224+ * SK_DRIVER_SENDEVENT macro.\r
36225+ */\r
36226+ QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_WAR_UPP,\r
36227+ (unsigned int)Param.Para64);\r
36228+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36229+ break;\r
36230+\r
36231+ case SK_PNMI_EVT_SEN_ERR_LOW:\r
36232+#ifdef DEBUG\r
36233+ if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {\r
36234+\r
36235+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36236+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_ERR_LOW parameter wrong, SensorIndex=%d\n",\r
36237+ (unsigned int)Param.Para64));\r
36238+ return (0);\r
36239+ }\r
36240+#endif /* DEBUG */\r
36241+\r
36242+ /*\r
36243+ * Store a trap message in the trap buffer and generate\r
36244+ * an event for user space applications with the\r
36245+ * SK_DRIVER_SENDEVENT macro.\r
36246+ */\r
36247+ QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_ERR_LOW,\r
36248+ (unsigned int)Param.Para64);\r
36249+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36250+ break;\r
36251+ \r
36252+ case SK_PNMI_EVT_SEN_ERR_UPP:\r
36253+#ifdef DEBUG\r
36254+ if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {\r
36255+\r
36256+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36257+ ("PNMI: ERR: SK_PNMI_EVT_SEN_ERR_UPP parameter wrong, SensorIndex=%d\n",\r
36258+ (unsigned int)Param.Para64));\r
36259+ return (0);\r
36260+ }\r
36261+#endif /* DEBUG */\r
36262+\r
36263+ /*\r
36264+ * Store a trap message in the trap buffer and generate\r
36265+ * an event for user space applications with the\r
36266+ * SK_DRIVER_SENDEVENT macro.\r
36267+ */\r
36268+ QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_ERR_UPP,\r
36269+ (unsigned int)Param.Para64);\r
36270+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36271+ break;\r
36272+\r
36273+ case SK_PNMI_EVT_CHG_EST_TIMER:\r
36274+ /*\r
36275+ * Calculate port switch average on a per hour basis\r
36276+ * Time interval for check : 28125 ms (SK_PNMI_EVT_TIMER_CHECK)\r
36277+ * Number of values for average : 8\r
36278+ *\r
36279+ * Be careful in changing these values, on change check\r
36280+ * - typedef of SK_PNMI_ESTIMATE (Size of EstValue\r
36281+ * array one less than value number)\r
36282+ * - Timer initialization SkTimerStart() in SkPnmiInit\r
36283+ * - Delta value below must be multiplicated with power of 2\r
36284+ */\r
36285+ pEst = &pAC->Pnmi.RlmtChangeEstimate;\r
36286+ CounterIndex = pEst->EstValueIndex + 1;\r
36287+ if (CounterIndex == 7) {\r
36288+\r
36289+ CounterIndex = 0;\r
36290+ }\r
36291+ pEst->EstValueIndex = CounterIndex;\r
36292+\r
36293+ NewestValue = pAC->Pnmi.RlmtChangeCts;\r
36294+ OldestValue = pEst->EstValue[CounterIndex];\r
36295+ pEst->EstValue[CounterIndex] = NewestValue;\r
36296+\r
36297+ /*\r
36298+ * Calculate average. Delta stores the number of\r
36299+ * port switches per 28125 * 8 = 225000 ms\r
36300+ */\r
36301+ if (NewestValue >= OldestValue) {\r
36302+\r
36303+ Delta = NewestValue - OldestValue;\r
36304+ }\r
36305+ else {\r
36306+ /* Overflow situation. */\r
36307+ Delta = (SK_U64)(0 - OldestValue) + NewestValue;\r
36308+ }\r
36309+\r
36310+ /*\r
36311+ * Extrapolate delta to port switches per hour.\r
36312+ * Estimate = Delta * (3600000 / 225000)\r
36313+ * = Delta * 16\r
36314+ * = Delta << 4\r
36315+ */\r
36316+ pAC->Pnmi.RlmtChangeEstimate.Estimate = Delta << 4;\r
36317+\r
36318+ /*\r
36319+ * Check if threshold is exceeded. If the threshold is\r
36320+ * permanently exceeded every 28125 ms an event will be\r
36321+ * generated to remind the user of this condition.\r
36322+ */\r
36323+ if ((pAC->Pnmi.RlmtChangeThreshold != 0) &&\r
36324+ (pAC->Pnmi.RlmtChangeEstimate.Estimate >=\r
36325+ pAC->Pnmi.RlmtChangeThreshold)) {\r
36326+\r
36327+ QueueSimpleTrap(pAC, OID_SKGE_TRAP_RLMT_CHANGE_THRES);\r
36328+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36329+ }\r
36330+\r
36331+ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));\r
36332+ \r
36333+ SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer,\r
36334+ SK_PNMI_EVT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER,\r
36335+ EventParam);\r
36336+ break;\r
36337+\r
36338+ case SK_PNMI_EVT_CLEAR_COUNTER:\r
36339+ /*\r
36340+ * Param.Para32[0] contains the NetIndex (0 ..1).\r
36341+ * Param.Para32[1] is reserved, contains -1.\r
36342+ */\r
36343+ NetIndex = (SK_U32)Param.Para32[0];\r
36344+\r
36345+#ifdef DEBUG\r
36346+ if (NetIndex >= pAC->Rlmt.NumNets) {\r
36347+\r
36348+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36349+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_CLEAR_COUNTER parameter wrong, NetIndex=%d\n",\r
36350+ NetIndex));\r
36351+\r
36352+ return (0);\r
36353+ }\r
36354+#endif /* DEBUG */\r
36355+\r
36356+ /*\r
36357+ * Set all counters and timestamps to zero.\r
36358+ * The according NetIndex is required as a\r
36359+ * parameter of the event.\r
36360+ */\r
36361+ ResetCounter(pAC, IoC, NetIndex);\r
36362+ break;\r
36363+\r
36364+ case SK_PNMI_EVT_XMAC_RESET:\r
36365+ /*\r
36366+ * To grant continuous counter values store the current\r
36367+ * XMAC statistic values to the entries 1..n of the\r
36368+ * CounterOffset array. XMAC Errata #2\r
36369+ */\r
36370+#ifdef DEBUG\r
36371+ if ((unsigned int)Param.Para64 >= SK_MAX_MACS) {\r
36372+\r
36373+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36374+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_XMAC_RESET parameter wrong, PhysPortIndex=%d\n",\r
36375+ (unsigned int)Param.Para64));\r
36376+ return (0);\r
36377+ }\r
36378+#endif /* DEBUG */\r
36379+\r
36380+ PhysPortIndex = (unsigned int)Param.Para64;\r
36381+\r
36382+ /* Update XMAC statistic to get fresh values. */\r
36383+ if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) !=\r
36384+ SK_PNMI_ERR_OK) {\r
36385+\r
36386+ SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");\r
36387+ return (0);\r
36388+ }\r
36389+\r
36390+ /* Increment semaphore to indicate that an update was already done. */\r
36391+ pAC->Pnmi.MacUpdatedFlag ++;\r
36392+\r
36393+ for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;\r
36394+ CounterIndex ++) {\r
36395+\r
36396+ if (!StatAddr[CounterIndex][MacType].GetOffset) {\r
36397+ continue;\r
36398+ }\r
36399+\r
36400+ pAC->Pnmi.Port[PhysPortIndex].CounterOffset[CounterIndex] =\r
36401+ GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);\r
36402+ \r
36403+ pAC->Pnmi.Port[PhysPortIndex].CounterHigh[CounterIndex] = 0;\r
36404+ }\r
36405+\r
36406+ pAC->Pnmi.MacUpdatedFlag --;\r
36407+ break;\r
36408+\r
36409+ case SK_PNMI_EVT_RLMT_PORT_UP:\r
36410+ PhysPortIndex = (unsigned int)Param.Para32[0];\r
36411+#ifdef DEBUG\r
36412+ if (PhysPortIndex >= SK_MAX_MACS) {\r
36413+\r
36414+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36415+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_PORT_UP parameter"\r
36416+ " wrong, PhysPortIndex=%d\n", PhysPortIndex));\r
36417+\r
36418+ return (0);\r
36419+ }\r
36420+#endif /* DEBUG */\r
36421+\r
36422+ /*\r
36423+ * Store a trap message in the trap buffer and generate an event for\r
36424+ * user space applications with the SK_DRIVER_SENDEVENT macro.\r
36425+ */\r
36426+ QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_UP, PhysPortIndex);\r
36427+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36428+\r
36429+ /* Bugfix for XMAC errata (#10620). */\r
36430+ if (MacType == SK_MAC_XMAC) {\r
36431+ /* Add incremental difference to offset (#10620). */\r
36432+ (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
36433+ XM_RXE_SHT_ERR, &Val32);\r
36434+ \r
36435+ Value = (((SK_U64)pAC->Pnmi.Port[PhysPortIndex].\r
36436+ CounterHigh[SK_PNMI_HRX_SHORTS] << 32) | (SK_U64)Val32);\r
36437+ \r
36438+ pAC->Pnmi.Port[PhysPortIndex].CounterOffset[SK_PNMI_HRX_SHORTS] +=\r
36439+ Value - pAC->Pnmi.Port[PhysPortIndex].RxShortZeroMark;\r
36440+ }\r
36441+ \r
36442+ /* Tell VctStatus() that a link was up meanwhile. */\r
36443+ pAC->Pnmi.VctStatus[PhysPortIndex] |= SK_PNMI_VCT_LINK; \r
36444+ break;\r
36445+\r
36446+ case SK_PNMI_EVT_RLMT_PORT_DOWN:\r
36447+ PhysPortIndex = (unsigned int)Param.Para32[0];\r
36448+\r
36449+#ifdef DEBUG\r
36450+ if (PhysPortIndex >= SK_MAX_MACS) {\r
36451+\r
36452+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36453+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_PORT_DOWN parameter"\r
36454+ " wrong, PhysPortIndex=%d\n", PhysPortIndex));\r
36455+\r
36456+ return (0);\r
36457+ }\r
36458+#endif /* DEBUG */\r
36459+\r
36460+ /*\r
36461+ * Store a trap message in the trap buffer and generate an event for\r
36462+ * user space applications with the SK_DRIVER_SENDEVENT macro.\r
36463+ */\r
36464+ QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_DOWN, PhysPortIndex);\r
36465+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36466+\r
36467+ /* Bugfix #10620 - get zero level for incremental difference. */\r
36468+ if (MacType == SK_MAC_XMAC) {\r
36469+\r
36470+ (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
36471+ XM_RXE_SHT_ERR, &Val32);\r
36472+ \r
36473+ pAC->Pnmi.Port[PhysPortIndex].RxShortZeroMark =\r
36474+ (((SK_U64)pAC->Pnmi.Port[PhysPortIndex].\r
36475+ CounterHigh[SK_PNMI_HRX_SHORTS] << 32) | (SK_U64)Val32);\r
36476+ }\r
36477+ break;\r
36478+\r
36479+ case SK_PNMI_EVT_RLMT_ACTIVE_DOWN:\r
36480+ PhysPortIndex = (unsigned int)Param.Para32[0];\r
36481+ NetIndex = (SK_U32)Param.Para32[1];\r
36482+\r
36483+#ifdef DEBUG\r
36484+ if (PhysPortIndex >= SK_MAX_MACS) {\r
36485+\r
36486+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36487+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_DOWN parameter too high, PhysPort=%d\n",\r
36488+ PhysPortIndex));\r
36489+ }\r
36490+\r
36491+ if (NetIndex >= pAC->Rlmt.NumNets) {\r
36492+\r
36493+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36494+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_DOWN parameter too high, NetIndex=%d\n",\r
36495+ NetIndex));\r
36496+ }\r
36497+#endif /* DEBUG */\r
36498+\r
36499+ /* For now, ignore event if NetIndex != 0. */\r
36500+ if (Param.Para32[1] != 0) {\r
36501+\r
36502+ return (0);\r
36503+ }\r
36504+\r
36505+ /* Nothing to do if port is already inactive. */\r
36506+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
36507+\r
36508+ return (0);\r
36509+ }\r
36510+\r
36511+ /*\r
36512+ * Update statistic counters to calculate new offset for the virtual\r
36513+ * port and increment semaphore to indicate that an update was already\r
36514+ * done.\r
36515+ */\r
36516+ if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) !=\r
36517+ SK_PNMI_ERR_OK) {\r
36518+\r
36519+ SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");\r
36520+ return (0);\r
36521+ }\r
36522+ pAC->Pnmi.MacUpdatedFlag ++;\r
36523+\r
36524+ /*\r
36525+ * Calculate new counter offset for virtual port to grant continous\r
36526+ * counting on port switches. The virtual port consists of all currently\r
36527+ * active ports. The port down event indicates that a port is removed\r
36528+ * from the virtual port. Therefore add the counter value of the removed\r
36529+ * port to the CounterOffset for the virtual port to grant the same\r
36530+ * counter value.\r
36531+ */\r
36532+ for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;\r
36533+ CounterIndex ++) {\r
36534+\r
36535+ if (!StatAddr[CounterIndex][MacType].GetOffset) {\r
36536+ continue;\r
36537+ }\r
36538+\r
36539+ Value = GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);\r
36540+\r
36541+ pAC->Pnmi.VirtualCounterOffset[CounterIndex] += Value;\r
36542+ }\r
36543+\r
36544+ /* Set port to inactive. */\r
36545+ pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_FALSE;\r
36546+\r
36547+ pAC->Pnmi.MacUpdatedFlag --;\r
36548+ break;\r
36549+\r
36550+ case SK_PNMI_EVT_RLMT_ACTIVE_UP:\r
36551+ PhysPortIndex = (unsigned int)Param.Para32[0];\r
36552+ NetIndex = (SK_U32)Param.Para32[1];\r
36553+\r
36554+#ifdef DEBUG\r
36555+ if (PhysPortIndex >= SK_MAX_MACS) {\r
36556+\r
36557+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36558+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_UP parameter too high, PhysPort=%d\n",\r
36559+ PhysPortIndex));\r
36560+ }\r
36561+\r
36562+ if (NetIndex >= pAC->Rlmt.NumNets) {\r
36563+\r
36564+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
36565+ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_UP parameter too high, NetIndex=%d\n",\r
36566+ NetIndex));\r
36567+ }\r
36568+#endif /* DEBUG */\r
36569+\r
36570+ /* For now, ignore event if NetIndex != 0. */\r
36571+ if (Param.Para32[1] != 0) {\r
36572+\r
36573+ return (0);\r
36574+ }\r
36575+\r
36576+ /* Nothing to do if port is already inactive. */\r
36577+ if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
36578+\r
36579+ return (0);\r
36580+ }\r
36581+\r
36582+ /* Statistic maintenance. */\r
36583+ pAC->Pnmi.RlmtChangeCts ++;\r
36584+ pAC->Pnmi.RlmtChangeTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));\r
36585+\r
36586+ /*\r
36587+ * Store a trap message in the trap buffer and generate an event for\r
36588+ * user space applications with the SK_DRIVER_SENDEVENT macro.\r
36589+ */\r
36590+ QueueRlmtNewMacTrap(pAC, PhysPortIndex);\r
36591+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36592+\r
36593+ /*\r
36594+ * Update statistic counters to calculate new offset for the virtual\r
36595+ * port and increment semaphore to indicate that an update was\r
36596+ * already done.\r
36597+ */\r
36598+ if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) !=\r
36599+ SK_PNMI_ERR_OK) {\r
36600+\r
36601+ SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");\r
36602+ return (0);\r
36603+ }\r
36604+ pAC->Pnmi.MacUpdatedFlag ++;\r
36605+\r
36606+ /*\r
36607+ * Calculate new counter offset for virtual port to grant continous\r
36608+ * counting on port switches. A new port is added to the virtual port.\r
36609+ * Therefore substract the counter value of the new port from the\r
36610+ * CounterOffset for the virtual port to grant the same value.\r
36611+ */\r
36612+ for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;\r
36613+ CounterIndex ++) {\r
36614+\r
36615+ if (!StatAddr[CounterIndex][MacType].GetOffset) {\r
36616+ continue;\r
36617+ }\r
36618+\r
36619+ Value = GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);\r
36620+\r
36621+ pAC->Pnmi.VirtualCounterOffset[CounterIndex] -= Value;\r
36622+ }\r
36623+\r
36624+ /* Set port to active. */\r
36625+ pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_TRUE;\r
36626+\r
36627+ pAC->Pnmi.MacUpdatedFlag --;\r
36628+ break;\r
36629+\r
36630+ case SK_PNMI_EVT_RLMT_SEGMENTATION:\r
36631+ /* Para.Para32[0] contains the NetIndex. */\r
36632+\r
36633+ /*\r
36634+ * Store a trap message in the trap buffer and generate an event for\r
36635+ * user space applications with the SK_DRIVER_SENDEVENT macro.\r
36636+ */\r
36637+ QueueSimpleTrap(pAC, OID_SKGE_TRAP_RLMT_SEGMENTATION);\r
36638+ (void)SK_DRIVER_SENDEVENT(pAC, IoC);\r
36639+ break;\r
36640+\r
36641+ case SK_PNMI_EVT_RLMT_SET_NETS:\r
36642+ /*\r
36643+ * Param.Para32[0] contains the number of Nets.\r
36644+ * Param.Para32[1] is reserved, contains -1.\r
36645+ */\r
36646+ /* Check number of nets. */\r
36647+ MaxNetNumber = pAC->GIni.GIMacsFound;\r
36648+ \r
36649+ if (((unsigned int)Param.Para32[0] < 1) ||\r
36650+ ((unsigned int)Param.Para32[0] > MaxNetNumber)) {\r
36651+ \r
36652+ return (SK_PNMI_ERR_UNKNOWN_NET);\r
36653+ }\r
36654+\r
36655+ if ((unsigned int)Param.Para32[0] == 1) { /* SingleNet mode. */\r
36656+ pAC->Pnmi.DualNetActiveFlag = SK_FALSE;\r
36657+ }\r
36658+ else { /* DualNet mode. */\r
36659+ pAC->Pnmi.DualNetActiveFlag = SK_TRUE;\r
36660+ }\r
36661+ break;\r
36662+\r
36663+ case SK_PNMI_EVT_VCT_RESET:\r
36664+ PhysPortIndex = Param.Para32[0];\r
36665+ \r
36666+ if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING) {\r
36667+ \r
36668+ RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE);\r
36669+ \r
36670+ if (RetCode == 2) {\r
36671+ /*\r
36672+ * VCT test is still running.\r
36673+ * Start VCT timer counter again.\r
36674+ */\r
36675+ SK_MEMSET((char *)&Param, 0, sizeof(Param));\r
36676+ \r
36677+ Param.Para32[0] = PhysPortIndex;\r
36678+ Param.Para32[1] = -1;\r
36679+ \r
36680+ SkTimerStart(pAC, IoC, &pAC->Pnmi.VctTimeout[PhysPortIndex],\r
36681+ SK_PNMI_VCT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Param);\r
36682+ \r
36683+ break;\r
36684+ }\r
36685+ \r
36686+ VctGetResults(pAC, IoC, PhysPortIndex);\r
36687+ \r
36688+ EventParam.Para32[0] = PhysPortIndex;\r
36689+ EventParam.Para32[1] = -1;\r
36690+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, EventParam);\r
36691+\r
36692+ /* SkEventDispatcher(pAC, IoC); */\r
36693+ }\r
36694+ \r
36695+ break;\r
36696+\r
36697+ default:\r
36698+ break;\r
36699+ }\r
36700+\r
36701+ SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");\r
36702+ return (0);\r
36703+}\r
36704+\r
36705+\r
36706+/******************************************************************************\r
36707+ *\r
36708+ * Private functions\r
36709+ *\r
36710+ */\r
36711+\r
36712+/*****************************************************************************\r
36713+ *\r
36714+ * PnmiVar - Gets, presets, and sets single OIDs\r
36715+ *\r
36716+ * Description:\r
36717+ * Looks up the requested OID, calls the corresponding handler\r
36718+ * function, and passes the parameters with the get, preset, or\r
36719+ * set command. The function is called by SkGePnmiGetVar,\r
36720+ * SkGePnmiPreSetVar, or SkGePnmiSetVar.\r
36721+ *\r
36722+ * Returns:\r
36723+ * SK_PNMI_ERR_XXX. For details have a look at the description of the\r
36724+ * calling functions.\r
36725+ * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist\r
36726+ */\r
36727+PNMI_STATIC int PnmiVar(\r
36728+SK_AC *pAC, /* Pointer to adapter context */\r
36729+SK_IOC IoC, /* IO context handle */\r
36730+int Action, /* GET/PRESET/SET action */\r
36731+SK_U32 Id, /* Object ID that is to be processed */\r
36732+char *pBuf, /* Buffer used for the management data transfer */\r
36733+unsigned int *pLen, /* Total length of pBuf management data */\r
36734+SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */\r
36735+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
36736+{\r
36737+ unsigned int TableIndex;\r
36738+ int Ret;\r
36739+\r
36740+ if ((TableIndex = LookupId(Id)) == (unsigned int)(-1)) {\r
36741+\r
36742+ *pLen = 0;\r
36743+ return (SK_PNMI_ERR_UNKNOWN_OID);\r
36744+ }\r
36745+ \r
36746+ /* Check NetIndex. */\r
36747+ if (NetIndex >= pAC->Rlmt.NumNets) {\r
36748+ return (SK_PNMI_ERR_UNKNOWN_NET);\r
36749+ }\r
36750+\r
36751+ SK_PNMI_CHECKFLAGS("PnmiVar: On call");\r
36752+\r
36753+ Ret = IdTable[TableIndex].Func(pAC, IoC, Action, Id, pBuf, pLen,\r
36754+ Instance, TableIndex, NetIndex);\r
36755+\r
36756+ SK_PNMI_CHECKFLAGS("PnmiVar: On return");\r
36757+\r
36758+ return (Ret);\r
36759+}\r
36760+\r
36761+/*****************************************************************************\r
36762+ *\r
36763+ * PnmiStruct - Presets and Sets data in structure SK_PNMI_STRUCT_DATA\r
36764+ *\r
36765+ * Description:\r
36766+ * The return value of the function will also be stored in\r
36767+ * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of\r
36768+ * SK_PNMI_MIN_STRUCT_SIZE. The sub-function runs through the IdTable,\r
36769+ * checks which OIDs are able to set, and calls the handler function of\r
36770+ * the OID to perform the set. The return value of the function will\r
36771+ * also be stored in SK_PNMI_STRUCT_DATA if the passed buffer has the\r
36772+ * minimum size of SK_PNMI_MIN_STRUCT_SIZE. The function is called\r
36773+ * by SkGePnmiPreSetStruct and SkGePnmiSetStruct.\r
36774+ *\r
36775+ * Returns:\r
36776+ * SK_PNMI_ERR_XXX. The codes are described in the calling functions.\r
36777+ * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist\r
36778+ */\r
36779+PNMI_STATIC int PnmiStruct(\r
36780+SK_AC *pAC, /* Pointer to adapter context */\r
36781+SK_IOC IoC, /* IO context handle */\r
36782+int Action, /* PRESET/SET action to be performed */\r
36783+char *pBuf, /* Buffer used for the management data transfer */\r
36784+unsigned int *pLen, /* Length of pBuf management data buffer */\r
36785+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
36786+{\r
36787+ int Ret;\r
36788+ unsigned int TableIndex;\r
36789+ unsigned int DstOffset;\r
36790+ unsigned int Len;\r
36791+ unsigned int InstanceNo;\r
36792+ unsigned int InstanceCnt;\r
36793+ SK_U32 Instance;\r
36794+ SK_U32 Id;\r
36795+\r
36796+ /* Check if the passed buffer has the right size. */\r
36797+ if (*pLen < SK_PNMI_STRUCT_SIZE) {\r
36798+\r
36799+ /* Check if we can return the error within the buffer. */\r
36800+ if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) {\r
36801+\r
36802+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT, (SK_U32)(-1));\r
36803+ }\r
36804+\r
36805+ *pLen = SK_PNMI_STRUCT_SIZE;\r
36806+ return (SK_PNMI_ERR_TOO_SHORT);\r
36807+ }\r
36808+ \r
36809+ /* Check NetIndex. */\r
36810+ if (NetIndex >= pAC->Rlmt.NumNets) {\r
36811+ return (SK_PNMI_ERR_UNKNOWN_NET);\r
36812+ }\r
36813+ \r
36814+ SK_PNMI_CHECKFLAGS("PnmiStruct: On call");\r
36815+\r
36816+ /*\r
36817+ * Update the values of RLMT and SIRQ and increment semaphores to\r
36818+ * indicate that an update was already done.\r
36819+ */\r
36820+ if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {\r
36821+\r
36822+ SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));\r
36823+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
36824+ return (Ret);\r
36825+ }\r
36826+\r
36827+ if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {\r
36828+\r
36829+ SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));\r
36830+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
36831+ return (Ret);\r
36832+ }\r
36833+\r
36834+ pAC->Pnmi.RlmtUpdatedFlag ++;\r
36835+ pAC->Pnmi.SirqUpdatedFlag ++;\r
36836+\r
36837+ /* PRESET/SET values. */\r
36838+ for (TableIndex = 0; TableIndex < ID_TABLE_SIZE; TableIndex ++) {\r
36839+\r
36840+ if ((IdTable[TableIndex].Access != SK_PNMI_RW) &&\r
36841+ (IdTable[TableIndex].Access != SK_PNMI_WO)) {\r
36842+ continue;\r
36843+ }\r
36844+\r
36845+ InstanceNo = IdTable[TableIndex].InstanceNo;\r
36846+ Id = IdTable[TableIndex].Id;\r
36847+\r
36848+ for (InstanceCnt = 1; InstanceCnt <= InstanceNo;\r
36849+ InstanceCnt ++) {\r
36850+\r
36851+ DstOffset = IdTable[TableIndex].Offset +\r
36852+ (InstanceCnt - 1) * IdTable[TableIndex].StructSize;\r
36853+\r
36854+ /*\r
36855+ * Because VPD multiple instance variables are\r
36856+ * not setable we do not need to evaluate VPD\r
36857+ * instances. Have a look to VPD instance\r
36858+ * calculation in SkPnmiGetStruct().\r
36859+ */\r
36860+ Instance = (SK_U32)InstanceCnt;\r
36861+\r
36862+ /* Evaluate needed buffer length. */\r
36863+ Len = 0;\r
36864+ Ret = IdTable[TableIndex].Func(pAC, IoC,\r
36865+ SK_PNMI_GET, IdTable[TableIndex].Id,\r
36866+ NULL, &Len, Instance, TableIndex, NetIndex);\r
36867+\r
36868+ if (Ret == SK_PNMI_ERR_UNKNOWN_INST) {\r
36869+\r
36870+ break;\r
36871+ }\r
36872+ if (Ret != SK_PNMI_ERR_TOO_SHORT) {\r
36873+\r
36874+ pAC->Pnmi.RlmtUpdatedFlag --;\r
36875+ pAC->Pnmi.SirqUpdatedFlag --;\r
36876+\r
36877+ SK_PNMI_CHECKFLAGS("PnmiStruct: On return");\r
36878+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_GENERAL, DstOffset);\r
36879+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
36880+ return (SK_PNMI_ERR_GENERAL);\r
36881+ }\r
36882+ if (Id == OID_SKGE_VPD_ACTION) {\r
36883+\r
36884+ switch (*(pBuf + DstOffset)) {\r
36885+\r
36886+ case SK_PNMI_VPD_CREATE:\r
36887+ Len = 3 + *(pBuf + DstOffset + 3);\r
36888+ break;\r
36889+\r
36890+ case SK_PNMI_VPD_DELETE:\r
36891+ Len = 3;\r
36892+ break;\r
36893+\r
36894+ default:\r
36895+ Len = 1;\r
36896+ break;\r
36897+ }\r
36898+ }\r
36899+\r
36900+ /* Call the OID handler function. */\r
36901+ Ret = IdTable[TableIndex].Func(pAC, IoC, Action,\r
36902+ IdTable[TableIndex].Id, pBuf + DstOffset,\r
36903+ &Len, Instance, TableIndex, NetIndex);\r
36904+\r
36905+ if (Ret != SK_PNMI_ERR_OK) {\r
36906+\r
36907+ pAC->Pnmi.RlmtUpdatedFlag --;\r
36908+ pAC->Pnmi.SirqUpdatedFlag --;\r
36909+\r
36910+ SK_PNMI_CHECKFLAGS("PnmiStruct: On return");\r
36911+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_BAD_VALUE, DstOffset);\r
36912+ *pLen = SK_PNMI_MIN_STRUCT_SIZE;\r
36913+ return (SK_PNMI_ERR_BAD_VALUE);\r
36914+ }\r
36915+ }\r
36916+ }\r
36917+\r
36918+ pAC->Pnmi.RlmtUpdatedFlag --;\r
36919+ pAC->Pnmi.SirqUpdatedFlag --;\r
36920+\r
36921+ SK_PNMI_CHECKFLAGS("PnmiStruct: On return");\r
36922+ SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_OK, (SK_U32)(-1));\r
36923+ return (SK_PNMI_ERR_OK);\r
36924+}\r
36925+\r
36926+/*****************************************************************************\r
36927+ *\r
36928+ * LookupId - Lookup an OID in the IdTable\r
36929+ *\r
36930+ * Description:\r
36931+ * Scans the IdTable to find the table entry of an OID.\r
36932+ *\r
36933+ * Returns:\r
36934+ * The table index or -1 if not found.\r
36935+ */\r
36936+PNMI_STATIC int LookupId(\r
36937+SK_U32 Id) /* Object identifier to be searched */\r
36938+{\r
36939+ int i;\r
36940+\r
36941+ for (i = 0; i < ID_TABLE_SIZE; i++) {\r
36942+\r
36943+ if (IdTable[i].Id == Id) {\r
36944+\r
36945+ return (i);\r
36946+ }\r
36947+ }\r
36948+\r
36949+ return (-1);\r
36950+}\r
36951+\r
36952+/*****************************************************************************\r
36953+ *\r
36954+ * OidStruct - Handler of OID_SKGE_ALL_DATA\r
36955+ *\r
36956+ * Description:\r
36957+ * This OID performs a Get/Preset/SetStruct call and returns all data\r
36958+ * in a SK_PNMI_STRUCT_DATA structure.\r
36959+ *\r
36960+ * Returns:\r
36961+ * SK_PNMI_ERR_OK The request was successfully performed.\r
36962+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
36963+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
36964+ * the correct data (e.g. a 32bit value is\r
36965+ * needed, but a 16 bit value was passed).\r
36966+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
36967+ * value range.\r
36968+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
36969+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
36970+ * exist (e.g. port instance 3 on a two port\r
36971+ * adapter.\r
36972+ */\r
36973+PNMI_STATIC int OidStruct(\r
36974+SK_AC *pAC, /* Pointer to adapter context */\r
36975+SK_IOC IoC, /* IO context handle */\r
36976+int Action, /* GET/PRESET/SET action */\r
36977+SK_U32 Id, /* Object ID that is to be processed */\r
36978+char *pBuf, /* Buffer used for the management data transfer */\r
36979+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
36980+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
36981+unsigned int TableIndex, /* Index to the Id table */\r
36982+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
36983+{\r
36984+ if (Id != OID_SKGE_ALL_DATA) {\r
36985+\r
36986+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR003, SK_PNMI_ERR003MSG);\r
36987+\r
36988+ *pLen = 0;\r
36989+ return (SK_PNMI_ERR_GENERAL);\r
36990+ }\r
36991+\r
36992+ /* Check instance. We only handle single instance variables. */\r
36993+ if (Instance != (SK_U32)(-1) && Instance != 1) {\r
36994+\r
36995+ *pLen = 0;\r
36996+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
36997+ }\r
36998+\r
36999+ switch (Action) {\r
37000+\r
37001+ case SK_PNMI_GET:\r
37002+ return (SkPnmiGetStruct(pAC, IoC, pBuf, pLen, NetIndex));\r
37003+\r
37004+ case SK_PNMI_PRESET:\r
37005+ return (SkPnmiPreSetStruct(pAC, IoC, pBuf, pLen, NetIndex));\r
37006+\r
37007+ case SK_PNMI_SET:\r
37008+ return (SkPnmiSetStruct(pAC, IoC, pBuf, pLen, NetIndex));\r
37009+ }\r
37010+\r
37011+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR004, SK_PNMI_ERR004MSG);\r
37012+\r
37013+ *pLen = 0;\r
37014+ return (SK_PNMI_ERR_GENERAL);\r
37015+}\r
37016+\r
37017+/*****************************************************************************\r
37018+ *\r
37019+ * Perform - OID handler of OID_SKGE_ACTION\r
37020+ *\r
37021+ * Description:\r
37022+ * None.\r
37023+ *\r
37024+ * Returns:\r
37025+ * SK_PNMI_ERR_OK The request was successfully performed.\r
37026+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
37027+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
37028+ * the correct data (e.g. a 32bit value is\r
37029+ * needed, but a 16 bit value was passed).\r
37030+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
37031+ * value range.\r
37032+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
37033+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
37034+ * exist (e.g. port instance 3 on a two port\r
37035+ * adapter.\r
37036+ */\r
37037+PNMI_STATIC int Perform(\r
37038+SK_AC *pAC, /* Pointer to adapter context */\r
37039+SK_IOC IoC, /* IO context handle */\r
37040+int Action, /* GET/PRESET/SET action */\r
37041+SK_U32 Id, /* Object ID that is to be processed */\r
37042+char *pBuf, /* Buffer used for the management data transfer */\r
37043+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
37044+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
37045+unsigned int TableIndex, /* Index to the Id table */\r
37046+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
37047+{\r
37048+ int Ret;\r
37049+ SK_U32 ActionOp;\r
37050+\r
37051+ /* Check instance. We only handle single instance variables. */\r
37052+ if (Instance != (SK_U32)(-1) && Instance != 1) {\r
37053+\r
37054+ *pLen = 0;\r
37055+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
37056+ }\r
37057+\r
37058+ if (*pLen < sizeof(SK_U32)) {\r
37059+\r
37060+ *pLen = sizeof(SK_U32);\r
37061+ return (SK_PNMI_ERR_TOO_SHORT);\r
37062+ }\r
37063+\r
37064+ /* Check if a GET should be performed. */\r
37065+ if (Action == SK_PNMI_GET) {\r
37066+\r
37067+ /* A GET is easy. We always return the same value. */\r
37068+ ActionOp = (SK_U32)SK_PNMI_ACT_IDLE;\r
37069+ SK_PNMI_STORE_U32(pBuf, ActionOp);\r
37070+ *pLen = sizeof(SK_U32);\r
37071+\r
37072+ return (SK_PNMI_ERR_OK);\r
37073+ }\r
37074+\r
37075+ /* Continue with PRESET/SET action. */\r
37076+ if (*pLen > sizeof(SK_U32)) {\r
37077+\r
37078+ return (SK_PNMI_ERR_BAD_VALUE);\r
37079+ }\r
37080+\r
37081+ /* Check if the command is a known one. */\r
37082+ SK_PNMI_READ_U32(pBuf, ActionOp);\r
37083+ if (*pLen > sizeof(SK_U32) ||\r
37084+ (ActionOp != SK_PNMI_ACT_IDLE &&\r
37085+ ActionOp != SK_PNMI_ACT_RESET &&\r
37086+ ActionOp != SK_PNMI_ACT_SELFTEST &&\r
37087+ ActionOp != SK_PNMI_ACT_RESETCNT)) {\r
37088+\r
37089+ *pLen = 0;\r
37090+ return (SK_PNMI_ERR_BAD_VALUE);\r
37091+ }\r
37092+\r
37093+ /* A PRESET ends here. */\r
37094+ if (Action == SK_PNMI_PRESET) {\r
37095+\r
37096+ return (SK_PNMI_ERR_OK);\r
37097+ }\r
37098+\r
37099+ switch (ActionOp) {\r
37100+\r
37101+ case SK_PNMI_ACT_IDLE:\r
37102+ /* Nothing to do. */\r
37103+ break;\r
37104+\r
37105+ case SK_PNMI_ACT_RESET:\r
37106+ /* Perform a driver reset or something that comes near to this. */\r
37107+ Ret = SK_DRIVER_RESET(pAC, IoC);\r
37108+ if (Ret != 0) {\r
37109+\r
37110+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR005, SK_PNMI_ERR005MSG);\r
37111+\r
37112+ return (SK_PNMI_ERR_GENERAL);\r
37113+ }\r
37114+ break;\r
37115+\r
37116+ case SK_PNMI_ACT_SELFTEST:\r
37117+ /*\r
37118+ * Perform a driver selftest or something similar to this.\r
37119+ * Currently this feature is not used and will probably\r
37120+ * implemented in another way.\r
37121+ */\r
37122+ Ret = SK_DRIVER_SELFTEST(pAC, IoC);\r
37123+ pAC->Pnmi.TestResult = Ret;\r
37124+ break;\r
37125+\r
37126+ case SK_PNMI_ACT_RESETCNT:\r
37127+ /* Set all counters and timestamps to zero. */\r
37128+ ResetCounter(pAC, IoC, NetIndex);\r
37129+ break;\r
37130+\r
37131+ default:\r
37132+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR006, SK_PNMI_ERR006MSG);\r
37133+\r
37134+ return (SK_PNMI_ERR_GENERAL);\r
37135+ }\r
37136+\r
37137+ return (SK_PNMI_ERR_OK);\r
37138+}\r
37139+\r
37140+/*****************************************************************************\r
37141+ *\r
37142+ * Mac8023Stat - OID handler of OID_GEN_XXX and OID_802_3_XXX\r
37143+ *\r
37144+ * Description:\r
37145+ * Retrieves the statistic values of the virtual port (logical\r
37146+ * index 0). Only special OIDs of NDIS are handled which consist\r
37147+ * of a 32 bit instead of a 64 bit value. The OIDs are public\r
37148+ * because perhaps some other platform can use them too.\r
37149+ *\r
37150+ * Returns:\r
37151+ * SK_PNMI_ERR_OK The request was successfully performed.\r
37152+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
37153+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
37154+ * the correct data (e.g. a 32bit value is\r
37155+ * needed, but a 16 bit value was passed).\r
37156+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
37157+ * exist (e.g. port instance 3 on a two port\r
37158+ * adapter.\r
37159+ */\r
37160+PNMI_STATIC int Mac8023Stat(\r
37161+SK_AC *pAC, /* Pointer to adapter context */\r
37162+SK_IOC IoC, /* IO context handle */\r
37163+int Action, /* GET/PRESET/SET action */\r
37164+SK_U32 Id, /* Object ID that is to be processed */\r
37165+char *pBuf, /* Buffer used for the management data transfer */\r
37166+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
37167+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
37168+unsigned int TableIndex, /* Index to the Id table */\r
37169+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
37170+{\r
37171+ int Ret;\r
37172+ SK_U64 StatVal;\r
37173+ SK_U32 StatVal32;\r
37174+ SK_BOOL Is64BitReq = SK_FALSE;\r
37175+\r
37176+ /* Only the active MAC is returned. */\r
37177+ if (Instance != (SK_U32)(-1) && Instance != 1) {\r
37178+\r
37179+ *pLen = 0;\r
37180+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
37181+ }\r
37182+\r
37183+ /* Check action type. */\r
37184+ if (Action != SK_PNMI_GET) {\r
37185+\r
37186+ *pLen = 0;\r
37187+ return (SK_PNMI_ERR_READ_ONLY);\r
37188+ }\r
37189+\r
37190+ /* Check length. */\r
37191+ switch (Id) {\r
37192+\r
37193+ case OID_802_3_PERMANENT_ADDRESS:\r
37194+ case OID_802_3_CURRENT_ADDRESS:\r
37195+ if (*pLen < sizeof(SK_MAC_ADDR)) {\r
37196+\r
37197+ *pLen = sizeof(SK_MAC_ADDR);\r
37198+ return (SK_PNMI_ERR_TOO_SHORT);\r
37199+ }\r
37200+ break;\r
37201+\r
37202+ default:\r
37203+#ifndef SK_NDIS_64BIT_CTR\r
37204+ if (*pLen < sizeof(SK_U32)) {\r
37205+ *pLen = sizeof(SK_U32);\r
37206+ return (SK_PNMI_ERR_TOO_SHORT);\r
37207+ }\r
37208+\r
37209+#else /* SK_NDIS_64BIT_CTR */\r
37210+\r
37211+ /* For compatibility, at least 32 bits are required for OID. */\r
37212+ if (*pLen < sizeof(SK_U32)) {\r
37213+ /*\r
37214+ * Indicate handling for 64 bit values,\r
37215+ * if insufficient space is provided.\r
37216+ */\r
37217+ *pLen = sizeof(SK_U64);\r
37218+ return (SK_PNMI_ERR_TOO_SHORT);\r
37219+ }\r
37220+\r
37221+ Is64BitReq = (*pLen < sizeof(SK_U64)) ? SK_FALSE : SK_TRUE;\r
37222+#endif /* SK_NDIS_64BIT_CTR */\r
37223+ break;\r
37224+ }\r
37225+\r
37226+ /*\r
37227+ * Update all statistics, because we retrieve virtual MAC, which\r
37228+ * consists of multiple physical statistics and increment semaphore\r
37229+ * to indicate that an update was already done.\r
37230+ */\r
37231+ Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);\r
37232+ if (Ret != SK_PNMI_ERR_OK) {\r
37233+\r
37234+ *pLen = 0;\r
37235+ return (Ret);\r
37236+ }\r
37237+ pAC->Pnmi.MacUpdatedFlag ++;\r
37238+\r
37239+ /* Get value (MAC index 0 identifies the virtual MAC). */\r
37240+ switch (Id) {\r
37241+\r
37242+ case OID_802_3_PERMANENT_ADDRESS:\r
37243+ CopyMac(pBuf, &pAC->Addr.Net[NetIndex].PermanentMacAddress);\r
37244+ *pLen = sizeof(SK_MAC_ADDR);\r
37245+ break;\r
37246+\r
37247+ case OID_802_3_CURRENT_ADDRESS:\r
37248+ CopyMac(pBuf, &pAC->Addr.Net[NetIndex].CurrentMacAddress);\r
37249+ *pLen = sizeof(SK_MAC_ADDR);\r
37250+ break;\r
37251+\r
37252+ default:\r
37253+ StatVal = GetStatVal(pAC, IoC, 0, IdTable[TableIndex].Param, NetIndex);\r
37254+\r
37255+ /* By default 32 bit values are evaluated. */\r
37256+ if (!Is64BitReq) {\r
37257+ StatVal32 = (SK_U32)StatVal;\r
37258+ SK_PNMI_STORE_U32(pBuf, StatVal32);\r
37259+ *pLen = sizeof(SK_U32);\r
37260+ }\r
37261+ else {\r
37262+ SK_PNMI_STORE_U64(pBuf, StatVal);\r
37263+ *pLen = sizeof(SK_U64);\r
37264+ }\r
37265+ break;\r
37266+ }\r
37267+\r
37268+ pAC->Pnmi.MacUpdatedFlag --;\r
37269+\r
37270+ return (SK_PNMI_ERR_OK);\r
37271+}\r
37272+\r
37273+/*****************************************************************************\r
37274+ *\r
37275+ * MacPrivateStat - OID handler function of OID_SKGE_STAT_XXX\r
37276+ *\r
37277+ * Description:\r
37278+ * Retrieves the MAC statistic data.\r
37279+ *\r
37280+ * Returns:\r
37281+ * SK_PNMI_ERR_OK The request was successfully performed.\r
37282+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
37283+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
37284+ * the correct data (e.g. a 32bit value is\r
37285+ * needed, but a 16 bit value was passed).\r
37286+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
37287+ * exist (e.g. port instance 3 on a two port\r
37288+ * adapter.\r
37289+ */\r
37290+PNMI_STATIC int MacPrivateStat(\r
37291+SK_AC *pAC, /* Pointer to adapter context */\r
37292+SK_IOC IoC, /* IO context handle */\r
37293+int Action, /* GET/PRESET/SET action */\r
37294+SK_U32 Id, /* Object ID that is to be processed */\r
37295+char *pBuf, /* Buffer used for the management data transfer */\r
37296+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
37297+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
37298+unsigned int TableIndex, /* Index to the Id table */\r
37299+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
37300+{\r
37301+ unsigned int LogPortMax;\r
37302+ unsigned int LogPortIndex;\r
37303+ unsigned int PhysPortMax;\r
37304+ unsigned int Limit;\r
37305+ unsigned int Offset;\r
37306+ int MacType;\r
37307+ int Ret;\r
37308+ SK_U64 StatVal;\r
37309+\r
37310+ /* Calculate instance if wished. MAC index 0 is the virtual MAC. */\r
37311+ PhysPortMax = pAC->GIni.GIMacsFound;\r
37312+ LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);\r
37313+ \r
37314+ MacType = pAC->GIni.GIMacType;\r
37315+\r
37316+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */\r
37317+ LogPortMax--;\r
37318+ }\r
37319+\r
37320+ if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried. */\r
37321+ /* Check instance range. */\r
37322+ if ((Instance < 1) || (Instance > LogPortMax)) {\r
37323+\r
37324+ *pLen = 0;\r
37325+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
37326+ }\r
37327+ LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);\r
37328+ Limit = LogPortIndex + 1;\r
37329+ }\r
37330+\r
37331+ else { /* Instance == (SK_U32)(-1), get all Instances of that OID. */\r
37332+\r
37333+ LogPortIndex = 0;\r
37334+ Limit = LogPortMax;\r
37335+ }\r
37336+\r
37337+ /* Check action. */\r
37338+ if (Action != SK_PNMI_GET) {\r
37339+\r
37340+ *pLen = 0;\r
37341+ return (SK_PNMI_ERR_READ_ONLY);\r
37342+ }\r
37343+\r
37344+ /* Check length. */\r
37345+ if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U64)) {\r
37346+\r
37347+ *pLen = (Limit - LogPortIndex) * sizeof(SK_U64);\r
37348+ return (SK_PNMI_ERR_TOO_SHORT);\r
37349+ }\r
37350+\r
37351+ /*\r
37352+ * Update MAC statistic and increment semaphore to indicate that\r
37353+ * an update was already done.\r
37354+ */\r
37355+ Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);\r
37356+ if (Ret != SK_PNMI_ERR_OK) {\r
37357+\r
37358+ *pLen = 0;\r
37359+ return (Ret);\r
37360+ }\r
37361+ pAC->Pnmi.MacUpdatedFlag ++;\r
37362+\r
37363+ /* Get value. */\r
37364+ Offset = 0;\r
37365+ for (; LogPortIndex < Limit; LogPortIndex ++) {\r
37366+\r
37367+ switch (Id) {\r
37368+\r
37369+/* XXX not yet implemented due to XMAC problems\r
37370+ case OID_SKGE_STAT_TX_UTIL:\r
37371+ return (SK_PNMI_ERR_GENERAL);\r
37372+*/\r
37373+/* XXX not yet implemented due to XMAC problems\r
37374+ case OID_SKGE_STAT_RX_UTIL:\r
37375+ return (SK_PNMI_ERR_GENERAL);\r
37376+*/\r
37377+ case OID_SKGE_STAT_RX:\r
37378+ if (MacType == SK_MAC_GMAC) {\r
37379+ StatVal =\r
37380+ GetStatVal(pAC, IoC, LogPortIndex,\r
37381+ SK_PNMI_HRX_BROADCAST, NetIndex) +\r
37382+ GetStatVal(pAC, IoC, LogPortIndex,\r
37383+ SK_PNMI_HRX_MULTICAST, NetIndex) +\r
37384+ GetStatVal(pAC, IoC, LogPortIndex,\r
37385+ SK_PNMI_HRX_UNICAST, NetIndex) +\r
37386+ GetStatVal(pAC, IoC, LogPortIndex,\r
37387+ SK_PNMI_HRX_UNDERSIZE, NetIndex);\r
37388+ }\r
37389+ else {\r
37390+ StatVal = GetStatVal(pAC, IoC, LogPortIndex,\r
37391+ IdTable[TableIndex].Param, NetIndex);\r
37392+ }\r
37393+ break;\r
37394+\r
37395+ case OID_SKGE_STAT_TX:\r
37396+ if (MacType == SK_MAC_GMAC) {\r
37397+ StatVal =\r
37398+ GetStatVal(pAC, IoC, LogPortIndex,\r
37399+ SK_PNMI_HTX_BROADCAST, NetIndex) +\r
37400+ GetStatVal(pAC, IoC, LogPortIndex,\r
37401+ SK_PNMI_HTX_MULTICAST, NetIndex) +\r
37402+ GetStatVal(pAC, IoC, LogPortIndex,\r
37403+ SK_PNMI_HTX_UNICAST, NetIndex);\r
37404+ }\r
37405+ else {\r
37406+ StatVal = GetStatVal(pAC, IoC, LogPortIndex,\r
37407+ IdTable[TableIndex].Param, NetIndex);\r
37408+ }\r
37409+ break;\r
37410+\r
37411+ default:\r
37412+ StatVal = GetStatVal(pAC, IoC, LogPortIndex,\r
37413+ IdTable[TableIndex].Param, NetIndex);\r
37414+ }\r
37415+ SK_PNMI_STORE_U64(pBuf + Offset, StatVal);\r
37416+\r
37417+ Offset += sizeof(SK_U64);\r
37418+ }\r
37419+ *pLen = Offset;\r
37420+\r
37421+ pAC->Pnmi.MacUpdatedFlag --;\r
37422+\r
37423+ return (SK_PNMI_ERR_OK);\r
37424+}\r
37425+\r
37426+/*****************************************************************************\r
37427+ *\r
37428+ * Addr - OID handler function of OID_SKGE_PHYS_CUR_ADDR and _FAC_ADDR\r
37429+ *\r
37430+ * Description:\r
37431+ * Get/Presets/Sets the current and factory MAC address. The MAC\r
37432+ * address of the virtual port, which is reported to the OS, may\r
37433+ * not be changed, but the physical ones. A set to the virtual port\r
37434+ * will be ignored. No error should be reported because otherwise\r
37435+ * a multiple instance set (-1) would always fail.\r
37436+ *\r
37437+ * Returns:\r
37438+ * SK_PNMI_ERR_OK The request was successfully performed.\r
37439+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
37440+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
37441+ * the correct data (e.g. a 32bit value is\r
37442+ * needed, but a 16 bit value was passed).\r
37443+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
37444+ * value range.\r
37445+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
37446+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
37447+ * exist (e.g. port instance 3 on a two port\r
37448+ * adapter.\r
37449+ */\r
37450+PNMI_STATIC int Addr(\r
37451+SK_AC *pAC, /* Pointer to adapter context */\r
37452+SK_IOC IoC, /* IO context handle */\r
37453+int Action, /* GET/PRESET/SET action */\r
37454+SK_U32 Id, /* Object ID that is to be processed */\r
37455+char *pBuf, /* Buffer used for the management data transfer */\r
37456+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
37457+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
37458+unsigned int TableIndex, /* Index to the Id table */\r
37459+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
37460+{\r
37461+ int Ret;\r
37462+ unsigned int LogPortMax;\r
37463+ unsigned int PhysPortMax;\r
37464+ unsigned int LogPortIndex;\r
37465+ unsigned int PhysPortIndex;\r
37466+ unsigned int Limit;\r
37467+ unsigned int Offset = 0;\r
37468+\r
37469+ /* Calculate instance if wished. MAC index 0 is the virtual MAC. */\r
37470+ PhysPortMax = pAC->GIni.GIMacsFound;\r
37471+ LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);\r
37472+\r
37473+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */\r
37474+ LogPortMax--;\r
37475+ }\r
37476+\r
37477+ if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried. */\r
37478+ /* Check instance range. */\r
37479+ if ((Instance < 1) || (Instance > LogPortMax)) {\r
37480+\r
37481+ *pLen = 0;\r
37482+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
37483+ }\r
37484+ LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);\r
37485+ Limit = LogPortIndex + 1;\r
37486+ }\r
37487+ else { /* Instance == (SK_U32)(-1), get all Instances of that OID. */\r
37488+\r
37489+ LogPortIndex = 0;\r
37490+ Limit = LogPortMax;\r
37491+ }\r
37492+\r
37493+ /* Perform action. */\r
37494+ if (Action == SK_PNMI_GET) {\r
37495+\r
37496+ /* Check length. */\r
37497+ if (*pLen < (Limit - LogPortIndex) * 6) {\r
37498+\r
37499+ *pLen = (Limit - LogPortIndex) * 6;\r
37500+ return (SK_PNMI_ERR_TOO_SHORT);\r
37501+ }\r
37502+\r
37503+ /* Get value. */\r
37504+ for (; LogPortIndex < Limit; LogPortIndex ++) {\r
37505+\r
37506+ switch (Id) {\r
37507+\r
37508+ case OID_SKGE_PHYS_CUR_ADDR:\r
37509+ if (LogPortIndex == 0) {\r
37510+ CopyMac(pBuf + Offset, &pAC->Addr.Net[NetIndex].CurrentMacAddress);\r
37511+ }\r
37512+ else {\r
37513+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);\r
37514+\r
37515+ CopyMac(pBuf + Offset,\r
37516+ &pAC->Addr.Port[PhysPortIndex].CurrentMacAddress);\r
37517+ }\r
37518+ Offset += 6;\r
37519+ break;\r
37520+\r
37521+ case OID_SKGE_PHYS_FAC_ADDR:\r
37522+ if (LogPortIndex == 0) {\r
37523+ CopyMac(pBuf + Offset,\r
37524+ &pAC->Addr.Net[NetIndex].PermanentMacAddress);\r
37525+ }\r
37526+ else {\r
37527+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);\r
37528+\r
37529+ CopyMac(pBuf + Offset,\r
37530+ &pAC->Addr.Port[PhysPortIndex].PermanentMacAddress);\r
37531+ }\r
37532+ Offset += 6;\r
37533+ break;\r
37534+\r
37535+ default:\r
37536+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR008, SK_PNMI_ERR008MSG);\r
37537+\r
37538+ *pLen = 0;\r
37539+ return (SK_PNMI_ERR_GENERAL);\r
37540+ }\r
37541+ }\r
37542+\r
37543+ *pLen = Offset;\r
37544+ }\r
37545+ else {\r
37546+ /*\r
37547+ * The logical MAC address may not be changed,\r
37548+ * only the physical ones.\r
37549+ */\r
37550+ if (Id == OID_SKGE_PHYS_FAC_ADDR) {\r
37551+\r
37552+ *pLen = 0;\r
37553+ return (SK_PNMI_ERR_READ_ONLY);\r
37554+ }\r
37555+\r
37556+ /* Only the current address may be changed. */\r
37557+ if (Id != OID_SKGE_PHYS_CUR_ADDR) {\r
37558+\r
37559+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR009, SK_PNMI_ERR009MSG);\r
37560+\r
37561+ *pLen = 0;\r
37562+ return (SK_PNMI_ERR_GENERAL);\r
37563+ }\r
37564+\r
37565+ /* Check length. */\r
37566+ if (*pLen < (Limit - LogPortIndex) * 6) {\r
37567+\r
37568+ *pLen = (Limit - LogPortIndex) * 6;\r
37569+ return (SK_PNMI_ERR_TOO_SHORT);\r
37570+ }\r
37571+ if (*pLen > (Limit - LogPortIndex) * 6) {\r
37572+\r
37573+ *pLen = 0;\r
37574+ return (SK_PNMI_ERR_BAD_VALUE);\r
37575+ }\r
37576+\r
37577+ /* Check action. */\r
37578+ if (Action == SK_PNMI_PRESET) {\r
37579+\r
37580+ *pLen = 0;\r
37581+ return (SK_PNMI_ERR_OK);\r
37582+ }\r
37583+\r
37584+ /* Set OID_SKGE_MAC_CUR_ADDR. */\r
37585+ for (; LogPortIndex < Limit; LogPortIndex ++, Offset += 6) {\r
37586+\r
37587+ /*\r
37588+ * A set to virtual port and set of broadcast\r
37589+ * address will be ignored.\r
37590+ */\r
37591+ if (LogPortIndex == 0 || SK_MEMCMP(pBuf + Offset,\r
37592+ "\xff\xff\xff\xff\xff\xff", 6) == 0) {\r
37593+ continue;\r
37594+ }\r
37595+\r
37596+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);\r
37597+\r
37598+ Ret = SkAddrOverride(pAC, IoC, PhysPortIndex,\r
37599+ (SK_MAC_ADDR *)(pBuf + Offset),\r
37600+ (LogPortIndex == 0 ? SK_ADDR_VIRTUAL_ADDRESS :\r
37601+ SK_ADDR_PHYSICAL_ADDRESS));\r
37602+ if (Ret != SK_ADDR_OVERRIDE_SUCCESS) {\r
37603+\r
37604+ return (SK_PNMI_ERR_GENERAL);\r
37605+ }\r
37606+ }\r
37607+ *pLen = Offset;\r
37608+ }\r
37609+\r
37610+ return (SK_PNMI_ERR_OK);\r
37611+}\r
37612+\r
37613+/*****************************************************************************\r
37614+ *\r
37615+ * CsumStat - OID handler function of OID_SKGE_CHKSM_XXX\r
37616+ *\r
37617+ * Description:\r
37618+ * Retrieves the statistic values of the CSUM module. The CSUM data\r
37619+ * structure must be available in the SK_AC even if the CSUM module\r
37620+ * is not included, because PNMI reads the statistic data from the\r
37621+ * CSUM part of SK_AC directly.\r
37622+ *\r
37623+ * Returns:\r
37624+ * SK_PNMI_ERR_OK The request was successfully performed.\r
37625+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
37626+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
37627+ * the correct data (e.g. a 32bit value is\r
37628+ * needed, but a 16 bit value was passed).\r
37629+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
37630+ * exist (e.g. port instance 3 on a two port\r
37631+ * adapter.\r
37632+ */\r
37633+PNMI_STATIC int CsumStat(\r
37634+SK_AC *pAC, /* Pointer to adapter context */\r
37635+SK_IOC IoC, /* IO context handle */\r
37636+int Action, /* GET/PRESET/SET action */\r
37637+SK_U32 Id, /* Object ID that is to be processed */\r
37638+char *pBuf, /* Buffer used for the management data transfer */\r
37639+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
37640+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
37641+unsigned int TableIndex, /* Index to the Id table */\r
37642+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
37643+{\r
37644+ unsigned int Index;\r
37645+ unsigned int Limit;\r
37646+ unsigned int Offset = 0;\r
37647+ SK_U64 StatVal;\r
37648+\r
37649+ /* Calculate instance if wished. */\r
37650+ if (Instance != (SK_U32)(-1)) {\r
37651+\r
37652+ if ((Instance < 1) || (Instance > SKCS_NUM_PROTOCOLS)) {\r
37653+\r
37654+ *pLen = 0;\r
37655+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
37656+ }\r
37657+ Index = (unsigned int)Instance - 1;\r
37658+ Limit = Index + 1;\r
37659+ }\r
37660+ else {\r
37661+ Index = 0;\r
37662+ Limit = SKCS_NUM_PROTOCOLS;\r
37663+ }\r
37664+\r
37665+ /* Check action. */\r
37666+ if (Action != SK_PNMI_GET) {\r
37667+\r
37668+ *pLen = 0;\r
37669+ return (SK_PNMI_ERR_READ_ONLY);\r
37670+ }\r
37671+\r
37672+ /* Check length. */\r
37673+ if (*pLen < (Limit - Index) * sizeof(SK_U64)) {\r
37674+\r
37675+ *pLen = (Limit - Index) * sizeof(SK_U64);\r
37676+ return (SK_PNMI_ERR_TOO_SHORT);\r
37677+ }\r
37678+\r
37679+ /* Get value. */\r
37680+ for (; Index < Limit; Index ++) {\r
37681+\r
37682+ switch (Id) {\r
37683+\r
37684+ case OID_SKGE_CHKSM_RX_OK_CTS:\r
37685+ StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxOkCts;\r
37686+ break;\r
37687+\r
37688+ case OID_SKGE_CHKSM_RX_UNABLE_CTS:\r
37689+ StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxUnableCts;\r
37690+ break;\r
37691+\r
37692+ case OID_SKGE_CHKSM_RX_ERR_CTS:\r
37693+ StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxErrCts;\r
37694+ break;\r
37695+\r
37696+ case OID_SKGE_CHKSM_TX_OK_CTS:\r
37697+ StatVal = pAC->Csum.ProtoStats[NetIndex][Index].TxOkCts;\r
37698+ break;\r
37699+\r
37700+ case OID_SKGE_CHKSM_TX_UNABLE_CTS:\r
37701+ StatVal = pAC->Csum.ProtoStats[NetIndex][Index].TxUnableCts;\r
37702+ break;\r
37703+\r
37704+ default:\r
37705+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR010, SK_PNMI_ERR010MSG);\r
37706+\r
37707+ *pLen = 0;\r
37708+ return (SK_PNMI_ERR_GENERAL);\r
37709+ }\r
37710+\r
37711+ SK_PNMI_STORE_U64(pBuf + Offset, StatVal);\r
37712+ Offset += sizeof(SK_U64);\r
37713+ }\r
37714+\r
37715+ /* Store used buffer space. */\r
37716+ *pLen = Offset;\r
37717+\r
37718+ return (SK_PNMI_ERR_OK);\r
37719+}\r
37720+\r
37721+/*****************************************************************************\r
37722+ *\r
37723+ * SensorStat - OID handler function of OID_SKGE_SENSOR_XXX\r
37724+ *\r
37725+ * Description:\r
37726+ * Retrieves the statistic values of the I2C module, which handles\r
37727+ * the temperature and voltage sensors.\r
37728+ *\r
37729+ * Returns:\r
37730+ * SK_PNMI_ERR_OK The request was successfully performed.\r
37731+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
37732+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
37733+ * the correct data (e.g. a 32bit value is\r
37734+ * needed, but a 16 bit value was passed).\r
37735+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
37736+ * exist (e.g. port instance 3 on a two port\r
37737+ * adapter.\r
37738+ */\r
37739+PNMI_STATIC int SensorStat(\r
37740+SK_AC *pAC, /* Pointer to adapter context */\r
37741+SK_IOC IoC, /* IO context handle */\r
37742+int Action, /* GET/PRESET/SET action */\r
37743+SK_U32 Id, /* Object ID that is to be processed */\r
37744+char *pBuf, /* Buffer used for the management data transfer */\r
37745+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
37746+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
37747+unsigned int TableIndex, /* Index to the Id table */\r
37748+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
37749+{\r
37750+ unsigned int i;\r
37751+ unsigned int Index;\r
37752+ unsigned int Limit;\r
37753+ unsigned int Offset;\r
37754+ unsigned int Len;\r
37755+ SK_U32 Val32;\r
37756+ SK_U64 Val64;\r
37757+\r
37758+ /* Calculate instance if wished. */\r
37759+ if ((Instance != (SK_U32)(-1))) {\r
37760+\r
37761+ if ((Instance < 1) || (Instance > (SK_U32)pAC->I2c.MaxSens)) {\r
37762+\r
37763+ *pLen = 0;\r
37764+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
37765+ }\r
37766+\r
37767+ Index = (unsigned int)Instance -1;\r
37768+ Limit = (unsigned int)Instance;\r
37769+ }\r
37770+ else {\r
37771+ Index = 0;\r
37772+ Limit = (unsigned int) pAC->I2c.MaxSens;\r
37773+ }\r
37774+\r
37775+ /* Check action. */\r
37776+ if (Action != SK_PNMI_GET) {\r
37777+\r
37778+ *pLen = 0;\r
37779+ return (SK_PNMI_ERR_READ_ONLY);\r
37780+ }\r
37781+\r
37782+ /* Check length. */\r
37783+ switch (Id) {\r
37784+\r
37785+ case OID_SKGE_SENSOR_VALUE:\r
37786+ case OID_SKGE_SENSOR_WAR_THRES_LOW:\r
37787+ case OID_SKGE_SENSOR_WAR_THRES_UPP:\r
37788+ case OID_SKGE_SENSOR_ERR_THRES_LOW:\r
37789+ case OID_SKGE_SENSOR_ERR_THRES_UPP:\r
37790+ if (*pLen < (Limit - Index) * sizeof(SK_U32)) {\r
37791+\r
37792+ *pLen = (Limit - Index) * sizeof(SK_U32);\r
37793+ return (SK_PNMI_ERR_TOO_SHORT);\r
37794+ }\r
37795+ break;\r
37796+\r
37797+ case OID_SKGE_SENSOR_DESCR:\r
37798+ for (Offset = 0, i = Index; i < Limit; i ++) {\r
37799+\r
37800+ Len = (unsigned int)\r
37801+ SK_STRLEN(pAC->I2c.SenTable[i].SenDesc) + 1;\r
37802+ if (Len >= SK_PNMI_STRINGLEN2) {\r
37803+\r
37804+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR011,\r
37805+ SK_PNMI_ERR011MSG);\r
37806+\r
37807+ *pLen = 0;\r
37808+ return (SK_PNMI_ERR_GENERAL);\r
37809+ }\r
37810+ Offset += Len;\r
37811+ }\r
37812+ if (*pLen < Offset) {\r
37813+\r
37814+ *pLen = Offset;\r
37815+ return (SK_PNMI_ERR_TOO_SHORT);\r
37816+ }\r
37817+ break;\r
37818+\r
37819+ case OID_SKGE_SENSOR_INDEX:\r
37820+ case OID_SKGE_SENSOR_TYPE:\r
37821+ case OID_SKGE_SENSOR_STATUS:\r
37822+ if (*pLen < Limit - Index) {\r
37823+\r
37824+ *pLen = Limit - Index;\r
37825+ return (SK_PNMI_ERR_TOO_SHORT);\r
37826+ }\r
37827+ break;\r
37828+\r
37829+ case OID_SKGE_SENSOR_WAR_CTS:\r
37830+ case OID_SKGE_SENSOR_WAR_TIME:\r
37831+ case OID_SKGE_SENSOR_ERR_CTS:\r
37832+ case OID_SKGE_SENSOR_ERR_TIME:\r
37833+ if (*pLen < (Limit - Index) * sizeof(SK_U64)) {\r
37834+\r
37835+ *pLen = (Limit - Index) * sizeof(SK_U64);\r
37836+ return (SK_PNMI_ERR_TOO_SHORT);\r
37837+ }\r
37838+ break;\r
37839+\r
37840+ default:\r
37841+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR012, SK_PNMI_ERR012MSG);\r
37842+\r
37843+ *pLen = 0;\r
37844+ return (SK_PNMI_ERR_GENERAL);\r
37845+\r
37846+ }\r
37847+\r
37848+ /* Get value. */\r
37849+ for (Offset = 0; Index < Limit; Index ++) {\r
37850+\r
37851+ switch (Id) {\r
37852+\r
37853+ case OID_SKGE_SENSOR_INDEX:\r
37854+ *(pBuf + Offset) = (char)Index;\r
37855+ Offset ++;\r
37856+ break;\r
37857+\r
37858+ case OID_SKGE_SENSOR_DESCR:\r
37859+ Len = SK_STRLEN(pAC->I2c.SenTable[Index].SenDesc);\r
37860+ SK_MEMCPY(pBuf + Offset + 1, pAC->I2c.SenTable[Index].SenDesc, Len);\r
37861+ *(pBuf + Offset) = (char)Len;\r
37862+ Offset += Len + 1;\r
37863+ break;\r
37864+\r
37865+ case OID_SKGE_SENSOR_TYPE:\r
37866+ *(pBuf + Offset) = (char)pAC->I2c.SenTable[Index].SenType;\r
37867+ Offset ++;\r
37868+ break;\r
37869+\r
37870+ case OID_SKGE_SENSOR_VALUE:\r
37871+ Val32 = (SK_U32)pAC->I2c.SenTable[Index].SenValue;\r
37872+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
37873+ Offset += sizeof(SK_U32);\r
37874+ break;\r
37875+\r
37876+ case OID_SKGE_SENSOR_WAR_THRES_LOW:\r
37877+ Val32 = (SK_U32)pAC->I2c.SenTable[Index].\r
37878+ SenThreWarnLow;\r
37879+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
37880+ Offset += sizeof(SK_U32);\r
37881+ break;\r
37882+\r
37883+ case OID_SKGE_SENSOR_WAR_THRES_UPP:\r
37884+ Val32 = (SK_U32)pAC->I2c.SenTable[Index].\r
37885+ SenThreWarnHigh;\r
37886+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
37887+ Offset += sizeof(SK_U32);\r
37888+ break;\r
37889+\r
37890+ case OID_SKGE_SENSOR_ERR_THRES_LOW:\r
37891+ Val32 = (SK_U32)pAC->I2c.SenTable[Index].\r
37892+ SenThreErrLow;\r
37893+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
37894+ Offset += sizeof(SK_U32);\r
37895+ break;\r
37896+\r
37897+ case OID_SKGE_SENSOR_ERR_THRES_UPP:\r
37898+ Val32 = pAC->I2c.SenTable[Index].SenThreErrHigh;\r
37899+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
37900+ Offset += sizeof(SK_U32);\r
37901+ break;\r
37902+\r
37903+ case OID_SKGE_SENSOR_STATUS:\r
37904+ *(pBuf + Offset) = (char)pAC->I2c.SenTable[Index].SenErrFlag;\r
37905+ Offset ++;\r
37906+ break;\r
37907+\r
37908+ case OID_SKGE_SENSOR_WAR_CTS:\r
37909+ Val64 = pAC->I2c.SenTable[Index].SenWarnCts;\r
37910+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
37911+ Offset += sizeof(SK_U64);\r
37912+ break;\r
37913+\r
37914+ case OID_SKGE_SENSOR_ERR_CTS:\r
37915+ Val64 = pAC->I2c.SenTable[Index].SenErrCts;\r
37916+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
37917+ Offset += sizeof(SK_U64);\r
37918+ break;\r
37919+\r
37920+ case OID_SKGE_SENSOR_WAR_TIME:\r
37921+ Val64 = SK_PNMI_HUNDREDS_SEC(pAC->I2c.SenTable[Index].\r
37922+ SenBegWarnTS);\r
37923+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
37924+ Offset += sizeof(SK_U64);\r
37925+ break;\r
37926+\r
37927+ case OID_SKGE_SENSOR_ERR_TIME:\r
37928+ Val64 = SK_PNMI_HUNDREDS_SEC(pAC->I2c.SenTable[Index].\r
37929+ SenBegErrTS);\r
37930+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
37931+ Offset += sizeof(SK_U64);\r
37932+ break;\r
37933+\r
37934+ default:\r
37935+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,\r
37936+ ("SensorStat: Unknown OID should be handled before"));\r
37937+\r
37938+ return (SK_PNMI_ERR_GENERAL);\r
37939+ }\r
37940+ }\r
37941+\r
37942+ /* Store used buffer space. */\r
37943+ *pLen = Offset;\r
37944+\r
37945+ return (SK_PNMI_ERR_OK);\r
37946+}\r
37947+\r
37948+/*****************************************************************************\r
37949+ *\r
37950+ * Vpd - OID handler function of OID_SKGE_VPD_XXX\r
37951+ *\r
37952+ * Description:\r
37953+ * Get/preset/set of VPD data. As instance the name of a VPD key\r
37954+ * can be passed. The Instance parameter is a SK_U32 and can be\r
37955+ * used as a string buffer for the VPD key, because their maximum\r
37956+ * length is 4 byte.\r
37957+ *\r
37958+ * Returns:\r
37959+ * SK_PNMI_ERR_OK The request was successfully performed.\r
37960+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
37961+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
37962+ * the correct data (e.g. a 32bit value is\r
37963+ * needed, but a 16 bit value was passed).\r
37964+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
37965+ * value range.\r
37966+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
37967+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
37968+ * exist (e.g. port instance 3 on a two port\r
37969+ * adapter.\r
37970+ */\r
37971+PNMI_STATIC int Vpd(\r
37972+SK_AC *pAC, /* Pointer to adapter context */\r
37973+SK_IOC IoC, /* IO context handle */\r
37974+int Action, /* GET/PRESET/SET action */\r
37975+SK_U32 Id, /* Object ID that is to be processed */\r
37976+char *pBuf, /* Buffer used for the management data transfer */\r
37977+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
37978+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
37979+unsigned int TableIndex, /* Index to the Id table */\r
37980+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
37981+{\r
37982+ SK_VPD_STATUS *pVpdStatus;\r
37983+ unsigned int BufLen;\r
37984+ char Buf[256];\r
37985+ char KeyArr[SK_PNMI_VPD_ENTRIES][SK_PNMI_VPD_KEY_SIZE];\r
37986+ char KeyStr[SK_PNMI_VPD_KEY_SIZE];\r
37987+ unsigned int KeyNo;\r
37988+ unsigned int Offset;\r
37989+ unsigned int Index;\r
37990+ unsigned int FirstIndex;\r
37991+ unsigned int LastIndex;\r
37992+ unsigned int Len;\r
37993+ int Ret;\r
37994+ SK_U32 Val32;\r
37995+\r
37996+ /*\r
37997+ * VpdKeyReadError will be set in GetVpdKeyArr() if an error occurs.\r
37998+ * Due to the fact that some drivers use SkPnmiGetStruct() to retrieve\r
37999+ * all statistical data, an error in GetVpdKeyArr() will generate a PNMI\r
38000+ * error and terminate SkPnmiGetStruct() without filling in statistical\r
38001+ * data into the PNMI struct. In this case the driver will get no values\r
38002+ * for statistical purposes (netstat, ifconfig etc.). GetVpdKeyArr() is\r
38003+ * the first function to be called in SkPnmiGetStruct(), so any error\r
38004+ * will terminate SkPnmiGetStruct() immediately. Hence, VpdKeyReadError will\r
38005+ * be set during the first call to GetVpdKeyArr() to make successful calls\r
38006+ * to SkPnmiGetStruct() possible. But there is another point to consider: \r
38007+ * When filling in the statistical data into the PNMI struct, the VPD\r
38008+ * handler Vpd() will also be called. If GetVpdKeyArr() in Vpd() would\r
38009+ * return with SK_PNMI_ERR_GENERAL, SkPnmiGetStruct() would fail again.\r
38010+ * For this reason VpdKeyReadError is checked here and, if set, Vpd()\r
38011+ * will return without doing anything and the return value SK_PNMI_ERR_OK.\r
38012+ * Therefore SkPnmiGetStruct() is able to continue and fill in all other\r
38013+ * statistical data. \r
38014+ */ \r
38015+ if (pAC->Pnmi.VpdKeyReadError == SK_TRUE) {\r
38016+ return (SK_PNMI_ERR_OK);\r
38017+ }\r
38018+\r
38019+ /* Get array of all currently stored VPD keys. */\r
38020+ Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &KeyNo);\r
38021+ if (Ret != SK_PNMI_ERR_OK) {\r
38022+ *pLen = 0;\r
38023+ return (Ret);\r
38024+ }\r
38025+\r
38026+ /*\r
38027+ * If instance is not -1, try to find the requested VPD key for\r
38028+ * the multiple instance variables. The other OIDs as for example\r
38029+ * OID VPD_ACTION are single instance variables and must be\r
38030+ * handled separatly.\r
38031+ */\r
38032+ FirstIndex = 0;\r
38033+ LastIndex = KeyNo;\r
38034+\r
38035+ if ((Instance != (SK_U32)(-1))) {\r
38036+\r
38037+ if (Id == OID_SKGE_VPD_KEY || Id == OID_SKGE_VPD_VALUE ||\r
38038+ Id == OID_SKGE_VPD_ACCESS) {\r
38039+\r
38040+ SK_STRNCPY(KeyStr, (char *)&Instance, 4);\r
38041+ KeyStr[4] = 0;\r
38042+\r
38043+ for (Index = 0; Index < KeyNo; Index ++) {\r
38044+\r
38045+ if (SK_STRCMP(KeyStr, KeyArr[Index]) == 0) {\r
38046+ FirstIndex = Index;\r
38047+ LastIndex = Index+1;\r
38048+ break;\r
38049+ }\r
38050+ }\r
38051+ if (Index == KeyNo) {\r
38052+\r
38053+ *pLen = 0;\r
38054+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
38055+ }\r
38056+ }\r
38057+ else if (Instance != 1) {\r
38058+\r
38059+ *pLen = 0;\r
38060+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
38061+ }\r
38062+ }\r
38063+\r
38064+ /* Get value, if a query should be performed. */\r
38065+ if (Action == SK_PNMI_GET) {\r
38066+\r
38067+ switch (Id) {\r
38068+\r
38069+ case OID_SKGE_VPD_FREE_BYTES:\r
38070+ /* Check length of buffer. */\r
38071+ if (*pLen < sizeof(SK_U32)) {\r
38072+\r
38073+ *pLen = sizeof(SK_U32);\r
38074+ return (SK_PNMI_ERR_TOO_SHORT);\r
38075+ }\r
38076+ /* Get number of free bytes. */\r
38077+ pVpdStatus = VpdStat(pAC, IoC);\r
38078+ if (pVpdStatus == NULL) {\r
38079+\r
38080+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38081+ (SK_PNMI_ERR017MSG));\r
38082+\r
38083+ *pLen = 0;\r
38084+ return (SK_PNMI_ERR_GENERAL);\r
38085+ }\r
38086+ if ((pVpdStatus->vpd_status & VPD_VALID) == 0) {\r
38087+\r
38088+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38089+ (SK_PNMI_ERR018MSG));\r
38090+\r
38091+ *pLen = 0;\r
38092+ return (SK_PNMI_ERR_GENERAL);\r
38093+ }\r
38094+ \r
38095+ Val32 = (SK_U32)pVpdStatus->vpd_free_rw;\r
38096+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38097+ *pLen = sizeof(SK_U32);\r
38098+ break;\r
38099+\r
38100+ case OID_SKGE_VPD_ENTRIES_LIST:\r
38101+ /* Check length. */\r
38102+ for (Len = 0, Index = 0; Index < KeyNo; Index ++) {\r
38103+\r
38104+ Len += SK_STRLEN(KeyArr[Index]) + 1;\r
38105+ }\r
38106+ if (*pLen < Len) {\r
38107+\r
38108+ *pLen = Len;\r
38109+ return (SK_PNMI_ERR_TOO_SHORT);\r
38110+ }\r
38111+\r
38112+ /* Get value. */\r
38113+ *(pBuf) = (char)Len - 1;\r
38114+ for (Offset = 1, Index = 0; Index < KeyNo; Index ++) {\r
38115+\r
38116+ Len = SK_STRLEN(KeyArr[Index]);\r
38117+ SK_MEMCPY(pBuf + Offset, KeyArr[Index], Len);\r
38118+\r
38119+ Offset += Len;\r
38120+\r
38121+ if (Index < KeyNo - 1) {\r
38122+\r
38123+ *(pBuf + Offset) = ' ';\r
38124+ Offset ++;\r
38125+ }\r
38126+ }\r
38127+ *pLen = Offset;\r
38128+ break;\r
38129+\r
38130+ case OID_SKGE_VPD_ENTRIES_NUMBER:\r
38131+ /* Check length. */\r
38132+ if (*pLen < sizeof(SK_U32)) {\r
38133+\r
38134+ *pLen = sizeof(SK_U32);\r
38135+ return (SK_PNMI_ERR_TOO_SHORT);\r
38136+ }\r
38137+\r
38138+ Val32 = (SK_U32)KeyNo;\r
38139+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38140+ *pLen = sizeof(SK_U32);\r
38141+ break;\r
38142+\r
38143+ case OID_SKGE_VPD_KEY:\r
38144+ /* Check buffer length, if it is large enough. */\r
38145+ for (Len = 0, Index = FirstIndex;\r
38146+ Index < LastIndex; Index ++) {\r
38147+\r
38148+ Len += SK_STRLEN(KeyArr[Index]) + 1;\r
38149+ }\r
38150+ if (*pLen < Len) {\r
38151+\r
38152+ *pLen = Len;\r
38153+ return (SK_PNMI_ERR_TOO_SHORT);\r
38154+ }\r
38155+\r
38156+ /*\r
38157+ * Get the key to an intermediate buffer, because\r
38158+ * we have to prepend a length byte.\r
38159+ */\r
38160+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) {\r
38161+\r
38162+ Len = SK_STRLEN(KeyArr[Index]);\r
38163+\r
38164+ *(pBuf + Offset) = (char)Len;\r
38165+ SK_MEMCPY(pBuf + Offset + 1, KeyArr[Index], Len);\r
38166+ Offset += Len + 1;\r
38167+ }\r
38168+ *pLen = Offset;\r
38169+ break;\r
38170+\r
38171+ case OID_SKGE_VPD_VALUE:\r
38172+ /* Check the buffer length if it is large enough. */\r
38173+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) {\r
38174+\r
38175+ BufLen = 256;\r
38176+ if (VpdRead(pAC, IoC, KeyArr[Index], Buf,\r
38177+ (int *)&BufLen) > 0 ||\r
38178+ BufLen >= SK_PNMI_VPD_DATALEN) {\r
38179+\r
38180+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38181+ (SK_PNMI_ERR021MSG));\r
38182+\r
38183+ return (SK_PNMI_ERR_GENERAL);\r
38184+ }\r
38185+ Offset += BufLen + 1;\r
38186+ }\r
38187+ if (*pLen < Offset) {\r
38188+\r
38189+ *pLen = Offset;\r
38190+ return (SK_PNMI_ERR_TOO_SHORT);\r
38191+ }\r
38192+\r
38193+ /*\r
38194+ * Get the value to an intermediate buffer, because\r
38195+ * we have to prepend a length byte.\r
38196+ */\r
38197+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) {\r
38198+\r
38199+ BufLen = 256;\r
38200+ if (VpdRead(pAC, IoC, KeyArr[Index], Buf,\r
38201+ (int *)&BufLen) > 0 ||\r
38202+ BufLen >= SK_PNMI_VPD_DATALEN) {\r
38203+\r
38204+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38205+ (SK_PNMI_ERR022MSG));\r
38206+\r
38207+ *pLen = 0;\r
38208+ return (SK_PNMI_ERR_GENERAL);\r
38209+ }\r
38210+\r
38211+ *(pBuf + Offset) = (char)BufLen;\r
38212+ SK_MEMCPY(pBuf + Offset + 1, Buf, BufLen);\r
38213+ Offset += BufLen + 1;\r
38214+ }\r
38215+ *pLen = Offset;\r
38216+ break;\r
38217+\r
38218+ case OID_SKGE_VPD_ACCESS:\r
38219+ if (*pLen < LastIndex - FirstIndex) {\r
38220+\r
38221+ *pLen = LastIndex - FirstIndex;\r
38222+ return (SK_PNMI_ERR_TOO_SHORT);\r
38223+ }\r
38224+\r
38225+ for (Offset = 0, Index = FirstIndex; Index < LastIndex; Index ++) {\r
38226+\r
38227+ if (VpdMayWrite(KeyArr[Index])) {\r
38228+\r
38229+ *(pBuf + Offset) = SK_PNMI_VPD_RW;\r
38230+ }\r
38231+ else {\r
38232+ *(pBuf + Offset) = SK_PNMI_VPD_RO;\r
38233+ }\r
38234+ Offset ++;\r
38235+ }\r
38236+ *pLen = Offset;\r
38237+ break;\r
38238+\r
38239+ case OID_SKGE_VPD_ACTION:\r
38240+ Offset = LastIndex - FirstIndex;\r
38241+ if (*pLen < Offset) {\r
38242+\r
38243+ *pLen = Offset;\r
38244+ return (SK_PNMI_ERR_TOO_SHORT);\r
38245+ }\r
38246+ SK_MEMSET(pBuf, 0, Offset);\r
38247+ *pLen = Offset;\r
38248+ break;\r
38249+\r
38250+ default:\r
38251+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38252+ (SK_PNMI_ERR023MSG));\r
38253+\r
38254+ *pLen = 0;\r
38255+ return (SK_PNMI_ERR_GENERAL);\r
38256+ }\r
38257+ }\r
38258+ else {\r
38259+ /* The only OID which can be set is VPD_ACTION. */\r
38260+ if (Id != OID_SKGE_VPD_ACTION) {\r
38261+\r
38262+ if (Id == OID_SKGE_VPD_FREE_BYTES ||\r
38263+ Id == OID_SKGE_VPD_ENTRIES_LIST ||\r
38264+ Id == OID_SKGE_VPD_ENTRIES_NUMBER ||\r
38265+ Id == OID_SKGE_VPD_KEY ||\r
38266+ Id == OID_SKGE_VPD_VALUE ||\r
38267+ Id == OID_SKGE_VPD_ACCESS) {\r
38268+\r
38269+ *pLen = 0;\r
38270+ return (SK_PNMI_ERR_READ_ONLY);\r
38271+ }\r
38272+\r
38273+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38274+ (SK_PNMI_ERR024MSG));\r
38275+\r
38276+ *pLen = 0;\r
38277+ return (SK_PNMI_ERR_GENERAL);\r
38278+ }\r
38279+\r
38280+ /*\r
38281+ * From this point we handle VPD_ACTION. Check the buffer\r
38282+ * length. It should at least have the size of one byte.\r
38283+ */\r
38284+ if (*pLen < 1) {\r
38285+\r
38286+ *pLen = 1;\r
38287+ return (SK_PNMI_ERR_TOO_SHORT);\r
38288+ }\r
38289+\r
38290+ /* The first byte contains the VPD action type we should perform. */\r
38291+ switch (*pBuf) {\r
38292+\r
38293+ case SK_PNMI_VPD_IGNORE:\r
38294+ /* Nothing to do. */\r
38295+ break;\r
38296+\r
38297+ case SK_PNMI_VPD_CREATE:\r
38298+ /*\r
38299+ * We have to create a new VPD entry or we modify\r
38300+ * an existing one. Check first the buffer length.\r
38301+ */\r
38302+ if (*pLen < 4) {\r
38303+\r
38304+ *pLen = 4;\r
38305+ return (SK_PNMI_ERR_TOO_SHORT);\r
38306+ }\r
38307+ KeyStr[0] = pBuf[1];\r
38308+ KeyStr[1] = pBuf[2];\r
38309+ KeyStr[2] = 0;\r
38310+\r
38311+ /*\r
38312+ * Is the entry writable or does it belong to the\r
38313+ * read-only area?\r
38314+ */\r
38315+ if (!VpdMayWrite(KeyStr)) {\r
38316+\r
38317+ *pLen = 0;\r
38318+ return (SK_PNMI_ERR_BAD_VALUE);\r
38319+ }\r
38320+\r
38321+ Offset = (int)pBuf[3] & 0xFF;\r
38322+\r
38323+ SK_MEMCPY(Buf, pBuf + 4, Offset);\r
38324+ Buf[Offset] = 0;\r
38325+\r
38326+ /* A PRESET ends here. */\r
38327+ if (Action == SK_PNMI_PRESET) {\r
38328+\r
38329+ return (SK_PNMI_ERR_OK);\r
38330+ }\r
38331+\r
38332+ /* Write the new entry or modify an existing one .*/\r
38333+ Ret = VpdWrite(pAC, IoC, KeyStr, Buf);\r
38334+ if (Ret == SK_PNMI_VPD_NOWRITE ) {\r
38335+\r
38336+ *pLen = 0;\r
38337+ return (SK_PNMI_ERR_BAD_VALUE);\r
38338+ }\r
38339+ else if (Ret != SK_PNMI_VPD_OK) {\r
38340+\r
38341+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38342+ (SK_PNMI_ERR025MSG));\r
38343+\r
38344+ *pLen = 0;\r
38345+ return (SK_PNMI_ERR_GENERAL);\r
38346+ }\r
38347+\r
38348+ /*\r
38349+ * Perform an update of the VPD data. This is\r
38350+ * not mandantory, but just to be sure.\r
38351+ */\r
38352+ Ret = VpdUpdate(pAC, IoC);\r
38353+ if (Ret != SK_PNMI_VPD_OK) {\r
38354+\r
38355+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38356+ (SK_PNMI_ERR026MSG));\r
38357+\r
38358+ *pLen = 0;\r
38359+ return (SK_PNMI_ERR_GENERAL);\r
38360+ }\r
38361+ break;\r
38362+\r
38363+ case SK_PNMI_VPD_DELETE:\r
38364+ /* Check if the buffer size is plausible. */\r
38365+ if (*pLen < 3) {\r
38366+\r
38367+ *pLen = 3;\r
38368+ return (SK_PNMI_ERR_TOO_SHORT);\r
38369+ }\r
38370+ if (*pLen > 3) {\r
38371+\r
38372+ *pLen = 0;\r
38373+ return (SK_PNMI_ERR_BAD_VALUE);\r
38374+ }\r
38375+ KeyStr[0] = pBuf[1];\r
38376+ KeyStr[1] = pBuf[2];\r
38377+ KeyStr[2] = 0;\r
38378+\r
38379+ /* Find the passed key in the array. */\r
38380+ for (Index = 0; Index < KeyNo; Index ++) {\r
38381+\r
38382+ if (SK_STRCMP(KeyStr, KeyArr[Index]) == 0) {\r
38383+\r
38384+ break;\r
38385+ }\r
38386+ }\r
38387+\r
38388+ /*\r
38389+ * If we cannot find the key it is wrong, so we\r
38390+ * return an appropriate error value.\r
38391+ */\r
38392+ if (Index == KeyNo) {\r
38393+\r
38394+ *pLen = 0;\r
38395+ return (SK_PNMI_ERR_BAD_VALUE);\r
38396+ }\r
38397+\r
38398+ if (Action == SK_PNMI_PRESET) {\r
38399+\r
38400+ return (SK_PNMI_ERR_OK);\r
38401+ }\r
38402+\r
38403+ /* Ok, you wanted it and you will get it. */\r
38404+ Ret = VpdDelete(pAC, IoC, KeyStr);\r
38405+ if (Ret != SK_PNMI_VPD_OK) {\r
38406+\r
38407+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38408+ (SK_PNMI_ERR027MSG));\r
38409+\r
38410+ *pLen = 0;\r
38411+ return (SK_PNMI_ERR_GENERAL);\r
38412+ }\r
38413+\r
38414+ /*\r
38415+ * Perform an update of the VPD data. This is\r
38416+ * not mandantory, but just to be sure.\r
38417+ */\r
38418+ Ret = VpdUpdate(pAC, IoC);\r
38419+ if (Ret != SK_PNMI_VPD_OK) {\r
38420+\r
38421+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
38422+ (SK_PNMI_ERR028MSG));\r
38423+\r
38424+ *pLen = 0;\r
38425+ return (SK_PNMI_ERR_GENERAL);\r
38426+ }\r
38427+ break;\r
38428+\r
38429+ default:\r
38430+ *pLen = 0;\r
38431+ return (SK_PNMI_ERR_BAD_VALUE);\r
38432+ }\r
38433+ }\r
38434+\r
38435+ return (SK_PNMI_ERR_OK);\r
38436+}\r
38437+\r
38438+/*****************************************************************************\r
38439+ *\r
38440+ * General - OID handler function of various single instance OIDs\r
38441+ *\r
38442+ * Description:\r
38443+ * The code is simple. No description necessary.\r
38444+ *\r
38445+ * Returns:\r
38446+ * SK_PNMI_ERR_OK The request was successfully performed.\r
38447+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
38448+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
38449+ * the correct data (e.g. a 32bit value is\r
38450+ * needed, but a 16 bit value was passed).\r
38451+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
38452+ * exist (e.g. port instance 3 on a two port\r
38453+ * adapter.\r
38454+ */\r
38455+PNMI_STATIC int General(\r
38456+SK_AC *pAC, /* Pointer to adapter context */\r
38457+SK_IOC IoC, /* IO context handle */\r
38458+int Action, /* GET/PRESET/SET action */\r
38459+SK_U32 Id, /* Object ID that is to be processed */\r
38460+char *pBuf, /* Buffer used for the management data transfer */\r
38461+unsigned int *pLen, /* On call: buffer length. On return: used buffer */\r
38462+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
38463+unsigned int TableIndex, /* Index to the Id table */\r
38464+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
38465+{\r
38466+ int Ret;\r
38467+ unsigned int Index;\r
38468+ unsigned int Len;\r
38469+ unsigned int Offset;\r
38470+ unsigned int Val;\r
38471+ SK_U8 Val8;\r
38472+ SK_U16 Val16;\r
38473+ SK_U32 Val32;\r
38474+ SK_U64 Val64;\r
38475+ SK_U64 Val64RxHwErrs = 0;\r
38476+ SK_U64 Val64RxRunt = 0;\r
38477+ SK_U64 Val64RxFcs = 0;\r
38478+ SK_U64 Val64TxHwErrs = 0;\r
38479+ SK_BOOL Is64BitReq = SK_FALSE;\r
38480+ char Buf[256];\r
38481+ int MacType;\r
38482+\r
38483+ /* Check instance. We only handle single instance variables. */\r
38484+ if (Instance != (SK_U32)(-1) && Instance != 1) {\r
38485+\r
38486+ *pLen = 0;\r
38487+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
38488+ }\r
38489+\r
38490+ /* Check action. We only allow get requests. */\r
38491+ if (Action != SK_PNMI_GET) {\r
38492+\r
38493+ *pLen = 0;\r
38494+ return (SK_PNMI_ERR_READ_ONLY);\r
38495+ }\r
38496+ \r
38497+ MacType = pAC->GIni.GIMacType;\r
38498+ \r
38499+ /* Check length for the various supported OIDs. */\r
38500+ switch (Id) {\r
38501+\r
38502+ case OID_GEN_XMIT_ERROR:\r
38503+ case OID_GEN_RCV_ERROR:\r
38504+ case OID_GEN_RCV_NO_BUFFER:\r
38505+#ifndef SK_NDIS_64BIT_CTR\r
38506+ if (*pLen < sizeof(SK_U32)) {\r
38507+ *pLen = sizeof(SK_U32);\r
38508+ return (SK_PNMI_ERR_TOO_SHORT);\r
38509+ }\r
38510+\r
38511+#else /* SK_NDIS_64BIT_CTR */\r
38512+\r
38513+ /* For compatibility, at least 32bit are required for OID. */\r
38514+ if (*pLen < sizeof(SK_U32)) {\r
38515+ /*\r
38516+ * Indicate handling for 64bit values,\r
38517+ * if insufficient space is provided.\r
38518+ */\r
38519+ *pLen = sizeof(SK_U64);\r
38520+ return (SK_PNMI_ERR_TOO_SHORT);\r
38521+ }\r
38522+\r
38523+ Is64BitReq = (*pLen < sizeof(SK_U64)) ? SK_FALSE : SK_TRUE;\r
38524+#endif /* SK_NDIS_64BIT_CTR */\r
38525+ break;\r
38526+\r
38527+ case OID_SKGE_PORT_NUMBER:\r
38528+ case OID_SKGE_DEVICE_TYPE:\r
38529+ case OID_SKGE_RESULT:\r
38530+ case OID_SKGE_RLMT_MONITOR_NUMBER:\r
38531+ case OID_GEN_TRANSMIT_QUEUE_LENGTH:\r
38532+ case OID_SKGE_TRAP_NUMBER:\r
38533+ case OID_SKGE_MDB_VERSION:\r
38534+ case OID_SKGE_BOARDLEVEL:\r
38535+ case OID_SKGE_CHIPID:\r
38536+ case OID_SKGE_RAMSIZE:\r
38537+ if (*pLen < sizeof(SK_U32)) {\r
38538+\r
38539+ *pLen = sizeof(SK_U32);\r
38540+ return (SK_PNMI_ERR_TOO_SHORT);\r
38541+ }\r
38542+ break;\r
38543+\r
38544+ case OID_SKGE_CHIPSET:\r
38545+ if (*pLen < sizeof(SK_U16)) {\r
38546+\r
38547+ *pLen = sizeof(SK_U16);\r
38548+ return (SK_PNMI_ERR_TOO_SHORT);\r
38549+ }\r
38550+ break;\r
38551+\r
38552+ case OID_SKGE_BUS_TYPE:\r
38553+ case OID_SKGE_BUS_SPEED:\r
38554+ case OID_SKGE_BUS_WIDTH:\r
38555+ case OID_SKGE_SENSOR_NUMBER:\r
38556+ case OID_SKGE_CHKSM_NUMBER:\r
38557+ case OID_SKGE_VAUXAVAIL:\r
38558+ if (*pLen < sizeof(SK_U8)) {\r
38559+\r
38560+ *pLen = sizeof(SK_U8);\r
38561+ return (SK_PNMI_ERR_TOO_SHORT);\r
38562+ }\r
38563+ break;\r
38564+\r
38565+ case OID_SKGE_TX_SW_QUEUE_LEN:\r
38566+ case OID_SKGE_TX_SW_QUEUE_MAX:\r
38567+ case OID_SKGE_TX_RETRY:\r
38568+ case OID_SKGE_RX_INTR_CTS:\r
38569+ case OID_SKGE_TX_INTR_CTS:\r
38570+ case OID_SKGE_RX_NO_BUF_CTS:\r
38571+ case OID_SKGE_TX_NO_BUF_CTS:\r
38572+ case OID_SKGE_TX_USED_DESCR_NO:\r
38573+ case OID_SKGE_RX_DELIVERED_CTS:\r
38574+ case OID_SKGE_RX_OCTETS_DELIV_CTS:\r
38575+ case OID_SKGE_RX_HW_ERROR_CTS:\r
38576+ case OID_SKGE_TX_HW_ERROR_CTS:\r
38577+ case OID_SKGE_IN_ERRORS_CTS:\r
38578+ case OID_SKGE_OUT_ERROR_CTS:\r
38579+ case OID_SKGE_ERR_RECOVERY_CTS:\r
38580+ case OID_SKGE_SYSUPTIME:\r
38581+ if (*pLen < sizeof(SK_U64)) {\r
38582+\r
38583+ *pLen = sizeof(SK_U64);\r
38584+ return (SK_PNMI_ERR_TOO_SHORT);\r
38585+ }\r
38586+ break;\r
38587+\r
38588+ default:\r
38589+ /* Checked later. */\r
38590+ break;\r
38591+ }\r
38592+\r
38593+ /* Update statistics. */\r
38594+ if (Id == OID_SKGE_RX_HW_ERROR_CTS ||\r
38595+ Id == OID_SKGE_TX_HW_ERROR_CTS ||\r
38596+ Id == OID_SKGE_IN_ERRORS_CTS ||\r
38597+ Id == OID_SKGE_OUT_ERROR_CTS ||\r
38598+ Id == OID_GEN_XMIT_ERROR ||\r
38599+ Id == OID_GEN_RCV_ERROR) {\r
38600+\r
38601+ /*\r
38602+ * Force the XMAC to update its statistic counters and\r
38603+ * Increment semaphore to indicate that an update was\r
38604+ * already done.\r
38605+ */\r
38606+ Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);\r
38607+ if (Ret != SK_PNMI_ERR_OK) {\r
38608+\r
38609+ *pLen = 0;\r
38610+ return (Ret);\r
38611+ }\r
38612+ pAC->Pnmi.MacUpdatedFlag ++;\r
38613+\r
38614+ /*\r
38615+ * Some OIDs consist of multiple hardware counters. Those\r
38616+ * values which are contained in all of them will be added\r
38617+ * now.\r
38618+ */\r
38619+ switch (Id) {\r
38620+\r
38621+ case OID_SKGE_RX_HW_ERROR_CTS:\r
38622+ case OID_SKGE_IN_ERRORS_CTS:\r
38623+ case OID_GEN_RCV_ERROR:\r
38624+ Val64RxHwErrs =\r
38625+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_MISSED, NetIndex) +\r
38626+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FRAMING, NetIndex) +\r
38627+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex) +\r
38628+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_JABBER, NetIndex) +\r
38629+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_CARRIER, NetIndex) +\r
38630+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_IRLENGTH, NetIndex) +\r
38631+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SYMBOL, NetIndex) +\r
38632+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SHORTS, NetIndex) +\r
38633+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_TOO_LONG, NetIndex) +\r
38634+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_CEXT, NetIndex);\r
38635+\r
38636+\r
38637+ /*\r
38638+ * In some cases the runt and fcs counters are incremented when collisions\r
38639+ * occur. We have to correct those counters here.\r
38640+ */\r
38641+ Val64RxRunt = GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_RUNT, NetIndex);\r
38642+ Val64RxFcs = GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FCS, NetIndex);\r
38643+\r
38644+ if (Val64RxRunt > Val64RxFcs) {\r
38645+ Val64RxRunt -= Val64RxFcs;\r
38646+ Val64RxHwErrs += Val64RxRunt;\r
38647+ }\r
38648+ else {\r
38649+ Val64RxFcs -= Val64RxRunt;\r
38650+ Val64RxHwErrs += Val64RxFcs;\r
38651+ }\r
38652+ break;\r
38653+\r
38654+ case OID_SKGE_TX_HW_ERROR_CTS:\r
38655+ case OID_SKGE_OUT_ERROR_CTS:\r
38656+ case OID_GEN_XMIT_ERROR:\r
38657+ Val64TxHwErrs =\r
38658+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_EXCESS_COL, NetIndex) +\r
38659+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_LATE_COL, NetIndex) +\r
38660+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_UNDERRUN, NetIndex) +\r
38661+ GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_CARRIER, NetIndex);\r
38662+ break;\r
38663+ }\r
38664+ }\r
38665+\r
38666+ /* Retrieve value. */\r
38667+ switch (Id) {\r
38668+\r
38669+ case OID_SKGE_SUPPORTED_LIST:\r
38670+ Len = ID_TABLE_SIZE * sizeof(SK_U32);\r
38671+ if (*pLen < Len) {\r
38672+\r
38673+ *pLen = Len;\r
38674+ return (SK_PNMI_ERR_TOO_SHORT);\r
38675+ }\r
38676+ for (Offset = 0, Index = 0; Offset < Len; Index ++) {\r
38677+\r
38678+ Val32 = (SK_U32)IdTable[Index].Id;\r
38679+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
38680+ Offset += sizeof(SK_U32);\r
38681+ }\r
38682+ *pLen = Len;\r
38683+ break;\r
38684+\r
38685+ case OID_SKGE_BOARDLEVEL:\r
38686+ Val32 = (SK_U32)pAC->GIni.GILevel;\r
38687+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38688+ *pLen = sizeof(SK_U32);\r
38689+ break;\r
38690+\r
38691+ case OID_SKGE_PORT_NUMBER:\r
38692+ Val32 = (SK_U32)pAC->GIni.GIMacsFound;\r
38693+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38694+ *pLen = sizeof(SK_U32);\r
38695+ break;\r
38696+\r
38697+ case OID_SKGE_DEVICE_TYPE:\r
38698+ Val32 = (SK_U32)pAC->Pnmi.DeviceType;\r
38699+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38700+ *pLen = sizeof(SK_U32);\r
38701+ break;\r
38702+\r
38703+ case OID_SKGE_DRIVER_DESCR:\r
38704+ if (pAC->Pnmi.pDriverDescription == NULL) {\r
38705+\r
38706+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR007, SK_PNMI_ERR007MSG);\r
38707+\r
38708+ *pLen = 0;\r
38709+ return (SK_PNMI_ERR_GENERAL);\r
38710+ }\r
38711+\r
38712+ Len = SK_STRLEN(pAC->Pnmi.pDriverDescription) + 1;\r
38713+ if (Len > SK_PNMI_STRINGLEN1) {\r
38714+\r
38715+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR029, SK_PNMI_ERR029MSG);\r
38716+\r
38717+ *pLen = 0;\r
38718+ return (SK_PNMI_ERR_GENERAL);\r
38719+ }\r
38720+\r
38721+ if (*pLen < Len) {\r
38722+\r
38723+ *pLen = Len;\r
38724+ return (SK_PNMI_ERR_TOO_SHORT);\r
38725+ }\r
38726+ *pBuf = (char)(Len - 1);\r
38727+ SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverDescription, Len - 1);\r
38728+ *pLen = Len;\r
38729+ break;\r
38730+\r
38731+ case OID_SKGE_DRIVER_VERSION:\r
38732+ if (pAC->Pnmi.pDriverVersion == NULL) {\r
38733+\r
38734+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030, SK_PNMI_ERR030MSG);\r
38735+\r
38736+ *pLen = 0;\r
38737+ return (SK_PNMI_ERR_GENERAL);\r
38738+ }\r
38739+\r
38740+ Len = SK_STRLEN(pAC->Pnmi.pDriverVersion) + 1;\r
38741+ if (Len > SK_PNMI_STRINGLEN1) {\r
38742+\r
38743+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031, SK_PNMI_ERR031MSG);\r
38744+\r
38745+ *pLen = 0;\r
38746+ return (SK_PNMI_ERR_GENERAL);\r
38747+ }\r
38748+\r
38749+ if (*pLen < Len) {\r
38750+\r
38751+ *pLen = Len;\r
38752+ return (SK_PNMI_ERR_TOO_SHORT);\r
38753+ }\r
38754+ *pBuf = (char)(Len - 1);\r
38755+ SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverVersion, Len - 1);\r
38756+ *pLen = Len;\r
38757+ break;\r
38758+\r
38759+ case OID_SKGE_DRIVER_RELDATE:\r
38760+ if (pAC->Pnmi.pDriverReleaseDate == NULL) {\r
38761+\r
38762+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR053, SK_PNMI_ERR053MSG);\r
38763+\r
38764+ *pLen = 0;\r
38765+ return (SK_PNMI_ERR_GENERAL);\r
38766+ }\r
38767+\r
38768+ Len = SK_STRLEN(pAC->Pnmi.pDriverReleaseDate) + 1;\r
38769+ if (Len > SK_PNMI_STRINGLEN1) {\r
38770+\r
38771+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR054, SK_PNMI_ERR054MSG);\r
38772+\r
38773+ *pLen = 0;\r
38774+ return (SK_PNMI_ERR_GENERAL);\r
38775+ }\r
38776+\r
38777+ if (*pLen < Len) {\r
38778+\r
38779+ *pLen = Len;\r
38780+ return (SK_PNMI_ERR_TOO_SHORT);\r
38781+ }\r
38782+ *pBuf = (char)(Len - 1);\r
38783+ SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverReleaseDate, Len - 1);\r
38784+ *pLen = Len;\r
38785+ break;\r
38786+\r
38787+ case OID_SKGE_DRIVER_FILENAME:\r
38788+ if (pAC->Pnmi.pDriverFileName == NULL) {\r
38789+\r
38790+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR055, SK_PNMI_ERR055MSG);\r
38791+\r
38792+ *pLen = 0;\r
38793+ return (SK_PNMI_ERR_GENERAL);\r
38794+ }\r
38795+\r
38796+ Len = SK_STRLEN(pAC->Pnmi.pDriverFileName) + 1;\r
38797+ if (Len > SK_PNMI_STRINGLEN1) {\r
38798+\r
38799+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR056, SK_PNMI_ERR056MSG);\r
38800+\r
38801+ *pLen = 0;\r
38802+ return (SK_PNMI_ERR_GENERAL);\r
38803+ }\r
38804+\r
38805+ if (*pLen < Len) {\r
38806+\r
38807+ *pLen = Len;\r
38808+ return (SK_PNMI_ERR_TOO_SHORT);\r
38809+ }\r
38810+ *pBuf = (char)(Len - 1);\r
38811+ SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverFileName, Len - 1);\r
38812+ *pLen = Len;\r
38813+ break;\r
38814+\r
38815+ case OID_SKGE_HW_DESCR:\r
38816+ /*\r
38817+ * The hardware description is located in the VPD. This\r
38818+ * query may move to the initialisation routine. But\r
38819+ * the VPD data is cached and therefore a call here\r
38820+ * will not make much difference.\r
38821+ * Please read comment in Vpd().\r
38822+ */\r
38823+ if (pAC->Pnmi.VpdKeyReadError == SK_TRUE) {\r
38824+ return (SK_PNMI_ERR_OK);\r
38825+ }\r
38826+\r
38827+ Len = 256;\r
38828+ if (VpdRead(pAC, IoC, VPD_NAME, Buf, (int *)&Len) > 0) {\r
38829+\r
38830+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR032, SK_PNMI_ERR032MSG);\r
38831+\r
38832+ *pLen = 0;\r
38833+ return (SK_PNMI_ERR_GENERAL);\r
38834+ }\r
38835+ Len ++;\r
38836+ if (Len > SK_PNMI_STRINGLEN1) {\r
38837+\r
38838+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR033, SK_PNMI_ERR033MSG);\r
38839+\r
38840+ *pLen = 0;\r
38841+ return (SK_PNMI_ERR_GENERAL);\r
38842+ }\r
38843+ if (*pLen < Len) {\r
38844+\r
38845+ *pLen = Len;\r
38846+ return (SK_PNMI_ERR_TOO_SHORT);\r
38847+ }\r
38848+ *pBuf = (char)(Len - 1);\r
38849+ SK_MEMCPY(pBuf + 1, Buf, Len - 1);\r
38850+ *pLen = Len;\r
38851+ break;\r
38852+\r
38853+ case OID_SKGE_HW_VERSION:\r
38854+ if (*pLen < 5) {\r
38855+\r
38856+ *pLen = 5;\r
38857+ return (SK_PNMI_ERR_TOO_SHORT);\r
38858+ }\r
38859+ Val8 = (SK_U8)pAC->GIni.GIPciHwRev;\r
38860+ pBuf[0] = 4;\r
38861+ pBuf[1] = 'v';\r
38862+ pBuf[2] = (char)('0' | ((Val8 >> 4) & 0x0f));\r
38863+ pBuf[3] = '.';\r
38864+ pBuf[4] = (char)('0' | (Val8 & 0x0f));\r
38865+ *pLen = 5;\r
38866+ break;\r
38867+\r
38868+ case OID_SKGE_CHIPSET:\r
38869+ Val16 = pAC->Pnmi.Chipset;\r
38870+ SK_PNMI_STORE_U16(pBuf, Val16);\r
38871+ *pLen = sizeof(SK_U16);\r
38872+ break;\r
38873+\r
38874+ case OID_SKGE_CHIPID:\r
38875+ Val32 = pAC->GIni.GIChipId;\r
38876+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38877+ *pLen = sizeof(SK_U32);\r
38878+ break;\r
38879+\r
38880+ case OID_SKGE_RAMSIZE:\r
38881+ Val32 = pAC->GIni.GIRamSize;\r
38882+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38883+ *pLen = sizeof(SK_U32);\r
38884+ break;\r
38885+\r
38886+ case OID_SKGE_VAUXAVAIL:\r
38887+ *pBuf = (char)pAC->GIni.GIVauxAvail;\r
38888+ *pLen = sizeof(char);\r
38889+ break;\r
38890+\r
38891+ case OID_SKGE_BUS_TYPE:\r
38892+ *pBuf = (char)SK_PNMI_BUS_PCI;\r
38893+ *pLen = sizeof(char);\r
38894+ break;\r
38895+\r
38896+ case OID_SKGE_BUS_SPEED:\r
38897+ *pBuf = pAC->Pnmi.PciBusSpeed;\r
38898+ *pLen = sizeof(char);\r
38899+ break;\r
38900+\r
38901+ case OID_SKGE_BUS_WIDTH:\r
38902+ *pBuf = pAC->Pnmi.PciBusWidth;\r
38903+ *pLen = sizeof(char);\r
38904+ break;\r
38905+\r
38906+ case OID_SKGE_RESULT:\r
38907+ Val32 = pAC->Pnmi.TestResult;\r
38908+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38909+ *pLen = sizeof(SK_U32);\r
38910+ break;\r
38911+\r
38912+ case OID_SKGE_SENSOR_NUMBER:\r
38913+ *pBuf = (char)pAC->I2c.MaxSens;\r
38914+ *pLen = sizeof(char);\r
38915+ break;\r
38916+\r
38917+ case OID_SKGE_CHKSM_NUMBER:\r
38918+ *pBuf = SKCS_NUM_PROTOCOLS;\r
38919+ *pLen = sizeof(char);\r
38920+ break;\r
38921+\r
38922+ case OID_SKGE_TRAP_NUMBER:\r
38923+ GetTrapQueueLen(pAC, &Len, &Val);\r
38924+ Val32 = (SK_U32)Val;\r
38925+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38926+ *pLen = sizeof(SK_U32);\r
38927+ break;\r
38928+\r
38929+ case OID_SKGE_TRAP:\r
38930+ GetTrapQueueLen(pAC, &Len, &Val);\r
38931+ if (*pLen < Len) {\r
38932+\r
38933+ *pLen = Len;\r
38934+ return (SK_PNMI_ERR_TOO_SHORT);\r
38935+ }\r
38936+ CopyTrapQueue(pAC, pBuf);\r
38937+ *pLen = Len;\r
38938+ break;\r
38939+\r
38940+ case OID_SKGE_RLMT_MONITOR_NUMBER:\r
38941+ /* Not yet implemented by RLMT, therefore we return zero elements. */\r
38942+ Val32 = 0;\r
38943+ SK_PNMI_STORE_U32(pBuf, Val32);\r
38944+ *pLen = sizeof(SK_U32);\r
38945+ break;\r
38946+\r
38947+ case OID_SKGE_TX_SW_QUEUE_LEN:\r
38948+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
38949+ if (MacType == SK_MAC_XMAC) {\r
38950+ /* DualNet mode. */\r
38951+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
38952+ Val64 = pAC->Pnmi.BufPort[NetIndex].TxSwQueueLen;\r
38953+ }\r
38954+ /* SingleNet mode. */\r
38955+ else {\r
38956+ Val64 = pAC->Pnmi.BufPort[0].TxSwQueueLen +\r
38957+ pAC->Pnmi.BufPort[1].TxSwQueueLen;\r
38958+ } \r
38959+ }\r
38960+ else {\r
38961+ /* DualNet mode. */\r
38962+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
38963+ Val64 = pAC->Pnmi.Port[NetIndex].TxSwQueueLen;\r
38964+ }\r
38965+ /* SingleNet mode. */\r
38966+ else {\r
38967+ Val64 = pAC->Pnmi.Port[0].TxSwQueueLen +\r
38968+ pAC->Pnmi.Port[1].TxSwQueueLen;\r
38969+ } \r
38970+ }\r
38971+ SK_PNMI_STORE_U64(pBuf, Val64);\r
38972+ *pLen = sizeof(SK_U64);\r
38973+ break;\r
38974+\r
38975+\r
38976+ case OID_SKGE_TX_SW_QUEUE_MAX:\r
38977+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
38978+ if (MacType == SK_MAC_XMAC) {\r
38979+ /* DualNet mode. */\r
38980+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
38981+ Val64 = pAC->Pnmi.BufPort[NetIndex].TxSwQueueMax;\r
38982+ }\r
38983+ /* SingleNet mode. */\r
38984+ else {\r
38985+ Val64 = pAC->Pnmi.BufPort[0].TxSwQueueMax +\r
38986+ pAC->Pnmi.BufPort[1].TxSwQueueMax;\r
38987+ }\r
38988+ }\r
38989+ else {\r
38990+ /* DualNet mode. */\r
38991+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
38992+ Val64 = pAC->Pnmi.Port[NetIndex].TxSwQueueMax;\r
38993+ }\r
38994+ /* SingleNet mode. */\r
38995+ else {\r
38996+ Val64 = pAC->Pnmi.Port[0].TxSwQueueMax +\r
38997+ pAC->Pnmi.Port[1].TxSwQueueMax;\r
38998+ }\r
38999+ }\r
39000+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39001+ *pLen = sizeof(SK_U64);\r
39002+ break;\r
39003+\r
39004+ case OID_SKGE_TX_RETRY:\r
39005+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39006+ if (MacType == SK_MAC_XMAC) {\r
39007+ /* DualNet mode. */\r
39008+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39009+ Val64 = pAC->Pnmi.BufPort[NetIndex].TxRetryCts;\r
39010+ }\r
39011+ /* SingleNet mode. */\r
39012+ else {\r
39013+ Val64 = pAC->Pnmi.BufPort[0].TxRetryCts +\r
39014+ pAC->Pnmi.BufPort[1].TxRetryCts;\r
39015+ }\r
39016+ }\r
39017+ else {\r
39018+ /* DualNet mode. */\r
39019+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39020+ Val64 = pAC->Pnmi.Port[NetIndex].TxRetryCts;\r
39021+ }\r
39022+ /* SingleNet mode. */\r
39023+ else {\r
39024+ Val64 = pAC->Pnmi.Port[0].TxRetryCts +\r
39025+ pAC->Pnmi.Port[1].TxRetryCts;\r
39026+ }\r
39027+ }\r
39028+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39029+ *pLen = sizeof(SK_U64);\r
39030+ break;\r
39031+\r
39032+ case OID_SKGE_RX_INTR_CTS:\r
39033+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39034+ if (MacType == SK_MAC_XMAC) {\r
39035+ /* DualNet mode. */\r
39036+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39037+ Val64 = pAC->Pnmi.BufPort[NetIndex].RxIntrCts;\r
39038+ }\r
39039+ /* SingleNet mode. */\r
39040+ else {\r
39041+ Val64 = pAC->Pnmi.BufPort[0].RxIntrCts +\r
39042+ pAC->Pnmi.BufPort[1].RxIntrCts;\r
39043+ }\r
39044+ }\r
39045+ else {\r
39046+ /* DualNet mode. */\r
39047+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39048+ Val64 = pAC->Pnmi.Port[NetIndex].RxIntrCts;\r
39049+ }\r
39050+ /* SingleNet mode. */\r
39051+ else {\r
39052+ Val64 = pAC->Pnmi.Port[0].RxIntrCts +\r
39053+ pAC->Pnmi.Port[1].RxIntrCts;\r
39054+ }\r
39055+ }\r
39056+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39057+ *pLen = sizeof(SK_U64);\r
39058+ break;\r
39059+\r
39060+ case OID_SKGE_TX_INTR_CTS:\r
39061+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39062+ if (MacType == SK_MAC_XMAC) {\r
39063+ /* DualNet mode. */\r
39064+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39065+ Val64 = pAC->Pnmi.BufPort[NetIndex].TxIntrCts;\r
39066+ }\r
39067+ /* SingleNet mode. */\r
39068+ else {\r
39069+ Val64 = pAC->Pnmi.BufPort[0].TxIntrCts +\r
39070+ pAC->Pnmi.BufPort[1].TxIntrCts;\r
39071+ }\r
39072+ }\r
39073+ else {\r
39074+ /* DualNet mode. */\r
39075+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39076+ Val64 = pAC->Pnmi.Port[NetIndex].TxIntrCts;\r
39077+ }\r
39078+ /* SingleNet mode. */\r
39079+ else {\r
39080+ Val64 = pAC->Pnmi.Port[0].TxIntrCts +\r
39081+ pAC->Pnmi.Port[1].TxIntrCts;\r
39082+ }\r
39083+ }\r
39084+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39085+ *pLen = sizeof(SK_U64);\r
39086+ break;\r
39087+\r
39088+ case OID_SKGE_RX_NO_BUF_CTS:\r
39089+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39090+ if (MacType == SK_MAC_XMAC) {\r
39091+ /* DualNet mode. */\r
39092+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39093+ Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts;\r
39094+ }\r
39095+ /* SingleNet mode. */\r
39096+ else {\r
39097+ Val64 = pAC->Pnmi.BufPort[0].RxNoBufCts +\r
39098+ pAC->Pnmi.BufPort[1].RxNoBufCts;\r
39099+ }\r
39100+ }\r
39101+ else {\r
39102+ /* DualNet mode. */\r
39103+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39104+ Val64 = pAC->Pnmi.Port[NetIndex].RxNoBufCts;\r
39105+ }\r
39106+ /* SingleNet mode. */\r
39107+ else {\r
39108+ Val64 = pAC->Pnmi.Port[0].RxNoBufCts +\r
39109+ pAC->Pnmi.Port[1].RxNoBufCts;\r
39110+ }\r
39111+ }\r
39112+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39113+ *pLen = sizeof(SK_U64);\r
39114+ break;\r
39115+\r
39116+ case OID_SKGE_TX_NO_BUF_CTS:\r
39117+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39118+ if (MacType == SK_MAC_XMAC) {\r
39119+ /* DualNet mode. */\r
39120+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39121+ Val64 = pAC->Pnmi.BufPort[NetIndex].TxNoBufCts;\r
39122+ }\r
39123+ /* SingleNet mode. */\r
39124+ else {\r
39125+ Val64 = pAC->Pnmi.BufPort[0].TxNoBufCts +\r
39126+ pAC->Pnmi.BufPort[1].TxNoBufCts;\r
39127+ }\r
39128+ }\r
39129+ else {\r
39130+ /* DualNet mode. */\r
39131+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39132+ Val64 = pAC->Pnmi.Port[NetIndex].TxNoBufCts;\r
39133+ }\r
39134+ /* SingleNet mode. */\r
39135+ else {\r
39136+ Val64 = pAC->Pnmi.Port[0].TxNoBufCts +\r
39137+ pAC->Pnmi.Port[1].TxNoBufCts;\r
39138+ }\r
39139+ }\r
39140+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39141+ *pLen = sizeof(SK_U64);\r
39142+ break;\r
39143+\r
39144+ case OID_SKGE_TX_USED_DESCR_NO:\r
39145+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39146+ if (MacType == SK_MAC_XMAC) {\r
39147+ /* DualNet mode. */\r
39148+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39149+ Val64 = pAC->Pnmi.BufPort[NetIndex].TxUsedDescrNo;\r
39150+ }\r
39151+ /* SingleNet mode. */\r
39152+ else {\r
39153+ Val64 = pAC->Pnmi.BufPort[0].TxUsedDescrNo +\r
39154+ pAC->Pnmi.BufPort[1].TxUsedDescrNo;\r
39155+ }\r
39156+ }\r
39157+ else {\r
39158+ /* DualNet mode. */\r
39159+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39160+ Val64 = pAC->Pnmi.Port[NetIndex].TxUsedDescrNo;\r
39161+ }\r
39162+ /* SingleNet mode. */\r
39163+ else {\r
39164+ Val64 = pAC->Pnmi.Port[0].TxUsedDescrNo +\r
39165+ pAC->Pnmi.Port[1].TxUsedDescrNo;\r
39166+ }\r
39167+ }\r
39168+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39169+ *pLen = sizeof(SK_U64);\r
39170+ break;\r
39171+\r
39172+ case OID_SKGE_RX_DELIVERED_CTS:\r
39173+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39174+ if (MacType == SK_MAC_XMAC) {\r
39175+ /* DualNet mode. */\r
39176+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39177+ Val64 = pAC->Pnmi.BufPort[NetIndex].RxDeliveredCts;\r
39178+ }\r
39179+ /* SingleNet mode. */\r
39180+ else {\r
39181+ Val64 = pAC->Pnmi.BufPort[0].RxDeliveredCts +\r
39182+ pAC->Pnmi.BufPort[1].RxDeliveredCts;\r
39183+ }\r
39184+ }\r
39185+ else {\r
39186+ /* DualNet mode. */\r
39187+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39188+ Val64 = pAC->Pnmi.Port[NetIndex].RxDeliveredCts;\r
39189+ }\r
39190+ /* SingleNet mode. */\r
39191+ else {\r
39192+ Val64 = pAC->Pnmi.Port[0].RxDeliveredCts +\r
39193+ pAC->Pnmi.Port[1].RxDeliveredCts;\r
39194+ }\r
39195+ }\r
39196+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39197+ *pLen = sizeof(SK_U64);\r
39198+ break;\r
39199+\r
39200+ case OID_SKGE_RX_OCTETS_DELIV_CTS:\r
39201+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39202+ if (MacType == SK_MAC_XMAC) {\r
39203+ /* DualNet mode. */\r
39204+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39205+ Val64 = pAC->Pnmi.BufPort[NetIndex].RxOctetsDeliveredCts;\r
39206+ }\r
39207+ /* SingleNet mode. */\r
39208+ else {\r
39209+ Val64 = pAC->Pnmi.BufPort[0].RxOctetsDeliveredCts +\r
39210+ pAC->Pnmi.BufPort[1].RxOctetsDeliveredCts;\r
39211+ }\r
39212+ }\r
39213+ else {\r
39214+ /* DualNet mode. */\r
39215+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39216+ Val64 = pAC->Pnmi.Port[NetIndex].RxOctetsDeliveredCts;\r
39217+ }\r
39218+ /* SingleNet mode. */\r
39219+ else {\r
39220+ Val64 = pAC->Pnmi.Port[0].RxOctetsDeliveredCts +\r
39221+ pAC->Pnmi.Port[1].RxOctetsDeliveredCts;\r
39222+ }\r
39223+ }\r
39224+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39225+ *pLen = sizeof(SK_U64);\r
39226+ break;\r
39227+\r
39228+ case OID_SKGE_RX_HW_ERROR_CTS:\r
39229+ SK_PNMI_STORE_U64(pBuf, Val64RxHwErrs);\r
39230+ *pLen = sizeof(SK_U64);\r
39231+ break;\r
39232+\r
39233+ case OID_SKGE_TX_HW_ERROR_CTS:\r
39234+ SK_PNMI_STORE_U64(pBuf, Val64TxHwErrs);\r
39235+ *pLen = sizeof(SK_U64);\r
39236+ break;\r
39237+\r
39238+ case OID_SKGE_IN_ERRORS_CTS:\r
39239+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39240+ if (MacType == SK_MAC_XMAC) {\r
39241+ /* DualNet mode. */\r
39242+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39243+ Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[NetIndex].RxNoBufCts;\r
39244+ }\r
39245+ /* SingleNet mode. */\r
39246+ else {\r
39247+ Val64 = Val64RxHwErrs +\r
39248+ pAC->Pnmi.BufPort[0].RxNoBufCts +\r
39249+ pAC->Pnmi.BufPort[1].RxNoBufCts;\r
39250+ }\r
39251+ }\r
39252+ else {\r
39253+ /* DualNet mode. */\r
39254+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39255+ Val64 = Val64RxHwErrs + pAC->Pnmi.Port[NetIndex].RxNoBufCts;\r
39256+ }\r
39257+ /* SingleNet mode. */\r
39258+ else {\r
39259+ Val64 = Val64RxHwErrs +\r
39260+ pAC->Pnmi.Port[0].RxNoBufCts +\r
39261+ pAC->Pnmi.Port[1].RxNoBufCts;\r
39262+ }\r
39263+ }\r
39264+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39265+ *pLen = sizeof(SK_U64);\r
39266+ break;\r
39267+\r
39268+ case OID_SKGE_OUT_ERROR_CTS:\r
39269+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39270+ if (MacType == SK_MAC_XMAC) {\r
39271+ /* DualNet mode. */\r
39272+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39273+ Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[NetIndex].TxNoBufCts;\r
39274+ }\r
39275+ /* SingleNet mode. */\r
39276+ else {\r
39277+ Val64 = Val64TxHwErrs +\r
39278+ pAC->Pnmi.BufPort[0].TxNoBufCts +\r
39279+ pAC->Pnmi.BufPort[1].TxNoBufCts;\r
39280+ }\r
39281+ }\r
39282+ else {\r
39283+ /* DualNet mode. */\r
39284+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39285+ Val64 = Val64TxHwErrs + pAC->Pnmi.Port[NetIndex].TxNoBufCts;\r
39286+ }\r
39287+ /* SingleNet mode. */\r
39288+ else {\r
39289+ Val64 = Val64TxHwErrs +\r
39290+ pAC->Pnmi.Port[0].TxNoBufCts +\r
39291+ pAC->Pnmi.Port[1].TxNoBufCts;\r
39292+ }\r
39293+ }\r
39294+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39295+ *pLen = sizeof(SK_U64);\r
39296+ break;\r
39297+\r
39298+ case OID_SKGE_ERR_RECOVERY_CTS:\r
39299+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39300+ if (MacType == SK_MAC_XMAC) {\r
39301+ /* DualNet mode. */\r
39302+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39303+ Val64 = pAC->Pnmi.BufPort[NetIndex].ErrRecoveryCts;\r
39304+ }\r
39305+ /* SingleNet mode. */\r
39306+ else {\r
39307+ Val64 = pAC->Pnmi.BufPort[0].ErrRecoveryCts +\r
39308+ pAC->Pnmi.BufPort[1].ErrRecoveryCts;\r
39309+ }\r
39310+ }\r
39311+ else {\r
39312+ /* DualNet mode. */\r
39313+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39314+ Val64 = pAC->Pnmi.Port[NetIndex].ErrRecoveryCts;\r
39315+ }\r
39316+ /* SingleNet mode. */\r
39317+ else {\r
39318+ Val64 = pAC->Pnmi.Port[0].ErrRecoveryCts +\r
39319+ pAC->Pnmi.Port[1].ErrRecoveryCts;\r
39320+ }\r
39321+ }\r
39322+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39323+ *pLen = sizeof(SK_U64);\r
39324+ break;\r
39325+\r
39326+ case OID_SKGE_SYSUPTIME:\r
39327+ Val64 = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));\r
39328+ Val64 -= pAC->Pnmi.StartUpTime;\r
39329+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39330+ *pLen = sizeof(SK_U64);\r
39331+ break;\r
39332+\r
39333+ case OID_SKGE_MDB_VERSION:\r
39334+ Val32 = SK_PNMI_MDB_VERSION;\r
39335+ SK_PNMI_STORE_U32(pBuf, Val32);\r
39336+ *pLen = sizeof(SK_U32);\r
39337+ break;\r
39338+\r
39339+ case OID_GEN_RCV_ERROR:\r
39340+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39341+ if (MacType == SK_MAC_XMAC) {\r
39342+ Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[NetIndex].RxNoBufCts;\r
39343+ }\r
39344+ else {\r
39345+ Val64 = Val64RxHwErrs + pAC->Pnmi.Port[NetIndex].RxNoBufCts;\r
39346+ }\r
39347+\r
39348+ /*\r
39349+ * By default 32bit values are evaluated.\r
39350+ */\r
39351+ if (!Is64BitReq) {\r
39352+ Val32 = (SK_U32)Val64;\r
39353+ SK_PNMI_STORE_U32(pBuf, Val32);\r
39354+ *pLen = sizeof(SK_U32);\r
39355+ }\r
39356+ else {\r
39357+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39358+ *pLen = sizeof(SK_U64);\r
39359+ }\r
39360+ break;\r
39361+\r
39362+ case OID_GEN_XMIT_ERROR:\r
39363+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39364+ if (MacType == SK_MAC_XMAC) {\r
39365+ Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[NetIndex].TxNoBufCts;\r
39366+ }\r
39367+ else {\r
39368+ Val64 = Val64TxHwErrs + pAC->Pnmi.Port[NetIndex].TxNoBufCts;\r
39369+ }\r
39370+\r
39371+ /*\r
39372+ * By default 32bit values are evaluated.\r
39373+ */\r
39374+ if (!Is64BitReq) {\r
39375+ Val32 = (SK_U32)Val64;\r
39376+ SK_PNMI_STORE_U32(pBuf, Val32);\r
39377+ *pLen = sizeof(SK_U32);\r
39378+ }\r
39379+ else {\r
39380+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39381+ *pLen = sizeof(SK_U64);\r
39382+ }\r
39383+ break;\r
39384+\r
39385+ case OID_GEN_RCV_NO_BUFFER:\r
39386+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
39387+ if (MacType == SK_MAC_XMAC) {\r
39388+ Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts + \r
39389+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex);\r
39390+\r
39391+ }\r
39392+ else {\r
39393+ Val64 = pAC->Pnmi.Port[NetIndex].RxNoBufCts +\r
39394+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex);\r
39395+ }\r
39396+\r
39397+ /*\r
39398+ * By default 32bit values are evaluated.\r
39399+ */\r
39400+ if (!Is64BitReq) {\r
39401+ Val32 = (SK_U32)Val64;\r
39402+ SK_PNMI_STORE_U32(pBuf, Val32);\r
39403+ *pLen = sizeof(SK_U32);\r
39404+ }\r
39405+ else {\r
39406+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39407+ *pLen = sizeof(SK_U64);\r
39408+ }\r
39409+ break;\r
39410+\r
39411+ case OID_GEN_TRANSMIT_QUEUE_LENGTH:\r
39412+ Val32 = (SK_U32)pAC->Pnmi.Port[NetIndex].TxSwQueueLen;\r
39413+ SK_PNMI_STORE_U32(pBuf, Val32);\r
39414+ *pLen = sizeof(SK_U32);\r
39415+ break;\r
39416+\r
39417+ default:\r
39418+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR034, SK_PNMI_ERR034MSG);\r
39419+\r
39420+ *pLen = 0;\r
39421+ return (SK_PNMI_ERR_GENERAL);\r
39422+ }\r
39423+\r
39424+ if (Id == OID_SKGE_RX_HW_ERROR_CTS ||\r
39425+ Id == OID_SKGE_TX_HW_ERROR_CTS ||\r
39426+ Id == OID_SKGE_IN_ERRORS_CTS ||\r
39427+ Id == OID_SKGE_OUT_ERROR_CTS ||\r
39428+ Id == OID_GEN_XMIT_ERROR ||\r
39429+ Id == OID_GEN_RCV_ERROR) {\r
39430+\r
39431+ pAC->Pnmi.MacUpdatedFlag --;\r
39432+ }\r
39433+\r
39434+ return (SK_PNMI_ERR_OK);\r
39435+}\r
39436+\r
39437+/*****************************************************************************\r
39438+ *\r
39439+ * Rlmt - OID handler function of OID_SKGE_RLMT_XXX single instance.\r
39440+ *\r
39441+ * Description:\r
39442+ * Get/Presets/Sets the RLMT OIDs.\r
39443+ *\r
39444+ * Returns:\r
39445+ * SK_PNMI_ERR_OK The request was successfully performed.\r
39446+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
39447+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
39448+ * the correct data (e.g. a 32bit value is\r
39449+ * needed, but a 16 bit value was passed).\r
39450+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
39451+ * value range.\r
39452+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
39453+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
39454+ * exist (e.g. port instance 3 on a two port\r
39455+ * adapter.\r
39456+ */\r
39457+PNMI_STATIC int Rlmt(\r
39458+SK_AC *pAC, /* Pointer to adapter context */\r
39459+SK_IOC IoC, /* IO context handle */\r
39460+int Action, /* GET/PRESET/SET action */\r
39461+SK_U32 Id, /* Object ID that is to be processed */\r
39462+char *pBuf, /* Buffer used for the management data transfer */\r
39463+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
39464+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
39465+unsigned int TableIndex, /* Index to the Id table */\r
39466+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
39467+{\r
39468+ int Ret;\r
39469+ unsigned int PhysPortIndex;\r
39470+ unsigned int PhysPortMax;\r
39471+ SK_EVPARA EventParam;\r
39472+ SK_U32 Val32;\r
39473+ SK_U64 Val64;\r
39474+\r
39475+ /* Check instance. Only single instance OIDs are allowed here. */\r
39476+ if (Instance != (SK_U32)(-1) && Instance != 1) {\r
39477+\r
39478+ *pLen = 0;\r
39479+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
39480+ }\r
39481+\r
39482+ /* Perform the requested action. */\r
39483+ if (Action == SK_PNMI_GET) {\r
39484+\r
39485+ /* Check if the buffer length is large enough. */\r
39486+ switch (Id) {\r
39487+\r
39488+ case OID_SKGE_RLMT_MODE:\r
39489+ case OID_SKGE_RLMT_PORT_ACTIVE:\r
39490+ case OID_SKGE_RLMT_PORT_PREFERRED:\r
39491+ if (*pLen < sizeof(SK_U8)) {\r
39492+\r
39493+ *pLen = sizeof(SK_U8);\r
39494+ return (SK_PNMI_ERR_TOO_SHORT);\r
39495+ }\r
39496+ break;\r
39497+\r
39498+ case OID_SKGE_RLMT_PORT_NUMBER:\r
39499+ if (*pLen < sizeof(SK_U32)) {\r
39500+\r
39501+ *pLen = sizeof(SK_U32);\r
39502+ return (SK_PNMI_ERR_TOO_SHORT);\r
39503+ }\r
39504+ break;\r
39505+\r
39506+ case OID_SKGE_RLMT_CHANGE_CTS:\r
39507+ case OID_SKGE_RLMT_CHANGE_TIME:\r
39508+ case OID_SKGE_RLMT_CHANGE_ESTIM:\r
39509+ case OID_SKGE_RLMT_CHANGE_THRES:\r
39510+ if (*pLen < sizeof(SK_U64)) {\r
39511+\r
39512+ *pLen = sizeof(SK_U64);\r
39513+ return (SK_PNMI_ERR_TOO_SHORT);\r
39514+ }\r
39515+ break;\r
39516+\r
39517+ default:\r
39518+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR035, SK_PNMI_ERR035MSG);\r
39519+\r
39520+ *pLen = 0;\r
39521+ return (SK_PNMI_ERR_GENERAL);\r
39522+ }\r
39523+\r
39524+ /*\r
39525+ * Update RLMT statistic and increment semaphores to indicate\r
39526+ * that an update was already done. Maybe RLMT will hold its\r
39527+ * statistic always up to date some time. Then we can\r
39528+ * remove this type of call.\r
39529+ */\r
39530+ if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {\r
39531+\r
39532+ *pLen = 0;\r
39533+ return (Ret);\r
39534+ }\r
39535+ pAC->Pnmi.RlmtUpdatedFlag ++;\r
39536+\r
39537+ /* Retrieve value. */\r
39538+ switch (Id) {\r
39539+\r
39540+ case OID_SKGE_RLMT_MODE:\r
39541+ *pBuf = (char)pAC->Rlmt.Net[0].RlmtMode;\r
39542+ *pLen = sizeof(char);\r
39543+ break;\r
39544+\r
39545+ case OID_SKGE_RLMT_PORT_NUMBER:\r
39546+ Val32 = (SK_U32)pAC->GIni.GIMacsFound;\r
39547+ SK_PNMI_STORE_U32(pBuf, Val32);\r
39548+ *pLen = sizeof(SK_U32);\r
39549+ break;\r
39550+\r
39551+ case OID_SKGE_RLMT_PORT_ACTIVE:\r
39552+ *pBuf = 0;\r
39553+ /*\r
39554+ * If multiple ports may become active this OID\r
39555+ * doesn't make sense any more. A new variable in\r
39556+ * the port structure should be created. However,\r
39557+ * for this variable the first active port is\r
39558+ * returned.\r
39559+ */\r
39560+ PhysPortMax = pAC->GIni.GIMacsFound;\r
39561+\r
39562+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;\r
39563+ PhysPortIndex ++) {\r
39564+\r
39565+ if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
39566+\r
39567+ *pBuf = (char)SK_PNMI_PORT_PHYS2LOG(PhysPortIndex);\r
39568+ break;\r
39569+ }\r
39570+ }\r
39571+ *pLen = sizeof(char);\r
39572+ break;\r
39573+\r
39574+ case OID_SKGE_RLMT_PORT_PREFERRED:\r
39575+ *pBuf = (char)SK_PNMI_PORT_PHYS2LOG(pAC->Rlmt.Net[NetIndex].Preference);\r
39576+ *pLen = sizeof(char);\r
39577+ break;\r
39578+\r
39579+ case OID_SKGE_RLMT_CHANGE_CTS:\r
39580+ Val64 = pAC->Pnmi.RlmtChangeCts;\r
39581+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39582+ *pLen = sizeof(SK_U64);\r
39583+ break;\r
39584+\r
39585+ case OID_SKGE_RLMT_CHANGE_TIME:\r
39586+ Val64 = pAC->Pnmi.RlmtChangeTime;\r
39587+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39588+ *pLen = sizeof(SK_U64);\r
39589+ break;\r
39590+\r
39591+ case OID_SKGE_RLMT_CHANGE_ESTIM:\r
39592+ Val64 = pAC->Pnmi.RlmtChangeEstimate.Estimate;\r
39593+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39594+ *pLen = sizeof(SK_U64);\r
39595+ break;\r
39596+\r
39597+ case OID_SKGE_RLMT_CHANGE_THRES:\r
39598+ Val64 = pAC->Pnmi.RlmtChangeThreshold;\r
39599+ SK_PNMI_STORE_U64(pBuf, Val64);\r
39600+ *pLen = sizeof(SK_U64);\r
39601+ break;\r
39602+\r
39603+ default:\r
39604+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,\r
39605+ ("Rlmt: Unknown OID should be handled before"));\r
39606+\r
39607+ pAC->Pnmi.RlmtUpdatedFlag --;\r
39608+ *pLen = 0;\r
39609+ return (SK_PNMI_ERR_GENERAL);\r
39610+ }\r
39611+\r
39612+ pAC->Pnmi.RlmtUpdatedFlag --;\r
39613+ }\r
39614+ else {\r
39615+ /* Perform a PRESET or SET. */\r
39616+ switch (Id) {\r
39617+\r
39618+ case OID_SKGE_RLMT_MODE:\r
39619+ /* Check if the buffer length is plausible. */\r
39620+ if (*pLen < sizeof(char)) {\r
39621+\r
39622+ *pLen = sizeof(char);\r
39623+ return (SK_PNMI_ERR_TOO_SHORT);\r
39624+ }\r
39625+ /* Check if the value range is correct. */\r
39626+ if (*pLen != sizeof(char) ||\r
39627+ (*pBuf & SK_PNMI_RLMT_MODE_CHK_LINK) == 0 ||\r
39628+ *(SK_U8 *)pBuf > 15) {\r
39629+\r
39630+ *pLen = 0;\r
39631+ return (SK_PNMI_ERR_BAD_VALUE);\r
39632+ }\r
39633+ /* The PRESET ends here. */\r
39634+ if (Action == SK_PNMI_PRESET) {\r
39635+\r
39636+ *pLen = 0;\r
39637+ return (SK_PNMI_ERR_OK);\r
39638+ }\r
39639+ /* Send an event to RLMT to change the mode. */\r
39640+ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));\r
39641+ \r
39642+ EventParam.Para32[0] |= (SK_U32)(*pBuf);\r
39643+ EventParam.Para32[1] = 0;\r
39644+ if (SkRlmtEvent(pAC, IoC, SK_RLMT_MODE_CHANGE,\r
39645+ EventParam) > 0) {\r
39646+\r
39647+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR037, SK_PNMI_ERR037MSG);\r
39648+\r
39649+ *pLen = 0;\r
39650+ return (SK_PNMI_ERR_GENERAL);\r
39651+ }\r
39652+ break;\r
39653+\r
39654+ case OID_SKGE_RLMT_PORT_PREFERRED:\r
39655+ /* PRESET/SET action makes no sense in Dual Net mode. */\r
39656+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39657+ break;\r
39658+ }\r
39659+ \r
39660+ /* Check if the buffer length is plausible. */\r
39661+ if (*pLen < sizeof(char)) {\r
39662+\r
39663+ *pLen = sizeof(char);\r
39664+ return (SK_PNMI_ERR_TOO_SHORT);\r
39665+ }\r
39666+ /* Check if the value range is correct. */\r
39667+ if (*pLen != sizeof(char) || *(SK_U8 *)pBuf >\r
39668+ (SK_U8)pAC->GIni.GIMacsFound) {\r
39669+\r
39670+ *pLen = 0;\r
39671+ return (SK_PNMI_ERR_BAD_VALUE);\r
39672+ }\r
39673+ /* The PRESET ends here. */\r
39674+ if (Action == SK_PNMI_PRESET) {\r
39675+\r
39676+ *pLen = 0;\r
39677+ return (SK_PNMI_ERR_OK);\r
39678+ }\r
39679+\r
39680+ /*\r
39681+ * Send an event to RLMT change the preferred port.\r
39682+ * A param of -1 means automatic mode. RLMT will\r
39683+ * make the decision which is the preferred port.\r
39684+ */\r
39685+ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));\r
39686+ \r
39687+ EventParam.Para32[0] = (SK_U32)(*pBuf) - 1;\r
39688+ EventParam.Para32[1] = NetIndex;\r
39689+ if (SkRlmtEvent(pAC, IoC, SK_RLMT_PREFPORT_CHANGE,\r
39690+ EventParam) > 0) {\r
39691+\r
39692+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR038, SK_PNMI_ERR038MSG);\r
39693+\r
39694+ *pLen = 0;\r
39695+ return (SK_PNMI_ERR_GENERAL);\r
39696+ }\r
39697+ break;\r
39698+\r
39699+ case OID_SKGE_RLMT_CHANGE_THRES:\r
39700+ /* Check if the buffer length is plausible. */\r
39701+ if (*pLen < sizeof(SK_U64)) {\r
39702+\r
39703+ *pLen = sizeof(SK_U64);\r
39704+ return (SK_PNMI_ERR_TOO_SHORT);\r
39705+ }\r
39706+ \r
39707+ /* There are not many restrictions to the value range. */\r
39708+ if (*pLen != sizeof(SK_U64)) {\r
39709+\r
39710+ *pLen = 0;\r
39711+ return (SK_PNMI_ERR_BAD_VALUE);\r
39712+ }\r
39713+ /* The PRESET ends here. */\r
39714+ if (Action == SK_PNMI_PRESET) {\r
39715+\r
39716+ *pLen = 0;\r
39717+ return (SK_PNMI_ERR_OK);\r
39718+ }\r
39719+ /*\r
39720+ * Store the new threshold, which will be taken\r
39721+ * on the next timer event.\r
39722+ */\r
39723+ SK_PNMI_READ_U64(pBuf, Val64);\r
39724+ pAC->Pnmi.RlmtChangeThreshold = Val64;\r
39725+ break;\r
39726+\r
39727+ default:\r
39728+ /* The other OIDs are not be able for set. */\r
39729+ *pLen = 0;\r
39730+ return (SK_PNMI_ERR_READ_ONLY);\r
39731+ }\r
39732+ }\r
39733+\r
39734+ return (SK_PNMI_ERR_OK);\r
39735+}\r
39736+\r
39737+/*****************************************************************************\r
39738+ *\r
39739+ * RlmtStat - OID handler function of OID_SKGE_RLMT_XXX multiple instance.\r
39740+ *\r
39741+ * Description:\r
39742+ * Performs get requests on multiple instance variables.\r
39743+ *\r
39744+ * Returns:\r
39745+ * SK_PNMI_ERR_OK The request was successfully performed.\r
39746+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
39747+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
39748+ * the correct data (e.g. a 32bit value is\r
39749+ * needed, but a 16 bit value was passed).\r
39750+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
39751+ * exist (e.g. port instance 3 on a two port\r
39752+ * adapter.\r
39753+ */\r
39754+PNMI_STATIC int RlmtStat(\r
39755+SK_AC *pAC, /* Pointer to adapter context */\r
39756+SK_IOC IoC, /* IO context handle */\r
39757+int Action, /* GET/PRESET/SET action */\r
39758+SK_U32 Id, /* Object ID that is to be processed */\r
39759+char *pBuf, /* Buffer used for the management data transfer */\r
39760+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
39761+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
39762+unsigned int TableIndex, /* Index to the Id table */\r
39763+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
39764+{\r
39765+ unsigned int PhysPortMax;\r
39766+ unsigned int PhysPortIndex;\r
39767+ unsigned int Limit;\r
39768+ unsigned int Offset;\r
39769+ int Ret;\r
39770+ SK_U32 Val32;\r
39771+ SK_U64 Val64;\r
39772+\r
39773+\r
39774+ /* Calculate the port indexes from the instance. */\r
39775+ PhysPortMax = pAC->GIni.GIMacsFound;\r
39776+\r
39777+ if ((Instance != (SK_U32)(-1))) {\r
39778+ /* Check instance range. */\r
39779+ if ((Instance < 1) || (Instance > PhysPortMax)) {\r
39780+\r
39781+ *pLen = 0;\r
39782+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
39783+ }\r
39784+\r
39785+ /* SingleNet mode. */\r
39786+ PhysPortIndex = Instance - 1;\r
39787+\r
39788+ /* DualNet mode. */\r
39789+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39790+ PhysPortIndex = NetIndex;\r
39791+ }\r
39792+\r
39793+ /* Both net modes. */\r
39794+ Limit = PhysPortIndex + 1;\r
39795+ }\r
39796+ else {\r
39797+ /* SingleNet mode. */\r
39798+ PhysPortIndex = 0;\r
39799+ Limit = PhysPortMax;\r
39800+\r
39801+ /* DualNet mode. */\r
39802+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
39803+ PhysPortIndex = NetIndex;\r
39804+ Limit = PhysPortIndex + 1;\r
39805+ }\r
39806+ }\r
39807+\r
39808+ /* Currently only GET requests are allowed. */\r
39809+ if (Action != SK_PNMI_GET) {\r
39810+\r
39811+ *pLen = 0;\r
39812+ return (SK_PNMI_ERR_READ_ONLY);\r
39813+ }\r
39814+\r
39815+ /* Check if the buffer length is large enough. */\r
39816+ switch (Id) {\r
39817+\r
39818+ case OID_SKGE_RLMT_PORT_INDEX:\r
39819+ case OID_SKGE_RLMT_STATUS:\r
39820+ if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U32)) {\r
39821+\r
39822+ *pLen = (Limit - PhysPortIndex) * sizeof(SK_U32);\r
39823+ return (SK_PNMI_ERR_TOO_SHORT);\r
39824+ }\r
39825+ break;\r
39826+\r
39827+ case OID_SKGE_RLMT_TX_HELLO_CTS:\r
39828+ case OID_SKGE_RLMT_RX_HELLO_CTS:\r
39829+ case OID_SKGE_RLMT_TX_SP_REQ_CTS:\r
39830+ case OID_SKGE_RLMT_RX_SP_CTS:\r
39831+ if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U64)) {\r
39832+\r
39833+ *pLen = (Limit - PhysPortIndex) * sizeof(SK_U64);\r
39834+ return (SK_PNMI_ERR_TOO_SHORT);\r
39835+ }\r
39836+ break;\r
39837+\r
39838+ default:\r
39839+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR039, SK_PNMI_ERR039MSG);\r
39840+\r
39841+ *pLen = 0;\r
39842+ return (SK_PNMI_ERR_GENERAL);\r
39843+\r
39844+ }\r
39845+\r
39846+ /*\r
39847+ * Update statistic and increment semaphores to indicate that\r
39848+ * an update was already done.\r
39849+ */\r
39850+ if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {\r
39851+\r
39852+ *pLen = 0;\r
39853+ return (Ret);\r
39854+ }\r
39855+ pAC->Pnmi.RlmtUpdatedFlag ++;\r
39856+\r
39857+ /* Get value. */\r
39858+ Offset = 0;\r
39859+ for (; PhysPortIndex < Limit; PhysPortIndex ++) {\r
39860+\r
39861+ switch (Id) {\r
39862+\r
39863+ case OID_SKGE_RLMT_PORT_INDEX:\r
39864+ Val32 = PhysPortIndex;\r
39865+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
39866+ Offset += sizeof(SK_U32);\r
39867+ break;\r
39868+\r
39869+ case OID_SKGE_RLMT_STATUS:\r
39870+ if (pAC->Rlmt.Port[PhysPortIndex].PortState ==\r
39871+ SK_RLMT_PS_INIT ||\r
39872+ pAC->Rlmt.Port[PhysPortIndex].PortState ==\r
39873+ SK_RLMT_PS_DOWN) {\r
39874+\r
39875+ Val32 = SK_PNMI_RLMT_STATUS_ERROR;\r
39876+ }\r
39877+ else if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
39878+\r
39879+ Val32 = SK_PNMI_RLMT_STATUS_ACTIVE;\r
39880+ }\r
39881+ else {\r
39882+ Val32 = SK_PNMI_RLMT_STATUS_STANDBY;\r
39883+ }\r
39884+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
39885+ Offset += sizeof(SK_U32);\r
39886+ break;\r
39887+\r
39888+ case OID_SKGE_RLMT_TX_HELLO_CTS:\r
39889+ Val64 = pAC->Rlmt.Port[PhysPortIndex].TxHelloCts;\r
39890+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
39891+ Offset += sizeof(SK_U64);\r
39892+ break;\r
39893+\r
39894+ case OID_SKGE_RLMT_RX_HELLO_CTS:\r
39895+ Val64 = pAC->Rlmt.Port[PhysPortIndex].RxHelloCts;\r
39896+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
39897+ Offset += sizeof(SK_U64);\r
39898+ break;\r
39899+\r
39900+ case OID_SKGE_RLMT_TX_SP_REQ_CTS:\r
39901+ Val64 = pAC->Rlmt.Port[PhysPortIndex].TxSpHelloReqCts;\r
39902+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
39903+ Offset += sizeof(SK_U64);\r
39904+ break;\r
39905+\r
39906+ case OID_SKGE_RLMT_RX_SP_CTS:\r
39907+ Val64 = pAC->Rlmt.Port[PhysPortIndex].RxSpHelloCts;\r
39908+ SK_PNMI_STORE_U64(pBuf + Offset, Val64);\r
39909+ Offset += sizeof(SK_U64);\r
39910+ break;\r
39911+\r
39912+ default:\r
39913+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,\r
39914+ ("RlmtStat: Unknown OID should be errored before"));\r
39915+\r
39916+ pAC->Pnmi.RlmtUpdatedFlag --;\r
39917+ *pLen = 0;\r
39918+ return (SK_PNMI_ERR_GENERAL);\r
39919+ }\r
39920+ }\r
39921+ *pLen = Offset;\r
39922+\r
39923+ pAC->Pnmi.RlmtUpdatedFlag --;\r
39924+\r
39925+ return (SK_PNMI_ERR_OK);\r
39926+}\r
39927+\r
39928+/*****************************************************************************\r
39929+ *\r
39930+ * MacPrivateConf - OID handler function of OIDs concerning the configuration\r
39931+ *\r
39932+ * Description:\r
39933+ * Get/Presets/Sets the OIDs concerning the configuration.\r
39934+ *\r
39935+ * Returns:\r
39936+ * SK_PNMI_ERR_OK The request was successfully performed.\r
39937+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
39938+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
39939+ * the correct data (e.g. a 32bit value is\r
39940+ * needed, but a 16 bit value was passed).\r
39941+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
39942+ * value range.\r
39943+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
39944+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
39945+ * exist (e.g. port instance 3 on a two port\r
39946+ * adapter.\r
39947+ */\r
39948+PNMI_STATIC int MacPrivateConf(\r
39949+SK_AC *pAC, /* Pointer to adapter context */\r
39950+SK_IOC IoC, /* IO context handle */\r
39951+int Action, /* GET/PRESET/SET action */\r
39952+SK_U32 Id, /* Object ID that is to be processed */\r
39953+char *pBuf, /* Buffer used for the management data transfer */\r
39954+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
39955+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
39956+unsigned int TableIndex, /* Index to the Id table */\r
39957+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
39958+{\r
39959+ unsigned int PhysPortMax;\r
39960+ unsigned int PhysPortIndex;\r
39961+ unsigned int LogPortMax;\r
39962+ unsigned int LogPortIndex;\r
39963+ unsigned int Limit;\r
39964+ unsigned int Offset;\r
39965+ char Val8;\r
39966+ char *pBufPtr;\r
39967+ int Ret;\r
39968+ SK_EVPARA EventParam;\r
39969+ SK_U32 Val32;\r
39970+#ifdef SK_PHY_LP_MODE\r
39971+ SK_U8 CurrentPhyPowerState;\r
39972+#endif /* SK_PHY_LP_MODE */\r
39973+\r
39974+\r
39975+ /* Calculate instance if wished. MAC index 0 is the virtual MAC. */\r
39976+ PhysPortMax = pAC->GIni.GIMacsFound;\r
39977+ LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);\r
39978+\r
39979+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */\r
39980+ LogPortMax--;\r
39981+ }\r
39982+\r
39983+ if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried. */\r
39984+ /* Check instance range. */\r
39985+ if ((Instance < 1) || (Instance > LogPortMax)) {\r
39986+\r
39987+ *pLen = 0;\r
39988+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
39989+ }\r
39990+ LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);\r
39991+ Limit = LogPortIndex + 1;\r
39992+ }\r
39993+\r
39994+ else { /* Instance == (SK_U32)(-1), get all Instances of that OID. */\r
39995+\r
39996+ LogPortIndex = 0;\r
39997+ Limit = LogPortMax;\r
39998+ }\r
39999+\r
40000+ /* Perform action. */\r
40001+ if (Action == SK_PNMI_GET) {\r
40002+\r
40003+ /* Check length. */\r
40004+ switch (Id) {\r
40005+\r
40006+ case OID_SKGE_PMD:\r
40007+ case OID_SKGE_CONNECTOR:\r
40008+ case OID_SKGE_LINK_CAP:\r
40009+ case OID_SKGE_LINK_MODE:\r
40010+ case OID_SKGE_LINK_MODE_STATUS:\r
40011+ case OID_SKGE_LINK_STATUS:\r
40012+ case OID_SKGE_FLOWCTRL_CAP:\r
40013+ case OID_SKGE_FLOWCTRL_MODE:\r
40014+ case OID_SKGE_FLOWCTRL_STATUS:\r
40015+ case OID_SKGE_PHY_OPERATION_CAP:\r
40016+ case OID_SKGE_PHY_OPERATION_MODE:\r
40017+ case OID_SKGE_PHY_OPERATION_STATUS:\r
40018+ case OID_SKGE_SPEED_CAP:\r
40019+ case OID_SKGE_SPEED_MODE:\r
40020+ case OID_SKGE_SPEED_STATUS:\r
40021+#ifdef SK_PHY_LP_MODE\r
40022+ case OID_SKGE_PHY_LP_MODE:\r
40023+#endif\r
40024+ if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U8)) {\r
40025+\r
40026+ *pLen = (Limit - LogPortIndex) * sizeof(SK_U8);\r
40027+ return (SK_PNMI_ERR_TOO_SHORT);\r
40028+ }\r
40029+ break;\r
40030+\r
40031+ case OID_SKGE_MTU:\r
40032+ case OID_SKGE_PHY_TYPE:\r
40033+ if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U32)) {\r
40034+\r
40035+ *pLen = (Limit - LogPortIndex) * sizeof(SK_U32);\r
40036+ return (SK_PNMI_ERR_TOO_SHORT);\r
40037+ }\r
40038+ break;\r
40039+\r
40040+ default:\r
40041+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR041, SK_PNMI_ERR041MSG);\r
40042+ *pLen = 0;\r
40043+ return (SK_PNMI_ERR_GENERAL);\r
40044+ }\r
40045+\r
40046+ /*\r
40047+ * Update statistic and increment semaphore to indicate\r
40048+ * that an update was already done.\r
40049+ */\r
40050+ if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {\r
40051+\r
40052+ *pLen = 0;\r
40053+ return (Ret);\r
40054+ }\r
40055+ pAC->Pnmi.SirqUpdatedFlag ++;\r
40056+\r
40057+ /* Get value. */\r
40058+ Offset = 0;\r
40059+ for (; LogPortIndex < Limit; LogPortIndex ++) {\r
40060+\r
40061+ pBufPtr = pBuf + Offset;\r
40062+ \r
40063+ switch (Id) {\r
40064+\r
40065+ case OID_SKGE_PMD:\r
40066+ *pBufPtr = pAC->Pnmi.PMD;\r
40067+ Offset ++;\r
40068+ break;\r
40069+\r
40070+ case OID_SKGE_CONNECTOR:\r
40071+ *pBufPtr = pAC->Pnmi.Connector;\r
40072+ Offset ++;\r
40073+ break;\r
40074+\r
40075+ case OID_SKGE_PHY_TYPE:\r
40076+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40077+ if (LogPortIndex == 0) {\r
40078+ continue;\r
40079+ }\r
40080+ /* Get value for physical port. */\r
40081+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);\r
40082+ Val32 = pAC->GIni.GP[PhysPortIndex].PhyType;\r
40083+ }\r
40084+ else { /* DualNet mode. */\r
40085+ \r
40086+ Val32 = pAC->GIni.GP[NetIndex].PhyType;\r
40087+ }\r
40088+ SK_PNMI_STORE_U32(pBufPtr, Val32);\r
40089+ Offset += sizeof(SK_U32);\r
40090+ break;\r
40091+\r
40092+#ifdef SK_PHY_LP_MODE\r
40093+ case OID_SKGE_PHY_LP_MODE:\r
40094+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40095+ if (LogPortIndex == 0) {\r
40096+ continue;\r
40097+ }\r
40098+ /* Get value for physical port. */\r
40099+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);\r
40100+ *pBufPtr = (SK_U8)pAC->GIni.GP[PhysPortIndex].PPhyPowerState;\r
40101+ }\r
40102+ else { /* DualNet mode. */\r
40103+ \r
40104+ *pBufPtr = (SK_U8)pAC->GIni.GP[NetIndex].PPhyPowerState;\r
40105+ }\r
40106+ Offset += sizeof(SK_U8);\r
40107+ break;\r
40108+#endif\r
40109+\r
40110+ case OID_SKGE_LINK_CAP:\r
40111+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40112+ if (LogPortIndex == 0) {\r
40113+ /* Get value for virtual port. */\r
40114+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40115+ }\r
40116+ else {\r
40117+ /* Get value for physical port. */\r
40118+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40119+ pAC, LogPortIndex);\r
40120+\r
40121+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkCap;\r
40122+ }\r
40123+ }\r
40124+ else { /* DualNet mode. */\r
40125+ \r
40126+ *pBufPtr = pAC->GIni.GP[NetIndex].PLinkCap;\r
40127+ }\r
40128+ Offset ++;\r
40129+ break;\r
40130+\r
40131+ case OID_SKGE_LINK_MODE:\r
40132+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40133+ if (LogPortIndex == 0) {\r
40134+ /* Get value for virtual port. */\r
40135+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40136+ }\r
40137+ else {\r
40138+ /* Get value for physical port. */\r
40139+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40140+ pAC, LogPortIndex);\r
40141+\r
40142+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkModeConf;\r
40143+ }\r
40144+ }\r
40145+ else { /* DualNet mode. */\r
40146+ \r
40147+ *pBufPtr = pAC->GIni.GP[NetIndex].PLinkModeConf;\r
40148+ }\r
40149+ Offset ++;\r
40150+ break;\r
40151+\r
40152+ case OID_SKGE_LINK_MODE_STATUS:\r
40153+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40154+ if (LogPortIndex == 0) {\r
40155+ /* Get value for virtual port. */\r
40156+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40157+ }\r
40158+ else {\r
40159+ /* Get value for physical port. */\r
40160+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40161+ pAC, LogPortIndex);\r
40162+\r
40163+ *pBufPtr =\r
40164+ CalculateLinkModeStatus(pAC, IoC, PhysPortIndex);\r
40165+ }\r
40166+ }\r
40167+ else { /* DualNet mode. */\r
40168+ \r
40169+ *pBufPtr = CalculateLinkModeStatus(pAC, IoC, NetIndex);\r
40170+ }\r
40171+ Offset ++;\r
40172+ break;\r
40173+\r
40174+ case OID_SKGE_LINK_STATUS:\r
40175+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40176+ if (LogPortIndex == 0) {\r
40177+ /* Get value for virtual port. */\r
40178+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40179+ }\r
40180+ else {\r
40181+ /* Get value for physical port. */\r
40182+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40183+ pAC, LogPortIndex);\r
40184+ \r
40185+ *pBufPtr = CalculateLinkStatus(pAC, IoC, PhysPortIndex);\r
40186+ }\r
40187+ }\r
40188+ else { /* DualNet mode. */\r
40189+\r
40190+ *pBufPtr = CalculateLinkStatus(pAC, IoC, NetIndex);\r
40191+ }\r
40192+ Offset ++;\r
40193+ break;\r
40194+\r
40195+ case OID_SKGE_FLOWCTRL_CAP:\r
40196+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40197+ if (LogPortIndex == 0) {\r
40198+ /* Get value for virtual port. */\r
40199+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40200+ }\r
40201+ else {\r
40202+ /* Get value for physical port. */\r
40203+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40204+ pAC, LogPortIndex);\r
40205+ \r
40206+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlCap;\r
40207+ }\r
40208+ }\r
40209+ else { /* DualNet mode. */\r
40210+ \r
40211+ *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlCap;\r
40212+ }\r
40213+ Offset ++;\r
40214+ break;\r
40215+\r
40216+ case OID_SKGE_FLOWCTRL_MODE:\r
40217+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40218+ if (LogPortIndex == 0) {\r
40219+ /* Get value for virtual port. */\r
40220+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40221+ }\r
40222+ else {\r
40223+ /* Get value for physical port. */\r
40224+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40225+ pAC, LogPortIndex);\r
40226+ \r
40227+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlMode;\r
40228+ }\r
40229+ }\r
40230+ else { /* DualNet mode. */\r
40231+\r
40232+ *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlMode;\r
40233+ }\r
40234+ Offset ++;\r
40235+ break;\r
40236+\r
40237+ case OID_SKGE_FLOWCTRL_STATUS:\r
40238+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40239+ if (LogPortIndex == 0) {\r
40240+ /* Get value for virtual port. */\r
40241+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40242+ }\r
40243+ else {\r
40244+ /* Get value for physical port. */\r
40245+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40246+ pAC, LogPortIndex);\r
40247+ \r
40248+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlStatus;\r
40249+ }\r
40250+ }\r
40251+ else { /* DualNet mode. */\r
40252+\r
40253+ *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlStatus;\r
40254+ }\r
40255+ Offset ++;\r
40256+ break;\r
40257+\r
40258+ case OID_SKGE_PHY_OPERATION_CAP:\r
40259+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet Mode. */\r
40260+ if (LogPortIndex == 0) {\r
40261+ /* Get value for virtual port. */\r
40262+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40263+ }\r
40264+ else {\r
40265+ /* Get value for physical port. */\r
40266+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40267+ pAC, LogPortIndex);\r
40268+ \r
40269+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSCap;\r
40270+ }\r
40271+ }\r
40272+ else { /* DualNet mode. */\r
40273+ \r
40274+ *pBufPtr = pAC->GIni.GP[NetIndex].PMSCap;\r
40275+ }\r
40276+ Offset ++;\r
40277+ break;\r
40278+\r
40279+ case OID_SKGE_PHY_OPERATION_MODE:\r
40280+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40281+ if (LogPortIndex == 0) {\r
40282+ /* Get value for virtual port. */\r
40283+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40284+ }\r
40285+ else {\r
40286+ /* Get value for physical port. */\r
40287+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40288+ pAC, LogPortIndex);\r
40289+\r
40290+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSMode;\r
40291+ }\r
40292+ }\r
40293+ else { /* DualNet mode. */\r
40294+ \r
40295+ *pBufPtr = pAC->GIni.GP[NetIndex].PMSMode;\r
40296+ }\r
40297+ Offset ++;\r
40298+ break;\r
40299+\r
40300+ case OID_SKGE_PHY_OPERATION_STATUS:\r
40301+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40302+ if (LogPortIndex == 0) {\r
40303+ /* Get value for virtual port. */\r
40304+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40305+ }\r
40306+ else {\r
40307+ /* Get value for physical port. */\r
40308+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40309+ pAC, LogPortIndex);\r
40310+ \r
40311+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSStatus;\r
40312+ }\r
40313+ }\r
40314+ else {\r
40315+ \r
40316+ *pBufPtr = pAC->GIni.GP[NetIndex].PMSStatus;\r
40317+ }\r
40318+ Offset ++;\r
40319+ break;\r
40320+\r
40321+ case OID_SKGE_SPEED_CAP:\r
40322+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40323+ if (LogPortIndex == 0) {\r
40324+ /* Get value for virtual port. */\r
40325+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40326+ }\r
40327+ else {\r
40328+ /* Get value for physical port. */\r
40329+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40330+ pAC, LogPortIndex);\r
40331+ \r
40332+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedCap;\r
40333+ }\r
40334+ }\r
40335+ else { /* DualNet mode. */\r
40336+ \r
40337+ *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedCap;\r
40338+ }\r
40339+ Offset ++;\r
40340+ break;\r
40341+\r
40342+ case OID_SKGE_SPEED_MODE:\r
40343+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40344+ if (LogPortIndex == 0) {\r
40345+ /* Get value for virtual port. */\r
40346+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40347+ }\r
40348+ else {\r
40349+ /* Get value for physical port. */\r
40350+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40351+ pAC, LogPortIndex);\r
40352+ \r
40353+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeed;\r
40354+ }\r
40355+ }\r
40356+ else { /* DualNet mode. */\r
40357+\r
40358+ *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeed;\r
40359+ }\r
40360+ Offset ++;\r
40361+ break;\r
40362+\r
40363+ case OID_SKGE_SPEED_STATUS:\r
40364+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40365+ if (LogPortIndex == 0) {\r
40366+ /* Get value for virtual port. */\r
40367+ VirtualConf(pAC, IoC, Id, pBufPtr);\r
40368+ }\r
40369+ else {\r
40370+ /* Get value for physical port. */\r
40371+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(\r
40372+ pAC, LogPortIndex);\r
40373+ \r
40374+ *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed;\r
40375+ }\r
40376+ }\r
40377+ else { /* DualNet mode. */\r
40378+\r
40379+ *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedUsed;\r
40380+ }\r
40381+ Offset ++;\r
40382+ break;\r
40383+ \r
40384+ case OID_SKGE_MTU:\r
40385+ Val32 = SK_DRIVER_GET_MTU(pAC, IoC, NetIndex);\r
40386+ SK_PNMI_STORE_U32(pBufPtr, Val32);\r
40387+ Offset += sizeof(SK_U32);\r
40388+ break;\r
40389+\r
40390+ default:\r
40391+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,\r
40392+ ("MacPrivateConf: Unknown OID should be handled before"));\r
40393+\r
40394+ pAC->Pnmi.SirqUpdatedFlag --;\r
40395+ return (SK_PNMI_ERR_GENERAL);\r
40396+ }\r
40397+ }\r
40398+ *pLen = Offset;\r
40399+ pAC->Pnmi.SirqUpdatedFlag --;\r
40400+\r
40401+ return (SK_PNMI_ERR_OK);\r
40402+ }\r
40403+\r
40404+ /*\r
40405+ * From here SET or PRESET action. Check if the passed\r
40406+ * buffer length is plausible.\r
40407+ */\r
40408+ switch (Id) {\r
40409+\r
40410+ case OID_SKGE_LINK_MODE:\r
40411+ case OID_SKGE_FLOWCTRL_MODE:\r
40412+ case OID_SKGE_PHY_OPERATION_MODE:\r
40413+ case OID_SKGE_SPEED_MODE:\r
40414+ if (*pLen < Limit - LogPortIndex) {\r
40415+\r
40416+ *pLen = Limit - LogPortIndex;\r
40417+ return (SK_PNMI_ERR_TOO_SHORT);\r
40418+ }\r
40419+ if (*pLen != Limit - LogPortIndex) {\r
40420+\r
40421+ *pLen = 0;\r
40422+ return (SK_PNMI_ERR_BAD_VALUE);\r
40423+ }\r
40424+ break;\r
40425+\r
40426+#ifdef SK_PHY_LP_MODE\r
40427+ case OID_SKGE_PHY_LP_MODE:\r
40428+ if (*pLen < Limit - LogPortIndex) {\r
40429+\r
40430+ *pLen = Limit - LogPortIndex;\r
40431+ return (SK_PNMI_ERR_TOO_SHORT);\r
40432+ }\r
40433+ break;\r
40434+#endif /* SK_PHY_LP_MODE */\r
40435+\r
40436+ case OID_SKGE_MTU:\r
40437+ if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U32)) {\r
40438+\r
40439+ *pLen = (Limit - LogPortIndex) * sizeof(SK_U32);\r
40440+ return (SK_PNMI_ERR_TOO_SHORT);\r
40441+ }\r
40442+ break;\r
40443+ \r
40444+ default:\r
40445+ *pLen = 0;\r
40446+ return (SK_PNMI_ERR_READ_ONLY);\r
40447+ }\r
40448+\r
40449+ /* Perform PRESET or SET. */\r
40450+ Offset = 0;\r
40451+ for (; LogPortIndex < Limit; LogPortIndex ++) {\r
40452+\r
40453+ Val8 = *(pBuf + Offset);\r
40454+\r
40455+ switch (Id) {\r
40456+\r
40457+ case OID_SKGE_LINK_MODE:\r
40458+ /* Check the value range. */\r
40459+ if (Val8 == 0) {\r
40460+ Offset++;\r
40461+ break;\r
40462+ }\r
40463+ if (Val8 < SK_LMODE_HALF ||\r
40464+ (LogPortIndex != 0 && Val8 > SK_LMODE_AUTOSENSE) ||\r
40465+ (LogPortIndex == 0 && Val8 > SK_LMODE_INDETERMINATED)) {\r
40466+\r
40467+ *pLen = 0;\r
40468+ return (SK_PNMI_ERR_BAD_VALUE);\r
40469+ }\r
40470+\r
40471+ /* The PRESET ends here. */\r
40472+ if (Action == SK_PNMI_PRESET) {\r
40473+\r
40474+ return (SK_PNMI_ERR_OK);\r
40475+ }\r
40476+\r
40477+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40478+ if (LogPortIndex == 0) {\r
40479+ /*\r
40480+ * The virtual port consists of all currently\r
40481+ * active ports. Find them and send an event\r
40482+ * with the new link mode to SIRQ.\r
40483+ */\r
40484+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;\r
40485+ PhysPortIndex ++) {\r
40486+\r
40487+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
40488+ continue;\r
40489+ }\r
40490+ \r
40491+ EventParam.Para32[0] = PhysPortIndex;\r
40492+ EventParam.Para32[1] = (SK_U32)Val8;\r
40493+ if (SkGeSirqEvent(pAC, IoC,\r
40494+ SK_HWEV_SET_LMODE,\r
40495+ EventParam) > 0) {\r
40496+ \r
40497+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40498+ SK_PNMI_ERR043,\r
40499+ SK_PNMI_ERR043MSG);\r
40500+ \r
40501+ *pLen = 0;\r
40502+ return (SK_PNMI_ERR_GENERAL);\r
40503+ }\r
40504+ } /* for */\r
40505+ }\r
40506+ else {\r
40507+ /*\r
40508+ * Send an event with the new link mode to\r
40509+ * the SIRQ module.\r
40510+ */\r
40511+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(\r
40512+ pAC, LogPortIndex);\r
40513+ EventParam.Para32[1] = (SK_U32)Val8;\r
40514+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_LMODE,\r
40515+ EventParam) > 0) {\r
40516+ \r
40517+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40518+ SK_PNMI_ERR043,\r
40519+ SK_PNMI_ERR043MSG);\r
40520+ \r
40521+ *pLen = 0;\r
40522+ return (SK_PNMI_ERR_GENERAL);\r
40523+ }\r
40524+ }\r
40525+ }\r
40526+ else { /* DualNet mode. */\r
40527+\r
40528+ /*\r
40529+ * Send an event with the new link mode to\r
40530+ * the SIRQ module.\r
40531+ */\r
40532+ EventParam.Para32[0] = NetIndex;\r
40533+ EventParam.Para32[1] = (SK_U32)Val8;\r
40534+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_LMODE,\r
40535+ EventParam) > 0) {\r
40536+\r
40537+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40538+ SK_PNMI_ERR043,\r
40539+ SK_PNMI_ERR043MSG);\r
40540+\r
40541+ *pLen = 0;\r
40542+ return (SK_PNMI_ERR_GENERAL);\r
40543+ }\r
40544+ }\r
40545+ Offset++;\r
40546+ break;\r
40547+\r
40548+ case OID_SKGE_FLOWCTRL_MODE:\r
40549+ /* Check the value range. */\r
40550+ if (Val8 == 0) {\r
40551+ Offset++;\r
40552+ break;\r
40553+ }\r
40554+ if (Val8 < SK_FLOW_MODE_NONE ||\r
40555+ (LogPortIndex != 0 && Val8 > SK_FLOW_MODE_SYM_OR_REM) ||\r
40556+ (LogPortIndex == 0 && Val8 > SK_FLOW_MODE_INDETERMINATED)) {\r
40557+\r
40558+ *pLen = 0;\r
40559+ return (SK_PNMI_ERR_BAD_VALUE);\r
40560+ }\r
40561+\r
40562+ /* The PRESET ends here. */\r
40563+ if (Action == SK_PNMI_PRESET) {\r
40564+\r
40565+ return (SK_PNMI_ERR_OK);\r
40566+ }\r
40567+\r
40568+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40569+ if (LogPortIndex == 0) {\r
40570+ /*\r
40571+ * The virtual port consists of all currently\r
40572+ * active ports. Find them and send an event\r
40573+ * with the new flow control mode to SIRQ.\r
40574+ */\r
40575+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;\r
40576+ PhysPortIndex ++) {\r
40577+\r
40578+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
40579+ continue;\r
40580+ }\r
40581+\r
40582+ EventParam.Para32[0] = PhysPortIndex;\r
40583+ EventParam.Para32[1] = (SK_U32)Val8;\r
40584+ if (SkGeSirqEvent(pAC, IoC,\r
40585+ SK_HWEV_SET_FLOWMODE,\r
40586+ EventParam) > 0) {\r
40587+\r
40588+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40589+ SK_PNMI_ERR044,\r
40590+ SK_PNMI_ERR044MSG);\r
40591+\r
40592+ *pLen = 0;\r
40593+ return (SK_PNMI_ERR_GENERAL);\r
40594+ }\r
40595+ }\r
40596+ }\r
40597+ else {\r
40598+ /*\r
40599+ * Send an event with the new flow control\r
40600+ * mode to the SIRQ module.\r
40601+ */\r
40602+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(\r
40603+ pAC, LogPortIndex);\r
40604+ EventParam.Para32[1] = (SK_U32)Val8;\r
40605+ if (SkGeSirqEvent(pAC, IoC,\r
40606+ SK_HWEV_SET_FLOWMODE,\r
40607+ EventParam) > 0) {\r
40608+\r
40609+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40610+ SK_PNMI_ERR044,\r
40611+ SK_PNMI_ERR044MSG);\r
40612+\r
40613+ *pLen = 0;\r
40614+ return (SK_PNMI_ERR_GENERAL);\r
40615+ }\r
40616+ }\r
40617+ }\r
40618+ else { /* DualNet mode. */\r
40619+ \r
40620+ /*\r
40621+ * Send an event with the new link mode to\r
40622+ * the SIRQ module.\r
40623+ */\r
40624+ EventParam.Para32[0] = NetIndex;\r
40625+ EventParam.Para32[1] = (SK_U32)Val8;\r
40626+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_FLOWMODE,\r
40627+ EventParam) > 0) {\r
40628+\r
40629+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40630+ SK_PNMI_ERR044,\r
40631+ SK_PNMI_ERR044MSG);\r
40632+\r
40633+ *pLen = 0;\r
40634+ return (SK_PNMI_ERR_GENERAL);\r
40635+ }\r
40636+ }\r
40637+ Offset++;\r
40638+ break;\r
40639+\r
40640+ case OID_SKGE_PHY_OPERATION_MODE :\r
40641+ /* Check the value range. */\r
40642+ if (Val8 == 0) {\r
40643+ /* Mode of this port remains unchanged. */\r
40644+ Offset++;\r
40645+ break;\r
40646+ }\r
40647+ if (Val8 < SK_MS_MODE_AUTO ||\r
40648+ (LogPortIndex != 0 && Val8 > SK_MS_MODE_SLAVE) ||\r
40649+ (LogPortIndex == 0 && Val8 > SK_MS_MODE_INDETERMINATED)) {\r
40650+\r
40651+ *pLen = 0;\r
40652+ return (SK_PNMI_ERR_BAD_VALUE);\r
40653+ }\r
40654+\r
40655+ /* The PRESET ends here. */\r
40656+ if (Action == SK_PNMI_PRESET) {\r
40657+\r
40658+ return (SK_PNMI_ERR_OK);\r
40659+ }\r
40660+\r
40661+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40662+ if (LogPortIndex == 0) {\r
40663+ /*\r
40664+ * The virtual port consists of all currently\r
40665+ * active ports. Find them and send an event\r
40666+ * with new master/slave (role) mode to SIRQ.\r
40667+ */\r
40668+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;\r
40669+ PhysPortIndex ++) {\r
40670+\r
40671+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
40672+ continue;\r
40673+ }\r
40674+\r
40675+ EventParam.Para32[0] = PhysPortIndex;\r
40676+ EventParam.Para32[1] = (SK_U32)Val8;\r
40677+ if (SkGeSirqEvent(pAC, IoC,\r
40678+ SK_HWEV_SET_ROLE,\r
40679+ EventParam) > 0) {\r
40680+\r
40681+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40682+ SK_PNMI_ERR042,\r
40683+ SK_PNMI_ERR042MSG);\r
40684+\r
40685+ *pLen = 0;\r
40686+ return (SK_PNMI_ERR_GENERAL);\r
40687+ }\r
40688+ }\r
40689+ }\r
40690+ else {\r
40691+ /*\r
40692+ * Send an event with the new master/slave\r
40693+ * (role) mode to the SIRQ module.\r
40694+ */\r
40695+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(\r
40696+ pAC, LogPortIndex);\r
40697+ EventParam.Para32[1] = (SK_U32)Val8;\r
40698+ if (SkGeSirqEvent(pAC, IoC,\r
40699+ SK_HWEV_SET_ROLE, EventParam) > 0) {\r
40700+\r
40701+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40702+ SK_PNMI_ERR042,\r
40703+ SK_PNMI_ERR042MSG);\r
40704+\r
40705+ *pLen = 0;\r
40706+ return (SK_PNMI_ERR_GENERAL);\r
40707+ }\r
40708+ }\r
40709+ }\r
40710+ else { /* DualNet mode. */\r
40711+\r
40712+ /*\r
40713+ * Send an event with the new link mode to\r
40714+ * the SIRQ module.\r
40715+ */\r
40716+ EventParam.Para32[0] = NetIndex;\r
40717+ EventParam.Para32[1] = (SK_U32)Val8;\r
40718+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_ROLE,\r
40719+ EventParam) > 0) {\r
40720+\r
40721+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40722+ SK_PNMI_ERR042,\r
40723+ SK_PNMI_ERR042MSG);\r
40724+\r
40725+ *pLen = 0;\r
40726+ return (SK_PNMI_ERR_GENERAL);\r
40727+ }\r
40728+ }\r
40729+ Offset++;\r
40730+ break;\r
40731+\r
40732+ case OID_SKGE_SPEED_MODE:\r
40733+ /* Check the value range. */\r
40734+ if (Val8 == 0) {\r
40735+ Offset++;\r
40736+ break;\r
40737+ }\r
40738+ if (Val8 < (SK_LSPEED_AUTO) ||\r
40739+ (LogPortIndex != 0 && Val8 > (SK_LSPEED_1000MBPS)) ||\r
40740+ (LogPortIndex == 0 && Val8 > (SK_LSPEED_INDETERMINATED))) {\r
40741+\r
40742+ *pLen = 0;\r
40743+ return (SK_PNMI_ERR_BAD_VALUE);\r
40744+ }\r
40745+\r
40746+ /* The PRESET ends here. */\r
40747+ if (Action == SK_PNMI_PRESET) {\r
40748+\r
40749+ return (SK_PNMI_ERR_OK);\r
40750+ }\r
40751+\r
40752+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40753+ if (LogPortIndex == 0) {\r
40754+\r
40755+ /*\r
40756+ * The virtual port consists of all currently\r
40757+ * active ports. Find them and send an event\r
40758+ * with the new flow control mode to SIRQ.\r
40759+ */\r
40760+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;\r
40761+ PhysPortIndex ++) {\r
40762+\r
40763+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
40764+ continue;\r
40765+ }\r
40766+\r
40767+ EventParam.Para32[0] = PhysPortIndex;\r
40768+ EventParam.Para32[1] = (SK_U32)Val8;\r
40769+ if (SkGeSirqEvent(pAC, IoC,\r
40770+ SK_HWEV_SET_SPEED,\r
40771+ EventParam) > 0) {\r
40772+\r
40773+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40774+ SK_PNMI_ERR045,\r
40775+ SK_PNMI_ERR045MSG);\r
40776+\r
40777+ *pLen = 0;\r
40778+ return (SK_PNMI_ERR_GENERAL);\r
40779+ }\r
40780+ }\r
40781+ }\r
40782+ else {\r
40783+ /*\r
40784+ * Send an event with the new flow control\r
40785+ * mode to the SIRQ module.\r
40786+ */\r
40787+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(\r
40788+ pAC, LogPortIndex);\r
40789+ EventParam.Para32[1] = (SK_U32)Val8;\r
40790+ if (SkGeSirqEvent(pAC, IoC,\r
40791+ SK_HWEV_SET_SPEED,\r
40792+ EventParam) > 0) {\r
40793+\r
40794+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40795+ SK_PNMI_ERR045,\r
40796+ SK_PNMI_ERR045MSG);\r
40797+\r
40798+ *pLen = 0;\r
40799+ return (SK_PNMI_ERR_GENERAL);\r
40800+ }\r
40801+ }\r
40802+ }\r
40803+ else { /* DualNet mode. */\r
40804+ \r
40805+ /*\r
40806+ * Send an event with the new link mode to\r
40807+ * the SIRQ module.\r
40808+ */\r
40809+ EventParam.Para32[0] = NetIndex;\r
40810+ EventParam.Para32[1] = (SK_U32)Val8;\r
40811+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_SET_SPEED,\r
40812+ EventParam) > 0) {\r
40813+\r
40814+ SK_ERR_LOG(pAC, SK_ERRCL_SW,\r
40815+ SK_PNMI_ERR045,\r
40816+ SK_PNMI_ERR045MSG);\r
40817+\r
40818+ *pLen = 0;\r
40819+ return (SK_PNMI_ERR_GENERAL);\r
40820+ }\r
40821+ }\r
40822+ Offset++;\r
40823+ break;\r
40824+\r
40825+ case OID_SKGE_MTU:\r
40826+ /* Check the value range. */\r
40827+ SK_PNMI_READ_U32((pBuf + Offset), Val32);\r
40828+\r
40829+ if (Val32 == 0) {\r
40830+ /* MTU of this port remains unchanged. */\r
40831+ Offset += sizeof(SK_U32);\r
40832+ break;\r
40833+ }\r
40834+\r
40835+ if (SK_DRIVER_PRESET_MTU(pAC, IoC, NetIndex, Val32) != 0) {\r
40836+ *pLen = 0;\r
40837+ return (SK_PNMI_ERR_BAD_VALUE);\r
40838+ }\r
40839+\r
40840+ /* The PRESET ends here. */\r
40841+ if (Action == SK_PNMI_PRESET) {\r
40842+ return (SK_PNMI_ERR_OK);\r
40843+ }\r
40844+\r
40845+ if (SK_DRIVER_SET_MTU(pAC, IoC, NetIndex, Val32) != 0) {\r
40846+ return (SK_PNMI_ERR_GENERAL);\r
40847+ }\r
40848+\r
40849+ Offset += sizeof(SK_U32);\r
40850+ break;\r
40851+\r
40852+#ifdef SK_PHY_LP_MODE\r
40853+ case OID_SKGE_PHY_LP_MODE:\r
40854+ /* The PRESET ends here. */\r
40855+ if (Action == SK_PNMI_PRESET) {\r
40856+\r
40857+ return (SK_PNMI_ERR_OK);\r
40858+ }\r
40859+\r
40860+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNet mode. */\r
40861+ if (LogPortIndex == 0) {\r
40862+ Offset = 0;\r
40863+ continue;\r
40864+ }\r
40865+ }\r
40866+ /* Set value for physical port. */\r
40867+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);\r
40868+ CurrentPhyPowerState = pAC->GIni.GP[PhysPortIndex].PPhyPowerState;\r
40869+\r
40870+ switch (Val8) {\r
40871+ case PHY_PM_OPERATIONAL_MODE:\r
40872+ /* If LowPowerMode is active, we can leave it. */\r
40873+ if (CurrentPhyPowerState) {\r
40874+\r
40875+ Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex);\r
40876+ \r
40877+ if ((CurrentPhyPowerState == PHY_PM_DEEP_SLEEP) ||\r
40878+ (CurrentPhyPowerState == PHY_PM_IEEE_POWER_DOWN)) {\r
40879+ \r
40880+ SkDrvInitAdapter(pAC);\r
40881+ }\r
40882+ break;\r
40883+ }\r
40884+ else {\r
40885+ *pLen = 0;\r
40886+ return (SK_PNMI_ERR_GENERAL);\r
40887+ }\r
40888+ case PHY_PM_DEEP_SLEEP:\r
40889+ case PHY_PM_IEEE_POWER_DOWN:\r
40890+ /* If no LowPowerMode is active, we can enter it. */\r
40891+ if (!CurrentPhyPowerState) {\r
40892+ SkDrvDeInitAdapter(pAC);\r
40893+ }\r
40894+\r
40895+ case PHY_PM_ENERGY_DETECT:\r
40896+ case PHY_PM_ENERGY_DETECT_PLUS:\r
40897+ /* If no LowPowerMode is active, we can enter it. */\r
40898+ if (!CurrentPhyPowerState) {\r
40899+\r
40900+ Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf);\r
40901+ break;\r
40902+ }\r
40903+ else {\r
40904+ *pLen = 0;\r
40905+ return (SK_PNMI_ERR_GENERAL);\r
40906+ }\r
40907+ default:\r
40908+ *pLen = 0;\r
40909+ return (SK_PNMI_ERR_BAD_VALUE);\r
40910+ }\r
40911+ Offset++;\r
40912+ break;\r
40913+#endif /* SK_PHY_LP_MODE */\r
40914+\r
40915+ default:\r
40916+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,\r
40917+ ("MacPrivateConf: Unknown OID should be handled before set"));\r
40918+\r
40919+ *pLen = 0;\r
40920+ return (SK_PNMI_ERR_GENERAL);\r
40921+ }\r
40922+ }\r
40923+\r
40924+ return (SK_PNMI_ERR_OK);\r
40925+}\r
40926+\r
40927+/*****************************************************************************\r
40928+ *\r
40929+ * Monitor - OID handler function for RLMT_MONITOR_XXX\r
40930+ *\r
40931+ * Description:\r
40932+ * Because RLMT currently does not support the monitoring of\r
40933+ * remote adapter cards, we return always an empty table.\r
40934+ *\r
40935+ * Returns:\r
40936+ * SK_PNMI_ERR_OK The request was successfully performed.\r
40937+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
40938+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
40939+ * the correct data (e.g. a 32bit value is\r
40940+ * needed, but a 16 bit value was passed).\r
40941+ * SK_PNMI_ERR_BAD_VALUE The passed value is not in the valid\r
40942+ * value range.\r
40943+ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set.\r
40944+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
40945+ * exist (e.g. port instance 3 on a two port\r
40946+ * adapter.\r
40947+ */\r
40948+PNMI_STATIC int Monitor(\r
40949+SK_AC *pAC, /* Pointer to adapter context */\r
40950+SK_IOC IoC, /* IO context handle */\r
40951+int Action, /* GET/PRESET/SET action */\r
40952+SK_U32 Id, /* Object ID that is to be processed */\r
40953+char *pBuf, /* Buffer used for the management data transfer */\r
40954+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
40955+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
40956+unsigned int TableIndex, /* Index to the Id table */\r
40957+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
40958+{\r
40959+ unsigned int Index;\r
40960+ unsigned int Limit;\r
40961+ unsigned int Offset;\r
40962+ unsigned int Entries;\r
40963+ \r
40964+ /* Not implemented yet. Return always an empty table. */\r
40965+ Entries = 0;\r
40966+\r
40967+ /* Calculate instance if wished. */\r
40968+ if ((Instance != (SK_U32)(-1))) {\r
40969+\r
40970+ if ((Instance < 1) || (Instance > Entries)) {\r
40971+\r
40972+ *pLen = 0;\r
40973+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
40974+ }\r
40975+\r
40976+ Index = (unsigned int)Instance - 1;\r
40977+ Limit = (unsigned int)Instance;\r
40978+ }\r
40979+ else {\r
40980+ Index = 0;\r
40981+ Limit = Entries;\r
40982+ }\r
40983+\r
40984+ /* GET/SET value. */\r
40985+ if (Action == SK_PNMI_GET) {\r
40986+\r
40987+ for (Offset = 0; Index < Limit; Index ++) {\r
40988+\r
40989+ switch (Id) {\r
40990+\r
40991+ case OID_SKGE_RLMT_MONITOR_INDEX:\r
40992+ case OID_SKGE_RLMT_MONITOR_ADDR:\r
40993+ case OID_SKGE_RLMT_MONITOR_ERRS:\r
40994+ case OID_SKGE_RLMT_MONITOR_TIMESTAMP:\r
40995+ case OID_SKGE_RLMT_MONITOR_ADMIN:\r
40996+ break;\r
40997+\r
40998+ default:\r
40999+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR046,\r
41000+ SK_PNMI_ERR046MSG);\r
41001+\r
41002+ *pLen = 0;\r
41003+ return (SK_PNMI_ERR_GENERAL);\r
41004+ }\r
41005+ }\r
41006+ *pLen = Offset;\r
41007+ }\r
41008+ else {\r
41009+ /* Only MONITOR_ADMIN can be set. */\r
41010+ if (Id != OID_SKGE_RLMT_MONITOR_ADMIN) {\r
41011+\r
41012+ *pLen = 0;\r
41013+ return (SK_PNMI_ERR_READ_ONLY);\r
41014+ }\r
41015+\r
41016+ /* Check if the length is plausible. */\r
41017+ if (*pLen < (Limit - Index)) {\r
41018+\r
41019+ return (SK_PNMI_ERR_TOO_SHORT);\r
41020+ }\r
41021+ /* Okay, we have a wide value range. */\r
41022+ if (*pLen != (Limit - Index)) {\r
41023+\r
41024+ *pLen = 0;\r
41025+ return (SK_PNMI_ERR_BAD_VALUE);\r
41026+ }\r
41027+\r
41028+ /*\r
41029+ * Not yet implemented. Return always BAD_VALUE,\r
41030+ * because the table is empty.\r
41031+ */\r
41032+ *pLen = 0;\r
41033+ return (SK_PNMI_ERR_BAD_VALUE);\r
41034+ }\r
41035+\r
41036+ return (SK_PNMI_ERR_OK);\r
41037+}\r
41038+\r
41039+/*****************************************************************************\r
41040+ *\r
41041+ * VirtualConf - Calculates the values of configuration OIDs for virtual port\r
41042+ *\r
41043+ * Description:\r
41044+ * We handle here the get of the configuration group OIDs, which are\r
41045+ * a little bit complicated. The virtual port consists of all currently\r
41046+ * active physical ports. If multiple ports are active and configured\r
41047+ * differently we get in some trouble to return a single value. So we\r
41048+ * get the value of the first active port and compare it with that of\r
41049+ * the other active ports. If they are not the same, we return a value\r
41050+ * that indicates that the state is indeterminated.\r
41051+ *\r
41052+ * Returns:\r
41053+ * Nothing\r
41054+ */\r
41055+PNMI_STATIC void VirtualConf(\r
41056+SK_AC *pAC, /* Pointer to adapter context */\r
41057+SK_IOC IoC, /* IO context handle */\r
41058+SK_U32 Id, /* Object ID that is to be processed */\r
41059+char *pBuf) /* Buffer used for the management data transfer */\r
41060+{\r
41061+ unsigned int PhysPortMax;\r
41062+ unsigned int PhysPortIndex;\r
41063+ SK_U8 Val8;\r
41064+ SK_U32 Val32;\r
41065+ SK_BOOL PortActiveFlag;\r
41066+ SK_GEPORT *pPrt;\r
41067+\r
41068+ *pBuf = 0;\r
41069+ PortActiveFlag = SK_FALSE;\r
41070+ PhysPortMax = pAC->GIni.GIMacsFound;\r
41071+ \r
41072+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; PhysPortIndex ++) {\r
41073+\r
41074+ pPrt = &pAC->GIni.GP[PhysPortIndex];\r
41075+\r
41076+ /* Check if the physical port is active. */\r
41077+ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
41078+ continue;\r
41079+ }\r
41080+\r
41081+ PortActiveFlag = SK_TRUE;\r
41082+\r
41083+ switch (Id) {\r
41084+\r
41085+ case OID_SKGE_PHY_TYPE:\r
41086+ /* Check if it is the first active port. */\r
41087+ if (*pBuf == 0) {\r
41088+ Val32 = pPrt->PhyType;\r
41089+ SK_PNMI_STORE_U32(pBuf, Val32);\r
41090+ continue;\r
41091+ }\r
41092+ break;\r
41093+\r
41094+ case OID_SKGE_LINK_CAP:\r
41095+\r
41096+ /*\r
41097+ * Different capabilities should not happen, but\r
41098+ * in the case of the cases OR them all together.\r
41099+ * From a curious point of view the virtual port\r
41100+ * is capable of all found capabilities.\r
41101+ */\r
41102+ *pBuf |= pPrt->PLinkCap;\r
41103+ break;\r
41104+\r
41105+ case OID_SKGE_LINK_MODE:\r
41106+ /* Check if it is the first active port. */\r
41107+ if (*pBuf == 0) {\r
41108+\r
41109+ *pBuf = pPrt->PLinkModeConf;\r
41110+ continue;\r
41111+ }\r
41112+\r
41113+ /*\r
41114+ * If we find an active port with a different link mode\r
41115+ * than the first one we return indeterminated.\r
41116+ */\r
41117+ if (*pBuf != pPrt->PLinkModeConf) {\r
41118+\r
41119+ *pBuf = SK_LMODE_INDETERMINATED;\r
41120+ }\r
41121+ break;\r
41122+\r
41123+ case OID_SKGE_LINK_MODE_STATUS:\r
41124+ /* Get the link mode of the physical port. */\r
41125+ Val8 = CalculateLinkModeStatus(pAC, IoC, PhysPortIndex);\r
41126+\r
41127+ /* Check if it is the first active port. */\r
41128+ if (*pBuf == 0) {\r
41129+\r
41130+ *pBuf = Val8;\r
41131+ continue;\r
41132+ }\r
41133+\r
41134+ /*\r
41135+ * If we find an active port with a different link mode status\r
41136+ * than the first one we return indeterminated.\r
41137+ */\r
41138+ if (*pBuf != Val8) {\r
41139+\r
41140+ *pBuf = SK_LMODE_STAT_INDETERMINATED;\r
41141+ }\r
41142+ break;\r
41143+\r
41144+ case OID_SKGE_LINK_STATUS:\r
41145+ /* Get the link status of the physical port. */\r
41146+ Val8 = CalculateLinkStatus(pAC, IoC, PhysPortIndex);\r
41147+\r
41148+ /* Check if it is the first active port. */\r
41149+ if (*pBuf == 0) {\r
41150+\r
41151+ *pBuf = Val8;\r
41152+ continue;\r
41153+ }\r
41154+\r
41155+ /*\r
41156+ * If we find an active port with a different link status\r
41157+ * than the first one we return indeterminated.\r
41158+ */\r
41159+ if (*pBuf != Val8) {\r
41160+\r
41161+ *pBuf = SK_PNMI_RLMT_LSTAT_INDETERMINATED;\r
41162+ }\r
41163+ break;\r
41164+\r
41165+ case OID_SKGE_FLOWCTRL_CAP:\r
41166+ /* Check if it is the first active port. */\r
41167+ if (*pBuf == 0) {\r
41168+\r
41169+ *pBuf = pPrt->PFlowCtrlCap;\r
41170+ continue;\r
41171+ }\r
41172+\r
41173+ /*\r
41174+ * From a curious point of view the virtual port\r
41175+ * is capable of all found capabilities.\r
41176+ */\r
41177+ *pBuf |= pPrt->PFlowCtrlCap;\r
41178+ break;\r
41179+\r
41180+ case OID_SKGE_FLOWCTRL_MODE:\r
41181+ /* Check if it is the first active port. */\r
41182+ if (*pBuf == 0) {\r
41183+\r
41184+ *pBuf = pPrt->PFlowCtrlMode;\r
41185+ continue;\r
41186+ }\r
41187+\r
41188+ /*\r
41189+ * If we find an active port with a different flow-control mode\r
41190+ * than the first one we return indeterminated.\r
41191+ */\r
41192+ if (*pBuf != pPrt->PFlowCtrlMode) {\r
41193+\r
41194+ *pBuf = SK_FLOW_MODE_INDETERMINATED;\r
41195+ }\r
41196+ break;\r
41197+\r
41198+ case OID_SKGE_FLOWCTRL_STATUS:\r
41199+ /* Check if it is the first active port. */\r
41200+ if (*pBuf == 0) {\r
41201+\r
41202+ *pBuf = pPrt->PFlowCtrlStatus;\r
41203+ continue;\r
41204+ }\r
41205+\r
41206+ /*\r
41207+ * If we find an active port with a different flow-control status\r
41208+ * than the first one we return indeterminated.\r
41209+ */\r
41210+ if (*pBuf != pPrt->PFlowCtrlStatus) {\r
41211+\r
41212+ *pBuf = SK_FLOW_STAT_INDETERMINATED;\r
41213+ }\r
41214+ break;\r
41215+ \r
41216+ case OID_SKGE_PHY_OPERATION_CAP:\r
41217+ /* Check if it is the first active port. */\r
41218+ if (*pBuf == 0) {\r
41219+\r
41220+ *pBuf = pPrt->PMSCap;\r
41221+ continue;\r
41222+ }\r
41223+\r
41224+ /*\r
41225+ * From a curious point of view the virtual port\r
41226+ * is capable of all found capabilities.\r
41227+ */\r
41228+ *pBuf |= pPrt->PMSCap;\r
41229+ break;\r
41230+\r
41231+ case OID_SKGE_PHY_OPERATION_MODE:\r
41232+ /* Check if it is the first active port. */\r
41233+ if (*pBuf == 0) {\r
41234+\r
41235+ *pBuf = pPrt->PMSMode;\r
41236+ continue;\r
41237+ }\r
41238+\r
41239+ /*\r
41240+ * If we find an active port with a different master/slave mode\r
41241+ * than the first one we return indeterminated.\r
41242+ */\r
41243+ if (*pBuf != pPrt->PMSMode) {\r
41244+\r
41245+ *pBuf = SK_MS_MODE_INDETERMINATED;\r
41246+ }\r
41247+ break;\r
41248+\r
41249+ case OID_SKGE_PHY_OPERATION_STATUS:\r
41250+ /* Check if it is the first active port. */\r
41251+ if (*pBuf == 0) {\r
41252+\r
41253+ *pBuf = pPrt->PMSStatus;\r
41254+ continue;\r
41255+ }\r
41256+\r
41257+ /*\r
41258+ * If we find an active port with a different master/slave status\r
41259+ * than the first one we return indeterminated.\r
41260+ */\r
41261+ if (*pBuf != pPrt->PMSStatus) {\r
41262+\r
41263+ *pBuf = SK_MS_STAT_INDETERMINATED;\r
41264+ }\r
41265+ break;\r
41266+ \r
41267+ case OID_SKGE_SPEED_MODE:\r
41268+ /* Check if it is the first active port. */\r
41269+ if (*pBuf == 0) {\r
41270+\r
41271+ *pBuf = pPrt->PLinkSpeed;\r
41272+ continue;\r
41273+ }\r
41274+\r
41275+ /*\r
41276+ * If we find an active port with a different link speed\r
41277+ * than the first one we return indeterminated.\r
41278+ */\r
41279+ if (*pBuf != pPrt->PLinkSpeed) {\r
41280+\r
41281+ *pBuf = SK_LSPEED_INDETERMINATED;\r
41282+ }\r
41283+ break;\r
41284+ \r
41285+ case OID_SKGE_SPEED_STATUS:\r
41286+ /* Check if it is the first active port. */\r
41287+ if (*pBuf == 0) {\r
41288+\r
41289+ *pBuf = pPrt->PLinkSpeedUsed;\r
41290+ continue;\r
41291+ }\r
41292+\r
41293+ /*\r
41294+ * If we find an active port with a different link speed used\r
41295+ * than the first one we return indeterminated.\r
41296+ */\r
41297+ if (*pBuf != pPrt->PLinkSpeedUsed) {\r
41298+\r
41299+ *pBuf = SK_LSPEED_STAT_INDETERMINATED;\r
41300+ }\r
41301+ break;\r
41302+ }\r
41303+ }\r
41304+\r
41305+ /* If no port is active return an indeterminated answer. */\r
41306+ if (!PortActiveFlag) {\r
41307+\r
41308+ switch (Id) {\r
41309+\r
41310+ case OID_SKGE_LINK_CAP:\r
41311+ *pBuf = SK_LMODE_CAP_INDETERMINATED;\r
41312+ break;\r
41313+\r
41314+ case OID_SKGE_LINK_MODE:\r
41315+ *pBuf = SK_LMODE_INDETERMINATED;\r
41316+ break;\r
41317+\r
41318+ case OID_SKGE_LINK_MODE_STATUS:\r
41319+ *pBuf = SK_LMODE_STAT_INDETERMINATED;\r
41320+ break;\r
41321+\r
41322+ case OID_SKGE_LINK_STATUS:\r
41323+ *pBuf = SK_PNMI_RLMT_LSTAT_INDETERMINATED;\r
41324+ break;\r
41325+\r
41326+ case OID_SKGE_FLOWCTRL_CAP:\r
41327+ case OID_SKGE_FLOWCTRL_MODE:\r
41328+ *pBuf = SK_FLOW_MODE_INDETERMINATED;\r
41329+ break;\r
41330+\r
41331+ case OID_SKGE_FLOWCTRL_STATUS:\r
41332+ *pBuf = SK_FLOW_STAT_INDETERMINATED;\r
41333+ break;\r
41334+ \r
41335+ case OID_SKGE_PHY_OPERATION_CAP:\r
41336+ *pBuf = SK_MS_CAP_INDETERMINATED;\r
41337+ break;\r
41338+\r
41339+ case OID_SKGE_PHY_OPERATION_MODE:\r
41340+ *pBuf = SK_MS_MODE_INDETERMINATED;\r
41341+ break;\r
41342+\r
41343+ case OID_SKGE_PHY_OPERATION_STATUS:\r
41344+ *pBuf = SK_MS_STAT_INDETERMINATED;\r
41345+ break;\r
41346+ case OID_SKGE_SPEED_CAP:\r
41347+ *pBuf = SK_LSPEED_CAP_INDETERMINATED;\r
41348+ break;\r
41349+\r
41350+ case OID_SKGE_SPEED_MODE:\r
41351+ *pBuf = SK_LSPEED_INDETERMINATED;\r
41352+ break;\r
41353+\r
41354+ case OID_SKGE_SPEED_STATUS:\r
41355+ *pBuf = SK_LSPEED_STAT_INDETERMINATED;\r
41356+ break;\r
41357+ }\r
41358+ }\r
41359+}\r
41360+\r
41361+/*****************************************************************************\r
41362+ *\r
41363+ * CalculateLinkStatus - Determins the link status of a physical port\r
41364+ *\r
41365+ * Description:\r
41366+ * Determins the link status the following way:\r
41367+ * LSTAT_PHY_DOWN: Link is down\r
41368+ * LSTAT_AUTONEG: Auto-negotiation failed\r
41369+ * LSTAT_LOG_DOWN: Link is up but RLMT did not yet put the port\r
41370+ * logically up.\r
41371+ * LSTAT_LOG_UP: RLMT marked the port as up\r
41372+ *\r
41373+ * Returns:\r
41374+ * Link status of physical port\r
41375+ */\r
41376+PNMI_STATIC SK_U8 CalculateLinkStatus(\r
41377+SK_AC *pAC, /* Pointer to adapter context */\r
41378+SK_IOC IoC, /* IO context handle */\r
41379+unsigned int PhysPortIndex) /* Physical port index */\r
41380+{\r
41381+ SK_U8 Result;\r
41382+\r
41383+ if (!pAC->GIni.GP[PhysPortIndex].PHWLinkUp) {\r
41384+\r
41385+ Result = SK_PNMI_RLMT_LSTAT_PHY_DOWN;\r
41386+ }\r
41387+ else if (pAC->GIni.GP[PhysPortIndex].PAutoNegFail > 0) {\r
41388+\r
41389+ Result = SK_PNMI_RLMT_LSTAT_AUTONEG;\r
41390+ }\r
41391+ else if (!pAC->Rlmt.Port[PhysPortIndex].PortDown) {\r
41392+\r
41393+ Result = SK_PNMI_RLMT_LSTAT_LOG_UP;\r
41394+ }\r
41395+ else {\r
41396+ Result = SK_PNMI_RLMT_LSTAT_LOG_DOWN;\r
41397+ }\r
41398+\r
41399+ return (Result);\r
41400+}\r
41401+\r
41402+/*****************************************************************************\r
41403+ *\r
41404+ * CalculateLinkModeStatus - Determins the link mode status of a phys. port\r
41405+ *\r
41406+ * Description:\r
41407+ * The COMMON module only tells us if the mode is half or full duplex.\r
41408+ * But in the decade of auto sensing it is usefull for the user to\r
41409+ * know if the mode was negotiated or forced. Therefore we have a\r
41410+ * look to the mode, which was last used by the negotiation process.\r
41411+ *\r
41412+ * Returns:\r
41413+ * The link mode status\r
41414+ */\r
41415+PNMI_STATIC SK_U8 CalculateLinkModeStatus(\r
41416+SK_AC *pAC, /* Pointer to adapter context */\r
41417+SK_IOC IoC, /* IO context handle */\r
41418+unsigned int PhysPortIndex) /* Physical port index */\r
41419+{\r
41420+ SK_U8 Result;\r
41421+\r
41422+ /* Get the current mode, which can be full or half duplex. */\r
41423+ Result = pAC->GIni.GP[PhysPortIndex].PLinkModeStatus;\r
41424+\r
41425+ /* Check if no valid mode could be found (link is down). */\r
41426+ if (Result < SK_LMODE_STAT_HALF) {\r
41427+\r
41428+ Result = SK_LMODE_STAT_UNKNOWN;\r
41429+ }\r
41430+ else if (pAC->GIni.GP[PhysPortIndex].PLinkMode >= SK_LMODE_AUTOHALF) {\r
41431+ /*\r
41432+ * Auto-negotiation was used to bring up the link. Change\r
41433+ * the already found duplex status that it indicates\r
41434+ * auto-negotiation was involved.\r
41435+ */\r
41436+ if (Result == SK_LMODE_STAT_HALF) {\r
41437+\r
41438+ Result = SK_LMODE_STAT_AUTOHALF;\r
41439+ }\r
41440+ else if (Result == SK_LMODE_STAT_FULL) {\r
41441+\r
41442+ Result = SK_LMODE_STAT_AUTOFULL;\r
41443+ }\r
41444+ }\r
41445+\r
41446+ return (Result);\r
41447+}\r
41448+\r
41449+/*****************************************************************************\r
41450+ *\r
41451+ * GetVpdKeyArr - Obtain an array of VPD keys\r
41452+ *\r
41453+ * Description:\r
41454+ * Read the VPD keys and build an array of VPD keys, which are\r
41455+ * easy to access.\r
41456+ *\r
41457+ * Returns:\r
41458+ * SK_PNMI_ERR_OK Task successfully performed.\r
41459+ * SK_PNMI_ERR_GENERAL Something went wrong.\r
41460+ */\r
41461+PNMI_STATIC int GetVpdKeyArr(\r
41462+SK_AC *pAC, /* Pointer to adapter context */\r
41463+SK_IOC IoC, /* IO context handle */\r
41464+char *pKeyArr, /* Ptr KeyArray */\r
41465+unsigned int KeyArrLen, /* Length of array in bytes */\r
41466+unsigned int *pKeyNo) /* Number of keys */\r
41467+{\r
41468+ unsigned int BufKeysLen = SK_PNMI_VPD_BUFSIZE;\r
41469+ char BufKeys[SK_PNMI_VPD_BUFSIZE];\r
41470+ unsigned int StartOffset;\r
41471+ unsigned int Offset;\r
41472+ int Index;\r
41473+ int Ret;\r
41474+\r
41475+ SK_MEMSET(pKeyArr, 0, KeyArrLen);\r
41476+\r
41477+ /* Get VPD key list. */\r
41478+ Ret = VpdKeys(pAC, IoC, BufKeys, (int *)&BufKeysLen,\r
41479+ (int *)pKeyNo);\r
41480+ \r
41481+ if (Ret > 0) {\r
41482+\r
41483+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
41484+ (SK_PNMI_ERR014MSG));\r
41485+\r
41486+ /* Please read comment in Vpd(). */\r
41487+ pAC->Pnmi.VpdKeyReadError = SK_TRUE;\r
41488+ return (SK_PNMI_ERR_GENERAL);\r
41489+ }\r
41490+ /* If no keys are available return now. */\r
41491+ if (*pKeyNo == 0 || BufKeysLen == 0) {\r
41492+\r
41493+ return (SK_PNMI_ERR_OK);\r
41494+ }\r
41495+ /*\r
41496+ * If the key list is too long for us trunc it and give a\r
41497+ * errorlog notification. This case should not happen because\r
41498+ * the maximum number of keys is limited due to RAM limitations.\r
41499+ */\r
41500+ if (*pKeyNo > SK_PNMI_VPD_ENTRIES) {\r
41501+\r
41502+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
41503+ (SK_PNMI_ERR015MSG));\r
41504+\r
41505+ *pKeyNo = SK_PNMI_VPD_ENTRIES;\r
41506+ }\r
41507+\r
41508+ /*\r
41509+ * Now build an array of fixed string length size and copy\r
41510+ * the keys together.\r
41511+ */\r
41512+ for (Index = 0, StartOffset = 0, Offset = 0; Offset < BufKeysLen;\r
41513+ Offset ++) {\r
41514+\r
41515+ if (BufKeys[Offset] != 0) {\r
41516+ continue;\r
41517+ }\r
41518+\r
41519+ if (Offset - StartOffset > SK_PNMI_VPD_KEY_SIZE) {\r
41520+\r
41521+ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,\r
41522+ (SK_PNMI_ERR016MSG));\r
41523+\r
41524+ return (SK_PNMI_ERR_GENERAL);\r
41525+ }\r
41526+\r
41527+ SK_STRNCPY(pKeyArr + Index * SK_PNMI_VPD_KEY_SIZE,\r
41528+ &BufKeys[StartOffset], SK_PNMI_VPD_KEY_SIZE);\r
41529+\r
41530+ Index ++;\r
41531+ StartOffset = Offset + 1;\r
41532+ }\r
41533+\r
41534+ /* Last key not zero terminated? Get it anyway. */\r
41535+ if (StartOffset < Offset) {\r
41536+\r
41537+ SK_STRNCPY(pKeyArr + Index * SK_PNMI_VPD_KEY_SIZE,\r
41538+ &BufKeys[StartOffset], SK_PNMI_VPD_KEY_SIZE);\r
41539+ }\r
41540+\r
41541+ return (SK_PNMI_ERR_OK);\r
41542+}\r
41543+\r
41544+/*****************************************************************************\r
41545+ *\r
41546+ * SirqUpdate - Let the SIRQ update its internal values\r
41547+ *\r
41548+ * Description:\r
41549+ * Just to be sure that the SIRQ module holds its internal data\r
41550+ * structures up to date, we send an update event before we make\r
41551+ * any access.\r
41552+ *\r
41553+ * Returns:\r
41554+ * SK_PNMI_ERR_OK Task successfully performed.\r
41555+ * SK_PNMI_ERR_GENERAL Something went wrong.\r
41556+ */\r
41557+PNMI_STATIC int SirqUpdate(\r
41558+SK_AC *pAC, /* Pointer to adapter context */\r
41559+SK_IOC IoC) /* IO context handle */\r
41560+{\r
41561+ SK_EVPARA EventParam;\r
41562+\r
41563+ /* Was the module already updated during the current PNMI call? */\r
41564+ if (pAC->Pnmi.SirqUpdatedFlag > 0) {\r
41565+\r
41566+ return (SK_PNMI_ERR_OK);\r
41567+ }\r
41568+\r
41569+ /* Send an synchronuous update event to the module. */\r
41570+ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));\r
41571+ \r
41572+ if (SkGeSirqEvent(pAC, IoC, SK_HWEV_UPDATE_STAT, EventParam)) {\r
41573+\r
41574+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR047, SK_PNMI_ERR047MSG);\r
41575+\r
41576+ return (SK_PNMI_ERR_GENERAL);\r
41577+ }\r
41578+\r
41579+ return (SK_PNMI_ERR_OK);\r
41580+}\r
41581+\r
41582+/*****************************************************************************\r
41583+ *\r
41584+ * RlmtUpdate - Let the RLMT update its internal values\r
41585+ *\r
41586+ * Description:\r
41587+ * Just to be sure that the RLMT module holds its internal data\r
41588+ * structures up to date, we send an update event before we make\r
41589+ * any access.\r
41590+ *\r
41591+ * Returns:\r
41592+ * SK_PNMI_ERR_OK Task successfully performed.\r
41593+ * SK_PNMI_ERR_GENERAL Something went wrong.\r
41594+ */\r
41595+PNMI_STATIC int RlmtUpdate(\r
41596+SK_AC *pAC, /* Pointer to adapter context */\r
41597+SK_IOC IoC, /* IO context handle */\r
41598+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */\r
41599+{\r
41600+ SK_EVPARA EventParam;\r
41601+\r
41602+ /* Was the module already updated during the current PNMI call? */\r
41603+ if (pAC->Pnmi.RlmtUpdatedFlag > 0) {\r
41604+\r
41605+ return (SK_PNMI_ERR_OK);\r
41606+ }\r
41607+\r
41608+ /* Send an synchronuous update event to the module. */\r
41609+ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));\r
41610+ EventParam.Para32[0] = NetIndex;\r
41611+ EventParam.Para32[1] = (SK_U32)-1;\r
41612+ if (SkRlmtEvent(pAC, IoC, SK_RLMT_STATS_UPDATE, EventParam) > 0) {\r
41613+\r
41614+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR048, SK_PNMI_ERR048MSG);\r
41615+\r
41616+ return (SK_PNMI_ERR_GENERAL);\r
41617+ }\r
41618+\r
41619+ return (SK_PNMI_ERR_OK);\r
41620+}\r
41621+\r
41622+/*****************************************************************************\r
41623+ *\r
41624+ * MacUpdate - Force the XMAC to output the current statistic\r
41625+ *\r
41626+ * Description:\r
41627+ * The XMAC holds its statistic internally. To obtain the current\r
41628+ * values we must send a command so that the statistic data will\r
41629+ * be written to a predefined memory area on the adapter.\r
41630+ *\r
41631+ * Returns:\r
41632+ * SK_PNMI_ERR_OK Task successfully performed.\r
41633+ * SK_PNMI_ERR_GENERAL Something went wrong.\r
41634+ */\r
41635+PNMI_STATIC int MacUpdate(\r
41636+SK_AC *pAC, /* Pointer to adapter context */\r
41637+SK_IOC IoC, /* IO context handle */\r
41638+unsigned int FirstMac, /* Index of the first Mac to be updated */\r
41639+unsigned int LastMac) /* Index of the last Mac to be updated */\r
41640+{\r
41641+ unsigned int MacIndex;\r
41642+\r
41643+ /*\r
41644+ * Were the statistics already updated during the\r
41645+ * current PNMI call?\r
41646+ */\r
41647+ if (pAC->Pnmi.MacUpdatedFlag > 0) {\r
41648+\r
41649+ return (SK_PNMI_ERR_OK);\r
41650+ }\r
41651+\r
41652+ /* Send an update command to all MACs specified. */\r
41653+ for (MacIndex = FirstMac; MacIndex <= LastMac; MacIndex ++) {\r
41654+\r
41655+ /*\r
41656+ * 2002-09-13 pweber: Freeze the current SW counters.\r
41657+ * (That should be done as close as\r
41658+ * possible to the update of the\r
41659+ * HW counters).\r
41660+ */\r
41661+ if (pAC->GIni.GIMacType == SK_MAC_XMAC) {\r
41662+ pAC->Pnmi.BufPort[MacIndex] = pAC->Pnmi.Port[MacIndex];\r
41663+ }\r
41664+ \r
41665+ /* 2002-09-13 pweber: Update the HW counter. */\r
41666+ if (pAC->GIni.GIFunc.pFnMacUpdateStats(pAC, IoC, MacIndex) != 0) {\r
41667+\r
41668+ return (SK_PNMI_ERR_GENERAL);\r
41669+ }\r
41670+ }\r
41671+\r
41672+ return (SK_PNMI_ERR_OK);\r
41673+}\r
41674+\r
41675+/*****************************************************************************\r
41676+ *\r
41677+ * GetStatVal - Retrieve an XMAC statistic counter\r
41678+ *\r
41679+ * Description:\r
41680+ * Retrieves the statistic counter of a virtual or physical port. The\r
41681+ * virtual port is identified by the index 0. It consists of all\r
41682+ * currently active ports. To obtain the counter value for this port\r
41683+ * we must add the statistic counter of all active ports. To grant\r
41684+ * continuous counter values for the virtual port even when port\r
41685+ * switches occur we must additionally add a delta value, which was\r
41686+ * calculated during a SK_PNMI_EVT_RLMT_ACTIVE_UP event.\r
41687+ *\r
41688+ * Returns:\r
41689+ * Requested statistic value\r
41690+ */\r
41691+PNMI_STATIC SK_U64 GetStatVal(\r
41692+SK_AC *pAC, /* Pointer to adapter context */\r
41693+SK_IOC IoC, /* IO context handle */\r
41694+unsigned int LogPortIndex, /* Index of the logical Port to be processed */\r
41695+unsigned int StatIndex, /* Index to statistic value */\r
41696+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */\r
41697+{\r
41698+ unsigned int PhysPortIndex;\r
41699+ unsigned int PhysPortMax;\r
41700+ SK_U64 Val = 0;\r
41701+\r
41702+\r
41703+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* DualNet mode. */\r
41704+\r
41705+ PhysPortIndex = NetIndex;\r
41706+ \r
41707+ Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex);\r
41708+ }\r
41709+ else { /* SingleNet mode. */\r
41710+\r
41711+ if (LogPortIndex == 0) {\r
41712+\r
41713+ PhysPortMax = pAC->GIni.GIMacsFound;\r
41714+\r
41715+ /* Add counter of all active ports. */\r
41716+ for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax;\r
41717+ PhysPortIndex ++) {\r
41718+\r
41719+ if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {\r
41720+\r
41721+ Val += GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex);\r
41722+ }\r
41723+ }\r
41724+\r
41725+ /* Correct value because of port switches. */\r
41726+ Val += pAC->Pnmi.VirtualCounterOffset[StatIndex];\r
41727+ }\r
41728+ else {\r
41729+ /* Get counter value of physical port. */\r
41730+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);\r
41731+ \r
41732+ Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex);\r
41733+ }\r
41734+ }\r
41735+ return (Val);\r
41736+}\r
41737+\r
41738+/*****************************************************************************\r
41739+ *\r
41740+ * GetPhysStatVal - Get counter value for physical port\r
41741+ *\r
41742+ * Description:\r
41743+ * Builds a 64bit counter value. Except for the octet counters\r
41744+ * the lower 32bit are counted in hardware and the upper 32bit\r
41745+ * in software by monitoring counter overflow interrupts in the\r
41746+ * event handler. To grant continous counter values during XMAC\r
41747+ * resets (caused by a workaround) we must add a delta value.\r
41748+ * The delta was calculated in the event handler when a\r
41749+ * SK_PNMI_EVT_XMAC_RESET was received.\r
41750+ *\r
41751+ * Returns:\r
41752+ * Counter value\r
41753+ */\r
41754+PNMI_STATIC SK_U64 GetPhysStatVal(\r
41755+SK_AC *pAC, /* Pointer to adapter context */\r
41756+SK_IOC IoC, /* IO context handle */\r
41757+unsigned int PhysPortIndex, /* Index of the logical Port to be processed */\r
41758+unsigned int StatIndex) /* Index to statistic value */\r
41759+{\r
41760+ SK_U64 Val = 0;\r
41761+ SK_U32 LowVal = 0;\r
41762+ SK_U32 HighVal = 0;\r
41763+ SK_U16 Word;\r
41764+ int MacType;\r
41765+ unsigned int HelpIndex;\r
41766+ SK_GEPORT *pPrt;\r
41767+ \r
41768+ SK_PNMI_PORT *pPnmiPrt;\r
41769+ SK_GEMACFUNC *pFnMac;\r
41770+ \r
41771+ pPrt = &pAC->GIni.GP[PhysPortIndex];\r
41772+ \r
41773+ MacType = pAC->GIni.GIMacType;\r
41774+ \r
41775+ /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort). */\r
41776+ if (MacType == SK_MAC_XMAC) {\r
41777+ pPnmiPrt = &pAC->Pnmi.BufPort[PhysPortIndex];\r
41778+ }\r
41779+ else {\r
41780+ pPnmiPrt = &pAC->Pnmi.Port[PhysPortIndex];\r
41781+ }\r
41782+ \r
41783+ pFnMac = &pAC->GIni.GIFunc;\r
41784+\r
41785+ switch (StatIndex) {\r
41786+ case SK_PNMI_HTX:\r
41787+ if (MacType == SK_MAC_GMAC) {\r
41788+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41789+ StatAddr[SK_PNMI_HTX_BROADCAST][MacType].Reg,\r
41790+ &LowVal);\r
41791+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41792+ StatAddr[SK_PNMI_HTX_MULTICAST][MacType].Reg,\r
41793+ &HighVal);\r
41794+ LowVal += HighVal;\r
41795+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41796+ StatAddr[SK_PNMI_HTX_UNICAST][MacType].Reg,\r
41797+ &HighVal);\r
41798+ LowVal += HighVal;\r
41799+ }\r
41800+ else {\r
41801+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41802+ StatAddr[StatIndex][MacType].Reg,\r
41803+ &LowVal);\r
41804+ }\r
41805+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41806+ break;\r
41807+ \r
41808+ case SK_PNMI_HRX:\r
41809+ if (MacType == SK_MAC_GMAC) {\r
41810+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41811+ StatAddr[SK_PNMI_HRX_BROADCAST][MacType].Reg,\r
41812+ &LowVal);\r
41813+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41814+ StatAddr[SK_PNMI_HRX_MULTICAST][MacType].Reg,\r
41815+ &HighVal);\r
41816+ LowVal += HighVal;\r
41817+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41818+ StatAddr[SK_PNMI_HRX_UNICAST][MacType].Reg,\r
41819+ &HighVal);\r
41820+ LowVal += HighVal;\r
41821+ }\r
41822+ else {\r
41823+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41824+ StatAddr[StatIndex][MacType].Reg,\r
41825+ &LowVal);\r
41826+ }\r
41827+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41828+ break;\r
41829+\r
41830+ case SK_PNMI_HTX_OCTET:\r
41831+ case SK_PNMI_HRX_OCTET:\r
41832+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41833+ StatAddr[StatIndex][MacType].Reg,\r
41834+ &HighVal);\r
41835+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41836+ StatAddr[StatIndex + 1][MacType].Reg,\r
41837+ &LowVal);\r
41838+ break;\r
41839+\r
41840+ case SK_PNMI_HTX_BURST:\r
41841+ case SK_PNMI_HTX_EXCESS_DEF:\r
41842+ case SK_PNMI_HTX_CARRIER:\r
41843+ /* Not supported by GMAC. */\r
41844+ if (MacType == SK_MAC_GMAC) {\r
41845+ return (Val);\r
41846+ }\r
41847+\r
41848+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41849+ StatAddr[StatIndex][MacType].Reg,\r
41850+ &LowVal);\r
41851+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41852+ break;\r
41853+\r
41854+ case SK_PNMI_HTX_MACC:\r
41855+ /* GMAC only supports PAUSE MAC control frames. */\r
41856+ if (MacType == SK_MAC_GMAC) {\r
41857+ HelpIndex = SK_PNMI_HTX_PMACC;\r
41858+ }\r
41859+ else {\r
41860+ HelpIndex = StatIndex;\r
41861+ }\r
41862+ \r
41863+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41864+ StatAddr[HelpIndex][MacType].Reg,\r
41865+ &LowVal);\r
41866+\r
41867+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41868+ break;\r
41869+\r
41870+ case SK_PNMI_HTX_COL:\r
41871+ case SK_PNMI_HRX_UNDERSIZE:\r
41872+ /* Not supported by XMAC. */\r
41873+ if (MacType == SK_MAC_XMAC) {\r
41874+ return (Val);\r
41875+ }\r
41876+\r
41877+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41878+ StatAddr[StatIndex][MacType].Reg,\r
41879+ &LowVal);\r
41880+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41881+ break;\r
41882+\r
41883+ case SK_PNMI_HTX_DEFFERAL:\r
41884+ /* Not supported by GMAC. */\r
41885+ if (MacType == SK_MAC_GMAC) {\r
41886+ return (Val);\r
41887+ }\r
41888+ \r
41889+ /*\r
41890+ * XMAC counts frames with deferred transmission\r
41891+ * even in full-duplex mode.\r
41892+ *\r
41893+ * In full-duplex mode the counter remains constant!\r
41894+ */\r
41895+ if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOFULL) ||\r
41896+ (pPrt->PLinkModeStatus == SK_LMODE_STAT_FULL)) {\r
41897+\r
41898+ LowVal = 0;\r
41899+ HighVal = 0;\r
41900+ }\r
41901+ else {\r
41902+ /* Otherwise get contents of hardware register. */\r
41903+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41904+ StatAddr[StatIndex][MacType].Reg,\r
41905+ &LowVal);\r
41906+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41907+ }\r
41908+ break;\r
41909+\r
41910+ case SK_PNMI_HRX_BADOCTET:\r
41911+ /* Not supported by XMAC. */\r
41912+ if (MacType == SK_MAC_XMAC) {\r
41913+ return (Val);\r
41914+ }\r
41915+\r
41916+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41917+ StatAddr[StatIndex][MacType].Reg,\r
41918+ &HighVal);\r
41919+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41920+ StatAddr[StatIndex + 1][MacType].Reg,\r
41921+ &LowVal);\r
41922+ break;\r
41923+\r
41924+ case SK_PNMI_HTX_OCTETLOW:\r
41925+ case SK_PNMI_HRX_OCTETLOW:\r
41926+ case SK_PNMI_HRX_BADOCTETLOW:\r
41927+ return (Val);\r
41928+\r
41929+ case SK_PNMI_HRX_LONGFRAMES:\r
41930+ /* For XMAC the SW counter is managed by PNMI. */\r
41931+ if (MacType == SK_MAC_XMAC) {\r
41932+ return (pPnmiPrt->StatRxLongFrameCts);\r
41933+ }\r
41934+ \r
41935+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41936+ StatAddr[StatIndex][MacType].Reg,\r
41937+ &LowVal);\r
41938+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41939+ break;\r
41940+ \r
41941+ case SK_PNMI_HRX_TOO_LONG:\r
41942+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41943+ StatAddr[StatIndex][MacType].Reg,\r
41944+ &LowVal);\r
41945+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41946+ \r
41947+ Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal);\r
41948+\r
41949+ if (MacType == SK_MAC_GMAC) {\r
41950+ /* For GMAC the SW counter is additionally managed by PNMI. */\r
41951+ Val += pPnmiPrt->StatRxFrameTooLongCts;\r
41952+ }\r
41953+ else {\r
41954+ /*\r
41955+ * Frames longer than IEEE 802.3 frame max size are counted\r
41956+ * by XMAC in frame_too_long counter even reception of long\r
41957+ * frames was enabled and the frame was correct.\r
41958+ * So correct the value by subtracting RxLongFrame counter.\r
41959+ */\r
41960+ Val -= pPnmiPrt->StatRxLongFrameCts;\r
41961+ }\r
41962+\r
41963+ LowVal = (SK_U32)Val;\r
41964+ HighVal = (SK_U32)(Val >> 32);\r
41965+ break;\r
41966+ \r
41967+ case SK_PNMI_HRX_SHORTS:\r
41968+ /* Not supported by GMAC. */\r
41969+ if (MacType == SK_MAC_GMAC) {\r
41970+ /* GM_RXE_FRAG?? */\r
41971+ return (Val);\r
41972+ }\r
41973+ \r
41974+ /*\r
41975+ * XMAC counts short frame errors even if link down (#10620).\r
41976+ * If the link is down, the counter remains constant.\r
41977+ */\r
41978+ if (pPrt->PLinkModeStatus != SK_LMODE_STAT_UNKNOWN) {\r
41979+\r
41980+ /* Otherwise get incremental difference. */\r
41981+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
41982+ StatAddr[StatIndex][MacType].Reg,\r
41983+ &LowVal);\r
41984+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
41985+\r
41986+ Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal);\r
41987+ Val -= pPnmiPrt->RxShortZeroMark;\r
41988+\r
41989+ LowVal = (SK_U32)Val;\r
41990+ HighVal = (SK_U32)(Val >> 32);\r
41991+ }\r
41992+ break;\r
41993+\r
41994+ case SK_PNMI_HRX_MACC:\r
41995+ case SK_PNMI_HRX_MACC_UNKWN:\r
41996+ case SK_PNMI_HRX_BURST:\r
41997+ case SK_PNMI_HRX_MISSED:\r
41998+ case SK_PNMI_HRX_FRAMING:\r
41999+ case SK_PNMI_HRX_CARRIER:\r
42000+ case SK_PNMI_HRX_IRLENGTH:\r
42001+ case SK_PNMI_HRX_SYMBOL:\r
42002+ case SK_PNMI_HRX_CEXT:\r
42003+ /* Not supported by GMAC. */\r
42004+ if (MacType == SK_MAC_GMAC) {\r
42005+ return (Val);\r
42006+ }\r
42007+\r
42008+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
42009+ StatAddr[StatIndex][MacType].Reg,\r
42010+ &LowVal);\r
42011+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
42012+ break;\r
42013+\r
42014+ case SK_PNMI_HRX_PMACC_ERR:\r
42015+ /* For GMAC the SW counter is managed by PNMI. */\r
42016+ if (MacType == SK_MAC_GMAC) {\r
42017+ return (pPnmiPrt->StatRxPMaccErr);\r
42018+ }\r
42019+ \r
42020+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
42021+ StatAddr[StatIndex][MacType].Reg,\r
42022+ &LowVal);\r
42023+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
42024+ break;\r
42025+\r
42026+ /* SW counter managed by PNMI. */\r
42027+ case SK_PNMI_HTX_SYNC:\r
42028+ LowVal = (SK_U32)pPnmiPrt->StatSyncCts;\r
42029+ HighVal = (SK_U32)(pPnmiPrt->StatSyncCts >> 32);\r
42030+ break;\r
42031+\r
42032+ /* SW counter managed by PNMI. */\r
42033+ case SK_PNMI_HTX_SYNC_OCTET:\r
42034+ LowVal = (SK_U32)pPnmiPrt->StatSyncOctetsCts;\r
42035+ HighVal = (SK_U32)(pPnmiPrt->StatSyncOctetsCts >> 32);\r
42036+ break;\r
42037+\r
42038+ case SK_PNMI_HRX_FCS:\r
42039+ /*\r
42040+ * Broadcom filters FCS errors and counts them in\r
42041+ * Receive Error Counter register.\r
42042+ */\r
42043+ if (pPrt->PhyType == SK_PHY_BCOM) {\r
42044+#ifdef GENESIS\r
42045+ /* Do not read while not initialized (PHY_READ hangs!). */\r
42046+ if (pPrt->PState != SK_PRT_RESET) {\r
42047+ SkXmPhyRead(pAC, IoC, PhysPortIndex, PHY_BCOM_RE_CTR, &Word);\r
42048+ \r
42049+ LowVal = Word;\r
42050+ }\r
42051+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
42052+#endif /* GENESIS */\r
42053+ }\r
42054+ else {\r
42055+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
42056+ StatAddr[StatIndex][MacType].Reg,\r
42057+ &LowVal);\r
42058+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
42059+ }\r
42060+ break;\r
42061+\r
42062+ default:\r
42063+ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex,\r
42064+ StatAddr[StatIndex][MacType].Reg,\r
42065+ &LowVal);\r
42066+ HighVal = pPnmiPrt->CounterHigh[StatIndex];\r
42067+ break;\r
42068+ }\r
42069+\r
42070+ Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal);\r
42071+\r
42072+ /* Correct value because of possible XMAC reset (XMAC Errata #2). */\r
42073+ Val += pPnmiPrt->CounterOffset[StatIndex];\r
42074+\r
42075+ return (Val);\r
42076+}\r
42077+\r
42078+/*****************************************************************************\r
42079+ *\r
42080+ * ResetCounter - Set all counters and timestamps to zero\r
42081+ *\r
42082+ * Description:\r
42083+ * Notifies other common modules which store statistic data to\r
42084+ * reset their counters and finally reset our own counters.\r
42085+ *\r
42086+ * Returns:\r
42087+ * Nothing\r
42088+ */\r
42089+PNMI_STATIC void ResetCounter(\r
42090+SK_AC *pAC, /* Pointer to adapter context */\r
42091+SK_IOC IoC, /* IO context handle */\r
42092+SK_U32 NetIndex)\r
42093+{\r
42094+ unsigned int PhysPortIndex;\r
42095+ SK_EVPARA EventParam;\r
42096+\r
42097+ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));\r
42098+\r
42099+ /* Notify sensor module. */\r
42100+ SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_CLEAR, EventParam);\r
42101+\r
42102+ /* Notify RLMT module. */\r
42103+ EventParam.Para32[0] = NetIndex;\r
42104+ EventParam.Para32[1] = (SK_U32)-1;\r
42105+ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STATS_CLEAR, EventParam);\r
42106+ EventParam.Para32[1] = 0;\r
42107+\r
42108+ /* Notify SIRQ module. */\r
42109+ SkEventQueue(pAC, SKGE_HWAC, SK_HWEV_CLEAR_STAT, EventParam);\r
42110+\r
42111+ /* Notify CSUM module. */\r
42112+#ifdef SK_USE_CSUM\r
42113+ EventParam.Para32[0] = NetIndex;\r
42114+ EventParam.Para32[1] = (SK_U32)-1;\r
42115+ SkEventQueue(pAC, SKGE_CSUM, SK_CSUM_EVENT_CLEAR_PROTO_STATS,\r
42116+ EventParam);\r
42117+#endif /* SK_USE_CSUM */\r
42118+ \r
42119+ /* Clear XMAC statistics. */\r
42120+ for (PhysPortIndex = 0; PhysPortIndex <\r
42121+ (unsigned int)pAC->GIni.GIMacsFound; PhysPortIndex ++) {\r
42122+\r
42123+ (void)pAC->GIni.GIFunc.pFnMacResetCounter(pAC, IoC, PhysPortIndex);\r
42124+\r
42125+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].CounterHigh,\r
42126+ 0, sizeof(pAC->Pnmi.Port[PhysPortIndex].CounterHigh));\r
42127+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].\r
42128+ CounterOffset, 0, sizeof(pAC->Pnmi.Port[\r
42129+ PhysPortIndex].CounterOffset));\r
42130+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].StatSyncCts,\r
42131+ 0, sizeof(pAC->Pnmi.Port[PhysPortIndex].StatSyncCts));\r
42132+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].\r
42133+ StatSyncOctetsCts, 0, sizeof(pAC->Pnmi.Port[\r
42134+ PhysPortIndex].StatSyncOctetsCts));\r
42135+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].\r
42136+ StatRxLongFrameCts, 0, sizeof(pAC->Pnmi.Port[\r
42137+ PhysPortIndex].StatRxLongFrameCts));\r
42138+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].\r
42139+ StatRxFrameTooLongCts, 0, sizeof(pAC->Pnmi.Port[\r
42140+ PhysPortIndex].StatRxFrameTooLongCts));\r
42141+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].\r
42142+ StatRxPMaccErr, 0, sizeof(pAC->Pnmi.Port[\r
42143+ PhysPortIndex].StatRxPMaccErr));\r
42144+ }\r
42145+\r
42146+ /* Clear local statistics. */\r
42147+ SK_MEMSET((char *)&pAC->Pnmi.VirtualCounterOffset, 0,\r
42148+ sizeof(pAC->Pnmi.VirtualCounterOffset));\r
42149+ \r
42150+ pAC->Pnmi.RlmtChangeCts = 0;\r
42151+ pAC->Pnmi.RlmtChangeTime = 0;\r
42152+ \r
42153+ SK_MEMSET((char *)&pAC->Pnmi.RlmtChangeEstimate.EstValue[0], 0,\r
42154+ sizeof(pAC->Pnmi.RlmtChangeEstimate.EstValue));\r
42155+ pAC->Pnmi.RlmtChangeEstimate.EstValueIndex = 0;\r
42156+ pAC->Pnmi.RlmtChangeEstimate.Estimate = 0;\r
42157+ pAC->Pnmi.Port[NetIndex].TxSwQueueMax = 0;\r
42158+ pAC->Pnmi.Port[NetIndex].TxRetryCts = 0;\r
42159+ pAC->Pnmi.Port[NetIndex].RxIntrCts = 0;\r
42160+ pAC->Pnmi.Port[NetIndex].TxIntrCts = 0;\r
42161+ pAC->Pnmi.Port[NetIndex].RxNoBufCts = 0;\r
42162+ pAC->Pnmi.Port[NetIndex].TxNoBufCts = 0;\r
42163+ pAC->Pnmi.Port[NetIndex].TxUsedDescrNo = 0;\r
42164+ pAC->Pnmi.Port[NetIndex].RxDeliveredCts = 0;\r
42165+ pAC->Pnmi.Port[NetIndex].RxOctetsDeliveredCts = 0;\r
42166+ pAC->Pnmi.Port[NetIndex].ErrRecoveryCts = 0;\r
42167+}\r
42168+\r
42169+/*****************************************************************************\r
42170+ *\r
42171+ * GetTrapEntry - Get an entry in the trap buffer\r
42172+ *\r
42173+ * Description:\r
42174+ * The trap buffer stores various events. A user application somehow\r
42175+ * gets notified that an event occured and retrieves the trap buffer\r
42176+ * contens (or simply polls the buffer). The buffer is organized as\r
42177+ * a ring which stores the newest traps at the beginning. The oldest\r
42178+ * traps are overwritten by the newest ones. Each trap entry has a\r
42179+ * unique number, so that applications may detect new trap entries.\r
42180+ *\r
42181+ * Returns:\r
42182+ * A pointer to the trap entry\r
42183+ */\r
42184+PNMI_STATIC char* GetTrapEntry(\r
42185+SK_AC *pAC, /* Pointer to adapter context */\r
42186+SK_U32 TrapId, /* SNMP ID of the trap */\r
42187+unsigned int Size) /* Space needed for trap entry */\r
42188+{\r
42189+ unsigned int BufPad = pAC->Pnmi.TrapBufPad;\r
42190+ unsigned int BufFree = pAC->Pnmi.TrapBufFree;\r
42191+ unsigned int Beg = pAC->Pnmi.TrapQueueBeg;\r
42192+ unsigned int End = pAC->Pnmi.TrapQueueEnd;\r
42193+ char *pBuf = &pAC->Pnmi.TrapBuf[0];\r
42194+ int Wrap;\r
42195+ unsigned int NeededSpace;\r
42196+ unsigned int EntrySize;\r
42197+ SK_U32 Val32;\r
42198+ SK_U64 Val64;\r
42199+\r
42200+ /* Last byte of entry will get a copy of the entry length. */\r
42201+ Size ++;\r
42202+\r
42203+ /* Calculate needed buffer space. */\r
42204+ if (Beg >= Size) {\r
42205+\r
42206+ NeededSpace = Size;\r
42207+ Wrap = SK_FALSE;\r
42208+ }\r
42209+ else {\r
42210+ NeededSpace = Beg + Size;\r
42211+ Wrap = SK_TRUE;\r
42212+ }\r
42213+\r
42214+ /*\r
42215+ * Check if enough buffer space is provided. Otherwise\r
42216+ * free some entries. Leave one byte space between begin\r
42217+ * and end of buffer to make it possible to detect whether\r
42218+ * the buffer is full or empty.\r
42219+ */\r
42220+ while (BufFree < NeededSpace + 1) {\r
42221+\r
42222+ if (End == 0) {\r
42223+\r
42224+ End = SK_PNMI_TRAP_QUEUE_LEN;\r
42225+ }\r
42226+\r
42227+ EntrySize = (unsigned int)*((unsigned char *)pBuf + End - 1);\r
42228+ BufFree += EntrySize;\r
42229+ End -= EntrySize;\r
42230+#ifdef DEBUG\r
42231+ SK_MEMSET(pBuf + End, (char)(-1), EntrySize);\r
42232+#endif /* DEBUG */\r
42233+ if (End == BufPad) {\r
42234+#ifdef DEBUG\r
42235+ SK_MEMSET(pBuf, (char)(-1), End);\r
42236+#endif /* DEBUG */\r
42237+ BufFree += End;\r
42238+ End = 0;\r
42239+ BufPad = 0;\r
42240+ }\r
42241+ }\r
42242+\r
42243+ /*\r
42244+ * Insert new entry as first entry. Newest entries are\r
42245+ * stored at the beginning of the queue.\r
42246+ */\r
42247+ if (Wrap) {\r
42248+\r
42249+ BufPad = Beg;\r
42250+ Beg = SK_PNMI_TRAP_QUEUE_LEN - Size;\r
42251+ }\r
42252+ else {\r
42253+ Beg = Beg - Size;\r
42254+ }\r
42255+ BufFree -= NeededSpace;\r
42256+\r
42257+ /* Save the current offsets. */\r
42258+ pAC->Pnmi.TrapQueueBeg = Beg;\r
42259+ pAC->Pnmi.TrapQueueEnd = End;\r
42260+ pAC->Pnmi.TrapBufPad = BufPad;\r
42261+ pAC->Pnmi.TrapBufFree = BufFree;\r
42262+\r
42263+ /* Initialize the trap entry. */\r
42264+ *(pBuf + Beg + Size - 1) = (char)Size;\r
42265+ *(pBuf + Beg) = (char)Size;\r
42266+ Val32 = (pAC->Pnmi.TrapUnique) ++;\r
42267+ SK_PNMI_STORE_U32(pBuf + Beg + 1, Val32);\r
42268+ SK_PNMI_STORE_U32(pBuf + Beg + 1 + sizeof(SK_U32), TrapId);\r
42269+ Val64 = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));\r
42270+ SK_PNMI_STORE_U64(pBuf + Beg + 1 + 2 * sizeof(SK_U32), Val64);\r
42271+\r
42272+ return (pBuf + Beg);\r
42273+}\r
42274+\r
42275+/*****************************************************************************\r
42276+ *\r
42277+ * CopyTrapQueue - Copies the trap buffer for the TRAP OID\r
42278+ *\r
42279+ * Description:\r
42280+ * On a query of the TRAP OID the trap buffer contents will be\r
42281+ * copied continuously to the request buffer, which must be large\r
42282+ * enough. No length check is performed.\r
42283+ *\r
42284+ * Returns:\r
42285+ * Nothing\r
42286+ */\r
42287+PNMI_STATIC void CopyTrapQueue(\r
42288+SK_AC *pAC, /* Pointer to adapter context */\r
42289+char *pDstBuf) /* Buffer to which the queued traps will be copied */\r
42290+{\r
42291+ unsigned int BufPad = pAC->Pnmi.TrapBufPad;\r
42292+ unsigned int Trap = pAC->Pnmi.TrapQueueBeg;\r
42293+ unsigned int End = pAC->Pnmi.TrapQueueEnd;\r
42294+ char *pBuf = &pAC->Pnmi.TrapBuf[0];\r
42295+ unsigned int Len;\r
42296+ unsigned int DstOff = 0;\r
42297+\r
42298+ while (Trap != End) {\r
42299+\r
42300+ Len = (unsigned int)*(pBuf + Trap);\r
42301+\r
42302+ /*\r
42303+ * Last byte containing a copy of the length will\r
42304+ * not be copied.\r
42305+ */\r
42306+ *(pDstBuf + DstOff) = (char)(Len - 1);\r
42307+ SK_MEMCPY(pDstBuf + DstOff + 1, pBuf + Trap + 1, Len - 2);\r
42308+ DstOff += Len - 1;\r
42309+\r
42310+ Trap += Len;\r
42311+ if (Trap == SK_PNMI_TRAP_QUEUE_LEN) {\r
42312+\r
42313+ Trap = BufPad;\r
42314+ }\r
42315+ }\r
42316+}\r
42317+\r
42318+/*****************************************************************************\r
42319+ *\r
42320+ * GetTrapQueueLen - Get the length of the trap buffer\r
42321+ *\r
42322+ * Description:\r
42323+ * Evaluates the number of currently stored traps and the needed\r
42324+ * buffer size to retrieve them.\r
42325+ *\r
42326+ * Returns:\r
42327+ * Nothing\r
42328+ */\r
42329+PNMI_STATIC void GetTrapQueueLen(\r
42330+SK_AC *pAC, /* Pointer to adapter context */\r
42331+unsigned int *pLen, /* Length in Bytes of all queued traps */\r
42332+unsigned int *pEntries) /* Returns number of trapes stored in queue */\r
42333+{\r
42334+ unsigned int BufPad = pAC->Pnmi.TrapBufPad;\r
42335+ unsigned int Trap = pAC->Pnmi.TrapQueueBeg;\r
42336+ unsigned int End = pAC->Pnmi.TrapQueueEnd;\r
42337+ char *pBuf = &pAC->Pnmi.TrapBuf[0];\r
42338+ unsigned int Len;\r
42339+ unsigned int Entries = 0;\r
42340+ unsigned int TotalLen = 0;\r
42341+\r
42342+ while (Trap != End) {\r
42343+\r
42344+ Len = (unsigned int)*(pBuf + Trap);\r
42345+ TotalLen += Len - 1;\r
42346+ Entries ++;\r
42347+\r
42348+ Trap += Len;\r
42349+ if (Trap == SK_PNMI_TRAP_QUEUE_LEN) {\r
42350+\r
42351+ Trap = BufPad;\r
42352+ }\r
42353+ }\r
42354+\r
42355+ *pEntries = Entries;\r
42356+ *pLen = TotalLen;\r
42357+}\r
42358+\r
42359+/*****************************************************************************\r
42360+ *\r
42361+ * QueueSimpleTrap - Store a simple trap to the trap buffer\r
42362+ *\r
42363+ * Description:\r
42364+ * A simple trap is a trap with now additional data. It consists\r
42365+ * simply of a trap code.\r
42366+ *\r
42367+ * Returns:\r
42368+ * Nothing\r
42369+ */\r
42370+PNMI_STATIC void QueueSimpleTrap(\r
42371+SK_AC *pAC, /* Pointer to adapter context */\r
42372+SK_U32 TrapId) /* Type of sensor trap */\r
42373+{\r
42374+ GetTrapEntry(pAC, TrapId, SK_PNMI_TRAP_SIMPLE_LEN);\r
42375+}\r
42376+\r
42377+/*****************************************************************************\r
42378+ *\r
42379+ * QueueSensorTrap - Stores a sensor trap in the trap buffer\r
42380+ *\r
42381+ * Description:\r
42382+ * Gets an entry in the trap buffer and fills it with sensor related\r
42383+ * data.\r
42384+ *\r
42385+ * Returns:\r
42386+ * Nothing\r
42387+ */\r
42388+PNMI_STATIC void QueueSensorTrap(\r
42389+SK_AC *pAC, /* Pointer to adapter context */\r
42390+SK_U32 TrapId, /* Type of sensor trap */\r
42391+unsigned int SensorIndex) /* Index of sensor which caused the trap */\r
42392+{\r
42393+ char *pBuf;\r
42394+ unsigned int Offset;\r
42395+ unsigned int DescrLen;\r
42396+ SK_U32 Val32;\r
42397+\r
42398+ /* Get trap buffer entry. */\r
42399+ DescrLen = SK_STRLEN(pAC->I2c.SenTable[SensorIndex].SenDesc);\r
42400+ \r
42401+ pBuf = GetTrapEntry(pAC, TrapId,\r
42402+ SK_PNMI_TRAP_SENSOR_LEN_BASE + DescrLen);\r
42403+ Offset = SK_PNMI_TRAP_SIMPLE_LEN;\r
42404+\r
42405+ /* Store additionally sensor trap related data. */\r
42406+ Val32 = OID_SKGE_SENSOR_INDEX;\r
42407+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
42408+ *(pBuf + Offset + 4) = 4;\r
42409+ Val32 = (SK_U32)SensorIndex;\r
42410+ SK_PNMI_STORE_U32(pBuf + Offset + 5, Val32);\r
42411+ Offset += 9;\r
42412+ \r
42413+ Val32 = (SK_U32)OID_SKGE_SENSOR_DESCR;\r
42414+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
42415+ *(pBuf + Offset + 4) = (char)DescrLen;\r
42416+ SK_MEMCPY(pBuf + Offset + 5, pAC->I2c.SenTable[SensorIndex].SenDesc,\r
42417+ DescrLen);\r
42418+ Offset += DescrLen + 5;\r
42419+\r
42420+ Val32 = OID_SKGE_SENSOR_TYPE;\r
42421+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
42422+ *(pBuf + Offset + 4) = 1;\r
42423+ *(pBuf + Offset + 5) = (char)pAC->I2c.SenTable[SensorIndex].SenType;\r
42424+ Offset += 6;\r
42425+\r
42426+ Val32 = OID_SKGE_SENSOR_VALUE;\r
42427+ SK_PNMI_STORE_U32(pBuf + Offset, Val32);\r
42428+ *(pBuf + Offset + 4) = 4;\r
42429+ Val32 = (SK_U32)pAC->I2c.SenTable[SensorIndex].SenValue;\r
42430+ SK_PNMI_STORE_U32(pBuf + Offset + 5, Val32);\r
42431+}\r
42432+\r
42433+/*****************************************************************************\r
42434+ *\r
42435+ * QueueRlmtNewMacTrap - Store a port switch trap in the trap buffer\r
42436+ *\r
42437+ * Description:\r
42438+ * Nothing further to explain.\r
42439+ *\r
42440+ * Returns:\r
42441+ * Nothing\r
42442+ */\r
42443+PNMI_STATIC void QueueRlmtNewMacTrap(\r
42444+SK_AC *pAC, /* Pointer to adapter context */\r
42445+unsigned int ActiveMac) /* Index (0..n) of the currently active port */\r
42446+{\r
42447+ char *pBuf;\r
42448+ SK_U32 Val32;\r
42449+\r
42450+ pBuf = GetTrapEntry(pAC, OID_SKGE_TRAP_RLMT_CHANGE_PORT,\r
42451+ SK_PNMI_TRAP_RLMT_CHANGE_LEN);\r
42452+\r
42453+ Val32 = OID_SKGE_RLMT_PORT_ACTIVE;\r
42454+ SK_PNMI_STORE_U32(pBuf + SK_PNMI_TRAP_SIMPLE_LEN, Val32);\r
42455+ *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 4) = 1;\r
42456+ *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 5) = (char)ActiveMac;\r
42457+}\r
42458+\r
42459+/*****************************************************************************\r
42460+ *\r
42461+ * QueueRlmtPortTrap - Store port related RLMT trap to trap buffer\r
42462+ *\r
42463+ * Description:\r
42464+ * Nothing further to explain.\r
42465+ *\r
42466+ * Returns:\r
42467+ * Nothing\r
42468+ */\r
42469+PNMI_STATIC void QueueRlmtPortTrap(\r
42470+SK_AC *pAC, /* Pointer to adapter context */\r
42471+SK_U32 TrapId, /* Type of RLMT port trap */\r
42472+unsigned int PortIndex) /* Index of the port, which changed its state */\r
42473+{\r
42474+ char *pBuf;\r
42475+ SK_U32 Val32;\r
42476+\r
42477+ pBuf = GetTrapEntry(pAC, TrapId, SK_PNMI_TRAP_RLMT_PORT_LEN);\r
42478+\r
42479+ Val32 = OID_SKGE_RLMT_PORT_INDEX;\r
42480+ SK_PNMI_STORE_U32(pBuf + SK_PNMI_TRAP_SIMPLE_LEN, Val32);\r
42481+ *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 4) = 1;\r
42482+ *(pBuf + SK_PNMI_TRAP_SIMPLE_LEN + 5) = (char)PortIndex;\r
42483+}\r
42484+\r
42485+/*****************************************************************************\r
42486+ *\r
42487+ * CopyMac - Copies a MAC address\r
42488+ *\r
42489+ * Description:\r
42490+ * Nothing further to explain.\r
42491+ *\r
42492+ * Returns:\r
42493+ * Nothing\r
42494+ */\r
42495+PNMI_STATIC void CopyMac(\r
42496+char *pDst, /* Pointer to destination buffer */\r
42497+SK_MAC_ADDR *pMac) /* Pointer of Source */\r
42498+{\r
42499+ int i;\r
42500+\r
42501+ for (i = 0; i < sizeof(SK_MAC_ADDR); i ++) {\r
42502+\r
42503+ *(pDst + i) = pMac->a[i];\r
42504+ }\r
42505+}\r
42506+\r
42507+#ifdef SK_POWER_MGMT\r
42508+/*****************************************************************************\r
42509+ *\r
42510+ * PowerManagement - OID handler function of PowerManagement OIDs\r
42511+ *\r
42512+ * Description:\r
42513+ * The code is simple. No description necessary.\r
42514+ *\r
42515+ * Returns:\r
42516+ * SK_PNMI_ERR_OK The request was successfully performed.\r
42517+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
42518+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
42519+ * the correct data (e.g. a 32bit value is\r
42520+ * needed, but a 16 bit value was passed).\r
42521+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
42522+ * exist (e.g. port instance 3 on a two port\r
42523+ * adapter.\r
42524+ */\r
42525+\r
42526+PNMI_STATIC int PowerManagement(\r
42527+SK_AC *pAC, /* Pointer to adapter context */\r
42528+SK_IOC IoC, /* IO context handle */\r
42529+int Action, /* Get/PreSet/Set action */\r
42530+SK_U32 Id, /* Object ID that is to be processed */\r
42531+char *pBuf, /* Buffer to which to mgmt data will be retrieved */\r
42532+unsigned int *pLen, /* On call: buffer length. On return: used buffer */\r
42533+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
42534+unsigned int TableIndex, /* Index to the Id table */\r
42535+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */\r
42536+{\r
42537+ \r
42538+ int i;\r
42539+ unsigned int HwPortIndex;\r
42540+ \r
42541+ SK_U32 RetCode = SK_PNMI_ERR_GENERAL;\r
42542+\r
42543+ /* Check instance. We only handle single instance variables. */\r
42544+ if ((Instance != (SK_U32)(-1))) {\r
42545+\r
42546+ *pLen = 0;\r
42547+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
42548+ }\r
42549+\r
42550+ /* Get hardware port index */\r
42551+ HwPortIndex = NetIndex;\r
42552+ \r
42553+ /* Check length. */\r
42554+ switch (Id) {\r
42555+\r
42556+ case OID_PNP_CAPABILITIES:\r
42557+ if (*pLen < sizeof(SK_PNP_CAPABILITIES)) {\r
42558+\r
42559+ *pLen = sizeof(SK_PNP_CAPABILITIES);\r
42560+ return (SK_PNMI_ERR_TOO_SHORT);\r
42561+ }\r
42562+ break;\r
42563+\r
42564+ case OID_PNP_SET_POWER:\r
42565+ case OID_PNP_QUERY_POWER:\r
42566+ if (*pLen < sizeof(SK_DEVICE_POWER_STATE))\r
42567+ {\r
42568+ *pLen = sizeof(SK_DEVICE_POWER_STATE);\r
42569+ return (SK_PNMI_ERR_TOO_SHORT);\r
42570+ }\r
42571+ break;\r
42572+\r
42573+ case OID_PNP_ADD_WAKE_UP_PATTERN:\r
42574+ case OID_PNP_REMOVE_WAKE_UP_PATTERN:\r
42575+ if (*pLen < sizeof(SK_PM_PACKET_PATTERN)) {\r
42576+\r
42577+ *pLen = sizeof(SK_PM_PACKET_PATTERN);\r
42578+ return (SK_PNMI_ERR_TOO_SHORT);\r
42579+ }\r
42580+ break;\r
42581+\r
42582+ case OID_PNP_ENABLE_WAKE_UP:\r
42583+ if (*pLen < sizeof(SK_U32)) {\r
42584+\r
42585+ *pLen = sizeof(SK_U32);\r
42586+ return (SK_PNMI_ERR_TOO_SHORT);\r
42587+ }\r
42588+ break;\r
42589+ }\r
42590+ \r
42591+ /* Perform action. */\r
42592+ if (Action == SK_PNMI_GET) {\r
42593+\r
42594+ /* Get value. */\r
42595+ switch (Id) {\r
42596+\r
42597+ case OID_PNP_CAPABILITIES:\r
42598+ RetCode = SkPowerQueryPnPCapabilities(pAC, IoC, pBuf, pLen);\r
42599+ break;\r
42600+\r
42601+ case OID_PNP_QUERY_POWER:\r
42602+ /*\r
42603+ * The Windows DDK describes: An OID_PNP_QUERY_POWER requests\r
42604+ * the miniport to indicate whether it can transition its NIC\r
42605+ * to the low-power state.\r
42606+ * A miniport driver must always return NDIS_STATUS_SUCCESS\r
42607+ * to a query of OID_PNP_QUERY_POWER.\r
42608+ */\r
42609+ *pLen = sizeof(SK_DEVICE_POWER_STATE);\r
42610+ RetCode = SK_PNMI_ERR_OK;\r
42611+ break;\r
42612+\r
42613+ /*\r
42614+ * NDIS handles these OIDs as write-only.\r
42615+ * So in case of get action the buffer with written length = 0\r
42616+ * is returned.\r
42617+ */\r
42618+ case OID_PNP_SET_POWER:\r
42619+ case OID_PNP_ADD_WAKE_UP_PATTERN:\r
42620+ case OID_PNP_REMOVE_WAKE_UP_PATTERN:\r
42621+ *pLen = 0; \r
42622+ RetCode = SK_PNMI_ERR_NOT_SUPPORTED;\r
42623+ break;\r
42624+\r
42625+ case OID_PNP_ENABLE_WAKE_UP:\r
42626+ RetCode = SkPowerGetEnableWakeUp(pAC, IoC, HwPortIndex, pBuf, pLen);\r
42627+ break;\r
42628+\r
42629+ default:\r
42630+ RetCode = SK_PNMI_ERR_GENERAL;\r
42631+ break;\r
42632+ }\r
42633+\r
42634+ return (RetCode);\r
42635+ }\r
42636+ \r
42637+ /* Perform PRESET or SET. */\r
42638+ \r
42639+ /* The POWER module does not support PRESET action. */\r
42640+ if (Action == SK_PNMI_PRESET) {\r
42641+\r
42642+ return (SK_PNMI_ERR_OK);\r
42643+ }\r
42644+\r
42645+ /* */\r
42646+ i= HwPortIndex;\r
42647+\r
42648+ switch (Id) {\r
42649+ case OID_PNP_SET_POWER:\r
42650+ /* Dual net mode? */\r
42651+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {\r
42652+ if (RetCode = SkPowerSetPower(pAC, IoC, i, pBuf, pLen)) {\r
42653+ break;\r
42654+ }\r
42655+ }\r
42656+ break;\r
42657+\r
42658+ case OID_PNP_ADD_WAKE_UP_PATTERN:\r
42659+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {\r
42660+ if (RetCode = SkPowerAddWakeUpPattern(pAC, IoC, i, pBuf, pLen)) {\r
42661+ break;\r
42662+ }\r
42663+ }\r
42664+ break;\r
42665+ \r
42666+ case OID_PNP_REMOVE_WAKE_UP_PATTERN:\r
42667+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {\r
42668+ if (RetCode = SkPowerRemoveWakeUpPattern(pAC, IoC, i, pBuf, pLen)) {\r
42669+ break;\r
42670+ }\r
42671+ }\r
42672+ break;\r
42673+ \r
42674+ case OID_PNP_ENABLE_WAKE_UP:\r
42675+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {\r
42676+ if (RetCode = SkPowerSetEnableWakeUp(pAC, IoC, i, pBuf, pLen)) {\r
42677+ break;\r
42678+ }\r
42679+ }\r
42680+ break;\r
42681+ \r
42682+ default:\r
42683+ RetCode = SK_PNMI_ERR_READ_ONLY;\r
42684+ }\r
42685+ \r
42686+ return (RetCode);\r
42687+}\r
42688+#endif /* SK_POWER_MGMT */\r
42689+\r
42690+#ifdef SK_DIAG_SUPPORT\r
42691+/*****************************************************************************\r
42692+ *\r
42693+ * DiagActions - OID handler function of Diagnostic driver\r
42694+ *\r
42695+ * Description:\r
42696+ * The code is simple. No description necessary.\r
42697+ *\r
42698+ * Returns:\r
42699+ * SK_PNMI_ERR_OK The request was successfully performed.\r
42700+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
42701+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
42702+ * the correct data (e.g. a 32bit value is\r
42703+ * needed, but a 16 bit value was passed).\r
42704+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
42705+ * exist (e.g. port instance 3 on a two port\r
42706+ * adapter.\r
42707+ */\r
42708+\r
42709+PNMI_STATIC int DiagActions(\r
42710+SK_AC *pAC, /* Pointer to adapter context */\r
42711+SK_IOC IoC, /* IO context handle */\r
42712+int Action, /* GET/PRESET/SET action */\r
42713+SK_U32 Id, /* Object ID that is to be processed */\r
42714+char *pBuf, /* Buffer used for the management data transfer */\r
42715+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
42716+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
42717+unsigned int TableIndex, /* Index to the Id table */\r
42718+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
42719+{\r
42720+ SK_U32 DiagStatus;\r
42721+ SK_U32 RetCode = SK_PNMI_ERR_GENERAL;\r
42722+\r
42723+ /* Check instance. We only handle single instance variables. */\r
42724+ if (Instance != (SK_U32)(-1) && Instance != 1) {\r
42725+\r
42726+ *pLen = 0;\r
42727+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
42728+ }\r
42729+\r
42730+ /* Check length. */\r
42731+ switch (Id) {\r
42732+\r
42733+ case OID_SKGE_DIAG_MODE:\r
42734+ if (*pLen < sizeof(SK_U32)) {\r
42735+\r
42736+ *pLen = sizeof(SK_U32);\r
42737+ return (SK_PNMI_ERR_TOO_SHORT);\r
42738+ }\r
42739+ break;\r
42740+\r
42741+ default:\r
42742+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR040, SK_PNMI_ERR040MSG);\r
42743+ *pLen = 0;\r
42744+ return (SK_PNMI_ERR_GENERAL);\r
42745+ }\r
42746+\r
42747+ /* Perform action. */\r
42748+ if (Action == SK_PNMI_GET) {\r
42749+\r
42750+ /* Get value. */\r
42751+ switch (Id) {\r
42752+\r
42753+ case OID_SKGE_DIAG_MODE:\r
42754+ DiagStatus = pAC->Pnmi.DiagAttached;\r
42755+ SK_PNMI_STORE_U32(pBuf, DiagStatus);\r
42756+ *pLen = sizeof(SK_U32); \r
42757+ RetCode = SK_PNMI_ERR_OK;\r
42758+ break;\r
42759+\r
42760+ default:\r
42761+ *pLen = 0; \r
42762+ RetCode = SK_PNMI_ERR_GENERAL;\r
42763+ break;\r
42764+ }\r
42765+ return (RetCode);\r
42766+ }\r
42767+\r
42768+ /* From here SET or PRESET value. */\r
42769+ \r
42770+ /* PRESET value is not supported. */\r
42771+ if (Action == SK_PNMI_PRESET) {\r
42772+\r
42773+ return (SK_PNMI_ERR_OK);\r
42774+ }\r
42775+\r
42776+ /* SET value. */\r
42777+ switch (Id) {\r
42778+ case OID_SKGE_DIAG_MODE:\r
42779+\r
42780+ /* Handle the SET. */\r
42781+ switch (*pBuf) {\r
42782+\r
42783+ /* Attach the DIAG to this adapter. */\r
42784+ case SK_DIAG_ATTACHED:\r
42785+ /* Check if we come from running. */\r
42786+ if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {\r
42787+\r
42788+ RetCode = SkDrvLeaveDiagMode(pAC);\r
42789+\r
42790+ }\r
42791+ else if (pAC->Pnmi.DiagAttached == SK_DIAG_IDLE) {\r
42792+\r
42793+ RetCode = SK_PNMI_ERR_OK;\r
42794+ } \r
42795+ \r
42796+ else {\r
42797+\r
42798+ RetCode = SK_PNMI_ERR_GENERAL;\r
42799+\r
42800+ }\r
42801+ \r
42802+ if (RetCode == SK_PNMI_ERR_OK) {\r
42803+\r
42804+ pAC->Pnmi.DiagAttached = SK_DIAG_ATTACHED;\r
42805+ }\r
42806+ break;\r
42807+\r
42808+ /* Enter the DIAG mode in the driver. */\r
42809+ case SK_DIAG_RUNNING:\r
42810+ RetCode = SK_PNMI_ERR_OK;\r
42811+ \r
42812+ /*\r
42813+ * If DiagAttached is set, we can tell the driver\r
42814+ * to enter the DIAG mode.\r
42815+ */\r
42816+ if (pAC->Pnmi.DiagAttached == SK_DIAG_ATTACHED) {\r
42817+ /* If DiagMode is not active, we can enter it. */\r
42818+ if (!pAC->DiagModeActive) {\r
42819+\r
42820+ RetCode = SkDrvEnterDiagMode(pAC);\r
42821+ }\r
42822+ else {\r
42823+\r
42824+ RetCode = SK_PNMI_ERR_GENERAL;\r
42825+ }\r
42826+ }\r
42827+ else {\r
42828+\r
42829+ RetCode = SK_PNMI_ERR_GENERAL;\r
42830+ }\r
42831+ \r
42832+ if (RetCode == SK_PNMI_ERR_OK) {\r
42833+\r
42834+ pAC->Pnmi.DiagAttached = SK_DIAG_RUNNING;\r
42835+ }\r
42836+ break;\r
42837+\r
42838+ case SK_DIAG_IDLE:\r
42839+ /* Check if we come from running. */\r
42840+ if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {\r
42841+\r
42842+ RetCode = SkDrvLeaveDiagMode(pAC);\r
42843+\r
42844+ }\r
42845+ else if (pAC->Pnmi.DiagAttached == SK_DIAG_ATTACHED) {\r
42846+\r
42847+ RetCode = SK_PNMI_ERR_OK;\r
42848+ } \r
42849+ \r
42850+ else {\r
42851+\r
42852+ RetCode = SK_PNMI_ERR_GENERAL;\r
42853+\r
42854+ }\r
42855+\r
42856+ if (RetCode == SK_PNMI_ERR_OK) {\r
42857+\r
42858+ pAC->Pnmi.DiagAttached = SK_DIAG_IDLE;\r
42859+ }\r
42860+ break;\r
42861+\r
42862+ default:\r
42863+ RetCode = SK_PNMI_ERR_BAD_VALUE;\r
42864+ break;\r
42865+ }\r
42866+ break;\r
42867+\r
42868+ default:\r
42869+ RetCode = SK_PNMI_ERR_GENERAL;\r
42870+ }\r
42871+\r
42872+ if (RetCode == SK_PNMI_ERR_OK) {\r
42873+ *pLen = sizeof(SK_U32);\r
42874+ }\r
42875+ else {\r
42876+\r
42877+ *pLen = 0;\r
42878+ }\r
42879+ return (RetCode);\r
42880+}\r
42881+#endif /* SK_DIAG_SUPPORT */\r
42882+\r
42883+/*****************************************************************************\r
42884+ *\r
42885+ * Vct - OID handler function of OIDs for Virtual Cable Tester (VCT)\r
42886+ *\r
42887+ * Description:\r
42888+ * The code is simple. No description necessary.\r
42889+ *\r
42890+ * Returns:\r
42891+ * SK_PNMI_ERR_OK The request was performed successfully.\r
42892+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
42893+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
42894+ * the correct data (e.g. a 32bit value is\r
42895+ * needed, but a 16 bit value was passed).\r
42896+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
42897+ * exist (e.g. port instance 3 on a two port\r
42898+ * adapter).\r
42899+ * SK_PNMI_ERR_READ_ONLY Only the Get action is allowed.\r
42900+ *\r
42901+ */\r
42902+\r
42903+PNMI_STATIC int Vct(\r
42904+SK_AC *pAC, /* Pointer to adapter context */\r
42905+SK_IOC IoC, /* IO context handle */\r
42906+int Action, /* GET/PRESET/SET action */\r
42907+SK_U32 Id, /* Object ID that is to be processed */\r
42908+char *pBuf, /* Buffer used for the management data transfer */\r
42909+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
42910+SK_U32 Instance, /* Instance (-1,2..n) that is to be queried */\r
42911+unsigned int TableIndex, /* Index to the Id table */\r
42912+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
42913+{\r
42914+ SK_GEPORT *pPrt;\r
42915+ SK_PNMI_VCT *pVctBackupData;\r
42916+ SK_U32 LogPortMax;\r
42917+ SK_U32 PhysPortMax;\r
42918+ SK_U32 PhysPortIndex;\r
42919+ SK_U32 Limit;\r
42920+ SK_U32 Offset;\r
42921+ SK_U32 RetCode;\r
42922+ int i;\r
42923+ SK_EVPARA Para;\r
42924+\r
42925+ RetCode = SK_PNMI_ERR_GENERAL;\r
42926+\r
42927+ /* Calculate the port indexes from the instance. */\r
42928+ PhysPortMax = pAC->GIni.GIMacsFound;\r
42929+ LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);\r
42930+\r
42931+ /* Dual net mode? */\r
42932+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
42933+ LogPortMax--;\r
42934+ }\r
42935+\r
42936+ if ((Instance != (SK_U32) (-1))) {\r
42937+ /*\r
42938+ * Get one instance of that OID, so check the instance range:\r
42939+ * There is no virtual port with an Instance == 1, so we get\r
42940+ * the values from one physical port only.\r
42941+ */ \r
42942+ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) {\r
42943+ PhysPortIndex = NetIndex;\r
42944+ }\r
42945+ else {\r
42946+ if ((Instance < 2) || (Instance > LogPortMax)) {\r
42947+ *pLen = 0;\r
42948+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
42949+ }\r
42950+ PhysPortIndex = Instance - 2;\r
42951+ }\r
42952+ Limit = PhysPortIndex + 1;\r
42953+ }\r
42954+ else {\r
42955+ /*\r
42956+ * Instance == (SK_U32) (-1), so get all instances of that OID.\r
42957+ * There is no virtual port with an Instance == 1, so we get\r
42958+ * the values from all physical ports.\r
42959+ */\r
42960+ PhysPortIndex = 0;\r
42961+ Limit = PhysPortMax;\r
42962+ }\r
42963+\r
42964+ /* Check MAC type. */\r
42965+ if ((Id != OID_SKGE_VCT_CAPABILITIES) &&\r
42966+ (pAC->GIni.GP[PhysPortIndex].PhyType != SK_PHY_MARV_COPPER)) {\r
42967+ *pLen = 0;\r
42968+ return (SK_PNMI_ERR_NOT_SUPPORTED);\r
42969+ }\r
42970+\r
42971+ /* Check action type. */\r
42972+ if (Action == SK_PNMI_GET) {\r
42973+ /* Check length. */\r
42974+ switch (Id) {\r
42975+\r
42976+ case OID_SKGE_VCT_GET:\r
42977+ if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_PNMI_VCT)) {\r
42978+ *pLen = (Limit - PhysPortIndex) * sizeof(SK_PNMI_VCT);\r
42979+ return (SK_PNMI_ERR_TOO_SHORT);\r
42980+ }\r
42981+ break;\r
42982+\r
42983+ case OID_SKGE_VCT_STATUS:\r
42984+ case OID_SKGE_VCT_CAPABILITIES:\r
42985+ if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U8)) {\r
42986+ *pLen = (Limit - PhysPortIndex) * sizeof(SK_U8);\r
42987+ return (SK_PNMI_ERR_TOO_SHORT);\r
42988+ }\r
42989+ break;\r
42990+\r
42991+ default:\r
42992+ *pLen = 0;\r
42993+ return (SK_PNMI_ERR_GENERAL);\r
42994+ } \r
42995+\r
42996+ /* Get value. */\r
42997+ Offset = 0;\r
42998+ for (; PhysPortIndex < Limit; PhysPortIndex++) {\r
42999+\r
43000+ pPrt = &pAC->GIni.GP[PhysPortIndex];\r
43001+\r
43002+ switch (Id) {\r
43003+\r
43004+ case OID_SKGE_VCT_GET:\r
43005+ if (!pPrt->PHWLinkUp &&\r
43006+ (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING)) {\r
43007+\r
43008+ RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE);\r
43009+\r
43010+ if (RetCode == 0) {\r
43011+\r
43012+ /* VCT test is finished, so save the data. */\r
43013+ VctGetResults(pAC, IoC, PhysPortIndex);\r
43014+\r
43015+ Para.Para32[0] = PhysPortIndex;\r
43016+ Para.Para32[1] = -1;\r
43017+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Para);\r
43018+\r
43019+ /* SkEventDispatcher(pAC, IoC); */\r
43020+ }\r
43021+ }\r
43022+\r
43023+ /* Initialize backup data pointer. */\r
43024+ pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex];\r
43025+\r
43026+ /* Get all results. */\r
43027+ CheckVctStatus(pAC, IoC, pBuf, Offset, PhysPortIndex);\r
43028+\r
43029+ Offset++;\r
43030+ *(pBuf + Offset) = pPrt->PCableLen;\r
43031+ Offset++;\r
43032+ for (i = 0; i < 4; i++) {\r
43033+\r
43034+ SK_PNMI_STORE_U32((pBuf + Offset), pVctBackupData->MdiPairLen[i]);\r
43035+ Offset += sizeof(SK_U32);\r
43036+ }\r
43037+ for (i = 0; i < 4; i++) {\r
43038+\r
43039+ *(pBuf + Offset) = pVctBackupData->MdiPairSts[i];\r
43040+ Offset++;\r
43041+ }\r
43042+\r
43043+ RetCode = SK_PNMI_ERR_OK;\r
43044+ break;\r
43045+\r
43046+ case OID_SKGE_VCT_STATUS:\r
43047+ CheckVctStatus(pAC, IoC, pBuf, Offset, PhysPortIndex);\r
43048+\r
43049+ Offset++;\r
43050+ RetCode = SK_PNMI_ERR_OK;\r
43051+ break;\r
43052+\r
43053+ case OID_SKGE_VCT_CAPABILITIES:\r
43054+ if (pPrt->PhyType != SK_PHY_MARV_COPPER) {\r
43055+ *(pBuf + Offset) = SK_PNMI_VCT_NOT_SUPPORTED;\r
43056+ }\r
43057+ else {\r
43058+ *(pBuf + Offset) = SK_PNMI_VCT_SUPPORTED;\r
43059+ }\r
43060+ Offset++;\r
43061+\r
43062+ RetCode = SK_PNMI_ERR_OK;\r
43063+ break;\r
43064+\r
43065+ default:\r
43066+ *pLen = 0;\r
43067+ return (SK_PNMI_ERR_GENERAL);\r
43068+ }\r
43069+ } /* for */\r
43070+ *pLen = Offset;\r
43071+ return (RetCode);\r
43072+\r
43073+ } /* if SK_PNMI_GET */\r
43074+\r
43075+ /*\r
43076+ * From here SET or PRESET action. Check if the passed\r
43077+ * buffer length is plausible.\r
43078+ */\r
43079+\r
43080+ /* Check length. */\r
43081+ switch (Id) {\r
43082+ case OID_SKGE_VCT_SET:\r
43083+ if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U32)) {\r
43084+ *pLen = (Limit - PhysPortIndex) * sizeof(SK_U32);\r
43085+ return (SK_PNMI_ERR_TOO_SHORT);\r
43086+ }\r
43087+ break;\r
43088+\r
43089+ default:\r
43090+ *pLen = 0;\r
43091+ return (SK_PNMI_ERR_GENERAL);\r
43092+ }\r
43093+\r
43094+ /* Perform PRESET or SET. */\r
43095+\r
43096+ /* VCT does not support PRESET action. */\r
43097+ if (Action == SK_PNMI_PRESET) {\r
43098+\r
43099+ return (SK_PNMI_ERR_OK);\r
43100+ }\r
43101+\r
43102+ Offset = 0;\r
43103+ for (; PhysPortIndex < Limit; PhysPortIndex++) {\r
43104+\r
43105+ pPrt = &pAC->GIni.GP[PhysPortIndex];\r
43106+\r
43107+ switch (Id) {\r
43108+ case OID_SKGE_VCT_SET: /* Start VCT test. */\r
43109+ if (!pPrt->PHWLinkUp) {\r
43110+ SkGeStopPort(pAC, IoC, PhysPortIndex, SK_STOP_ALL, SK_SOFT_RST);\r
43111+\r
43112+ RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_TRUE);\r
43113+\r
43114+ if (RetCode == 0) { /* RetCode: 0 => Start! */\r
43115+ pAC->Pnmi.VctStatus[PhysPortIndex] |= SK_PNMI_VCT_PENDING;\r
43116+ pAC->Pnmi.VctStatus[PhysPortIndex] &=\r
43117+ ~(SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_LINK);\r
43118+\r
43119+ /* Start VCT timer counter. */\r
43120+ SK_MEMSET((char *)&Para, 0, sizeof(Para));\r
43121+ Para.Para32[0] = PhysPortIndex;\r
43122+ Para.Para32[1] = -1;\r
43123+\r
43124+ SkTimerStart(pAC, IoC, &pAC->Pnmi.VctTimeout[PhysPortIndex],\r
43125+ SK_PNMI_VCT_TIMER_CHECK, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Para);\r
43126+\r
43127+ SK_PNMI_STORE_U32((pBuf + Offset), RetCode);\r
43128+ RetCode = SK_PNMI_ERR_OK;\r
43129+ }\r
43130+ else { /* RetCode: 2 => Running! */\r
43131+ SK_PNMI_STORE_U32((pBuf + Offset), RetCode);\r
43132+ RetCode = SK_PNMI_ERR_OK;\r
43133+ }\r
43134+ }\r
43135+ else { /* RetCode: 4 => Link! */\r
43136+ RetCode = 4;\r
43137+ SK_PNMI_STORE_U32((pBuf + Offset), RetCode);\r
43138+ RetCode = SK_PNMI_ERR_OK;\r
43139+ }\r
43140+ Offset += sizeof(SK_U32);\r
43141+ break;\r
43142+\r
43143+ default:\r
43144+ *pLen = 0;\r
43145+ return (SK_PNMI_ERR_GENERAL);\r
43146+ }\r
43147+ } /* for */\r
43148+ *pLen = Offset;\r
43149+ return (RetCode);\r
43150+\r
43151+} /* Vct */\r
43152+\r
43153+\r
43154+PNMI_STATIC void VctGetResults(\r
43155+SK_AC *pAC,\r
43156+SK_IOC IoC,\r
43157+SK_U32 Port)\r
43158+{\r
43159+ SK_GEPORT *pPrt;\r
43160+ int i;\r
43161+ SK_U8 PairLen;\r
43162+ SK_U8 PairSts;\r
43163+ SK_U32 MinLength;\r
43164+ SK_U32 CableLength;\r
43165+\r
43166+ pPrt = &pAC->GIni.GP[Port];\r
43167+\r
43168+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) {\r
43169+ MinLength = 25;\r
43170+ }\r
43171+ else {\r
43172+ MinLength = 35;\r
43173+ }\r
43174+\r
43175+ /* Copy results for later use to PNMI struct. */\r
43176+ for (i = 0; i < 4; i++) {\r
43177+\r
43178+ PairLen = pPrt->PMdiPairLen[i];\r
43179+\r
43180+ if (((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) == 0) && (i > 1)) {\r
43181+ PairSts = SK_PNMI_VCT_NOT_PRESENT;\r
43182+ }\r
43183+ else {\r
43184+ PairSts = pPrt->PMdiPairSts[i];\r
43185+ }\r
43186+\r
43187+ if ((PairSts == SK_PNMI_VCT_NORMAL_CABLE) &&\r
43188+ (PairLen > 28) && (PairLen < 0xff)) {\r
43189+\r
43190+ PairSts = SK_PNMI_VCT_IMPEDANCE_MISMATCH;\r
43191+ }\r
43192+\r
43193+ /* Ignore values <= MinLength, the linear factor is 4/5. */\r
43194+ if ((PairLen > MinLength) && (PairLen < 0xff)) {\r
43195+ \r
43196+ CableLength = 1000UL * (PairLen - MinLength) * 4 / 5;\r
43197+ }\r
43198+ else {\r
43199+ /* No cable or short cable. */\r
43200+ CableLength = 0;\r
43201+ }\r
43202+\r
43203+ pAC->Pnmi.VctBackup[Port].MdiPairLen[i] = CableLength;\r
43204+ pAC->Pnmi.VctBackup[Port].MdiPairSts[i] = PairSts;\r
43205+ }\r
43206+\r
43207+ pAC->Pnmi.VctStatus[Port] &= ~SK_PNMI_VCT_PENDING;\r
43208+ pAC->Pnmi.VctStatus[Port] |= (SK_PNMI_VCT_NEW_VCT_DATA |\r
43209+ SK_PNMI_VCT_TEST_DONE);\r
43210+\r
43211+} /* GetVctResults */\r
43212+\r
43213+PNMI_STATIC void CheckVctStatus(\r
43214+SK_AC *pAC,\r
43215+SK_IOC IoC,\r
43216+char *pBuf,\r
43217+SK_U32 Offset,\r
43218+SK_U32 PhysPortIndex)\r
43219+{\r
43220+ SK_GEPORT *pPrt;\r
43221+ SK_PNMI_VCT *pVctData;\r
43222+ SK_U8 VctStatus;\r
43223+ SK_U32 RetCode;\r
43224+\r
43225+ pPrt = &pAC->GIni.GP[PhysPortIndex];\r
43226+\r
43227+ pVctData = (SK_PNMI_VCT *) (pBuf + Offset);\r
43228+ pVctData->VctStatus = SK_PNMI_VCT_NONE;\r
43229+\r
43230+ VctStatus = pAC->Pnmi.VctStatus[PhysPortIndex];\r
43231+\r
43232+ if (!pPrt->PHWLinkUp) {\r
43233+\r
43234+ /* Was a VCT test ever made before? */\r
43235+ if (VctStatus & SK_PNMI_VCT_TEST_DONE) {\r
43236+ if (VctStatus & SK_PNMI_VCT_LINK) {\r
43237+ pVctData->VctStatus |= SK_PNMI_VCT_OLD_VCT_DATA;\r
43238+ }\r
43239+ else {\r
43240+ pVctData->VctStatus |= SK_PNMI_VCT_NEW_VCT_DATA;\r
43241+ }\r
43242+ }\r
43243+\r
43244+ /* Check VCT test status. */\r
43245+ RetCode = SkGmCableDiagStatus(pAC,IoC, PhysPortIndex, SK_FALSE);\r
43246+\r
43247+ if (RetCode == 2) { /* VCT test is running. */\r
43248+ pVctData->VctStatus |= SK_PNMI_VCT_RUNNING;\r
43249+ }\r
43250+ else { /* VCT data was copied to pAC here. Check PENDING state. */\r
43251+ if (VctStatus & SK_PNMI_VCT_PENDING) {\r
43252+ pVctData->VctStatus |= SK_PNMI_VCT_NEW_VCT_DATA;\r
43253+ }\r
43254+ }\r
43255+\r
43256+ if (pPrt->PCableLen != 0xff) { /* Old DSP value. */\r
43257+ pVctData->VctStatus |= SK_PNMI_VCT_OLD_DSP_DATA;\r
43258+ }\r
43259+ }\r
43260+ else {\r
43261+ /* Was a VCT test ever made before? */\r
43262+ if (VctStatus & SK_PNMI_VCT_TEST_DONE) {\r
43263+ pVctData->VctStatus &= ~SK_PNMI_VCT_NEW_VCT_DATA;\r
43264+ pVctData->VctStatus |= SK_PNMI_VCT_OLD_VCT_DATA;\r
43265+ }\r
43266+\r
43267+ /* DSP only valid in 100/1000 modes. */\r
43268+ if (pPrt->PLinkSpeedUsed != SK_LSPEED_STAT_10MBPS) {\r
43269+ pVctData->VctStatus |= SK_PNMI_VCT_NEW_DSP_DATA;\r
43270+ }\r
43271+ }\r
43272+\r
43273+} /* CheckVctStatus */\r
43274+\r
43275+\r
43276+/*****************************************************************************\r
43277+ *\r
43278+ * SkPnmiGenIoctl - Handles new generic PNMI IOCTL, calls the needed\r
43279+ * PNMI function depending on the subcommand and\r
43280+ * returns all data belonging to the complete database\r
43281+ * or OID request.\r
43282+ *\r
43283+ * Description:\r
43284+ * Looks up the requested subcommand, calls the corresponding handler\r
43285+ * function and passes all required parameters to it.\r
43286+ * The function is called by the driver. It is needed to handle the new\r
43287+ * generic PNMI IOCTL. This IOCTL is given to the driver and contains both\r
43288+ * the OID and a subcommand to decide what kind of request has to be done.\r
43289+ *\r
43290+ * Returns:\r
43291+ * SK_PNMI_ERR_OK The request was successfully performed\r
43292+ * SK_PNMI_ERR_GENERAL A general severe internal error occured\r
43293+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take\r
43294+ * the data.\r
43295+ * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown\r
43296+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
43297+ * exist (e.g. port instance 3 on a two port\r
43298+ * adapter.\r
43299+ */\r
43300+int SkPnmiGenIoctl(\r
43301+SK_AC *pAC, /* Pointer to adapter context struct */\r
43302+SK_IOC IoC, /* I/O context */\r
43303+void *pBuf, /* Buffer used for the management data transfer */\r
43304+unsigned int *pLen, /* Length of buffer */\r
43305+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
43306+{\r
43307+SK_I32 Mode; /* Store value of subcommand. */\r
43308+SK_U32 Oid; /* Store value of OID. */\r
43309+int ReturnCode; /* Store return value to show status of PNMI action. */\r
43310+int HeaderLength; /* Length of desired action plus OID. */\r
43311+\r
43312+ ReturnCode = SK_PNMI_ERR_GENERAL;\r
43313+ \r
43314+ SK_MEMCPY(&Mode, pBuf, sizeof(SK_I32));\r
43315+ SK_MEMCPY(&Oid, (char *)pBuf + sizeof(SK_I32), sizeof(SK_U32));\r
43316+ HeaderLength = sizeof(SK_I32) + sizeof(SK_U32);\r
43317+ *pLen = *pLen - HeaderLength;\r
43318+ SK_MEMCPY((char *)pBuf + sizeof(SK_I32), (char *)pBuf + HeaderLength, *pLen);\r
43319+ \r
43320+ switch(Mode) {\r
43321+ case SK_GET_SINGLE_VAR:\r
43322+ ReturnCode = SkPnmiGetVar(pAC, IoC, Oid,\r
43323+ (char *)pBuf + sizeof(SK_I32), pLen,\r
43324+ ((SK_U32) (-1)), NetIndex);\r
43325+ SK_PNMI_STORE_U32(pBuf, ReturnCode);\r
43326+ *pLen = *pLen + sizeof(SK_I32);\r
43327+ break;\r
43328+ case SK_PRESET_SINGLE_VAR:\r
43329+ ReturnCode = SkPnmiPreSetVar(pAC, IoC, Oid,\r
43330+ (char *)pBuf + sizeof(SK_I32), pLen,\r
43331+ ((SK_U32) (-1)), NetIndex);\r
43332+ SK_PNMI_STORE_U32(pBuf, ReturnCode);\r
43333+ *pLen = *pLen + sizeof(SK_I32);\r
43334+ break;\r
43335+ case SK_SET_SINGLE_VAR:\r
43336+ ReturnCode = SkPnmiSetVar(pAC, IoC, Oid,\r
43337+ (char *)pBuf + sizeof(SK_I32), pLen,\r
43338+ ((SK_U32) (-1)), NetIndex);\r
43339+ SK_PNMI_STORE_U32(pBuf, ReturnCode);\r
43340+ *pLen = *pLen + sizeof(SK_I32);\r
43341+ break;\r
43342+ case SK_GET_FULL_MIB:\r
43343+ ReturnCode = SkPnmiGetStruct(pAC, IoC, pBuf, pLen, NetIndex);\r
43344+ break;\r
43345+ case SK_PRESET_FULL_MIB:\r
43346+ ReturnCode = SkPnmiPreSetStruct(pAC, IoC, pBuf, pLen, NetIndex);\r
43347+ break;\r
43348+ case SK_SET_FULL_MIB:\r
43349+ ReturnCode = SkPnmiSetStruct(pAC, IoC, pBuf, pLen, NetIndex);\r
43350+ break;\r
43351+ default:\r
43352+ break;\r
43353+ }\r
43354+ \r
43355+ return (ReturnCode);\r
43356+\r
43357+} /* SkGeIocGen */\r
43358+\r
43359+#ifdef SK_ASF\r
43360+/*****************************************************************************\r
43361+ *\r
43362+ * Asf\r
43363+ *\r
43364+ * Description:\r
43365+ * The code is simple. No description necessary.\r
43366+ *\r
43367+ * Returns:\r
43368+ * SK_PNMI_ERR_OK The request was successfully performed.\r
43369+ * SK_PNMI_ERR_GENERAL A general severe internal error occured.\r
43370+ * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain\r
43371+ * the correct data (e.g. a 32bit value is\r
43372+ * needed, but a 16 bit value was passed).\r
43373+ * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't\r
43374+ * exist (e.g. port instance 3 on a two port\r
43375+ * adapter.\r
43376+ */\r
43377+\r
43378+PNMI_STATIC int Asf(\r
43379+SK_AC *pAC, /* Pointer to adapter context */\r
43380+SK_IOC IoC, /* IO context handle */\r
43381+int Action, /* GET/PRESET/SET action */\r
43382+SK_U32 Id, /* Object ID that is to be processed */\r
43383+char *pBuf, /* Buffer used for the management data transfer */\r
43384+unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */\r
43385+SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */\r
43386+unsigned int TableIndex, /* Index to the Id table */\r
43387+SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */\r
43388+{\r
43389+ SK_U32 RetCode = SK_PNMI_ERR_GENERAL;\r
43390+\r
43391+ /*\r
43392+ * Check instance. We only handle single instance variables.\r
43393+ */\r
43394+ if (Instance != (SK_U32)(-1) && Instance != 1) {\r
43395+\r
43396+ *pLen = 0;\r
43397+ return (SK_PNMI_ERR_UNKNOWN_INST);\r
43398+ }\r
43399+\r
43400+ /* Perform action. */\r
43401+ /* GET value. */\r
43402+ if (Action == SK_PNMI_GET) {\r
43403+ switch (Id) {\r
43404+ case OID_SKGE_ASF: \r
43405+ RetCode = SkAsfGet(pAC, IoC, (SK_U8 *) pBuf, pLen);\r
43406+ break;\r
43407+ default:\r
43408+ RetCode = SkAsfGetOid( pAC, IoC, Id, Instance, (SK_U8 *) pBuf, pLen );\r
43409+ break;\r
43410+ }\r
43411+\r
43412+ return (RetCode); \r
43413+ }\r
43414+\r
43415+ /* PRESET value. */\r
43416+ if (Action == SK_PNMI_PRESET) { \r
43417+ switch (Id) {\r
43418+ case OID_SKGE_ASF:\r
43419+ RetCode = SkAsfPreSet(pAC, IoC, (SK_U8 *) pBuf, pLen);\r
43420+ break;\r
43421+ default:\r
43422+ RetCode = SkAsfPreSetOid( pAC, IoC, Id, Instance, (SK_U8 *) pBuf, pLen );\r
43423+ break;\r
43424+ }\r
43425+ }\r
43426+\r
43427+ /* SET value. */\r
43428+ if (Action == SK_PNMI_SET) {\r
43429+ switch (Id) {\r
43430+ case OID_SKGE_ASF:\r
43431+ RetCode = SkAsfSet(pAC, IoC, (SK_U8 *) pBuf, pLen);\r
43432+ break;\r
43433+ default:\r
43434+ RetCode = SkAsfSetOid( pAC, IoC, Id, Instance, (SK_U8 *) pBuf, pLen );\r
43435+ break;\r
43436+ }\r
43437+ }\r
43438+ return (RetCode);\r
43439+}\r
43440+#endif /* SK_ASF */\r
43441diff -ruN linux/drivers/net/sk98lin/skgesirq.c linux-new/drivers/net/sk98lin/skgesirq.c
43442--- linux/drivers/net/sk98lin/skgesirq.c 2006-04-11 19:19:28.000000000 +0200
43443+++ linux-new/drivers/net/sk98lin/skgesirq.c 2006-01-18 14:37:24.000000000 +0100
43444@@ -2,23 +2,24 @@
43445 *
43446 * Name: skgesirq.c
43447 * Project: Gigabit Ethernet Adapters, Common Modules
43448- * Version: $Revision$
43449- * Date: $Date$
43450+ * Version: $Revision$
43451+ * Date: $Date$
43452 * Purpose: Special IRQ module
43453 *
43454 ******************************************************************************/
43455
43456 /******************************************************************************
43457 *
43458+ * LICENSE:
43459 * (C)Copyright 1998-2002 SysKonnect.
43460- * (C)Copyright 2002-2003 Marvell.
43461+ * (C)Copyright 2002-2005 Marvell.
43462 *
43463 * This program is free software; you can redistribute it and/or modify
43464 * it under the terms of the GNU General Public License as published by
43465 * the Free Software Foundation; either version 2 of the License, or
43466 * (at your option) any later version.
43467- *
43468 * The information in this file is provided "AS IS" without warranty.
43469+ * /LICENSE
43470 *
43471 ******************************************************************************/
43472
43473@@ -38,7 +39,7 @@
43474 * right after this ISR.
43475 *
43476 * The Interrupt source register of the adapter is NOT read by this module.
43477- * SO if the drivers implementor needs a while loop around the
43478+ * SO if the drivers implementor needs a while loop around the
43479 * slow data paths interrupt bits, he needs to call the SkGeSirqIsr() for
43480 * each loop entered.
43481 *
43482@@ -46,11 +47,6 @@
43483 *
43484 */
43485
43486-#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
43487-static const char SysKonnectFileId[] =
43488- "@(#) $Id$ (C) Marvell.";
43489-#endif
43490-
43491 #include "h/skdrv1st.h" /* Driver Specific Definitions */
43492 #ifndef SK_SLIM
43493 #include "h/skgepnmi.h" /* PNMI Definitions */
43494@@ -58,6 +54,13 @@
43495 #endif
43496 #include "h/skdrv2nd.h" /* Adapter Control and Driver specific Def. */
43497
43498+/* local variables ************************************************************/
43499+
43500+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
43501+static const char SysKonnectFileId[] =
43502+ "@(#) $Id$ (C) Marvell.";
43503+#endif
43504+
43505 /* local function prototypes */
43506 #ifdef GENESIS
43507 static int SkGePortCheckUpXmac(SK_AC*, SK_IOC, int, SK_BOOL);
43508@@ -86,7 +89,7 @@
43509 XM_RXF_511B,
43510 XM_RXF_1023B,
43511 XM_RXF_MAX_SZ
43512-} ;
43513+};
43514 #endif /* GENESIS */
43515
43516 #ifdef __C2MAN__
43517@@ -109,8 +112,8 @@
43518 * Returns: N/A
43519 */
43520 static void SkHWInitDefSense(
43521-SK_AC *pAC, /* adapter context */
43522-SK_IOC IoC, /* IO context */
43523+SK_AC *pAC, /* Adapter Context */
43524+SK_IOC IoC, /* I/O context */
43525 int Port) /* Port Index (MAC_1 + n) */
43526 {
43527 SK_GEPORT *pPrt; /* GIni Port struct pointer */
43528@@ -119,7 +122,7 @@
43529
43530 pPrt->PAutoNegTimeOut = 0;
43531
43532- if (pPrt->PLinkModeConf != SK_LMODE_AUTOSENSE) {
43533+ if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) {
43534 pPrt->PLinkMode = pPrt->PLinkModeConf;
43535 return;
43536 }
43537@@ -145,8 +148,8 @@
43538 *
43539 */
43540 static SK_U8 SkHWSenseGetNext(
43541-SK_AC *pAC, /* adapter context */
43542-SK_IOC IoC, /* IO context */
43543+SK_AC *pAC, /* Adapter Context */
43544+SK_IOC IoC, /* I/O context */
43545 int Port) /* Port Index (MAC_1 + n) */
43546 {
43547 SK_GEPORT *pPrt; /* GIni Port struct pointer */
43548@@ -155,18 +158,18 @@
43549
43550 pPrt->PAutoNegTimeOut = 0;
43551
43552- if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) {
43553+ if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) {
43554 /* Leave all as configured */
43555 return(pPrt->PLinkModeConf);
43556 }
43557
43558- if (pPrt->PLinkMode == (SK_U8)SK_LMODE_AUTOFULL) {
43559+ if (pPrt->PLinkMode == (SK_U8)SK_LMODE_AUTOFULL) {
43560 /* Return next mode AUTOBOTH */
43561- return ((SK_U8)SK_LMODE_AUTOBOTH);
43562+ return((SK_U8)SK_LMODE_AUTOBOTH);
43563 }
43564
43565 /* Return default autofull */
43566- return ((SK_U8)SK_LMODE_AUTOFULL);
43567+ return((SK_U8)SK_LMODE_AUTOFULL);
43568 } /* SkHWSenseGetNext */
43569
43570
43571@@ -179,8 +182,8 @@
43572 * Returns: N/A
43573 */
43574 static void SkHWSenseSetNext(
43575-SK_AC *pAC, /* adapter context */
43576-SK_IOC IoC, /* IO context */
43577+SK_AC *pAC, /* Adapter Context */
43578+SK_IOC IoC, /* I/O context */
43579 int Port, /* Port Index (MAC_1 + n) */
43580 SK_U8 NewMode) /* New Mode to be written in sense mode */
43581 {
43582@@ -190,7 +193,7 @@
43583
43584 pPrt->PAutoNegTimeOut = 0;
43585
43586- if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) {
43587+ if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) {
43588 return;
43589 }
43590
43591@@ -214,8 +217,8 @@
43592 * Returns: N/A
43593 */
43594 void SkHWLinkDown(
43595-SK_AC *pAC, /* adapter context */
43596-SK_IOC IoC, /* IO context */
43597+SK_AC *pAC, /* Adapter Context */
43598+SK_IOC IoC, /* I/O context */
43599 int Port) /* Port Index (MAC_1 + n) */
43600 {
43601 SK_GEPORT *pPrt; /* GIni Port struct pointer */
43602@@ -227,11 +230,11 @@
43603
43604 /* Disable Receiver and Transmitter */
43605 SkMacRxTxDisable(pAC, IoC, Port);
43606-
43607+
43608 /* Init default sense mode */
43609 SkHWInitDefSense(pAC, IoC, Port);
43610
43611- if (pPrt->PHWLinkUp == SK_FALSE) {
43612+ if (!pPrt->PHWLinkUp) {
43613 return;
43614 }
43615
43616@@ -241,10 +244,12 @@
43617 /* Set Link to DOWN */
43618 pPrt->PHWLinkUp = SK_FALSE;
43619
43620+#ifndef SK_SLIM
43621 /* Reset Port stati */
43622- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
43623- pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE;
43624+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
43625+ pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE;
43626 pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_INDETERMINATED;
43627+#endif /* !SK_SLIM */
43628
43629 /* Re-init Phy especially when the AutoSense default is set now */
43630 SkMacInitPhy(pAC, IoC, Port, SK_FALSE);
43631@@ -266,8 +271,8 @@
43632 * Returns: N/A
43633 */
43634 void SkHWLinkUp(
43635-SK_AC *pAC, /* adapter context */
43636-SK_IOC IoC, /* IO context */
43637+SK_AC *pAC, /* Adapter Context */
43638+SK_IOC IoC, /* I/O context */
43639 int Port) /* Port Index (MAC_1 + n) */
43640 {
43641 SK_GEPORT *pPrt; /* GIni Port struct pointer */
43642@@ -280,12 +285,14 @@
43643 }
43644
43645 pPrt->PHWLinkUp = SK_TRUE;
43646+
43647+#ifndef SK_SLIM
43648 pPrt->PAutoNegFail = SK_FALSE;
43649- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
43650+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
43651
43652- if (pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOHALF &&
43653- pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOFULL &&
43654- pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOBOTH) {
43655+ if (pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOHALF &&
43656+ pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOFULL &&
43657+ pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOBOTH) {
43658 /* Link is up and no Auto-negotiation should be done */
43659
43660 /* Link speed should be the configured one */
43661@@ -293,7 +300,9 @@
43662 case SK_LSPEED_AUTO:
43663 /* default is 1000 Mbps */
43664 case SK_LSPEED_1000MBPS:
43665- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
43666+ pPrt->PLinkSpeedUsed =
43667+ (SK_U8)((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) ?
43668+ SK_LSPEED_STAT_1000MBPS : SK_LSPEED_STAT_100MBPS;
43669 break;
43670 case SK_LSPEED_100MBPS:
43671 pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS;
43672@@ -304,19 +313,22 @@
43673 }
43674
43675 /* Set Link Mode Status */
43676- if (pPrt->PLinkMode == SK_LMODE_FULL) {
43677+ if (pPrt->PLinkMode == (SK_U8)SK_LMODE_FULL) {
43678 pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_FULL;
43679 }
43680 else {
43681- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_HALF;
43682+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_HALF;
43683 }
43684
43685 /* No flow control without auto-negotiation */
43686- pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE;
43687+ pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE;
43688+#endif /* !SK_SLIM */
43689
43690 /* enable Rx/Tx */
43691- (void)SkMacRxTxEnable(pAC, IoC, Port);
43692+ (void)SkMacRxTxEnable(pAC, IoC, Port);
43693+#ifndef SK_SLIM
43694 }
43695+#endif /* !SK_SLIM */
43696 } /* SkHWLinkUp */
43697
43698
43699@@ -329,14 +341,16 @@
43700 * Returns: N/A
43701 */
43702 static void SkMacParity(
43703-SK_AC *pAC, /* adapter context */
43704-SK_IOC IoC, /* IO context */
43705-int Port) /* Port Index of the port failed */
43706+SK_AC *pAC, /* Adapter Context */
43707+SK_IOC IoC, /* I/O context */
43708+int Port) /* Port Index (MAC_1 + n) */
43709 {
43710 SK_EVPARA Para;
43711 SK_GEPORT *pPrt; /* GIni Port struct pointer */
43712 SK_U32 TxMax; /* Tx Max Size Counter */
43713
43714+ TxMax = 0;
43715+
43716 pPrt = &pAC->GIni.GP[Port];
43717
43718 /* Clear IRQ Tx Parity Error */
43719@@ -346,7 +360,7 @@
43720 SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_CLR_PERR);
43721 }
43722 #endif /* GENESIS */
43723-
43724+
43725 #ifdef YUKON
43726 if (pAC->GIni.GIYukon) {
43727 /* HW-Bug #8: cleared by GMF_CLI_TX_FC instead of GMF_CLI_TX_PE */
43728@@ -355,7 +369,7 @@
43729 pAC->GIni.GIChipRev == 0) ? GMF_CLI_TX_FC : GMF_CLI_TX_PE));
43730 }
43731 #endif /* YUKON */
43732-
43733+
43734 if (pPrt->PCheckPar) {
43735
43736 if (Port == MAC_1) {
43737@@ -366,7 +380,7 @@
43738 }
43739 Para.Para64 = Port;
43740 SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
43741-
43742+
43743 Para.Para32[0] = Port;
43744 SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);
43745
43746@@ -378,18 +392,18 @@
43747 if (pAC->GIni.GIGenesis) {
43748 /* Snap statistic counters */
43749 (void)SkXmUpdateStats(pAC, IoC, Port);
43750-
43751+
43752 (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXF_MAX_SZ, &TxMax);
43753 }
43754 #endif /* GENESIS */
43755-
43756+
43757 #ifdef YUKON
43758 if (pAC->GIni.GIYukon) {
43759
43760 (void)SkGmMacStatistic(pAC, IoC, Port, GM_TXF_1518B, &TxMax);
43761 }
43762 #endif /* YUKON */
43763-
43764+
43765 if (TxMax > 0) {
43766 /* From now on check the parity */
43767 pPrt->PCheckPar = SK_TRUE;
43768@@ -399,15 +413,15 @@
43769
43770 /******************************************************************************
43771 *
43772- * SkGeHwErr() - Hardware Error service routine
43773+ * SkGeYuHwErr() - Hardware Error service routine (Genesis and Yukon)
43774 *
43775 * Description: handles all HW Error interrupts
43776 *
43777 * Returns: N/A
43778 */
43779-static void SkGeHwErr(
43780-SK_AC *pAC, /* adapter context */
43781-SK_IOC IoC, /* IO context */
43782+static void SkGeYuHwErr(
43783+SK_AC *pAC, /* Adapter Context */
43784+SK_IOC IoC, /* I/O context */
43785 SK_U32 HwStatus) /* Interrupt status word */
43786 {
43787 SK_EVPARA Para;
43788@@ -423,10 +437,10 @@
43789 }
43790
43791 /* Reset all bits in the PCI STATUS register */
43792- SK_IN16(IoC, PCI_C(PCI_STATUS), &Word);
43793-
43794+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word);
43795+
43796 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
43797- SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS));
43798+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS));
43799 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
43800
43801 Para.Para64 = 0;
43802@@ -461,7 +475,7 @@
43803 }
43804 }
43805 #endif /* GENESIS */
43806-
43807+
43808 #ifdef YUKON
43809 if (pAC->GIni.GIYukon) {
43810 /* This is necessary only for Rx timing measurements */
43811@@ -484,14 +498,18 @@
43812 #endif /* YUKON */
43813
43814 if ((HwStatus & IS_RAM_RD_PAR) != 0) {
43815+
43816 SK_OUT16(IoC, B3_RI_CTRL, RI_CLR_RD_PERR);
43817+
43818 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E014, SKERR_SIRQ_E014MSG);
43819 Para.Para64 = 0;
43820 SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para);
43821 }
43822
43823 if ((HwStatus & IS_RAM_WR_PAR) != 0) {
43824+
43825 SK_OUT16(IoC, B3_RI_CTRL, RI_CLR_WR_PERR);
43826+
43827 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E015, SKERR_SIRQ_E015MSG);
43828 Para.Para64 = 0;
43829 SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para);
43830@@ -512,7 +530,7 @@
43831 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E018, SKERR_SIRQ_E018MSG);
43832 Para.Para64 = MAC_1;
43833 SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
43834-
43835+
43836 Para.Para32[0] = MAC_1;
43837 SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);
43838 }
43839@@ -524,37 +542,288 @@
43840 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E019, SKERR_SIRQ_E019MSG);
43841 Para.Para64 = MAC_2;
43842 SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
43843-
43844+
43845 Para.Para32[0] = MAC_2;
43846 SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);
43847 }
43848-} /* SkGeHwErr */
43849+} /* SkGeYuHwErr */
43850+
43851+#ifdef YUK2
43852+/******************************************************************************
43853+ *
43854+ * SkYuk2HwPortErr() - Service HW Errors for specified port (Yukon-2 only)
43855+ *
43856+ * Description: handles the HW Error interrupts for a specific port.
43857+ *
43858+ * Returns: N/A
43859+ */
43860+static void SkYuk2HwPortErr(
43861+SK_AC *pAC, /* Adapter Context */
43862+SK_IOC IoC, /* I/O Context */
43863+SK_U32 HwStatus, /* Interrupt status word */
43864+int Port) /* Port Index (MAC_1 + n) */
43865+{
43866+ SK_EVPARA Para;
43867+ int Queue;
43868+
43869+ if (Port == MAC_2) {
43870+ HwStatus >>= 8;
43871+ }
43872+
43873+ if ((HwStatus & Y2_HWE_L1_MASK) == 0) {
43874+ return;
43875+ }
43876
43877+ if ((HwStatus & Y2_IS_PAR_RD1) != 0) {
43878+ /* Clear IRQ */
43879+ SK_OUT16(IoC, SELECT_RAM_BUFFER(Port, B3_RI_CTRL), RI_CLR_RD_PERR);
43880+
43881+ if (Port == MAC_1) {
43882+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E028, SKERR_SIRQ_E028MSG);
43883+ }
43884+ else {
43885+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E030, SKERR_SIRQ_E030MSG);
43886+ }
43887+ }
43888+
43889+ if ((HwStatus & Y2_IS_PAR_WR1) != 0) {
43890+ /* Clear IRQ */
43891+ SK_OUT16(IoC, SELECT_RAM_BUFFER(Port, B3_RI_CTRL), RI_CLR_WR_PERR);
43892+
43893+ if (Port == MAC_1) {
43894+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E029, SKERR_SIRQ_E029MSG);
43895+ }
43896+ else {
43897+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E031, SKERR_SIRQ_E031MSG);
43898+ }
43899+ }
43900+
43901+ if ((HwStatus & Y2_IS_PAR_MAC1) != 0) {
43902+ /* Clear IRQ */
43903+ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), GMF_CLI_TX_PE);
43904+
43905+ if (Port == MAC_1) {
43906+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E016, SKERR_SIRQ_E016MSG);
43907+ }
43908+ else {
43909+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E017, SKERR_SIRQ_E017MSG);
43910+ }
43911+ }
43912+
43913+ if ((HwStatus & Y2_IS_PAR_RX1) != 0) {
43914+ if (Port == MAC_1) {
43915+ Queue = Q_R1;
43916+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E018, SKERR_SIRQ_E018MSG);
43917+ }
43918+ else {
43919+ Queue = Q_R2;
43920+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E019, SKERR_SIRQ_E019MSG);
43921+ }
43922+ /* Clear IRQ */
43923+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_PAR);
43924+ }
43925+
43926+ if ((HwStatus & Y2_IS_TCP_TXS1) != 0) {
43927+ if (Port == MAC_1) {
43928+ Queue = Q_XS1;
43929+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E033, SKERR_SIRQ_E033MSG);
43930+ }
43931+ else {
43932+ Queue = Q_XS2;
43933+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E035, SKERR_SIRQ_E035MSG);
43934+ }
43935+ /* Clear IRQ */
43936+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_TCP);
43937+ }
43938+
43939+ if ((HwStatus & Y2_IS_TCP_TXA1) != 0) {
43940+ if (Port == MAC_1) {
43941+ Queue = Q_XA1;
43942+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E032, SKERR_SIRQ_E032MSG);
43943+ }
43944+ else {
43945+ Queue = Q_XA2;
43946+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E034, SKERR_SIRQ_E034MSG);
43947+ }
43948+ /* Clear IRQ */
43949+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_TCP);
43950+ }
43951+
43952+ Para.Para64 = Port;
43953+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
43954+
43955+ Para.Para32[0] = Port;
43956+ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);
43957+
43958+} /* SkYuk2HwPortErr */
43959
43960 /******************************************************************************
43961 *
43962- * SkGeSirqIsr() - Special Interrupt Service Routine
43963+ * SkYuk2HwErr() - Hardware Error service routine (Yukon-2 only)
43964 *
43965- * Description: handles all non data transfer specific interrupts (slow path)
43966+ * Description: handles all HW Error interrupts
43967+ *
43968+ * Returns: N/A
43969+ */
43970+static void SkYuk2HwErr(
43971+SK_AC *pAC, /* Adapter Context */
43972+SK_IOC IoC, /* I/O Context */
43973+SK_U32 HwStatus) /* Interrupt status word */
43974+{
43975+ SK_EVPARA Para;
43976+ SK_U16 Word;
43977+ SK_U32 DWord;
43978+ SK_U32 TlpHead[4];
43979+ int i;
43980+
43981+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
43982+ ("HW-Error Status: 0x%08lX\n", HwStatus));
43983+
43984+ /* This is necessary only for Rx timing measurements */
43985+ if ((HwStatus & Y2_IS_TIST_OV) != 0) {
43986+ /* increment Time Stamp Timer counter (high) */
43987+ pAC->GIni.GITimeStampCnt++;
43988+
43989+ /* Clear Time Stamp Timer IRQ */
43990+ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8)GMT_ST_CLR_IRQ);
43991+ }
43992+
43993+ /* Evaluate Y2_IS_PCI_NEXP before Y2_IS_MST_ERR or Y2_IS_IRQ_STAT */
43994+ if ((HwStatus & Y2_IS_PCI_NEXP) != 0) {
43995+ /*
43996+ * This error is also mapped either to Master Abort (Y2_IS_MST_ERR)
43997+ * or Target Abort (Y2_IS_IRQ_STAT) bit and can only be cleared there.
43998+ * Therefore handle this event just by printing an error log entry.
43999+ */
44000+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E027, SKERR_SIRQ_E027MSG);
44001+ }
44002+
44003+ if ((HwStatus & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) != 0) {
44004+ /* PCI Errors occured */
44005+ if ((HwStatus & Y2_IS_IRQ_STAT) != 0) {
44006+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E013, SKERR_SIRQ_E013MSG);
44007+ }
44008+ else {
44009+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E012, SKERR_SIRQ_E012MSG);
44010+ }
44011+
44012+ /* Reset all bits in the PCI STATUS register */
44013+ SK_IN16(IoC, PCI_C(pAC, PCI_STATUS), &Word);
44014+
44015+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
44016+ SK_OUT16(IoC, PCI_C(pAC, PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS));
44017+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
44018+
44019+ Para.Para64 = 0;
44020+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para);
44021+ }
44022+
44023+ /* check for PCI-Express Uncorrectable Error */
44024+ if ((HwStatus & Y2_IS_PCI_EXP) != 0) {
44025+ /*
44026+ * On PCI-Express bus bridges are called root complexes (RC).
44027+ * PCI-Express errors are recognized by the root complex too,
44028+ * which requests the system to handle the problem. After error
44029+ * occurence it may be that no access to the adapter may be performed
44030+ * any longer.
44031+ */
44032+
44033+ /* Get uncorrectable error status */
44034+ SK_IN32(IoC, PCI_C(pAC, PEX_UNC_ERR_STAT), &DWord);
44035+
44036+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44037+ ("PEX Uncorr.Error Status: 0x%08lX\n", DWord));
44038+
44039+ if (DWord != PEX_UNSUP_REQ) {
44040+ /* ignore Unsupported Request Errors */
44041+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E026, SKERR_SIRQ_E026MSG);
44042+ }
44043+
44044+ if ((DWord & (PEX_FATAL_ERRORS | PEX_POIS_TLP)) != 0) {
44045+ /*
44046+ * Stop only, if the uncorrectable error is fatal or
44047+ * Poisoned TLP occured
44048+ */
44049+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, ("Header Log:"));
44050+
44051+ for (i = 0; i < 4; i++) {
44052+ /* get TLP Header from Log Registers */
44053+ SK_IN32(IoC, PCI_C(pAC, PEX_HEADER_LOG + i*4), &TlpHead[i]);
44054+
44055+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44056+ (" 0x%08lX", TlpHead[i]));
44057+ }
44058+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, ("\n"));
44059+
44060+ /* check for vendor defined broadcast message */
44061+ if (TlpHead[0] == 0x73004001 && (SK_U8)TlpHead[1] == 0x7f) {
44062+
44063+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44064+ ("Vendor defined broadcast message\n"));
44065+ }
44066+ else {
44067+ Para.Para64 = 0;
44068+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para);
44069+
44070+ pAC->GIni.GIValHwIrqMask &= ~Y2_IS_PCI_EXP;
44071+ /* Rewrite HW IRQ mask */
44072+ SK_OUT32(IoC, B0_HWE_IMSK, pAC->GIni.GIValHwIrqMask);
44073+ }
44074+ }
44075+ /* clear the interrupt */
44076+ SK_OUT32(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
44077+ SK_OUT32(IoC, PCI_C(pAC, PEX_UNC_ERR_STAT), 0xffffffffUL);
44078+ SK_OUT32(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
44079+ }
44080+
44081+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
44082+
44083+ SkYuk2HwPortErr(pAC, IoC, HwStatus, i);
44084+ }
44085+
44086+} /* SkYuk2HwErr */
44087+#endif /* YUK2 */
44088+
44089+/******************************************************************************
44090+ *
44091+ * SkGeSirqIsr() - Wrapper for Special Interrupt Service Routine
44092+ *
44093+ * Description: calls the preselected special ISR (slow path)
44094 *
44095 * Returns: N/A
44096 */
44097 void SkGeSirqIsr(
44098-SK_AC *pAC, /* adapter context */
44099-SK_IOC IoC, /* IO context */
44100+SK_AC *pAC, /* Adapter Context */
44101+SK_IOC IoC, /* I/O context */
44102+SK_U32 Istatus) /* Interrupt status word */
44103+{
44104+ pAC->GIni.GIFunc.pSkGeSirqIsr(pAC, IoC, Istatus);
44105+}
44106+
44107+/******************************************************************************
44108+ *
44109+ * SkGeYuSirqIsr() - Special Interrupt Service Routine
44110+ *
44111+ * Description: handles all non data transfer specific interrupts (slow path)
44112+ *
44113+ * Returns: N/A
44114+ */
44115+void SkGeYuSirqIsr(
44116+SK_AC *pAC, /* Adapter Context */
44117+SK_IOC IoC, /* I/O Context */
44118 SK_U32 Istatus) /* Interrupt status word */
44119 {
44120 SK_EVPARA Para;
44121 SK_U32 RegVal32; /* Read register value */
44122 SK_GEPORT *pPrt; /* GIni Port struct pointer */
44123- SK_U16 PhyInt;
44124+ SK_U16 PhyInt;
44125 int i;
44126
44127 if (((Istatus & IS_HW_ERR) & pAC->GIni.GIValIrqMask) != 0) {
44128 /* read the HW Error Interrupt source */
44129 SK_IN32(IoC, B0_HWE_ISRC, &RegVal32);
44130-
44131- SkGeHwErr(pAC, IoC, RegVal32);
44132+
44133+ SkGeYuHwErr(pAC, IoC, RegVal32);
44134 }
44135
44136 /*
44137@@ -569,7 +838,7 @@
44138 }
44139
44140 if (((Istatus & (IS_PA_TO_RX2 | IS_PA_TO_TX2)) != 0) &&
44141- pAC->GIni.GP[MAC_2].PState == SK_PRT_RESET) {
44142+ pAC->GIni.GP[MAC_2].PState == SK_PRT_RESET) {
44143 /* MAC 2 was not initialized but Packet timeout occured */
44144 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E005,
44145 SKERR_SIRQ_E005MSG);
44146@@ -590,8 +859,8 @@
44147 }
44148
44149 if ((Istatus & IS_PA_TO_TX1) != 0) {
44150-
44151- pPrt = &pAC->GIni.GP[0];
44152+
44153+ pPrt = &pAC->GIni.GP[MAC_1];
44154
44155 /* May be a normal situation in a server with a slow network */
44156 SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX1);
44157@@ -612,25 +881,18 @@
44158 * we ignore those
44159 */
44160 pPrt->HalfDupTimerActive = SK_TRUE;
44161-#ifdef XXX
44162- Len = sizeof(SK_U64);
44163- SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,
44164- &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 0),
44165- pAC->Rlmt.Port[0].Net->NetNumber);
44166-
44167- pPrt->LastOctets = Octets;
44168-#endif /* XXX */
44169+
44170 /* Snap statistic counters */
44171 (void)SkXmUpdateStats(pAC, IoC, 0);
44172
44173 (void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_HI, &RegVal32);
44174
44175 pPrt->LastOctets = (SK_U64)RegVal32 << 32;
44176-
44177+
44178 (void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_LO, &RegVal32);
44179
44180 pPrt->LastOctets += RegVal32;
44181-
44182+
44183 Para.Para32[0] = 0;
44184 SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME,
44185 SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para);
44186@@ -640,8 +902,8 @@
44187 }
44188
44189 if ((Istatus & IS_PA_TO_TX2) != 0) {
44190-
44191- pPrt = &pAC->GIni.GP[1];
44192+
44193+ pPrt = &pAC->GIni.GP[MAC_2];
44194
44195 /* May be a normal situation in a server with a slow network */
44196 SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX2);
44197@@ -653,25 +915,18 @@
44198 pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) &&
44199 !pPrt->HalfDupTimerActive) {
44200 pPrt->HalfDupTimerActive = SK_TRUE;
44201-#ifdef XXX
44202- Len = sizeof(SK_U64);
44203- SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,
44204- &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 1),
44205- pAC->Rlmt.Port[1].Net->NetNumber);
44206-
44207- pPrt->LastOctets = Octets;
44208-#endif /* XXX */
44209+
44210 /* Snap statistic counters */
44211 (void)SkXmUpdateStats(pAC, IoC, 1);
44212
44213 (void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_HI, &RegVal32);
44214
44215 pPrt->LastOctets = (SK_U64)RegVal32 << 32;
44216-
44217+
44218 (void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_LO, &RegVal32);
44219
44220 pPrt->LastOctets += RegVal32;
44221-
44222+
44223 Para.Para32[0] = 1;
44224 SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME,
44225 SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para);
44226@@ -684,6 +939,7 @@
44227 if ((Istatus & IS_R1_C) != 0) {
44228 /* Clear IRQ */
44229 SK_OUT32(IoC, B0_R1_CSR, CSR_IRQ_CL_C);
44230+
44231 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E006,
44232 SKERR_SIRQ_E006MSG);
44233 Para.Para64 = MAC_1;
44234@@ -695,6 +951,7 @@
44235 if ((Istatus & IS_R2_C) != 0) {
44236 /* Clear IRQ */
44237 SK_OUT32(IoC, B0_R2_CSR, CSR_IRQ_CL_C);
44238+
44239 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E007,
44240 SKERR_SIRQ_E007MSG);
44241 Para.Para64 = MAC_2;
44242@@ -706,6 +963,7 @@
44243 if ((Istatus & IS_XS1_C) != 0) {
44244 /* Clear IRQ */
44245 SK_OUT32(IoC, B0_XS1_CSR, CSR_IRQ_CL_C);
44246+
44247 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E008,
44248 SKERR_SIRQ_E008MSG);
44249 Para.Para64 = MAC_1;
44250@@ -717,6 +975,7 @@
44251 if ((Istatus & IS_XA1_C) != 0) {
44252 /* Clear IRQ */
44253 SK_OUT32(IoC, B0_XA1_CSR, CSR_IRQ_CL_C);
44254+
44255 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E009,
44256 SKERR_SIRQ_E009MSG);
44257 Para.Para64 = MAC_1;
44258@@ -728,6 +987,7 @@
44259 if ((Istatus & IS_XS2_C) != 0) {
44260 /* Clear IRQ */
44261 SK_OUT32(IoC, B0_XS2_CSR, CSR_IRQ_CL_C);
44262+
44263 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E010,
44264 SKERR_SIRQ_E010MSG);
44265 Para.Para64 = MAC_2;
44266@@ -739,6 +999,7 @@
44267 if ((Istatus & IS_XA2_C) != 0) {
44268 /* Clear IRQ */
44269 SK_OUT32(IoC, B0_XA2_CSR, CSR_IRQ_CL_C);
44270+
44271 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E011,
44272 SKERR_SIRQ_E011MSG);
44273 Para.Para64 = MAC_2;
44274@@ -751,39 +1012,37 @@
44275 if ((Istatus & IS_EXT_REG) != 0) {
44276 /* Test IRQs from PHY */
44277 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
44278-
44279+
44280 pPrt = &pAC->GIni.GP[i];
44281-
44282+
44283 if (pPrt->PState == SK_PRT_RESET) {
44284 continue;
44285 }
44286-
44287+
44288 #ifdef GENESIS
44289 if (pAC->GIni.GIGenesis) {
44290-
44291+
44292 switch (pPrt->PhyType) {
44293-
44294+
44295 case SK_PHY_XMAC:
44296 break;
44297-
44298+
44299 case SK_PHY_BCOM:
44300 SkXmPhyRead(pAC, IoC, i, PHY_BCOM_INT_STAT, &PhyInt);
44301-
44302+
44303 if ((PhyInt & ~PHY_B_DEF_MSK) != 0) {
44304 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44305- ("Port %d Bcom Int: 0x%04X\n",
44306- i, PhyInt));
44307+ ("Port %d PHY Int: 0x%04X\n", i, PhyInt));
44308 SkPhyIsrBcom(pAC, IoC, i, PhyInt);
44309 }
44310 break;
44311 #ifdef OTHER_PHY
44312 case SK_PHY_LONE:
44313 SkXmPhyRead(pAC, IoC, i, PHY_LONE_INT_STAT, &PhyInt);
44314-
44315+
44316 if ((PhyInt & PHY_L_DEF_MSK) != 0) {
44317 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44318- ("Port %d Lone Int: %x\n",
44319- i, PhyInt));
44320+ ("Port %d PHY Int: 0x%04X\n", i, PhyInt));
44321 SkPhyIsrLone(pAC, IoC, i, PhyInt);
44322 }
44323 break;
44324@@ -791,7 +1050,7 @@
44325 }
44326 }
44327 #endif /* GENESIS */
44328-
44329+
44330 #ifdef YUKON
44331 if (pAC->GIni.GIYukon) {
44332 /* Read PHY Interrupt Status */
44333@@ -799,8 +1058,7 @@
44334
44335 if ((PhyInt & PHY_M_DEF_MSK) != 0) {
44336 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44337- ("Port %d Marv Int: 0x%04X\n",
44338- i, PhyInt));
44339+ ("Port %d PHY Int: 0x%04X\n", i, PhyInt));
44340 SkPhyIsrGmac(pAC, IoC, i, PhyInt);
44341 }
44342 }
44343@@ -808,13 +1066,13 @@
44344 }
44345 }
44346
44347- /* I2C Ready interrupt */
44348+ /* TWSI Ready interrupt */
44349 if ((Istatus & IS_I2C_READY) != 0) {
44350 #ifdef SK_SLIM
44351- SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
44352-#else
44353+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
44354+#else
44355 SkI2cIsr(pAC, IoC);
44356-#endif
44357+#endif
44358 }
44359
44360 /* SW forced interrupt */
44361@@ -829,7 +1087,7 @@
44362 * us only a link going down.
44363 */
44364 /* clear interrupt */
44365- SK_OUT8(IoC, MR_ADDR(MAC_1, LNK_SYNC_CTRL), LED_CLR_IRQ);
44366+ SK_OUT8(IoC, MR_ADDR(MAC_1, LNK_SYNC_CTRL), LNK_CLR_IRQ);
44367 }
44368
44369 /* Check MAC after link sync counter */
44370@@ -844,7 +1102,7 @@
44371 * us only a link going down.
44372 */
44373 /* clear interrupt */
44374- SK_OUT8(IoC, MR_ADDR(MAC_2, LNK_SYNC_CTRL), LED_CLR_IRQ);
44375+ SK_OUT8(IoC, MR_ADDR(MAC_2, LNK_SYNC_CTRL), LNK_CLR_IRQ);
44376 }
44377
44378 /* Check MAC after link sync counter */
44379@@ -860,13 +1118,189 @@
44380 /* read the HW Error Interrupt source */
44381 SK_IN32(IoC, B0_HWE_ISRC, &RegVal32);
44382
44383- SkGeHwErr(pAC, IoC, RegVal32);
44384+ SkGeYuHwErr(pAC, IoC, RegVal32);
44385+ }
44386+
44387+ SkHwtIsr(pAC, IoC);
44388+ }
44389+
44390+} /* SkGeYuSirqIsr */
44391+
44392+#ifdef YUK2
44393+/******************************************************************************
44394+ *
44395+ * SkYuk2PortSirq() - Service HW Errors for specified port (Yukon-2 only)
44396+ *
44397+ * Description: handles the HW Error interrupts for a specific port.
44398+ *
44399+ * Returns: N/A
44400+ */
44401+static void SkYuk2PortSirq(
44402+SK_AC *pAC, /* Adapter Context */
44403+SK_IOC IoC, /* I/O Context */
44404+SK_U32 IStatus, /* Interrupt status word */
44405+int Port) /* Port Index (MAC_1 + n) */
44406+{
44407+ SK_EVPARA Para;
44408+ int Queue;
44409+ SK_U16 PhyInt;
44410+
44411+ if (Port == MAC_2) {
44412+ IStatus >>= 8;
44413+ }
44414+
44415+ /* Interrupt from PHY */
44416+ if ((IStatus & Y2_IS_IRQ_PHY1) != 0) {
44417+ /* Read PHY Interrupt Status */
44418+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyInt);
44419+
44420+ if ((PhyInt & PHY_M_DEF_MSK) != 0) {
44421+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44422+ ("Port %d PHY Int: 0x%04X\n", Port, PhyInt));
44423+ SkPhyIsrGmac(pAC, IoC, Port, PhyInt);
44424+ }
44425+ }
44426+
44427+ /* Interrupt from MAC */
44428+ if ((IStatus & Y2_IS_IRQ_MAC1) != 0) {
44429+ SkMacIrq(pAC, IoC, Port);
44430+ }
44431+
44432+ if ((IStatus & (Y2_IS_CHK_RX1 | Y2_IS_CHK_TXS1 | Y2_IS_CHK_TXA1)) != 0) {
44433+ if ((IStatus & Y2_IS_CHK_RX1) != 0) {
44434+ if (Port == MAC_1) {
44435+ Queue = Q_R1;
44436+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E006,
44437+ SKERR_SIRQ_E006MSG);
44438+ }
44439+ else {
44440+ Queue = Q_R2;
44441+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E007,
44442+ SKERR_SIRQ_E007MSG);
44443+ }
44444+ /* Clear IRQ */
44445+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_CHK);
44446+ }
44447+
44448+ if ((IStatus & Y2_IS_CHK_TXS1) != 0) {
44449+ if (Port == MAC_1) {
44450+ Queue = Q_XS1;
44451+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E008,
44452+ SKERR_SIRQ_E008MSG);
44453+ }
44454+ else {
44455+ Queue = Q_XS2;
44456+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E010,
44457+ SKERR_SIRQ_E010MSG);
44458+ }
44459+ /* Clear IRQ */
44460+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_CHK);
44461+ }
44462+
44463+ if ((IStatus & Y2_IS_CHK_TXA1) != 0) {
44464+ if (Port == MAC_1) {
44465+ Queue = Q_XA1;
44466+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E009,
44467+ SKERR_SIRQ_E009MSG);
44468+ }
44469+ else {
44470+ Queue = Q_XA2;
44471+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E011,
44472+ SKERR_SIRQ_E011MSG);
44473+ }
44474+ /* Clear IRQ */
44475+ SK_OUT32(IoC, Q_ADDR(Queue, Q_CSR), BMU_CLR_IRQ_CHK);
44476 }
44477
44478+ Para.Para64 = Port;
44479+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
44480+
44481+ Para.Para32[0] = Port;
44482+ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);
44483+ }
44484+} /* SkYuk2PortSirq */
44485+#endif /* YUK2 */
44486+
44487+/******************************************************************************
44488+ *
44489+ * SkYuk2SirqIsr() - Special Interrupt Service Routine (Yukon-2 only)
44490+ *
44491+ * Description: handles all non data transfer specific interrupts (slow path)
44492+ *
44493+ * Returns: N/A
44494+ */
44495+void SkYuk2SirqIsr(
44496+SK_AC *pAC, /* Adapter Context */
44497+SK_IOC IoC, /* I/O Context */
44498+SK_U32 Istatus) /* Interrupt status word */
44499+{
44500+#ifdef YUK2
44501+ SK_EVPARA Para;
44502+ SK_U32 RegVal32; /* Read register value */
44503+ SK_U8 Value;
44504+
44505+ /* HW Error indicated ? */
44506+ if (((Istatus & Y2_IS_HW_ERR) & pAC->GIni.GIValIrqMask) != 0) {
44507+ /* read the HW Error Interrupt source */
44508+ SK_IN32(IoC, B0_HWE_ISRC, &RegVal32);
44509+
44510+ SkYuk2HwErr(pAC, IoC, RegVal32);
44511+ }
44512+
44513+ /* Interrupt from ASF Subsystem */
44514+ if ((Istatus & Y2_IS_ASF) != 0) {
44515+ /* clear IRQ */
44516+ /* later on clearing should be done in ASF ISR handler */
44517+ SK_IN8(IoC, B28_Y2_ASF_STAT_CMD, &Value);
44518+ Value |= Y2_ASF_CLR_HSTI;
44519+ SK_OUT8(IoC, B28_Y2_ASF_STAT_CMD, Value);
44520+ /* Call IRQ handler in ASF Module */
44521+ /* TBD */
44522+ }
44523+
44524+ /* Check IRQ from polling unit */
44525+ if ((Istatus & Y2_IS_POLL_CHK) != 0) {
44526+ /* Clear IRQ */
44527+ SK_OUT32(IoC, POLL_CTRL, PC_CLR_IRQ_CHK);
44528+
44529+ SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E036,
44530+ SKERR_SIRQ_E036MSG);
44531+ Para.Para64 = 0;
44532+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para);
44533+ }
44534+
44535+ /* TWSI Ready interrupt */
44536+ if ((Istatus & Y2_IS_TWSI_RDY) != 0) {
44537+#ifdef SK_SLIM
44538+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
44539+#else
44540+ SkI2cIsr(pAC, IoC);
44541+#endif
44542+ }
44543+
44544+ /* SW forced interrupt */
44545+ if ((Istatus & Y2_IS_IRQ_SW) != 0) {
44546+ /* clear the software IRQ */
44547+ SK_OUT8(IoC, B0_CTST, CS_CL_SW_IRQ);
44548+ }
44549+
44550+ if ((Istatus & Y2_IS_L1_MASK) != 0) {
44551+ SkYuk2PortSirq(pAC, IoC, Istatus, MAC_1);
44552+ }
44553+
44554+ if ((Istatus & Y2_IS_L2_MASK) != 0) {
44555+ SkYuk2PortSirq(pAC, IoC, Istatus, MAC_2);
44556+ }
44557+
44558+ /* Timer interrupt (served last) */
44559+ if ((Istatus & Y2_IS_TIMINT) != 0) {
44560+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44561+ ("Timer Int: 0x%08lX\n", Istatus));
44562 SkHwtIsr(pAC, IoC);
44563 }
44564+#endif /* YUK2 */
44565
44566-} /* SkGeSirqIsr */
44567+} /* SkYuk2SirqIsr */
44568
44569
44570 #ifdef GENESIS
44571@@ -880,8 +1314,8 @@
44572 */
44573 static int SkGePortCheckShorts(
44574 SK_AC *pAC, /* Adapter Context */
44575-SK_IOC IoC, /* IO Context */
44576-int Port) /* Which port should be checked */
44577+SK_IOC IoC, /* I/O Context */
44578+int Port) /* Port Index (MAC_1 + n) */
44579 {
44580 SK_U32 Shorts; /* Short Event Counter */
44581 SK_U32 CheckShorts; /* Check value for Short Event Counter */
44582@@ -909,9 +1343,9 @@
44583 RxCts = 0;
44584
44585 for (i = 0; i < sizeof(SkGeRxRegs)/sizeof(SkGeRxRegs[0]); i++) {
44586-
44587+
44588 (void)SkXmMacStatistic(pAC, IoC, Port, SkGeRxRegs[i], &RxTmp);
44589-
44590+
44591 RxCts += (SK_U64)RxTmp;
44592 }
44593
44594@@ -928,11 +1362,11 @@
44595 CheckShorts = 2;
44596
44597 (void)SkXmMacStatistic(pAC, IoC, Port, XM_RXF_FCS_ERR, &FcsErrCts);
44598-
44599- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE &&
44600- pPrt->PLipaAutoNeg == SK_LIPA_UNKNOWN &&
44601- (pPrt->PLinkMode == SK_LMODE_HALF ||
44602- pPrt->PLinkMode == SK_LMODE_FULL)) {
44603+
44604+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE &&
44605+ pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_UNKNOWN &&
44606+ (pPrt->PLinkMode == (SK_U8)SK_LMODE_HALF ||
44607+ pPrt->PLinkMode == (SK_U8)SK_LMODE_FULL)) {
44608 /*
44609 * This is autosensing and we are in the fallback
44610 * manual full/half duplex mode.
44611@@ -941,16 +1375,16 @@
44612 /* Nothing received, restart link */
44613 pPrt->PPrevFcs = FcsErrCts;
44614 pPrt->PPrevShorts = Shorts;
44615-
44616+
44617 return(SK_HW_PS_RESTART);
44618 }
44619 else {
44620- pPrt->PLipaAutoNeg = SK_LIPA_MANUAL;
44621+ pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_MANUAL;
44622 }
44623 }
44624
44625 if (((RxCts - pPrt->PPrevRx) > pPrt->PRxLim) ||
44626- (!(FcsErrCts - pPrt->PPrevFcs))) {
44627+ (!(FcsErrCts - pPrt->PPrevFcs))) {
44628 /*
44629 * Note: The compare with zero above has to be done the way shown,
44630 * otherwise the Linux driver will have a problem.
44631@@ -995,29 +1429,25 @@
44632 */
44633 static int SkGePortCheckUp(
44634 SK_AC *pAC, /* Adapter Context */
44635-SK_IOC IoC, /* IO Context */
44636-int Port) /* Which port should be checked */
44637+SK_IOC IoC, /* I/O Context */
44638+int Port) /* Port Index (MAC_1 + n) */
44639 {
44640 SK_GEPORT *pPrt; /* GIni Port struct pointer */
44641 SK_BOOL AutoNeg; /* Is Auto-negotiation used ? */
44642 int Rtv; /* Return value */
44643
44644 Rtv = SK_HW_PS_NONE;
44645-
44646+
44647 pPrt = &pAC->GIni.GP[Port];
44648
44649- if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {
44650- AutoNeg = SK_FALSE;
44651- }
44652- else {
44653- AutoNeg = SK_TRUE;
44654- }
44655+ AutoNeg = pPrt->PLinkMode != SK_LMODE_HALF &&
44656+ pPrt->PLinkMode != SK_LMODE_FULL;
44657
44658 #ifdef GENESIS
44659 if (pAC->GIni.GIGenesis) {
44660
44661 switch (pPrt->PhyType) {
44662-
44663+
44664 case SK_PHY_XMAC:
44665 Rtv = SkGePortCheckUpXmac(pAC, IoC, Port, AutoNeg);
44666 break;
44667@@ -1035,15 +1465,15 @@
44668 }
44669 }
44670 #endif /* GENESIS */
44671-
44672+
44673 #ifdef YUKON
44674 if (pAC->GIni.GIYukon) {
44675-
44676+
44677 Rtv = SkGePortCheckUpGmac(pAC, IoC, Port, AutoNeg);
44678 }
44679 #endif /* YUKON */
44680
44681- return(Rtv);
44682+ return(Rtv);
44683 } /* SkGePortCheckUp */
44684
44685
44686@@ -1059,8 +1489,8 @@
44687 */
44688 static int SkGePortCheckUpXmac(
44689 SK_AC *pAC, /* Adapter Context */
44690-SK_IOC IoC, /* IO Context */
44691-int Port, /* Which port should be checked */
44692+SK_IOC IoC, /* I/O Context */
44693+int Port, /* Port Index (MAC_1 + n) */
44694 SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */
44695 {
44696 SK_U32 Shorts; /* Short Event Counter */
44697@@ -1098,7 +1528,7 @@
44698 XM_IN16(IoC, Port, XM_ISRC, &Isrc);
44699 IsrcSum |= Isrc;
44700 SkXmAutoNegLipaXmac(pAC, IoC, Port, IsrcSum);
44701-
44702+
44703 if ((Isrc & XM_IS_INP_ASS) == 0) {
44704 /* It has been in sync since last time */
44705 /* Restart the PORT */
44706@@ -1117,14 +1547,14 @@
44707 * Link Restart Workaround:
44708 * it may be possible that the other Link side
44709 * restarts its link as well an we detect
44710- * another LinkBroken. To prevent this
44711+ * another PLinkBroken. To prevent this
44712 * happening we check for a maximum number
44713 * of consecutive restart. If those happens,
44714 * we do NOT restart the active link and
44715 * check whether the link is now o.k.
44716 */
44717 pPrt->PLinkResCt++;
44718-
44719+
44720 pPrt->PAutoNegTimeOut = 0;
44721
44722 if (pPrt->PLinkResCt < SK_MAX_LRESTART) {
44723@@ -1132,13 +1562,13 @@
44724 }
44725
44726 pPrt->PLinkResCt = 0;
44727-
44728+
44729 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
44730 ("Do NOT restart on Port %d %x %x\n", Port, Isrc, IsrcSum));
44731 }
44732 else {
44733 pPrt->PIsave = (SK_U16)(IsrcSum & XM_IS_AND);
44734-
44735+
44736 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
44737 ("Save Sync/nosync Port %d %x %x\n", Port, Isrc, IsrcSum));
44738
44739@@ -1165,7 +1595,7 @@
44740 if ((Isrc & XM_IS_INP_ASS) != 0) {
44741 pPrt->PLinkBroken = SK_TRUE;
44742 /* Re-Init Link partner Autoneg flag */
44743- pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN;
44744+ pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN;
44745 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44746 ("Link broken Port %d\n", Port));
44747
44748@@ -1178,7 +1608,7 @@
44749 }
44750 else {
44751 SkXmAutoNegLipaXmac(pAC, IoC, Port, Isrc);
44752-
44753+
44754 if (SkGePortCheckShorts(pAC, IoC, Port) == SK_HW_PS_RESTART) {
44755 return(SK_HW_PS_RESTART);
44756 }
44757@@ -1194,7 +1624,7 @@
44758 IsrcSum |= Isrc;
44759
44760 SkXmAutoNegLipaXmac(pAC, IoC, Port, IsrcSum);
44761-
44762+
44763 if ((GpReg & XM_GP_INP_ASS) != 0 || (IsrcSum & XM_IS_INP_ASS) != 0) {
44764 if ((GpReg & XM_GP_INP_ASS) == 0) {
44765 /* Save Auto-negotiation Done interrupt only if link is in sync */
44766@@ -1210,17 +1640,21 @@
44767 }
44768
44769 if (AutoNeg) {
44770+ /* Auto-Negotiation Done ? */
44771 if ((IsrcSum & XM_IS_AND) != 0) {
44772+
44773 SkHWLinkUp(pAC, IoC, Port);
44774+
44775 Done = SkMacAutoNegDone(pAC, IoC, Port);
44776+
44777 if (Done != SK_AND_OK) {
44778 /* Get PHY parameters, for debugging only */
44779 SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LpAb);
44780 SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_RES_ABI, &ResAb);
44781- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
44782+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
44783 ("AutoNeg FAIL Port %d (LpAb %x, ResAb %x)\n",
44784- Port, LpAb, ResAb));
44785-
44786+ Port, LpAb, ResAb));
44787+
44788 /* Try next possible mode */
44789 NextMode = SkHWSenseGetNext(pAC, IoC, Port);
44790 SkHWLinkDown(pAC, IoC, Port);
44791@@ -1236,42 +1670,41 @@
44792 * (clear Page Received bit if set)
44793 */
44794 SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_EXP, &ExtStat);
44795-
44796+
44797 return(SK_HW_PS_LINK);
44798 }
44799-
44800+
44801 /* AutoNeg not done, but HW link is up. Check for timeouts */
44802- pPrt->PAutoNegTimeOut++;
44803- if (pPrt->PAutoNegTimeOut >= SK_AND_MAX_TO) {
44804+ if (pPrt->PAutoNegTimeOut++ >= SK_AND_MAX_TO) {
44805 /* Increase the Timeout counter */
44806 pPrt->PAutoNegTOCt++;
44807
44808 /* Timeout occured */
44809 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44810 ("AutoNeg timeout Port %d\n", Port));
44811- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE &&
44812- pPrt->PLipaAutoNeg != SK_LIPA_AUTO) {
44813+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE &&
44814+ pPrt->PLipaAutoNeg != (SK_U8)SK_LIPA_AUTO) {
44815 /* Set Link manually up */
44816 SkHWSenseSetNext(pAC, IoC, Port, SK_LMODE_FULL);
44817 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44818 ("Set manual full duplex Port %d\n", Port));
44819 }
44820
44821- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE &&
44822- pPrt->PLipaAutoNeg == SK_LIPA_AUTO &&
44823+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE &&
44824+ pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO &&
44825 pPrt->PAutoNegTOCt >= SK_MAX_ANEG_TO) {
44826 /*
44827 * This is rather complicated.
44828 * we need to check here whether the LIPA_AUTO
44829 * we saw before is false alert. We saw at one
44830- * switch ( SR8800) that on boot time it sends
44831+ * switch (SR8800) that on boot time it sends
44832 * just one auto-neg packet and does no further
44833 * auto-negotiation.
44834 * Solution: we restart the autosensing after
44835 * a few timeouts.
44836 */
44837 pPrt->PAutoNegTOCt = 0;
44838- pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN;
44839+ pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN;
44840 SkHWInitDefSense(pAC, IoC, Port);
44841 }
44842
44843@@ -1282,18 +1715,18 @@
44844 else {
44845 /* Link is up and we don't need more */
44846 #ifdef DEBUG
44847- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) {
44848- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
44849+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) {
44850+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
44851 ("ERROR: Lipa auto detected on port %d\n", Port));
44852 }
44853 #endif /* DEBUG */
44854 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
44855 ("Link sync(GP), Port %d\n", Port));
44856 SkHWLinkUp(pAC, IoC, Port);
44857-
44858+
44859 /*
44860- * Link sync (GP) and so assume a good connection. But if not received
44861- * a bunch of frames received in a time slot (maybe broken tx cable)
44862+ * Link sync (GP) and so assume a good connection. But if no
44863+ * bunch of frames received in a time slot (maybe broken Tx cable)
44864 * the port is restart.
44865 */
44866 return(SK_HW_PS_LINK);
44867@@ -1314,8 +1747,8 @@
44868 */
44869 static int SkGePortCheckUpBcom(
44870 SK_AC *pAC, /* Adapter Context */
44871-SK_IOC IoC, /* IO Context */
44872-int Port, /* Which port should be checked */
44873+SK_IOC IoC, /* I/O Context */
44874+int Port, /* Port Index (MAC_1 + n) */
44875 SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */
44876 {
44877 SK_GEPORT *pPrt; /* GIni Port struct pointer */
44878@@ -1334,74 +1767,6 @@
44879 /* Check for No HCD Link events (#10523) */
44880 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_STAT, &Isrc);
44881
44882-#ifdef xDEBUG
44883- if ((Isrc & ~(PHY_B_IS_HCT | PHY_B_IS_LCT) ==
44884- (PHY_B_IS_SCR_S_ER | PHY_B_IS_RRS_CHANGE | PHY_B_IS_LRS_CHANGE)) {
44885-
44886- SK_U32 Stat1, Stat2, Stat3;
44887-
44888- Stat1 = 0;
44889- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_MASK, &Stat1);
44890- CMSMPrintString(
44891- pAC->pConfigTable,
44892- MSG_TYPE_RUNTIME_INFO,
44893- "CheckUp1 - Stat: %x, Mask: %x",
44894- (void *)Isrc,
44895- (void *)Stat1);
44896-
44897- Stat1 = 0;
44898- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_CTRL, &Stat1);
44899- Stat2 = 0;
44900- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &Stat2);
44901- Stat1 = Stat1 << 16 | Stat2;
44902- Stat2 = 0;
44903- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, &Stat2);
44904- Stat3 = 0;
44905- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &Stat3);
44906- Stat2 = Stat2 << 16 | Stat3;
44907- CMSMPrintString(
44908- pAC->pConfigTable,
44909- MSG_TYPE_RUNTIME_INFO,
44910- "Ctrl/Stat: %x, AN Adv/LP: %x",
44911- (void *)Stat1,
44912- (void *)Stat2);
44913-
44914- Stat1 = 0;
44915- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_EXP, &Stat1);
44916- Stat2 = 0;
44917- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_EXT_STAT, &Stat2);
44918- Stat1 = Stat1 << 16 | Stat2;
44919- Stat2 = 0;
44920- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, &Stat2);
44921- Stat3 = 0;
44922- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &Stat3);
44923- Stat2 = Stat2 << 16 | Stat3;
44924- CMSMPrintString(
44925- pAC->pConfigTable,
44926- MSG_TYPE_RUNTIME_INFO,
44927- "AN Exp/IEEE Ext: %x, 1000T Ctrl/Stat: %x",
44928- (void *)Stat1,
44929- (void *)Stat2);
44930-
44931- Stat1 = 0;
44932- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_CTRL, &Stat1);
44933- Stat2 = 0;
44934- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_STAT, &Stat2);
44935- Stat1 = Stat1 << 16 | Stat2;
44936- Stat2 = 0;
44937- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &Stat2);
44938- Stat3 = 0;
44939- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_STAT, &Stat3);
44940- Stat2 = Stat2 << 16 | Stat3;
44941- CMSMPrintString(
44942- pAC->pConfigTable,
44943- MSG_TYPE_RUNTIME_INFO,
44944- "PHY Ext Ctrl/Stat: %x, Aux Ctrl/Stat: %x",
44945- (void *)Stat1,
44946- (void *)Stat2);
44947- }
44948-#endif /* DEBUG */
44949-
44950 if ((Isrc & (PHY_B_IS_NO_HDCL /* | PHY_B_IS_NO_HDC */)) != 0) {
44951 /*
44952 * Workaround BCom Errata:
44953@@ -1414,14 +1779,6 @@
44954 (SK_U16)(Ctrl & ~PHY_CT_LOOP));
44955 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
44956 ("No HCD Link event, Port %d\n", Port));
44957-#ifdef xDEBUG
44958- CMSMPrintString(
44959- pAC->pConfigTable,
44960- MSG_TYPE_RUNTIME_INFO,
44961- "No HCD link event, port %d.",
44962- (void *)Port,
44963- (void *)NULL);
44964-#endif /* DEBUG */
44965 }
44966
44967 /* Not obsolete: link status bit is latched to 0 and autoclearing! */
44968@@ -1431,72 +1788,6 @@
44969 return(SK_HW_PS_NONE);
44970 }
44971
44972-#ifdef xDEBUG
44973- {
44974- SK_U32 Stat1, Stat2, Stat3;
44975-
44976- Stat1 = 0;
44977- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_MASK, &Stat1);
44978- CMSMPrintString(
44979- pAC->pConfigTable,
44980- MSG_TYPE_RUNTIME_INFO,
44981- "CheckUp1a - Stat: %x, Mask: %x",
44982- (void *)Isrc,
44983- (void *)Stat1);
44984-
44985- Stat1 = 0;
44986- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_CTRL, &Stat1);
44987- Stat2 = 0;
44988- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &PhyStat);
44989- Stat1 = Stat1 << 16 | PhyStat;
44990- Stat2 = 0;
44991- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, &Stat2);
44992- Stat3 = 0;
44993- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &Stat3);
44994- Stat2 = Stat2 << 16 | Stat3;
44995- CMSMPrintString(
44996- pAC->pConfigTable,
44997- MSG_TYPE_RUNTIME_INFO,
44998- "Ctrl/Stat: %x, AN Adv/LP: %x",
44999- (void *)Stat1,
45000- (void *)Stat2);
45001-
45002- Stat1 = 0;
45003- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_EXP, &Stat1);
45004- Stat2 = 0;
45005- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_EXT_STAT, &Stat2);
45006- Stat1 = Stat1 << 16 | Stat2;
45007- Stat2 = 0;
45008- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, &Stat2);
45009- Stat3 = 0;
45010- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ResAb);
45011- Stat2 = Stat2 << 16 | ResAb;
45012- CMSMPrintString(
45013- pAC->pConfigTable,
45014- MSG_TYPE_RUNTIME_INFO,
45015- "AN Exp/IEEE Ext: %x, 1000T Ctrl/Stat: %x",
45016- (void *)Stat1,
45017- (void *)Stat2);
45018-
45019- Stat1 = 0;
45020- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_CTRL, &Stat1);
45021- Stat2 = 0;
45022- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_STAT, &Stat2);
45023- Stat1 = Stat1 << 16 | Stat2;
45024- Stat2 = 0;
45025- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &Stat2);
45026- Stat3 = 0;
45027- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_STAT, &Stat3);
45028- Stat2 = Stat2 << 16 | Stat3;
45029- CMSMPrintString(
45030- pAC->pConfigTable,
45031- MSG_TYPE_RUNTIME_INFO,
45032- "PHY Ext Ctrl/Stat: %x, Aux Ctrl/Stat: %x",
45033- (void *)Stat1,
45034- (void *)Stat2);
45035- }
45036-#endif /* DEBUG */
45037-
45038 /*
45039 * Here we usually can check whether the link is in sync and
45040 * auto-negotiation is done.
45041@@ -1505,7 +1796,7 @@
45042 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &PhyStat);
45043
45044 SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat);
45045-
45046+
45047 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45048 ("CheckUp Port %d, PhyStat: 0x%04X\n", Port, PhyStat));
45049
45050@@ -1513,88 +1804,62 @@
45051
45052 if ((ResAb & PHY_B_1000S_MSF) != 0) {
45053 /* Error */
45054- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45055- ("Master/Slave Fault port %d\n", Port));
45056-
45057+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
45058+ ("Master/Slave Fault, ResAb: 0x%04X\n", ResAb));
45059+
45060 pPrt->PAutoNegFail = SK_TRUE;
45061 pPrt->PMSStatus = SK_MS_STAT_FAULT;
45062-
45063+
45064 return(SK_HW_PS_RESTART);
45065 }
45066
45067 if ((PhyStat & PHY_ST_LSYNC) == 0) {
45068 return(SK_HW_PS_NONE);
45069 }
45070-
45071+
45072 pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ?
45073 SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE;
45074-
45075+
45076 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45077 ("Port %d, ResAb: 0x%04X\n", Port, ResAb));
45078
45079 if (AutoNeg) {
45080+ /* Auto-Negotiation Over ? */
45081 if ((PhyStat & PHY_ST_AN_OVER) != 0) {
45082-
45083+
45084 SkHWLinkUp(pAC, IoC, Port);
45085-
45086+
45087 Done = SkMacAutoNegDone(pAC, IoC, Port);
45088-
45089+
45090 if (Done != SK_AND_OK) {
45091 #ifdef DEBUG
45092 /* Get PHY parameters, for debugging only */
45093 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &LpAb);
45094 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ExtStat);
45095- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45096+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
45097 ("AutoNeg FAIL Port %d (LpAb %x, 1000TStat %x)\n",
45098 Port, LpAb, ExtStat));
45099 #endif /* DEBUG */
45100 return(SK_HW_PS_RESTART);
45101 }
45102 else {
45103-#ifdef xDEBUG
45104- /* Dummy read ISR to prevent extra link downs/ups */
45105- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_STAT, &ExtStat);
45106-
45107- if ((ExtStat & ~(PHY_B_IS_HCT | PHY_B_IS_LCT)) != 0) {
45108- CMSMPrintString(
45109- pAC->pConfigTable,
45110- MSG_TYPE_RUNTIME_INFO,
45111- "CheckUp2 - Stat: %x",
45112- (void *)ExtStat,
45113- (void *)NULL);
45114- }
45115-#endif /* DEBUG */
45116 return(SK_HW_PS_LINK);
45117 }
45118 }
45119 }
45120 else { /* !AutoNeg */
45121- /* Link is up and we don't need more. */
45122+ /* Link is up and we don't need more */
45123 #ifdef DEBUG
45124- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) {
45125- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45126+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) {
45127+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
45128 ("ERROR: Lipa auto detected on port %d\n", Port));
45129 }
45130 #endif /* DEBUG */
45131
45132-#ifdef xDEBUG
45133- /* Dummy read ISR to prevent extra link downs/ups */
45134- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_STAT, &ExtStat);
45135-
45136- if ((ExtStat & ~(PHY_B_IS_HCT | PHY_B_IS_LCT)) != 0) {
45137- CMSMPrintString(
45138- pAC->pConfigTable,
45139- MSG_TYPE_RUNTIME_INFO,
45140- "CheckUp3 - Stat: %x",
45141- (void *)ExtStat,
45142- (void *)NULL);
45143- }
45144-#endif /* DEBUG */
45145-
45146 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
45147 ("Link sync(GP), Port %d\n", Port));
45148 SkHWLinkUp(pAC, IoC, Port);
45149-
45150+
45151 return(SK_HW_PS_LINK);
45152 }
45153
45154@@ -1615,17 +1880,18 @@
45155 */
45156 static int SkGePortCheckUpGmac(
45157 SK_AC *pAC, /* Adapter Context */
45158-SK_IOC IoC, /* IO Context */
45159-int Port, /* Which port should be checked */
45160+SK_IOC IoC, /* I/O Context */
45161+int Port, /* Port Index (MAC_1 + n) */
45162 SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */
45163 {
45164 SK_GEPORT *pPrt; /* GIni Port struct pointer */
45165 int Done;
45166- SK_U16 PhyIsrc; /* PHY Interrupt source */
45167- SK_U16 PhyStat; /* PPY Status */
45168+ SK_U16 PhyStat; /* PHY Status */
45169 SK_U16 PhySpecStat;/* PHY Specific Status */
45170 SK_U16 ResAb; /* Master/Slave resolution */
45171+#ifndef SK_SLIM
45172 SK_EVPARA Para;
45173+#endif /* !SK_SLIM */
45174 #ifdef DEBUG
45175 SK_U16 Word; /* I/O helper */
45176 #endif /* DEBUG */
45177@@ -1642,94 +1908,124 @@
45178 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45179 ("CheckUp Port %d, PhyStat: 0x%04X\n", Port, PhyStat));
45180
45181- /* Read PHY Interrupt Status */
45182- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyIsrc);
45183+ SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat);
45184
45185- if ((PhyIsrc & PHY_M_IS_AN_COMPL) != 0) {
45186- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45187- ("Auto-Negotiation Completed, PhyIsrc: 0x%04X\n", PhyIsrc));
45188- }
45189+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) {
45190
45191- if ((PhyIsrc & PHY_M_IS_LSP_CHANGE) != 0) {
45192- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45193- ("Link Speed Changed, PhyIsrc: 0x%04X\n", PhyIsrc));
45194- }
45195+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb);
45196
45197- SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat);
45198-
45199- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb);
45200+ if ((ResAb & PHY_B_1000S_MSF) != 0) {
45201+ /* Error */
45202+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
45203+ ("Master/Slave Fault, ResAb: 0x%04X\n", ResAb));
45204
45205- if ((ResAb & PHY_B_1000S_MSF) != 0) {
45206- /* Error */
45207- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45208- ("Master/Slave Fault port %d\n", Port));
45209-
45210- pPrt->PAutoNegFail = SK_TRUE;
45211- pPrt->PMSStatus = SK_MS_STAT_FAULT;
45212-
45213- return(SK_HW_PS_RESTART);
45214+ pPrt->PAutoNegFail = SK_TRUE;
45215+ pPrt->PMSStatus = SK_MS_STAT_FAULT;
45216+
45217+ return(SK_HW_PS_RESTART);
45218+ }
45219 }
45220
45221 /* Read PHY Specific Status */
45222 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpecStat);
45223-
45224+
45225 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45226 ("Phy1000BT: 0x%04X, PhySpecStat: 0x%04X\n", ResAb, PhySpecStat));
45227
45228 #ifdef DEBUG
45229 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_EXP, &Word);
45230
45231- if ((PhyIsrc & PHY_M_IS_AN_PR) != 0 || (Word & PHY_ANE_RX_PG) != 0 ||
45232- (PhySpecStat & PHY_M_PS_PAGE_REC) != 0) {
45233+ if ((Word & PHY_ANE_RX_PG) != 0 ||
45234+ (PhySpecStat & PHY_M_PS_PAGE_REC) != 0) {
45235 /* Read PHY Next Page Link Partner */
45236 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_NEPG_LP, &Word);
45237
45238 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45239- ("Page Received, NextPage: 0x%04X\n", Word));
45240+ ("Page received, NextPage: 0x%04X\n", Word));
45241 }
45242 #endif /* DEBUG */
45243
45244 if ((PhySpecStat & PHY_M_PS_LINK_UP) == 0) {
45245+ /* Link down */
45246 return(SK_HW_PS_NONE);
45247 }
45248-
45249- if ((PhySpecStat & PHY_M_PS_DOWNS_STAT) != 0 ||
45250- (PhyIsrc & PHY_M_IS_DOWNSH_DET) != 0) {
45251- /* Downshift detected */
45252- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E025, SKERR_SIRQ_E025MSG);
45253-
45254- Para.Para64 = Port;
45255- SkEventQueue(pAC, SKGE_DRV, SK_DRV_DOWNSHIFT_DET, Para);
45256-
45257- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45258- ("Downshift detected, PhyIsrc: 0x%04X\n", PhyIsrc));
45259+
45260+#ifdef XXX
45261+ SK_U16 PhyInt;
45262+ /* Read PHY Interrupt Status */
45263+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyInt);
45264+
45265+ /* cross check that the link is really up */
45266+ if ((PhyInt & PHY_M_IS_LST_CHANGE) == 0) {
45267+ /* Link Status unchanged */
45268+ return(SK_HW_PS_NONE);
45269 }
45270+#endif /* XXX */
45271+
45272+#ifndef SK_SLIM
45273+ if (pAC->GIni.GICopperType) {
45274+
45275+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) {
45276+
45277+ if ((PhySpecStat & PHY_M_PS_DOWNS_STAT) != 0) {
45278+ /* Downshift detected */
45279+ Para.Para64 = Port;
45280+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_DOWNSHIFT_DET, Para);
45281+
45282+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45283+ ("Downshift detected, PhySpecStat: 0x%04X\n", PhySpecStat));
45284+
45285+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E025,
45286+ SKERR_SIRQ_E025MSG);
45287+ }
45288+
45289+ pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ?
45290+ SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE;
45291+ }
45292+
45293+ if ((PhySpecStat & PHY_M_PS_MDI_X_STAT) != 0) {
45294+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45295+ ("MDI Xover detected, PhyStat: 0x%04X\n", PhySpecStat));
45296+ }
45297+
45298+ /* on PHY 88E1112 & 88E1145 cable length is in Reg. 26, Page 5 */
45299+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL ||
45300+ pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) {
45301+ /* select page 5 to access VCT DSP distance register */
45302+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 5);
45303+
45304+ /* get VCT DSP distance */
45305+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL_2, &PhySpecStat);
45306+
45307+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0);
45308+
45309+ pPrt->PCableLen = (SK_U8)(PhySpecStat & PHY_M_EC2_FO_AM_MSK);
45310+ }
45311+ else {
45312+ pPrt->PCableLen = (SK_U8)((PhySpecStat & PHY_M_PS_CABLE_MSK) >> 7);
45313+ }
45314+ }
45315+#endif /* !SK_SLIM */
45316
45317- pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ?
45318- SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE;
45319-
45320- pPrt->PCableLen = (SK_U8)((PhySpecStat & PHY_M_PS_CABLE_MSK) >> 7);
45321-
45322 if (AutoNeg) {
45323- /* Auto-Negotiation Over ? */
45324+ /* Auto-Negotiation Complete ? */
45325 if ((PhyStat & PHY_ST_AN_OVER) != 0) {
45326-
45327+
45328 SkHWLinkUp(pAC, IoC, Port);
45329-
45330+
45331 Done = SkMacAutoNegDone(pAC, IoC, Port);
45332-
45333+
45334 if (Done != SK_AND_OK) {
45335 return(SK_HW_PS_RESTART);
45336 }
45337-
45338+
45339 return(SK_HW_PS_LINK);
45340 }
45341 }
45342 else { /* !AutoNeg */
45343- /* Link is up and we don't need more */
45344 #ifdef DEBUG
45345- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) {
45346- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45347+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) {
45348+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
45349 ("ERROR: Lipa auto detected on port %d\n", Port));
45350 }
45351 #endif /* DEBUG */
45352@@ -1737,12 +2033,13 @@
45353 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
45354 ("Link sync, Port %d\n", Port));
45355 SkHWLinkUp(pAC, IoC, Port);
45356-
45357+
45358 return(SK_HW_PS_LINK);
45359 }
45360
45361 return(SK_HW_PS_NONE);
45362 } /* SkGePortCheckUpGmac */
45363+
45364 #endif /* YUKON */
45365
45366
45367@@ -1758,8 +2055,8 @@
45368 */
45369 static int SkGePortCheckUpLone(
45370 SK_AC *pAC, /* Adapter Context */
45371-SK_IOC IoC, /* IO Context */
45372-int Port, /* Which port should be checked */
45373+SK_IOC IoC, /* I/O Context */
45374+int Port, /* Port Index (MAC_1 + n) */
45375 SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */
45376 {
45377 SK_GEPORT *pPrt; /* GIni Port struct pointer */
45378@@ -1788,7 +2085,7 @@
45379 StatSum |= PhyStat;
45380
45381 SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat);
45382-
45383+
45384 if ((PhyStat & PHY_ST_LSYNC) == 0) {
45385 /* Save Auto-negotiation Done bit */
45386 pPrt->PIsave = (SK_U16)(StatSum & PHY_ST_AN_OVER);
45387@@ -1802,17 +2099,21 @@
45388 }
45389
45390 if (AutoNeg) {
45391+ /* Auto-Negotiation Over ? */
45392 if ((StatSum & PHY_ST_AN_OVER) != 0) {
45393+
45394 SkHWLinkUp(pAC, IoC, Port);
45395+
45396 Done = SkMacAutoNegDone(pAC, IoC, Port);
45397+
45398 if (Done != SK_AND_OK) {
45399 /* Get PHY parameters, for debugging only */
45400 SkXmPhyRead(pAC, IoC, Port, PHY_LONE_AUNE_LP, &LpAb);
45401 SkXmPhyRead(pAC, IoC, Port, PHY_LONE_1000T_STAT, &ExtStat);
45402- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45403+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
45404 ("AutoNeg FAIL Port %d (LpAb %x, 1000TStat %x)\n",
45405 Port, LpAb, ExtStat));
45406-
45407+
45408 /* Try next possible mode */
45409 NextMode = SkHWSenseGetNext(pAC, IoC, Port);
45410 SkHWLinkDown(pAC, IoC, Port);
45411@@ -1833,15 +2134,14 @@
45412 return(SK_HW_PS_LINK);
45413 }
45414 }
45415-
45416+
45417 /* AutoNeg not done, but HW link is up. Check for timeouts */
45418- pPrt->PAutoNegTimeOut++;
45419- if (pPrt->PAutoNegTimeOut >= SK_AND_MAX_TO) {
45420+ if (pPrt->PAutoNegTimeOut++ >= SK_AND_MAX_TO) {
45421 /* Timeout occured */
45422 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
45423 ("AutoNeg timeout Port %d\n", Port));
45424- if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE &&
45425- pPrt->PLipaAutoNeg != SK_LIPA_AUTO) {
45426+ if (pPrt->PLinkModeConf == (SK_U8)SK_LMODE_AUTOSENSE &&
45427+ pPrt->PLipaAutoNeg != (SK_U8)SK_LIPA_AUTO) {
45428 /* Set Link manually up */
45429 SkHWSenseSetNext(pAC, IoC, Port, SK_LMODE_FULL);
45430 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
45431@@ -1855,8 +2155,8 @@
45432 else {
45433 /* Link is up and we don't need more */
45434 #ifdef DEBUG
45435- if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) {
45436- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45437+ if (pPrt->PLipaAutoNeg == (SK_U8)SK_LIPA_AUTO) {
45438+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
45439 ("ERROR: Lipa auto detected on port %d\n", Port));
45440 }
45441 #endif /* DEBUG */
45442@@ -1866,11 +2166,12 @@
45443 * extra link down/ups
45444 */
45445 SkXmPhyRead(pAC, IoC, Port, PHY_LONE_INT_STAT, &ExtStat);
45446-
45447+
45448 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
45449 ("Link sync(GP), Port %d\n", Port));
45450+
45451 SkHWLinkUp(pAC, IoC, Port);
45452-
45453+
45454 return(SK_HW_PS_LINK);
45455 }
45456
45457@@ -1889,8 +2190,8 @@
45458 */
45459 static int SkGePortCheckUpNat(
45460 SK_AC *pAC, /* Adapter Context */
45461-SK_IOC IoC, /* IO Context */
45462-int Port, /* Which port should be checked */
45463+SK_IOC IoC, /* I/O Context */
45464+int Port, /* Port Index (MAC_1 + n) */
45465 SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */
45466 {
45467 /* todo: National */
45468@@ -1909,38 +2210,40 @@
45469 */
45470 int SkGeSirqEvent(
45471 SK_AC *pAC, /* Adapter Context */
45472-SK_IOC IoC, /* Io Context */
45473+SK_IOC IoC, /* I/O Context */
45474 SK_U32 Event, /* Module specific Event */
45475 SK_EVPARA Para) /* Event specific Parameter */
45476 {
45477 SK_GEPORT *pPrt; /* GIni Port struct pointer */
45478- SK_U32 Port;
45479+ int Port;
45480 SK_U32 Val32;
45481 int PortStat;
45482+#ifndef SK_SLIM
45483 SK_U8 Val8;
45484+#endif
45485 #ifdef GENESIS
45486 SK_U64 Octets;
45487 #endif /* GENESIS */
45488
45489- Port = Para.Para32[0];
45490+ Port = (int)Para.Para32[0];
45491 pPrt = &pAC->GIni.GP[Port];
45492
45493 switch (Event) {
45494 case SK_HWEV_WATIM:
45495 if (pPrt->PState == SK_PRT_RESET) {
45496-
45497+
45498 PortStat = SK_HW_PS_NONE;
45499 }
45500 else {
45501 /* Check whether port came up */
45502- PortStat = SkGePortCheckUp(pAC, IoC, (int)Port);
45503+ PortStat = SkGePortCheckUp(pAC, IoC, Port);
45504 }
45505
45506 switch (PortStat) {
45507 case SK_HW_PS_RESTART:
45508 if (pPrt->PHWLinkUp) {
45509 /* Set Link to down */
45510- SkHWLinkDown(pAC, IoC, (int)Port);
45511+ SkHWLinkDown(pAC, IoC, Port);
45512
45513 /*
45514 * Signal directly to RLMT to ensure correct
45515@@ -1958,22 +2261,28 @@
45516 SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_UP, Para);
45517 break;
45518 }
45519-
45520+
45521 /* Start again the check Timer */
45522 if (pPrt->PHWLinkUp) {
45523+
45524 Val32 = SK_WA_ACT_TIME;
45525 }
45526 else {
45527 Val32 = SK_WA_INA_TIME;
45528- }
45529
45530- /* Todo: still needed for non-XMAC PHYs??? */
45531+ if (pAC->GIni.GIYukon) {
45532+ Val32 *= 5;
45533+ }
45534+ }
45535 /* Start workaround Errata #2 timer */
45536 SkTimerStart(pAC, IoC, &pPrt->PWaTimer, Val32,
45537 SKGE_HWAC, SK_HWEV_WATIM, Para);
45538+
45539 break;
45540
45541 case SK_HWEV_PORT_START:
45542+
45543+#ifndef SK_SLIM
45544 if (pPrt->PHWLinkUp) {
45545 /*
45546 * Signal directly to RLMT to ensure correct
45547@@ -1981,8 +2290,9 @@
45548 */
45549 SkRlmtEvent(pAC, IoC, SK_RLMT_LINK_DOWN, Para);
45550 }
45551+#endif /* !SK_SLIM */
45552
45553- SkHWLinkDown(pAC, IoC, (int)Port);
45554+ SkHWLinkDown(pAC, IoC, Port);
45555
45556 /* Schedule Port RESET */
45557 SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Para);
45558@@ -1990,9 +2300,11 @@
45559 /* Start workaround Errata #2 timer */
45560 SkTimerStart(pAC, IoC, &pPrt->PWaTimer, SK_WA_INA_TIME,
45561 SKGE_HWAC, SK_HWEV_WATIM, Para);
45562+
45563 break;
45564
45565 case SK_HWEV_PORT_STOP:
45566+#ifndef SK_SLIM
45567 if (pPrt->PHWLinkUp) {
45568 /*
45569 * Signal directly to RLMT to ensure correct
45570@@ -2000,20 +2312,22 @@
45571 */
45572 SkRlmtEvent(pAC, IoC, SK_RLMT_LINK_DOWN, Para);
45573 }
45574+#endif /* !SK_SLIM */
45575
45576 /* Stop Workaround Timer */
45577 SkTimerStop(pAC, IoC, &pPrt->PWaTimer);
45578
45579- SkHWLinkDown(pAC, IoC, (int)Port);
45580+ SkHWLinkDown(pAC, IoC, Port);
45581 break;
45582
45583+#ifndef SK_SLIM
45584 case SK_HWEV_UPDATE_STAT:
45585 /* We do NOT need to update any statistics */
45586 break;
45587
45588 case SK_HWEV_CLEAR_STAT:
45589 /* We do NOT need to clear any statistics */
45590- for (Port = 0; Port < (SK_U32)pAC->GIni.GIMacsFound; Port++) {
45591+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) {
45592 pPrt->PPrevRx = 0;
45593 pPrt->PPrevFcs = 0;
45594 pPrt->PPrevShorts = 0;
45595@@ -2074,6 +2388,7 @@
45596 SkEventQueue(pAC, SKGE_HWAC, SK_HWEV_PORT_START, Para);
45597 }
45598 break;
45599+#endif /* !SK_SLIM */
45600
45601 #ifdef GENESIS
45602 case SK_HWEV_HALFDUP_CHK:
45603@@ -2085,23 +2400,18 @@
45604 pPrt->HalfDupTimerActive = SK_FALSE;
45605 if (pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF ||
45606 pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) {
45607-#ifdef XXX
45608- Len = sizeof(SK_U64);
45609- SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,
45610- &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, Port),
45611- pAC->Rlmt.Port[Port].Net->NetNumber);
45612-#endif /* XXX */
45613+
45614 /* Snap statistic counters */
45615 (void)SkXmUpdateStats(pAC, IoC, Port);
45616
45617 (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXO_OK_HI, &Val32);
45618
45619 Octets = (SK_U64)Val32 << 32;
45620-
45621+
45622 (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXO_OK_LO, &Val32);
45623
45624 Octets += Val32;
45625-
45626+
45627 if (pPrt->LastOctets == Octets) {
45628 /* Tx hanging, a FIFO flush restarts it */
45629 SkMacFlushTxFifo(pAC, IoC, Port);
45630@@ -2110,7 +2420,7 @@
45631 }
45632 break;
45633 #endif /* GENESIS */
45634-
45635+
45636 default:
45637 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_SIRQ_E001, SKERR_SIRQ_E001MSG);
45638 break;
45639@@ -2131,8 +2441,8 @@
45640 */
45641 static void SkPhyIsrBcom(
45642 SK_AC *pAC, /* Adapter Context */
45643-SK_IOC IoC, /* Io Context */
45644-int Port, /* Port Num = PHY Num */
45645+SK_IOC IoC, /* I/O Context */
45646+int Port, /* Port Index (MAC_1 + n) */
45647 SK_U16 IStatus) /* Interrupt Status */
45648 {
45649 SK_GEPORT *pPrt; /* GIni Port struct pointer */
45650@@ -2145,7 +2455,7 @@
45651 SK_ERR_LOG(pAC, SK_ERRCL_HW | SK_ERRCL_INIT, SKERR_SIRQ_E022,
45652 SKERR_SIRQ_E022MSG);
45653 }
45654-
45655+
45656 if ((IStatus & (PHY_B_IS_AN_PR | PHY_B_IS_LST_CHANGE)) != 0) {
45657
45658 SkHWLinkDown(pAC, IoC, Port);
45659@@ -2174,8 +2484,8 @@
45660 */
45661 static void SkPhyIsrGmac(
45662 SK_AC *pAC, /* Adapter Context */
45663-SK_IOC IoC, /* Io Context */
45664-int Port, /* Port Num = PHY Num */
45665+SK_IOC IoC, /* I/O Context */
45666+int Port, /* Port Index (MAC_1 + n) */
45667 SK_U16 IStatus) /* Interrupt Status */
45668 {
45669 SK_GEPORT *pPrt; /* GIni Port struct pointer */
45670@@ -2184,37 +2494,69 @@
45671
45672 pPrt = &pAC->GIni.GP[Port];
45673
45674- if ((IStatus & (PHY_M_IS_AN_PR | PHY_M_IS_LST_CHANGE)) != 0) {
45675-
45676- SkHWLinkDown(pAC, IoC, Port);
45677+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45678+ ("Port %d PHY IRQ, PhyIsrc: 0x%04X\n", Port, IStatus));
45679
45680- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &Word);
45681+ if ((IStatus & PHY_M_IS_LST_CHANGE) != 0) {
45682
45683 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45684- ("AutoNeg.Adv: 0x%04X\n", Word));
45685-
45686- /* Set Auto-negotiation advertisement */
45687- if (pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) {
45688- /* restore Asymmetric Pause bit */
45689- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV,
45690- (SK_U16)(Word | PHY_M_AN_ASP));
45691- }
45692-
45693+ ("Link Status changed\n"));
45694+
45695 Para.Para32[0] = (SK_U32)Port;
45696- /* Signal to RLMT */
45697- SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);
45698+
45699+ if (pPrt->PHWLinkUp) {
45700+
45701+ SkHWLinkDown(pAC, IoC, Port);
45702+
45703+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &Word);
45704+
45705+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45706+ ("AutoNeg.Adv: 0x%04X\n", Word));
45707+
45708+ /* Set Auto-negotiation advertisement */
45709+ if (pAC->GIni.GIChipId != CHIP_ID_YUKON_FE &&
45710+ pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) {
45711+ /* restore Asymmetric Pause bit */
45712+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV,
45713+ (SK_U16)(Word | PHY_M_AN_ASP));
45714+ }
45715+
45716+ /* Signal to RLMT */
45717+ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);
45718+ }
45719+ else {
45720+ if ((IStatus & PHY_M_IS_AN_COMPL) != 0) {
45721+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45722+ ("Auto-Negotiation completed\n"));
45723+ }
45724+
45725+ if ((IStatus & PHY_M_IS_LSP_CHANGE) != 0) {
45726+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45727+ ("Link Speed changed\n"));
45728+ }
45729+
45730+ SkEventQueue(pAC, SKGE_HWAC, SK_HWEV_WATIM, Para);
45731+ }
45732 }
45733-
45734+
45735 if ((IStatus & PHY_M_IS_AN_ERROR) != 0) {
45736- /* Auto-Negotiation Error */
45737- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E023, SKERR_SIRQ_E023MSG);
45738+ /* the copper PHY makes 1 retry */
45739+ if (pAC->GIni.GICopperType) {
45740+ /* not logged as error, it might be the first attempt */
45741+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
45742+ ("Auto-Negotiation Error\n"));
45743+ }
45744+ else {
45745+ /* Auto-Negotiation Error */
45746+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E023, SKERR_SIRQ_E023MSG);
45747+ }
45748 }
45749-
45750+
45751 if ((IStatus & PHY_M_IS_FIFO_ERROR) != 0) {
45752 /* FIFO Overflow/Underrun Error */
45753 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E024, SKERR_SIRQ_E024MSG);
45754 }
45755-
45756+
45757 } /* SkPhyIsrGmac */
45758 #endif /* YUKON */
45759
45760@@ -2230,14 +2572,14 @@
45761 */
45762 static void SkPhyIsrLone(
45763 SK_AC *pAC, /* Adapter Context */
45764-SK_IOC IoC, /* Io Context */
45765-int Port, /* Port Num = PHY Num */
45766+SK_IOC IoC, /* I/O Context */
45767+int Port, /* Port Index (MAC_1 + n) */
45768 SK_U16 IStatus) /* Interrupt Status */
45769 {
45770 SK_EVPARA Para;
45771
45772 if (IStatus & (PHY_L_IS_DUP | PHY_L_IS_ISOL)) {
45773-
45774+
45775 SkHWLinkDown(pAC, IoC, Port);
45776
45777 Para.Para32[0] = (SK_U32)Port;
45778@@ -2249,3 +2591,4 @@
45779 #endif /* OTHER_PHY */
45780
45781 /* End of File */
45782+
45783diff -ruN linux/drivers/net/sk98lin/ski2c.c linux-new/drivers/net/sk98lin/ski2c.c
45784--- linux/drivers/net/sk98lin/ski2c.c 2006-04-11 19:19:28.000000000 +0200
45785+++ linux-new/drivers/net/sk98lin/ski2c.c 1970-01-01 01:00:00.000000000 +0100
45786@@ -1,1296 +0,0 @@
45787-/******************************************************************************
45788- *
45789- * Name: ski2c.c
45790- * Project: Gigabit Ethernet Adapters, TWSI-Module
45791- * Version: $Revision$
45792- * Date: $Date$
45793- * Purpose: Functions to access Voltage and Temperature Sensor
45794- *
45795- ******************************************************************************/
45796-
45797-/******************************************************************************
45798- *
45799- * (C)Copyright 1998-2002 SysKonnect.
45800- * (C)Copyright 2002-2003 Marvell.
45801- *
45802- * This program is free software; you can redistribute it and/or modify
45803- * it under the terms of the GNU General Public License as published by
45804- * the Free Software Foundation; either version 2 of the License, or
45805- * (at your option) any later version.
45806- *
45807- * The information in this file is provided "AS IS" without warranty.
45808- *
45809- ******************************************************************************/
45810-
45811-/*
45812- * I2C Protocol
45813- */
45814-#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
45815-static const char SysKonnectFileId[] =
45816- "@(#) $Id$ (C) Marvell. ";
45817-#endif
45818-
45819-#include "h/skdrv1st.h" /* Driver Specific Definitions */
45820-#include "h/lm80.h"
45821-#include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */
45822-
45823-#ifdef __C2MAN__
45824-/*
45825- I2C protocol implementation.
45826-
45827- General Description:
45828-
45829- The I2C protocol is used for the temperature sensors and for
45830- the serial EEPROM which hold the configuration.
45831-
45832- This file covers functions that allow to read write and do
45833- some bulk requests a specified I2C address.
45834-
45835- The Genesis has 2 I2C buses. One for the EEPROM which holds
45836- the VPD Data and one for temperature and voltage sensor.
45837- The following picture shows the I2C buses, I2C devices and
45838- their control registers.
45839-
45840- Note: The VPD functions are in skvpd.c
45841-.
45842-. PCI Config I2C Bus for VPD Data:
45843-.
45844-. +------------+
45845-. | VPD EEPROM |
45846-. +------------+
45847-. |
45848-. | <-- I2C
45849-. |
45850-. +-----------+-----------+
45851-. | |
45852-. +-----------------+ +-----------------+
45853-. | PCI_VPD_ADR_REG | | PCI_VPD_DAT_REG |
45854-. +-----------------+ +-----------------+
45855-.
45856-.
45857-. I2C Bus for LM80 sensor:
45858-.
45859-. +-----------------+
45860-. | Temperature and |
45861-. | Voltage Sensor |
45862-. | LM80 |
45863-. +-----------------+
45864-. |
45865-. |
45866-. I2C --> |
45867-. |
45868-. +----+
45869-. +-------------->| OR |<--+
45870-. | +----+ |
45871-. +------+------+ |
45872-. | | |
45873-. +--------+ +--------+ +----------+
45874-. | B2_I2C | | B2_I2C | | B2_I2C |
45875-. | _CTRL | | _DATA | | _SW |
45876-. +--------+ +--------+ +----------+
45877-.
45878- The I2C bus may be driven by the B2_I2C_SW or by the B2_I2C_CTRL
45879- and B2_I2C_DATA registers.
45880- For driver software it is recommended to use the I2C control and
45881- data register, because I2C bus timing is done by the ASIC and
45882- an interrupt may be received when the I2C request is completed.
45883-
45884- Clock Rate Timing: MIN MAX generated by
45885- VPD EEPROM: 50 kHz 100 kHz HW
45886- LM80 over I2C Ctrl/Data reg. 50 kHz 100 kHz HW
45887- LM80 over B2_I2C_SW register 0 400 kHz SW
45888-
45889- Note: The clock generated by the hardware is dependend on the
45890- PCI clock. If the PCI bus clock is 33 MHz, the I2C/VPD
45891- clock is 50 kHz.
45892- */
45893-intro()
45894-{}
45895-#endif
45896-
45897-#ifdef SK_DIAG
45898-/*
45899- * I2C Fast Mode timing values used by the LM80.
45900- * If new devices are added to the I2C bus the timing values have to be checked.
45901- */
45902-#ifndef I2C_SLOW_TIMING
45903-#define T_CLK_LOW 1300L /* clock low time in ns */
45904-#define T_CLK_HIGH 600L /* clock high time in ns */
45905-#define T_DATA_IN_SETUP 100L /* data in Set-up Time */
45906-#define T_START_HOLD 600L /* start condition hold time */
45907-#define T_START_SETUP 600L /* start condition Set-up time */
45908-#define T_STOP_SETUP 600L /* stop condition Set-up time */
45909-#define T_BUS_IDLE 1300L /* time the bus must free after Tx */
45910-#define T_CLK_2_DATA_OUT 900L /* max. clock low to data output valid */
45911-#else /* I2C_SLOW_TIMING */
45912-/* I2C Standard Mode Timing */
45913-#define T_CLK_LOW 4700L /* clock low time in ns */
45914-#define T_CLK_HIGH 4000L /* clock high time in ns */
45915-#define T_DATA_IN_SETUP 250L /* data in Set-up Time */
45916-#define T_START_HOLD 4000L /* start condition hold time */
45917-#define T_START_SETUP 4700L /* start condition Set-up time */
45918-#define T_STOP_SETUP 4000L /* stop condition Set-up time */
45919-#define T_BUS_IDLE 4700L /* time the bus must free after Tx */
45920-#endif /* !I2C_SLOW_TIMING */
45921-
45922-#define NS2BCLK(x) (((x)*125)/10000)
45923-
45924-/*
45925- * I2C Wire Operations
45926- *
45927- * About I2C_CLK_LOW():
45928- *
45929- * The Data Direction bit (I2C_DATA_DIR) has to be set to input when setting
45930- * clock to low, to prevent the ASIC and the I2C data client from driving the
45931- * serial data line simultaneously (ASIC: last bit of a byte = '1', I2C client
45932- * send an 'ACK'). See also Concentrator Bugreport No. 10192.
45933- */
45934-#define I2C_DATA_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA)
45935-#define I2C_DATA_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA)
45936-#define I2C_DATA_OUT(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA_DIR)
45937-#define I2C_DATA_IN(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA)
45938-#define I2C_CLK_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_CLK)
45939-#define I2C_CLK_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK | I2C_DATA_DIR)
45940-#define I2C_START_COND(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK)
45941-
45942-#define NS2CLKT(x) ((x*125L)/10000)
45943-
45944-/*--------------- I2C Interface Register Functions --------------- */
45945-
45946-/*
45947- * sending one bit
45948- */
45949-void SkI2cSndBit(
45950-SK_IOC IoC, /* I/O Context */
45951-SK_U8 Bit) /* Bit to send */
45952-{
45953- I2C_DATA_OUT(IoC);
45954- if (Bit) {
45955- I2C_DATA_HIGH(IoC);
45956- }
45957- else {
45958- I2C_DATA_LOW(IoC);
45959- }
45960- SkDgWaitTime(IoC, NS2BCLK(T_DATA_IN_SETUP));
45961- I2C_CLK_HIGH(IoC);
45962- SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH));
45963- I2C_CLK_LOW(IoC);
45964-} /* SkI2cSndBit*/
45965-
45966-
45967-/*
45968- * Signal a start to the I2C Bus.
45969- *
45970- * A start is signaled when data goes to low in a high clock cycle.
45971- *
45972- * Ends with Clock Low.
45973- *
45974- * Status: not tested
45975- */
45976-void SkI2cStart(
45977-SK_IOC IoC) /* I/O Context */
45978-{
45979- /* Init data and Clock to output lines */
45980- /* Set Data high */
45981- I2C_DATA_OUT(IoC);
45982- I2C_DATA_HIGH(IoC);
45983- /* Set Clock high */
45984- I2C_CLK_HIGH(IoC);
45985-
45986- SkDgWaitTime(IoC, NS2BCLK(T_START_SETUP));
45987-
45988- /* Set Data Low */
45989- I2C_DATA_LOW(IoC);
45990-
45991- SkDgWaitTime(IoC, NS2BCLK(T_START_HOLD));
45992-
45993- /* Clock low without Data to Input */
45994- I2C_START_COND(IoC);
45995-
45996- SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW));
45997-} /* SkI2cStart */
45998-
45999-
46000-void SkI2cStop(
46001-SK_IOC IoC) /* I/O Context */
46002-{
46003- /* Init data and Clock to output lines */
46004- /* Set Data low */
46005- I2C_DATA_OUT(IoC);
46006- I2C_DATA_LOW(IoC);
46007-
46008- SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT));
46009-
46010- /* Set Clock high */
46011- I2C_CLK_HIGH(IoC);
46012-
46013- SkDgWaitTime(IoC, NS2BCLK(T_STOP_SETUP));
46014-
46015- /*
46016- * Set Data High: Do it by setting the Data Line to Input.
46017- * Because of a pull up resistor the Data Line
46018- * floods to high.
46019- */
46020- I2C_DATA_IN(IoC);
46021-
46022- /*
46023- * When I2C activity is stopped
46024- * o DATA should be set to input and
46025- * o CLOCK should be set to high!
46026- */
46027- SkDgWaitTime(IoC, NS2BCLK(T_BUS_IDLE));
46028-} /* SkI2cStop */
46029-
46030-
46031-/*
46032- * Receive just one bit via the I2C bus.
46033- *
46034- * Note: Clock must be set to LOW before calling this function.
46035- *
46036- * Returns The received bit.
46037- */
46038-int SkI2cRcvBit(
46039-SK_IOC IoC) /* I/O Context */
46040-{
46041- int Bit;
46042- SK_U8 I2cSwCtrl;
46043-
46044- /* Init data as input line */
46045- I2C_DATA_IN(IoC);
46046-
46047- SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT));
46048-
46049- I2C_CLK_HIGH(IoC);
46050-
46051- SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH));
46052-
46053- SK_I2C_GET_SW(IoC, &I2cSwCtrl);
46054-
46055- Bit = (I2cSwCtrl & I2C_DATA) ? 1 : 0;
46056-
46057- I2C_CLK_LOW(IoC);
46058- SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW-T_CLK_2_DATA_OUT));
46059-
46060- return(Bit);
46061-} /* SkI2cRcvBit */
46062-
46063-
46064-/*
46065- * Receive an ACK.
46066- *
46067- * returns 0 If acknowledged
46068- * 1 in case of an error
46069- */
46070-int SkI2cRcvAck(
46071-SK_IOC IoC) /* I/O Context */
46072-{
46073- /*
46074- * Received bit must be zero.
46075- */
46076- return(SkI2cRcvBit(IoC) != 0);
46077-} /* SkI2cRcvAck */
46078-
46079-
46080-/*
46081- * Send an NACK.
46082- */
46083-void SkI2cSndNAck(
46084-SK_IOC IoC) /* I/O Context */
46085-{
46086- /*
46087- * Received bit must be zero.
46088- */
46089- SkI2cSndBit(IoC, 1);
46090-} /* SkI2cSndNAck */
46091-
46092-
46093-/*
46094- * Send an ACK.
46095- */
46096-void SkI2cSndAck(
46097-SK_IOC IoC) /* I/O Context */
46098-{
46099- /*
46100- * Received bit must be zero.
46101- */
46102- SkI2cSndBit(IoC, 0);
46103-} /* SkI2cSndAck */
46104-
46105-
46106-/*
46107- * Send one byte to the I2C device and wait for ACK.
46108- *
46109- * Return acknowleged status.
46110- */
46111-int SkI2cSndByte(
46112-SK_IOC IoC, /* I/O Context */
46113-int Byte) /* byte to send */
46114-{
46115- int i;
46116-
46117- for (i = 0; i < 8; i++) {
46118- if (Byte & (1<<(7-i))) {
46119- SkI2cSndBit(IoC, 1);
46120- }
46121- else {
46122- SkI2cSndBit(IoC, 0);
46123- }
46124- }
46125-
46126- return(SkI2cRcvAck(IoC));
46127-} /* SkI2cSndByte */
46128-
46129-
46130-/*
46131- * Receive one byte and ack it.
46132- *
46133- * Return byte.
46134- */
46135-int SkI2cRcvByte(
46136-SK_IOC IoC, /* I/O Context */
46137-int Last) /* Last Byte Flag */
46138-{
46139- int i;
46140- int Byte = 0;
46141-
46142- for (i = 0; i < 8; i++) {
46143- Byte <<= 1;
46144- Byte |= SkI2cRcvBit(IoC);
46145- }
46146-
46147- if (Last) {
46148- SkI2cSndNAck(IoC);
46149- }
46150- else {
46151- SkI2cSndAck(IoC);
46152- }
46153-
46154- return(Byte);
46155-} /* SkI2cRcvByte */
46156-
46157-
46158-/*
46159- * Start dialog and send device address
46160- *
46161- * Return 0 if acknowleged, 1 in case of an error
46162- */
46163-int SkI2cSndDev(
46164-SK_IOC IoC, /* I/O Context */
46165-int Addr, /* Device Address */
46166-int Rw) /* Read / Write Flag */
46167-{
46168- SkI2cStart(IoC);
46169- Rw = ~Rw;
46170- Rw &= I2C_WRITE;
46171- return(SkI2cSndByte(IoC, (Addr<<1) | Rw));
46172-} /* SkI2cSndDev */
46173-
46174-#endif /* SK_DIAG */
46175-
46176-/*----------------- I2C CTRL Register Functions ----------*/
46177-
46178-/*
46179- * waits for a completion of an I2C transfer
46180- *
46181- * returns 0: success, transfer completes
46182- * 1: error, transfer does not complete, I2C transfer
46183- * killed, wait loop terminated.
46184- */
46185-int SkI2cWait(
46186-SK_AC *pAC, /* Adapter Context */
46187-SK_IOC IoC, /* I/O Context */
46188-int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */
46189-{
46190- SK_U64 StartTime;
46191- SK_U64 CurrentTime;
46192- SK_U32 I2cCtrl;
46193-
46194- StartTime = SkOsGetTime(pAC);
46195-
46196- do {
46197- CurrentTime = SkOsGetTime(pAC);
46198-
46199- if (CurrentTime - StartTime > SK_TICKS_PER_SEC / 8) {
46200-
46201- SK_I2C_STOP(IoC);
46202-#ifndef SK_DIAG
46203- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG);
46204-#endif /* !SK_DIAG */
46205- return(1);
46206- }
46207-
46208- SK_I2C_GET_CTL(IoC, &I2cCtrl);
46209-
46210-#ifdef xYUKON_DBG
46211- printf("StartTime=%lu, CurrentTime=%lu\n",
46212- StartTime, CurrentTime);
46213- if (kbhit()) {
46214- return(1);
46215- }
46216-#endif /* YUKON_DBG */
46217-
46218- } while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31);
46219-
46220- return(0);
46221-} /* SkI2cWait */
46222-
46223-
46224-/*
46225- * waits for a completion of an I2C transfer
46226- *
46227- * Returns
46228- * Nothing
46229- */
46230-void SkI2cWaitIrq(
46231-SK_AC *pAC, /* Adapter Context */
46232-SK_IOC IoC) /* I/O Context */
46233-{
46234- SK_SENSOR *pSen;
46235- SK_U64 StartTime;
46236- SK_U32 IrqSrc;
46237-
46238- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
46239-
46240- if (pSen->SenState == SK_SEN_IDLE) {
46241- return;
46242- }
46243-
46244- StartTime = SkOsGetTime(pAC);
46245-
46246- do {
46247- if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) {
46248-
46249- SK_I2C_STOP(IoC);
46250-#ifndef SK_DIAG
46251- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E016, SKERR_I2C_E016MSG);
46252-#endif /* !SK_DIAG */
46253- return;
46254- }
46255-
46256- SK_IN32(IoC, B0_ISRC, &IrqSrc);
46257-
46258- } while ((IrqSrc & IS_I2C_READY) == 0);
46259-
46260- pSen->SenState = SK_SEN_IDLE;
46261- return;
46262-} /* SkI2cWaitIrq */
46263-
46264-/*
46265- * writes a single byte or 4 bytes into the I2C device
46266- *
46267- * returns 0: success
46268- * 1: error
46269- */
46270-int SkI2cWrite(
46271-SK_AC *pAC, /* Adapter Context */
46272-SK_IOC IoC, /* I/O Context */
46273-SK_U32 I2cData, /* I2C Data to write */
46274-int I2cDev, /* I2C Device Address */
46275-int I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */
46276-int I2cReg, /* I2C Device Register Address */
46277-int I2cBurst) /* I2C Burst Flag */
46278-{
46279- SK_OUT32(IoC, B2_I2C_DATA, I2cData);
46280-
46281- SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cDevSize, I2cReg, I2cBurst);
46282-
46283- return(SkI2cWait(pAC, IoC, I2C_WRITE));
46284-} /* SkI2cWrite*/
46285-
46286-
46287-#ifdef SK_DIAG
46288-/*
46289- * reads a single byte or 4 bytes from the I2C device
46290- *
46291- * returns the word read
46292- */
46293-SK_U32 SkI2cRead(
46294-SK_AC *pAC, /* Adapter Context */
46295-SK_IOC IoC, /* I/O Context */
46296-int I2cDev, /* I2C Device Address */
46297-int I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */
46298-int I2cReg, /* I2C Device Register Address */
46299-int I2cBurst) /* I2C Burst Flag */
46300-{
46301- SK_U32 Data;
46302-
46303- SK_OUT32(IoC, B2_I2C_DATA, 0);
46304- SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cDevSize, I2cReg, I2cBurst);
46305-
46306- if (SkI2cWait(pAC, IoC, I2C_READ) != 0) {
46307- w_print("%s\n", SKERR_I2C_E002MSG);
46308- }
46309-
46310- SK_IN32(IoC, B2_I2C_DATA, &Data);
46311-
46312- return(Data);
46313-} /* SkI2cRead */
46314-#endif /* SK_DIAG */
46315-
46316-
46317-/*
46318- * read a sensor's value
46319- *
46320- * This function reads a sensor's value from the I2C sensor chip. The sensor
46321- * is defined by its index into the sensors database in the struct pAC points
46322- * to.
46323- * Returns
46324- * 1 if the read is completed
46325- * 0 if the read must be continued (I2C Bus still allocated)
46326- */
46327-int SkI2cReadSensor(
46328-SK_AC *pAC, /* Adapter Context */
46329-SK_IOC IoC, /* I/O Context */
46330-SK_SENSOR *pSen) /* Sensor to be read */
46331-{
46332- if (pSen->SenRead != NULL) {
46333- return((*pSen->SenRead)(pAC, IoC, pSen));
46334- }
46335- else {
46336- return(0); /* no success */
46337- }
46338-} /* SkI2cReadSensor */
46339-
46340-/*
46341- * Do the Init state 0 initialization
46342- */
46343-static int SkI2cInit0(
46344-SK_AC *pAC) /* Adapter Context */
46345-{
46346- int i;
46347-
46348- /* Begin with first sensor */
46349- pAC->I2c.CurrSens = 0;
46350-
46351- /* Begin with timeout control for state machine */
46352- pAC->I2c.TimerMode = SK_TIMER_WATCH_SM;
46353-
46354- /* Set sensor number to zero */
46355- pAC->I2c.MaxSens = 0;
46356-
46357-#ifndef SK_DIAG
46358- /* Initialize Number of Dummy Reads */
46359- pAC->I2c.DummyReads = SK_MAX_SENSORS;
46360-#endif
46361-
46362- for (i = 0; i < SK_MAX_SENSORS; i++) {
46363- pAC->I2c.SenTable[i].SenDesc = "unknown";
46364- pAC->I2c.SenTable[i].SenType = SK_SEN_UNKNOWN;
46365- pAC->I2c.SenTable[i].SenThreErrHigh = 0;
46366- pAC->I2c.SenTable[i].SenThreErrLow = 0;
46367- pAC->I2c.SenTable[i].SenThreWarnHigh = 0;
46368- pAC->I2c.SenTable[i].SenThreWarnLow = 0;
46369- pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN;
46370- pAC->I2c.SenTable[i].SenInit = SK_SEN_DYN_INIT_NONE;
46371- pAC->I2c.SenTable[i].SenValue = 0;
46372- pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_NOT_PRESENT;
46373- pAC->I2c.SenTable[i].SenErrCts = 0;
46374- pAC->I2c.SenTable[i].SenBegErrTS = 0;
46375- pAC->I2c.SenTable[i].SenState = SK_SEN_IDLE;
46376- pAC->I2c.SenTable[i].SenRead = NULL;
46377- pAC->I2c.SenTable[i].SenDev = 0;
46378- }
46379-
46380- /* Now we are "INIT data"ed */
46381- pAC->I2c.InitLevel = SK_INIT_DATA;
46382- return(0);
46383-} /* SkI2cInit0*/
46384-
46385-
46386-/*
46387- * Do the init state 1 initialization
46388- *
46389- * initialize the following register of the LM80:
46390- * Configuration register:
46391- * - START, noINT, activeLOW, noINT#Clear, noRESET, noCI, noGPO#, noINIT
46392- *
46393- * Interrupt Mask Register 1:
46394- * - all interrupts are Disabled (0xff)
46395- *
46396- * Interrupt Mask Register 2:
46397- * - all interrupts are Disabled (0xff) Interrupt modi doesn't matter.
46398- *
46399- * Fan Divisor/RST_OUT register:
46400- * - Divisors set to 1 (bits 00), all others 0s.
46401- *
46402- * OS# Configuration/Temperature resolution Register:
46403- * - all 0s
46404- *
46405- */
46406-static int SkI2cInit1(
46407-SK_AC *pAC, /* Adapter Context */
46408-SK_IOC IoC) /* I/O Context */
46409-{
46410- int i;
46411- SK_U8 I2cSwCtrl;
46412- SK_GEPORT *pPrt; /* GIni Port struct pointer */
46413-
46414- if (pAC->I2c.InitLevel != SK_INIT_DATA) {
46415- /* ReInit not needed in I2C module */
46416- return(0);
46417- }
46418-
46419- /* Set the Direction of I2C-Data Pin to IN */
46420- SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA);
46421- /* Check for 32-Bit Yukon with Low at I2C-Data Pin */
46422- SK_I2C_GET_SW(IoC, &I2cSwCtrl);
46423-
46424- if ((I2cSwCtrl & I2C_DATA) == 0) {
46425- /* this is a 32-Bit board */
46426- pAC->GIni.GIYukon32Bit = SK_TRUE;
46427- return(0);
46428- }
46429-
46430- /* Check for 64 Bit Yukon without sensors */
46431- if (SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_CFG, 0) != 0) {
46432- return(0);
46433- }
46434-
46435- (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_1, 0);
46436-
46437- (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_2, 0);
46438-
46439- (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_FAN_CTRL, 0);
46440-
46441- (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_TEMP_CTRL, 0);
46442-
46443- (void)SkI2cWrite(pAC, IoC, (SK_U32)LM80_CFG_START, LM80_ADDR, I2C_025K_DEV,
46444- LM80_CFG, 0);
46445-
46446- /*
46447- * MaxSens has to be updated here, because PhyType is not
46448- * set when performing Init Level 0
46449- */
46450- pAC->I2c.MaxSens = 5;
46451-
46452- pPrt = &pAC->GIni.GP[0];
46453-
46454- if (pAC->GIni.GIGenesis) {
46455- if (pPrt->PhyType == SK_PHY_BCOM) {
46456- if (pAC->GIni.GIMacsFound == 1) {
46457- pAC->I2c.MaxSens += 1;
46458- }
46459- else {
46460- pAC->I2c.MaxSens += 3;
46461- }
46462- }
46463- }
46464- else {
46465- pAC->I2c.MaxSens += 3;
46466- }
46467-
46468- for (i = 0; i < pAC->I2c.MaxSens; i++) {
46469- switch (i) {
46470- case 0:
46471- pAC->I2c.SenTable[i].SenDesc = "Temperature";
46472- pAC->I2c.SenTable[i].SenType = SK_SEN_TEMP;
46473- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_TEMP_HIGH_ERR;
46474- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_TEMP_HIGH_WARN;
46475- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_TEMP_LOW_WARN;
46476- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_TEMP_LOW_ERR;
46477- pAC->I2c.SenTable[i].SenReg = LM80_TEMP_IN;
46478- break;
46479- case 1:
46480- pAC->I2c.SenTable[i].SenDesc = "Voltage PCI";
46481- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
46482- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PCI_5V_HIGH_ERR;
46483- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PCI_5V_HIGH_WARN;
46484- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PCI_5V_LOW_WARN;
46485- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PCI_5V_LOW_ERR;
46486- pAC->I2c.SenTable[i].SenReg = LM80_VT0_IN;
46487- break;
46488- case 2:
46489- pAC->I2c.SenTable[i].SenDesc = "Voltage PCI-IO";
46490- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
46491- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PCI_IO_5V_HIGH_ERR;
46492- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PCI_IO_5V_HIGH_WARN;
46493- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PCI_IO_3V3_LOW_WARN;
46494- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PCI_IO_3V3_LOW_ERR;
46495- pAC->I2c.SenTable[i].SenReg = LM80_VT1_IN;
46496- pAC->I2c.SenTable[i].SenInit = SK_SEN_DYN_INIT_PCI_IO;
46497- break;
46498- case 3:
46499- pAC->I2c.SenTable[i].SenDesc = "Voltage ASIC";
46500- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
46501- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_VDD_HIGH_ERR;
46502- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_VDD_HIGH_WARN;
46503- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VDD_LOW_WARN;
46504- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VDD_LOW_ERR;
46505- pAC->I2c.SenTable[i].SenReg = LM80_VT2_IN;
46506- break;
46507- case 4:
46508- if (pAC->GIni.GIGenesis) {
46509- if (pPrt->PhyType == SK_PHY_BCOM) {
46510- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY A PLL";
46511- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;
46512- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;
46513- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;
46514- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;
46515- }
46516- else {
46517- pAC->I2c.SenTable[i].SenDesc = "Voltage PMA";
46518- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;
46519- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;
46520- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;
46521- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;
46522- }
46523- }
46524- else {
46525- pAC->I2c.SenTable[i].SenDesc = "Voltage VAUX";
46526- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_VAUX_3V3_HIGH_ERR;
46527- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_VAUX_3V3_HIGH_WARN;
46528- if (pAC->GIni.GIVauxAvail) {
46529- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN;
46530- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR;
46531- }
46532- else {
46533- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VAUX_0V_WARN_ERR;
46534- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VAUX_0V_WARN_ERR;
46535- }
46536- }
46537- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
46538- pAC->I2c.SenTable[i].SenReg = LM80_VT3_IN;
46539- break;
46540- case 5:
46541- if (pAC->GIni.GIGenesis) {
46542- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5";
46543- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR;
46544- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN;
46545- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN;
46546- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR;
46547- }
46548- else {
46549- pAC->I2c.SenTable[i].SenDesc = "Voltage Core 1V5";
46550- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR;
46551- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN;
46552- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN;
46553- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR;
46554- }
46555- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
46556- pAC->I2c.SenTable[i].SenReg = LM80_VT4_IN;
46557- break;
46558- case 6:
46559- if (pAC->GIni.GIGenesis) {
46560- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY B PLL";
46561- }
46562- else {
46563- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 3V3";
46564- }
46565- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
46566- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;
46567- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;
46568- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;
46569- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;
46570- pAC->I2c.SenTable[i].SenReg = LM80_VT5_IN;
46571- break;
46572- case 7:
46573- if (pAC->GIni.GIGenesis) {
46574- pAC->I2c.SenTable[i].SenDesc = "Speed Fan";
46575- pAC->I2c.SenTable[i].SenType = SK_SEN_FAN;
46576- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_FAN_HIGH_ERR;
46577- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_FAN_HIGH_WARN;
46578- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_FAN_LOW_WARN;
46579- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_FAN_LOW_ERR;
46580- pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN;
46581- }
46582- else {
46583- pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5";
46584- pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
46585- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR;
46586- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN;
46587- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN;
46588- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR;
46589- pAC->I2c.SenTable[i].SenReg = LM80_VT6_IN;
46590- }
46591- break;
46592- default:
46593- SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW,
46594- SKERR_I2C_E001, SKERR_I2C_E001MSG);
46595- break;
46596- }
46597-
46598- pAC->I2c.SenTable[i].SenValue = 0;
46599- pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK;
46600- pAC->I2c.SenTable[i].SenErrCts = 0;
46601- pAC->I2c.SenTable[i].SenBegErrTS = 0;
46602- pAC->I2c.SenTable[i].SenState = SK_SEN_IDLE;
46603- pAC->I2c.SenTable[i].SenRead = SkLm80ReadSensor;
46604- pAC->I2c.SenTable[i].SenDev = LM80_ADDR;
46605- }
46606-
46607-#ifndef SK_DIAG
46608- pAC->I2c.DummyReads = pAC->I2c.MaxSens;
46609-#endif /* !SK_DIAG */
46610-
46611- /* Clear I2C IRQ */
46612- SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
46613-
46614- /* Now we are I/O initialized */
46615- pAC->I2c.InitLevel = SK_INIT_IO;
46616- return(0);
46617-} /* SkI2cInit1 */
46618-
46619-
46620-/*
46621- * Init level 2: Start first sensor read.
46622- */
46623-static int SkI2cInit2(
46624-SK_AC *pAC, /* Adapter Context */
46625-SK_IOC IoC) /* I/O Context */
46626-{
46627- int ReadComplete;
46628- SK_SENSOR *pSen;
46629-
46630- if (pAC->I2c.InitLevel != SK_INIT_IO) {
46631- /* ReInit not needed in I2C module */
46632- /* Init0 and Init2 not permitted */
46633- return(0);
46634- }
46635-
46636- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
46637- ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
46638-
46639- if (ReadComplete) {
46640- SK_ERR_LOG(pAC, SK_ERRCL_INIT, SKERR_I2C_E008, SKERR_I2C_E008MSG);
46641- }
46642-
46643- /* Now we are correctly initialized */
46644- pAC->I2c.InitLevel = SK_INIT_RUN;
46645-
46646- return(0);
46647-} /* SkI2cInit2*/
46648-
46649-
46650-/*
46651- * Initialize I2C devices
46652- *
46653- * Get the first voltage value and discard it.
46654- * Go into temperature read mode. A default pointer is not set.
46655- *
46656- * The things to be done depend on the init level in the parameter list:
46657- * Level 0:
46658- * Initialize only the data structures. Do NOT access hardware.
46659- * Level 1:
46660- * Initialize hardware through SK_IN / SK_OUT commands. Do NOT use interrupts.
46661- * Level 2:
46662- * Everything is possible. Interrupts may be used from now on.
46663- *
46664- * return:
46665- * 0 = success
46666- * other = error.
46667- */
46668-int SkI2cInit(
46669-SK_AC *pAC, /* Adapter Context */
46670-SK_IOC IoC, /* I/O Context needed in levels 1 and 2 */
46671-int Level) /* Init Level */
46672-{
46673-
46674- switch (Level) {
46675- case SK_INIT_DATA:
46676- return(SkI2cInit0(pAC));
46677- case SK_INIT_IO:
46678- return(SkI2cInit1(pAC, IoC));
46679- case SK_INIT_RUN:
46680- return(SkI2cInit2(pAC, IoC));
46681- default:
46682- break;
46683- }
46684-
46685- return(0);
46686-} /* SkI2cInit */
46687-
46688-
46689-#ifndef SK_DIAG
46690-
46691-/*
46692- * Interrupt service function for the I2C Interface
46693- *
46694- * Clears the Interrupt source
46695- *
46696- * Reads the register and check it for sending a trap.
46697- *
46698- * Starts the timer if necessary.
46699- */
46700-void SkI2cIsr(
46701-SK_AC *pAC, /* Adapter Context */
46702-SK_IOC IoC) /* I/O Context */
46703-{
46704- SK_EVPARA Para;
46705-
46706- /* Clear I2C IRQ */
46707- SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
46708-
46709- Para.Para64 = 0;
46710- SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_IRQ, Para);
46711-} /* SkI2cIsr */
46712-
46713-
46714-/*
46715- * Check this sensors Value against the threshold and send events.
46716- */
46717-static void SkI2cCheckSensor(
46718-SK_AC *pAC, /* Adapter Context */
46719-SK_SENSOR *pSen)
46720-{
46721- SK_EVPARA ParaLocal;
46722- SK_BOOL TooHigh; /* Is sensor too high? */
46723- SK_BOOL TooLow; /* Is sensor too low? */
46724- SK_U64 CurrTime; /* Current Time */
46725- SK_BOOL DoTrapSend; /* We need to send a trap */
46726- SK_BOOL DoErrLog; /* We need to log the error */
46727- SK_BOOL IsError; /* We need to log the error */
46728-
46729- /* Check Dummy Reads first */
46730- if (pAC->I2c.DummyReads > 0) {
46731- pAC->I2c.DummyReads--;
46732- return;
46733- }
46734-
46735- /* Get the current time */
46736- CurrTime = SkOsGetTime(pAC);
46737-
46738- /* Set para to the most useful setting: The current sensor. */
46739- ParaLocal.Para64 = (SK_U64)pAC->I2c.CurrSens;
46740-
46741- /* Check the Value against the thresholds. First: Error Thresholds */
46742- TooHigh = (pSen->SenValue > pSen->SenThreErrHigh);
46743- TooLow = (pSen->SenValue < pSen->SenThreErrLow);
46744-
46745- IsError = SK_FALSE;
46746- if (TooHigh || TooLow) {
46747- /* Error condition is satisfied */
46748- DoTrapSend = SK_TRUE;
46749- DoErrLog = SK_TRUE;
46750-
46751- /* Now error condition is satisfied */
46752- IsError = SK_TRUE;
46753-
46754- if (pSen->SenErrFlag == SK_SEN_ERR_ERR) {
46755- /* This state is the former one */
46756-
46757- /* So check first whether we have to send a trap */
46758- if (pSen->SenLastErrTrapTS + SK_SEN_ERR_TR_HOLD >
46759- CurrTime) {
46760- /*
46761- * Do NOT send the Trap. The hold back time
46762- * has to run out first.
46763- */
46764- DoTrapSend = SK_FALSE;
46765- }
46766-
46767- /* Check now whether we have to log an Error */
46768- if (pSen->SenLastErrLogTS + SK_SEN_ERR_LOG_HOLD >
46769- CurrTime) {
46770- /*
46771- * Do NOT log the error. The hold back time
46772- * has to run out first.
46773- */
46774- DoErrLog = SK_FALSE;
46775- }
46776- }
46777- else {
46778- /* We came from a different state -> Set Begin Time Stamp */
46779- pSen->SenBegErrTS = CurrTime;
46780- pSen->SenErrFlag = SK_SEN_ERR_ERR;
46781- }
46782-
46783- if (DoTrapSend) {
46784- /* Set current Time */
46785- pSen->SenLastErrTrapTS = CurrTime;
46786- pSen->SenErrCts++;
46787-
46788- /* Queue PNMI Event */
46789- SkEventQueue(pAC, SKGE_PNMI, (TooHigh ?
46790- SK_PNMI_EVT_SEN_ERR_UPP :
46791- SK_PNMI_EVT_SEN_ERR_LOW),
46792- ParaLocal);
46793- }
46794-
46795- if (DoErrLog) {
46796- /* Set current Time */
46797- pSen->SenLastErrLogTS = CurrTime;
46798-
46799- if (pSen->SenType == SK_SEN_TEMP) {
46800- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E011, SKERR_I2C_E011MSG);
46801- }
46802- else if (pSen->SenType == SK_SEN_VOLT) {
46803- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E012, SKERR_I2C_E012MSG);
46804- }
46805- else {
46806- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E015, SKERR_I2C_E015MSG);
46807- }
46808- }
46809- }
46810-
46811- /* Check the Value against the thresholds */
46812- /* 2nd: Warning thresholds */
46813- TooHigh = (pSen->SenValue > pSen->SenThreWarnHigh);
46814- TooLow = (pSen->SenValue < pSen->SenThreWarnLow);
46815-
46816- if (!IsError && (TooHigh || TooLow)) {
46817- /* Error condition is satisfied */
46818- DoTrapSend = SK_TRUE;
46819- DoErrLog = SK_TRUE;
46820-
46821- if (pSen->SenErrFlag == SK_SEN_ERR_WARN) {
46822- /* This state is the former one */
46823-
46824- /* So check first whether we have to send a trap */
46825- if (pSen->SenLastWarnTrapTS + SK_SEN_WARN_TR_HOLD > CurrTime) {
46826- /*
46827- * Do NOT send the Trap. The hold back time
46828- * has to run out first.
46829- */
46830- DoTrapSend = SK_FALSE;
46831- }
46832-
46833- /* Check now whether we have to log an Error */
46834- if (pSen->SenLastWarnLogTS + SK_SEN_WARN_LOG_HOLD > CurrTime) {
46835- /*
46836- * Do NOT log the error. The hold back time
46837- * has to run out first.
46838- */
46839- DoErrLog = SK_FALSE;
46840- }
46841- }
46842- else {
46843- /* We came from a different state -> Set Begin Time Stamp */
46844- pSen->SenBegWarnTS = CurrTime;
46845- pSen->SenErrFlag = SK_SEN_ERR_WARN;
46846- }
46847-
46848- if (DoTrapSend) {
46849- /* Set current Time */
46850- pSen->SenLastWarnTrapTS = CurrTime;
46851- pSen->SenWarnCts++;
46852-
46853- /* Queue PNMI Event */
46854- SkEventQueue(pAC, SKGE_PNMI, (TooHigh ?
46855- SK_PNMI_EVT_SEN_WAR_UPP :
46856- SK_PNMI_EVT_SEN_WAR_LOW),
46857- ParaLocal);
46858- }
46859-
46860- if (DoErrLog) {
46861- /* Set current Time */
46862- pSen->SenLastWarnLogTS = CurrTime;
46863-
46864- if (pSen->SenType == SK_SEN_TEMP) {
46865- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E009, SKERR_I2C_E009MSG);
46866- }
46867- else if (pSen->SenType == SK_SEN_VOLT) {
46868- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E010, SKERR_I2C_E010MSG);
46869- }
46870- else {
46871- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E014, SKERR_I2C_E014MSG);
46872- }
46873- }
46874- }
46875-
46876- /* Check for NO error at all */
46877- if (!IsError && !TooHigh && !TooLow) {
46878- /* Set o.k. Status if no error and no warning condition */
46879- pSen->SenErrFlag = SK_SEN_ERR_OK;
46880- }
46881-
46882- /* End of check against the thresholds */
46883-
46884- /* Bug fix AF: 16.Aug.2001: Correct the init base
46885- * of LM80 sensor.
46886- */
46887- if (pSen->SenInit == SK_SEN_DYN_INIT_PCI_IO) {
46888-
46889- pSen->SenInit = SK_SEN_DYN_INIT_NONE;
46890-
46891- if (pSen->SenValue > SK_SEN_PCI_IO_RANGE_LIMITER) {
46892- /* 5V PCI-IO Voltage */
46893- pSen->SenThreWarnLow = SK_SEN_PCI_IO_5V_LOW_WARN;
46894- pSen->SenThreErrLow = SK_SEN_PCI_IO_5V_LOW_ERR;
46895- }
46896- else {
46897- /* 3.3V PCI-IO Voltage */
46898- pSen->SenThreWarnHigh = SK_SEN_PCI_IO_3V3_HIGH_WARN;
46899- pSen->SenThreErrHigh = SK_SEN_PCI_IO_3V3_HIGH_ERR;
46900- }
46901- }
46902-
46903-#ifdef TEST_ONLY
46904- /* Dynamic thresholds also for VAUX of LM80 sensor */
46905- if (pSen->SenInit == SK_SEN_DYN_INIT_VAUX) {
46906-
46907- pSen->SenInit = SK_SEN_DYN_INIT_NONE;
46908-
46909- /* 3.3V VAUX Voltage */
46910- if (pSen->SenValue > SK_SEN_VAUX_RANGE_LIMITER) {
46911- pSen->SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN;
46912- pSen->SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR;
46913- }
46914- /* 0V VAUX Voltage */
46915- else {
46916- pSen->SenThreWarnHigh = SK_SEN_VAUX_0V_WARN_ERR;
46917- pSen->SenThreErrHigh = SK_SEN_VAUX_0V_WARN_ERR;
46918- }
46919- }
46920-
46921- /*
46922- * Check initialization state:
46923- * The VIO Thresholds need adaption
46924- */
46925- if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN &&
46926- pSen->SenValue > SK_SEN_WARNLOW2C &&
46927- pSen->SenValue < SK_SEN_WARNHIGH2) {
46928- pSen->SenThreErrLow = SK_SEN_ERRLOW2C;
46929- pSen->SenThreWarnLow = SK_SEN_WARNLOW2C;
46930- pSen->SenInit = SK_TRUE;
46931- }
46932-
46933- if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN &&
46934- pSen->SenValue > SK_SEN_WARNLOW2 &&
46935- pSen->SenValue < SK_SEN_WARNHIGH2C) {
46936- pSen->SenThreErrHigh = SK_SEN_ERRHIGH2C;
46937- pSen->SenThreWarnHigh = SK_SEN_WARNHIGH2C;
46938- pSen->SenInit = SK_TRUE;
46939- }
46940-#endif
46941-
46942- if (pSen->SenInit != SK_SEN_DYN_INIT_NONE) {
46943- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E013, SKERR_I2C_E013MSG);
46944- }
46945-} /* SkI2cCheckSensor */
46946-
46947-
46948-/*
46949- * The only Event to be served is the timeout event
46950- *
46951- */
46952-int SkI2cEvent(
46953-SK_AC *pAC, /* Adapter Context */
46954-SK_IOC IoC, /* I/O Context */
46955-SK_U32 Event, /* Module specific Event */
46956-SK_EVPARA Para) /* Event specific Parameter */
46957-{
46958- int ReadComplete;
46959- SK_SENSOR *pSen;
46960- SK_U32 Time;
46961- SK_EVPARA ParaLocal;
46962- int i;
46963-
46964- /* New case: no sensors */
46965- if (pAC->I2c.MaxSens == 0) {
46966- return(0);
46967- }
46968-
46969- switch (Event) {
46970- case SK_I2CEV_IRQ:
46971- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
46972- ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
46973-
46974- if (ReadComplete) {
46975- /* Check sensor against defined thresholds */
46976- SkI2cCheckSensor(pAC, pSen);
46977-
46978- /* Increment Current sensor and set appropriate Timeout */
46979- pAC->I2c.CurrSens++;
46980- if (pAC->I2c.CurrSens >= pAC->I2c.MaxSens) {
46981- pAC->I2c.CurrSens = 0;
46982- Time = SK_I2C_TIM_LONG;
46983- }
46984- else {
46985- Time = SK_I2C_TIM_SHORT;
46986- }
46987-
46988- /* Start Timer */
46989- ParaLocal.Para64 = (SK_U64)0;
46990-
46991- pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING;
46992-
46993- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time,
46994- SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
46995- }
46996- else {
46997- /* Start Timer */
46998- ParaLocal.Para64 = (SK_U64)0;
46999-
47000- pAC->I2c.TimerMode = SK_TIMER_WATCH_SM;
47001-
47002- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, SK_I2C_TIM_WATCH,
47003- SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
47004- }
47005- break;
47006- case SK_I2CEV_TIM:
47007- if (pAC->I2c.TimerMode == SK_TIMER_NEW_GAUGING) {
47008-
47009- ParaLocal.Para64 = (SK_U64)0;
47010- SkTimerStop(pAC, IoC, &pAC->I2c.SenTimer);
47011-
47012- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
47013- ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
47014-
47015- if (ReadComplete) {
47016- /* Check sensor against defined thresholds */
47017- SkI2cCheckSensor(pAC, pSen);
47018-
47019- /* Increment Current sensor and set appropriate Timeout */
47020- pAC->I2c.CurrSens++;
47021- if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) {
47022- pAC->I2c.CurrSens = 0;
47023- Time = SK_I2C_TIM_LONG;
47024- }
47025- else {
47026- Time = SK_I2C_TIM_SHORT;
47027- }
47028-
47029- /* Start Timer */
47030- ParaLocal.Para64 = (SK_U64)0;
47031-
47032- pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING;
47033-
47034- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time,
47035- SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
47036- }
47037- }
47038- else {
47039- pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
47040- pSen->SenErrFlag = SK_SEN_ERR_FAULTY;
47041- SK_I2C_STOP(IoC);
47042-
47043- /* Increment Current sensor and set appropriate Timeout */
47044- pAC->I2c.CurrSens++;
47045- if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) {
47046- pAC->I2c.CurrSens = 0;
47047- Time = SK_I2C_TIM_LONG;
47048- }
47049- else {
47050- Time = SK_I2C_TIM_SHORT;
47051- }
47052-
47053- /* Start Timer */
47054- ParaLocal.Para64 = (SK_U64)0;
47055-
47056- pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING;
47057-
47058- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time,
47059- SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
47060- }
47061- break;
47062- case SK_I2CEV_CLEAR:
47063- for (i = 0; i < SK_MAX_SENSORS; i++) {
47064- pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK;
47065- pAC->I2c.SenTable[i].SenErrCts = 0;
47066- pAC->I2c.SenTable[i].SenWarnCts = 0;
47067- pAC->I2c.SenTable[i].SenBegErrTS = 0;
47068- pAC->I2c.SenTable[i].SenBegWarnTS = 0;
47069- pAC->I2c.SenTable[i].SenLastErrTrapTS = (SK_U64)0;
47070- pAC->I2c.SenTable[i].SenLastErrLogTS = (SK_U64)0;
47071- pAC->I2c.SenTable[i].SenLastWarnTrapTS = (SK_U64)0;
47072- pAC->I2c.SenTable[i].SenLastWarnLogTS = (SK_U64)0;
47073- }
47074- break;
47075- default:
47076- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E006, SKERR_I2C_E006MSG);
47077- }
47078-
47079- return(0);
47080-} /* SkI2cEvent*/
47081-
47082-#endif /* !SK_DIAG */
47083diff -ruN linux/drivers/net/sk98lin/sklm80.c linux-new/drivers/net/sk98lin/sklm80.c
47084--- linux/drivers/net/sk98lin/sklm80.c 2006-04-11 19:19:28.000000000 +0200
47085+++ linux-new/drivers/net/sk98lin/sklm80.c 2006-01-18 14:37:24.000000000 +0100
47086@@ -2,8 +2,8 @@
47087 *
47088 * Name: sklm80.c
47089 * Project: Gigabit Ethernet Adapters, TWSI-Module
47090- * Version: $Revision$
47091- * Date: $Date$
47092+ * Version: $Revision$
47093+ * Date: $Date$
47094 * Purpose: Functions to access Voltage and Temperature Sensor (LM80)
47095 *
47096 ******************************************************************************/
47097@@ -27,7 +27,7 @@
47098 */
47099 #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
47100 static const char SysKonnectFileId[] =
47101- "@(#) $Id$ (C) Marvell. ";
47102+ "@(#) $Id$ (C) Marvell. ";
47103 #endif
47104
47105 #include "h/skdrv1st.h" /* Driver Specific Definitions */
47106@@ -111,12 +111,12 @@
47107 /*
47108 * read a sensors value (LM80 specific)
47109 *
47110- * This function reads a sensors value from the I2C sensor chip LM80.
47111+ * This function reads a sensors value from the TWSI sensor chip LM80.
47112 * The sensor is defined by its index into the sensors database in the struct
47113 * pAC points to.
47114 *
47115 * Returns 1 if the read is completed
47116- * 0 if the read must be continued (I2C Bus still allocated)
47117+ * 0 if the read must be continued (TWSI Bus still allocated)
47118 */
47119 int SkLm80ReadSensor(
47120 SK_AC *pAC, /* Adapter Context */
47121diff -ruN linux/drivers/net/sk98lin/skproc.c linux-new/drivers/net/sk98lin/skproc.c
47122--- linux/drivers/net/sk98lin/skproc.c 1970-01-01 01:00:00.000000000 +0100
47123+++ linux-new/drivers/net/sk98lin/skproc.c 2006-01-18 14:37:24.000000000 +0100
47124@@ -0,0 +1,477 @@
47125+/******************************************************************************
47126+ *
47127+ * Name: skproc.c
47128+ * Project: GEnesis, PCI Gigabit Ethernet Adapter
47129+ * Version: $Revision$
47130+ * Date: $Date$
47131+ * Purpose: Functions to display statictic data
47132+ *
47133+ ******************************************************************************/
47134+
47135+/******************************************************************************
47136+ *
47137+ * (C)Copyright 1998-2002 SysKonnect GmbH.
47138+ * (C)Copyright 2002-2005 Marvell.
47139+ *
47140+ * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet
47141+ * Server Adapters.
47142+ *
47143+ * Author: Ralph Roesler (rroesler@syskonnect.de)
47144+ * Mirko Lindner (mlindner@syskonnect.de)
47145+ *
47146+ * Address all question to: linux@syskonnect.de
47147+ *
47148+ * This program is free software; you can redistribute it and/or modify
47149+ * it under the terms of the GNU General Public License as published by
47150+ * the Free Software Foundation; either version 2 of the License, or
47151+ * (at your option) any later version.
47152+ *
47153+ * The information in this file is provided "AS IS" without warranty.
47154+ *
47155+ *****************************************************************************/
47156+
47157+#include <linux/proc_fs.h>
47158+#include <linux/seq_file.h>
47159+
47160+#include "h/skdrv1st.h"
47161+#include "h/skdrv2nd.h"
47162+#include "h/skversion.h"
47163+
47164+extern struct SK_NET_DEVICE *SkGeRootDev;
47165+
47166+/******************************************************************************
47167+ *
47168+ * Local Function Prototypes and Local Variables
47169+ *
47170+ *****************************************************************************/
47171+
47172+static int sk_proc_print(void *writePtr, char *format, ...);
47173+static void sk_gen_browse(void *buffer);
47174+static int len;
47175+
47176+static int sk_seq_show(struct seq_file *seq, void *v);
47177+static int sk_proc_open(struct inode *inode, struct file *file);
47178+struct file_operations sk_proc_fops = {
47179+ .owner = THIS_MODULE,
47180+ .open = sk_proc_open,
47181+ .read = seq_read,
47182+ .llseek = seq_lseek,
47183+ .release = single_release,
47184+};
47185+struct net_device *currDev = NULL;
47186+
47187+/*****************************************************************************
47188+ *
47189+ * sk_gen_browse -generic print "summaries" entry
47190+ *
47191+ * Description:
47192+ * This function fills the proc entry with statistic data about
47193+ * the ethernet device.
47194+ *
47195+ * Returns: N/A
47196+ *
47197+ */
47198+static void sk_gen_browse(
47199+void *buffer) /* buffer where the statistics will be stored in */
47200+{
47201+ struct SK_NET_DEVICE *SkgeProcDev = SkGeRootDev;
47202+ struct SK_NET_DEVICE *next;
47203+ SK_BOOL DisableStatistic = 0;
47204+ SK_PNMI_STRUCT_DATA *pPnmiStruct;
47205+ SK_PNMI_STAT *pPnmiStat;
47206+ unsigned long Flags;
47207+ unsigned int Size;
47208+ DEV_NET *pNet;
47209+ SK_AC *pAC;
47210+ char sens_msg[50];
47211+ int card_type;
47212+ int MaxSecurityCount = 0;
47213+ int t;
47214+ int i;
47215+
47216+ while (SkgeProcDev) {
47217+ MaxSecurityCount++;
47218+ if (MaxSecurityCount > 100) {
47219+ printk("Max limit for sk_proc_read security counter!\n");
47220+ return;
47221+ }
47222+ pNet = (DEV_NET*) SkgeProcDev->priv;
47223+ pAC = pNet->pAC;
47224+ next = pAC->Next;
47225+ pPnmiStruct = &pAC->PnmiStruct;
47226+ /* NetIndex in GetStruct is now required, zero is only dummy */
47227+
47228+ for (t=pAC->GIni.GIMacsFound; t > 0; t--) {
47229+ if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1)
47230+ t--;
47231+
47232+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
47233+ Size = SK_PNMI_STRUCT_SIZE;
47234+ DisableStatistic = 0;
47235+ if (pAC->BoardLevel == SK_INIT_DATA) {
47236+ SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA));
47237+ if (pAC->DiagModeActive == DIAG_NOTACTIVE) {
47238+ pAC->Pnmi.DiagAttached = SK_DIAG_IDLE;
47239+ }
47240+ } else {
47241+ SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1);
47242+ }
47243+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
47244+ if (strcmp(pAC->dev[t-1]->name, currDev->name) == 0) {
47245+ if (!pAC->GIni.GIYukon32Bit)
47246+ card_type = 64;
47247+ else
47248+ card_type = 32;
47249+
47250+ pPnmiStat = &pPnmiStruct->Stat[0];
47251+ len = sk_proc_print(buffer,
47252+ "\nDetailed statistic for device %s\n",
47253+ pAC->dev[t-1]->name);
47254+ len += sk_proc_print(buffer,
47255+ "=======================================\n");
47256+
47257+ /* Board statistics */
47258+ len += sk_proc_print(buffer,
47259+ "\nBoard statistics\n\n");
47260+ len += sk_proc_print(buffer,
47261+ "Card name %s\n",
47262+ pAC->DeviceStr);
47263+ len += sk_proc_print(buffer,
47264+ "Vendor/Device ID %x/%x\n",
47265+ pAC->PciDev->vendor,
47266+ pAC->PciDev->device);
47267+ len += sk_proc_print(buffer,
47268+ "Card type (Bit) %d\n",
47269+ card_type);
47270+
47271+ len += sk_proc_print(buffer,
47272+ "Active Port %c\n",
47273+ 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
47274+ Net[t-1].PrefPort]->PortNumber);
47275+ len += sk_proc_print(buffer,
47276+ "Preferred Port %c\n",
47277+ 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
47278+ Net[t-1].PrefPort]->PortNumber);
47279+
47280+ if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) {
47281+ len += sk_proc_print(buffer,
47282+ "Interrupt Moderation static (%d ints/sec)\n",
47283+ pAC->DynIrqModInfo.MaxModIntsPerSec);
47284+ } else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) {
47285+ len += sk_proc_print(buffer,
47286+ "Interrupt Moderation dynamic (%d ints/sec)\n",
47287+ pAC->DynIrqModInfo.MaxModIntsPerSec);
47288+ } else {
47289+ len += sk_proc_print(buffer,
47290+ "Interrupt Moderation disabled\n");
47291+ }
47292+
47293+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) {
47294+ len += sk_proc_print(buffer,
47295+ "Bus type PCI-Express\n");
47296+ len += sk_proc_print(buffer,
47297+ "Bus width (Lanes) %d\n",
47298+ pAC->GIni.GIPexWidth);
47299+ } else {
47300+ if (pAC->GIni.GIPciBus == SK_PCIX_BUS) {
47301+ len += sk_proc_print(buffer,
47302+ "Bus type PCI-X\n");
47303+ if (pAC->GIni.GIPciMode == PCI_OS_SPD_X133) {
47304+ len += sk_proc_print(buffer,
47305+ "Bus speed (MHz) 133\n");
47306+ } else if (pAC->GIni.GIPciMode == PCI_OS_SPD_X100) {
47307+ len += sk_proc_print(buffer,
47308+ "Bus speed (MHz) 100\n");
47309+ } else if (pAC->GIni.GIPciMode == PCI_OS_SPD_X66) {
47310+ len += sk_proc_print(buffer,
47311+ "Bus speed (MHz) 66\n");
47312+ } else {
47313+ len += sk_proc_print(buffer,
47314+ "Bus speed (MHz) 33\n");
47315+ }
47316+ } else {
47317+ len += sk_proc_print(buffer,
47318+ "Bus type PCI\n");
47319+ len += sk_proc_print(buffer,
47320+ "Bus speed (MHz) %d\n",
47321+ pPnmiStruct->BusSpeed);
47322+ }
47323+ len += sk_proc_print(buffer,
47324+ "Bus width (Bit) %d\n",
47325+ pPnmiStruct->BusWidth);
47326+ }
47327+
47328+ len += sk_proc_print(buffer,
47329+ "Driver version %s (%s)\n",
47330+ VER_STRING, PATCHLEVEL);
47331+ len += sk_proc_print(buffer,
47332+ "Driver release date %s\n",
47333+ pAC->Pnmi.pDriverReleaseDate);
47334+ len += sk_proc_print(buffer,
47335+ "Hardware revision v%d.%d\n",
47336+ (pAC->GIni.GIPciHwRev >> 4) & 0x0F,
47337+ pAC->GIni.GIPciHwRev & 0x0F);
47338+
47339+ if (!netif_running(pAC->dev[t-1])) {
47340+ len += sk_proc_print(buffer,
47341+ "\n Device %s is down.\n"
47342+ " Therefore no statistics are available.\n"
47343+ " After bringing the device up (ifconfig)"
47344+ " statistics will\n"
47345+ " be displayed.\n",
47346+ pAC->dev[t-1]->name);
47347+ DisableStatistic = 1;
47348+ }
47349+
47350+ /* Display only if statistic info available */
47351+ /* Print sensor informations */
47352+ if (!DisableStatistic) {
47353+ for (i=0; i < pAC->I2c.MaxSens; i ++) {
47354+ /* Check type */
47355+ switch (pAC->I2c.SenTable[i].SenType) {
47356+ case 1:
47357+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
47358+ strcat(sens_msg, " (C)");
47359+ len += sk_proc_print(buffer,
47360+ "%-25s %d.%02d\n",
47361+ sens_msg,
47362+ pAC->I2c.SenTable[i].SenValue / 10,
47363+ pAC->I2c.SenTable[i].SenValue %
47364+ 10);
47365+
47366+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
47367+ strcat(sens_msg, " (F)");
47368+ len += sk_proc_print(buffer,
47369+ "%-25s %d.%02d\n",
47370+ sens_msg,
47371+ ((((pAC->I2c.SenTable[i].SenValue)
47372+ *10)*9)/5 + 3200)/100,
47373+ ((((pAC->I2c.SenTable[i].SenValue)
47374+ *10)*9)/5 + 3200) % 10);
47375+ break;
47376+ case 2:
47377+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
47378+ strcat(sens_msg, " (V)");
47379+ len += sk_proc_print(buffer,
47380+ "%-25s %d.%03d\n",
47381+ sens_msg,
47382+ pAC->I2c.SenTable[i].SenValue / 1000,
47383+ pAC->I2c.SenTable[i].SenValue % 1000);
47384+ break;
47385+ case 3:
47386+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
47387+ strcat(sens_msg, " (rpm)");
47388+ len += sk_proc_print(buffer,
47389+ "%-25s %d\n",
47390+ sens_msg,
47391+ pAC->I2c.SenTable[i].SenValue);
47392+ break;
47393+ default:
47394+ break;
47395+ }
47396+ }
47397+
47398+ /*Receive statistics */
47399+ len += sk_proc_print(buffer,
47400+ "\nReceive statistics\n\n");
47401+
47402+ len += sk_proc_print(buffer,
47403+ "Received bytes %Lu\n",
47404+ (unsigned long long) pPnmiStat->StatRxOctetsOkCts);
47405+ len += sk_proc_print(buffer,
47406+ "Received packets %Lu\n",
47407+ (unsigned long long) pPnmiStat->StatRxOkCts);
47408+#if 0
47409+ if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC &&
47410+ pAC->HWRevision < 12) {
47411+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
47412+ pPnmiStat->StatRxShortsCts;
47413+ pPnmiStat->StatRxShortsCts = 0;
47414+ }
47415+#endif
47416+ if (pAC->dev[t-1]->mtu > 1500)
47417+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
47418+ pPnmiStat->StatRxTooLongCts;
47419+
47420+ len += sk_proc_print(buffer,
47421+ "Receive errors %Lu\n",
47422+ (unsigned long long) pPnmiStruct->InErrorsCts);
47423+ len += sk_proc_print(buffer,
47424+ "Receive dropped %Lu\n",
47425+ (unsigned long long) pPnmiStruct->RxNoBufCts);
47426+ len += sk_proc_print(buffer,
47427+ "Received multicast %Lu\n",
47428+ (unsigned long long) pPnmiStat->StatRxMulticastOkCts);
47429+#ifdef ADVANCED_STATISTIC_OUTPUT
47430+ len += sk_proc_print(buffer,
47431+ "Receive error types\n");
47432+ len += sk_proc_print(buffer,
47433+ " length %Lu\n",
47434+ (unsigned long long) pPnmiStat->StatRxRuntCts);
47435+ len += sk_proc_print(buffer,
47436+ " buffer overflow %Lu\n",
47437+ (unsigned long long) pPnmiStat->StatRxFifoOverflowCts);
47438+ len += sk_proc_print(buffer,
47439+ " bad crc %Lu\n",
47440+ (unsigned long long) pPnmiStat->StatRxFcsCts);
47441+ len += sk_proc_print(buffer,
47442+ " framing %Lu\n",
47443+ (unsigned long long) pPnmiStat->StatRxFramingCts);
47444+ len += sk_proc_print(buffer,
47445+ " missed frames %Lu\n",
47446+ (unsigned long long) pPnmiStat->StatRxMissedCts);
47447+
47448+ if (pAC->dev[t-1]->mtu > 1500)
47449+ pPnmiStat->StatRxTooLongCts = 0;
47450+
47451+ len += sk_proc_print(buffer,
47452+ " too long %Lu\n",
47453+ (unsigned long long) pPnmiStat->StatRxTooLongCts);
47454+ len += sk_proc_print(buffer,
47455+ " carrier extension %Lu\n",
47456+ (unsigned long long) pPnmiStat->StatRxCextCts);
47457+ len += sk_proc_print(buffer,
47458+ " too short %Lu\n",
47459+ (unsigned long long) pPnmiStat->StatRxShortsCts);
47460+ len += sk_proc_print(buffer,
47461+ " symbol %Lu\n",
47462+ (unsigned long long) pPnmiStat->StatRxSymbolCts);
47463+ len += sk_proc_print(buffer,
47464+ " LLC MAC size %Lu\n",
47465+ (unsigned long long) pPnmiStat->StatRxIRLengthCts);
47466+ len += sk_proc_print(buffer,
47467+ " carrier event %Lu\n",
47468+ (unsigned long long) pPnmiStat->StatRxCarrierCts);
47469+ len += sk_proc_print(buffer,
47470+ " jabber %Lu\n",
47471+ (unsigned long long) pPnmiStat->StatRxJabberCts);
47472+#endif
47473+
47474+ /*Transmit statistics */
47475+ len += sk_proc_print(buffer,
47476+ "\nTransmit statistics\n\n");
47477+
47478+ len += sk_proc_print(buffer,
47479+ "Transmitted bytes %Lu\n",
47480+ (unsigned long long) pPnmiStat->StatTxOctetsOkCts);
47481+ len += sk_proc_print(buffer,
47482+ "Transmitted packets %Lu\n",
47483+ (unsigned long long) pPnmiStat->StatTxOkCts);
47484+ len += sk_proc_print(buffer,
47485+ "Transmit errors %Lu\n",
47486+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
47487+ len += sk_proc_print(buffer,
47488+ "Transmit dropped %Lu\n",
47489+ (unsigned long long) pPnmiStruct->TxNoBufCts);
47490+ len += sk_proc_print(buffer,
47491+ "Transmit collisions %Lu\n",
47492+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
47493+#ifdef ADVANCED_STATISTIC_OUTPUT
47494+ len += sk_proc_print(buffer,
47495+ "Transmit error types\n");
47496+ len += sk_proc_print(buffer,
47497+ " excessive collision %ld\n",
47498+ pAC->stats.tx_aborted_errors);
47499+ len += sk_proc_print(buffer,
47500+ " carrier %Lu\n",
47501+ (unsigned long long) pPnmiStat->StatTxCarrierCts);
47502+ len += sk_proc_print(buffer,
47503+ " fifo underrun %Lu\n",
47504+ (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts);
47505+ len += sk_proc_print(buffer,
47506+ " heartbeat %Lu\n",
47507+ (unsigned long long) pPnmiStat->StatTxCarrierCts);
47508+ len += sk_proc_print(buffer,
47509+ " window %ld\n",
47510+ pAC->stats.tx_window_errors);
47511+#endif
47512+ } /* if (!DisableStatistic) */
47513+
47514+ } /* if (strcmp(pACname, currDeviceName) == 0) */
47515+ }
47516+ SkgeProcDev = next;
47517+ }
47518+}
47519+
47520+/*****************************************************************************
47521+ *
47522+ * sk_proc_print - generic line print
47523+ *
47524+ * Description:
47525+ * This function fills the proc entry with statistic data about the
47526+ * ethernet device.
47527+ *
47528+ * Returns:
47529+ * the number of bytes written
47530+ *
47531+ */
47532+static int sk_proc_print(
47533+void *writePtr, /* the buffer pointer */
47534+char *format, /* the format of the string */
47535+...) /* variable list of arguments */
47536+{
47537+#define MAX_LEN_SINGLE_LINE 256
47538+ char str[MAX_LEN_SINGLE_LINE];
47539+ va_list a_start;
47540+ int lenght = 0;
47541+
47542+ struct seq_file *seq = (struct seq_file *) writePtr;
47543+
47544+ SK_MEMSET(str, 0, MAX_LEN_SINGLE_LINE);
47545+
47546+ va_start(a_start, format);
47547+ vsprintf(str, format, a_start);
47548+ va_end(a_start);
47549+
47550+ lenght = strlen(str);
47551+
47552+ seq_printf(seq, str);
47553+ return lenght;
47554+}
47555+
47556+/*****************************************************************************
47557+ *
47558+ * sk_seq_show - show proc information of a particular adapter
47559+ *
47560+ * Description:
47561+ * This function fills the proc entry with statistic data about the
47562+ * ethernet device. It invokes the generic sk_gen_browse() to print
47563+ * out all items one per one.
47564+ *
47565+ * Returns:
47566+ * the number of bytes written
47567+ *
47568+ */
47569+static int sk_seq_show(
47570+struct seq_file *seq, /* the sequence pointer */
47571+void *v) /* additional pointer */
47572+{
47573+ void *castedBuffer = (void *) seq;
47574+ currDev = seq->private;
47575+ sk_gen_browse(castedBuffer);
47576+ return 0;
47577+}
47578+
47579+/*****************************************************************************
47580+ *
47581+ * sk_proc_open - register the show function when proc is open'ed
47582+ *
47583+ * Description:
47584+ * This function is called whenever a sk98lin proc file is queried.
47585+ *
47586+ * Returns:
47587+ * the return value of single_open()
47588+ *
47589+ */
47590+static int sk_proc_open(
47591+struct inode *inode, /* the inode of the file */
47592+struct file *file) /* the file pointer itself */
47593+{
47594+ return single_open(file, sk_seq_show, PDE(inode)->data);
47595+}
47596+
47597+/*******************************************************************************
47598+ *
47599+ * End of file
47600+ *
47601+ ******************************************************************************/
47602diff -ruN linux/drivers/net/sk98lin/skqueue.c linux-new/drivers/net/sk98lin/skqueue.c
47603--- linux/drivers/net/sk98lin/skqueue.c 2006-04-11 19:19:28.000000000 +0200
47604+++ linux-new/drivers/net/sk98lin/skqueue.c 2006-01-18 14:37:24.000000000 +0100
47605@@ -2,8 +2,8 @@
47606 *
47607 * Name: skqueue.c
47608 * Project: Gigabit Ethernet Adapters, Event Scheduler Module
47609- * Version: $Revision$
47610- * Date: $Date$
47611+ * Version: $Revision$
47612+ * Date: $Date$
47613 * Purpose: Management of an event queue.
47614 *
47615 ******************************************************************************/
47616@@ -28,7 +28,7 @@
47617 */
47618 #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
47619 static const char SysKonnectFileId[] =
47620- "@(#) $Id$ (C) Marvell.";
47621+ "@(#) $Id$ (C) Marvell.";
47622 #endif
47623
47624 #include "h/skdrv1st.h" /* Driver Specific Definitions */
47625@@ -48,10 +48,16 @@
47626
47627 #define PRINTF(a,b,c)
47628
47629-/*
47630- * init event queue management
47631+/******************************************************************************
47632+ *
47633+ * SkEventInit() - init event queue management
47634 *
47635- * Must be called during init level 0.
47636+ * Description:
47637+ * This function initializes event queue management.
47638+ * It must be called during init level 0.
47639+ *
47640+ * Returns:
47641+ * nothing
47642 */
47643 void SkEventInit(
47644 SK_AC *pAC, /* Adapter context */
47645@@ -67,8 +73,17 @@
47646 }
47647 }
47648
47649-/*
47650- * add event to queue
47651+/******************************************************************************
47652+ *
47653+ * SkEventQueue() - add event to queue
47654+ *
47655+ * Description:
47656+ * This function adds an event to the event queue.
47657+ * At least Init Level 1 is required to queue events,
47658+ * but will be scheduled add Init Level 2.
47659+ *
47660+ * returns:
47661+ * nothing
47662 */
47663 void SkEventQueue(
47664 SK_AC *pAC, /* Adapters context */
47665@@ -76,26 +91,45 @@
47666 SK_U32 Event, /* Event to be queued */
47667 SK_EVPARA Para) /* Event parameter */
47668 {
47669- pAC->Event.EvPut->Class = Class;
47670- pAC->Event.EvPut->Event = Event;
47671- pAC->Event.EvPut->Para = Para;
47672+
47673+ if (pAC->GIni.GILevel == SK_INIT_DATA) {
47674+ SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E003, SKERR_Q_E003MSG);
47675+ }
47676+ else {
47677+ pAC->Event.EvPut->Class = Class;
47678+ pAC->Event.EvPut->Event = Event;
47679+ pAC->Event.EvPut->Para = Para;
47680
47681- if (++pAC->Event.EvPut == &pAC->Event.EvQueue[SK_MAX_EVENT])
47682- pAC->Event.EvPut = pAC->Event.EvQueue;
47683+ if (++pAC->Event.EvPut == &pAC->Event.EvQueue[SK_MAX_EVENT])
47684+ pAC->Event.EvPut = pAC->Event.EvQueue;
47685
47686- if (pAC->Event.EvPut == pAC->Event.EvGet) {
47687- SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E001, SKERR_Q_E001MSG);
47688+ if (pAC->Event.EvPut == pAC->Event.EvGet) {
47689+ SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E001, SKERR_Q_E001MSG);
47690+ }
47691 }
47692 }
47693
47694-/*
47695- * event dispatcher
47696- * while event queue is not empty
47697- * get event from queue
47698- * send command to state machine
47699- * end
47700- * return error reported by individual Event function
47701- * 0 if no error occured.
47702+/******************************************************************************
47703+ *
47704+ * SkEventDispatcher() - Event Dispatcher
47705+ *
47706+ * Description:
47707+ * The event dispatcher performs the following operations:
47708+ * o while event queue is not empty
47709+ * - get event from queue
47710+ * - send event to state machine
47711+ * end
47712+ *
47713+ * CAUTION:
47714+ * The event functions MUST report an error if performing a reinitialization
47715+ * of the event queue, e.g. performing level Init 0..2 while in dispatcher
47716+ * call!
47717+ * ANY OTHER return value delays scheduling the other events in the
47718+ * queue. In this case the event blocks the queue until
47719+ * the error condition is cleared!
47720+ *
47721+ * Returns:
47722+ * The return value error reported by individual event function
47723 */
47724 int SkEventDispatcher(
47725 SK_AC *pAC, /* Adapters Context */
47726@@ -105,6 +139,10 @@
47727 SK_U32 Class;
47728 int Rtv;
47729
47730+ if (pAC->GIni.GILevel != SK_INIT_RUN) {
47731+ SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E005, SKERR_Q_E005MSG);
47732+ }
47733+
47734 pEv = pAC->Event.EvGet;
47735
47736 PRINTF("dispatch get %x put %x\n", pEv, pAC->Event.ev_put);
47737@@ -152,6 +190,11 @@
47738 Rtv = SkFdEvent(pAC, Ioc, pEv->Event, pEv->Para);
47739 break;
47740 #endif /* SK_USE_LAC_EV */
47741+#ifdef SK_ASF
47742+ case SKGE_ASF :
47743+ Rtv = SkAsfEvent(pAC,Ioc,pEv->Event,pEv->Para);
47744+ break ;
47745+#endif
47746 #ifdef SK_USE_CSUM
47747 case SKGE_CSUM :
47748 Rtv = SkCsEvent(pAC, Ioc, pEv->Event, pEv->Para);
47749@@ -163,6 +206,20 @@
47750 }
47751
47752 if (Rtv != 0) {
47753+ /*
47754+ * Special Case: See CAUTION statement above.
47755+ * We assume the event queue is reset.
47756+ */
47757+ if (pAC->Event.EvGet != pAC->Event.EvQueue &&
47758+ pAC->Event.EvGet != pEv) {
47759+ /*
47760+ * Create an error log entry if the
47761+ * event queue isn't reset.
47762+ * In this case it may be blocked.
47763+ */
47764+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_Q_E004, SKERR_Q_E004MSG);
47765+ }
47766+
47767 return(Rtv);
47768 }
47769
47770diff -ruN linux/drivers/net/sk98lin/skrlmt.c linux-new/drivers/net/sk98lin/skrlmt.c
47771--- linux/drivers/net/sk98lin/skrlmt.c 2006-04-11 19:19:28.000000000 +0200
47772+++ linux-new/drivers/net/sk98lin/skrlmt.c 2006-01-18 14:37:24.000000000 +0100
47773@@ -2,8 +2,8 @@
47774 *
47775 * Name: skrlmt.c
47776 * Project: GEnesis, PCI Gigabit Ethernet Adapter
47777- * Version: $Revision$
47778- * Date: $Date$
47779+ * Version: $Revision$
47780+ * Date: $Date$
47781 * Purpose: Manage links on SK-NET Adapters, esp. redundant ones.
47782 *
47783 ******************************************************************************/
47784@@ -39,7 +39,7 @@
47785
47786 #ifndef lint
47787 static const char SysKonnectFileId[] =
47788- "@(#) $Id$ (C) Marvell.";
47789+ "@(#) $Id$ (C) Marvell.";
47790 #endif /* !defined(lint) */
47791
47792 #define __SKRLMT_C
47793@@ -350,7 +350,7 @@
47794 SK_BOOL PhysicalAMacAddressSet;
47795
47796 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_INIT,
47797- ("RLMT Init level %d.\n", Level))
47798+ ("RLMT Init level %d.\n", Level));
47799
47800 switch (Level) {
47801 case SK_INIT_DATA: /* Initialize data structures. */
47802@@ -390,7 +390,7 @@
47803
47804 case SK_INIT_IO: /* GIMacsFound first available here. */
47805 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_INIT,
47806- ("RLMT: %d MACs were detected.\n", pAC->GIni.GIMacsFound))
47807+ ("RLMT: %d MACs were detected.\n", pAC->GIni.GIMacsFound));
47808
47809 pAC->Rlmt.Net[0].NumPorts = pAC->GIni.GIMacsFound;
47810
47811@@ -512,7 +512,7 @@
47812 }
47813
47814 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
47815- ("SkRlmtBuildCheckChain.\n"))
47816+ ("SkRlmtBuildCheckChain.\n"));
47817
47818 NumMacsUp = 0;
47819
47820@@ -558,7 +558,7 @@
47821 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
47822 ("Port %d checks %d other ports: %2X.\n", i,
47823 pAC->Rlmt.Net[NetIdx].Port[i]->PortsChecked,
47824- pAC->Rlmt.Net[NetIdx].Port[i]->PortCheck[0].CheckAddr.a[5]))
47825+ pAC->Rlmt.Net[NetIdx].Port[i]->PortCheck[0].CheckAddr.a[5]));
47826 }
47827 #endif /* DEBUG */
47828
47829@@ -604,7 +604,7 @@
47830 if ((CheckSrc == 0) || (CheckDest == 0)) {
47831 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_ERR,
47832 ("SkRlmtBuildPacket: Invalid %s%saddr.\n",
47833- (CheckSrc == 0 ? "Src" : ""), (CheckDest == 0 ? "Dest" : "")))
47834+ (CheckSrc == 0 ? "Src" : ""), (CheckDest == 0 ? "Dest" : "")));
47835 }
47836 #endif
47837
47838@@ -796,7 +796,7 @@
47839
47840 SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para);
47841 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_TX,
47842- ("SkRlmtSend: BPDU Packet on Port %u.\n", PortNumber))
47843+ ("SkRlmtSend: BPDU Packet on Port %u.\n", PortNumber));
47844 }
47845 }
47846 return;
47847@@ -835,7 +835,7 @@
47848 * Bring it up.
47849 */
47850 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47851- ("SkRlmtPacketReceive: Received on PortDown.\n"))
47852+ ("SkRlmtPacketReceive: Received on PortDown.\n"));
47853
47854 pRPort->PortState = SK_RLMT_PS_GOING_UP;
47855 pRPort->GuTimeStamp = SkOsGetTime(pAC);
47856@@ -849,7 +849,7 @@
47857 } /* PortDown && !SuspectTx */
47858 else if (pRPort->CheckingState & SK_RLMT_PCS_RX) {
47859 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47860- ("SkRlmtPacketReceive: Stop bringing port down.\n"))
47861+ ("SkRlmtPacketReceive: Stop bringing port down.\n"));
47862 SkTimerStop(pAC, IoC, &pRPort->DownRxTimer);
47863 pRPort->CheckingState &= ~SK_RLMT_PCS_RX;
47864 /* pAC->Rlmt.CheckSwitch = SK_TRUE; */
47865@@ -896,7 +896,7 @@
47866 pRPort = &pAC->Rlmt.Port[PortNumber];
47867
47868 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47869- ("SkRlmtPacketReceive: PortNumber == %d.\n", PortNumber))
47870+ ("SkRlmtPacketReceive: PortNumber == %d.\n", PortNumber));
47871
47872 pRPacket = (SK_RLMT_PACKET*)pMb->pData;
47873 pSPacket = (SK_SPTREE_PACKET*)pRPacket;
47874@@ -917,7 +917,7 @@
47875
47876 /* Not sent to current MAC or registered MC address => Trash it. */
47877 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47878- ("SkRlmtPacketReceive: Not for me.\n"))
47879+ ("SkRlmtPacketReceive: Not for me.\n"));
47880
47881 SkDrvFreeRlmtMbuf(pAC, IoC, pMb);
47882 return;
47883@@ -955,7 +955,7 @@
47884 pRPacket->Indicator[5] == SK_RLMT_INDICATOR5 &&
47885 pRPacket->Indicator[6] == SK_RLMT_INDICATOR6) {
47886 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47887- ("SkRlmtPacketReceive: Duplicate MAC Address.\n"))
47888+ ("SkRlmtPacketReceive: Duplicate MAC Address.\n"));
47889
47890 /* Error Log entry. */
47891 SK_ERR_LOG(pAC, SK_ERRCL_COMM, SKERR_RLMT_E006, SKERR_RLMT_E006_MSG);
47892@@ -963,7 +963,7 @@
47893 else {
47894 /* Simply trash it. */
47895 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47896- ("SkRlmtPacketReceive: Sent by me.\n"))
47897+ ("SkRlmtPacketReceive: Sent by me.\n"));
47898 }
47899
47900 SkDrvFreeRlmtMbuf(pAC, IoC, pMb);
47901@@ -1007,7 +1007,7 @@
47902 #endif /* 0 */
47903
47904 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47905- ("SkRlmtPacketReceive: Announce.\n"))
47906+ ("SkRlmtPacketReceive: Announce.\n"));
47907
47908 SkDrvFreeRlmtMbuf(pAC, IoC, pMb);
47909 break;
47910@@ -1015,7 +1015,7 @@
47911 case SK_PACKET_ALIVE:
47912 if (pRPacket->SSap & LLC_COMMAND_RESPONSE_BIT) {
47913 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47914- ("SkRlmtPacketReceive: Alive Reply.\n"))
47915+ ("SkRlmtPacketReceive: Alive Reply.\n"));
47916
47917 if (!(pAC->Addr.Port[PortNumber].PromMode & SK_PROM_MODE_LLC) ||
47918 SK_ADDR_EQUAL(
47919@@ -1046,7 +1046,7 @@
47920 }
47921 else { /* Alive Request Packet. */
47922 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47923- ("SkRlmtPacketReceive: Alive Request.\n"))
47924+ ("SkRlmtPacketReceive: Alive Request.\n"));
47925
47926 pRPort->RxHelloCts++;
47927
47928@@ -1065,7 +1065,7 @@
47929
47930 case SK_PACKET_CHECK_TX:
47931 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47932- ("SkRlmtPacketReceive: Check your tx line.\n"))
47933+ ("SkRlmtPacketReceive: Check your tx line.\n"));
47934
47935 /* A port checking us requests us to check our tx line. */
47936 pRPort->CheckingState |= SK_RLMT_PCS_TX;
47937@@ -1088,7 +1088,7 @@
47938
47939 case SK_PACKET_ADDR_CHANGED:
47940 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47941- ("SkRlmtPacketReceive: Address Change.\n"))
47942+ ("SkRlmtPacketReceive: Address Change.\n"));
47943
47944 /* Build the check chain. */
47945 SkRlmtBuildCheckChain(pAC, pRPort->Net->NetNumber);
47946@@ -1097,7 +1097,7 @@
47947
47948 default:
47949 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47950- ("SkRlmtPacketReceive: Unknown RLMT packet.\n"))
47951+ ("SkRlmtPacketReceive: Unknown RLMT packet.\n"));
47952
47953 /* RA;:;: ??? */
47954 SkDrvFreeRlmtMbuf(pAC, IoC, pMb);
47955@@ -1107,7 +1107,7 @@
47956 pSPacket->Ctrl == SK_RLMT_SPT_CTRL &&
47957 (pSPacket->SSap & ~LLC_COMMAND_RESPONSE_BIT) == SK_RLMT_SPT_SSAP) {
47958 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47959- ("SkRlmtPacketReceive: BPDU Packet.\n"))
47960+ ("SkRlmtPacketReceive: BPDU Packet.\n"));
47961
47962 /* Spanning Tree packet. */
47963 pRPort->RxSpHelloCts++;
47964@@ -1139,7 +1139,7 @@
47965 pRPort->Root.Id[0], pRPort->Root.Id[1],
47966 pRPort->Root.Id[2], pRPort->Root.Id[3],
47967 pRPort->Root.Id[4], pRPort->Root.Id[5],
47968- pRPort->Root.Id[6], pRPort->Root.Id[7]))
47969+ pRPort->Root.Id[6], pRPort->Root.Id[7]));
47970 }
47971
47972 SkDrvFreeRlmtMbuf(pAC, IoC, pMb);
47973@@ -1150,7 +1150,7 @@
47974 }
47975 else {
47976 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_RX,
47977- ("SkRlmtPacketReceive: Unknown Packet Type.\n"))
47978+ ("SkRlmtPacketReceive: Unknown Packet Type.\n"));
47979
47980 /* Unknown packet. */
47981 SkDrvFreeRlmtMbuf(pAC, IoC, pMb);
47982@@ -1232,7 +1232,7 @@
47983 if ((pRPort->PacketsPerTimeSlot - pRPort->BpduPacketsPerTimeSlot) == 0) {
47984 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
47985 ("SkRlmtCheckPort %d: No (%d) receives in last time slot.\n",
47986- PortNumber, pRPort->PacketsPerTimeSlot))
47987+ PortNumber, pRPort->PacketsPerTimeSlot));
47988
47989 /*
47990 * Check segmentation if there was no receive at least twice
47991@@ -1249,7 +1249,7 @@
47992
47993 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
47994 ("SkRlmtCheckPort: PortsSuspect %d, PcsRx %d.\n",
47995- pRPort->PortsSuspect, pRPort->CheckingState & SK_RLMT_PCS_RX))
47996+ pRPort->PortsSuspect, pRPort->CheckingState & SK_RLMT_PCS_RX));
47997
47998 if (pRPort->PortState != SK_RLMT_PS_DOWN) {
47999 NewTimeout = TO_SHORTEN(pAC->Rlmt.Port[PortNumber].Net->TimeoutValue);
48000@@ -1295,7 +1295,7 @@
48001 ("SkRlmtCheckPort %d: %d (%d) receives in last time slot.\n",
48002 PortNumber,
48003 pRPort->PacketsPerTimeSlot - pRPort->BpduPacketsPerTimeSlot,
48004- pRPort->PacketsPerTimeSlot))
48005+ pRPort->PacketsPerTimeSlot));
48006
48007 SkRlmtPortReceives(pAC, IoC, PortNumber);
48008 if (pAC->Rlmt.CheckSwitch) {
48009@@ -1345,7 +1345,7 @@
48010 i,
48011 pAC->Rlmt.Port[i].PortDown, pAC->Rlmt.Port[i].PortNoRx,
48012 *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_HI32),
48013- *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_LO32)))
48014+ *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_LO32)));
48015
48016 if (!pAC->Rlmt.Port[i].PortDown && !pAC->Rlmt.Port[i].PortNoRx) {
48017 if (!PortFound || pAC->Rlmt.Port[i].BcTimeStamp > BcTimeStamp) {
48018@@ -1358,7 +1358,7 @@
48019
48020 if (PortFound) {
48021 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48022- ("Port %d received the last broadcast.\n", *pSelect))
48023+ ("Port %d received the last broadcast.\n", *pSelect));
48024
48025 /* Look if another port's time stamp is similar. */
48026 for (i = 0; i < (SK_U32)pAC->GIni.GIMacsFound; i++) {
48027@@ -1373,7 +1373,7 @@
48028 PortFound = SK_FALSE;
48029
48030 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48031- ("Port %d received a broadcast at a similar time.\n", i))
48032+ ("Port %d received a broadcast at a similar time.\n", i));
48033 break;
48034 }
48035 }
48036@@ -1385,7 +1385,7 @@
48037 ("SK_RLMT_SELECT_BCRX found Port %d receiving the substantially "
48038 "latest broadcast (%u).\n",
48039 *pSelect,
48040- BcTimeStamp - pAC->Rlmt.Port[1 - *pSelect].BcTimeStamp))
48041+ BcTimeStamp - pAC->Rlmt.Port[1 - *pSelect].BcTimeStamp));
48042 }
48043 #endif /* DEBUG */
48044
48045@@ -1434,7 +1434,7 @@
48046 PortFound = SK_TRUE;
48047 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48048 ("SK_RLMT_SELECT_NOTSUSPECT found Port %d up and not check RX.\n",
48049- *pSelect))
48050+ *pSelect));
48051 break;
48052 }
48053 }
48054@@ -1483,7 +1483,7 @@
48055 }
48056 PortFound = SK_TRUE;
48057 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48058- ("SK_RLMT_SELECT_UP found Port %d up.\n", *pSelect))
48059+ ("SK_RLMT_SELECT_UP found Port %d up.\n", *pSelect));
48060 break;
48061 }
48062 }
48063@@ -1544,7 +1544,7 @@
48064 }
48065
48066 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48067- ("SK_RLMT_SELECT_GOINGUP found Port %d going up.\n", *pSelect))
48068+ ("SK_RLMT_SELECT_GOINGUP found Port %d going up.\n", *pSelect));
48069 return (SK_TRUE);
48070 } /* SkRlmtSelectGoingUp */
48071
48072@@ -1590,7 +1590,7 @@
48073 }
48074 PortFound = SK_TRUE;
48075 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48076- ("SK_RLMT_SELECT_DOWN found Port %d down.\n", *pSelect))
48077+ ("SK_RLMT_SELECT_DOWN found Port %d down.\n", *pSelect));
48078 break;
48079 }
48080 }
48081@@ -1680,16 +1680,19 @@
48082 Para.Para32[1] = NetIdx;
48083 SkEventQueue(pAC, SKGE_DRV, SK_DRV_NET_UP, Para);
48084
48085- if ((pAC->Rlmt.Net[NetIdx].RlmtMode & SK_RLMT_TRANSPARENT) == 0 &&
48086- (Para.pParaPtr = SkRlmtBuildPacket(pAC, IoC,
48087- pAC->Rlmt.Net[NetIdx].Port[i]->PortNumber,
48088- SK_PACKET_ANNOUNCE, &pAC->Addr.Net[NetIdx].
48089- CurrentMacAddress, &SkRlmtMcAddr)) != NULL) {
48090- /*
48091- * Send announce packet to RLMT multicast address to force
48092- * switches to learn the new location of the logical MAC address.
48093- */
48094- SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para);
48095+ if (pAC->Rlmt.NumNets == 1) {
48096+ if ((pAC->Rlmt.Net[NetIdx].RlmtMode & SK_RLMT_TRANSPARENT) == 0 &&
48097+ (Para.pParaPtr = SkRlmtBuildPacket(pAC, IoC,
48098+ pAC->Rlmt.Net[NetIdx].Port[i]->PortNumber,
48099+ SK_PACKET_ANNOUNCE, &pAC->Addr.Net[NetIdx].
48100+ CurrentMacAddress, &SkRlmtMcAddr)) != NULL) {
48101+
48102+ /*
48103+ * Send announce packet to RLMT multicast address to force
48104+ * switches to learn the new location of the logical MAC address.
48105+ */
48106+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para);
48107+ }
48108 }
48109 }
48110 else {
48111@@ -1788,7 +1791,7 @@
48112
48113 if (Para.Para32[1] != Active) {
48114 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48115- ("Active: %d, Para1: %d.\n", Active, Para.Para32[1]))
48116+ ("Active: %d, Para1: %d.\n", Active, Para.Para32[1]));
48117 pAC->Rlmt.Net[NetIdx].ActivePort = Para.Para32[1];
48118 Para.Para32[0] = pAC->Rlmt.Net[NetIdx].
48119 Port[Para.Para32[0]]->PortNumber;
48120@@ -1868,7 +1871,7 @@
48121 pNet->Port[i]->Root.Id[0], pNet->Port[i]->Root.Id[1],
48122 pNet->Port[i]->Root.Id[2], pNet->Port[i]->Root.Id[3],
48123 pNet->Port[i]->Root.Id[4], pNet->Port[i]->Root.Id[5],
48124- pNet->Port[i]->Root.Id[6], pNet->Port[i]->Root.Id[7]))
48125+ pNet->Port[i]->Root.Id[6], pNet->Port[i]->Root.Id[7]));
48126
48127 if (!pNet->RootIdSet) {
48128 pNet->Root = pNet->Port[i]->Root;
48129@@ -1963,13 +1966,13 @@
48130 SK_U32 i;
48131
48132 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48133- ("SK_RLMT_PORTSTART_TIMEOUT Port %d Event BEGIN.\n", Para.Para32[0]))
48134+ ("SK_RLMT_PORTSTART_TIMEOUT Port %d Event BEGIN.\n", Para.Para32[0]));
48135
48136 if (Para.Para32[1] != (SK_U32)-1) {
48137 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48138- ("Bad Parameter.\n"))
48139+ ("Bad Parameter.\n"));
48140 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48141- ("SK_RLMT_PORTSTART_TIMEOUT Event EMPTY.\n"))
48142+ ("SK_RLMT_PORTSTART_TIMEOUT Event EMPTY.\n"));
48143 return;
48144 }
48145
48146@@ -1990,7 +1993,7 @@
48147 }
48148
48149 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48150- ("SK_RLMT_PORTSTART_TIMEOUT Event END.\n"))
48151+ ("SK_RLMT_PORTSTART_TIMEOUT Event END.\n"));
48152 } /* SkRlmtEvtPortStartTim */
48153
48154
48155@@ -2018,21 +2021,21 @@
48156 SK_EVPARA Para2;
48157
48158 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48159- ("SK_RLMT_LINK_UP Port %d Event BEGIN.\n", Para.Para32[0]))
48160+ ("SK_RLMT_LINK_UP Port %d Event BEGIN.\n", Para.Para32[0]));
48161
48162 pRPort = &pAC->Rlmt.Port[Para.Para32[0]];
48163 if (!pRPort->PortStarted) {
48164 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_RLMT_E008, SKERR_RLMT_E008_MSG);
48165
48166 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48167- ("SK_RLMT_LINK_UP Event EMPTY.\n"))
48168+ ("SK_RLMT_LINK_UP Event EMPTY.\n"));
48169 return;
48170 }
48171
48172 if (!pRPort->LinkDown) {
48173 /* RA;:;: Any better solution? */
48174 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48175- ("SK_RLMT_LINK_UP Event EMPTY.\n"))
48176+ ("SK_RLMT_LINK_UP Event EMPTY.\n"));
48177 return;
48178 }
48179
48180@@ -2082,16 +2085,19 @@
48181 Para2.Para32[1] = (SK_U32)-1;
48182 SkTimerStart(pAC, IoC, &pRPort->UpTimer, SK_RLMT_PORTUP_TIM_VAL,
48183 SKGE_RLMT, SK_RLMT_PORTUP_TIM, Para2);
48184-
48185+
48186 /* Later: if (pAC->Rlmt.RlmtMode & SK_RLMT_CHECK_LOC_LINK) && */
48187- if ((pRPort->Net->RlmtMode & SK_RLMT_TRANSPARENT) == 0 &&
48188- (pRPort->Net->RlmtMode & SK_RLMT_CHECK_LINK) != 0 &&
48189- (Para2.pParaPtr =
48190- SkRlmtBuildPacket(pAC, IoC, Para.Para32[0], SK_PACKET_ANNOUNCE,
48191- &pAC->Addr.Port[Para.Para32[0]].CurrentMacAddress, &SkRlmtMcAddr)
48192- ) != NULL) {
48193- /* Send "new" packet to RLMT multicast address. */
48194- SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para2);
48195+ if (pAC->Rlmt.NumNets == 1) {
48196+ if ((pRPort->Net->RlmtMode & SK_RLMT_TRANSPARENT) == 0 &&
48197+ (pRPort->Net->RlmtMode & SK_RLMT_CHECK_LINK) != 0 &&
48198+ (Para2.pParaPtr =
48199+ SkRlmtBuildPacket(pAC, IoC, Para.Para32[0], SK_PACKET_ANNOUNCE,
48200+ &pAC->Addr.Port[Para.Para32[0]].CurrentMacAddress, &SkRlmtMcAddr)
48201+ ) != NULL) {
48202+
48203+ /* Send "new" packet to RLMT multicast address. */
48204+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_RLMT_SEND, Para2);
48205+ }
48206 }
48207
48208 if (pRPort->Net->RlmtMode & SK_RLMT_CHECK_SEG) {
48209@@ -2110,7 +2116,7 @@
48210 }
48211
48212 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48213- ("SK_RLMT_LINK_UP Event END.\n"))
48214+ ("SK_RLMT_LINK_UP Event END.\n"));
48215 } /* SkRlmtEvtLinkUp */
48216
48217
48218@@ -2136,20 +2142,20 @@
48219 SK_RLMT_PORT *pRPort;
48220
48221 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48222- ("SK_RLMT_PORTUP_TIM Port %d Event BEGIN.\n", Para.Para32[0]))
48223+ ("SK_RLMT_PORTUP_TIM Port %d Event BEGIN.\n", Para.Para32[0]));
48224
48225 if (Para.Para32[1] != (SK_U32)-1) {
48226 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48227- ("Bad Parameter.\n"))
48228+ ("Bad Parameter.\n"));
48229 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48230- ("SK_RLMT_PORTUP_TIM Event EMPTY.\n"))
48231+ ("SK_RLMT_PORTUP_TIM Event EMPTY.\n"));
48232 return;
48233 }
48234
48235 pRPort = &pAC->Rlmt.Port[Para.Para32[0]];
48236 if (pRPort->LinkDown || (pRPort->PortState == SK_RLMT_PS_UP)) {
48237 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48238- ("SK_RLMT_PORTUP_TIM Port %d Event EMPTY.\n", Para.Para32[0]))
48239+ ("SK_RLMT_PORTUP_TIM Port %d Event EMPTY.\n", Para.Para32[0]));
48240 return;
48241 }
48242
48243@@ -2164,7 +2170,7 @@
48244 }
48245
48246 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48247- ("SK_RLMT_PORTUP_TIM Event END.\n"))
48248+ ("SK_RLMT_PORTUP_TIM Event END.\n"));
48249 } /* SkRlmtEvtPortUpTim */
48250
48251
48252@@ -2192,13 +2198,13 @@
48253
48254 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48255 ("SK_RLMT_PORTDOWN* Port %d Event (%d) BEGIN.\n",
48256- Para.Para32[0], Event))
48257+ Para.Para32[0], Event));
48258
48259 if (Para.Para32[1] != (SK_U32)-1) {
48260 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48261- ("Bad Parameter.\n"))
48262+ ("Bad Parameter.\n"));
48263 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48264- ("SK_RLMT_PORTDOWN* Event EMPTY.\n"))
48265+ ("SK_RLMT_PORTDOWN* Event EMPTY.\n"));
48266 return;
48267 }
48268
48269@@ -2206,7 +2212,7 @@
48270 if (!pRPort->PortStarted || (Event == SK_RLMT_PORTDOWN_TX_TIM &&
48271 !(pRPort->CheckingState & SK_RLMT_PCS_TX))) {
48272 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48273- ("SK_RLMT_PORTDOWN* Event (%d) EMPTY.\n", Event))
48274+ ("SK_RLMT_PORTDOWN* Event (%d) EMPTY.\n", Event));
48275 return;
48276 }
48277
48278@@ -2243,7 +2249,7 @@
48279 }
48280
48281 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48282- ("SK_RLMT_PORTDOWN* Event (%d) END.\n", Event))
48283+ ("SK_RLMT_PORTDOWN* Event (%d) END.\n", Event));
48284 } /* SkRlmtEvtPortDownX */
48285
48286
48287@@ -2270,7 +2276,7 @@
48288
48289 pRPort = &pAC->Rlmt.Port[Para.Para32[0]];
48290 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48291- ("SK_RLMT_LINK_DOWN Port %d Event BEGIN.\n", Para.Para32[0]))
48292+ ("SK_RLMT_LINK_DOWN Port %d Event BEGIN.\n", Para.Para32[0]));
48293
48294 if (!pAC->Rlmt.Port[Para.Para32[0]].LinkDown) {
48295 pRPort->Net->LinksUp--;
48296@@ -2289,7 +2295,7 @@
48297 }
48298
48299 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48300- ("SK_RLMT_LINK_DOWN Event END.\n"))
48301+ ("SK_RLMT_LINK_DOWN Event END.\n"));
48302 } /* SkRlmtEvtLinkDown */
48303
48304
48305@@ -2318,13 +2324,13 @@
48306 SK_MAC_ADDR *pNewMacAddr;
48307
48308 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48309- ("SK_RLMT_PORT_ADDR Port %d Event BEGIN.\n", Para.Para32[0]))
48310+ ("SK_RLMT_PORT_ADDR Port %d Event BEGIN.\n", Para.Para32[0]));
48311
48312 if (Para.Para32[1] != (SK_U32)-1) {
48313 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48314- ("Bad Parameter.\n"))
48315+ ("Bad Parameter.\n"));
48316 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48317- ("SK_RLMT_PORT_ADDR Event EMPTY.\n"))
48318+ ("SK_RLMT_PORT_ADDR Event EMPTY.\n"));
48319 return;
48320 }
48321
48322@@ -2348,7 +2354,7 @@
48323 }
48324
48325 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48326- ("SK_RLMT_PORT_ADDR Event END.\n"))
48327+ ("SK_RLMT_PORT_ADDR Event END.\n"));
48328 } /* SkRlmtEvtPortAddr */
48329
48330
48331@@ -2376,35 +2382,35 @@
48332 SK_U32 PortNumber;
48333
48334 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48335- ("SK_RLMT_START Net %d Event BEGIN.\n", Para.Para32[0]))
48336+ ("SK_RLMT_START Net %d Event BEGIN.\n", Para.Para32[0]));
48337
48338 if (Para.Para32[1] != (SK_U32)-1) {
48339 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48340- ("Bad Parameter.\n"))
48341+ ("Bad Parameter.\n"));
48342 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48343- ("SK_RLMT_START Event EMPTY.\n"))
48344+ ("SK_RLMT_START Event EMPTY.\n"));
48345 return;
48346 }
48347
48348 if (Para.Para32[0] >= pAC->Rlmt.NumNets) {
48349 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48350- ("Bad NetNumber %d.\n", Para.Para32[0]))
48351+ ("Bad NetNumber %d.\n", Para.Para32[0]));
48352 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48353- ("SK_RLMT_START Event EMPTY.\n"))
48354+ ("SK_RLMT_START Event EMPTY.\n"));
48355 return;
48356 }
48357
48358 if (pAC->Rlmt.Net[Para.Para32[0]].RlmtState != SK_RLMT_RS_INIT) {
48359 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48360- ("SK_RLMT_START Event EMPTY.\n"))
48361+ ("SK_RLMT_START Event EMPTY.\n"));
48362 return;
48363 }
48364
48365 if (pAC->Rlmt.NetsStarted >= pAC->Rlmt.NumNets) {
48366 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48367- ("All nets should have been started.\n"))
48368+ ("All nets should have been started.\n"));
48369 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48370- ("SK_RLMT_START Event EMPTY.\n"))
48371+ ("SK_RLMT_START Event EMPTY.\n"));
48372 return;
48373 }
48374
48375@@ -2438,7 +2444,7 @@
48376 pAC->Rlmt.NetsStarted++;
48377
48378 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48379- ("SK_RLMT_START Event END.\n"))
48380+ ("SK_RLMT_START Event END.\n"));
48381 } /* SkRlmtEvtStart */
48382
48383
48384@@ -2466,35 +2472,35 @@
48385 SK_U32 i;
48386
48387 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48388- ("SK_RLMT_STOP Net %d Event BEGIN.\n", Para.Para32[0]))
48389+ ("SK_RLMT_STOP Net %d Event BEGIN.\n", Para.Para32[0]));
48390
48391 if (Para.Para32[1] != (SK_U32)-1) {
48392 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48393- ("Bad Parameter.\n"))
48394+ ("Bad Parameter.\n"));
48395 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48396- ("SK_RLMT_STOP Event EMPTY.\n"))
48397+ ("SK_RLMT_STOP Event EMPTY.\n"));
48398 return;
48399 }
48400
48401 if (Para.Para32[0] >= pAC->Rlmt.NumNets) {
48402 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48403- ("Bad NetNumber %d.\n", Para.Para32[0]))
48404+ ("Bad NetNumber %d.\n", Para.Para32[0]));
48405 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48406- ("SK_RLMT_STOP Event EMPTY.\n"))
48407+ ("SK_RLMT_STOP Event EMPTY.\n"));
48408 return;
48409 }
48410
48411 if (pAC->Rlmt.Net[Para.Para32[0]].RlmtState == SK_RLMT_RS_INIT) {
48412 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48413- ("SK_RLMT_STOP Event EMPTY.\n"))
48414+ ("SK_RLMT_STOP Event EMPTY.\n"));
48415 return;
48416 }
48417
48418 if (pAC->Rlmt.NetsStarted == 0) {
48419 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48420- ("All nets are stopped.\n"))
48421+ ("All nets are stopped.\n"));
48422 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48423- ("SK_RLMT_STOP Event EMPTY.\n"))
48424+ ("SK_RLMT_STOP Event EMPTY.\n"));
48425 return;
48426 }
48427
48428@@ -2529,7 +2535,7 @@
48429 pAC->Rlmt.NetsStarted--;
48430
48431 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48432- ("SK_RLMT_STOP Event END.\n"))
48433+ ("SK_RLMT_STOP Event END.\n"));
48434 } /* SkRlmtEvtStop */
48435
48436
48437@@ -2559,13 +2565,13 @@
48438 SK_U32 i;
48439
48440 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48441- ("SK_RLMT_TIM Event BEGIN.\n"))
48442+ ("SK_RLMT_TIM Event BEGIN.\n"));
48443
48444 if (Para.Para32[1] != (SK_U32)-1) {
48445 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48446- ("Bad Parameter.\n"))
48447+ ("Bad Parameter.\n"));
48448 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48449- ("SK_RLMT_TIM Event EMPTY.\n"))
48450+ ("SK_RLMT_TIM Event EMPTY.\n"));
48451 return;
48452 }
48453
48454@@ -2637,7 +2643,7 @@
48455 }
48456
48457 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48458- ("SK_RLMT_TIM Event END.\n"))
48459+ ("SK_RLMT_TIM Event END.\n"));
48460 } /* SkRlmtEvtTim */
48461
48462
48463@@ -2665,13 +2671,13 @@
48464 #endif /* DEBUG */
48465
48466 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48467- ("SK_RLMT_SEG_TIM Event BEGIN.\n"))
48468+ ("SK_RLMT_SEG_TIM Event BEGIN.\n"));
48469
48470 if (Para.Para32[1] != (SK_U32)-1) {
48471 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48472- ("Bad Parameter.\n"))
48473+ ("Bad Parameter.\n"));
48474 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48475- ("SK_RLMT_SEG_TIM Event EMPTY.\n"))
48476+ ("SK_RLMT_SEG_TIM Event EMPTY.\n"));
48477 return;
48478 }
48479
48480@@ -2695,7 +2701,7 @@
48481 InAddr8[3], InAddr8[4], InAddr8[5],
48482 pAPort->Exact[k].a[0], pAPort->Exact[k].a[1],
48483 pAPort->Exact[k].a[2], pAPort->Exact[k].a[3],
48484- pAPort->Exact[k].a[4], pAPort->Exact[k].a[5]))
48485+ pAPort->Exact[k].a[4], pAPort->Exact[k].a[5]));
48486 }
48487 }
48488 #endif /* xDEBUG */
48489@@ -2703,7 +2709,7 @@
48490 SkRlmtCheckSeg(pAC, IoC, Para.Para32[0]);
48491
48492 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48493- ("SK_RLMT_SEG_TIM Event END.\n"))
48494+ ("SK_RLMT_SEG_TIM Event END.\n"));
48495 } /* SkRlmtEvtSegTim */
48496
48497
48498@@ -2732,18 +2738,18 @@
48499
48500
48501 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48502- ("SK_RLMT_PACKET_RECEIVED Event BEGIN.\n"))
48503+ ("SK_RLMT_PACKET_RECEIVED Event BEGIN.\n"));
48504
48505 /* Should we ignore frames during port switching? */
48506
48507 #ifdef DEBUG
48508 pMb = Para.pParaPtr;
48509 if (pMb == NULL) {
48510- SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, ("No mbuf.\n"))
48511+ SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, ("No mbuf.\n"));
48512 }
48513 else if (pMb->pNext != NULL) {
48514 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48515- ("More than one mbuf or pMb->pNext not set.\n"))
48516+ ("More than one mbuf or pMb->pNext not set.\n"));
48517 }
48518 #endif /* DEBUG */
48519
48520@@ -2761,7 +2767,7 @@
48521 }
48522
48523 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48524- ("SK_RLMT_PACKET_RECEIVED Event END.\n"))
48525+ ("SK_RLMT_PACKET_RECEIVED Event END.\n"));
48526 } /* SkRlmtEvtPacketRx */
48527
48528
48529@@ -2788,21 +2794,21 @@
48530 SK_RLMT_PORT *pRPort;
48531
48532 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48533- ("SK_RLMT_STATS_CLEAR Event BEGIN.\n"))
48534+ ("SK_RLMT_STATS_CLEAR Event BEGIN.\n"));
48535
48536 if (Para.Para32[1] != (SK_U32)-1) {
48537 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48538- ("Bad Parameter.\n"))
48539+ ("Bad Parameter.\n"));
48540 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48541- ("SK_RLMT_STATS_CLEAR Event EMPTY.\n"))
48542+ ("SK_RLMT_STATS_CLEAR Event EMPTY.\n"));
48543 return;
48544 }
48545
48546 if (Para.Para32[0] >= pAC->Rlmt.NumNets) {
48547 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48548- ("Bad NetNumber %d.\n", Para.Para32[0]))
48549+ ("Bad NetNumber %d.\n", Para.Para32[0]));
48550 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48551- ("SK_RLMT_STATS_CLEAR Event EMPTY.\n"))
48552+ ("SK_RLMT_STATS_CLEAR Event EMPTY.\n"));
48553 return;
48554 }
48555
48556@@ -2817,7 +2823,7 @@
48557 }
48558
48559 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48560- ("SK_RLMT_STATS_CLEAR Event END.\n"))
48561+ ("SK_RLMT_STATS_CLEAR Event END.\n"));
48562 } /* SkRlmtEvtStatsClear */
48563
48564
48565@@ -2841,28 +2847,28 @@
48566 SK_EVPARA Para) /* SK_U32 NetNumber; SK_U32 -1 */
48567 {
48568 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48569- ("SK_RLMT_STATS_UPDATE Event BEGIN.\n"))
48570+ ("SK_RLMT_STATS_UPDATE Event BEGIN.\n"));
48571
48572 if (Para.Para32[1] != (SK_U32)-1) {
48573 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48574- ("Bad Parameter.\n"))
48575+ ("Bad Parameter.\n"));
48576 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48577- ("SK_RLMT_STATS_UPDATE Event EMPTY.\n"))
48578+ ("SK_RLMT_STATS_UPDATE Event EMPTY.\n"));
48579 return;
48580 }
48581
48582 if (Para.Para32[0] >= pAC->Rlmt.NumNets) {
48583 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48584- ("Bad NetNumber %d.\n", Para.Para32[0]))
48585+ ("Bad NetNumber %d.\n", Para.Para32[0]));
48586 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48587- ("SK_RLMT_STATS_UPDATE Event EMPTY.\n"))
48588+ ("SK_RLMT_STATS_UPDATE Event EMPTY.\n"));
48589 return;
48590 }
48591
48592 /* Update statistics - currently always up-to-date. */
48593
48594 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48595- ("SK_RLMT_STATS_UPDATE Event END.\n"))
48596+ ("SK_RLMT_STATS_UPDATE Event END.\n"));
48597 } /* SkRlmtEvtStatsUpdate */
48598
48599
48600@@ -2886,13 +2892,13 @@
48601 SK_EVPARA Para) /* SK_U32 PortIndex; SK_U32 NetNumber */
48602 {
48603 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48604- ("SK_RLMT_PREFPORT_CHANGE to Port %d Event BEGIN.\n", Para.Para32[0]))
48605+ ("SK_RLMT_PREFPORT_CHANGE to Port %d Event BEGIN.\n", Para.Para32[0]));
48606
48607 if (Para.Para32[1] >= pAC->Rlmt.NumNets) {
48608 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48609- ("Bad NetNumber %d.\n", Para.Para32[1]))
48610+ ("Bad NetNumber %d.\n", Para.Para32[1]));
48611 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48612- ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n"))
48613+ ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n"));
48614 return;
48615 }
48616
48617@@ -2905,7 +2911,7 @@
48618 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_RLMT_E010, SKERR_RLMT_E010_MSG);
48619
48620 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48621- ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n"))
48622+ ("SK_RLMT_PREFPORT_CHANGE Event EMPTY.\n"));
48623 return;
48624 }
48625
48626@@ -2919,7 +2925,7 @@
48627 }
48628
48629 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48630- ("SK_RLMT_PREFPORT_CHANGE Event END.\n"))
48631+ ("SK_RLMT_PREFPORT_CHANGE Event END.\n"));
48632 } /* SkRlmtEvtPrefportChange */
48633
48634
48635@@ -2945,37 +2951,37 @@
48636 int i;
48637
48638 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48639- ("SK_RLMT_SET_NETS Event BEGIN.\n"))
48640+ ("SK_RLMT_SET_NETS Event BEGIN.\n"));
48641
48642 if (Para.Para32[1] != (SK_U32)-1) {
48643 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48644- ("Bad Parameter.\n"))
48645+ ("Bad Parameter.\n"));
48646 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48647- ("SK_RLMT_SET_NETS Event EMPTY.\n"))
48648+ ("SK_RLMT_SET_NETS Event EMPTY.\n"));
48649 return;
48650 }
48651
48652 if (Para.Para32[0] == 0 || Para.Para32[0] > SK_MAX_NETS ||
48653 Para.Para32[0] > (SK_U32)pAC->GIni.GIMacsFound) {
48654 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48655- ("Bad number of nets: %d.\n", Para.Para32[0]))
48656+ ("Bad number of nets: %d.\n", Para.Para32[0]));
48657 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48658- ("SK_RLMT_SET_NETS Event EMPTY.\n"))
48659+ ("SK_RLMT_SET_NETS Event EMPTY.\n"));
48660 return;
48661 }
48662
48663 if (Para.Para32[0] == pAC->Rlmt.NumNets) { /* No change. */
48664 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48665- ("SK_RLMT_SET_NETS Event EMPTY.\n"))
48666+ ("SK_RLMT_SET_NETS Event EMPTY.\n"));
48667 return;
48668 }
48669
48670 /* Entering and leaving dual mode only allowed while nets are stopped. */
48671 if (pAC->Rlmt.NetsStarted > 0) {
48672 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48673- ("Changing dual mode only allowed while all nets are stopped.\n"))
48674+ ("Changing dual mode only allowed while all nets are stopped.\n"));
48675 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48676- ("SK_RLMT_SET_NETS Event EMPTY.\n"))
48677+ ("SK_RLMT_SET_NETS Event EMPTY.\n"));
48678 return;
48679 }
48680
48681@@ -3006,9 +3012,10 @@
48682 SkEventQueue(pAC, SKGE_PNMI, SK_PNMI_EVT_RLMT_SET_NETS, Para);
48683
48684 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48685- ("RLMT: Changed to one net with two ports.\n"))
48686+ ("RLMT: Changed to one net with two ports.\n"));
48687 }
48688 else if (Para.Para32[0] == 2) {
48689+ pAC->Rlmt.RlmtOff = SK_TRUE;
48690 pAC->Rlmt.Port[1].Net= &pAC->Rlmt.Net[1];
48691 pAC->Rlmt.Net[1].NumPorts = pAC->GIni.GIMacsFound - 1;
48692 pAC->Rlmt.Net[0].NumPorts =
48693@@ -3035,19 +3042,19 @@
48694 SkEventQueue(pAC, SKGE_PNMI, SK_PNMI_EVT_RLMT_SET_NETS, Para);
48695
48696 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48697- ("RLMT: Changed to two nets with one port each.\n"))
48698+ ("RLMT: Changed to two nets with one port each.\n"));
48699 }
48700 else {
48701 /* Not implemented for more than two nets. */
48702 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48703- ("SetNets not implemented for more than two nets.\n"))
48704+ ("SetNets not implemented for more than two nets.\n"));
48705 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48706- ("SK_RLMT_SET_NETS Event EMPTY.\n"))
48707+ ("SK_RLMT_SET_NETS Event EMPTY.\n"));
48708 return;
48709 }
48710
48711 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48712- ("SK_RLMT_SET_NETS Event END.\n"))
48713+ ("SK_RLMT_SET_NETS Event END.\n"));
48714 } /* SkRlmtSetNets */
48715
48716
48717@@ -3075,13 +3082,13 @@
48718 SK_U32 PrevRlmtMode;
48719
48720 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48721- ("SK_RLMT_MODE_CHANGE Event BEGIN.\n"))
48722+ ("SK_RLMT_MODE_CHANGE Event BEGIN.\n"));
48723
48724 if (Para.Para32[1] >= pAC->Rlmt.NumNets) {
48725 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48726- ("Bad NetNumber %d.\n", Para.Para32[1]))
48727+ ("Bad NetNumber %d.\n", Para.Para32[1]));
48728 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48729- ("SK_RLMT_MODE_CHANGE Event EMPTY.\n"))
48730+ ("SK_RLMT_MODE_CHANGE Event EMPTY.\n"));
48731 return;
48732 }
48733
48734@@ -3091,9 +3098,9 @@
48735 Para.Para32[0] != SK_RLMT_MODE_CLS) {
48736 pAC->Rlmt.Net[Para.Para32[1]].RlmtMode = SK_RLMT_MODE_CLS;
48737 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48738- ("Forced RLMT mode to CLS on single port net.\n"))
48739+ ("Forced RLMT mode to CLS on single port net.\n"));
48740 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48741- ("SK_RLMT_MODE_CHANGE Event EMPTY.\n"))
48742+ ("SK_RLMT_MODE_CHANGE Event EMPTY.\n"));
48743 return;
48744 }
48745
48746@@ -3159,7 +3166,7 @@
48747 } /* SK_RLMT_CHECK_SEG bit changed. */
48748
48749 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48750- ("SK_RLMT_MODE_CHANGE Event END.\n"))
48751+ ("SK_RLMT_MODE_CHANGE Event END.\n"));
48752 } /* SkRlmtEvtModeChange */
48753
48754
48755@@ -3245,7 +3252,7 @@
48756
48757 default: /* Create error log entry. */
48758 SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL,
48759- ("Unknown RLMT Event %d.\n", Event))
48760+ ("Unknown RLMT Event %d.\n", Event));
48761 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_RLMT_E003, SKERR_RLMT_E003_MSG);
48762 break;
48763 } /* switch() */
48764diff -ruN linux/drivers/net/sk98lin/sktimer.c linux-new/drivers/net/sk98lin/sktimer.c
48765--- linux/drivers/net/sk98lin/sktimer.c 2006-04-11 19:19:28.000000000 +0200
48766+++ linux-new/drivers/net/sk98lin/sktimer.c 2006-01-18 14:37:24.000000000 +0100
48767@@ -2,8 +2,8 @@
48768 *
48769 * Name: sktimer.c
48770 * Project: Gigabit Ethernet Adapters, Event Scheduler Module
48771- * Version: $Revision$
48772- * Date: $Date$
48773+ * Version: $Revision$
48774+ * Date: $Date$
48775 * Purpose: High level timer functions.
48776 *
48777 ******************************************************************************/
48778@@ -11,7 +11,7 @@
48779 /******************************************************************************
48780 *
48781 * (C)Copyright 1998-2002 SysKonnect GmbH.
48782- * (C)Copyright 2002-2003 Marvell.
48783+ * (C)Copyright 2002-2004 Marvell.
48784 *
48785 * This program is free software; you can redistribute it and/or modify
48786 * it under the terms of the GNU General Public License as published by
48787@@ -22,13 +22,12 @@
48788 *
48789 ******************************************************************************/
48790
48791-
48792 /*
48793 * Event queue and dispatcher
48794 */
48795 #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
48796 static const char SysKonnectFileId[] =
48797- "@(#) $Id$ (C) Marvell.";
48798+ "@(#) $Id$ (C) Marvell.";
48799 #endif
48800
48801 #include "h/skdrv1st.h" /* Driver Specific Definitions */
48802@@ -62,7 +61,7 @@
48803 {
48804 switch (Level) {
48805 case SK_INIT_DATA:
48806- pAC->Tim.StQueue = NULL;
48807+ pAC->Tim.StQueue = 0;
48808 break;
48809 case SK_INIT_IO:
48810 SkHwtInit(pAC, Ioc);
48811@@ -85,22 +84,20 @@
48812 SK_TIMER **ppTimPrev;
48813 SK_TIMER *pTm;
48814
48815- /*
48816- * remove timer from queue
48817- */
48818+ /* remove timer from queue */
48819 pTimer->TmActive = SK_FALSE;
48820-
48821+
48822 if (pAC->Tim.StQueue == pTimer && !pTimer->TmNext) {
48823 SkHwtStop(pAC, Ioc);
48824 }
48825-
48826+
48827 for (ppTimPrev = &pAC->Tim.StQueue; (pTm = *ppTimPrev);
48828 ppTimPrev = &pTm->TmNext ) {
48829-
48830+
48831 if (pTm == pTimer) {
48832 /*
48833 * Timer found in queue
48834- * - dequeue it and
48835+ * - dequeue it
48836 * - correct delta of the next timer
48837 */
48838 *ppTimPrev = pTm->TmNext;
48839@@ -121,7 +118,7 @@
48840 SK_AC *pAC, /* Adapters context */
48841 SK_IOC Ioc, /* IoContext */
48842 SK_TIMER *pTimer, /* Timer Pointer to be started */
48843-SK_U32 Time, /* Time value */
48844+SK_U32 Time, /* Time Value (in microsec.) */
48845 SK_U32 Class, /* Event Class for this timer */
48846 SK_U32 Event, /* Event Value for this timer */
48847 SK_EVPARA Para) /* Event Parameter for this timer */
48848@@ -130,11 +127,6 @@
48849 SK_TIMER *pTm;
48850 SK_U32 Delta;
48851
48852- Time /= 16; /* input is uS, clock ticks are 16uS */
48853-
48854- if (!Time)
48855- Time = 1;
48856-
48857 SkTimerStop(pAC, Ioc, pTimer);
48858
48859 pTimer->TmClass = Class;
48860@@ -143,31 +135,26 @@
48861 pTimer->TmActive = SK_TRUE;
48862
48863 if (!pAC->Tim.StQueue) {
48864- /* First Timer to be started */
48865+ /* first Timer to be started */
48866 pAC->Tim.StQueue = pTimer;
48867- pTimer->TmNext = NULL;
48868+ pTimer->TmNext = 0;
48869 pTimer->TmDelta = Time;
48870-
48871+
48872 SkHwtStart(pAC, Ioc, Time);
48873-
48874+
48875 return;
48876 }
48877
48878- /*
48879- * timer correction
48880- */
48881+ /* timer correction */
48882 timer_done(pAC, Ioc, 0);
48883
48884- /*
48885- * find position in queue
48886- */
48887+ /* find position in queue */
48888 Delta = 0;
48889 for (ppTimPrev = &pAC->Tim.StQueue; (pTm = *ppTimPrev);
48890 ppTimPrev = &pTm->TmNext ) {
48891-
48892+
48893 if (Delta + pTm->TmDelta > Time) {
48894- /* Position found */
48895- /* Here the timer needs to be inserted. */
48896+ /* the timer needs to be inserted here */
48897 break;
48898 }
48899 Delta += pTm->TmDelta;
48900@@ -179,9 +166,7 @@
48901 pTimer->TmDelta = Time - Delta;
48902
48903 if (pTm) {
48904- /* There is a next timer
48905- * -> correct its Delta value.
48906- */
48907+ /* there is a next timer: correct its Delta value */
48908 pTm->TmDelta -= pTimer->TmDelta;
48909 }
48910
48911@@ -210,7 +195,7 @@
48912 int Done = 0;
48913
48914 Delta = SkHwtRead(pAC, Ioc);
48915-
48916+
48917 ppLast = &pAC->Tim.StQueue;
48918 pTm = pAC->Tim.StQueue;
48919 while (pTm && !Done) {
48920@@ -228,13 +213,13 @@
48921 Done = 1;
48922 }
48923 }
48924- *ppLast = NULL;
48925+ *ppLast = 0;
48926 /*
48927 * pTm points to the first Timer that did not run out.
48928 * StQueue points to the first Timer that run out.
48929 */
48930
48931- for ( pTComp = pAC->Tim.StQueue; pTComp; pTComp = pTComp->TmNext) {
48932+ for (pTComp = pAC->Tim.StQueue; pTComp; pTComp = pTComp->TmNext) {
48933 SkEventQueue(pAC,pTComp->TmClass, pTComp->TmEvent, pTComp->TmPara);
48934 }
48935
48936diff -ruN linux/drivers/net/sk98lin/sktwsi.c linux-new/drivers/net/sk98lin/sktwsi.c
48937--- linux/drivers/net/sk98lin/sktwsi.c 1970-01-01 01:00:00.000000000 +0100
48938+++ linux-new/drivers/net/sk98lin/sktwsi.c 2006-01-18 14:37:24.000000000 +0100
48939@@ -0,0 +1,1359 @@
48940+/******************************************************************************
48941+ *
48942+ * Name: sktwsi.c
48943+ * Project: Gigabit Ethernet Adapters, TWSI-Module
48944+ * Version: $Revision$
48945+ * Date: $Date$
48946+ * Purpose: Functions to access Voltage and Temperature Sensor
48947+ *
48948+ ******************************************************************************/
48949+
48950+/******************************************************************************
48951+ *
48952+ * (C)Copyright 1998-2002 SysKonnect.
48953+ * (C)Copyright 2002-2005 Marvell.
48954+ *
48955+ * This program is free software; you can redistribute it and/or modify
48956+ * it under the terms of the GNU General Public License as published by
48957+ * the Free Software Foundation; either version 2 of the License, or
48958+ * (at your option) any later version.
48959+ * The information in this file is provided "AS IS" without warranty.
48960+ *
48961+ ******************************************************************************/
48962+
48963+/*
48964+ * TWSI Protocol
48965+ */
48966+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
48967+static const char SysKonnectFileId[] =
48968+ "@(#) $Id$ (C) Marvell.";
48969+#endif
48970+
48971+#include "h/skdrv1st.h" /* Driver Specific Definitions */
48972+#include "h/lm80.h"
48973+#include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */
48974+
48975+#ifdef __C2MAN__
48976+/*
48977+ TWSI protocol implementation.
48978+
48979+ General Description:
48980+
48981+ The TWSI protocol is used for the temperature sensors and for
48982+ the serial EEPROM which hold the configuration.
48983+
48984+ This file covers functions that allow to read write and do
48985+ some bulk requests a specified TWSI address.
48986+
48987+ The Genesis has 2 TWSI buses. One for the EEPROM which holds
48988+ the VPD Data and one for temperature and voltage sensor.
48989+ The following picture shows the TWSI buses, TWSI devices and
48990+ their control registers.
48991+
48992+ Note: The VPD functions are in skvpd.c
48993+.
48994+. PCI Config TWSI Bus for VPD Data:
48995+.
48996+. +------------+
48997+. | VPD EEPROM |
48998+. +------------+
48999+. |
49000+. | <-- TWSI
49001+. |
49002+. +-----------+-----------+
49003+. | |
49004+. +-----------------+ +-----------------+
49005+. | PCI_VPD_ADR_REG | | PCI_VPD_DAT_REG |
49006+. +-----------------+ +-----------------+
49007+.
49008+.
49009+. TWSI Bus for LM80 sensor:
49010+.
49011+. +-----------------+
49012+. | Temperature and |
49013+. | Voltage Sensor |
49014+. | LM80 |
49015+. +-----------------+
49016+. |
49017+. |
49018+. TWSI --> |
49019+. |
49020+. +----+
49021+. +-------------->| OR |<--+
49022+. | +----+ |
49023+. +------+------+ |
49024+. | | |
49025+. +--------+ +--------+ +----------+
49026+. | B2_I2C | | B2_I2C | | B2_I2C |
49027+. | _CTRL | | _DATA | | _SW |
49028+. +--------+ +--------+ +----------+
49029+.
49030+ The TWSI bus may be driven by the B2_I2C_SW or by the B2_I2C_CTRL
49031+ and B2_I2C_DATA registers.
49032+ For driver software it is recommended to use the TWSI control and
49033+ data register, because TWSI bus timing is done by the ASIC and
49034+ an interrupt may be received when the TWSI request is completed.
49035+
49036+ Clock Rate Timing: MIN MAX generated by
49037+ VPD EEPROM: 50 kHz 100 kHz HW
49038+ LM80 over TWSI Ctrl/Data reg. 50 kHz 100 kHz HW
49039+ LM80 over B2_I2C_SW register 0 400 kHz SW
49040+
49041+ Note: The clock generated by the hardware is dependend on the
49042+ PCI clock. If the PCI bus clock is 33 MHz, the I2C/VPD
49043+ clock is 50 kHz.
49044+ */
49045+intro()
49046+{}
49047+#endif
49048+
49049+#ifdef SK_DIAG
49050+/*
49051+ * TWSI Fast Mode timing values used by the LM80.
49052+ * If new devices are added to the TWSI bus the timing values have to be checked.
49053+ */
49054+#ifndef I2C_SLOW_TIMING
49055+#define T_CLK_LOW 1300L /* clock low time in ns */
49056+#define T_CLK_HIGH 600L /* clock high time in ns */
49057+#define T_DATA_IN_SETUP 100L /* data in Set-up Time */
49058+#define T_START_HOLD 600L /* start condition hold time */
49059+#define T_START_SETUP 600L /* start condition Set-up time */
49060+#define T_STOP_SETUP 600L /* stop condition Set-up time */
49061+#define T_BUS_IDLE 1300L /* time the bus must free after Tx */
49062+#define T_CLK_2_DATA_OUT 900L /* max. clock low to data output valid */
49063+#else /* I2C_SLOW_TIMING */
49064+/* TWSI Standard Mode Timing */
49065+#define T_CLK_LOW 4700L /* clock low time in ns */
49066+#define T_CLK_HIGH 4000L /* clock high time in ns */
49067+#define T_DATA_IN_SETUP 250L /* data in Set-up Time */
49068+#define T_START_HOLD 4000L /* start condition hold time */
49069+#define T_START_SETUP 4700L /* start condition Set-up time */
49070+#define T_STOP_SETUP 4000L /* stop condition Set-up time */
49071+#define T_BUS_IDLE 4700L /* time the bus must free after Tx */
49072+#endif /* !I2C_SLOW_TIMING */
49073+
49074+#define NS2BCLK(x) (((x)*125)/10000)
49075+
49076+/*
49077+ * TWSI Wire Operations
49078+ *
49079+ * About I2C_CLK_LOW():
49080+ *
49081+ * The Data Direction bit (I2C_DATA_DIR) has to be set to input when setting
49082+ * clock to low, to prevent the ASIC and the TWSI data client from driving the
49083+ * serial data line simultaneously (ASIC: last bit of a byte = '1', TWSI client
49084+ * send an 'ACK'). See also Concentrator Bugreport No. 10192.
49085+ */
49086+#define I2C_DATA_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA)
49087+#define I2C_DATA_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA)
49088+#define I2C_DATA_OUT(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA_DIR)
49089+#define I2C_DATA_IN(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA)
49090+#define I2C_CLK_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_CLK)
49091+#define I2C_CLK_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK | I2C_DATA_DIR)
49092+#define I2C_START_COND(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK)
49093+
49094+#define NS2CLKT(x) ((x*125L)/10000)
49095+
49096+/*--------------- TWSI Interface Register Functions --------------- */
49097+
49098+/*
49099+ * sending one bit
49100+ */
49101+void SkI2cSndBit(
49102+SK_IOC IoC, /* I/O Context */
49103+SK_U8 Bit) /* Bit to send */
49104+{
49105+ I2C_DATA_OUT(IoC);
49106+ if (Bit) {
49107+ I2C_DATA_HIGH(IoC);
49108+ }
49109+ else {
49110+ I2C_DATA_LOW(IoC);
49111+ }
49112+ SkDgWaitTime(IoC, NS2BCLK(T_DATA_IN_SETUP));
49113+ I2C_CLK_HIGH(IoC);
49114+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH));
49115+ I2C_CLK_LOW(IoC);
49116+} /* SkI2cSndBit*/
49117+
49118+
49119+/*
49120+ * Signal a start to the TWSI Bus.
49121+ *
49122+ * A start is signaled when data goes to low in a high clock cycle.
49123+ *
49124+ * Ends with Clock Low.
49125+ *
49126+ * Status: not tested
49127+ */
49128+void SkI2cStart(
49129+SK_IOC IoC) /* I/O Context */
49130+{
49131+ /* Init data and Clock to output lines */
49132+ /* Set Data high */
49133+ I2C_DATA_OUT(IoC);
49134+ I2C_DATA_HIGH(IoC);
49135+ /* Set Clock high */
49136+ I2C_CLK_HIGH(IoC);
49137+
49138+ SkDgWaitTime(IoC, NS2BCLK(T_START_SETUP));
49139+
49140+ /* Set Data Low */
49141+ I2C_DATA_LOW(IoC);
49142+
49143+ SkDgWaitTime(IoC, NS2BCLK(T_START_HOLD));
49144+
49145+ /* Clock low without Data to Input */
49146+ I2C_START_COND(IoC);
49147+
49148+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW));
49149+} /* SkI2cStart */
49150+
49151+
49152+void SkI2cStop(
49153+SK_IOC IoC) /* I/O Context */
49154+{
49155+ /* Init data and Clock to output lines */
49156+ /* Set Data low */
49157+ I2C_DATA_OUT(IoC);
49158+ I2C_DATA_LOW(IoC);
49159+
49160+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT));
49161+
49162+ /* Set Clock high */
49163+ I2C_CLK_HIGH(IoC);
49164+
49165+ SkDgWaitTime(IoC, NS2BCLK(T_STOP_SETUP));
49166+
49167+ /*
49168+ * Set Data High: Do it by setting the Data Line to Input.
49169+ * Because of a pull up resistor the Data Line
49170+ * floods to high.
49171+ */
49172+ I2C_DATA_IN(IoC);
49173+
49174+ /*
49175+ * When TWSI activity is stopped
49176+ * o DATA should be set to input and
49177+ * o CLOCK should be set to high!
49178+ */
49179+ SkDgWaitTime(IoC, NS2BCLK(T_BUS_IDLE));
49180+} /* SkI2cStop */
49181+
49182+
49183+/*
49184+ * Receive just one bit via the TWSI bus.
49185+ *
49186+ * Note: Clock must be set to LOW before calling this function.
49187+ *
49188+ * Returns The received bit.
49189+ */
49190+int SkI2cRcvBit(
49191+SK_IOC IoC) /* I/O Context */
49192+{
49193+ int Bit;
49194+ SK_U8 I2cSwCtrl;
49195+
49196+ /* Init data as input line */
49197+ I2C_DATA_IN(IoC);
49198+
49199+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT));
49200+
49201+ I2C_CLK_HIGH(IoC);
49202+
49203+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH));
49204+
49205+ SK_I2C_GET_SW(IoC, &I2cSwCtrl);
49206+
49207+ Bit = (I2cSwCtrl & I2C_DATA) ? 1 : 0;
49208+
49209+ I2C_CLK_LOW(IoC);
49210+ SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW-T_CLK_2_DATA_OUT));
49211+
49212+ return(Bit);
49213+} /* SkI2cRcvBit */
49214+
49215+
49216+/*
49217+ * Receive an ACK.
49218+ *
49219+ * returns 0 If acknowledged
49220+ * 1 in case of an error
49221+ */
49222+int SkI2cRcvAck(
49223+SK_IOC IoC) /* I/O Context */
49224+{
49225+ /*
49226+ * Received bit must be zero.
49227+ */
49228+ return(SkI2cRcvBit(IoC) != 0);
49229+} /* SkI2cRcvAck */
49230+
49231+
49232+/*
49233+ * Send an NACK.
49234+ */
49235+void SkI2cSndNAck(
49236+SK_IOC IoC) /* I/O Context */
49237+{
49238+ /*
49239+ * Received bit must be zero.
49240+ */
49241+ SkI2cSndBit(IoC, 1);
49242+} /* SkI2cSndNAck */
49243+
49244+
49245+/*
49246+ * Send an ACK.
49247+ */
49248+void SkI2cSndAck(
49249+SK_IOC IoC) /* I/O Context */
49250+{
49251+ /*
49252+ * Received bit must be zero.
49253+ */
49254+ SkI2cSndBit(IoC, 0);
49255+} /* SkI2cSndAck */
49256+
49257+
49258+/*
49259+ * Send one byte to the TWSI device and wait for ACK.
49260+ *
49261+ * Return acknowleged status.
49262+ */
49263+int SkI2cSndByte(
49264+SK_IOC IoC, /* I/O Context */
49265+int Byte) /* byte to send */
49266+{
49267+ int i;
49268+
49269+ for (i = 0; i < 8; i++) {
49270+ if (Byte & (1<<(7-i))) {
49271+ SkI2cSndBit(IoC, 1);
49272+ }
49273+ else {
49274+ SkI2cSndBit(IoC, 0);
49275+ }
49276+ }
49277+
49278+ return(SkI2cRcvAck(IoC));
49279+} /* SkI2cSndByte */
49280+
49281+
49282+/*
49283+ * Receive one byte and ack it.
49284+ *
49285+ * Return byte.
49286+ */
49287+int SkI2cRcvByte(
49288+SK_IOC IoC, /* I/O Context */
49289+int Last) /* Last Byte Flag */
49290+{
49291+ int i;
49292+ int Byte = 0;
49293+
49294+ for (i = 0; i < 8; i++) {
49295+ Byte <<= 1;
49296+ Byte |= SkI2cRcvBit(IoC);
49297+ }
49298+
49299+ if (Last) {
49300+ SkI2cSndNAck(IoC);
49301+ }
49302+ else {
49303+ SkI2cSndAck(IoC);
49304+ }
49305+
49306+ return(Byte);
49307+} /* SkI2cRcvByte */
49308+
49309+
49310+/*
49311+ * Start dialog and send device address
49312+ *
49313+ * Return 0 if acknowleged, 1 in case of an error
49314+ */
49315+int SkI2cSndDev(
49316+SK_IOC IoC, /* I/O Context */
49317+int Addr, /* Device Address */
49318+int Rw) /* Read / Write Flag */
49319+{
49320+ SkI2cStart(IoC);
49321+ Rw = ~Rw;
49322+ Rw &= I2C_WRITE;
49323+ return(SkI2cSndByte(IoC, (Addr << 1) | Rw));
49324+} /* SkI2cSndDev */
49325+
49326+#endif /* SK_DIAG */
49327+
49328+/*----------------- TWSI CTRL Register Functions ----------*/
49329+
49330+/*
49331+ * waits for a completion of a TWSI transfer
49332+ *
49333+ * returns 0: success, transfer completes
49334+ * 1: error, transfer does not complete, TWSI transfer
49335+ * killed, wait loop terminated.
49336+ */
49337+int SkI2cWait(
49338+SK_AC *pAC, /* Adapter Context */
49339+SK_IOC IoC, /* I/O Context */
49340+int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */
49341+{
49342+ SK_U64 StartTime;
49343+ SK_U64 CurrentTime;
49344+ SK_U32 I2cCtrl;
49345+
49346+ StartTime = SkOsGetTime(pAC);
49347+
49348+ do {
49349+ CurrentTime = SkOsGetTime(pAC);
49350+
49351+ if (CurrentTime - StartTime > SK_TICKS_PER_SEC / 8) {
49352+
49353+ SK_I2C_STOP(IoC);
49354+#ifndef SK_DIAG
49355+ if (pAC->I2c.InitLevel > SK_INIT_DATA) {
49356+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG);
49357+ }
49358+#endif /* !SK_DIAG */
49359+ return(1);
49360+ }
49361+
49362+ SK_I2C_GET_CTL(IoC, &I2cCtrl);
49363+
49364+#ifdef xYUKON_DBG
49365+ printf("StartTime=%lu, CurrentTime=%lu\n",
49366+ StartTime, CurrentTime);
49367+ if (kbhit()) {
49368+ return(1);
49369+ }
49370+#endif /* YUKON_DBG */
49371+
49372+ } while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31);
49373+
49374+ return(0);
49375+} /* SkI2cWait */
49376+
49377+
49378+/*
49379+ * waits for a completion of a TWSI transfer
49380+ *
49381+ * Returns
49382+ * Nothing
49383+ */
49384+void SkI2cWaitIrq(
49385+SK_AC *pAC, /* Adapter Context */
49386+SK_IOC IoC) /* I/O Context */
49387+{
49388+ SK_SENSOR *pSen;
49389+ SK_U64 StartTime;
49390+ SK_U32 IrqSrc;
49391+ SK_U32 IsTwsiReadyBit;
49392+
49393+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
49394+
49395+ if (pSen->SenState == SK_SEN_IDLE) {
49396+ return;
49397+ }
49398+
49399+ IsTwsiReadyBit = CHIP_ID_YUKON_2(pAC) ? Y2_IS_TWSI_RDY : IS_I2C_READY;
49400+
49401+ StartTime = SkOsGetTime(pAC);
49402+
49403+ do {
49404+ if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) {
49405+
49406+ SK_I2C_STOP(IoC);
49407+#ifndef SK_DIAG
49408+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E016, SKERR_I2C_E016MSG);
49409+#endif /* !SK_DIAG */
49410+ return;
49411+ }
49412+
49413+ SK_IN32(IoC, B0_ISRC, &IrqSrc);
49414+
49415+ } while ((IrqSrc & IsTwsiReadyBit) == 0);
49416+
49417+ pSen->SenState = SK_SEN_IDLE;
49418+ return;
49419+} /* SkI2cWaitIrq */
49420+
49421+/*
49422+ * writes a single byte or 4 bytes into the TWSI device
49423+ *
49424+ * returns 0: success
49425+ * 1: error
49426+ */
49427+int SkI2cWrite(
49428+SK_AC *pAC, /* Adapter Context */
49429+SK_IOC IoC, /* I/O Context */
49430+SK_U32 I2cData, /* TWSI Data to write */
49431+int I2cDev, /* TWSI Device Address */
49432+int I2cDevSize, /* TWSI Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */
49433+int I2cReg, /* TWSI Device Register Address */
49434+int I2cBurst) /* TWSI Burst Flag */
49435+{
49436+ SK_OUT32(IoC, B2_I2C_DATA, I2cData);
49437+
49438+ SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cDevSize, I2cReg, I2cBurst);
49439+
49440+ return(SkI2cWait(pAC, IoC, I2C_WRITE));
49441+} /* SkI2cWrite*/
49442+
49443+
49444+#ifdef SK_DIAG
49445+/*
49446+ * reads a single byte or 4 bytes from the TWSI device
49447+ *
49448+ * returns the word read
49449+ */
49450+SK_U32 SkI2cRead(
49451+SK_AC *pAC, /* Adapter Context */
49452+SK_IOC IoC, /* I/O Context */
49453+int I2cDev, /* TWSI Device Address */
49454+int I2cDevSize, /* TWSI Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */
49455+int I2cReg, /* TWSI Device Register Address */
49456+int I2cBurst) /* TWSI Burst Flag */
49457+{
49458+ SK_U32 Data;
49459+
49460+ SK_OUT32(IoC, B2_I2C_DATA, 0);
49461+
49462+ SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cDevSize, I2cReg, I2cBurst);
49463+
49464+ if (SkI2cWait(pAC, IoC, I2C_READ) != 0) {
49465+ w_print("%s\n", SKERR_I2C_E002MSG);
49466+ }
49467+
49468+ SK_IN32(IoC, B2_I2C_DATA, &Data);
49469+
49470+ return(Data);
49471+} /* SkI2cRead */
49472+#endif /* SK_DIAG */
49473+
49474+
49475+/*
49476+ * read a sensor's value
49477+ *
49478+ * This function reads a sensor's value from the TWSI sensor chip. The sensor
49479+ * is defined by its index into the sensors database in the struct pAC points
49480+ * to.
49481+ * Returns
49482+ * 1 if the read is completed
49483+ * 0 if the read must be continued (TWSI Bus still allocated)
49484+ */
49485+int SkI2cReadSensor(
49486+SK_AC *pAC, /* Adapter Context */
49487+SK_IOC IoC, /* I/O Context */
49488+SK_SENSOR *pSen) /* Sensor to be read */
49489+{
49490+ if (pSen->SenRead != NULL) {
49491+ return((*pSen->SenRead)(pAC, IoC, pSen));
49492+ }
49493+
49494+ return(0); /* no success */
49495+} /* SkI2cReadSensor */
49496+
49497+/*
49498+ * Do the Init state 0 initialization
49499+ */
49500+static int SkI2cInit0(
49501+SK_AC *pAC) /* Adapter Context */
49502+{
49503+ int i;
49504+ SK_SENSOR *pSen;
49505+
49506+ /* Begin with first sensor */
49507+ pAC->I2c.CurrSens = 0;
49508+
49509+ /* Begin with timeout control for state machine */
49510+ pAC->I2c.TimerMode = SK_TIMER_WATCH_SM;
49511+
49512+ /* Set sensor number to zero */
49513+ pAC->I2c.MaxSens = 0;
49514+
49515+#ifndef SK_DIAG
49516+ /* Initialize Number of Dummy Reads */
49517+ pAC->I2c.DummyReads = SK_MAX_SENSORS;
49518+#endif /* !SK_DIAG */
49519+
49520+ for (i = 0; i < SK_MAX_SENSORS; i++) {
49521+ pSen = &pAC->I2c.SenTable[i];
49522+
49523+ pSen->SenDesc = "unknown";
49524+ pSen->SenType = SK_SEN_UNKNOWN;
49525+ pSen->SenThreErrHigh = 0;
49526+ pSen->SenThreErrLow = 0;
49527+ pSen->SenThreWarnHigh = 0;
49528+ pSen->SenThreWarnLow = 0;
49529+ pSen->SenReg = LM80_FAN2_IN;
49530+ pSen->SenInit = SK_SEN_DYN_INIT_NONE;
49531+ pSen->SenValue = 0;
49532+ pSen->SenErrFlag = SK_SEN_ERR_NOT_PRESENT;
49533+ pSen->SenErrCts = 0;
49534+ pSen->SenBegErrTS = 0;
49535+ pSen->SenState = SK_SEN_IDLE;
49536+ pSen->SenRead = NULL;
49537+ pSen->SenDev = 0;
49538+ }
49539+
49540+ /* Now we are "INIT data"ed */
49541+ pAC->I2c.InitLevel = SK_INIT_DATA;
49542+ return(0);
49543+} /* SkI2cInit0*/
49544+
49545+
49546+/*
49547+ * Do the init state 1 initialization
49548+ *
49549+ * initialize the following register of the LM80:
49550+ * Configuration register:
49551+ * - START, noINT, activeLOW, noINT#Clear, noRESET, noCI, noGPO#, noINIT
49552+ *
49553+ * Interrupt Mask Register 1:
49554+ * - all interrupts are Disabled (0xff)
49555+ *
49556+ * Interrupt Mask Register 2:
49557+ * - all interrupts are Disabled (0xff) Interrupt modi doesn't matter.
49558+ *
49559+ * Fan Divisor/RST_OUT register:
49560+ * - Divisors set to 1 (bits 00), all others 0s.
49561+ *
49562+ * OS# Configuration/Temperature resolution Register:
49563+ * - all 0s
49564+ *
49565+ */
49566+static int SkI2cInit1(
49567+SK_AC *pAC, /* Adapter Context */
49568+SK_IOC IoC) /* I/O Context */
49569+{
49570+ int i;
49571+ SK_U8 I2cSwCtrl;
49572+ SK_GEPORT *pPrt; /* GIni Port struct pointer */
49573+ SK_SENSOR *pSen;
49574+
49575+ if (pAC->I2c.InitLevel != SK_INIT_DATA) {
49576+ /* Re-init not needed in TWSI module */
49577+ return(0);
49578+ }
49579+
49580+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC ||
49581+ pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) {
49582+ /* No sensors on Yukon-EC and Yukon-FE */
49583+ return(0);
49584+ }
49585+
49586+ /* Set the Direction of TWSI-Data Pin to IN */
49587+ SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA);
49588+
49589+ /* Check for 32-Bit Yukon with Low at TWSI-Data Pin */
49590+ SK_I2C_GET_SW(IoC, &I2cSwCtrl);
49591+
49592+ if ((I2cSwCtrl & I2C_DATA) == 0) {
49593+ /* this is a 32-Bit board */
49594+ pAC->GIni.GIYukon32Bit = SK_TRUE;
49595+ return(0);
49596+ }
49597+
49598+ /* Check for 64 Bit Yukon without sensors */
49599+ if (SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_CFG, 0) != 0) {
49600+ return(0);
49601+ }
49602+
49603+ (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_1, 0);
49604+
49605+ (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_2, 0);
49606+
49607+ (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_FAN_CTRL, 0);
49608+
49609+ (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_TEMP_CTRL, 0);
49610+
49611+ (void)SkI2cWrite(pAC, IoC, (SK_U32)LM80_CFG_START, LM80_ADDR, I2C_025K_DEV,
49612+ LM80_CFG, 0);
49613+
49614+ /*
49615+ * MaxSens has to be updated here, because PhyType is not
49616+ * set when performing Init Level 0
49617+ */
49618+ pAC->I2c.MaxSens = 5;
49619+
49620+ pPrt = &pAC->GIni.GP[0];
49621+
49622+ if (pAC->GIni.GIGenesis) {
49623+ if (pPrt->PhyType == SK_PHY_BCOM) {
49624+ if (pAC->GIni.GIMacsFound == 1) {
49625+ pAC->I2c.MaxSens += 1;
49626+ }
49627+ else {
49628+ pAC->I2c.MaxSens += 3;
49629+ }
49630+ }
49631+ }
49632+ else {
49633+ pAC->I2c.MaxSens += 3;
49634+ }
49635+
49636+ for (i = 0; i < pAC->I2c.MaxSens; i++) {
49637+ pSen = &pAC->I2c.SenTable[i];
49638+ switch (i) {
49639+ case 0:
49640+ pSen->SenDesc = "Temperature";
49641+ pSen->SenType = SK_SEN_TEMP;
49642+ pSen->SenThreErrHigh = SK_SEN_TEMP_HIGH_ERR;
49643+ pSen->SenThreWarnHigh = SK_SEN_TEMP_HIGH_WARN;
49644+ pSen->SenThreWarnLow = SK_SEN_TEMP_LOW_WARN;
49645+ pSen->SenThreErrLow = SK_SEN_TEMP_LOW_ERR;
49646+ pSen->SenReg = LM80_TEMP_IN;
49647+ break;
49648+ case 1:
49649+ pSen->SenDesc = "Voltage PCI";
49650+ pSen->SenType = SK_SEN_VOLT;
49651+ pSen->SenThreErrHigh = SK_SEN_PCI_5V_HIGH_ERR;
49652+ pSen->SenThreWarnHigh = SK_SEN_PCI_5V_HIGH_WARN;
49653+ if (pAC->GIni.GIPciBus != SK_PEX_BUS) {
49654+ pSen->SenThreWarnLow = SK_SEN_PCI_5V_LOW_WARN;
49655+ pSen->SenThreErrLow = SK_SEN_PCI_5V_LOW_ERR;
49656+ }
49657+ else {
49658+ pSen->SenThreWarnLow = 0;
49659+ pSen->SenThreErrLow = 0;
49660+ }
49661+ pSen->SenReg = LM80_VT0_IN;
49662+ break;
49663+ case 2:
49664+ pSen->SenDesc = "Voltage PCI-IO";
49665+ pSen->SenType = SK_SEN_VOLT;
49666+ pSen->SenThreErrHigh = SK_SEN_PCI_IO_5V_HIGH_ERR;
49667+ pSen->SenThreWarnHigh = SK_SEN_PCI_IO_5V_HIGH_WARN;
49668+ if (pAC->GIni.GIPciBus != SK_PEX_BUS) {
49669+ pSen->SenThreWarnLow = SK_SEN_PCI_IO_3V3_LOW_WARN;
49670+ pSen->SenThreErrLow = SK_SEN_PCI_IO_3V3_LOW_ERR;
49671+ }
49672+ else {
49673+ pSen->SenThreWarnLow = 0;
49674+ pSen->SenThreErrLow = 0;
49675+ }
49676+ pSen->SenReg = LM80_VT1_IN;
49677+ pSen->SenInit = SK_SEN_DYN_INIT_PCI_IO;
49678+ break;
49679+ case 3:
49680+ if (pAC->GIni.GIGenesis) {
49681+ pSen->SenDesc = "Voltage ASIC";
49682+ }
49683+ else {
49684+ pSen->SenDesc = "Voltage VMAIN";
49685+ }
49686+ pSen->SenType = SK_SEN_VOLT;
49687+ pSen->SenThreErrHigh = SK_SEN_VDD_HIGH_ERR;
49688+ pSen->SenThreWarnHigh = SK_SEN_VDD_HIGH_WARN;
49689+ pSen->SenThreWarnLow = SK_SEN_VDD_LOW_WARN;
49690+ pSen->SenThreErrLow = SK_SEN_VDD_LOW_ERR;
49691+ pSen->SenReg = LM80_VT2_IN;
49692+ break;
49693+ case 4:
49694+ if (pAC->GIni.GIGenesis) {
49695+ if (pPrt->PhyType == SK_PHY_BCOM) {
49696+ pSen->SenDesc = "Voltage PHY A PLL";
49697+ pSen->SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;
49698+ pSen->SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;
49699+ pSen->SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;
49700+ pSen->SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;
49701+ }
49702+ else {
49703+ pSen->SenDesc = "Voltage PMA";
49704+ pSen->SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;
49705+ pSen->SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;
49706+ pSen->SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;
49707+ pSen->SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;
49708+ }
49709+ }
49710+ else {
49711+ pSen->SenDesc = "Voltage VAUX";
49712+ pSen->SenThreErrHigh = SK_SEN_VAUX_3V3_HIGH_ERR;
49713+ pSen->SenThreWarnHigh = SK_SEN_VAUX_3V3_HIGH_WARN;
49714+ if (pAC->GIni.GIVauxAvail) {
49715+ pSen->SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN;
49716+ pSen->SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR;
49717+ }
49718+ else {
49719+ pSen->SenThreErrLow = 0;
49720+ pSen->SenThreWarnLow = 0;
49721+ }
49722+ }
49723+ pSen->SenType = SK_SEN_VOLT;
49724+ pSen->SenReg = LM80_VT3_IN;
49725+ break;
49726+ case 5:
49727+ if (CHIP_ID_YUKON_2(pAC)) {
49728+ if (pAC->GIni.GIChipRev == 0) {
49729+ pSen->SenDesc = "Voltage Core 1V3";
49730+ pSen->SenThreErrHigh = SK_SEN_CORE_1V3_HIGH_ERR;
49731+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V3_HIGH_WARN;
49732+ pSen->SenThreWarnLow = SK_SEN_CORE_1V3_LOW_WARN;
49733+ pSen->SenThreErrLow = SK_SEN_CORE_1V3_LOW_ERR;
49734+ }
49735+ else {
49736+ pSen->SenDesc = "Voltage Core 1V2";
49737+ pSen->SenThreErrHigh = SK_SEN_CORE_1V2_HIGH_ERR;
49738+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V2_HIGH_WARN;
49739+ pSen->SenThreWarnLow = SK_SEN_CORE_1V2_LOW_WARN;
49740+ pSen->SenThreErrLow = SK_SEN_CORE_1V2_LOW_ERR;
49741+ }
49742+ }
49743+ else {
49744+ if (pAC->GIni.GIGenesis) {
49745+ pSen->SenDesc = "Voltage PHY 2V5";
49746+ pSen->SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR;
49747+ pSen->SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN;
49748+ pSen->SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN;
49749+ pSen->SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR;
49750+ }
49751+ else {
49752+ pSen->SenDesc = "Voltage Core 1V5";
49753+ pSen->SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR;
49754+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN;
49755+ pSen->SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN;
49756+ pSen->SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR;
49757+ }
49758+ }
49759+ pSen->SenType = SK_SEN_VOLT;
49760+ pSen->SenReg = LM80_VT4_IN;
49761+ break;
49762+ case 6:
49763+ if (CHIP_ID_YUKON_2(pAC)) {
49764+ pSen->SenDesc = "Voltage PHY 1V5";
49765+ pSen->SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR;
49766+ pSen->SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN;
49767+ if (pAC->GIni.GIPciBus == SK_PEX_BUS) {
49768+ pSen->SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN;
49769+ pSen->SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR;
49770+ }
49771+ else {
49772+ pSen->SenThreWarnLow = 0;
49773+ pSen->SenThreErrLow = 0;
49774+ }
49775+ }
49776+ else {
49777+ if (pAC->GIni.GIGenesis) {
49778+ pSen->SenDesc = "Voltage PHY B PLL";
49779+ }
49780+ else {
49781+ pSen->SenDesc = "Voltage PHY 3V3";
49782+ }
49783+ pSen->SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;
49784+ pSen->SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;
49785+ pSen->SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;
49786+ pSen->SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;
49787+ }
49788+ pSen->SenType = SK_SEN_VOLT;
49789+ pSen->SenReg = LM80_VT5_IN;
49790+ break;
49791+ case 7:
49792+ if (pAC->GIni.GIGenesis) {
49793+ pSen->SenDesc = "Speed Fan";
49794+ pSen->SenType = SK_SEN_FAN;
49795+ pSen->SenThreErrHigh = SK_SEN_FAN_HIGH_ERR;
49796+ pSen->SenThreWarnHigh = SK_SEN_FAN_HIGH_WARN;
49797+ pSen->SenThreWarnLow = SK_SEN_FAN_LOW_WARN;
49798+ pSen->SenThreErrLow = SK_SEN_FAN_LOW_ERR;
49799+ pSen->SenReg = LM80_FAN2_IN;
49800+ }
49801+ else {
49802+ pSen->SenDesc = "Voltage PHY 2V5";
49803+ pSen->SenType = SK_SEN_VOLT;
49804+ pSen->SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR;
49805+ pSen->SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN;
49806+ pSen->SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN;
49807+ pSen->SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR;
49808+ pSen->SenReg = LM80_VT6_IN;
49809+ }
49810+ break;
49811+ default:
49812+ SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW,
49813+ SKERR_I2C_E001, SKERR_I2C_E001MSG);
49814+ break;
49815+ }
49816+
49817+ pSen->SenValue = 0;
49818+ pSen->SenErrFlag = SK_SEN_ERR_OK;
49819+ pSen->SenErrCts = 0;
49820+ pSen->SenBegErrTS = 0;
49821+ pSen->SenState = SK_SEN_IDLE;
49822+ if (pSen->SenThreWarnLow != 0) {
49823+ pSen->SenRead = SkLm80ReadSensor;
49824+ }
49825+ pSen->SenDev = LM80_ADDR;
49826+ }
49827+
49828+#ifndef SK_DIAG
49829+ pAC->I2c.DummyReads = pAC->I2c.MaxSens;
49830+#endif /* !SK_DIAG */
49831+
49832+ /* Clear TWSI IRQ */
49833+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
49834+
49835+ /* Now we are I/O initialized */
49836+ pAC->I2c.InitLevel = SK_INIT_IO;
49837+ return(0);
49838+} /* SkI2cInit1 */
49839+
49840+
49841+/*
49842+ * Init level 2: Start first sensor read.
49843+ */
49844+static int SkI2cInit2(
49845+SK_AC *pAC, /* Adapter Context */
49846+SK_IOC IoC) /* I/O Context */
49847+{
49848+ int ReadComplete;
49849+ SK_SENSOR *pSen;
49850+
49851+ if (pAC->I2c.InitLevel != SK_INIT_IO) {
49852+ /* ReInit not needed in TWSI module */
49853+ /* Init0 and Init2 not permitted */
49854+ return(0);
49855+ }
49856+
49857+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
49858+
49859+ ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
49860+
49861+ if (ReadComplete) {
49862+ SK_ERR_LOG(pAC, SK_ERRCL_INIT, SKERR_I2C_E008, SKERR_I2C_E008MSG);
49863+ }
49864+
49865+ /* Now we are correctly initialized */
49866+ pAC->I2c.InitLevel = SK_INIT_RUN;
49867+
49868+ return(0);
49869+} /* SkI2cInit2*/
49870+
49871+
49872+/*
49873+ * Initialize TWSI devices
49874+ *
49875+ * Get the first voltage value and discard it.
49876+ * Go into temperature read mode. A default pointer is not set.
49877+ *
49878+ * The things to be done depend on the init level in the parameter list:
49879+ * Level 0:
49880+ * Initialize only the data structures. Do NOT access hardware.
49881+ * Level 1:
49882+ * Initialize hardware through SK_IN / SK_OUT commands. Do NOT use interrupts.
49883+ * Level 2:
49884+ * Everything is possible. Interrupts may be used from now on.
49885+ *
49886+ * return:
49887+ * 0 = success
49888+ * other = error.
49889+ */
49890+int SkI2cInit(
49891+SK_AC *pAC, /* Adapter Context */
49892+SK_IOC IoC, /* I/O Context needed in levels 1 and 2 */
49893+int Level) /* Init Level */
49894+{
49895+
49896+ switch (Level) {
49897+ case SK_INIT_DATA:
49898+ return(SkI2cInit0(pAC));
49899+ case SK_INIT_IO:
49900+ return(SkI2cInit1(pAC, IoC));
49901+ case SK_INIT_RUN:
49902+ return(SkI2cInit2(pAC, IoC));
49903+ default:
49904+ break;
49905+ }
49906+
49907+ return(0);
49908+} /* SkI2cInit */
49909+
49910+
49911+#ifndef SK_DIAG
49912+/*
49913+ * Interrupt service function for the TWSI Interface
49914+ *
49915+ * Clears the Interrupt source
49916+ *
49917+ * Reads the register and check it for sending a trap.
49918+ *
49919+ * Starts the timer if necessary.
49920+ */
49921+void SkI2cIsr(
49922+SK_AC *pAC, /* Adapter Context */
49923+SK_IOC IoC) /* I/O Context */
49924+{
49925+ SK_EVPARA Para;
49926+
49927+ /* Clear TWSI IRQ */
49928+ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
49929+
49930+ Para.Para64 = 0;
49931+ SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_IRQ, Para);
49932+} /* SkI2cIsr */
49933+
49934+
49935+/*
49936+ * Check this sensors Value against the threshold and send events.
49937+ */
49938+static void SkI2cCheckSensor(
49939+SK_AC *pAC, /* Adapter Context */
49940+SK_SENSOR *pSen)
49941+{
49942+ SK_EVPARA ParaLocal;
49943+ SK_BOOL TooHigh; /* Is sensor too high? */
49944+ SK_BOOL TooLow; /* Is sensor too low? */
49945+ SK_U64 CurrTime; /* Current Time */
49946+ SK_BOOL DoTrapSend; /* We need to send a trap */
49947+ SK_BOOL DoErrLog; /* We need to log the error */
49948+ SK_BOOL IsError; /* Error occured */
49949+
49950+ /* Check Dummy Reads first */
49951+ if (pAC->I2c.DummyReads > 0) {
49952+ pAC->I2c.DummyReads--;
49953+ return;
49954+ }
49955+
49956+ /* Get the current time */
49957+ CurrTime = SkOsGetTime(pAC);
49958+
49959+ /* Set para to the most useful setting: The current sensor. */
49960+ ParaLocal.Para64 = (SK_U64)pAC->I2c.CurrSens;
49961+
49962+ /* Check the Value against the thresholds. First: Error Thresholds */
49963+ TooHigh = pSen->SenValue > pSen->SenThreErrHigh;
49964+ TooLow = pSen->SenValue < pSen->SenThreErrLow;
49965+
49966+ IsError = SK_FALSE;
49967+
49968+ if (TooHigh || TooLow) {
49969+ /* Error condition is satisfied */
49970+ DoTrapSend = SK_TRUE;
49971+ DoErrLog = SK_TRUE;
49972+
49973+ /* Now error condition is satisfied */
49974+ IsError = SK_TRUE;
49975+
49976+ if (pSen->SenErrFlag == SK_SEN_ERR_ERR) {
49977+ /* This state is the former one */
49978+
49979+ /* So check first whether we have to send a trap */
49980+ if (pSen->SenLastErrTrapTS + SK_SEN_ERR_TR_HOLD > CurrTime) {
49981+ /*
49982+ * Do NOT send the Trap. The hold back time
49983+ * has to run out first.
49984+ */
49985+ DoTrapSend = SK_FALSE;
49986+ }
49987+
49988+ /* Check now whether we have to log an Error */
49989+ if (pSen->SenLastErrLogTS + SK_SEN_ERR_LOG_HOLD > CurrTime) {
49990+ /*
49991+ * Do NOT log the error. The hold back time
49992+ * has to run out first.
49993+ */
49994+ DoErrLog = SK_FALSE;
49995+ }
49996+ }
49997+ else {
49998+ /* We came from a different state -> Set Begin Time Stamp */
49999+ pSen->SenBegErrTS = CurrTime;
50000+ pSen->SenErrFlag = SK_SEN_ERR_ERR;
50001+ }
50002+
50003+ if (DoTrapSend) {
50004+ /* Set current Time */
50005+ pSen->SenLastErrTrapTS = CurrTime;
50006+ pSen->SenErrCts++;
50007+
50008+ /* Queue PNMI Event */
50009+ SkEventQueue(pAC, SKGE_PNMI, TooHigh ?
50010+ SK_PNMI_EVT_SEN_ERR_UPP : SK_PNMI_EVT_SEN_ERR_LOW,
50011+ ParaLocal);
50012+ }
50013+
50014+ if (DoErrLog) {
50015+ /* Set current Time */
50016+ pSen->SenLastErrLogTS = CurrTime;
50017+
50018+ if (pSen->SenType == SK_SEN_TEMP) {
50019+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E011, SKERR_I2C_E011MSG);
50020+ }
50021+ else if (pSen->SenType == SK_SEN_VOLT) {
50022+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E012, SKERR_I2C_E012MSG);
50023+ }
50024+ else {
50025+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E015, SKERR_I2C_E015MSG);
50026+ }
50027+ }
50028+ }
50029+
50030+ /* Check the Value against the thresholds */
50031+ /* 2nd: Warning thresholds */
50032+ TooHigh = pSen->SenValue > pSen->SenThreWarnHigh;
50033+ TooLow = pSen->SenValue < pSen->SenThreWarnLow;
50034+
50035+ if (!IsError && (TooHigh || TooLow)) {
50036+ /* Error condition is satisfied */
50037+ DoTrapSend = SK_TRUE;
50038+ DoErrLog = SK_TRUE;
50039+
50040+ if (pSen->SenErrFlag == SK_SEN_ERR_WARN) {
50041+ /* This state is the former one */
50042+
50043+ /* So check first whether we have to send a trap */
50044+ if (pSen->SenLastWarnTrapTS + SK_SEN_WARN_TR_HOLD > CurrTime) {
50045+ /*
50046+ * Do NOT send the Trap. The hold back time
50047+ * has to run out first.
50048+ */
50049+ DoTrapSend = SK_FALSE;
50050+ }
50051+
50052+ /* Check now whether we have to log an Error */
50053+ if (pSen->SenLastWarnLogTS + SK_SEN_WARN_LOG_HOLD > CurrTime) {
50054+ /*
50055+ * Do NOT log the error. The hold back time
50056+ * has to run out first.
50057+ */
50058+ DoErrLog = SK_FALSE;
50059+ }
50060+ }
50061+ else {
50062+ /* We came from a different state -> Set Begin Time Stamp */
50063+ pSen->SenBegWarnTS = CurrTime;
50064+ pSen->SenErrFlag = SK_SEN_ERR_WARN;
50065+ }
50066+
50067+ if (DoTrapSend) {
50068+ /* Set current Time */
50069+ pSen->SenLastWarnTrapTS = CurrTime;
50070+ pSen->SenWarnCts++;
50071+
50072+ /* Queue PNMI Event */
50073+ SkEventQueue(pAC, SKGE_PNMI, TooHigh ?
50074+ SK_PNMI_EVT_SEN_WAR_UPP : SK_PNMI_EVT_SEN_WAR_LOW, ParaLocal);
50075+ }
50076+
50077+ if (DoErrLog) {
50078+ /* Set current Time */
50079+ pSen->SenLastWarnLogTS = CurrTime;
50080+
50081+ if (pSen->SenType == SK_SEN_TEMP) {
50082+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E009, SKERR_I2C_E009MSG);
50083+ }
50084+ else if (pSen->SenType == SK_SEN_VOLT) {
50085+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E010, SKERR_I2C_E010MSG);
50086+ }
50087+ else {
50088+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E014, SKERR_I2C_E014MSG);
50089+ }
50090+ }
50091+ }
50092+
50093+ /* Check for NO error at all */
50094+ if (!IsError && !TooHigh && !TooLow) {
50095+ /* Set o.k. Status if no error and no warning condition */
50096+ pSen->SenErrFlag = SK_SEN_ERR_OK;
50097+ }
50098+
50099+ /* End of check against the thresholds */
50100+
50101+ if (pSen->SenInit == SK_SEN_DYN_INIT_PCI_IO) {
50102+ /* Bug fix AF: 16.Aug.2001: Correct the init base of LM80 sensor */
50103+ pSen->SenInit = SK_SEN_DYN_INIT_NONE;
50104+
50105+ if (pSen->SenValue > SK_SEN_PCI_IO_RANGE_LIMITER) {
50106+ /* 5V PCI-IO Voltage */
50107+ pSen->SenThreWarnLow = SK_SEN_PCI_IO_5V_LOW_WARN;
50108+ pSen->SenThreErrLow = SK_SEN_PCI_IO_5V_LOW_ERR;
50109+ }
50110+ else {
50111+ /* 3.3V PCI-IO Voltage */
50112+ pSen->SenThreWarnHigh = SK_SEN_PCI_IO_3V3_HIGH_WARN;
50113+ pSen->SenThreErrHigh = SK_SEN_PCI_IO_3V3_HIGH_ERR;
50114+ }
50115+ }
50116+
50117+#ifdef TEST_ONLY
50118+ /* Dynamic thresholds also for VAUX of LM80 sensor */
50119+ if (pSen->SenInit == SK_SEN_DYN_INIT_VAUX) {
50120+
50121+ pSen->SenInit = SK_SEN_DYN_INIT_NONE;
50122+
50123+ /* 3.3V VAUX Voltage */
50124+ if (pSen->SenValue > SK_SEN_VAUX_RANGE_LIMITER) {
50125+ pSen->SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN;
50126+ pSen->SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR;
50127+ }
50128+ /* 0V VAUX Voltage */
50129+ else {
50130+ pSen->SenThreWarnHigh = SK_SEN_VAUX_0V_WARN_ERR;
50131+ pSen->SenThreErrHigh = SK_SEN_VAUX_0V_WARN_ERR;
50132+ }
50133+ }
50134+
50135+ /* Check initialization state: the VIO Thresholds need adaption */
50136+ if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN &&
50137+ pSen->SenValue > SK_SEN_WARNLOW2C &&
50138+ pSen->SenValue < SK_SEN_WARNHIGH2) {
50139+
50140+ pSen->SenThreErrLow = SK_SEN_ERRLOW2C;
50141+ pSen->SenThreWarnLow = SK_SEN_WARNLOW2C;
50142+ pSen->SenInit = SK_TRUE;
50143+ }
50144+
50145+ if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN &&
50146+ pSen->SenValue > SK_SEN_WARNLOW2 &&
50147+ pSen->SenValue < SK_SEN_WARNHIGH2C) {
50148+
50149+ pSen->SenThreErrHigh = SK_SEN_ERRHIGH2C;
50150+ pSen->SenThreWarnHigh = SK_SEN_WARNHIGH2C;
50151+ pSen->SenInit = SK_TRUE;
50152+ }
50153+#endif
50154+
50155+ if (pSen->SenInit != SK_SEN_DYN_INIT_NONE) {
50156+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E013, SKERR_I2C_E013MSG);
50157+ }
50158+} /* SkI2cCheckSensor */
50159+
50160+
50161+/*
50162+ * The only Event to be served is the timeout event
50163+ *
50164+ */
50165+int SkI2cEvent(
50166+SK_AC *pAC, /* Adapter Context */
50167+SK_IOC IoC, /* I/O Context */
50168+SK_U32 Event, /* Module specific Event */
50169+SK_EVPARA Para) /* Event specific Parameter */
50170+{
50171+ int ReadComplete;
50172+ SK_SENSOR *pSen;
50173+ SK_U32 Time;
50174+ SK_EVPARA ParaLocal;
50175+ int i;
50176+
50177+ /* New case: no sensors */
50178+ if (pAC->I2c.MaxSens == 0) {
50179+ return(0);
50180+ }
50181+
50182+ switch (Event) {
50183+ case SK_I2CEV_IRQ:
50184+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
50185+ ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
50186+
50187+ if (ReadComplete) {
50188+ /* Check sensor against defined thresholds */
50189+ SkI2cCheckSensor(pAC, pSen);
50190+
50191+ /* Increment Current sensor and set appropriate Timeout */
50192+ pAC->I2c.CurrSens++;
50193+ if (pAC->I2c.CurrSens >= pAC->I2c.MaxSens) {
50194+ pAC->I2c.CurrSens = 0;
50195+ Time = SK_I2C_TIM_LONG;
50196+ }
50197+ else {
50198+ Time = SK_I2C_TIM_SHORT;
50199+ }
50200+
50201+ /* Start Timer */
50202+ ParaLocal.Para64 = (SK_U64)0;
50203+
50204+ pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING;
50205+
50206+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time,
50207+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
50208+ }
50209+ else {
50210+ /* Start Timer */
50211+ ParaLocal.Para64 = (SK_U64)0;
50212+
50213+ pAC->I2c.TimerMode = SK_TIMER_WATCH_SM;
50214+
50215+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, SK_I2C_TIM_WATCH,
50216+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
50217+ }
50218+ break;
50219+ case SK_I2CEV_TIM:
50220+ if (pAC->I2c.TimerMode == SK_TIMER_NEW_GAUGING) {
50221+
50222+ ParaLocal.Para64 = (SK_U64)0;
50223+ SkTimerStop(pAC, IoC, &pAC->I2c.SenTimer);
50224+
50225+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
50226+ ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
50227+
50228+ if (ReadComplete) {
50229+ /* Check sensor against defined thresholds */
50230+ SkI2cCheckSensor(pAC, pSen);
50231+
50232+ /* Increment Current sensor and set appropriate Timeout */
50233+ pAC->I2c.CurrSens++;
50234+ if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) {
50235+ pAC->I2c.CurrSens = 0;
50236+ Time = SK_I2C_TIM_LONG;
50237+ }
50238+ else {
50239+ Time = SK_I2C_TIM_SHORT;
50240+ }
50241+
50242+ /* Start Timer */
50243+ ParaLocal.Para64 = (SK_U64)0;
50244+
50245+ pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING;
50246+
50247+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time,
50248+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
50249+ }
50250+ }
50251+ else {
50252+ pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
50253+ pSen->SenErrFlag = SK_SEN_ERR_FAULTY;
50254+ SK_I2C_STOP(IoC);
50255+
50256+ /* Increment Current sensor and set appropriate Timeout */
50257+ pAC->I2c.CurrSens++;
50258+ if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) {
50259+ pAC->I2c.CurrSens = 0;
50260+ Time = SK_I2C_TIM_LONG;
50261+ }
50262+ else {
50263+ Time = SK_I2C_TIM_SHORT;
50264+ }
50265+
50266+ /* Start Timer */
50267+ ParaLocal.Para64 = (SK_U64)0;
50268+
50269+ pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING;
50270+
50271+ SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time,
50272+ SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
50273+ }
50274+ break;
50275+ case SK_I2CEV_CLEAR:
50276+ for (i = 0; i < SK_MAX_SENSORS; i++) {
50277+ pSen = &pAC->I2c.SenTable[i];
50278+
50279+ pSen->SenErrFlag = SK_SEN_ERR_OK;
50280+ pSen->SenErrCts = 0;
50281+ pSen->SenWarnCts = 0;
50282+ pSen->SenBegErrTS = 0;
50283+ pSen->SenBegWarnTS = 0;
50284+ pSen->SenLastErrTrapTS = (SK_U64)0;
50285+ pSen->SenLastErrLogTS = (SK_U64)0;
50286+ pSen->SenLastWarnTrapTS = (SK_U64)0;
50287+ pSen->SenLastWarnLogTS = (SK_U64)0;
50288+ }
50289+ break;
50290+ default:
50291+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E006, SKERR_I2C_E006MSG);
50292+ }
50293+
50294+ return(0);
50295+} /* SkI2cEvent*/
50296+
50297+#endif /* !SK_DIAG */
50298+
50299diff -ruN linux/drivers/net/sk98lin/skvpd.c linux-new/drivers/net/sk98lin/skvpd.c
50300--- linux/drivers/net/sk98lin/skvpd.c 2006-04-11 19:19:28.000000000 +0200
50301+++ linux-new/drivers/net/sk98lin/skvpd.c 2006-01-18 14:37:24.000000000 +0100
50302@@ -1,22 +1,22 @@
50303 /******************************************************************************
50304 *
50305 * Name: skvpd.c
50306- * Project: GEnesis, PCI Gigabit Ethernet Adapter
50307- * Version: $Revision$
50308- * Date: $Date$
50309- * Purpose: Shared software to read and write VPD data
50310+ * Project: Gigabit Ethernet Adapters, VPD-Module
50311+ * Version: $Revision$
50312+ * Date: $Date$
50313+ * Purpose: Shared software to read and write VPD
50314 *
50315 ******************************************************************************/
50316
50317 /******************************************************************************
50318 *
50319- * (C)Copyright 1998-2003 SysKonnect GmbH.
50320+ * (C)Copyright 1998-2002 SysKonnect.
50321+ * (C)Copyright 2002-2004 Marvell.
50322 *
50323 * This program is free software; you can redistribute it and/or modify
50324 * it under the terms of the GNU General Public License as published by
50325 * the Free Software Foundation; either version 2 of the License, or
50326 * (at your option) any later version.
50327- *
50328 * The information in this file is provided "AS IS" without warranty.
50329 *
50330 ******************************************************************************/
50331@@ -25,7 +25,7 @@
50332 Please refer skvpd.txt for infomation how to include this module
50333 */
50334 static const char SysKonnectFileId[] =
50335- "@(#)$Id$ (C) SK";
50336+ "@(#) $Id$ (C) Marvell.";
50337
50338 #include "h/skdrv1st.h"
50339 #include "h/sktypes.h"
50340@@ -59,9 +59,10 @@
50341 SK_U64 start_time;
50342 SK_U16 state;
50343
50344- SK_DBG_MSG(pAC,SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
50345+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
50346 ("VPD wait for %s\n", event?"Write":"Read"));
50347 start_time = SkOsGetTime(pAC);
50348+
50349 do {
50350 if (SkOsGetTime(pAC) - start_time > SK_TICKS_PER_SEC) {
50351
50352@@ -81,17 +82,18 @@
50353 ("ERROR:VPD wait timeout\n"));
50354 return(1);
50355 }
50356-
50357+
50358 VPD_IN16(pAC, IoC, PCI_VPD_ADR_REG, &state);
50359-
50360+
50361 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
50362 ("state = %x, event %x\n",state,event));
50363- } while((int)(state & PCI_VPD_FLAG) == event);
50364+ } while ((int)(state & PCI_VPD_FLAG) == event);
50365
50366 return(0);
50367 }
50368
50369-#ifdef SKDIAG
50370+
50371+#ifdef SK_DIAG
50372
50373 /*
50374 * Read the dword at address 'addr' from the VPD EEPROM.
50375@@ -124,16 +126,15 @@
50376 Rtv = 0;
50377
50378 VPD_IN32(pAC, IoC, PCI_VPD_DAT_REG, &Rtv);
50379-
50380+
50381 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
50382 ("VPD read dword data = 0x%x\n",Rtv));
50383 return(Rtv);
50384 }
50385+#endif /* SK_DIAG */
50386
50387-#endif /* SKDIAG */
50388-
50389-#if 0
50390
50391+#ifdef XXX
50392 /*
50393 Write the dword 'data' at address 'addr' into the VPD EEPROM, and
50394 verify that the data is written.
50395@@ -151,7 +152,6 @@
50396 . over all 3.8 ms 13.2 ms
50397 .
50398
50399-
50400 Returns 0: success
50401 1: error, I2C transfer does not terminate
50402 2: error, data verify error
50403@@ -189,7 +189,8 @@
50404 return(0);
50405 } /* VpdWriteDWord */
50406
50407-#endif /* 0 */
50408+#endif /* XXX */
50409+
50410
50411 /*
50412 * Read one Stream of 'len' bytes of VPD data, starting at 'addr' from
50413@@ -215,7 +216,7 @@
50414 pComp = (SK_U8 *) buf;
50415
50416 for (i = 0; i < Len; i++, buf++) {
50417- if ((i%sizeof(SK_U32)) == 0) {
50418+ if ((i % SZ_LONG) == 0) {
50419 /*
50420 * At the begin of each cycle read the Data Reg
50421 * So it is initialized even if only a few bytes
50422@@ -233,14 +234,13 @@
50423 }
50424 }
50425
50426- /* Write current Byte */
50427- VPD_OUT8(pAC, IoC, PCI_VPD_DAT_REG + (i%sizeof(SK_U32)),
50428- *(SK_U8*)buf);
50429+ /* Write current byte */
50430+ VPD_OUT8(pAC, IoC, PCI_VPD_DAT_REG + (i % SZ_LONG), *(SK_U8*)buf);
50431
50432- if (((i%sizeof(SK_U32)) == 3) || (i == (Len - 1))) {
50433+ if (((i % SZ_LONG) == 3) || (i == (Len - 1))) {
50434 /* New Address needs to be written to VPD_ADDR reg */
50435 AdrReg = (SK_U16) Addr;
50436- Addr += sizeof(SK_U32);
50437+ Addr += SZ_LONG;
50438 AdrReg |= VPD_WRITE; /* WRITE operation */
50439
50440 VPD_OUT16(pAC, IoC, PCI_VPD_ADR_REG, AdrReg);
50441@@ -250,7 +250,7 @@
50442 if (Rtv != 0) {
50443 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50444 ("Write Timed Out\n"));
50445- return(i - (i%sizeof(SK_U32)));
50446+ return(i - (i % SZ_LONG));
50447 }
50448
50449 /*
50450@@ -265,18 +265,18 @@
50451 if (Rtv != 0) {
50452 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50453 ("Verify Timed Out\n"));
50454- return(i - (i%sizeof(SK_U32)));
50455+ return(i - (i % SZ_LONG));
50456 }
50457
50458- for (j = 0; j <= (int)(i%sizeof(SK_U32)); j++, pComp++) {
50459-
50460+ for (j = 0; j <= (int)(i % SZ_LONG); j++, pComp++) {
50461+
50462 VPD_IN8(pAC, IoC, PCI_VPD_DAT_REG + j, &Data);
50463-
50464+
50465 if (Data != *pComp) {
50466 /* Verify Error */
50467 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50468 ("WriteStream Verify Error\n"));
50469- return(i - (i%sizeof(SK_U32)) + j);
50470+ return(i - (i % SZ_LONG) + j);
50471 }
50472 }
50473 }
50474@@ -284,7 +284,7 @@
50475
50476 return(Len);
50477 }
50478-
50479+
50480
50481 /*
50482 * Read one Stream of 'len' bytes of VPD data, starting at 'addr' from
50483@@ -304,10 +304,10 @@
50484 int Rtv;
50485
50486 for (i = 0; i < Len; i++, buf++) {
50487- if ((i%sizeof(SK_U32)) == 0) {
50488+ if ((i % SZ_LONG) == 0) {
50489 /* New Address needs to be written to VPD_ADDR reg */
50490 AdrReg = (SK_U16) Addr;
50491- Addr += sizeof(SK_U32);
50492+ Addr += SZ_LONG;
50493 AdrReg &= ~VPD_WRITE; /* READ operation */
50494
50495 VPD_OUT16(pAC, IoC, PCI_VPD_ADR_REG, AdrReg);
50496@@ -318,13 +318,13 @@
50497 return(i);
50498 }
50499 }
50500- VPD_IN8(pAC, IoC, PCI_VPD_DAT_REG + (i%sizeof(SK_U32)),
50501- (SK_U8 *)buf);
50502+ VPD_IN8(pAC, IoC, PCI_VPD_DAT_REG + (i % SZ_LONG), (SK_U8 *)buf);
50503 }
50504
50505 return(Len);
50506 }
50507
50508+
50509 /*
50510 * Read ore writes 'len' bytes of VPD data, starting at 'addr' from
50511 * or to the I2C EEPROM.
50512@@ -350,14 +350,14 @@
50513 return(0);
50514
50515 vpd_rom_size = pAC->vpd.rom_size;
50516-
50517+
50518 if (addr > vpd_rom_size - 4) {
50519 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50520 ("Address error: 0x%x, exp. < 0x%x\n",
50521 addr, vpd_rom_size - 4));
50522 return(0);
50523 }
50524-
50525+
50526 if (addr + len > vpd_rom_size) {
50527 len = vpd_rom_size - addr;
50528 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50529@@ -374,8 +374,8 @@
50530 return(Rtv);
50531 }
50532
50533-#ifdef SKDIAG
50534
50535+#if defined (SK_DIAG) || defined (SK_ASF)
50536 /*
50537 * Read 'len' bytes of VPD data, starting at 'addr'.
50538 *
50539@@ -391,6 +391,7 @@
50540 return(VpdTransferBlock(pAC, IoC, buf, addr, len, VPD_READ));
50541 }
50542
50543+
50544 /*
50545 * Write 'len' bytes of *but to the VPD EEPROM, starting at 'addr'.
50546 *
50547@@ -405,18 +406,27 @@
50548 {
50549 return(VpdTransferBlock(pAC, IoC, buf, addr, len, VPD_WRITE));
50550 }
50551-#endif /* SKDIAG */
50552+#endif /* SK_DIAG */
50553
50554-/*
50555- * (re)initialize the VPD buffer
50556+
50557+/******************************************************************************
50558 *
50559- * Reads the VPD data from the EEPROM into the VPD buffer.
50560- * Get the remaining read only and read / write space.
50561+ * VpdInit() - (re)initialize the VPD buffer
50562 *
50563- * return 0: success
50564- * 1: fatal VPD error
50565+ * Description:
50566+ * Reads the VPD data from the EEPROM into the VPD buffer.
50567+ * Get the remaining read only and read / write space.
50568+ *
50569+ * Note:
50570+ * This is a local function and should be used locally only.
50571+ * However, the ASF module needs to use this function also.
50572+ * Therfore it has been published.
50573+ *
50574+ * Returns:
50575+ * 0: success
50576+ * 1: fatal VPD error
50577 */
50578-static int VpdInit(
50579+int VpdInit(
50580 SK_AC *pAC, /* Adapters context */
50581 SK_IOC IoC) /* IO Context */
50582 {
50583@@ -427,14 +437,14 @@
50584 SK_U16 dev_id;
50585 SK_U32 our_reg2;
50586
50587- SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_INIT, ("VpdInit .. "));
50588-
50589+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_INIT, ("VpdInit ... "));
50590+
50591 VPD_IN16(pAC, IoC, PCI_DEVICE_ID, &dev_id);
50592-
50593+
50594 VPD_IN32(pAC, IoC, PCI_OUR_REG_2, &our_reg2);
50595-
50596+
50597 pAC->vpd.rom_size = 256 << ((our_reg2 & PCI_VPD_ROM_SZ) >> 14);
50598-
50599+
50600 /*
50601 * this function might get used before the hardware is initialized
50602 * therefore we cannot always trust in GIChipId
50603@@ -465,19 +475,15 @@
50604 ("Block Read Error\n"));
50605 return(1);
50606 }
50607-
50608+
50609 pAC->vpd.vpd_size = vpd_size;
50610
50611 /* Asus K8V Se Deluxe bugfix. Correct VPD content */
50612- /* MBo April 2004 */
50613- if (((unsigned char)pAC->vpd.vpd_buf[0x3f] == 0x38) &&
50614- ((unsigned char)pAC->vpd.vpd_buf[0x40] == 0x3c) &&
50615- ((unsigned char)pAC->vpd.vpd_buf[0x41] == 0x45)) {
50616- printk("sk98lin: Asus mainboard with buggy VPD? "
50617- "Correcting data.\n");
50618- pAC->vpd.vpd_buf[0x40] = 0x38;
50619- }
50620+ i = 62;
50621+ if (!SK_STRNCMP(pAC->vpd.vpd_buf + i, " 8<E", 4)) {
50622
50623+ pAC->vpd.vpd_buf[i + 2] = '8';
50624+ }
50625
50626 /* find the end tag of the RO area */
50627 if (!(r = vpd_find_para(pAC, VPD_RV, &rp))) {
50628@@ -485,9 +491,9 @@
50629 ("Encoding Error: RV Tag not found\n"));
50630 return(1);
50631 }
50632-
50633+
50634 if (r->p_val + r->p_len > pAC->vpd.vpd_buf + vpd_size/2) {
50635- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50636+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD,SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50637 ("Encoding Error: Invalid VPD struct size\n"));
50638 return(1);
50639 }
50640@@ -497,7 +503,7 @@
50641 for (i = 0, x = 0; (unsigned)i <= (unsigned)vpd_size/2 - r->p_len; i++) {
50642 x += pAC->vpd.vpd_buf[i];
50643 }
50644-
50645+
50646 if (x != 0) {
50647 /* checksum error */
50648 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50649@@ -511,7 +517,7 @@
50650 ("Encoding Error: RV Tag not found\n"));
50651 return(1);
50652 }
50653-
50654+
50655 if (r->p_val < pAC->vpd.vpd_buf + vpd_size/2) {
50656 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50657 ("Encoding Error: Invalid VPD struct size\n"));
50658@@ -531,6 +537,7 @@
50659 return(0);
50660 }
50661
50662+
50663 /*
50664 * find the Keyword 'key' in the VPD buffer and fills the
50665 * parameter struct 'p' with it's values
50666@@ -541,7 +548,7 @@
50667 static SK_VPD_PARA *vpd_find_para(
50668 SK_AC *pAC, /* common data base */
50669 const char *key, /* keyword to find (e.g. "MN") */
50670-SK_VPD_PARA *p) /* parameter description struct */
50671+SK_VPD_PARA *p) /* parameter description struct */
50672 {
50673 char *v ; /* points to VPD buffer */
50674 int max; /* Maximum Number of Iterations */
50675@@ -556,10 +563,10 @@
50676 if (*v != (char)RES_ID) {
50677 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50678 ("Error: 0x%x missing\n", RES_ID));
50679- return NULL;
50680+ return(0);
50681 }
50682
50683- if (strcmp(key, VPD_NAME) == 0) {
50684+ if (SK_STRCMP(key, VPD_NAME) == 0) {
50685 p->p_len = VPD_GET_RES_LEN(v);
50686 p->p_val = VPD_GET_VAL(v);
50687 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
50688@@ -569,7 +576,7 @@
50689
50690 v += 3 + VPD_GET_RES_LEN(v) + 3;
50691 for (;; ) {
50692- if (SK_MEMCMP(key,v,2) == 0) {
50693+ if (SK_MEMCMP(key, v, 2) == 0) {
50694 p->p_len = VPD_GET_VPD_LEN(v);
50695 p->p_val = VPD_GET_VAL(v);
50696 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
50697@@ -579,11 +586,11 @@
50698
50699 /* exit when reaching the "RW" Tag or the maximum of itera. */
50700 max--;
50701- if (SK_MEMCMP(VPD_RW,v,2) == 0 || max == 0) {
50702+ if (SK_MEMCMP(VPD_RW, v, 2) == 0 || max == 0) {
50703 break;
50704 }
50705
50706- if (SK_MEMCMP(VPD_RV,v,2) == 0) {
50707+ if (SK_MEMCMP(VPD_RV, v, 2) == 0) {
50708 v += 3 + VPD_GET_VPD_LEN(v) + 3; /* skip VPD-W */
50709 }
50710 else {
50711@@ -600,9 +607,10 @@
50712 ("Key/Len Encoding error\n"));
50713 }
50714 #endif /* DEBUG */
50715- return NULL;
50716+ return(0);
50717 }
50718
50719+
50720 /*
50721 * Move 'n' bytes. Begin with the last byte if 'n' is > 0,
50722 * Start with the last byte if n is < 0.
50723@@ -637,6 +645,7 @@
50724 }
50725 }
50726
50727+
50728 /*
50729 * setup the VPD keyword 'key' at 'ip'.
50730 *
50731@@ -653,10 +662,11 @@
50732 p = (SK_VPD_KEY *) ip;
50733 p->p_key[0] = key[0];
50734 p->p_key[1] = key[1];
50735- p->p_len = (unsigned char) len;
50736- SK_MEMCPY(&p->p_val,buf,len);
50737+ p->p_len = (unsigned char)len;
50738+ SK_MEMCPY(&p->p_val, buf, len);
50739 }
50740
50741+
50742 /*
50743 * Setup the VPD end tag "RV" / "RW".
50744 * Also correct the remaining space variables vpd_free_ro / vpd_free_rw.
50745@@ -682,7 +692,7 @@
50746
50747 if (p->p_key[0] != 'R' || (p->p_key[1] != 'V' && p->p_key[1] != 'W')) {
50748 /* something wrong here, encoding error */
50749- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50750+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
50751 ("Encoding Error: invalid end tag\n"));
50752 return(1);
50753 }
50754@@ -714,6 +724,7 @@
50755 return(0);
50756 }
50757
50758+
50759 /*
50760 * Insert a VPD keyword into the VPD buffer.
50761 *
50762@@ -747,11 +758,11 @@
50763
50764 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL,
50765 ("VPD setup para key = %s, val = %s\n",key,buf));
50766-
50767+
50768 vpd_size = pAC->vpd.vpd_size;
50769
50770 rtv = 0;
50771- ip = NULL;
50772+ ip = 0;
50773 if (type == VPD_RW_KEY) {
50774 /* end tag is "RW" */
50775 free = pAC->vpd.v.vpd_free_rw;
50776@@ -875,18 +886,18 @@
50777 }
50778 }
50779
50780- if ((signed)strlen(VPD_NAME) + 1 <= *len) {
50781+ if ((signed)SK_STRLEN(VPD_NAME) + 1 <= *len) {
50782 v = pAC->vpd.vpd_buf;
50783- strcpy(buf,VPD_NAME);
50784- n = strlen(VPD_NAME) + 1;
50785+ SK_STRCPY(buf, VPD_NAME);
50786+ n = SK_STRLEN(VPD_NAME) + 1;
50787 buf += n;
50788 *elements = 1;
50789 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_RX,
50790- ("'%c%c' ",v[0],v[1]));
50791+ ("'%c%c' ", v[0], v[1]));
50792 }
50793 else {
50794 *len = 0;
50795- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR,
50796+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50797 ("buffer overflow\n"));
50798 return(2);
50799 }
50800@@ -894,17 +905,17 @@
50801 v += 3 + VPD_GET_RES_LEN(v) + 3;
50802 for (;; ) {
50803 /* exit when reaching the "RW" Tag */
50804- if (SK_MEMCMP(VPD_RW,v,2) == 0) {
50805+ if (SK_MEMCMP(VPD_RW, v, 2) == 0) {
50806 break;
50807 }
50808
50809- if (SK_MEMCMP(VPD_RV,v,2) == 0) {
50810+ if (SK_MEMCMP(VPD_RV, v, 2) == 0) {
50811 v += 3 + VPD_GET_VPD_LEN(v) + 3; /* skip VPD-W */
50812 continue;
50813 }
50814
50815 if (n+3 <= *len) {
50816- SK_MEMCPY(buf,v,2);
50817+ SK_MEMCPY(buf, v, 2);
50818 buf += 2;
50819 *buf++ = '\0';
50820 n += 3;
50821@@ -991,13 +1002,14 @@
50822 {
50823 if ((*key != 'Y' && *key != 'V') ||
50824 key[1] < '0' || key[1] > 'Z' ||
50825- (key[1] > '9' && key[1] < 'A') || strlen(key) != 2) {
50826+ (key[1] > '9' && key[1] < 'A') || SK_STRLEN(key) != 2) {
50827
50828 return(SK_FALSE);
50829 }
50830 return(SK_TRUE);
50831 }
50832
50833+
50834 /*
50835 * Read the contents of the VPD EEPROM and copy it to the VPD
50836 * buffer if not already done. Insert/overwrite the keyword 'key'
50837@@ -1026,7 +1038,7 @@
50838
50839 if ((*key != 'Y' && *key != 'V') ||
50840 key[1] < '0' || key[1] > 'Z' ||
50841- (key[1] > '9' && key[1] < 'A') || strlen(key) != 2) {
50842+ (key[1] > '9' && key[1] < 'A') || SK_STRLEN(key) != 2) {
50843
50844 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50845 ("illegal key tag, keyword not written\n"));
50846@@ -1042,13 +1054,13 @@
50847 }
50848
50849 rtv = 0;
50850- len = strlen(buf);
50851+ len = SK_STRLEN(buf);
50852 if (len > VPD_MAX_LEN) {
50853 /* cut it */
50854 len = VPD_MAX_LEN;
50855 rtv = 2;
50856 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50857- ("keyword too long, cut after %d bytes\n",VPD_MAX_LEN));
50858+ ("keyword too long, cut after %d bytes\n", VPD_MAX_LEN));
50859 }
50860 if ((rtv2 = VpdSetupPara(pAC, key, buf, len, VPD_RW_KEY, OWR_KEY)) != 0) {
50861 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50862@@ -1059,6 +1071,7 @@
50863 return(rtv);
50864 }
50865
50866+
50867 /*
50868 * Read the contents of the VPD EEPROM and copy it to the
50869 * VPD buffer if not already done. Remove the VPD keyword
50870@@ -1082,7 +1095,7 @@
50871
50872 vpd_size = pAC->vpd.vpd_size;
50873
50874- SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_TX,("VPD delete key %s\n",key));
50875+ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("VPD delete key %s\n", key));
50876 if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) {
50877 if (VpdInit(pAC, IoC) != 0) {
50878 SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR,
50879@@ -1119,6 +1132,7 @@
50880 return(0);
50881 }
50882
50883+
50884 /*
50885 * If the VPD buffer contains valid data write the VPD
50886 * read/write area back to the VPD EEPROM.
50887@@ -1149,7 +1163,6 @@
50888 }
50889
50890
50891-
50892 /*
50893 * Read the contents of the VPD EEPROM and copy it to the VPD buffer
50894 * if not already done. If the keyword "VF" is not present it will be
50895@@ -1178,7 +1191,7 @@
50896 }
50897 }
50898
50899- len = strlen(msg);
50900+ len = SK_STRLEN(msg);
50901 if (len > VPD_MAX_LEN) {
50902 /* cut it */
50903 len = VPD_MAX_LEN;
50904diff -ruN linux/drivers/net/sk98lin/skxmac2.c linux-new/drivers/net/sk98lin/skxmac2.c
50905--- linux/drivers/net/sk98lin/skxmac2.c 2006-04-11 19:19:28.000000000 +0200
50906+++ linux-new/drivers/net/sk98lin/skxmac2.c 2006-01-18 14:37:24.000000000 +0100
50907@@ -2,23 +2,24 @@
50908 *
50909 * Name: skxmac2.c
50910 * Project: Gigabit Ethernet Adapters, Common Modules
50911- * Version: $Revision$
50912- * Date: $Date$
50913+ * Version: $Revision$
50914+ * Date: $Date$
50915 * Purpose: Contains functions to initialize the MACs and PHYs
50916 *
50917 ******************************************************************************/
50918
50919 /******************************************************************************
50920 *
50921+ * LICENSE:
50922 * (C)Copyright 1998-2002 SysKonnect.
50923- * (C)Copyright 2002-2003 Marvell.
50924+ * (C)Copyright 2002-2005 Marvell.
50925 *
50926 * This program is free software; you can redistribute it and/or modify
50927 * it under the terms of the GNU General Public License as published by
50928 * the Free Software Foundation; either version 2 of the License, or
50929 * (at your option) any later version.
50930- *
50931 * The information in this file is provided "AS IS" without warranty.
50932+ * /LICENSE
50933 *
50934 ******************************************************************************/
50935
50936@@ -37,7 +38,7 @@
50937
50938 #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
50939 static const char SysKonnectFileId[] =
50940- "@(#) $Id$ (C) Marvell.";
50941+ "@(#) $Id$ (C) Marvell.";
50942 #endif
50943
50944 #ifdef GENESIS
50945@@ -83,7 +84,7 @@
50946 * Returns:
50947 * nothing
50948 */
50949-void SkXmPhyRead(
50950+int SkXmPhyRead(
50951 SK_AC *pAC, /* Adapter Context */
50952 SK_IOC IoC, /* I/O Context */
50953 int Port, /* Port Index (MAC_1 + n) */
50954@@ -94,13 +95,13 @@
50955 SK_GEPORT *pPrt;
50956
50957 pPrt = &pAC->GIni.GP[Port];
50958-
50959+
50960 /* write the PHY register's address */
50961 XM_OUT16(IoC, Port, XM_PHY_ADDR, PhyReg | pPrt->PhyAddr);
50962-
50963+
50964 /* get the PHY register's value */
50965 XM_IN16(IoC, Port, XM_PHY_DATA, pVal);
50966-
50967+
50968 if (pPrt->PhyType != SK_PHY_XMAC) {
50969 do {
50970 XM_IN16(IoC, Port, XM_MMU_CMD, &Mmu);
50971@@ -110,6 +111,8 @@
50972 /* get the PHY register's value */
50973 XM_IN16(IoC, Port, XM_PHY_DATA, pVal);
50974 }
50975+
50976+ return(0);
50977 } /* SkXmPhyRead */
50978
50979
50980@@ -122,7 +125,7 @@
50981 * Returns:
50982 * nothing
50983 */
50984-void SkXmPhyWrite(
50985+int SkXmPhyWrite(
50986 SK_AC *pAC, /* Adapter Context */
50987 SK_IOC IoC, /* I/O Context */
50988 int Port, /* Port Index (MAC_1 + n) */
50989@@ -133,26 +136,28 @@
50990 SK_GEPORT *pPrt;
50991
50992 pPrt = &pAC->GIni.GP[Port];
50993-
50994+
50995 if (pPrt->PhyType != SK_PHY_XMAC) {
50996 do {
50997 XM_IN16(IoC, Port, XM_MMU_CMD, &Mmu);
50998 /* wait until 'Busy' is cleared */
50999 } while ((Mmu & XM_MMU_PHY_BUSY) != 0);
51000 }
51001-
51002+
51003 /* write the PHY register's address */
51004 XM_OUT16(IoC, Port, XM_PHY_ADDR, PhyReg | pPrt->PhyAddr);
51005-
51006+
51007 /* write the PHY register's value */
51008 XM_OUT16(IoC, Port, XM_PHY_DATA, Val);
51009-
51010+
51011 if (pPrt->PhyType != SK_PHY_XMAC) {
51012 do {
51013 XM_IN16(IoC, Port, XM_MMU_CMD, &Mmu);
51014 /* wait until 'Busy' is cleared */
51015 } while ((Mmu & XM_MMU_PHY_BUSY) != 0);
51016 }
51017+
51018+ return(0);
51019 } /* SkXmPhyWrite */
51020 #endif /* GENESIS */
51021
51022@@ -165,63 +170,97 @@
51023 * Description: reads a 16-bit word from GPHY through MDIO
51024 *
51025 * Returns:
51026- * nothing
51027+ * 0 o.k.
51028+ * 1 error during MDIO read
51029+ * 2 timeout
51030 */
51031-void SkGmPhyRead(
51032+int SkGmPhyRead(
51033 SK_AC *pAC, /* Adapter Context */
51034 SK_IOC IoC, /* I/O Context */
51035 int Port, /* Port Index (MAC_1 + n) */
51036 int PhyReg, /* Register Address (Offset) */
51037 SK_U16 SK_FAR *pVal) /* Pointer to Value */
51038 {
51039+ SK_U16 Word;
51040 SK_U16 Ctrl;
51041 SK_GEPORT *pPrt;
51042-#ifdef VCPU
51043- u_long SimCyle;
51044- u_long SimLowTime;
51045-
51046- VCPUgetTime(&SimCyle, &SimLowTime);
51047- VCPUprintf(0, "SkGmPhyRead(%u), SimCyle=%u, SimLowTime=%u\n",
51048- PhyReg, SimCyle, SimLowTime);
51049-#endif /* VCPU */
51050-
51051+ SK_U32 StartTime;
51052+ SK_U32 CurrTime;
51053+ SK_U32 Delta;
51054+ SK_U32 TimeOut;
51055+ int Rtv;
51056+
51057+ Rtv = 0;
51058+
51059+ *pVal = 0xffff;
51060+
51061 pPrt = &pAC->GIni.GP[Port];
51062-
51063+
51064 /* set PHY-Register offset and 'Read' OpCode (= 1) */
51065- *pVal = (SK_U16)(GM_SMI_CT_PHY_AD(pPrt->PhyAddr) |
51066+ Word = (SK_U16)(GM_SMI_CT_PHY_AD(pPrt->PhyAddr) |
51067 GM_SMI_CT_REG_AD(PhyReg) | GM_SMI_CT_OP_RD);
51068
51069- GM_OUT16(IoC, Port, GM_SMI_CTRL, *pVal);
51070+ GM_OUT16(IoC, Port, GM_SMI_CTRL, Word);
51071
51072- GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl);
51073-
51074 /* additional check for MDC/MDIO activity */
51075- if ((Ctrl & GM_SMI_CT_BUSY) == 0) {
51076- *pVal = 0;
51077- return;
51078+ GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl);
51079+
51080+ if (Ctrl == 0xffff || (Ctrl & GM_SMI_CT_OP_RD) == 0) {
51081+
51082+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
51083+ ("PHY read impossible on Port %d (Ctrl=0x%04x)\n", Port, Ctrl));
51084+
51085+ return(1);
51086 }
51087
51088- *pVal |= GM_SMI_CT_BUSY;
51089-
51090- do {
51091+ Word |= GM_SMI_CT_BUSY;
51092+
51093+ SK_IN32(IoC, GMAC_TI_ST_VAL, &StartTime);
51094+
51095+ /* set timeout to 10 ms */
51096+ TimeOut = HW_MS_TO_TICKS(pAC, 10);
51097+
51098+ do { /* wait until 'Busy' is cleared and 'ReadValid' is set */
51099 #ifdef VCPU
51100 VCPUwaitTime(1000);
51101 #endif /* VCPU */
51102
51103+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime);
51104+
51105+ if (CurrTime >= StartTime) {
51106+ Delta = CurrTime - StartTime;
51107+ }
51108+ else {
51109+ Delta = CurrTime + ~StartTime + 1;
51110+ }
51111+
51112+ if (Delta > TimeOut) {
51113+
51114+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
51115+ ("PHY read timeout on Port %d (Ctrl=0x%04x)\n", Port, Ctrl));
51116+ Rtv = 2;
51117+ break;
51118+ }
51119+
51120 GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl);
51121
51122- /* wait until 'ReadValid' is set */
51123- } while (Ctrl == *pVal);
51124-
51125- /* get the PHY register's value */
51126+ /* Error on reading SMI Control Register */
51127+ if (Ctrl == 0xffff) {
51128+ return(1);
51129+ }
51130+
51131+ } while ((Ctrl ^ Word) != (GM_SMI_CT_RD_VAL | GM_SMI_CT_BUSY));
51132+
51133 GM_IN16(IoC, Port, GM_SMI_DATA, pVal);
51134
51135-#ifdef VCPU
51136- VCPUgetTime(&SimCyle, &SimLowTime);
51137- VCPUprintf(0, "VCPUgetTime(), SimCyle=%u, SimLowTime=%u\n",
51138- SimCyle, SimLowTime);
51139-#endif /* VCPU */
51140+ /* dummy read after GM_IN16() */
51141+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime);
51142
51143+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
51144+ ("SkGmPhyRead Port:%d, Reg=%d, Val = 0x%04X\n",
51145+ Port, PhyReg, *pVal));
51146+
51147+ return(Rtv);
51148 } /* SkGmPhyRead */
51149
51150
51151@@ -232,9 +271,11 @@
51152 * Description: writes a 16-bit word to GPHY through MDIO
51153 *
51154 * Returns:
51155- * nothing
51156+ * 0 o.k.
51157+ * 1 error during MDIO read
51158+ * 2 timeout
51159 */
51160-void SkGmPhyWrite(
51161+int SkGmPhyWrite(
51162 SK_AC *pAC, /* Adapter Context */
51163 SK_IOC IoC, /* I/O Context */
51164 int Port, /* Port Index (MAC_1 + n) */
51165@@ -243,54 +284,78 @@
51166 {
51167 SK_U16 Ctrl;
51168 SK_GEPORT *pPrt;
51169-#ifdef VCPU
51170- SK_U32 DWord;
51171- u_long SimCyle;
51172- u_long SimLowTime;
51173-
51174- VCPUgetTime(&SimCyle, &SimLowTime);
51175- VCPUprintf(0, "SkGmPhyWrite(Reg=%u, Val=0x%04x), SimCyle=%u, SimLowTime=%u\n",
51176- PhyReg, Val, SimCyle, SimLowTime);
51177-#endif /* VCPU */
51178-
51179+ SK_U32 StartTime;
51180+ SK_U32 CurrTime;
51181+ SK_U32 Delta;
51182+ SK_U32 TimeOut;
51183+
51184+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
51185+ ("SkGmPhyWrite Port:%d, Reg=%d, Val = 0x%04X\n",
51186+ Port, PhyReg, Val));
51187+
51188 pPrt = &pAC->GIni.GP[Port];
51189-
51190+
51191 /* write the PHY register's value */
51192 GM_OUT16(IoC, Port, GM_SMI_DATA, Val);
51193-
51194- /* set PHY-Register offset and 'Write' OpCode (= 0) */
51195- Val = GM_SMI_CT_PHY_AD(pPrt->PhyAddr) | GM_SMI_CT_REG_AD(PhyReg);
51196
51197- GM_OUT16(IoC, Port, GM_SMI_CTRL, Val);
51198-
51199- GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl);
51200-
51201+#ifdef DEBUG
51202 /* additional check for MDC/MDIO activity */
51203- if ((Ctrl & GM_SMI_CT_BUSY) == 0) {
51204- return;
51205+ GM_IN16(IoC, Port, GM_SMI_DATA, &Ctrl);
51206+
51207+ if (Ctrl != Val) {
51208+
51209+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
51210+ ("PHY write impossible on Port %d (Val=0x%04x)\n", Port, Ctrl));
51211+
51212+ return(1);
51213 }
51214-
51215- Val |= GM_SMI_CT_BUSY;
51216+#endif /* DEBUG */
51217
51218- do {
51219-#ifdef VCPU
51220- /* read Timer value */
51221- SK_IN32(IoC, B2_TI_VAL, &DWord);
51222+ /* set PHY-Register offset and 'Write' OpCode (= 0) */
51223+ Ctrl = (SK_U16)(GM_SMI_CT_PHY_AD(pPrt->PhyAddr) |
51224+ GM_SMI_CT_REG_AD(PhyReg));
51225
51226+ GM_OUT16(IoC, Port, GM_SMI_CTRL, Ctrl);
51227+
51228+ SK_IN32(IoC, GMAC_TI_ST_VAL, &StartTime);
51229+
51230+ /* set timeout to 10 ms */
51231+ TimeOut = HW_MS_TO_TICKS(pAC, 10);
51232+
51233+ do { /* wait until 'Busy' is cleared */
51234+#ifdef VCPU
51235 VCPUwaitTime(1000);
51236 #endif /* VCPU */
51237
51238+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime);
51239+
51240+ if (CurrTime >= StartTime) {
51241+ Delta = CurrTime - StartTime;
51242+ }
51243+ else {
51244+ Delta = CurrTime + ~StartTime + 1;
51245+ }
51246+
51247+ if (Delta > TimeOut) {
51248+
51249+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
51250+ ("PHY write timeout on Port %d (Ctrl=0x%04x)\n", Port, Ctrl));
51251+ return(2);
51252+ }
51253+
51254 GM_IN16(IoC, Port, GM_SMI_CTRL, &Ctrl);
51255
51256- /* wait until 'Busy' is cleared */
51257- } while (Ctrl == Val);
51258-
51259-#ifdef VCPU
51260- VCPUgetTime(&SimCyle, &SimLowTime);
51261- VCPUprintf(0, "VCPUgetTime(), SimCyle=%u, SimLowTime=%u\n",
51262- SimCyle, SimLowTime);
51263-#endif /* VCPU */
51264+ /* Error on reading SMI Control Register */
51265+ if (Ctrl == 0xffff) {
51266+ return(1);
51267+ }
51268
51269+ } while ((Ctrl & GM_SMI_CT_BUSY) != 0);
51270+
51271+ /* dummy read after GM_IN16() */
51272+ SK_IN32(IoC, GMAC_TI_ST_VAL, &CurrTime);
51273+
51274+ return(0);
51275 } /* SkGmPhyWrite */
51276 #endif /* YUKON */
51277
51278@@ -312,16 +377,8 @@
51279 int PhyReg, /* Register Address (Offset) */
51280 SK_U16 *pVal) /* Pointer to Value */
51281 {
51282- void (*r_func)(SK_AC *pAC, SK_IOC IoC, int Port, int Reg, SK_U16 *pVal);
51283
51284- if (pAC->GIni.GIGenesis) {
51285- r_func = SkXmPhyRead;
51286- }
51287- else {
51288- r_func = SkGmPhyRead;
51289- }
51290-
51291- r_func(pAC, IoC, Port, PhyReg, pVal);
51292+ pAC->GIni.GIFunc.pFnMacPhyRead(pAC, IoC, Port, PhyReg, pVal);
51293 } /* SkGePhyRead */
51294
51295
51296@@ -341,16 +398,8 @@
51297 int PhyReg, /* Register Address (Offset) */
51298 SK_U16 Val) /* Value */
51299 {
51300- void (*w_func)(SK_AC *pAC, SK_IOC IoC, int Port, int Reg, SK_U16 Val);
51301
51302- if (pAC->GIni.GIGenesis) {
51303- w_func = SkXmPhyWrite;
51304- }
51305- else {
51306- w_func = SkGmPhyWrite;
51307- }
51308-
51309- w_func(pAC, IoC, Port, PhyReg, Val);
51310+ pAC->GIni.GIFunc.pFnMacPhyWrite(pAC, IoC, Port, PhyReg, Val);
51311 } /* SkGePhyWrite */
51312 #endif /* SK_DIAG */
51313
51314@@ -360,15 +409,15 @@
51315 * SkMacPromiscMode() - Enable / Disable Promiscuous Mode
51316 *
51317 * Description:
51318- * enables / disables promiscuous mode by setting Mode Register (XMAC) or
51319- * Receive Control Register (GMAC) dep. on board type
51320+ * enables / disables promiscuous mode by setting Mode Register (XMAC) or
51321+ * Receive Control Register (GMAC) dep. on board type
51322 *
51323 * Returns:
51324 * nothing
51325 */
51326 void SkMacPromiscMode(
51327-SK_AC *pAC, /* adapter context */
51328-SK_IOC IoC, /* IO context */
51329+SK_AC *pAC, /* Adapter Context */
51330+SK_IOC IoC, /* I/O Context */
51331 int Port, /* Port Index (MAC_1 + n) */
51332 SK_BOOL Enable) /* Enable / Disable */
51333 {
51334@@ -377,11 +426,11 @@
51335 #endif
51336 #ifdef GENESIS
51337 SK_U32 MdReg;
51338-#endif
51339+#endif
51340
51341 #ifdef GENESIS
51342 if (pAC->GIni.GIGenesis) {
51343-
51344+
51345 XM_IN32(IoC, Port, XM_MODE, &MdReg);
51346 /* enable or disable promiscuous mode */
51347 if (Enable) {
51348@@ -394,12 +443,12 @@
51349 XM_OUT32(IoC, Port, XM_MODE, MdReg);
51350 }
51351 #endif /* GENESIS */
51352-
51353+
51354 #ifdef YUKON
51355 if (pAC->GIni.GIYukon) {
51356-
51357+
51358 GM_IN16(IoC, Port, GM_RX_CTRL, &RcReg);
51359-
51360+
51361 /* enable or disable unicast and multicast filtering */
51362 if (Enable) {
51363 RcReg &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
51364@@ -420,28 +469,28 @@
51365 * SkMacHashing() - Enable / Disable Hashing
51366 *
51367 * Description:
51368- * enables / disables hashing by setting Mode Register (XMAC) or
51369- * Receive Control Register (GMAC) dep. on board type
51370+ * enables / disables hashing by setting Mode Register (XMAC) or
51371+ * Receive Control Register (GMAC) dep. on board type
51372 *
51373 * Returns:
51374 * nothing
51375 */
51376 void SkMacHashing(
51377-SK_AC *pAC, /* adapter context */
51378-SK_IOC IoC, /* IO context */
51379+SK_AC *pAC, /* Adapter Context */
51380+SK_IOC IoC, /* I/O Context */
51381 int Port, /* Port Index (MAC_1 + n) */
51382 SK_BOOL Enable) /* Enable / Disable */
51383 {
51384 #ifdef YUKON
51385 SK_U16 RcReg;
51386-#endif
51387+#endif
51388 #ifdef GENESIS
51389 SK_U32 MdReg;
51390 #endif
51391
51392 #ifdef GENESIS
51393 if (pAC->GIni.GIGenesis) {
51394-
51395+
51396 XM_IN32(IoC, Port, XM_MODE, &MdReg);
51397 /* enable or disable hashing */
51398 if (Enable) {
51399@@ -454,12 +503,12 @@
51400 XM_OUT32(IoC, Port, XM_MODE, MdReg);
51401 }
51402 #endif /* GENESIS */
51403-
51404+
51405 #ifdef YUKON
51406 if (pAC->GIni.GIYukon) {
51407-
51408+
51409 GM_IN16(IoC, Port, GM_RX_CTRL, &RcReg);
51410-
51411+
51412 /* enable or disable multicast filtering */
51413 if (Enable) {
51414 RcReg |= GM_RXCR_MCF_ENA;
51415@@ -487,8 +536,8 @@
51416 * - don't set XMR_FS_ERR in status SK_LENERR_OK_ON/OFF
51417 * for inrange length error frames
51418 * - don't set XMR_FS_ERR in status SK_BIG_PK_OK_ON/OFF
51419- * for frames > 1514 bytes
51420- * - enable Rx of own packets SK_SELF_RX_ON/OFF
51421+ * for frames > 1514 bytes
51422+ * - enable Rx of own packets SK_SELF_RX_ON/OFF
51423 *
51424 * for incoming packets may be enabled/disabled by this function.
51425 * Additional modes may be added later.
51426@@ -499,11 +548,11 @@
51427 * nothing
51428 */
51429 static void SkXmSetRxCmd(
51430-SK_AC *pAC, /* adapter context */
51431-SK_IOC IoC, /* IO context */
51432+SK_AC *pAC, /* Adapter Context */
51433+SK_IOC IoC, /* I/O Context */
51434 int Port, /* Port Index (MAC_1 + n) */
51435 int Mode) /* Mode is SK_STRIP_FCS_ON/OFF, SK_STRIP_PAD_ON/OFF,
51436- SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */
51437+ SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */
51438 {
51439 SK_U16 OldRxCmd;
51440 SK_U16 RxCmd;
51441@@ -511,7 +560,7 @@
51442 XM_IN16(IoC, Port, XM_RX_CMD, &OldRxCmd);
51443
51444 RxCmd = OldRxCmd;
51445-
51446+
51447 switch (Mode & (SK_STRIP_FCS_ON | SK_STRIP_FCS_OFF)) {
51448 case SK_STRIP_FCS_ON:
51449 RxCmd |= XM_RX_STRIP_FCS;
51450@@ -572,8 +621,8 @@
51451 * The features
51452 * - FCS (CRC) stripping, SK_STRIP_FCS_ON/OFF
51453 * - don't set GMR_FS_LONG_ERR SK_BIG_PK_OK_ON/OFF
51454- * for frames > 1514 bytes
51455- * - enable Rx of own packets SK_SELF_RX_ON/OFF
51456+ * for frames > 1514 bytes
51457+ * - enable Rx of own packets SK_SELF_RX_ON/OFF
51458 *
51459 * for incoming packets may be enabled/disabled by this function.
51460 * Additional modes may be added later.
51461@@ -584,20 +633,17 @@
51462 * nothing
51463 */
51464 static void SkGmSetRxCmd(
51465-SK_AC *pAC, /* adapter context */
51466-SK_IOC IoC, /* IO context */
51467+SK_AC *pAC, /* Adapter Context */
51468+SK_IOC IoC, /* I/O Context */
51469 int Port, /* Port Index (MAC_1 + n) */
51470 int Mode) /* Mode is SK_STRIP_FCS_ON/OFF, SK_STRIP_PAD_ON/OFF,
51471- SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */
51472+ SK_LENERR_OK_ON/OFF, or SK_BIG_PK_OK_ON/OFF */
51473 {
51474- SK_U16 OldRxCmd;
51475 SK_U16 RxCmd;
51476
51477 if ((Mode & (SK_STRIP_FCS_ON | SK_STRIP_FCS_OFF)) != 0) {
51478-
51479- GM_IN16(IoC, Port, GM_RX_CTRL, &OldRxCmd);
51480
51481- RxCmd = OldRxCmd;
51482+ GM_IN16(IoC, Port, GM_RX_CTRL, &RxCmd);
51483
51484 if ((Mode & SK_STRIP_FCS_ON) != 0) {
51485 RxCmd |= GM_RXCR_CRC_DIS;
51486@@ -605,17 +651,13 @@
51487 else {
51488 RxCmd &= ~GM_RXCR_CRC_DIS;
51489 }
51490- /* Write the new mode to the Rx control register if required */
51491- if (OldRxCmd != RxCmd) {
51492- GM_OUT16(IoC, Port, GM_RX_CTRL, RxCmd);
51493- }
51494+ /* Write the new mode to the Rx Control register */
51495+ GM_OUT16(IoC, Port, GM_RX_CTRL, RxCmd);
51496 }
51497
51498 if ((Mode & (SK_BIG_PK_OK_ON | SK_BIG_PK_OK_OFF)) != 0) {
51499-
51500- GM_IN16(IoC, Port, GM_SERIAL_MODE, &OldRxCmd);
51501
51502- RxCmd = OldRxCmd;
51503+ GM_IN16(IoC, Port, GM_SERIAL_MODE, &RxCmd);
51504
51505 if ((Mode & SK_BIG_PK_OK_ON) != 0) {
51506 RxCmd |= GM_SMOD_JUMBO_ENA;
51507@@ -623,10 +665,8 @@
51508 else {
51509 RxCmd &= ~GM_SMOD_JUMBO_ENA;
51510 }
51511- /* Write the new mode to the Rx control register if required */
51512- if (OldRxCmd != RxCmd) {
51513- GM_OUT16(IoC, Port, GM_SERIAL_MODE, RxCmd);
51514- }
51515+ /* Write the new mode to the Serial Mode register */
51516+ GM_OUT16(IoC, Port, GM_SERIAL_MODE, RxCmd);
51517 }
51518 } /* SkGmSetRxCmd */
51519
51520@@ -641,17 +681,17 @@
51521 * nothing
51522 */
51523 void SkMacSetRxCmd(
51524-SK_AC *pAC, /* adapter context */
51525-SK_IOC IoC, /* IO context */
51526+SK_AC *pAC, /* Adapter Context */
51527+SK_IOC IoC, /* I/O Context */
51528 int Port, /* Port Index (MAC_1 + n) */
51529 int Mode) /* Rx Mode */
51530 {
51531 if (pAC->GIni.GIGenesis) {
51532-
51533+
51534 SkXmSetRxCmd(pAC, IoC, Port, Mode);
51535 }
51536 else {
51537-
51538+
51539 SkGmSetRxCmd(pAC, IoC, Port, Mode);
51540 }
51541
51542@@ -668,15 +708,15 @@
51543 * nothing
51544 */
51545 void SkMacCrcGener(
51546-SK_AC *pAC, /* adapter context */
51547-SK_IOC IoC, /* IO context */
51548+SK_AC *pAC, /* Adapter Context */
51549+SK_IOC IoC, /* I/O Context */
51550 int Port, /* Port Index (MAC_1 + n) */
51551 SK_BOOL Enable) /* Enable / Disable */
51552 {
51553 SK_U16 Word;
51554
51555 if (pAC->GIni.GIGenesis) {
51556-
51557+
51558 XM_IN16(IoC, Port, XM_TX_CMD, &Word);
51559
51560 if (Enable) {
51561@@ -689,9 +729,9 @@
51562 XM_OUT16(IoC, Port, XM_TX_CMD, Word);
51563 }
51564 else {
51565-
51566+
51567 GM_IN16(IoC, Port, GM_TX_CTRL, &Word);
51568-
51569+
51570 if (Enable) {
51571 Word &= ~GM_TXCR_CRC_DIS;
51572 }
51573@@ -721,14 +761,14 @@
51574 * nothing
51575 */
51576 void SkXmClrExactAddr(
51577-SK_AC *pAC, /* adapter context */
51578-SK_IOC IoC, /* IO context */
51579+SK_AC *pAC, /* Adapter Context */
51580+SK_IOC IoC, /* I/O Context */
51581 int Port, /* Port Index (MAC_1 + n) */
51582 int StartNum, /* Begin with this Address Register Index (0..15) */
51583 int StopNum) /* Stop after finished with this Register Idx (0..15) */
51584 {
51585 int i;
51586- SK_U16 ZeroAddr[3] = {0x0000, 0x0000, 0x0000};
51587+ SK_U16 ZeroAddr[3] = {0, 0, 0};
51588
51589 if ((unsigned)StartNum > 15 || (unsigned)StopNum > 15 ||
51590 StartNum > StopNum) {
51591@@ -738,7 +778,7 @@
51592 }
51593
51594 for (i = StartNum; i <= StopNum; i++) {
51595- XM_OUTADDR(IoC, Port, XM_EXM(i), &ZeroAddr[0]);
51596+ XM_OUTADDR(IoC, Port, XM_EXM(i), ZeroAddr);
51597 }
51598 } /* SkXmClrExactAddr */
51599 #endif /* GENESIS */
51600@@ -755,21 +795,21 @@
51601 * nothing
51602 */
51603 void SkMacFlushTxFifo(
51604-SK_AC *pAC, /* adapter context */
51605-SK_IOC IoC, /* IO context */
51606+SK_AC *pAC, /* Adapter Context */
51607+SK_IOC IoC, /* I/O Context */
51608 int Port) /* Port Index (MAC_1 + n) */
51609 {
51610 #ifdef GENESIS
51611 SK_U32 MdReg;
51612
51613 if (pAC->GIni.GIGenesis) {
51614-
51615+
51616 XM_IN32(IoC, Port, XM_MODE, &MdReg);
51617
51618 XM_OUT32(IoC, Port, XM_MODE, MdReg | XM_MD_FTF);
51619 }
51620 #endif /* GENESIS */
51621-
51622+
51623 #ifdef YUKON
51624 if (pAC->GIni.GIYukon) {
51625 /* no way to flush the FIFO we have to issue a reset */
51626@@ -791,8 +831,8 @@
51627 * nothing
51628 */
51629 void SkMacFlushRxFifo(
51630-SK_AC *pAC, /* adapter context */
51631-SK_IOC IoC, /* IO context */
51632+SK_AC *pAC, /* Adapter Context */
51633+SK_IOC IoC, /* I/O Context */
51634 int Port) /* Port Index (MAC_1 + n) */
51635 {
51636 #ifdef GENESIS
51637@@ -805,7 +845,7 @@
51638 XM_OUT32(IoC, Port, XM_MODE, MdReg | XM_MD_FRF);
51639 }
51640 #endif /* GENESIS */
51641-
51642+
51643 #ifdef YUKON
51644 if (pAC->GIni.GIYukon) {
51645 /* no way to flush the FIFO we have to issue a reset */
51646@@ -853,23 +893,23 @@
51647 * nothing
51648 */
51649 static void SkXmSoftRst(
51650-SK_AC *pAC, /* adapter context */
51651-SK_IOC IoC, /* IO context */
51652+SK_AC *pAC, /* Adapter Context */
51653+SK_IOC IoC, /* I/O Context */
51654 int Port) /* Port Index (MAC_1 + n) */
51655 {
51656- SK_U16 ZeroAddr[4] = {0x0000, 0x0000, 0x0000, 0x0000};
51657-
51658+ SK_U16 ZeroAddr[4] = {0, 0, 0, 0};
51659+
51660 /* reset the statistics module */
51661 XM_OUT32(IoC, Port, XM_GP_PORT, XM_GP_RES_STAT);
51662
51663 /* disable all XMAC IRQs */
51664 XM_OUT16(IoC, Port, XM_IMSK, 0xffff);
51665-
51666+
51667 XM_OUT32(IoC, Port, XM_MODE, 0); /* clear Mode Reg */
51668-
51669+
51670 XM_OUT16(IoC, Port, XM_TX_CMD, 0); /* reset TX CMD Reg */
51671 XM_OUT16(IoC, Port, XM_RX_CMD, 0); /* reset RX CMD Reg */
51672-
51673+
51674 /* disable all PHY IRQs */
51675 switch (pAC->GIni.GP[Port].PhyType) {
51676 case SK_PHY_BCOM:
51677@@ -887,13 +927,13 @@
51678 }
51679
51680 /* clear the Hash Register */
51681- XM_OUTHASH(IoC, Port, XM_HSM, &ZeroAddr);
51682+ XM_OUTHASH(IoC, Port, XM_HSM, ZeroAddr);
51683
51684 /* clear the Exact Match Address registers */
51685 SkXmClrExactAddr(pAC, IoC, Port, 0, 15);
51686-
51687+
51688 /* clear the Source Check Address registers */
51689- XM_OUTHASH(IoC, Port, XM_SRC_CHK, &ZeroAddr);
51690+ XM_OUTHASH(IoC, Port, XM_SRC_CHK, ZeroAddr);
51691
51692 } /* SkXmSoftRst */
51693
51694@@ -916,8 +956,8 @@
51695 * nothing
51696 */
51697 static void SkXmHardRst(
51698-SK_AC *pAC, /* adapter context */
51699-SK_IOC IoC, /* IO context */
51700+SK_AC *pAC, /* Adapter Context */
51701+SK_IOC IoC, /* I/O Context */
51702 int Port) /* Port Index (MAC_1 + n) */
51703 {
51704 SK_U32 Reg;
51705@@ -940,19 +980,19 @@
51706 }
51707
51708 SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_SET_MAC_RST);
51709-
51710+
51711 SK_IN16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), &Word);
51712-
51713+
51714 } while ((Word & MFF_SET_MAC_RST) == 0);
51715 }
51716
51717 /* For external PHYs there must be special handling */
51718 if (pAC->GIni.GP[Port].PhyType != SK_PHY_XMAC) {
51719-
51720+
51721 SK_IN32(IoC, B2_GP_IO, &Reg);
51722-
51723+
51724 if (Port == 0) {
51725- Reg |= GP_DIR_0; /* set to output */
51726+ Reg |= GP_DIR_0; /* set to output */
51727 Reg &= ~GP_IO_0; /* set PHY reset (active low) */
51728 }
51729 else {
51730@@ -978,12 +1018,12 @@
51731 * nothing
51732 */
51733 static void SkXmClearRst(
51734-SK_AC *pAC, /* adapter context */
51735-SK_IOC IoC, /* IO context */
51736+SK_AC *pAC, /* Adapter Context */
51737+SK_IOC IoC, /* I/O Context */
51738 int Port) /* Port Index (MAC_1 + n) */
51739 {
51740 SK_U32 DWord;
51741-
51742+
51743 /* clear HW reset */
51744 SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_CLR_MAC_RST);
51745
51746@@ -1000,7 +1040,7 @@
51747 /* Clear PHY reset */
51748 SK_OUT32(IoC, B2_GP_IO, DWord);
51749
51750- /* Enable GMII interface */
51751+ /* enable GMII interface */
51752 XM_OUT16(IoC, Port, XM_HW_CFG, XM_HW_GMII_MD);
51753 }
51754 } /* SkXmClearRst */
51755@@ -1020,29 +1060,28 @@
51756 * nothing
51757 */
51758 static void SkGmSoftRst(
51759-SK_AC *pAC, /* adapter context */
51760-SK_IOC IoC, /* IO context */
51761+SK_AC *pAC, /* Adapter Context */
51762+SK_IOC IoC, /* I/O Context */
51763 int Port) /* Port Index (MAC_1 + n) */
51764 {
51765- SK_U16 EmptyHash[4] = {0x0000, 0x0000, 0x0000, 0x0000};
51766- SK_U16 RxCtrl;
51767+ SK_U16 EmptyHash[4] = { 0x0000, 0x0000, 0x0000, 0x0000 };
51768+ SK_U16 RxCtrl;
51769
51770 /* reset the statistics module */
51771
51772 /* disable all GMAC IRQs */
51773- SK_OUT8(IoC, GMAC_IRQ_MSK, 0);
51774-
51775+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_IRQ_MSK), 0);
51776+
51777 /* disable all PHY IRQs */
51778 SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, 0);
51779-
51780+
51781 /* clear the Hash Register */
51782 GM_OUTHASH(IoC, Port, GM_MC_ADDR_H1, EmptyHash);
51783
51784- /* Enable Unicast and Multicast filtering */
51785+ /* enable Unicast and Multicast filtering */
51786 GM_IN16(IoC, Port, GM_RX_CTRL, &RxCtrl);
51787-
51788- GM_OUT16(IoC, Port, GM_RX_CTRL,
51789- (SK_U16)(RxCtrl | GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA));
51790+
51791+ GM_OUT16(IoC, Port, GM_RX_CTRL, RxCtrl | GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
51792
51793 } /* SkGmSoftRst */
51794
51795@@ -1057,16 +1096,16 @@
51796 * nothing
51797 */
51798 static void SkGmHardRst(
51799-SK_AC *pAC, /* adapter context */
51800-SK_IOC IoC, /* IO context */
51801+SK_AC *pAC, /* Adapter Context */
51802+SK_IOC IoC, /* I/O Context */
51803 int Port) /* Port Index (MAC_1 + n) */
51804 {
51805 SK_U32 DWord;
51806-
51807+
51808 /* WA code for COMA mode */
51809 if (pAC->GIni.GIYukonLite &&
51810 pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
51811-
51812+
51813 SK_IN32(IoC, B2_GP_IO, &DWord);
51814
51815 DWord |= (GP_DIR_9 | GP_IO_9);
51816@@ -1076,10 +1115,10 @@
51817 }
51818
51819 /* set GPHY Control reset */
51820- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), GPC_RST_SET);
51821+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_SET);
51822
51823 /* set GMAC Control reset */
51824- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET);
51825+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_SET);
51826
51827 } /* SkGmHardRst */
51828
51829@@ -1094,24 +1133,29 @@
51830 * nothing
51831 */
51832 static void SkGmClearRst(
51833-SK_AC *pAC, /* adapter context */
51834-SK_IOC IoC, /* IO context */
51835+SK_AC *pAC, /* Adapter Context */
51836+SK_IOC IoC, /* I/O Context */
51837 int Port) /* Port Index (MAC_1 + n) */
51838 {
51839 SK_U32 DWord;
51840-
51841+#ifndef SK_SLIM
51842+ SK_U16 PhyId0;
51843+ SK_U16 PhyId1;
51844+ SK_U16 Word;
51845+#endif
51846+
51847 #ifdef XXX
51848- /* clear GMAC Control reset */
51849- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_CLR);
51850+ /* clear GMAC Control reset */
51851+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR);
51852
51853- /* set GMAC Control reset */
51854- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET);
51855+ /* set GMAC Control reset */
51856+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_SET);
51857 #endif /* XXX */
51858
51859 /* WA code for COMA mode */
51860 if (pAC->GIni.GIYukonLite &&
51861 pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
51862-
51863+
51864 SK_IN32(IoC, B2_GP_IO, &DWord);
51865
51866 DWord |= GP_DIR_9; /* set to output */
51867@@ -1121,30 +1165,87 @@
51868 SK_OUT32(IoC, B2_GP_IO, DWord);
51869 }
51870
51871- /* set HWCFG_MODE */
51872- DWord = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP |
51873- GPC_ENA_XC | GPC_ANEG_ADV_ALL_M | GPC_ENA_PAUSE |
51874- (pAC->GIni.GICopperType ? GPC_HWCFG_GMII_COP :
51875- GPC_HWCFG_GMII_FIB);
51876+#ifdef VCPU
51877+ /* set MAC Reset before PHY reset is set */
51878+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_SET);
51879+#endif /* VCPU */
51880+
51881+ if (CHIP_ID_YUKON_2(pAC)) {
51882+ /* set GPHY Control reset */
51883+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_SET);
51884
51885- /* set GPHY Control reset */
51886- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_SET);
51887+ /* release GPHY Control reset */
51888+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_CLR);
51889
51890- /* release GPHY Control reset */
51891- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_CLR);
51892+#ifdef DEBUG
51893+ /* additional check for PEX */
51894+ SK_IN16(IoC, GPHY_CTRL, &Word);
51895+
51896+ if (pAC->GIni.GIPciBus == SK_PEX_BUS && Word != GPC_RST_CLR) {
51897+
51898+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
51899+ ("Error on PEX-bus after GPHY reset\n"));
51900+ }
51901+#endif /* DEBUG */
51902+ }
51903+ else {
51904+ /* set HWCFG_MODE */
51905+ DWord = GPC_INT_POL | GPC_DIS_FC | GPC_DIS_SLEEP |
51906+ GPC_ENA_XC | GPC_ANEG_ADV_ALL_M | GPC_ENA_PAUSE |
51907+ (pAC->GIni.GICopperType ? GPC_HWCFG_GMII_COP :
51908+ GPC_HWCFG_GMII_FIB);
51909+
51910+ /* set GPHY Control reset */
51911+ SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_SET);
51912+
51913+ /* release GPHY Control reset */
51914+ SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_CLR);
51915+ }
51916
51917 #ifdef VCPU
51918+ /* wait for internal initialization of GPHY */
51919+ VCPUprintf(0, "Waiting until PHY %d is ready to initialize\n", Port);
51920+ VCpuWait(10000);
51921+
51922+ /* release GMAC reset */
51923+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR);
51924+
51925+ /* wait for stable GMAC clock */
51926 VCpuWait(9000);
51927 #endif /* VCPU */
51928
51929 /* clear GMAC Control reset */
51930- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_ON | GMC_RST_CLR);
51931+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR);
51932+
51933+#ifdef SK_DIAG
51934+ if (HW_FEATURE(pAC, HWF_WA_DEV_472) && Port == MAC_2) {
51935+
51936+ /* clear GMAC 1 Control reset */
51937+ SK_OUT8(IoC, MR_ADDR(MAC_1, GMAC_CTRL), (SK_U8)GMC_RST_CLR);
51938+
51939+ do {
51940+ /* set GMAC 2 Control reset */
51941+ SK_OUT8(IoC, MR_ADDR(MAC_2, GMAC_CTRL), (SK_U8)GMC_RST_SET);
51942+
51943+ /* clear GMAC 2 Control reset */
51944+ SK_OUT8(IoC, MR_ADDR(MAC_2, GMAC_CTRL), (SK_U8)GMC_RST_CLR);
51945+
51946+ SkGmPhyRead(pAC, IoC, MAC_2, PHY_MARV_ID0, &PhyId0);
51947+
51948+ SkGmPhyRead(pAC, IoC, MAC_2, PHY_MARV_ID1, &PhyId1);
51949+
51950+ SkGmPhyRead(pAC, IoC, MAC_2, PHY_MARV_INT_MASK, &Word);
51951+
51952+ } while (Word != 0 || PhyId0 != PHY_MARV_ID0_VAL ||
51953+ PhyId1 != PHY_MARV_ID1_Y2);
51954+ }
51955+#endif /* SK_DIAG */
51956
51957 #ifdef VCPU
51958 VCpuWait(2000);
51959-
51960+
51961 SK_IN32(IoC, MR_ADDR(Port, GPHY_CTRL), &DWord);
51962-
51963+
51964 SK_IN32(IoC, B0_ISRC, &DWord);
51965 #endif /* VCPU */
51966
51967@@ -1162,37 +1263,33 @@
51968 * nothing
51969 */
51970 void SkMacSoftRst(
51971-SK_AC *pAC, /* adapter context */
51972-SK_IOC IoC, /* IO context */
51973+SK_AC *pAC, /* Adapter Context */
51974+SK_IOC IoC, /* I/O Context */
51975 int Port) /* Port Index (MAC_1 + n) */
51976 {
51977- SK_GEPORT *pPrt;
51978-
51979- pPrt = &pAC->GIni.GP[Port];
51980-
51981 /* disable receiver and transmitter */
51982 SkMacRxTxDisable(pAC, IoC, Port);
51983
51984 #ifdef GENESIS
51985 if (pAC->GIni.GIGenesis) {
51986-
51987+
51988 SkXmSoftRst(pAC, IoC, Port);
51989 }
51990 #endif /* GENESIS */
51991-
51992+
51993 #ifdef YUKON
51994 if (pAC->GIni.GIYukon) {
51995-
51996+
51997 SkGmSoftRst(pAC, IoC, Port);
51998 }
51999 #endif /* YUKON */
52000
52001 /* flush the MAC's Rx and Tx FIFOs */
52002 SkMacFlushTxFifo(pAC, IoC, Port);
52003-
52004+
52005 SkMacFlushRxFifo(pAC, IoC, Port);
52006
52007- pPrt->PState = SK_PRT_STOP;
52008+ pAC->GIni.GP[Port].PState = SK_PRT_STOP;
52009
52010 } /* SkMacSoftRst */
52011
52012@@ -1207,30 +1304,32 @@
52013 * nothing
52014 */
52015 void SkMacHardRst(
52016-SK_AC *pAC, /* adapter context */
52017-SK_IOC IoC, /* IO context */
52018+SK_AC *pAC, /* Adapter Context */
52019+SK_IOC IoC, /* I/O Context */
52020 int Port) /* Port Index (MAC_1 + n) */
52021 {
52022-
52023+
52024 #ifdef GENESIS
52025 if (pAC->GIni.GIGenesis) {
52026-
52027+
52028 SkXmHardRst(pAC, IoC, Port);
52029 }
52030 #endif /* GENESIS */
52031-
52032+
52033 #ifdef YUKON
52034 if (pAC->GIni.GIYukon) {
52035-
52036+
52037 SkGmHardRst(pAC, IoC, Port);
52038 }
52039 #endif /* YUKON */
52040
52041+ pAC->GIni.GP[Port].PHWLinkUp = SK_FALSE;
52042+
52043 pAC->GIni.GP[Port].PState = SK_PRT_RESET;
52044
52045 } /* SkMacHardRst */
52046
52047-
52048+#ifndef SK_SLIM
52049 /******************************************************************************
52050 *
52051 * SkMacClearRst() - Clear the MAC reset
52052@@ -1241,27 +1340,27 @@
52053 * nothing
52054 */
52055 void SkMacClearRst(
52056-SK_AC *pAC, /* adapter context */
52057-SK_IOC IoC, /* IO context */
52058+SK_AC *pAC, /* Adapter Context */
52059+SK_IOC IoC, /* I/O Context */
52060 int Port) /* Port Index (MAC_1 + n) */
52061 {
52062-
52063+
52064 #ifdef GENESIS
52065 if (pAC->GIni.GIGenesis) {
52066-
52067+
52068 SkXmClearRst(pAC, IoC, Port);
52069 }
52070 #endif /* GENESIS */
52071-
52072+
52073 #ifdef YUKON
52074 if (pAC->GIni.GIYukon) {
52075-
52076+
52077 SkGmClearRst(pAC, IoC, Port);
52078 }
52079 #endif /* YUKON */
52080
52081 } /* SkMacClearRst */
52082-
52083+#endif /* !SK_SLIM */
52084
52085 #ifdef GENESIS
52086 /******************************************************************************
52087@@ -1279,8 +1378,8 @@
52088 * nothing
52089 */
52090 void SkXmInitMac(
52091-SK_AC *pAC, /* adapter context */
52092-SK_IOC IoC, /* IO context */
52093+SK_AC *pAC, /* Adapter Context */
52094+SK_IOC IoC, /* I/O Context */
52095 int Port) /* Port Index (MAC_1 + n) */
52096 {
52097 SK_GEPORT *pPrt;
52098@@ -1290,13 +1389,13 @@
52099 pPrt = &pAC->GIni.GP[Port];
52100
52101 if (pPrt->PState == SK_PRT_STOP) {
52102- /* Port State: SK_PRT_STOP */
52103 /* Verify that the reset bit is cleared */
52104 SK_IN16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), &SWord);
52105
52106 if ((SWord & MFF_SET_MAC_RST) != 0) {
52107 /* PState does not match HW state */
52108- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E006, SKERR_HWI_E006MSG);
52109+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
52110+ ("SkXmInitMac: PState does not match HW state"));
52111 /* Correct it */
52112 pPrt->PState = SK_PRT_RESET;
52113 }
52114@@ -1315,7 +1414,7 @@
52115 * Must be done AFTER first access to BCOM chip.
52116 */
52117 XM_IN16(IoC, Port, XM_MMU_CMD, &SWord);
52118-
52119+
52120 XM_OUT16(IoC, Port, XM_MMU_CMD, SWord | XM_MMU_NO_PRE);
52121
52122 if (pPrt->PhyId1 == PHY_BCOM_ID1_C0) {
52123@@ -1348,7 +1447,7 @@
52124 * Disable Power Management after reset.
52125 */
52126 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &SWord);
52127-
52128+
52129 SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUX_CTRL,
52130 (SK_U16)(SWord | PHY_B_AC_DIS_PM));
52131
52132@@ -1357,7 +1456,7 @@
52133
52134 /* Dummy read the Interrupt source register */
52135 XM_IN16(IoC, Port, XM_ISRC, &SWord);
52136-
52137+
52138 /*
52139 * The auto-negotiation process starts immediately after
52140 * clearing the reset. The auto-negotiation process should be
52141@@ -1383,7 +1482,7 @@
52142 * independent. Remember this when changing.
52143 */
52144 SK_IN16(IoC, (B2_MAC_2 + Port * 8 + i * 2), &SWord);
52145-
52146+
52147 XM_OUT16(IoC, Port, (XM_SA + i * 2), SWord);
52148 }
52149
52150@@ -1401,7 +1500,7 @@
52151 SWord = SK_XM_THR_SL; /* for single port */
52152
52153 if (pAC->GIni.GIMacsFound > 1) {
52154- switch (pAC->GIni.GIPortUsage) {
52155+ switch (pPrt->PPortUsage) {
52156 case SK_RED_LINK:
52157 SWord = SK_XM_THR_REDL; /* redundant link */
52158 break;
52159@@ -1424,7 +1523,7 @@
52160 /* setup register defaults for the Rx Command Register */
52161 SWord = XM_RX_STRIP_FCS | XM_RX_LENERR_OK;
52162
52163- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
52164+ if (pPrt->PPortUsage == SK_JUMBO_LINK) {
52165 SWord |= XM_RX_BIG_PK_OK;
52166 }
52167
52168@@ -1436,7 +1535,7 @@
52169 */
52170 SWord |= XM_RX_DIS_CEXT;
52171 }
52172-
52173+
52174 XM_OUT16(IoC, Port, XM_RX_CMD, SWord);
52175
52176 /*
52177@@ -1493,8 +1592,8 @@
52178 * nothing
52179 */
52180 void SkGmInitMac(
52181-SK_AC *pAC, /* adapter context */
52182-SK_IOC IoC, /* IO context */
52183+SK_AC *pAC, /* Adapter Context */
52184+SK_IOC IoC, /* I/O Context */
52185 int Port) /* Port Index (MAC_1 + n) */
52186 {
52187 SK_GEPORT *pPrt;
52188@@ -1505,24 +1604,29 @@
52189 pPrt = &pAC->GIni.GP[Port];
52190
52191 if (pPrt->PState == SK_PRT_STOP) {
52192- /* Port State: SK_PRT_STOP */
52193 /* Verify that the reset bit is cleared */
52194 SK_IN32(IoC, MR_ADDR(Port, GMAC_CTRL), &DWord);
52195-
52196+
52197 if ((DWord & GMC_RST_SET) != 0) {
52198 /* PState does not match HW state */
52199- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E006, SKERR_HWI_E006MSG);
52200+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52201+ ("SkGmInitMac: PState does not match HW state"));
52202 /* Correct it */
52203 pPrt->PState = SK_PRT_RESET;
52204 }
52205+ else {
52206+ /* enable PHY interrupts */
52207+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK,
52208+ (SK_U16)PHY_M_DEF_MSK);
52209+ }
52210 }
52211
52212 if (pPrt->PState == SK_PRT_RESET) {
52213-
52214+
52215 SkGmHardRst(pAC, IoC, Port);
52216
52217 SkGmClearRst(pAC, IoC, Port);
52218-
52219+
52220 /* Auto-negotiation ? */
52221 if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {
52222 /* Auto-negotiation disabled */
52223@@ -1532,10 +1636,10 @@
52224
52225 /* disable auto-update for speed, duplex and flow-control */
52226 SWord |= GM_GPCR_AU_ALL_DIS;
52227-
52228+
52229 /* setup General Purpose Control Register */
52230 GM_OUT16(IoC, Port, GM_GP_CTRL, SWord);
52231-
52232+
52233 SWord = GM_GPCR_AU_ALL_DIS;
52234 }
52235 else {
52236@@ -1546,7 +1650,10 @@
52237 switch (pPrt->PLinkSpeed) {
52238 case SK_LSPEED_AUTO:
52239 case SK_LSPEED_1000MBPS:
52240- SWord |= GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100;
52241+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) {
52242+
52243+ SWord |= GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100;
52244+ }
52245 break;
52246 case SK_LSPEED_100MBPS:
52247 SWord |= GM_GPCR_SPEED_100;
52248@@ -1564,8 +1671,6 @@
52249 /* flow-control settings */
52250 switch (pPrt->PFlowCtrlMode) {
52251 case SK_FLOW_MODE_NONE:
52252- /* set Pause Off */
52253- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_OFF);
52254 /* disable Tx & Rx flow-control */
52255 SWord |= GM_GPCR_FC_TX_DIS | GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS;
52256 break;
52257@@ -1583,24 +1688,22 @@
52258 GM_OUT16(IoC, Port, GM_GP_CTRL, SWord);
52259
52260 /* dummy read the Interrupt Source Register */
52261- SK_IN16(IoC, GMAC_IRQ_SRC, &SWord);
52262-
52263+ SK_IN16(IoC, MR_ADDR(Port, GMAC_IRQ_SRC), &SWord);
52264+
52265 #ifndef VCPU
52266- /* read Id from PHY */
52267- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_ID1, &pPrt->PhyId1);
52268-
52269 SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE);
52270-#endif /* VCPU */
52271+#endif /* !VCPU */
52272 }
52273
52274 (void)SkGmResetCounter(pAC, IoC, Port);
52275
52276 /* setup Transmit Control Register */
52277- GM_OUT16(IoC, Port, GM_TX_CTRL, TX_COL_THR(pPrt->PMacColThres));
52278+ GM_OUT16(IoC, Port, GM_TX_CTRL, (SK_U16)TX_COL_THR(pPrt->PMacColThres));
52279
52280 /* setup Receive Control Register */
52281- GM_OUT16(IoC, Port, GM_RX_CTRL, GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA |
52282- GM_RXCR_CRC_DIS);
52283+ SWord = GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA | GM_RXCR_CRC_DIS;
52284+
52285+ GM_OUT16(IoC, Port, GM_RX_CTRL, SWord);
52286
52287 /* setup Transmit Flow Control Register */
52288 GM_OUT16(IoC, Port, GM_TX_FLOW_CTRL, 0xffff);
52289@@ -1610,31 +1713,29 @@
52290 GM_IN16(IoC, Port, GM_TX_PARAM, &SWord);
52291 #endif /* VCPU */
52292
52293- SWord = TX_JAM_LEN_VAL(pPrt->PMacJamLen) |
52294- TX_JAM_IPG_VAL(pPrt->PMacJamIpgVal) |
52295- TX_IPG_JAM_DATA(pPrt->PMacJamIpgData);
52296-
52297+ SWord = (SK_U16)(TX_JAM_LEN_VAL(pPrt->PMacJamLen) |
52298+ TX_JAM_IPG_VAL(pPrt->PMacJamIpgVal) |
52299+ TX_IPG_JAM_DATA(pPrt->PMacJamIpgData) |
52300+ TX_BACK_OFF_LIM(pPrt->PMacBackOffLim));
52301+
52302 GM_OUT16(IoC, Port, GM_TX_PARAM, SWord);
52303
52304 /* configure the Serial Mode Register */
52305-#ifdef VCPU
52306- GM_IN16(IoC, Port, GM_SERIAL_MODE, &SWord);
52307-#endif /* VCPU */
52308-
52309- SWord = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(pPrt->PMacIpgData);
52310+ SWord = (SK_U16)(DATA_BLIND_VAL(pPrt->PMacDataBlind) |
52311+ GM_SMOD_VLAN_ENA | IPG_DATA_VAL(pPrt->PMacIpgData));
52312
52313 if (pPrt->PMacLimit4) {
52314 /* reset of collision counter after 4 consecutive collisions */
52315 SWord |= GM_SMOD_LIMIT_4;
52316 }
52317
52318- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
52319+ if (pPrt->PPortUsage == SK_JUMBO_LINK) {
52320 /* enable jumbo mode (Max. Frame Length = 9018) */
52321 SWord |= GM_SMOD_JUMBO_ENA;
52322 }
52323-
52324+
52325 GM_OUT16(IoC, Port, GM_SERIAL_MODE, SWord);
52326-
52327+
52328 /*
52329 * configure the GMACs Station Addresses
52330 * in PROM you can find our addresses at:
52331@@ -1663,17 +1764,17 @@
52332 else {
52333 GM_OUT16(IoC, Port, (GM_SRC_ADDR_1L + i * 4), SWord);
52334 }
52335-#else
52336+#else
52337 GM_OUT16(IoC, Port, (GM_SRC_ADDR_1L + i * 4), SWord);
52338 #endif /* WA_DEV_16 */
52339-
52340+
52341 /* virtual address: will be used for data */
52342 SK_IN16(IoC, (B2_MAC_1 + Port * 8 + i * 2), &SWord);
52343
52344 GM_OUT16(IoC, Port, (GM_SRC_ADDR_2L + i * 4), SWord);
52345-
52346+
52347 /* reset Multicast filtering Hash registers 1-3 */
52348- GM_OUT16(IoC, Port, GM_MC_ADDR_H1 + 4*i, 0);
52349+ GM_OUT16(IoC, Port, GM_MC_ADDR_H1 + i * 4, 0);
52350 }
52351
52352 /* reset Multicast filtering Hash register 4 */
52353@@ -1684,18 +1785,6 @@
52354 GM_OUT16(IoC, Port, GM_RX_IRQ_MSK, 0);
52355 GM_OUT16(IoC, Port, GM_TR_IRQ_MSK, 0);
52356
52357-#if defined(SK_DIAG) || defined(DEBUG)
52358- /* read General Purpose Status */
52359- GM_IN16(IoC, Port, GM_GP_STAT, &SWord);
52360-
52361- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52362- ("MAC Stat Reg.=0x%04X\n", SWord));
52363-#endif /* SK_DIAG || DEBUG */
52364-
52365-#ifdef SK_DIAG
52366- c_print("MAC Stat Reg=0x%04X\n", SWord);
52367-#endif /* SK_DIAG */
52368-
52369 } /* SkGmInitMac */
52370 #endif /* YUKON */
52371
52372@@ -1714,8 +1803,8 @@
52373 * nothing
52374 */
52375 void SkXmInitDupMd(
52376-SK_AC *pAC, /* adapter context */
52377-SK_IOC IoC, /* IO context */
52378+SK_AC *pAC, /* Adapter Context */
52379+SK_IOC IoC, /* I/O Context */
52380 int Port) /* Port Index (MAC_1 + n) */
52381 {
52382 switch (pAC->GIni.GP[Port].PLinkModeStatus) {
52383@@ -1762,8 +1851,8 @@
52384 * nothing
52385 */
52386 void SkXmInitPauseMd(
52387-SK_AC *pAC, /* adapter context */
52388-SK_IOC IoC, /* IO context */
52389+SK_AC *pAC, /* Adapter Context */
52390+SK_IOC IoC, /* I/O Context */
52391 int Port) /* Port Index (MAC_1 + n) */
52392 {
52393 SK_GEPORT *pPrt;
52394@@ -1773,11 +1862,11 @@
52395 pPrt = &pAC->GIni.GP[Port];
52396
52397 XM_IN16(IoC, Port, XM_MMU_CMD, &Word);
52398-
52399+
52400 if (pPrt->PFlowCtrlStatus == SK_FLOW_STAT_NONE ||
52401 pPrt->PFlowCtrlStatus == SK_FLOW_STAT_LOC_SEND) {
52402
52403- /* Disable Pause Frame Reception */
52404+ /* disable Pause Frame Reception */
52405 Word |= XM_MMU_IGN_PF;
52406 }
52407 else {
52408@@ -1785,10 +1874,10 @@
52409 * enabling pause frame reception is required for 1000BT
52410 * because the XMAC is not reset if the link is going down
52411 */
52412- /* Enable Pause Frame Reception */
52413+ /* enable Pause Frame Reception */
52414 Word &= ~XM_MMU_IGN_PF;
52415- }
52416-
52417+ }
52418+
52419 XM_OUT16(IoC, Port, XM_MMU_CMD, Word);
52420
52421 XM_IN32(IoC, Port, XM_MODE, &DWord);
52422@@ -1811,10 +1900,10 @@
52423 /* remember this value is defined in big endian (!) */
52424 XM_OUT16(IoC, Port, XM_MAC_PTIME, 0xffff);
52425
52426- /* Set Pause Mode in Mode Register */
52427+ /* set Pause Mode in Mode Register */
52428 DWord |= XM_PAUSE_MODE;
52429
52430- /* Set Pause Mode in MAC Rx FIFO */
52431+ /* set Pause Mode in MAC Rx FIFO */
52432 SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_ENA_PAUSE);
52433 }
52434 else {
52435@@ -1822,13 +1911,13 @@
52436 * disable pause frame generation is required for 1000BT
52437 * because the XMAC is not reset if the link is going down
52438 */
52439- /* Disable Pause Mode in Mode Register */
52440+ /* disable Pause Mode in Mode Register */
52441 DWord &= ~XM_PAUSE_MODE;
52442
52443- /* Disable Pause Mode in MAC Rx FIFO */
52444+ /* disable Pause Mode in MAC Rx FIFO */
52445 SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_DIS_PAUSE);
52446 }
52447-
52448+
52449 XM_OUT32(IoC, Port, XM_MODE, DWord);
52450 } /* SkXmInitPauseMd*/
52451
52452@@ -1845,8 +1934,8 @@
52453 * nothing
52454 */
52455 static void SkXmInitPhyXmac(
52456-SK_AC *pAC, /* adapter context */
52457-SK_IOC IoC, /* IO context */
52458+SK_AC *pAC, /* Adapter Context */
52459+SK_IOC IoC, /* I/O Context */
52460 int Port, /* Port Index (MAC_1 + n) */
52461 SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */
52462 {
52463@@ -1855,12 +1944,12 @@
52464
52465 pPrt = &pAC->GIni.GP[Port];
52466 Ctrl = 0;
52467-
52468+
52469 /* Auto-negotiation ? */
52470 if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {
52471 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52472 ("InitPhyXmac: no auto-negotiation Port %d\n", Port));
52473- /* Set DuplexMode in Config register */
52474+ /* set DuplexMode in Config register */
52475 if (pPrt->PLinkMode == SK_LMODE_FULL) {
52476 Ctrl |= PHY_CT_DUP_MD;
52477 }
52478@@ -1873,9 +1962,9 @@
52479 else {
52480 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52481 ("InitPhyXmac: with auto-negotiation Port %d\n", Port));
52482- /* Set Auto-negotiation advertisement */
52483+ /* set Auto-negotiation advertisement */
52484
52485- /* Set Full/half duplex capabilities */
52486+ /* set Full/half duplex capabilities */
52487 switch (pPrt->PLinkMode) {
52488 case SK_LMODE_AUTOHALF:
52489 Ctrl |= PHY_X_AN_HD;
52490@@ -1891,7 +1980,7 @@
52491 SKERR_HWI_E015MSG);
52492 }
52493
52494- /* Set Flow-control capabilities */
52495+ /* set Flow-control capabilities */
52496 switch (pPrt->PFlowCtrlMode) {
52497 case SK_FLOW_MODE_NONE:
52498 Ctrl |= PHY_X_P_NO_PAUSE;
52499@@ -1918,7 +2007,7 @@
52500 }
52501
52502 if (DoLoop) {
52503- /* Set the Phy Loopback bit, too */
52504+ /* set the Phy Loopback bit, too */
52505 Ctrl |= PHY_CT_LOOP;
52506 }
52507
52508@@ -1939,8 +2028,8 @@
52509 * nothing
52510 */
52511 static void SkXmInitPhyBcom(
52512-SK_AC *pAC, /* adapter context */
52513-SK_IOC IoC, /* IO context */
52514+SK_AC *pAC, /* Adapter Context */
52515+SK_IOC IoC, /* I/O Context */
52516 int Port, /* Port Index (MAC_1 + n) */
52517 SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */
52518 {
52519@@ -1962,7 +2051,7 @@
52520 /* manually Master/Slave ? */
52521 if (pPrt->PMSMode != SK_MS_MODE_AUTO) {
52522 Ctrl2 |= PHY_B_1000C_MSE;
52523-
52524+
52525 if (pPrt->PMSMode == SK_MS_MODE_MASTER) {
52526 Ctrl2 |= PHY_B_1000C_MSC;
52527 }
52528@@ -1971,7 +2060,7 @@
52529 if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {
52530 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52531 ("InitPhyBcom: no auto-negotiation Port %d\n", Port));
52532- /* Set DuplexMode in Config register */
52533+ /* set DuplexMode in Config register */
52534 if (pPrt->PLinkMode == SK_LMODE_FULL) {
52535 Ctrl1 |= PHY_CT_DUP_MD;
52536 }
52537@@ -1989,7 +2078,7 @@
52538 else {
52539 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52540 ("InitPhyBcom: with auto-negotiation Port %d\n", Port));
52541- /* Set Auto-negotiation advertisement */
52542+ /* set Auto-negotiation advertisement */
52543
52544 /*
52545 * Workaround BCOM Errata #1 for the C5 type.
52546@@ -1997,8 +2086,8 @@
52547 * Set Repeater/DTE bit 10 of the 1000Base-T Control Register
52548 */
52549 Ctrl2 |= PHY_B_1000C_RD;
52550-
52551- /* Set Full/half duplex capabilities */
52552+
52553+ /* set Full/half duplex capabilities */
52554 switch (pPrt->PLinkMode) {
52555 case SK_LMODE_AUTOHALF:
52556 Ctrl2 |= PHY_B_1000C_AHD;
52557@@ -2014,7 +2103,7 @@
52558 SKERR_HWI_E015MSG);
52559 }
52560
52561- /* Set Flow-control capabilities */
52562+ /* set Flow-control capabilities */
52563 switch (pPrt->PFlowCtrlMode) {
52564 case SK_FLOW_MODE_NONE:
52565 Ctrl3 |= PHY_B_P_NO_PAUSE;
52566@@ -2036,27 +2125,27 @@
52567 /* Restart Auto-negotiation */
52568 Ctrl1 |= PHY_CT_ANE | PHY_CT_RE_CFG;
52569 }
52570-
52571+
52572 /* Initialize LED register here? */
52573 /* No. Please do it in SkDgXmitLed() (if required) and swap
52574- init order of LEDs and XMAC. (MAl) */
52575-
52576+ init order of LEDs and XMAC. (MAl) */
52577+
52578 /* Write 1000Base-T Control Register */
52579 SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, Ctrl2);
52580 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52581- ("Set 1000B-T Ctrl Reg=0x%04X\n", Ctrl2));
52582-
52583+ ("Set 1000B-T Ctrl Reg = 0x%04X\n", Ctrl2));
52584+
52585 /* Write AutoNeg Advertisement Register */
52586 SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, Ctrl3);
52587 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52588- ("Set Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3));
52589-
52590+ ("Set Auto-Neg.Adv.Reg = 0x%04X\n", Ctrl3));
52591+
52592 if (DoLoop) {
52593- /* Set the Phy Loopback bit, too */
52594+ /* set the Phy Loopback bit, too */
52595 Ctrl1 |= PHY_CT_LOOP;
52596 }
52597
52598- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
52599+ if (pPrt->PPortUsage == SK_JUMBO_LINK) {
52600 /* configure FIFO to high latency for transmission of ext. packets */
52601 Ctrl4 |= PHY_B_PEC_HIGH_LA;
52602
52603@@ -2068,45 +2157,41 @@
52604
52605 /* Configure LED Traffic Mode and Jumbo Frame usage if specified */
52606 SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_P_EXT_CTRL, Ctrl4);
52607-
52608+
52609 /* Write to the Phy control register */
52610 SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_CTRL, Ctrl1);
52611 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52612- ("PHY Control Reg=0x%04X\n", Ctrl1));
52613+ ("PHY Control Reg = 0x%04X\n", Ctrl1));
52614 } /* SkXmInitPhyBcom */
52615 #endif /* GENESIS */
52616
52617
52618 #ifdef YUKON
52619-#ifndef SK_SLIM
52620+#ifdef SK_PHY_LP_MODE
52621 /******************************************************************************
52622 *
52623 * SkGmEnterLowPowerMode()
52624 *
52625- * Description:
52626+ * Description:
52627 * This function sets the Marvell Alaska PHY to the low power mode
52628 * given by parameter mode.
52629 * The following low power modes are available:
52630- *
52631- * - Coma Mode (Deep Sleep):
52632- * Power consumption: ~15 - 30 mW
52633+ *
52634+ * - COMA Mode (Deep Sleep):
52635 * The PHY cannot wake up on its own.
52636 *
52637 * - IEEE 22.2.4.1.5 compatible power down mode
52638- * Power consumption: ~240 mW
52639 * The PHY cannot wake up on its own.
52640 *
52641 * - energy detect mode
52642- * Power consumption: ~160 mW
52643 * The PHY can wake up on its own by detecting activity
52644 * on the CAT 5 cable.
52645 *
52646 * - energy detect plus mode
52647- * Power consumption: ~150 mW
52648 * The PHY can wake up on its own by detecting activity
52649 * on the CAT 5 cable.
52650 * Connected devices can be woken up by sending normal link
52651- * pulses every one second.
52652+ * pulses every second.
52653 *
52654 * Note:
52655 *
52656@@ -2115,113 +2200,298 @@
52657 * 1: error
52658 */
52659 int SkGmEnterLowPowerMode(
52660-SK_AC *pAC, /* adapter context */
52661-SK_IOC IoC, /* IO context */
52662+SK_AC *pAC, /* Adapter Context */
52663+SK_IOC IoC, /* I/O Context */
52664 int Port, /* Port Index (e.g. MAC_1) */
52665 SK_U8 Mode) /* low power mode */
52666 {
52667+ SK_U8 LastMode;
52668+ SK_U8 Byte;
52669 SK_U16 Word;
52670+ SK_U16 ClkDiv;
52671 SK_U32 DWord;
52672- SK_U8 LastMode;
52673+ SK_U32 PowerDownBit;
52674+ int ChipId;
52675 int Ret = 0;
52676
52677- if (pAC->GIni.GIYukonLite &&
52678- pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
52679+ if (!(CHIP_ID_YUKON_2(pAC) || (pAC->GIni.GIYukonLite &&
52680+ pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3))) {
52681
52682- /* save current power mode */
52683- LastMode = pAC->GIni.GP[Port].PPhyPowerState;
52684- pAC->GIni.GP[Port].PPhyPowerState = Mode;
52685-
52686- switch (Mode) {
52687- /* coma mode (deep sleep) */
52688- case PHY_PM_DEEP_SLEEP:
52689- /* setup General Purpose Control Register */
52690- GM_OUT16(IoC, 0, GM_GP_CTRL, GM_GPCR_FL_PASS |
52691- GM_GPCR_SPEED_100 | GM_GPCR_AU_ALL_DIS);
52692-
52693- /* apply COMA mode workaround */
52694- SkGmPhyWrite(pAC, IoC, Port, 29, 0x001f);
52695- SkGmPhyWrite(pAC, IoC, Port, 30, 0xfff3);
52696-
52697- SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord);
52698-
52699- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
52700-
52701- /* Set PHY to Coma Mode */
52702- SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord | PCI_PHY_COMA);
52703-
52704- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
52705-
52706- break;
52707-
52708- /* IEEE 22.2.4.1.5 compatible power down mode */
52709- case PHY_PM_IEEE_POWER_DOWN:
52710- /*
52711- * - disable MAC 125 MHz clock
52712- * - allow MAC power down
52713- */
52714- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
52715- Word |= PHY_M_PC_DIS_125CLK;
52716- Word &= ~PHY_M_PC_MAC_POW_UP;
52717- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
52718+ return(1);
52719+ }
52720
52721- /*
52722- * register changes must be followed by a software
52723- * reset to take effect
52724- */
52725- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
52726- Word |= PHY_CT_RESET;
52727- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
52728-
52729- /* switch IEEE compatible power down mode on */
52730- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
52731- Word |= PHY_CT_PDOWN;
52732- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
52733- break;
52734+ /* save current power mode */
52735+ LastMode = pAC->GIni.GP[Port].PPhyPowerState;
52736+ pAC->GIni.GP[Port].PPhyPowerState = Mode;
52737
52738- /* energy detect and energy detect plus mode */
52739- case PHY_PM_ENERGY_DETECT:
52740- case PHY_PM_ENERGY_DETECT_PLUS:
52741- /*
52742- * - disable MAC 125 MHz clock
52743- */
52744- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
52745- Word |= PHY_M_PC_DIS_125CLK;
52746- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
52747-
52748- /* activate energy detect mode 1 */
52749- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
52750-
52751- /* energy detect mode */
52752- if (Mode == PHY_PM_ENERGY_DETECT) {
52753- Word |= PHY_M_PC_EN_DET;
52754+ ChipId = pAC->GIni.GIChipId;
52755+
52756+ SK_DBG_MSG(pAC, SK_DBGMOD_POWM, SK_DBGCAT_CTRL,
52757+ ("SkGmEnterLowPowerMode: %u\n", Mode));
52758+
52759+ /* release GPHY Control reset */
52760+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_CLR);
52761+
52762+ /* release GMAC reset */
52763+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), (SK_U8)GMC_RST_CLR);
52764+
52765+ if (ChipId == CHIP_ID_YUKON_EC_U) {
52766+ /* select page 2 to access MAC control register */
52767+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 2);
52768+
52769+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
52770+ /* allow GMII Power Down */
52771+ Word &= ~PHY_M_MAC_GMIF_PUP;
52772+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
52773+
52774+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0);
52775+ }
52776+
52777+ switch (Mode) {
52778+ /* COMA mode (deep sleep) */
52779+ case PHY_PM_DEEP_SLEEP:
52780+ /* setup General Purpose Control Register */
52781+ GM_OUT16(IoC, Port, GM_GP_CTRL, GM_GPCR_FL_PASS |
52782+ GM_GPCR_SPEED_100 | GM_GPCR_AU_ALL_DIS);
52783+
52784+ if (CHIP_ID_YUKON_2(pAC)) {
52785+ /* set power down bit */
52786+ PowerDownBit = (Port == MAC_1) ? PCI_Y2_PHY1_POWD :
52787+ PCI_Y2_PHY2_POWD;
52788+
52789+ if (ChipId != CHIP_ID_YUKON_EC) {
52790+
52791+ if (ChipId == CHIP_ID_YUKON_EC_U) {
52792+
52793+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
52794+ /* enable Power Down */
52795+ Word |= PHY_M_PC_POW_D_ENA;
52796+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
52797+ }
52798+
52799+ /* set IEEE compatible Power Down Mode (dev. #4.99) */
52800+ Ret = SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PHY_CT_PDOWN);
52801+ }
52802+ }
52803+ else {
52804+ /* apply COMA mode workaround */
52805+ (void)SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_ADDR, 0x001f);
52806+
52807+ Ret = SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xfff3);
52808+
52809+ PowerDownBit = PCI_PHY_COMA;
52810+ }
52811+
52812+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
52813+
52814+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &DWord);
52815+
52816+ /* set PHY to PowerDown/COMA Mode */
52817+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), DWord | PowerDownBit);
52818+
52819+ /* check if this routine was called from a for() loop */
52820+ if (pAC->GIni.GIMacsFound == 1 || Port == MAC_2) {
52821+
52822+ /* ASF system clock stopped */
52823+ SK_OUT8(IoC, B28_Y2_ASF_STAT_CMD, (SK_U8)Y2_ASF_CLK_HALT);
52824+
52825+ if (ChipId == CHIP_ID_YUKON_EC_U) {
52826+ /* set GPHY Control reset */
52827+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_SET);
52828+
52829+ /* additional power saving measurements */
52830+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord);
52831+
52832+ /* set gating core clock for LTSSM in L1 state */
52833+ DWord |= (P_PEX_LTSSM_STAT(P_PEX_LTSSM_L1_STAT) |
52834+ /* auto clock gated scheme controlled by CLKREQ */
52835+ P_ASPM_A1_MODE_SELECT |
52836+ /* enable Gate Root Core Clock */
52837+ P_CLK_GATE_ROOT_COR_ENA);
52838+
52839+ if (HW_FEATURE(pAC, HWF_WA_DEV_4200)) {
52840+ /* Enable Clock Power Management (CLKREQ) */
52841+ SK_IN16(IoC, PCI_C(pAC, PEX_LNK_CTRL), &Word);
52842+ Word |= PEX_LC_CLK_PM_ENA;
52843+ SK_OUT16(IoC, PCI_C(pAC, PEX_LNK_CTRL), Word);
52844 }
52845- /* energy detect plus mode */
52846 else {
52847- Word |= PHY_M_PC_EN_DET_PLUS;
52848+ /* Force CLKREQ Enable in Our4 (A1b only) */
52849+ DWord |= P_ASPM_FORCE_CLKREQ_ENA;
52850 }
52851
52852- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
52853+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord);
52854
52855- /*
52856- * reinitialize the PHY to force a software reset
52857- * which is necessary after the register settings
52858- * for the energy detect modes.
52859- * Furthermore reinitialisation prevents that the
52860- * PHY is running out of a stable state.
52861- */
52862- SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE);
52863- break;
52864+ /* set Mask Register for Release/Gate Clock */
52865+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5),
52866+ P_REL_PCIE_EXIT_L1_ST | P_GAT_PCIE_ENTER_L1_ST |
52867+ P_REL_PCIE_RX_EX_IDLE | P_GAT_PCIE_RX_EL_IDLE |
52868+ P_REL_GPHY_LINK_UP | P_GAT_GPHY_LINK_DOWN);
52869+ }
52870
52871- /* don't change current power mode */
52872- default:
52873- pAC->GIni.GP[Port].PPhyPowerState = LastMode;
52874- Ret = 1;
52875- break;
52876+ if (HW_FEATURE(pAC, HWF_RED_CORE_CLK_SUP)) {
52877+ /* divide clock by 4 only for Yukon-EC */
52878+ ClkDiv = (ChipId == CHIP_ID_YUKON_EC) ? 1 : 0;
52879+
52880+ /* on Yukon-2 clock select value is 31 */
52881+ DWord = (ChipId == CHIP_ID_YUKON_XL) ?
52882+ (Y2_CLK_DIV_VAL_2(0) | Y2_CLK_SEL_VAL_2(31)) :
52883+ Y2_CLK_DIV_VAL(ClkDiv);
52884+
52885+ /* check for Yukon-2 dual port PCI-Express adapter */
52886+ if (!(pAC->GIni.GIMacsFound == 2 &&
52887+ pAC->GIni.GIPciBus == SK_PEX_BUS)) {
52888+ /* enable Core Clock Division */
52889+ DWord |= Y2_CLK_DIV_ENA;
52890+ }
52891+
52892+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52893+ ("Set Core Clock: 0x%08X\n", DWord));
52894+
52895+ /* reduce Core Clock Frequency */
52896+ SK_OUT32(IoC, B2_Y2_CLK_CTRL, DWord);
52897+ }
52898+
52899+ if (HW_FEATURE(pAC, HWF_CLK_GATING_ENABLE)) {
52900+ /* check for Yukon-2 Rev. A2 */
52901+ if (ChipId == CHIP_ID_YUKON_XL &&
52902+ pAC->GIni.GIChipRev > CHIP_REV_YU_XL_A1) {
52903+ /* enable bits are inverted */
52904+ Byte = 0;
52905+ }
52906+ else {
52907+ Byte = (SK_U8)(Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
52908+ Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
52909+ Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS);
52910+ }
52911+
52912+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52913+ ("Set Clock Gating: 0x%02X\n", Byte));
52914+
52915+ /* disable MAC/PHY, PCI and Core Clock for both Links */
52916+ SK_OUT8(IoC, B2_Y2_CLK_GATE, Byte);
52917+ }
52918+
52919+ if (pAC->GIni.GIVauxAvail) {
52920+ /* switch power to VAUX */
52921+ SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA |
52922+ PC_VAUX_ON | PC_VCC_OFF));
52923+ }
52924+#ifdef DEBUG
52925+ SK_IN32(IoC, B0_CTST, &DWord);
52926+
52927+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
52928+ ("Ctrl/Stat & Switch: 0x%08x\n", DWord));
52929+#endif /* DEBUG */
52930+
52931+ if (pAC->GIni.GILevel != SK_INIT_IO &&
52932+ pAC->GIni.GIMacsFound == 1 &&
52933+ pAC->GIni.GIPciBus == SK_PEX_BUS) {
52934+
52935+ if (ChipId == CHIP_ID_YUKON_EC_U) {
52936+
52937+#ifdef PCI_E_L1_STATE
52938+ SK_IN16(IoC, PCI_C(pAC, PCI_OUR_REG_1), &Word);
52939+ /* force to PCIe L1 */
52940+ Word |= (SK_U16)PCI_FORCE_PEX_L1;
52941+ SK_OUT16(IoC, PCI_C(pAC, PCI_OUR_REG_1), Word);
52942+#endif /* PCI_E_L1_STATE */
52943+ }
52944+ else {
52945+ /* switch to D1 state */
52946+ SK_OUT8(IoC, PCI_C(pAC, PCI_PM_CTL_STS), PCI_PM_STATE_D1);
52947+ }
52948+ }
52949 }
52950- }
52951- /* low power modes are not supported by this chip */
52952- else {
52953+
52954+ break;
52955+
52956+ /* IEEE 22.2.4.1.5 compatible power down mode */
52957+ case PHY_PM_IEEE_POWER_DOWN:
52958+
52959+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
52960+
52961+ Word |= PHY_M_PC_POL_R_DIS;
52962+
52963+ if (!CHIP_ID_YUKON_2(pAC)) {
52964+ /* disable MAC 125 MHz clock */
52965+ Word |= PHY_M_PC_DIS_125CLK;
52966+ Word &= ~PHY_M_PC_MAC_POW_UP;
52967+ }
52968+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
52969+
52970+ /* these register changes must be followed by a software reset */
52971+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
52972+
52973+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word | PHY_CT_RESET);
52974+
52975+ /* switch IEEE compatible power down mode on */
52976+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word | PHY_CT_PDOWN);
52977+
52978+ break;
52979+
52980+ /* energy detect and energy detect plus mode */
52981+ case PHY_PM_ENERGY_DETECT:
52982+ case PHY_PM_ENERGY_DETECT_PLUS:
52983+
52984+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
52985+
52986+ Word |= PHY_M_PC_POL_R_DIS;
52987+
52988+ if (!CHIP_ID_YUKON_2(pAC)) {
52989+ /* disable MAC 125 MHz clock */
52990+ Word |= PHY_M_PC_DIS_125CLK;
52991+ }
52992+
52993+ if (ChipId == CHIP_ID_YUKON_FE) {
52994+ /* enable Energy Detect (sense & pulse) */
52995+ Word |= PHY_M_PC_ENA_ENE_DT;
52996+ }
52997+ else {
52998+ /* clear energy detect mode bits */
52999+ Word &= ~PHY_M_PC_EN_DET_MSK;
53000+
53001+ Word |= (Mode == PHY_PM_ENERGY_DETECT) ? PHY_M_PC_EN_DET :
53002+ PHY_M_PC_EN_DET_PLUS;
53003+ }
53004+
53005+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
53006+
53007+ /* these register changes must be followed by a software reset */
53008+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
53009+ Word |= PHY_CT_RESET;
53010+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
53011+
53012+ if (ChipId == CHIP_ID_YUKON_EC_U) {
53013+ /* additional power saving measurements */
53014+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord);
53015+
53016+ /* set gating core clock for LTSSM in L1 state */
53017+ DWord |= (P_PEX_LTSSM_STAT(P_PEX_LTSSM_L1_STAT) |
53018+ /* Enable Gate Root Core Clock */
53019+ P_CLK_GATE_ROOT_COR_ENA);
53020+
53021+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord);
53022+
53023+ /* set Mask Register for Release/Gate Clock */
53024+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5),
53025+ P_REL_PCIE_EXIT_L1_ST | P_GAT_PCIE_ENTER_L1_ST |
53026+ P_REL_PCIE_RX_EX_IDLE | P_GAT_PCIE_RX_EL_IDLE |
53027+ P_REL_GPHY_LINK_UP | P_GAT_GPHY_LINK_DOWN);
53028+
53029+#ifdef PCI_E_L1_STATE
53030+ SK_IN16(IoC, PCI_C(pAC, PCI_OUR_REG_1), &Word);
53031+ /* enable PCIe L1 on GPHY link down */
53032+ Word |= (SK_U16)PCI_ENA_GPHY_LNK;
53033+ SK_OUT16(IoC, PCI_C(pAC, PCI_OUR_REG_1), Word);
53034+#endif /* PCI_E_L1_STATE */
53035+ }
53036+
53037+ break;
53038+
53039+ /* don't change current power mode */
53040+ default:
53041+ pAC->GIni.GP[Port].PPhyPowerState = LastMode;
53042 Ret = 1;
53043 }
53044
53045@@ -2233,7 +2503,7 @@
53046 *
53047 * SkGmLeaveLowPowerMode()
53048 *
53049- * Description:
53050+ * Description:
53051 * Leave the current low power mode and switch to normal mode
53052 *
53053 * Note:
53054@@ -2243,115 +2513,169 @@
53055 * 1: error
53056 */
53057 int SkGmLeaveLowPowerMode(
53058-SK_AC *pAC, /* adapter context */
53059-SK_IOC IoC, /* IO context */
53060+SK_AC *pAC, /* Adapter Context */
53061+SK_IOC IoC, /* I/O Context */
53062 int Port) /* Port Index (e.g. MAC_1) */
53063 {
53064 SK_U32 DWord;
53065+ SK_U32 PowerDownBit;
53066 SK_U16 Word;
53067 SK_U8 LastMode;
53068+ int ChipId;
53069 int Ret = 0;
53070
53071- if (pAC->GIni.GIYukonLite &&
53072- pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
53073+ if (!(CHIP_ID_YUKON_2(pAC) || (pAC->GIni.GIYukonLite &&
53074+ pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3))) {
53075
53076- /* save current power mode */
53077- LastMode = pAC->GIni.GP[Port].PPhyPowerState;
53078- pAC->GIni.GP[Port].PPhyPowerState = PHY_PM_OPERATIONAL_MODE;
53079-
53080- switch (LastMode) {
53081- /* coma mode (deep sleep) */
53082- case PHY_PM_DEEP_SLEEP:
53083- SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord);
53084-
53085- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
53086-
53087- /* Release PHY from Coma Mode */
53088- SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord & ~PCI_PHY_COMA);
53089-
53090- SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
53091-
53092- SK_IN32(IoC, B2_GP_IO, &DWord);
53093-
53094- /* set to output */
53095- DWord |= (GP_DIR_9 | GP_IO_9);
53096-
53097- /* set PHY reset */
53098- SK_OUT32(IoC, B2_GP_IO, DWord);
53099-
53100- DWord &= ~GP_IO_9; /* clear PHY reset (active high) */
53101-
53102- /* clear PHY reset */
53103- SK_OUT32(IoC, B2_GP_IO, DWord);
53104- break;
53105-
53106- /* IEEE 22.2.4.1.5 compatible power down mode */
53107- case PHY_PM_IEEE_POWER_DOWN:
53108- /*
53109- * - enable MAC 125 MHz clock
53110- * - set MAC power up
53111- */
53112- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
53113- Word &= ~PHY_M_PC_DIS_125CLK;
53114- Word |= PHY_M_PC_MAC_POW_UP;
53115- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
53116+ return(1);
53117+ }
53118
53119- /*
53120- * register changes must be followed by a software
53121- * reset to take effect
53122- */
53123- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
53124- Word |= PHY_CT_RESET;
53125- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
53126-
53127- /* switch IEEE compatible power down mode off */
53128- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
53129- Word &= ~PHY_CT_PDOWN;
53130- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
53131- break;
53132+ /* save current power mode */
53133+ LastMode = pAC->GIni.GP[Port].PPhyPowerState;
53134+ pAC->GIni.GP[Port].PPhyPowerState = PHY_PM_OPERATIONAL_MODE;
53135
53136- /* energy detect and energy detect plus mode */
53137- case PHY_PM_ENERGY_DETECT:
53138- case PHY_PM_ENERGY_DETECT_PLUS:
53139- /*
53140- * - enable MAC 125 MHz clock
53141- */
53142- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
53143- Word &= ~PHY_M_PC_DIS_125CLK;
53144- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
53145-
53146- /* disable energy detect mode */
53147- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
53148- Word &= ~PHY_M_PC_EN_DET_MSK;
53149- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
53150+ ChipId = pAC->GIni.GIChipId;
53151
53152- /*
53153- * reinitialize the PHY to force a software reset
53154- * which is necessary after the register settings
53155- * for the energy detect modes.
53156- * Furthermore reinitialisation prevents that the
53157- * PHY is running out of a stable state.
53158- */
53159- SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE);
53160- break;
53161+ SK_DBG_MSG(pAC, SK_DBGMOD_POWM, SK_DBGCAT_CTRL,
53162+ ("SkGmLeaveLowPowerMode: %u\n", LastMode));
53163
53164- /* don't change current power mode */
53165- default:
53166- pAC->GIni.GP[Port].PPhyPowerState = LastMode;
53167- Ret = 1;
53168- break;
53169+ switch (LastMode) {
53170+ /* COMA mode (deep sleep) */
53171+ case PHY_PM_DEEP_SLEEP:
53172+
53173+ if (ChipId == CHIP_ID_YUKON_EC_U) {
53174+#ifdef PCI_E_L1_STATE
53175+ /* set to default value (leave PCIe L1) */
53176+ SkPciWriteCfgWord(pAC, PCI_OUR_REG_1, 0);
53177+#endif /* PCI_E_L1_STATE */
53178+
53179+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_4), &DWord);
53180+
53181+ DWord &= P_ASPM_CONTROL_MSK;
53182+ /* set all bits to 0 except bits 15..12 */
53183+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_4), DWord);
53184+
53185+ /* set to default value */
53186+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_5), 0);
53187 }
53188- }
53189- /* low power modes are not supported by this chip */
53190- else {
53191+ else {
53192+ SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &Word);
53193+
53194+ /* reset all DState bits */
53195+ Word &= ~(PCI_PM_STATE_MSK);
53196+
53197+ /* switch to D0 state */
53198+ SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, Word);
53199+ }
53200+
53201+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
53202+
53203+ if (CHIP_ID_YUKON_2(pAC)) {
53204+ /* disable Core Clock Division */
53205+ SK_OUT32(IoC, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS);
53206+
53207+ /* set power down bit */
53208+ PowerDownBit = (Port == MAC_1) ? PCI_Y2_PHY1_POWD :
53209+ PCI_Y2_PHY2_POWD;
53210+ }
53211+ else {
53212+ PowerDownBit = PCI_PHY_COMA;
53213+ }
53214+
53215+ SK_IN32(IoC, PCI_C(pAC, PCI_OUR_REG_1), &DWord);
53216+
53217+ /* Release PHY from PowerDown/COMA Mode */
53218+ SK_OUT32(IoC, PCI_C(pAC, PCI_OUR_REG_1), DWord & ~PowerDownBit);
53219+
53220+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
53221+
53222+ if (CHIP_ID_YUKON_2(pAC)) {
53223+
53224+ if (ChipId == CHIP_ID_YUKON_FE) {
53225+ /* release IEEE compatible Power Down Mode */
53226+ Ret = SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PHY_CT_ANE);
53227+ }
53228+ else if (ChipId == CHIP_ID_YUKON_EC_U) {
53229+ /* release GPHY Control reset */
53230+ SK_OUT8(IoC, MR_ADDR(Port, GPHY_CTRL), (SK_U8)GPC_RST_CLR);
53231+ }
53232+ }
53233+ else {
53234+ SK_IN32(IoC, B2_GP_IO, &DWord);
53235+
53236+ /* set to output */
53237+ DWord |= (GP_DIR_9 | GP_IO_9);
53238+
53239+ /* set PHY reset */
53240+ SK_OUT32(IoC, B2_GP_IO, DWord);
53241+
53242+ DWord &= ~GP_IO_9; /* clear PHY reset (active high) */
53243+
53244+ /* clear PHY reset */
53245+ SK_OUT32(IoC, B2_GP_IO, DWord);
53246+ }
53247+
53248+ break;
53249+
53250+ /* IEEE 22.2.4.1.5 compatible power down mode */
53251+ case PHY_PM_IEEE_POWER_DOWN:
53252+
53253+ if (ChipId != CHIP_ID_YUKON_XL) {
53254+
53255+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
53256+ Word &= ~PHY_M_PC_DIS_125CLK; /* enable MAC 125 MHz clock */
53257+ Word |= PHY_M_PC_MAC_POW_UP; /* set MAC power up */
53258+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
53259+
53260+ /* these register changes must be followed by a software reset */
53261+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
53262+ Word |= PHY_CT_RESET;
53263+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
53264+ }
53265+
53266+ /* switch IEEE compatible power down mode off */
53267+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
53268+ Word &= ~PHY_CT_PDOWN;
53269+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
53270+
53271+ break;
53272+
53273+ /* energy detect and energy detect plus mode */
53274+ case PHY_PM_ENERGY_DETECT:
53275+ case PHY_PM_ENERGY_DETECT_PLUS:
53276+
53277+ if (ChipId != CHIP_ID_YUKON_XL) {
53278+
53279+ Ret = SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
53280+
53281+ if (ChipId == CHIP_ID_YUKON_FE) {
53282+ /* disable Energy Detect */
53283+ Word &= ~PHY_M_PC_ENA_ENE_DT;
53284+ }
53285+ else {
53286+ /* disable energy detect mode & enable MAC 125 MHz clock */
53287+ Word &= ~(PHY_M_PC_EN_DET_MSK | PHY_M_PC_DIS_125CLK);
53288+ }
53289+
53290+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
53291+
53292+ /* these register changes must be followed by a software reset */
53293+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
53294+ Word |= PHY_CT_RESET;
53295+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
53296+ }
53297+ break;
53298+
53299+ /* don't change current power mode */
53300+ default:
53301+ pAC->GIni.GP[Port].PPhyPowerState = LastMode;
53302 Ret = 1;
53303 }
53304
53305 return(Ret);
53306
53307 } /* SkGmLeaveLowPowerMode */
53308-#endif /* !SK_SLIM */
53309-
53310+#endif /* SK_PHY_LP_MODE */
53311
53312 /******************************************************************************
53313 *
53314@@ -2365,107 +2689,242 @@
53315 * nothing
53316 */
53317 static void SkGmInitPhyMarv(
53318-SK_AC *pAC, /* adapter context */
53319-SK_IOC IoC, /* IO context */
53320+SK_AC *pAC, /* Adapter Context */
53321+SK_IOC IoC, /* I/O Context */
53322 int Port, /* Port Index (MAC_1 + n) */
53323 SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */
53324 {
53325 SK_GEPORT *pPrt;
53326+ SK_BOOL AutoNeg;
53327 SK_U16 PhyCtrl;
53328 SK_U16 C1000BaseT;
53329 SK_U16 AutoNegAdv;
53330+ SK_U8 PauseMode;
53331+ int ChipId;
53332+#ifndef VCPU
53333+ SK_U16 SWord;
53334+ SK_U16 PageReg;
53335+#ifndef SK_SLIM
53336+ SK_U16 LoopSpeed;
53337+#endif /* !SK_SLIM */
53338 SK_U16 ExtPhyCtrl;
53339 SK_U16 LedCtrl;
53340- SK_BOOL AutoNeg;
53341+ SK_U16 LedOver;
53342+#ifndef SK_DIAG
53343+ SK_EVPARA Para;
53344+#endif /* !SK_DIAG */
53345 #if defined(SK_DIAG) || defined(DEBUG)
53346 SK_U16 PhyStat;
53347 SK_U16 PhyStat1;
53348 SK_U16 PhySpecStat;
53349 #endif /* SK_DIAG || DEBUG */
53350+#endif /* !VCPU */
53351+
53352+ /* set Pause On */
53353+ PauseMode = (SK_U8)GMC_PAUSE_ON;
53354
53355 pPrt = &pAC->GIni.GP[Port];
53356
53357+ ChipId = pAC->GIni.GIChipId;
53358+
53359 /* Auto-negotiation ? */
53360- if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {
53361- AutoNeg = SK_FALSE;
53362+ AutoNeg = pPrt->PLinkMode != SK_LMODE_HALF &&
53363+ pPrt->PLinkMode != SK_LMODE_FULL;
53364+
53365+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53366+ ("InitPhyMarv: Port %d, Auto-neg. %s, LMode %d, LSpeed %d, FlowC %d\n",
53367+ Port, AutoNeg ? "ON" : "OFF",
53368+ pPrt->PLinkMode, pPrt->PLinkSpeed, pPrt->PFlowCtrlMode));
53369+
53370+#ifndef VCPU
53371+ /* read Id from PHY */
53372+ if (SkGmPhyRead(pAC, IoC, Port, PHY_MARV_ID1, &pPrt->PhyId1) != 0) {
53373+
53374+#ifndef SK_DIAG
53375+ Para.Para64 = Port;
53376+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
53377+#endif /* !SK_DIAG */
53378+
53379+ return;
53380 }
53381- else {
53382- AutoNeg = SK_TRUE;
53383+
53384+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) {
53385+
53386+#ifndef SK_SLIM
53387+ if (DoLoop) {
53388+ /* special setup for PHY 88E1112 */
53389+ if (ChipId == CHIP_ID_YUKON_XL) {
53390+
53391+ LoopSpeed = pPrt->PLinkSpeed;
53392+
53393+ if (LoopSpeed == SK_LSPEED_AUTO) {
53394+ /* force 1000 Mbps */
53395+ LoopSpeed = SK_LSPEED_1000MBPS;
53396+ }
53397+ LoopSpeed += 2;
53398+
53399+ /* save page register */
53400+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_ADR, &PageReg);
53401+
53402+ /* select page 2 to access MAC control register */
53403+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 2);
53404+
53405+ /* set MAC interface speed */
53406+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, LoopSpeed << 4);
53407+
53408+ /* restore page register */
53409+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, PageReg);
53410+
53411+ /* disable link pulses */
53412+ SWord = PHY_M_PC_DIS_LINK_P;
53413+ }
53414+ else {
53415+ /* set 'MAC Power up'-bit, set Manual MDI configuration */
53416+ SWord = PHY_M_PC_MAC_POW_UP;
53417+ }
53418+
53419+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, SWord);
53420+ }
53421+ else
53422+#endif /* !SK_SLIM */
53423+ if (AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_AUTO &&
53424+ !(ChipId == CHIP_ID_YUKON_XL || ChipId == CHIP_ID_YUKON_EC_U)) {
53425+ /* Read Ext. PHY Specific Control */
53426+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl);
53427+
53428+ ExtPhyCtrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK |
53429+ PHY_M_EC_MAC_S_MSK);
53430+
53431+ ExtPhyCtrl |= PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ);
53432+
53433+ /* on PHY 88E1040 Rev.D0 (and newer) downshift control changed */
53434+ if (pAC->GIni.GIYukonLite || ChipId == CHIP_ID_YUKON_EC) {
53435+ /* set downshift counter to 3x and enable downshift */
53436+ ExtPhyCtrl |= PHY_M_EC_DSC_2(2) | PHY_M_EC_DOWN_S_ENA;
53437+ }
53438+ else {
53439+ /* set master & slave downshift counter to 1x */
53440+ ExtPhyCtrl |= PHY_M_EC_M_DSC(0) | PHY_M_EC_S_DSC(1);
53441+ }
53442+
53443+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, ExtPhyCtrl);
53444+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53445+ ("Set Ext. PHY Ctrl = 0x%04X\n", ExtPhyCtrl));
53446+ }
53447 }
53448-
53449- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53450- ("InitPhyMarv: Port %d, auto-negotiation %s\n",
53451- Port, AutoNeg ? "ON" : "OFF"));
53452
53453-#ifdef VCPU
53454- VCPUprintf(0, "SkGmInitPhyMarv(), Port=%u, DoLoop=%u\n",
53455- Port, DoLoop);
53456-#else /* VCPU */
53457- if (DoLoop) {
53458- /* Set 'MAC Power up'-bit, set Manual MDI configuration */
53459- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL,
53460- PHY_M_PC_MAC_POW_UP);
53461+ if (CHIP_ID_YUKON_2(pAC)) {
53462+ /* Read PHY Specific Control */
53463+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &PhyCtrl);
53464+
53465+ if (!DoLoop && pAC->GIni.GICopperType) {
53466+
53467+ if (ChipId == CHIP_ID_YUKON_FE) {
53468+ /* enable Automatic Crossover (!!! Bits 5..4) */
53469+ PhyCtrl |= (SK_U16)(PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1);
53470+ }
53471+ else {
53472+ /* disable Energy Detect Mode */
53473+ PhyCtrl &= ~PHY_M_PC_EN_DET_MSK;
53474+
53475+ /* enable Automatic Crossover */
53476+ PhyCtrl |= (SK_U16)PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO);
53477+
53478+ /* downshift on PHY 88E1112 and 88E1149 is changed */
53479+ if (AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_AUTO &&
53480+ (ChipId == CHIP_ID_YUKON_XL ||
53481+ ChipId == CHIP_ID_YUKON_EC_U)) {
53482+ /* set downshift counter to 3x and enable downshift */
53483+ PhyCtrl &= ~PHY_M_PC_DSC_MSK;
53484+ PhyCtrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA;
53485+ }
53486+ }
53487+ }
53488+ /* workaround for deviation #4.88 (CRC errors) */
53489+ else {
53490+ /* disable Automatic Crossover */
53491+ PhyCtrl &= ~PHY_M_PC_MDIX_MSK;
53492+ }
53493+
53494+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PhyCtrl);
53495 }
53496- else if (AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_AUTO) {
53497- /* Read Ext. PHY Specific Control */
53498- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl);
53499-
53500- ExtPhyCtrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK |
53501- PHY_M_EC_MAC_S_MSK);
53502-
53503- ExtPhyCtrl |= PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ) |
53504- PHY_M_EC_M_DSC(0) | PHY_M_EC_S_DSC(1);
53505-
53506- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, ExtPhyCtrl);
53507- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53508- ("Set Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl));
53509+
53510+ /* special setup for PHY 88E1112 Fiber */
53511+ if (ChipId == CHIP_ID_YUKON_XL && !pAC->GIni.GICopperType) {
53512+ /* select 1000BASE-X only mode in MAC Specific Ctrl Reg. */
53513+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 2);
53514+
53515+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &SWord);
53516+
53517+ SWord &= ~PHY_M_MAC_MD_MSK;
53518+ SWord |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX);
53519+
53520+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, SWord);
53521+
53522+ /* select page 1 to access Fiber registers */
53523+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 1);
53524+
53525+ if (pAC->GIni.GIPmdTyp == 'P') {
53526+ /* for SFP-module set SIGDET polarity to low */
53527+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &SWord);
53528+
53529+ SWord |= PHY_M_FIB_SIGD_POL;
53530+
53531+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, SWord);
53532+ }
53533 }
53534
53535 /* Read PHY Control */
53536 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl);
53537
53538+#ifndef SK_SLIM
53539 if (!AutoNeg) {
53540- /* Disable Auto-negotiation */
53541+ /* disable Auto-negotiation */
53542 PhyCtrl &= ~PHY_CT_ANE;
53543 }
53544+#endif /* !SK_SLIM */
53545
53546 PhyCtrl |= PHY_CT_RESET;
53547- /* Assert software reset */
53548+ /* assert software reset */
53549 SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl);
53550-#endif /* VCPU */
53551+#endif /* !VCPU */
53552
53553 PhyCtrl = 0 /* PHY_CT_COL_TST */;
53554 C1000BaseT = 0;
53555 AutoNegAdv = PHY_SEL_TYPE;
53556
53557+#ifndef SK_SLIM
53558 /* manually Master/Slave ? */
53559 if (pPrt->PMSMode != SK_MS_MODE_AUTO) {
53560 /* enable Manual Master/Slave */
53561 C1000BaseT |= PHY_M_1000C_MSE;
53562-
53563+
53564 if (pPrt->PMSMode == SK_MS_MODE_MASTER) {
53565 C1000BaseT |= PHY_M_1000C_MSC; /* set it to Master */
53566 }
53567 }
53568-
53569+#endif /* !SK_SLIM */
53570+
53571 /* Auto-negotiation ? */
53572 if (!AutoNeg) {
53573-
53574+
53575+#ifndef SK_SLIM
53576 if (pPrt->PLinkMode == SK_LMODE_FULL) {
53577- /* Set Full Duplex Mode */
53578+ /* set Full Duplex Mode */
53579 PhyCtrl |= PHY_CT_DUP_MD;
53580 }
53581
53582- /* Set Master/Slave manually if not already done */
53583+ /* set Master/Slave manually if not already done */
53584 if (pPrt->PMSMode == SK_MS_MODE_AUTO) {
53585 C1000BaseT |= PHY_M_1000C_MSE; /* set it to Slave */
53586 }
53587
53588- /* Set Speed */
53589+ /* set Speed */
53590 switch (pPrt->PLinkSpeed) {
53591 case SK_LSPEED_AUTO:
53592 case SK_LSPEED_1000MBPS:
53593- PhyCtrl |= PHY_CT_SP1000;
53594+ PhyCtrl |= (((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) ?
53595+ PHY_CT_SP1000 : PHY_CT_SP100);
53596 break;
53597 case SK_LSPEED_100MBPS:
53598 PhyCtrl |= PHY_CT_SP100;
53599@@ -2477,38 +2936,67 @@
53600 SKERR_HWI_E019MSG);
53601 }
53602
53603+ if ((pPrt->PFlowCtrlMode == SK_FLOW_STAT_NONE) ||
53604+ /* disable Pause also for 10/100 Mbps in half duplex mode */
53605+ ((ChipId != CHIP_ID_YUKON_EC_U) &&
53606+ (pPrt->PLinkMode == SK_LMODE_HALF) &&
53607+ ((pPrt->PLinkSpeed == SK_LSPEED_STAT_100MBPS) ||
53608+ (pPrt->PLinkSpeed == SK_LSPEED_STAT_10MBPS)))) {
53609+
53610+ /* set Pause Off */
53611+ PauseMode = (SK_U8)GMC_PAUSE_OFF;
53612+ }
53613+
53614+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), PauseMode);
53615+
53616 if (!DoLoop) {
53617+ /* assert software reset */
53618 PhyCtrl |= PHY_CT_RESET;
53619 }
53620+#endif /* !SK_SLIM */
53621 }
53622 else {
53623- /* Set Auto-negotiation advertisement */
53624-
53625+ /* set Auto-negotiation advertisement */
53626+
53627 if (pAC->GIni.GICopperType) {
53628- /* Set Speed capabilities */
53629+ /* set Speed capabilities */
53630 switch (pPrt->PLinkSpeed) {
53631 case SK_LSPEED_AUTO:
53632- C1000BaseT |= PHY_M_1000C_AHD | PHY_M_1000C_AFD;
53633+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) {
53634+ C1000BaseT |= PHY_M_1000C_AFD;
53635+#ifdef xSK_DIAG
53636+ C1000BaseT |= PHY_M_1000C_AHD;
53637+#endif /* SK_DIAG */
53638+ }
53639 AutoNegAdv |= PHY_M_AN_100_FD | PHY_M_AN_100_HD |
53640 PHY_M_AN_10_FD | PHY_M_AN_10_HD;
53641 break;
53642 case SK_LSPEED_1000MBPS:
53643- C1000BaseT |= PHY_M_1000C_AHD | PHY_M_1000C_AFD;
53644+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) {
53645+ C1000BaseT |= PHY_M_1000C_AFD;
53646+#ifdef xSK_DIAG
53647+ C1000BaseT |= PHY_M_1000C_AHD;
53648+#endif /* SK_DIAG */
53649+ }
53650 break;
53651 case SK_LSPEED_100MBPS:
53652- AutoNegAdv |= PHY_M_AN_100_FD | PHY_M_AN_100_HD |
53653- /* advertise 10Base-T also */
53654- PHY_M_AN_10_FD | PHY_M_AN_10_HD;
53655+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_100MBPS) != 0) {
53656+ AutoNegAdv |= PHY_M_AN_100_FD | PHY_M_AN_100_HD |
53657+ /* advertise 10Base-T also */
53658+ PHY_M_AN_10_FD | PHY_M_AN_10_HD;
53659+ }
53660 break;
53661 case SK_LSPEED_10MBPS:
53662- AutoNegAdv |= PHY_M_AN_10_FD | PHY_M_AN_10_HD;
53663+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_10MBPS) != 0) {
53664+ AutoNegAdv |= PHY_M_AN_10_FD | PHY_M_AN_10_HD;
53665+ }
53666 break;
53667 default:
53668 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E019,
53669 SKERR_HWI_E019MSG);
53670 }
53671
53672- /* Set Full/half duplex capabilities */
53673+ /* set Full/half duplex capabilities */
53674 switch (pPrt->PLinkMode) {
53675 case SK_LMODE_AUTOHALF:
53676 C1000BaseT &= ~PHY_M_1000C_AFD;
53677@@ -2524,8 +3012,8 @@
53678 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E015,
53679 SKERR_HWI_E015MSG);
53680 }
53681-
53682- /* Set Flow-control capabilities */
53683+
53684+ /* set Flow-control capabilities */
53685 switch (pPrt->PFlowCtrlMode) {
53686 case SK_FLOW_MODE_NONE:
53687 AutoNegAdv |= PHY_B_P_NO_PAUSE;
53688@@ -2544,9 +3032,9 @@
53689 SKERR_HWI_E016MSG);
53690 }
53691 }
53692- else { /* special defines for FIBER (88E1011S only) */
53693-
53694- /* Set Full/half duplex capabilities */
53695+ else { /* special defines for FIBER (88E1040S only) */
53696+
53697+ /* set Full/half duplex capabilities */
53698 switch (pPrt->PLinkMode) {
53699 case SK_LMODE_AUTOHALF:
53700 AutoNegAdv |= PHY_M_AN_1000X_AHD;
53701@@ -2561,8 +3049,8 @@
53702 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E015,
53703 SKERR_HWI_E015MSG);
53704 }
53705-
53706- /* Set Flow-control capabilities */
53707+
53708+ /* set Flow-control capabilities */
53709 switch (pPrt->PFlowCtrlMode) {
53710 case SK_FLOW_MODE_NONE:
53711 AutoNegAdv |= PHY_M_P_NO_PAUSE_X;
53712@@ -2587,138 +3075,228 @@
53713 PhyCtrl |= PHY_CT_ANE | PHY_CT_RE_CFG;
53714 }
53715 }
53716-
53717+
53718 #ifdef VCPU
53719 /*
53720 * E-mail from Gu Lin (08-03-2002):
53721 */
53722-
53723+
53724 /* Program PHY register 30 as 16'h0708 for simulation speed up */
53725 SkGmPhyWrite(pAC, IoC, Port, 30, 0x0700 /* 0x0708 */);
53726-
53727+
53728 VCpuWait(2000);
53729
53730-#else /* VCPU */
53731-
53732- /* Write 1000Base-T Control Register */
53733- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_1000T_CTRL, C1000BaseT);
53734- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53735- ("Set 1000B-T Ctrl =0x%04X\n", C1000BaseT));
53736-
53737+#else /* !VCPU */
53738+
53739+ if (ChipId != CHIP_ID_YUKON_FE) {
53740+ /* Write 1000Base-T Control Register */
53741+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_1000T_CTRL, C1000BaseT);
53742+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53743+ ("Set 1000B-T Ctrl = 0x%04X\n", C1000BaseT));
53744+ }
53745+
53746 /* Write AutoNeg Advertisement Register */
53747 SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV, AutoNegAdv);
53748 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53749- ("Set Auto-Neg.Adv.=0x%04X\n", AutoNegAdv));
53750-#endif /* VCPU */
53751-
53752+ ("Set Auto-Neg.Adv. = 0x%04X\n", AutoNegAdv));
53753+#endif /* !VCPU */
53754+
53755+#ifndef SK_SLIM
53756 if (DoLoop) {
53757- /* Set the PHY Loopback bit */
53758+ /* set the PHY Loopback bit */
53759 PhyCtrl |= PHY_CT_LOOP;
53760
53761 #ifdef XXX
53762 /* Program PHY register 16 as 16'h0400 to force link good */
53763 SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PHY_M_PC_FL_GOOD);
53764-#endif /* XXX */
53765
53766-#ifndef VCPU
53767 if (pPrt->PLinkSpeed != SK_LSPEED_AUTO) {
53768 /* Write Ext. PHY Specific Control */
53769 SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL,
53770 (SK_U16)((pPrt->PLinkSpeed + 2) << 4));
53771 }
53772-#endif /* VCPU */
53773+#endif /* XXX */
53774 }
53775 #ifdef TEST_ONLY
53776 else if (pPrt->PLinkSpeed == SK_LSPEED_10MBPS) {
53777- /* Write PHY Specific Control */
53778- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL,
53779- PHY_M_PC_EN_DET_MSK);
53780+ /* Write PHY Specific Control */
53781+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PHY_M_PC_EN_DET_MSK);
53782 }
53783 #endif
53784+#endif /* !SK_SLIM */
53785
53786 /* Write to the PHY Control register */
53787 SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl);
53788 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53789- ("Set PHY Ctrl Reg.=0x%04X\n", PhyCtrl));
53790+ ("Set PHY Ctrl Reg. = 0x%04X\n", PhyCtrl));
53791
53792 #ifdef VCPU
53793 VCpuWait(2000);
53794-#else
53795+#else /* !VCPU */
53796
53797- LedCtrl = PHY_M_LED_PULS_DUR(PULS_170MS) | PHY_M_LED_BLINK_RT(BLINK_84MS);
53798+ LedCtrl = PHY_M_LED_PULS_DUR(PULS_170MS);
53799+
53800+ LedOver = 0;
53801
53802 if ((pAC->GIni.GILedBlinkCtrl & SK_ACT_LED_BLINK) != 0) {
53803- LedCtrl |= PHY_M_LEDC_RX_CTRL | PHY_M_LEDC_TX_CTRL;
53804+
53805+ if (ChipId == CHIP_ID_YUKON_FE) {
53806+ /* on 88E3082 these bits are at 11..9 (shifted left) */
53807+ LedCtrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) << 1;
53808+
53809+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_FE_LED_PAR, &SWord);
53810+
53811+ /* delete ACT LED control bits */
53812+ SWord &= ~PHY_M_FELP_LED1_MSK;
53813+ /* change ACT LED control to blink mode */
53814+ SWord |= PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_ACT_BL);
53815+
53816+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_FE_LED_PAR, SWord);
53817+ }
53818+ else if (ChipId == CHIP_ID_YUKON_XL || ChipId == CHIP_ID_YUKON_EC_U) {
53819+ /* save page register */
53820+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_ADR, &PageReg);
53821+
53822+ /* select page 3 to access LED control register */
53823+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 3);
53824+
53825+ /* set LED Function Control register */
53826+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, (SK_U16)
53827+ (PHY_M_LEDC_LOS_CTRL(1) | /* LINK/ACT */
53828+ PHY_M_LEDC_INIT_CTRL(
53829+ ChipId == CHIP_ID_YUKON_XL ? 7 : 8) | /* 10 Mbps */
53830+ PHY_M_LEDC_STA1_CTRL(7) | /* 100 Mbps */
53831+ PHY_M_LEDC_STA0_CTRL(7))); /* 1000 Mbps */
53832+
53833+ if (ChipId == CHIP_ID_YUKON_XL) {
53834+ /* set Polarity Control register */
53835+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_STAT, (SK_U16)
53836+ (PHY_M_POLC_LS1_P_MIX(4) | PHY_M_POLC_IS0_P_MIX(4) |
53837+ PHY_M_POLC_LOS_CTRL(2) | PHY_M_POLC_INIT_CTRL(2) |
53838+ PHY_M_POLC_STA1_CTRL(2) | PHY_M_POLC_STA0_CTRL(2)));
53839+ }
53840+ else if (ChipId == CHIP_ID_YUKON_EC_U) {
53841+ /* set Blink Rate in LED Timer Control Register */
53842+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK,
53843+ LedCtrl | (SK_U16)PHY_M_LED_BLINK_RT(BLINK_84MS));
53844+ }
53845+ /* restore page register */
53846+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, PageReg);
53847+ }
53848+ else {
53849+ /* set Tx LED (LED_TX) to blink mode on Rx OR Tx activity */
53850+ LedCtrl |= PHY_M_LED_BLINK_RT(BLINK_84MS) | PHY_M_LEDC_TX_CTRL;
53851+
53852+ /* on PHY 88E1111 there is a change for LED control */
53853+ if (ChipId == CHIP_ID_YUKON_EC &&
53854+ (pAC->GIni.GILedBlinkCtrl & SK_DUAL_LED_ACT_LNK) != 0) {
53855+ /* Yukon-EC needs setting of 2 bits: 0,6=11) */
53856+ LedCtrl |= PHY_M_LEDC_TX_C_LSB;
53857+ }
53858+ /* turn off the Rx LED (LED_RX) */
53859+ LedOver |= PHY_M_LED_MO_RX(MO_LED_OFF);
53860+ }
53861 }
53862
53863 if ((pAC->GIni.GILedBlinkCtrl & SK_DUP_LED_NORMAL) != 0) {
53864+ /* disable blink mode (LED_DUPLEX) on collisions */
53865 LedCtrl |= PHY_M_LEDC_DP_CTRL;
53866 }
53867-
53868- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_CTRL, LedCtrl);
53869
53870- if ((pAC->GIni.GILedBlinkCtrl & SK_LED_LINK100_ON) != 0) {
53871- /* only in forced 100 Mbps mode */
53872- if (!AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_100MBPS) {
53873+ if (ChipId == CHIP_ID_YUKON_EC_U &&
53874+ pAC->GIni.GIChipRev == CHIP_REV_YU_EC_U_A1) {
53875
53876- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_OVER,
53877- PHY_M_LED_MO_100(MO_LED_ON));
53878+ /* apply fixes in PHY AFE */
53879+ SkGmPhyWrite(pAC, IoC, Port, 22, 255);
53880+ /* increase differential signal amplitude in 10BASE-T */
53881+ SkGmPhyWrite(pAC, IoC, Port, 24, 0xaa99);
53882+ SkGmPhyWrite(pAC, IoC, Port, 23, 0x2011);
53883+
53884+ /* fix for IEEE A/B Symmetry failure in 1000BASE-T */
53885+ SkGmPhyWrite(pAC, IoC, Port, 24, 0xa204);
53886+ SkGmPhyWrite(pAC, IoC, Port, 23, 0x2002);
53887+
53888+ /* set page register to 0 */
53889+ SkGmPhyWrite(pAC, IoC, Port, 22, 0);
53890+ }
53891+ else {
53892+ /* no effect on Yukon-XL and Yukon-EC Ultra */
53893+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_CTRL, LedCtrl);
53894+
53895+#ifndef SK_SLIM
53896+ if ((pAC->GIni.GILedBlinkCtrl & SK_LED_LINK100_ON) != 0) {
53897+ /* only in forced 100 Mbps mode */
53898+ if (!AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_100MBPS) {
53899+ /* turn on 100 Mbps LED (LED_LINK100) */
53900+ LedOver |= PHY_M_LED_MO_100(MO_LED_ON);
53901+ }
53902+ }
53903+#endif /* !SK_SLIM */
53904+
53905+ if (LedOver != 0) {
53906+ /* set Manual LED Override */
53907+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_OVER, LedOver);
53908 }
53909 }
53910
53911 #ifdef SK_DIAG
53912- c_print("Set PHY Ctrl=0x%04X\n", PhyCtrl);
53913- c_print("Set 1000 B-T=0x%04X\n", C1000BaseT);
53914- c_print("Set Auto-Neg=0x%04X\n", AutoNegAdv);
53915- c_print("Set Ext Ctrl=0x%04X\n", ExtPhyCtrl);
53916+ c_print("Set PHY Ctrl = 0x%04X\n", PhyCtrl);
53917+ c_print("Set 1000 B-T = 0x%04X\n", C1000BaseT);
53918+ c_print("Set Auto-Neg = 0x%04X\n", AutoNegAdv);
53919+ c_print("Set Ext Ctrl = 0x%04X\n", ExtPhyCtrl);
53920 #endif /* SK_DIAG */
53921
53922 #if defined(SK_DIAG) || defined(DEBUG)
53923 /* Read PHY Control */
53924 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl);
53925 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53926- ("PHY Ctrl Reg.=0x%04X\n", PhyCtrl));
53927-
53928- /* Read 1000Base-T Control Register */
53929- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_CTRL, &C1000BaseT);
53930- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53931- ("1000B-T Ctrl =0x%04X\n", C1000BaseT));
53932-
53933+ ("PHY Ctrl Reg. = 0x%04X\n", PhyCtrl));
53934+
53935 /* Read AutoNeg Advertisement Register */
53936 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &AutoNegAdv);
53937 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53938- ("Auto-Neg.Adv.=0x%04X\n", AutoNegAdv));
53939-
53940- /* Read Ext. PHY Specific Control */
53941- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl);
53942- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53943- ("Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl));
53944-
53945+ ("Auto-Neg.Adv. = 0x%04X\n", AutoNegAdv));
53946+
53947+ if (ChipId != CHIP_ID_YUKON_FE) {
53948+ /* Read 1000Base-T Control Register */
53949+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_CTRL, &C1000BaseT);
53950+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53951+ ("1000B-T Ctrl = 0x%04X\n", C1000BaseT));
53952+
53953+ /* Read Ext. PHY Specific Control */
53954+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl);
53955+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53956+ ("Ext. PHY Ctrl = 0x%04X\n", ExtPhyCtrl));
53957+ }
53958+
53959 /* Read PHY Status */
53960 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat);
53961 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53962- ("PHY Stat Reg.=0x%04X\n", PhyStat));
53963+ ("PHY Stat Reg. = 0x%04X\n", PhyStat));
53964+
53965 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat1);
53966 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53967- ("PHY Stat Reg.=0x%04X\n", PhyStat1));
53968-
53969+ ("PHY Stat Reg. = 0x%04X\n", PhyStat1));
53970+
53971 /* Read PHY Specific Status */
53972 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpecStat);
53973 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
53974- ("PHY Spec Stat=0x%04X\n", PhySpecStat));
53975+ ("PHY Spec Stat = 0x%04X\n", PhySpecStat));
53976 #endif /* SK_DIAG || DEBUG */
53977
53978 #ifdef SK_DIAG
53979- c_print("PHY Ctrl Reg=0x%04X\n", PhyCtrl);
53980- c_print("PHY 1000 Reg=0x%04X\n", C1000BaseT);
53981- c_print("PHY AnAd Reg=0x%04X\n", AutoNegAdv);
53982- c_print("Ext Ctrl Reg=0x%04X\n", ExtPhyCtrl);
53983- c_print("PHY Stat Reg=0x%04X\n", PhyStat);
53984- c_print("PHY Stat Reg=0x%04X\n", PhyStat1);
53985- c_print("PHY Spec Reg=0x%04X\n", PhySpecStat);
53986+ c_print("PHY Ctrl Reg = 0x%04X\n", PhyCtrl);
53987+ c_print("PHY 1000 Reg = 0x%04X\n", C1000BaseT);
53988+ c_print("PHY AnAd Reg = 0x%04X\n", AutoNegAdv);
53989+ c_print("Ext Ctrl Reg = 0x%04X\n", ExtPhyCtrl);
53990+ c_print("PHY Stat Reg = 0x%04X\n", PhyStat);
53991+ c_print("PHY Stat Reg = 0x%04X\n", PhyStat1);
53992+ c_print("PHY Spec Reg = 0x%04X\n", PhySpecStat);
53993 #endif /* SK_DIAG */
53994
53995-#endif /* VCPU */
53996+ /* enable PHY interrupts */
53997+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, (SK_U16)PHY_M_DEF_MSK);
53998+#endif /* !VCPU */
53999
54000 } /* SkGmInitPhyMarv */
54001 #endif /* YUKON */
54002@@ -2737,8 +3315,8 @@
54003 * nothing
54004 */
54005 static void SkXmInitPhyLone(
54006-SK_AC *pAC, /* adapter context */
54007-SK_IOC IoC, /* IO context */
54008+SK_AC *pAC, /* Adapter Context */
54009+SK_IOC IoC, /* I/O Context */
54010 int Port, /* Port Index (MAC_1 + n) */
54011 SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */
54012 {
54013@@ -2756,7 +3334,7 @@
54014 /* manually Master/Slave ? */
54015 if (pPrt->PMSMode != SK_MS_MODE_AUTO) {
54016 Ctrl2 |= PHY_L_1000C_MSE;
54017-
54018+
54019 if (pPrt->PMSMode == SK_MS_MODE_MASTER) {
54020 Ctrl2 |= PHY_L_1000C_MSC;
54021 }
54022@@ -2769,7 +3347,7 @@
54023 */
54024 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54025 ("InitPhyLone: no auto-negotiation Port %d\n", Port));
54026- /* Set DuplexMode in Config register */
54027+ /* set DuplexMode in Config register */
54028 if (pPrt->PLinkMode == SK_LMODE_FULL) {
54029 Ctrl1 |= PHY_CT_DUP_MD;
54030 }
54031@@ -2778,7 +3356,6 @@
54032 if (pPrt->PMSMode == SK_MS_MODE_AUTO) {
54033 Ctrl2 |= PHY_L_1000C_MSE; /* set it to Slave */
54034 }
54035-
54036 /*
54037 * Do NOT enable Auto-negotiation here. This would hold
54038 * the link down because no IDLES are transmitted
54039@@ -2787,9 +3364,9 @@
54040 else {
54041 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54042 ("InitPhyLone: with auto-negotiation Port %d\n", Port));
54043- /* Set Auto-negotiation advertisement */
54044+ /* set Auto-negotiation advertisement */
54045
54046- /* Set Full/half duplex capabilities */
54047+ /* set Full/half duplex capabilities */
54048 switch (pPrt->PLinkMode) {
54049 case SK_LMODE_AUTOHALF:
54050 Ctrl2 |= PHY_L_1000C_AHD;
54051@@ -2805,7 +3382,7 @@
54052 SKERR_HWI_E015MSG);
54053 }
54054
54055- /* Set Flow-control capabilities */
54056+ /* set Flow-control capabilities */
54057 switch (pPrt->PFlowCtrlMode) {
54058 case SK_FLOW_MODE_NONE:
54059 Ctrl3 |= PHY_L_P_NO_PAUSE;
54060@@ -2827,26 +3404,26 @@
54061 /* Restart Auto-negotiation */
54062 Ctrl1 = PHY_CT_ANE | PHY_CT_RE_CFG;
54063 }
54064-
54065+
54066 /* Write 1000Base-T Control Register */
54067 SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_1000T_CTRL, Ctrl2);
54068 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54069- ("1000B-T Ctrl Reg=0x%04X\n", Ctrl2));
54070-
54071+ ("1000B-T Ctrl Reg = 0x%04X\n", Ctrl2));
54072+
54073 /* Write AutoNeg Advertisement Register */
54074 SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_AUNE_ADV, Ctrl3);
54075 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54076- ("Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3));
54077+ ("Auto-Neg.Adv.Reg = 0x%04X\n", Ctrl3));
54078
54079 if (DoLoop) {
54080- /* Set the Phy Loopback bit, too */
54081+ /* set the Phy Loopback bit, too */
54082 Ctrl1 |= PHY_CT_LOOP;
54083 }
54084
54085 /* Write to the Phy control register */
54086 SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_CTRL, Ctrl1);
54087 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54088- ("PHY Control Reg=0x%04X\n", Ctrl1));
54089+ ("PHY Control Reg = 0x%04X\n", Ctrl1));
54090 } /* SkXmInitPhyLone */
54091
54092
54093@@ -2862,8 +3439,8 @@
54094 * nothing
54095 */
54096 static void SkXmInitPhyNat(
54097-SK_AC *pAC, /* adapter context */
54098-SK_IOC IoC, /* IO context */
54099+SK_AC *pAC, /* Adapter Context */
54100+SK_IOC IoC, /* I/O Context */
54101 int Port, /* Port Index (MAC_1 + n) */
54102 SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */
54103 {
54104@@ -2884,8 +3461,8 @@
54105 * nothing
54106 */
54107 void SkMacInitPhy(
54108-SK_AC *pAC, /* adapter context */
54109-SK_IOC IoC, /* IO context */
54110+SK_AC *pAC, /* Adapter Context */
54111+SK_IOC IoC, /* I/O Context */
54112 int Port, /* Port Index (MAC_1 + n) */
54113 SK_BOOL DoLoop) /* Should a Phy LoopBack be set-up? */
54114 {
54115@@ -2895,7 +3472,7 @@
54116
54117 #ifdef GENESIS
54118 if (pAC->GIni.GIGenesis) {
54119-
54120+
54121 switch (pPrt->PhyType) {
54122 case SK_PHY_XMAC:
54123 SkXmInitPhyXmac(pAC, IoC, Port, DoLoop);
54124@@ -2914,10 +3491,10 @@
54125 }
54126 }
54127 #endif /* GENESIS */
54128-
54129+
54130 #ifdef YUKON
54131 if (pAC->GIni.GIYukon) {
54132-
54133+
54134 SkGmInitPhyMarv(pAC, IoC, Port, DoLoop);
54135 }
54136 #endif /* YUKON */
54137@@ -2935,17 +3512,17 @@
54138 *
54139 * Returns:
54140 * SK_AND_OK o.k.
54141- * SK_AND_DUP_CAP Duplex capability error happened
54142- * SK_AND_OTHER Other error happened
54143+ * SK_AND_DUP_CAP Duplex capability error happened
54144+ * SK_AND_OTHER Other error happened
54145 */
54146 static int SkXmAutoNegDoneXmac(
54147-SK_AC *pAC, /* adapter context */
54148-SK_IOC IoC, /* IO context */
54149+SK_AC *pAC, /* Adapter Context */
54150+SK_IOC IoC, /* I/O Context */
54151 int Port) /* Port Index (MAC_1 + n) */
54152 {
54153 SK_GEPORT *pPrt;
54154 SK_U16 ResAb; /* Resolved Ability */
54155- SK_U16 LPAb; /* Link Partner Ability */
54156+ SK_U16 LinkPartAb; /* Link Partner Ability */
54157
54158 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54159 ("AutoNegDoneXmac, Port %d\n", Port));
54160@@ -2953,15 +3530,15 @@
54161 pPrt = &pAC->GIni.GP[Port];
54162
54163 /* Get PHY parameters */
54164- SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LPAb);
54165+ SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LinkPartAb);
54166 SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_RES_ABI, &ResAb);
54167
54168- if ((LPAb & PHY_X_AN_RFB) != 0) {
54169+ if ((LinkPartAb & PHY_X_AN_RFB) != 0) {
54170 /* At least one of the remote fault bit is set */
54171- /* Error */
54172- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54173+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54174 ("AutoNegFail: Remote fault bit set Port %d\n", Port));
54175 pPrt->PAutoNegFail = SK_TRUE;
54176+
54177 return(SK_AND_OTHER);
54178 }
54179
54180@@ -2974,9 +3551,10 @@
54181 }
54182 else {
54183 /* Error */
54184- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54185+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54186 ("AutoNegFail: Duplex mode mismatch Port %d\n", Port));
54187 pPrt->PAutoNegFail = SK_TRUE;
54188+
54189 return(SK_AND_DUP_CAP);
54190 }
54191
54192@@ -2984,19 +3562,19 @@
54193 /* We are NOT using chapter 4.23 of the Xaqti manual */
54194 /* We are using IEEE 802.3z/D5.0 Table 37-4 */
54195 if ((pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYMMETRIC ||
54196- pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) &&
54197- (LPAb & PHY_X_P_SYM_MD) != 0) {
54198+ pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) &&
54199+ (LinkPartAb & PHY_X_P_SYM_MD) != 0) {
54200 /* Symmetric PAUSE */
54201 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC;
54202 }
54203 else if (pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM &&
54204- (LPAb & PHY_X_RS_PAUSE) == PHY_X_P_ASYM_MD) {
54205- /* Enable PAUSE receive, disable PAUSE transmit */
54206+ (LinkPartAb & PHY_X_RS_PAUSE) == PHY_X_P_ASYM_MD) {
54207+ /* enable PAUSE receive, disable PAUSE transmit */
54208 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND;
54209 }
54210 else if (pPrt->PFlowCtrlMode == SK_FLOW_MODE_LOC_SEND &&
54211- (LPAb & PHY_X_RS_PAUSE) == PHY_X_P_BOTH_MD) {
54212- /* Disable PAUSE receive, enable PAUSE transmit */
54213+ (LinkPartAb & PHY_X_RS_PAUSE) == PHY_X_P_BOTH_MD) {
54214+ /* disable PAUSE receive, enable PAUSE transmit */
54215 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND;
54216 }
54217 else {
54218@@ -3018,41 +3596,40 @@
54219 *
54220 * Returns:
54221 * SK_AND_OK o.k.
54222- * SK_AND_DUP_CAP Duplex capability error happened
54223- * SK_AND_OTHER Other error happened
54224+ * SK_AND_DUP_CAP Duplex capability error happened
54225+ * SK_AND_OTHER Other error happened
54226 */
54227 static int SkXmAutoNegDoneBcom(
54228-SK_AC *pAC, /* adapter context */
54229-SK_IOC IoC, /* IO context */
54230+SK_AC *pAC, /* Adapter Context */
54231+SK_IOC IoC, /* I/O Context */
54232 int Port) /* Port Index (MAC_1 + n) */
54233 {
54234 SK_GEPORT *pPrt;
54235- SK_U16 LPAb; /* Link Partner Ability */
54236- SK_U16 AuxStat; /* Auxiliary Status */
54237-
54238 #ifdef TEST_ONLY
54239-01-Sep-2000 RA;:;:
54240 SK_U16 ResAb; /* Resolved Ability */
54241-#endif /* 0 */
54242+#endif
54243+ SK_U16 LinkPartAb; /* Link Partner Ability */
54244+ SK_U16 AuxStat; /* Auxiliary Status */
54245+
54246
54247 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54248 ("AutoNegDoneBcom, Port %d\n", Port));
54249 pPrt = &pAC->GIni.GP[Port];
54250
54251 /* Get PHY parameters */
54252- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &LPAb);
54253+ SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &LinkPartAb);
54254 #ifdef TEST_ONLY
54255-01-Sep-2000 RA;:;:
54256 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ResAb);
54257-#endif /* 0 */
54258-
54259+#endif
54260+
54261 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_STAT, &AuxStat);
54262
54263- if ((LPAb & PHY_B_AN_RF) != 0) {
54264+ if ((LinkPartAb & PHY_B_AN_RF) != 0) {
54265 /* Remote fault bit is set: Error */
54266- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54267+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54268 ("AutoNegFail: Remote fault bit set Port %d\n", Port));
54269 pPrt->PAutoNegFail = SK_TRUE;
54270+
54271 return(SK_AND_OTHER);
54272 }
54273
54274@@ -3065,26 +3642,26 @@
54275 }
54276 else {
54277 /* Error */
54278- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54279+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54280 ("AutoNegFail: Duplex mode mismatch Port %d\n", Port));
54281 pPrt->PAutoNegFail = SK_TRUE;
54282+
54283 return(SK_AND_DUP_CAP);
54284 }
54285-
54286+
54287 #ifdef TEST_ONLY
54288-01-Sep-2000 RA;:;:
54289 /* Check Master/Slave resolution */
54290 if ((ResAb & PHY_B_1000S_MSF) != 0) {
54291- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54292+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54293 ("Master/Slave Fault Port %d\n", Port));
54294 pPrt->PAutoNegFail = SK_TRUE;
54295 pPrt->PMSStatus = SK_MS_STAT_FAULT;
54296 return(SK_AND_OTHER);
54297 }
54298-
54299+
54300 pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ?
54301 SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE;
54302-#endif /* 0 */
54303+#endif
54304
54305 /* Check PAUSE mismatch ??? */
54306 /* We are using IEEE 802.3z/D5.0 Table 37-4 */
54307@@ -3093,11 +3670,11 @@
54308 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC;
54309 }
54310 else if ((AuxStat & PHY_B_AS_PAUSE_MSK) == PHY_B_AS_PRR) {
54311- /* Enable PAUSE receive, disable PAUSE transmit */
54312+ /* enable PAUSE receive, disable PAUSE transmit */
54313 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND;
54314 }
54315 else if ((AuxStat & PHY_B_AS_PAUSE_MSK) == PHY_B_AS_PRT) {
54316- /* Disable PAUSE receive, enable PAUSE transmit */
54317+ /* disable PAUSE receive, enable PAUSE transmit */
54318 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND;
54319 }
54320 else {
54321@@ -3111,6 +3688,7 @@
54322 #endif /* GENESIS */
54323
54324
54325+#ifndef SK_SLIM
54326 #ifdef YUKON
54327 /******************************************************************************
54328 *
54329@@ -3121,102 +3699,148 @@
54330 *
54331 * Returns:
54332 * SK_AND_OK o.k.
54333- * SK_AND_DUP_CAP Duplex capability error happened
54334- * SK_AND_OTHER Other error happened
54335+ * SK_AND_DUP_CAP Duplex capability error happened
54336+ * SK_AND_OTHER Other error happened
54337 */
54338 static int SkGmAutoNegDoneMarv(
54339-SK_AC *pAC, /* adapter context */
54340-SK_IOC IoC, /* IO context */
54341+SK_AC *pAC, /* Adapter Context */
54342+SK_IOC IoC, /* I/O Context */
54343 int Port) /* Port Index (MAC_1 + n) */
54344 {
54345 SK_GEPORT *pPrt;
54346- SK_U16 LPAb; /* Link Partner Ability */
54347 SK_U16 ResAb; /* Resolved Ability */
54348+ SK_U16 LinkPartAb; /* Link Partner Ability */
54349 SK_U16 AuxStat; /* Auxiliary Status */
54350+ SK_U8 PauseMode; /* Pause Mode */
54351+
54352+ /* set Pause On */
54353+ PauseMode = (SK_U8)GMC_PAUSE_ON;
54354
54355 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54356 ("AutoNegDoneMarv, Port %d\n", Port));
54357+
54358 pPrt = &pAC->GIni.GP[Port];
54359
54360 /* Get PHY parameters */
54361- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_LP, &LPAb);
54362+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_LP, &LinkPartAb);
54363 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54364- ("Link P.Abil.=0x%04X\n", LPAb));
54365-
54366- if ((LPAb & PHY_M_AN_RF) != 0) {
54367- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54368+ ("Link P.Abil. = 0x%04X\n", LinkPartAb));
54369+
54370+ if ((LinkPartAb & PHY_M_AN_RF) != 0) {
54371+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54372 ("AutoNegFail: Remote fault bit set Port %d\n", Port));
54373 pPrt->PAutoNegFail = SK_TRUE;
54374+
54375 return(SK_AND_OTHER);
54376 }
54377
54378- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb);
54379-
54380- /* Check Master/Slave resolution */
54381- if ((ResAb & PHY_B_1000S_MSF) != 0) {
54382+ /* Read PHY Auto-Negotiation Expansion */
54383+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_EXP, &LinkPartAb);
54384+
54385+ if ((LinkPartAb & PHY_ANE_LP_CAP) == 0) {
54386+
54387 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54388- ("Master/Slave Fault Port %d\n", Port));
54389- pPrt->PAutoNegFail = SK_TRUE;
54390- pPrt->PMSStatus = SK_MS_STAT_FAULT;
54391- return(SK_AND_OTHER);
54392+ ("Link Partner not Auto-Neg. able, AN Exp.: 0x%04X\n", LinkPartAb));
54393+ }
54394+
54395+ if ((pPrt->PLinkSpeedCap & SK_LSPEED_CAP_1000MBPS) != 0) {
54396+
54397+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb);
54398+
54399+ /* Check Master/Slave resolution */
54400+ if ((ResAb & PHY_B_1000S_MSF) != 0) {
54401+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54402+ ("Master/Slave Fault Port %d\n", Port));
54403+ pPrt->PAutoNegFail = SK_TRUE;
54404+ pPrt->PMSStatus = SK_MS_STAT_FAULT;
54405+ return(SK_AND_OTHER);
54406+ }
54407+
54408+ pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ?
54409+ (SK_U8)SK_MS_STAT_MASTER : (SK_U8)SK_MS_STAT_SLAVE;
54410 }
54411-
54412- pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ?
54413- (SK_U8)SK_MS_STAT_MASTER : (SK_U8)SK_MS_STAT_SLAVE;
54414-
54415+
54416 /* Read PHY Specific Status */
54417 SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &AuxStat);
54418-
54419+
54420 /* Check Speed & Duplex resolved */
54421 if ((AuxStat & PHY_M_PS_SPDUP_RES) == 0) {
54422- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54423+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54424 ("AutoNegFail: Speed & Duplex not resolved, Port %d\n", Port));
54425 pPrt->PAutoNegFail = SK_TRUE;
54426 pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
54427+
54428 return(SK_AND_DUP_CAP);
54429 }
54430-
54431- if ((AuxStat & PHY_M_PS_FULL_DUP) != 0) {
54432- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOFULL;
54433- }
54434- else {
54435- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF;
54436- }
54437-
54438- /* Check PAUSE mismatch ??? */
54439- /* We are using IEEE 802.3z/D5.0 Table 37-4 */
54440- if ((AuxStat & PHY_M_PS_PAUSE_MSK) == PHY_M_PS_PAUSE_MSK) {
54441- /* Symmetric PAUSE */
54442- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC;
54443- }
54444- else if ((AuxStat & PHY_M_PS_PAUSE_MSK) == PHY_M_PS_RX_P_EN) {
54445- /* Enable PAUSE receive, disable PAUSE transmit */
54446- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND;
54447- }
54448- else if ((AuxStat & PHY_M_PS_PAUSE_MSK) == PHY_M_PS_TX_P_EN) {
54449- /* Disable PAUSE receive, enable PAUSE transmit */
54450- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND;
54451+
54452+ pPrt->PLinkModeStatus = (SK_U8)(((AuxStat & PHY_M_PS_FULL_DUP) != 0) ?
54453+ SK_LMODE_STAT_AUTOFULL : SK_LMODE_STAT_AUTOHALF);
54454+
54455+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) {
54456+ /* set used link speed */
54457+ pPrt->PLinkSpeedUsed = (SK_U8)(((AuxStat & PHY_M_PS_SPEED_100) != 0) ?
54458+ SK_LSPEED_STAT_100MBPS : SK_LSPEED_STAT_10MBPS);
54459 }
54460 else {
54461- /* PAUSE mismatch -> no PAUSE */
54462- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE;
54463+ /* set used link speed */
54464+ switch ((unsigned)(AuxStat & PHY_M_PS_SPEED_MSK)) {
54465+ case (unsigned)PHY_M_PS_SPEED_1000:
54466+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
54467+ break;
54468+ case PHY_M_PS_SPEED_100:
54469+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS;
54470+ break;
54471+ default:
54472+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_10MBPS;
54473+ }
54474+
54475+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL ||
54476+ pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U) {
54477+ /* Tx & Rx Pause Enabled bits are at 9..8 */
54478+ AuxStat >>= 6;
54479+
54480+ if (!pAC->GIni.GICopperType) {
54481+ /* always 1000 Mbps on fiber */
54482+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
54483+ }
54484+ }
54485+
54486+ AuxStat &= PHY_M_PS_PAUSE_MSK;
54487+ /* We are using IEEE 802.3z/D5.0 Table 37-4 */
54488+ if (AuxStat == PHY_M_PS_PAUSE_MSK) {
54489+ /* Symmetric PAUSE */
54490+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_SYMMETRIC;
54491+ }
54492+ else if (AuxStat == PHY_M_PS_RX_P_EN) {
54493+ /* enable PAUSE receive, disable PAUSE transmit */
54494+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND;
54495+ }
54496+ else if (AuxStat == PHY_M_PS_TX_P_EN) {
54497+ /* disable PAUSE receive, enable PAUSE transmit */
54498+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND;
54499+ }
54500+ else {
54501+ /* PAUSE mismatch -> no PAUSE */
54502+ pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE;
54503+ }
54504 }
54505-
54506- /* set used link speed */
54507- switch ((unsigned)(AuxStat & PHY_M_PS_SPEED_MSK)) {
54508- case (unsigned)PHY_M_PS_SPEED_1000:
54509- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
54510- break;
54511- case PHY_M_PS_SPEED_100:
54512- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS;
54513- break;
54514- default:
54515- pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_10MBPS;
54516+
54517+ if ((pPrt->PFlowCtrlStatus == SK_FLOW_STAT_NONE) ||
54518+ /* disable Pause also for 10/100 Mbps in half duplex mode */
54519+ ((pAC->GIni.GIChipId != CHIP_ID_YUKON_EC_U) &&
54520+ (pPrt->PLinkSpeedUsed < (SK_U8)SK_LSPEED_STAT_1000MBPS) &&
54521+ pPrt->PLinkModeStatus == (SK_U8)SK_LMODE_STAT_AUTOHALF)) {
54522+
54523+ /* set Pause Off */
54524+ PauseMode = (SK_U8)GMC_PAUSE_OFF;
54525 }
54526
54527+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_CTRL), PauseMode);
54528+
54529 return(SK_AND_OK);
54530 } /* SkGmAutoNegDoneMarv */
54531 #endif /* YUKON */
54532+#endif /* !SK_SLIM */
54533
54534
54535 #ifdef OTHER_PHY
54536@@ -3229,17 +3853,17 @@
54537 *
54538 * Returns:
54539 * SK_AND_OK o.k.
54540- * SK_AND_DUP_CAP Duplex capability error happened
54541- * SK_AND_OTHER Other error happened
54542+ * SK_AND_DUP_CAP Duplex capability error happened
54543+ * SK_AND_OTHER Other error happened
54544 */
54545 static int SkXmAutoNegDoneLone(
54546-SK_AC *pAC, /* adapter context */
54547-SK_IOC IoC, /* IO context */
54548+SK_AC *pAC, /* Adapter Context */
54549+SK_IOC IoC, /* I/O Context */
54550 int Port) /* Port Index (MAC_1 + n) */
54551 {
54552 SK_GEPORT *pPrt;
54553 SK_U16 ResAb; /* Resolved Ability */
54554- SK_U16 LPAb; /* Link Partner Ability */
54555+ SK_U16 LinkPartAb; /* Link Partner Ability */
54556 SK_U16 QuickStat; /* Auxiliary Status */
54557
54558 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54559@@ -3247,16 +3871,16 @@
54560 pPrt = &pAC->GIni.GP[Port];
54561
54562 /* Get PHY parameters */
54563- SkXmPhyRead(pAC, IoC, Port, PHY_LONE_AUNE_LP, &LPAb);
54564+ SkXmPhyRead(pAC, IoC, Port, PHY_LONE_AUNE_LP, &LinkPartAb);
54565 SkXmPhyRead(pAC, IoC, Port, PHY_LONE_1000T_STAT, &ResAb);
54566 SkXmPhyRead(pAC, IoC, Port, PHY_LONE_Q_STAT, &QuickStat);
54567
54568- if ((LPAb & PHY_L_AN_RF) != 0) {
54569+ if ((LinkPartAb & PHY_L_AN_RF) != 0) {
54570 /* Remote fault bit is set */
54571- /* Error */
54572- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54573+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54574 ("AutoNegFail: Remote fault bit set Port %d\n", Port));
54575 pPrt->PAutoNegFail = SK_TRUE;
54576+
54577 return(SK_AND_OTHER);
54578 }
54579
54580@@ -3267,28 +3891,25 @@
54581 else {
54582 pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF;
54583 }
54584-
54585+
54586 /* Check Master/Slave resolution */
54587 if ((ResAb & PHY_L_1000S_MSF) != 0) {
54588 /* Error */
54589- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54590+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
54591 ("Master/Slave Fault Port %d\n", Port));
54592 pPrt->PAutoNegFail = SK_TRUE;
54593 pPrt->PMSStatus = SK_MS_STAT_FAULT;
54594 return(SK_AND_OTHER);
54595 }
54596- else if (ResAb & PHY_L_1000S_MSR) {
54597- pPrt->PMSStatus = SK_MS_STAT_MASTER;
54598- }
54599- else {
54600- pPrt->PMSStatus = SK_MS_STAT_SLAVE;
54601- }
54602+
54603+ pPrt->PMSStatus = ((ResAb & PHY_L_1000S_MSR) != 0) ?
54604+ (SK_U8)SK_MS_STAT_MASTER : (SK_U8)SK_MS_STAT_SLAVE;
54605
54606 /* Check PAUSE mismatch */
54607 /* We are using IEEE 802.3z/D5.0 Table 37-4 */
54608 /* we must manually resolve the abilities here */
54609 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE;
54610-
54611+
54612 switch (pPrt->PFlowCtrlMode) {
54613 case SK_FLOW_MODE_NONE:
54614 /* default */
54615@@ -3296,7 +3917,7 @@
54616 case SK_FLOW_MODE_LOC_SEND:
54617 if ((QuickStat & (PHY_L_QS_PAUSE | PHY_L_QS_AS_PAUSE)) ==
54618 (PHY_L_QS_PAUSE | PHY_L_QS_AS_PAUSE)) {
54619- /* Disable PAUSE receive, enable PAUSE transmit */
54620+ /* disable PAUSE receive, enable PAUSE transmit */
54621 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_LOC_SEND;
54622 }
54623 break;
54624@@ -3309,7 +3930,7 @@
54625 case SK_FLOW_MODE_SYM_OR_REM:
54626 if ((QuickStat & (PHY_L_QS_PAUSE | PHY_L_QS_AS_PAUSE)) ==
54627 PHY_L_QS_AS_PAUSE) {
54628- /* Enable PAUSE receive, disable PAUSE transmit */
54629+ /* enable PAUSE receive, disable PAUSE transmit */
54630 pPrt->PFlowCtrlStatus = SK_FLOW_STAT_REM_SEND;
54631 }
54632 else if ((QuickStat & PHY_L_QS_PAUSE) != 0) {
54633@@ -3321,7 +3942,7 @@
54634 SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_HWI_E016,
54635 SKERR_HWI_E016MSG);
54636 }
54637-
54638+
54639 return(SK_AND_OK);
54640 } /* SkXmAutoNegDoneLone */
54641
54642@@ -3335,12 +3956,12 @@
54643 *
54644 * Returns:
54645 * SK_AND_OK o.k.
54646- * SK_AND_DUP_CAP Duplex capability error happened
54647- * SK_AND_OTHER Other error happened
54648+ * SK_AND_DUP_CAP Duplex capability error happened
54649+ * SK_AND_OTHER Other error happened
54650 */
54651 static int SkXmAutoNegDoneNat(
54652-SK_AC *pAC, /* adapter context */
54653-SK_IOC IoC, /* IO context */
54654+SK_AC *pAC, /* Adapter Context */
54655+SK_IOC IoC, /* I/O Context */
54656 int Port) /* Port Index (MAC_1 + n) */
54657 {
54658 /* todo: National */
54659@@ -3357,12 +3978,12 @@
54660 *
54661 * Returns:
54662 * SK_AND_OK o.k.
54663- * SK_AND_DUP_CAP Duplex capability error happened
54664- * SK_AND_OTHER Other error happened
54665+ * SK_AND_DUP_CAP Duplex capability error happened
54666+ * SK_AND_OTHER Other error happened
54667 */
54668-int SkMacAutoNegDone(
54669-SK_AC *pAC, /* adapter context */
54670-SK_IOC IoC, /* IO context */
54671+int SkMacAutoNegDone(
54672+SK_AC *pAC, /* Adapter Context */
54673+SK_IOC IoC, /* I/O Context */
54674 int Port) /* Port Index (MAC_1 + n) */
54675 {
54676 SK_GEPORT *pPrt;
54677@@ -3374,9 +3995,9 @@
54678
54679 #ifdef GENESIS
54680 if (pAC->GIni.GIGenesis) {
54681-
54682+
54683 switch (pPrt->PhyType) {
54684-
54685+
54686 case SK_PHY_XMAC:
54687 Rtv = SkXmAutoNegDoneXmac(pAC, IoC, Port);
54688 break;
54689@@ -3396,30 +4017,33 @@
54690 }
54691 }
54692 #endif /* GENESIS */
54693-
54694+
54695+#ifndef SK_SLIM
54696 #ifdef YUKON
54697 if (pAC->GIni.GIYukon) {
54698-
54699+
54700 Rtv = SkGmAutoNegDoneMarv(pAC, IoC, Port);
54701 }
54702 #endif /* YUKON */
54703-
54704+
54705 if (Rtv != SK_AND_OK) {
54706 return(Rtv);
54707 }
54708
54709 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
54710 ("AutoNeg done Port %d\n", Port));
54711-
54712+
54713 /* We checked everything and may now enable the link */
54714 pPrt->PAutoNegFail = SK_FALSE;
54715+#endif /* !SK_SLIM */
54716
54717 SkMacRxTxEnable(pAC, IoC, Port);
54718-
54719+
54720 return(SK_AND_OK);
54721 } /* SkMacAutoNegDone */
54722
54723
54724+#ifndef SK_SLIM
54725 #ifdef GENESIS
54726 /******************************************************************************
54727 *
54728@@ -3433,7 +4057,7 @@
54729 */
54730 static void SkXmSetRxTxEn(
54731 SK_AC *pAC, /* Adapter Context */
54732-SK_IOC IoC, /* IO context */
54733+SK_IOC IoC, /* I/O Context */
54734 int Port, /* Port Index (MAC_1 + n) */
54735 int Para) /* Parameter to set: MAC or PHY LoopBack, Duplex Mode */
54736 {
54737@@ -3458,7 +4082,7 @@
54738 Word &= ~XM_MMU_GMII_LOOP;
54739 break;
54740 }
54741-
54742+
54743 switch (Para & (SK_PHY_FULLD_ON | SK_PHY_FULLD_OFF)) {
54744 case SK_PHY_FULLD_ON:
54745 Word |= XM_MMU_GMII_FD;
54746@@ -3467,7 +4091,7 @@
54747 Word &= ~XM_MMU_GMII_FD;
54748 break;
54749 }
54750-
54751+
54752 XM_OUT16(IoC, Port, XM_MMU_CMD, Word | XM_MMU_ENA_RX | XM_MMU_ENA_TX);
54753
54754 /* dummy read to ensure writing */
54755@@ -3490,12 +4114,12 @@
54756 */
54757 static void SkGmSetRxTxEn(
54758 SK_AC *pAC, /* Adapter Context */
54759-SK_IOC IoC, /* IO context */
54760+SK_IOC IoC, /* I/O Context */
54761 int Port, /* Port Index (MAC_1 + n) */
54762 int Para) /* Parameter to set: MAC LoopBack, Duplex Mode */
54763 {
54764 SK_U16 Ctrl;
54765-
54766+
54767 GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl);
54768
54769 switch (Para & (SK_MAC_LOOPB_ON | SK_MAC_LOOPB_OFF)) {
54770@@ -3515,18 +4139,18 @@
54771 Ctrl &= ~GM_GPCR_DUP_FULL;
54772 break;
54773 }
54774-
54775- GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Ctrl | GM_GPCR_RX_ENA |
54776- GM_GPCR_TX_ENA));
54777
54778+ GM_OUT16(IoC, Port, GM_GP_CTRL, Ctrl | GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
54779+
54780+#ifdef XXX
54781 /* dummy read to ensure writing */
54782 GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl);
54783+#endif /* XXX */
54784
54785 } /* SkGmSetRxTxEn */
54786 #endif /* YUKON */
54787
54788
54789-#ifndef SK_SLIM
54790 /******************************************************************************
54791 *
54792 * SkMacSetRxTxEn() - Special Set Rx/Tx Enable and parameters
54793@@ -3537,20 +4161,20 @@
54794 */
54795 void SkMacSetRxTxEn(
54796 SK_AC *pAC, /* Adapter Context */
54797-SK_IOC IoC, /* IO context */
54798+SK_IOC IoC, /* I/O Context */
54799 int Port, /* Port Index (MAC_1 + n) */
54800 int Para)
54801 {
54802 #ifdef GENESIS
54803 if (pAC->GIni.GIGenesis) {
54804-
54805+
54806 SkXmSetRxTxEn(pAC, IoC, Port, Para);
54807 }
54808 #endif /* GENESIS */
54809-
54810+
54811 #ifdef YUKON
54812 if (pAC->GIni.GIYukon) {
54813-
54814+
54815 SkGmSetRxTxEn(pAC, IoC, Port, Para);
54816 }
54817 #endif /* YUKON */
54818@@ -3570,8 +4194,8 @@
54819 * != 0 Error happened
54820 */
54821 int SkMacRxTxEnable(
54822-SK_AC *pAC, /* adapter context */
54823-SK_IOC IoC, /* IO context */
54824+SK_AC *pAC, /* Adapter Context */
54825+SK_IOC IoC, /* I/O Context */
54826 int Port) /* Port Index (MAC_1 + n) */
54827 {
54828 SK_GEPORT *pPrt;
54829@@ -3589,9 +4213,9 @@
54830 }
54831
54832 if ((pPrt->PLinkMode == SK_LMODE_AUTOHALF ||
54833- pPrt->PLinkMode == SK_LMODE_AUTOFULL ||
54834- pPrt->PLinkMode == SK_LMODE_AUTOBOTH) &&
54835- pPrt->PAutoNegFail) {
54836+ pPrt->PLinkMode == SK_LMODE_AUTOFULL ||
54837+ pPrt->PLinkMode == SK_LMODE_AUTOBOTH) &&
54838+ pPrt->PAutoNegFail) {
54839 /* Auto-negotiation is not done or failed */
54840 return(0);
54841 }
54842@@ -3600,9 +4224,9 @@
54843 if (pAC->GIni.GIGenesis) {
54844 /* set Duplex Mode and Pause Mode */
54845 SkXmInitDupMd(pAC, IoC, Port);
54846-
54847+
54848 SkXmInitPauseMd(pAC, IoC, Port);
54849-
54850+
54851 /*
54852 * Initialize the Interrupt Mask Register. Default IRQs are...
54853 * - Link Asynchronous Event
54854@@ -3618,23 +4242,23 @@
54855 /* add IRQ for Receive FIFO Overflow */
54856 IntMask &= ~XM_IS_RXF_OV;
54857 #endif /* DEBUG */
54858-
54859+
54860 if (pPrt->PhyType != SK_PHY_XMAC) {
54861 /* disable GP0 interrupt bit */
54862 IntMask |= XM_IS_INP_ASS;
54863 }
54864 XM_OUT16(IoC, Port, XM_IMSK, IntMask);
54865-
54866+
54867 /* get MMU Command Reg. */
54868 XM_IN16(IoC, Port, XM_MMU_CMD, &Reg);
54869-
54870+
54871 if (pPrt->PhyType != SK_PHY_XMAC &&
54872 (pPrt->PLinkModeStatus == SK_LMODE_STAT_FULL ||
54873 pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOFULL)) {
54874 /* set to Full Duplex */
54875 Reg |= XM_MMU_GMII_FD;
54876 }
54877-
54878+
54879 switch (pPrt->PhyType) {
54880 case SK_PHY_BCOM:
54881 /*
54882@@ -3644,7 +4268,7 @@
54883 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &SWord);
54884 SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUX_CTRL,
54885 (SK_U16)(SWord & ~PHY_B_AC_DIS_PM));
54886- SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_INT_MASK,
54887+ SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_INT_MASK,
54888 (SK_U16)PHY_B_DEF_MSK);
54889 break;
54890 #ifdef OTHER_PHY
54891@@ -3658,12 +4282,12 @@
54892 break;
54893 #endif /* OTHER_PHY */
54894 }
54895-
54896+
54897 /* enable Rx/Tx */
54898 XM_OUT16(IoC, Port, XM_MMU_CMD, Reg | XM_MMU_ENA_RX | XM_MMU_ENA_TX);
54899 }
54900 #endif /* GENESIS */
54901-
54902+
54903 #ifdef YUKON
54904 if (pAC->GIni.GIYukon) {
54905 /*
54906@@ -3674,34 +4298,34 @@
54907 */
54908 IntMask = GMAC_DEF_MSK;
54909
54910-#ifdef DEBUG
54911+#if (defined(DEBUG) || defined(YUK2)) && (!defined(SK_SLIM))
54912 /* add IRQ for Receive FIFO Overrun */
54913 IntMask |= GM_IS_RX_FF_OR;
54914-#endif /* DEBUG */
54915-
54916- SK_OUT8(IoC, GMAC_IRQ_MSK, (SK_U8)IntMask);
54917-
54918+#endif
54919+
54920+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_IRQ_MSK), (SK_U8)IntMask);
54921+
54922 /* get General Purpose Control */
54923 GM_IN16(IoC, Port, GM_GP_CTRL, &Reg);
54924-
54925+
54926 if (pPrt->PLinkModeStatus == SK_LMODE_STAT_FULL ||
54927 pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOFULL) {
54928 /* set to Full Duplex */
54929 Reg |= GM_GPCR_DUP_FULL;
54930 }
54931-
54932+
54933 /* enable Rx/Tx */
54934- GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Reg | GM_GPCR_RX_ENA |
54935- GM_GPCR_TX_ENA));
54936+ GM_OUT16(IoC, Port, GM_GP_CTRL, Reg | GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
54937
54938-#ifndef VCPU
54939- /* Enable all PHY interrupts */
54940- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK,
54941- (SK_U16)PHY_M_DEF_MSK);
54942-#endif /* VCPU */
54943+#ifdef XXX
54944+ /* dummy read to ensure writing */
54945+ GM_IN16(IoC, Port, GM_GP_CTRL, &Reg);
54946+#endif /* XXX */
54947 }
54948 #endif /* YUKON */
54949-
54950+
54951+ pAC->GIni.GP[Port].PState = SK_PRT_RUN;
54952+
54953 return(0);
54954
54955 } /* SkMacRxTxEnable */
54956@@ -3717,33 +4341,38 @@
54957 */
54958 void SkMacRxTxDisable(
54959 SK_AC *pAC, /* Adapter Context */
54960-SK_IOC IoC, /* IO context */
54961+SK_IOC IoC, /* I/O Context */
54962 int Port) /* Port Index (MAC_1 + n) */
54963 {
54964 SK_U16 Word;
54965
54966 #ifdef GENESIS
54967 if (pAC->GIni.GIGenesis) {
54968-
54969+
54970 XM_IN16(IoC, Port, XM_MMU_CMD, &Word);
54971-
54972- XM_OUT16(IoC, Port, XM_MMU_CMD, Word & ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX));
54973-
54974+
54975+ Word &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX);
54976+
54977+ XM_OUT16(IoC, Port, XM_MMU_CMD, Word);
54978+
54979 /* dummy read to ensure writing */
54980 XM_IN16(IoC, Port, XM_MMU_CMD, &Word);
54981 }
54982 #endif /* GENESIS */
54983-
54984+
54985 #ifdef YUKON
54986 if (pAC->GIni.GIYukon) {
54987-
54988+
54989 GM_IN16(IoC, Port, GM_GP_CTRL, &Word);
54990
54991- GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Word & ~(GM_GPCR_RX_ENA |
54992- GM_GPCR_TX_ENA)));
54993+ Word &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
54994
54995+ GM_OUT16(IoC, Port, GM_GP_CTRL, Word);
54996+
54997+#ifdef XXX
54998 /* dummy read to ensure writing */
54999 GM_IN16(IoC, Port, GM_GP_CTRL, &Word);
55000+#endif /* XXX */
55001 }
55002 #endif /* YUKON */
55003
55004@@ -3760,7 +4389,7 @@
55005 */
55006 void SkMacIrqDisable(
55007 SK_AC *pAC, /* Adapter Context */
55008-SK_IOC IoC, /* IO context */
55009+SK_IOC IoC, /* I/O Context */
55010 int Port) /* Port Index (MAC_1 + n) */
55011 {
55012 SK_GEPORT *pPrt;
55013@@ -3772,18 +4401,18 @@
55014
55015 #ifdef GENESIS
55016 if (pAC->GIni.GIGenesis) {
55017-
55018+
55019 /* disable all XMAC IRQs */
55020- XM_OUT16(IoC, Port, XM_IMSK, 0xffff);
55021-
55022- /* Disable all PHY interrupts */
55023+ XM_OUT16(IoC, Port, XM_IMSK, 0xffff);
55024+
55025+ /* disable all PHY interrupts */
55026 switch (pPrt->PhyType) {
55027 case SK_PHY_BCOM:
55028 /* Make sure that PHY is initialized */
55029 if (pPrt->PState != SK_PRT_RESET) {
55030 /* NOT allowed if BCOM is in RESET state */
55031 /* Workaround BCOM Errata (#10523) all BCom */
55032- /* Disable Power Management if link is down */
55033+ /* disable Power Management if link is down */
55034 SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &Word);
55035 SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUX_CTRL,
55036 (SK_U16)(Word | PHY_B_AC_DIS_PM));
55037@@ -3802,16 +4431,16 @@
55038 }
55039 }
55040 #endif /* GENESIS */
55041-
55042+
55043 #ifdef YUKON
55044 if (pAC->GIni.GIYukon) {
55045 /* disable all GMAC IRQs */
55046- SK_OUT8(IoC, GMAC_IRQ_MSK, 0);
55047-
55048+ SK_OUT8(IoC, MR_ADDR(Port, GMAC_IRQ_MSK), 0);
55049+
55050 #ifndef VCPU
55051- /* Disable all PHY interrupts */
55052+ /* disable all PHY interrupts */
55053 SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, 0);
55054-#endif /* VCPU */
55055+#endif /* !VCPU */
55056 }
55057 #endif /* YUKON */
55058
55059@@ -3823,29 +4452,72 @@
55060 *
55061 * SkXmSendCont() - Enable / Disable Send Continuous Mode
55062 *
55063- * Description: enable / disable Send Continuous Mode on XMAC
55064+ * Description: enable / disable Send Continuous Mode on XMAC resp.
55065+ * Packet Generation on GPHY
55066 *
55067 * Returns:
55068 * nothing
55069 */
55070 void SkXmSendCont(
55071-SK_AC *pAC, /* adapter context */
55072-SK_IOC IoC, /* IO context */
55073+SK_AC *pAC, /* Adapter Context */
55074+SK_IOC IoC, /* I/O Context */
55075 int Port, /* Port Index (MAC_1 + n) */
55076 SK_BOOL Enable) /* Enable / Disable */
55077 {
55078+ SK_U16 Reg;
55079+ SK_U16 Save;
55080 SK_U32 MdReg;
55081
55082- XM_IN32(IoC, Port, XM_MODE, &MdReg);
55083+ if (pAC->GIni.GIGenesis) {
55084+ XM_IN32(IoC, Port, XM_MODE, &MdReg);
55085
55086- if (Enable) {
55087- MdReg |= XM_MD_TX_CONT;
55088+ if (Enable) {
55089+ MdReg |= XM_MD_TX_CONT;
55090+ }
55091+ else {
55092+ MdReg &= ~XM_MD_TX_CONT;
55093+ }
55094+ /* setup Mode Register */
55095+ XM_OUT32(IoC, Port, XM_MODE, MdReg);
55096 }
55097 else {
55098- MdReg &= ~XM_MD_TX_CONT;
55099+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) {
55100+ /* select page 18 */
55101+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_ADDR, 18);
55102+
55103+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PAGE_DATA, &Reg);
55104+
55105+ Reg &= ~0x003c; /* clear bits 5..2 */
55106+
55107+ if (Enable) {
55108+ /* enable packet generation, 1518 byte length */
55109+ Reg |= (BIT_5S | BIT_3S);
55110+ }
55111+
55112+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, Reg);
55113+ }
55114+ else if (pAC->GIni.GIChipId == CHIP_ID_YUKON_XL) {
55115+ /* save page register */
55116+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_ADR, &Save);
55117+
55118+ /* select page 6 to access Packet Generation register */
55119+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 6);
55120+
55121+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Reg);
55122+
55123+ Reg &= ~0x003f; /* clear bits 5..0 */
55124+
55125+ if (Enable) {
55126+ /* enable packet generation, 1518 byte length */
55127+ Reg |= (BIT_3S | BIT_1S);
55128+ }
55129+
55130+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Reg);
55131+
55132+ /* restore page register */
55133+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, Save);
55134+ }
55135 }
55136- /* setup Mode Register */
55137- XM_OUT32(IoC, Port, XM_MODE, MdReg);
55138
55139 } /* SkXmSendCont */
55140
55141@@ -3860,8 +4532,8 @@
55142 * nothing
55143 */
55144 void SkMacTimeStamp(
55145-SK_AC *pAC, /* adapter context */
55146-SK_IOC IoC, /* IO context */
55147+SK_AC *pAC, /* Adapter Context */
55148+SK_IOC IoC, /* I/O Context */
55149 int Port, /* Port Index (MAC_1 + n) */
55150 SK_BOOL Enable) /* Enable / Disable */
55151 {
55152@@ -3906,8 +4578,8 @@
55153 * is set true.
55154 */
55155 void SkXmAutoNegLipaXmac(
55156-SK_AC *pAC, /* adapter context */
55157-SK_IOC IoC, /* IO context */
55158+SK_AC *pAC, /* Adapter Context */
55159+SK_IOC IoC, /* I/O Context */
55160 int Port, /* Port Index (MAC_1 + n) */
55161 SK_U16 IStatus) /* Interrupt Status word to analyse */
55162 {
55163@@ -3919,8 +4591,9 @@
55164 (IStatus & (XM_IS_LIPA_RC | XM_IS_RX_PAGE | XM_IS_AND)) != 0) {
55165
55166 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
55167- ("AutoNegLipa: AutoNeg detected on Port %d, IStatus=0x%04X\n",
55168+ ("AutoNegLipa: AutoNeg detected on Port %d, IStatus = 0x%04X\n",
55169 Port, IStatus));
55170+
55171 pPrt->PLipaAutoNeg = SK_LIPA_AUTO;
55172 }
55173 } /* SkXmAutoNegLipaXmac */
55174@@ -3936,8 +4609,8 @@
55175 * is set true.
55176 */
55177 void SkMacAutoNegLipaPhy(
55178-SK_AC *pAC, /* adapter context */
55179-SK_IOC IoC, /* IO context */
55180+SK_AC *pAC, /* Adapter Context */
55181+SK_IOC IoC, /* I/O Context */
55182 int Port, /* Port Index (MAC_1 + n) */
55183 SK_U16 PhyStat) /* PHY Status word to analyse */
55184 {
55185@@ -3949,8 +4622,9 @@
55186 (PhyStat & PHY_ST_AN_OVER) != 0) {
55187
55188 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
55189- ("AutoNegLipa: AutoNeg detected on Port %d, PhyStat=0x%04X\n",
55190+ ("AutoNegLipa: AutoNeg detected on Port %d, PhyStat = 0x%04X\n",
55191 Port, PhyStat));
55192+
55193 pPrt->PLipaAutoNeg = SK_LIPA_AUTO;
55194 }
55195 } /* SkMacAutoNegLipaPhy */
55196@@ -3965,7 +4639,7 @@
55197 *
55198 * Note:
55199 * With an external PHY, some interrupt bits are not meaningfull any more:
55200- * - LinkAsyncEvent (bit #14) XM_IS_LNK_AE
55201+ * - LinkAsyncEvent (bit #14) XM_IS_LNK_AE
55202 * - LinkPartnerReqConfig (bit #10) XM_IS_LIPA_RC
55203 * - Page Received (bit #9) XM_IS_RX_PAGE
55204 * - NextPageLoadedForXmt (bit #8) XM_IS_TX_PAGE
55205@@ -3977,22 +4651,23 @@
55206 * nothing
55207 */
55208 void SkXmIrq(
55209-SK_AC *pAC, /* adapter context */
55210-SK_IOC IoC, /* IO context */
55211+SK_AC *pAC, /* Adapter Context */
55212+SK_IOC IoC, /* I/O Context */
55213 int Port) /* Port Index (MAC_1 + n) */
55214 {
55215 SK_GEPORT *pPrt;
55216- SK_EVPARA Para;
55217 SK_U16 IStatus; /* Interrupt status read from the XMAC */
55218 SK_U16 IStatus2;
55219 #ifdef SK_SLIM
55220- SK_U64 OverflowStatus;
55221-#endif
55222+ SK_U64 OverflowStatus;
55223+#else
55224+ SK_EVPARA Para;
55225+#endif /* SK_SLIM */
55226
55227 pPrt = &pAC->GIni.GP[Port];
55228-
55229+
55230 XM_IN16(IoC, Port, XM_ISRC, &IStatus);
55231-
55232+
55233 /* LinkPartner Auto-negable? */
55234 if (pPrt->PhyType == SK_PHY_XMAC) {
55235 SkXmAutoNegLipaXmac(pAC, IoC, Port, IStatus);
55236@@ -4003,7 +4678,7 @@
55237 XM_IS_RX_PAGE | XM_IS_TX_PAGE |
55238 XM_IS_AND | XM_IS_INP_ASS);
55239 }
55240-
55241+
55242 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
55243 ("XmacIrq Port %d Isr 0x%04X\n", Port, IStatus));
55244
55245@@ -4113,49 +4788,55 @@
55246 * nothing
55247 */
55248 void SkGmIrq(
55249-SK_AC *pAC, /* adapter context */
55250-SK_IOC IoC, /* IO context */
55251+SK_AC *pAC, /* Adapter Context */
55252+SK_IOC IoC, /* I/O Context */
55253 int Port) /* Port Index (MAC_1 + n) */
55254 {
55255 SK_GEPORT *pPrt;
55256 SK_U8 IStatus; /* Interrupt status */
55257 #ifdef SK_SLIM
55258- SK_U64 OverflowStatus;
55259+ SK_U64 OverflowStatus;
55260 #else
55261 SK_EVPARA Para;
55262-#endif
55263+#endif /* SK_SLIM */
55264
55265 pPrt = &pAC->GIni.GP[Port];
55266-
55267- SK_IN8(IoC, GMAC_IRQ_SRC, &IStatus);
55268-
55269+
55270+ SK_IN8(IoC, MR_ADDR(Port, GMAC_IRQ_SRC), &IStatus);
55271+
55272 #ifdef XXX
55273 /* LinkPartner Auto-negable? */
55274 SkMacAutoNegLipaPhy(pAC, IoC, Port, IStatus);
55275 #endif /* XXX */
55276-
55277+
55278 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,
55279- ("GmacIrq Port %d Isr 0x%04X\n", Port, IStatus));
55280+ ("GmacIrq Port %d Isr 0x%02X\n", Port, IStatus));
55281
55282 /* Combined Tx & Rx Counter Overflow SIRQ Event */
55283 if (IStatus & (GM_IS_RX_CO_OV | GM_IS_TX_CO_OV)) {
55284 /* these IRQs will be cleared by reading GMACs register */
55285 #ifdef SK_SLIM
55286- SkGmOverflowStatus(pAC, IoC, Port, IStatus, &OverflowStatus);
55287+ SkGmOverflowStatus(pAC, IoC, Port, (SK_U16)IStatus, &OverflowStatus);
55288 #else
55289 Para.Para32[0] = (SK_U32)Port;
55290 Para.Para32[1] = (SK_U32)IStatus;
55291 SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_SIRQ_OVERFLOW, Para);
55292-#endif
55293+#endif /* SK_SLIM */
55294 }
55295
55296+#ifndef SK_SLIM
55297 if (IStatus & GM_IS_RX_FF_OR) {
55298 /* clear GMAC Rx FIFO Overrun IRQ */
55299 SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_CLI_RX_FO);
55300+
55301+ Para.Para64 = Port;
55302+ SkEventQueue(pAC, SKGE_DRV, SK_DRV_RX_OVERFLOW, Para);
55303+
55304 #ifdef DEBUG
55305 pPrt->PRxOverCnt++;
55306 #endif /* DEBUG */
55307 }
55308+#endif /* !SK_SLIM */
55309
55310 if (IStatus & GM_IS_TX_FF_UR) {
55311 /* clear GMAC Tx FIFO Underrun IRQ */
55312@@ -4185,8 +4866,8 @@
55313 * nothing
55314 */
55315 void SkMacIrq(
55316-SK_AC *pAC, /* adapter context */
55317-SK_IOC IoC, /* IO context */
55318+SK_AC *pAC, /* Adapter Context */
55319+SK_IOC IoC, /* I/O Context */
55320 int Port) /* Port Index (MAC_1 + n) */
55321 {
55322 #ifdef GENESIS
55323@@ -4195,7 +4876,7 @@
55324 SkXmIrq(pAC, IoC, Port);
55325 }
55326 #endif /* GENESIS */
55327-
55328+
55329 #ifdef YUKON
55330 if (pAC->GIni.GIYukon) {
55331 /* IRQ from GMAC */
55332@@ -4222,8 +4903,8 @@
55333 * 1: something went wrong
55334 */
55335 int SkXmUpdateStats(
55336-SK_AC *pAC, /* adapter context */
55337-SK_IOC IoC, /* IO context */
55338+SK_AC *pAC, /* Adapter Context */
55339+SK_IOC IoC, /* I/O Context */
55340 unsigned int Port) /* Port Index (MAC_1 + n) */
55341 {
55342 SK_GEPORT *pPrt;
55343@@ -4245,7 +4926,7 @@
55344 do {
55345
55346 XM_IN16(IoC, Port, XM_STAT_CMD, &StatReg);
55347-
55348+
55349 if (++WaitIndex > 10) {
55350
55351 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E021, SKERR_HWI_E021MSG);
55352@@ -4253,7 +4934,7 @@
55353 return(1);
55354 }
55355 } while ((StatReg & (XM_SC_SNP_TXC | XM_SC_SNP_RXC)) != 0);
55356-
55357+
55358 return(0);
55359 } /* SkXmUpdateStats */
55360
55361@@ -4272,19 +4953,19 @@
55362 * 1: something went wrong
55363 */
55364 int SkXmMacStatistic(
55365-SK_AC *pAC, /* adapter context */
55366-SK_IOC IoC, /* IO context */
55367+SK_AC *pAC, /* Adapter Context */
55368+SK_IOC IoC, /* I/O Context */
55369 unsigned int Port, /* Port Index (MAC_1 + n) */
55370 SK_U16 StatAddr, /* MIB counter base address */
55371-SK_U32 SK_FAR *pVal) /* ptr to return statistic value */
55372+SK_U32 SK_FAR *pVal) /* Pointer to return statistic value */
55373 {
55374 if ((StatAddr < XM_TXF_OK) || (StatAddr > XM_RXF_MAX_SZ)) {
55375-
55376+
55377 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E022, SKERR_HWI_E022MSG);
55378-
55379+
55380 return(1);
55381 }
55382-
55383+
55384 XM_IN32(IoC, Port, StatAddr, pVal);
55385
55386 return(0);
55387@@ -4303,12 +4984,12 @@
55388 * 1: something went wrong
55389 */
55390 int SkXmResetCounter(
55391-SK_AC *pAC, /* adapter context */
55392-SK_IOC IoC, /* IO context */
55393+SK_AC *pAC, /* Adapter Context */
55394+SK_IOC IoC, /* I/O Context */
55395 unsigned int Port) /* Port Index (MAC_1 + n) */
55396 {
55397 XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC);
55398- /* Clear two times according to Errata #3 */
55399+ /* Clear two times according to XMAC Errata #3 */
55400 XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC);
55401
55402 return(0);
55403@@ -4335,11 +5016,11 @@
55404 * 1: something went wrong
55405 */
55406 int SkXmOverflowStatus(
55407-SK_AC *pAC, /* adapter context */
55408-SK_IOC IoC, /* IO context */
55409+SK_AC *pAC, /* Adapter Context */
55410+SK_IOC IoC, /* I/O Context */
55411 unsigned int Port, /* Port Index (MAC_1 + n) */
55412-SK_U16 IStatus, /* Interupt Status from MAC */
55413-SK_U64 SK_FAR *pStatus) /* ptr for return overflow status value */
55414+SK_U16 IStatus, /* Interrupt Status from MAC */
55415+SK_U64 SK_FAR *pStatus) /* Pointer for return overflow status value */
55416 {
55417 SK_U64 Status; /* Overflow status */
55418 SK_U32 RegVal;
55419@@ -4351,7 +5032,7 @@
55420 XM_IN32(IoC, Port, XM_RX_CNT_EV, &RegVal);
55421 Status |= (SK_U64)RegVal << 32;
55422 }
55423-
55424+
55425 if ((IStatus & XM_IS_TXC_OV) != 0) {
55426
55427 XM_IN32(IoC, Port, XM_TX_CNT_EV, &RegVal);
55428@@ -4378,8 +5059,8 @@
55429 * 1: something went wrong
55430 */
55431 int SkGmUpdateStats(
55432-SK_AC *pAC, /* adapter context */
55433-SK_IOC IoC, /* IO context */
55434+SK_AC *pAC, /* Adapter Context */
55435+SK_IOC IoC, /* I/O Context */
55436 unsigned int Port) /* Port Index (MAC_1 + n) */
55437 {
55438 return(0);
55439@@ -4400,24 +5081,27 @@
55440 * 1: something went wrong
55441 */
55442 int SkGmMacStatistic(
55443-SK_AC *pAC, /* adapter context */
55444-SK_IOC IoC, /* IO context */
55445+SK_AC *pAC, /* Adapter Context */
55446+SK_IOC IoC, /* I/O Context */
55447 unsigned int Port, /* Port Index (MAC_1 + n) */
55448 SK_U16 StatAddr, /* MIB counter base address */
55449-SK_U32 SK_FAR *pVal) /* ptr to return statistic value */
55450+SK_U32 SK_FAR *pVal) /* Pointer to return statistic value */
55451 {
55452
55453 if ((StatAddr < GM_RXF_UC_OK) || (StatAddr > GM_TXE_FIFO_UR)) {
55454-
55455+
55456 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E022, SKERR_HWI_E022MSG);
55457-
55458- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
55459+
55460+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
55461 ("SkGmMacStat: wrong MIB counter 0x%04X\n", StatAddr));
55462 return(1);
55463 }
55464-
55465+
55466 GM_IN32(IoC, Port, StatAddr, pVal);
55467
55468+ /* dummy read after GM_IN32() */
55469+ SK_IN16(IoC, B0_RAP, &StatAddr);
55470+
55471 return(0);
55472 } /* SkGmMacStatistic */
55473
55474@@ -4434,8 +5118,8 @@
55475 * 1: something went wrong
55476 */
55477 int SkGmResetCounter(
55478-SK_AC *pAC, /* adapter context */
55479-SK_IOC IoC, /* IO context */
55480+SK_AC *pAC, /* Adapter Context */
55481+SK_IOC IoC, /* I/O Context */
55482 unsigned int Port) /* Port Index (MAC_1 + n) */
55483 {
55484 SK_U16 Reg; /* Phy Address Register */
55485@@ -4446,16 +5130,16 @@
55486
55487 /* set MIB Clear Counter Mode */
55488 GM_OUT16(IoC, Port, GM_PHY_ADDR, Reg | GM_PAR_MIB_CLR);
55489-
55490+
55491 /* read all MIB Counters with Clear Mode set */
55492 for (i = 0; i < GM_MIB_CNT_SIZE; i++) {
55493 /* the reset is performed only when the lower 16 bits are read */
55494 GM_IN16(IoC, Port, GM_MIB_CNT_BASE + 8*i, &Word);
55495 }
55496-
55497+
55498 /* clear MIB Clear Counter Mode */
55499 GM_OUT16(IoC, Port, GM_PHY_ADDR, Reg);
55500-
55501+
55502 return(0);
55503 } /* SkGmResetCounter */
55504
55505@@ -4469,48 +5153,62 @@
55506 * resulting counter overflow status is written to <pStatus>, whereas the
55507 * the following bit coding is used:
55508 * 63:56 - unused
55509- * 55:48 - TxRx interrupt register bit7:0
55510- * 32:47 - Rx interrupt register
55511+ * 55:48 - TxRx interrupt register bit 7:0
55512+ * 47:32 - Rx interrupt register
55513 * 31:24 - unused
55514- * 23:16 - TxRx interrupt register bit15:8
55515- * 15:0 - Tx interrupt register
55516+ * 23:16 - TxRx interrupt register bit 15:8
55517+ * 15: 0 - Tx interrupt register
55518 *
55519 * Returns:
55520 * 0: success
55521 * 1: something went wrong
55522 */
55523 int SkGmOverflowStatus(
55524-SK_AC *pAC, /* adapter context */
55525-SK_IOC IoC, /* IO context */
55526+SK_AC *pAC, /* Adapter Context */
55527+SK_IOC IoC, /* I/O Context */
55528 unsigned int Port, /* Port Index (MAC_1 + n) */
55529-SK_U16 IStatus, /* Interupt Status from MAC */
55530-SK_U64 SK_FAR *pStatus) /* ptr for return overflow status value */
55531+SK_U16 IStatus, /* Interrupt Status from MAC */
55532+SK_U64 SK_FAR *pStatus) /* Pointer for return overflow status value */
55533 {
55534- SK_U64 Status; /* Overflow status */
55535 SK_U16 RegVal;
55536+#ifndef SK_SLIM
55537+ SK_U64 Status; /* Overflow status */
55538
55539 Status = 0;
55540+#endif /* !SK_SLIM */
55541
55542 if ((IStatus & GM_IS_RX_CO_OV) != 0) {
55543 /* this register is self-clearing after read */
55544 GM_IN16(IoC, Port, GM_RX_IRQ_SRC, &RegVal);
55545+
55546+#ifndef SK_SLIM
55547 Status |= (SK_U64)RegVal << 32;
55548+#endif /* !SK_SLIM */
55549 }
55550-
55551+
55552 if ((IStatus & GM_IS_TX_CO_OV) != 0) {
55553 /* this register is self-clearing after read */
55554 GM_IN16(IoC, Port, GM_TX_IRQ_SRC, &RegVal);
55555+
55556+#ifndef SK_SLIM
55557 Status |= (SK_U64)RegVal;
55558+#endif /* !SK_SLIM */
55559 }
55560-
55561+
55562 /* this register is self-clearing after read */
55563 GM_IN16(IoC, Port, GM_TR_IRQ_SRC, &RegVal);
55564+
55565+#ifndef SK_SLIM
55566 /* Rx overflow interrupt register bits (LoByte)*/
55567 Status |= (SK_U64)((SK_U8)RegVal) << 48;
55568 /* Tx overflow interrupt register bits (HiByte)*/
55569 Status |= (SK_U64)(RegVal >> 8) << 16;
55570
55571 *pStatus = Status;
55572+#endif /* !SK_SLIM */
55573+
55574+ /* dummy read after GM_IN16() */
55575+ SK_IN16(IoC, B0_RAP, &RegVal);
55576
55577 return(0);
55578 } /* SkGmOverflowStatus */
55579@@ -4526,60 +5224,118 @@
55580 * gets the results if 'StartTest' is true
55581 *
55582 * NOTE: this test is meaningful only when link is down
55583- *
55584+ *
55585 * Returns:
55586 * 0: success
55587 * 1: no YUKON copper
55588 * 2: test in progress
55589 */
55590 int SkGmCableDiagStatus(
55591-SK_AC *pAC, /* adapter context */
55592-SK_IOC IoC, /* IO context */
55593+SK_AC *pAC, /* Adapter Context */
55594+SK_IOC IoC, /* I/O Context */
55595 int Port, /* Port Index (MAC_1 + n) */
55596 SK_BOOL StartTest) /* flag for start / get result */
55597 {
55598 int i;
55599+ int CableDiagOffs;
55600+ int MdiPairs;
55601+ SK_BOOL FastEthernet;
55602+ SK_BOOL Yukon2;
55603 SK_U16 RegVal;
55604 SK_GEPORT *pPrt;
55605
55606 pPrt = &pAC->GIni.GP[Port];
55607
55608 if (pPrt->PhyType != SK_PHY_MARV_COPPER) {
55609-
55610+
55611 return(1);
55612 }
55613
55614+ Yukon2 = pAC->GIni.GIChipId == CHIP_ID_YUKON_XL ||
55615+ pAC->GIni.GIChipId == CHIP_ID_YUKON_EC_U;
55616+
55617+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_FE) {
55618+
55619+ CableDiagOffs = PHY_MARV_FE_VCT_TX;
55620+ FastEthernet = SK_TRUE;
55621+ MdiPairs = 2;
55622+ }
55623+ else {
55624+ CableDiagOffs = Yukon2 ? PHY_MARV_PHY_CTRL : PHY_MARV_CABLE_DIAG;
55625+ FastEthernet = SK_FALSE;
55626+ MdiPairs = 4;
55627+ }
55628+
55629 if (StartTest) {
55630+
55631+ /* set to RESET to avoid PortCheckUp */
55632+ pPrt->PState = SK_PRT_RESET;
55633+
55634 /* only start the cable test */
55635- if ((pPrt->PhyId1 & PHY_I1_REV_MSK) < 4) {
55636- /* apply TDR workaround from Marvell */
55637- SkGmPhyWrite(pAC, IoC, Port, 29, 0x001e);
55638-
55639- SkGmPhyWrite(pAC, IoC, Port, 30, 0xcc00);
55640- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc800);
55641- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc400);
55642- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc000);
55643- SkGmPhyWrite(pAC, IoC, Port, 30, 0xc100);
55644+ if (!FastEthernet) {
55645+
55646+ if ((((pPrt->PhyId1 & PHY_I1_MOD_NUM) >> 4) == 2) &&
55647+ ((pPrt->PhyId1 & PHY_I1_REV_MSK) < 4)) {
55648+ /* apply TDR workaround for model 2, rev. < 4 */
55649+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_ADDR, 0x001e);
55650+
55651+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xcc00);
55652+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc800);
55653+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc400);
55654+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc000);
55655+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PAGE_DATA, 0xc100);
55656+ }
55657+
55658+#ifdef YUKON_DBG
55659+ if (pAC->GIni.GIChipId == CHIP_ID_YUKON_EC) {
55660+ /* set address to 1 for page 1 */
55661+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 1);
55662+
55663+ /* disable waiting period */
55664+ SkGmPhyWrite(pAC, IoC, Port, CableDiagOffs,
55665+ PHY_M_CABD_DIS_WAIT);
55666+ }
55667+#endif
55668+ if (Yukon2) {
55669+ /* set address to 5 for page 5 */
55670+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 5);
55671+
55672+#ifdef YUKON_DBG
55673+ /* disable waiting period */
55674+ SkGmPhyWrite(pAC, IoC, Port, CableDiagOffs + 1,
55675+ PHY_M_CABD_DIS_WAIT);
55676+#endif
55677+ }
55678+ else {
55679+ /* set address to 0 for MDI[0] (Page 0) */
55680+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0);
55681+ }
55682 }
55683+ else {
55684+ RegVal = PHY_CT_RESET | PHY_CT_SP100;
55685
55686- /* set address to 0 for MDI[0] */
55687- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, 0);
55688+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, RegVal);
55689
55690- /* Read Cable Diagnostic Reg */
55691- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, &RegVal);
55692+#ifdef xYUKON_DBG
55693+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_FE_SPEC_2, &RegVal);
55694+ /* disable waiting period */
55695+ RegVal |= PHY_M_FESC_DIS_WAIT;
55696+
55697+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_FE_SPEC_2, RegVal);
55698+#endif
55699+ }
55700
55701 /* start Cable Diagnostic Test */
55702- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CABLE_DIAG,
55703- (SK_U16)(RegVal | PHY_M_CABD_ENA_TEST));
55704-
55705+ SkGmPhyWrite(pAC, IoC, Port, CableDiagOffs, PHY_M_CABD_ENA_TEST);
55706+
55707 return(0);
55708 }
55709-
55710+
55711 /* Read Cable Diagnostic Reg */
55712- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, &RegVal);
55713+ SkGmPhyRead(pAC, IoC, Port, CableDiagOffs, &RegVal);
55714
55715 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
55716- ("PHY Cable Diag.=0x%04X\n", RegVal));
55717+ ("PHY Cable Diag. = 0x%04X\n", RegVal));
55718
55719 if ((RegVal & PHY_M_CABD_ENA_TEST) != 0) {
55720 /* test is running */
55721@@ -4587,16 +5343,24 @@
55722 }
55723
55724 /* get the test results */
55725- for (i = 0; i < 4; i++) {
55726- /* set address to i for MDI[i] */
55727- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, (SK_U16)i);
55728+ for (i = 0; i < MdiPairs; i++) {
55729+
55730+ if (!FastEthernet && !Yukon2) {
55731+ /* set address to i for MDI[i] */
55732+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_ADR, (SK_U16)i);
55733+ }
55734
55735 /* get Cable Diagnostic values */
55736- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, &RegVal);
55737+ SkGmPhyRead(pAC, IoC, Port, CableDiagOffs, &RegVal);
55738
55739 pPrt->PMdiPairLen[i] = (SK_U8)(RegVal & PHY_M_CABD_DIST_MSK);
55740
55741 pPrt->PMdiPairSts[i] = (SK_U8)((RegVal & PHY_M_CABD_STAT_MSK) >> 13);
55742+
55743+ if (FastEthernet || Yukon2) {
55744+ /* get next register */
55745+ CableDiagOffs++;
55746+ }
55747 }
55748
55749 return(0);
55750@@ -4605,3 +5369,4 @@
55751 #endif /* YUKON */
55752
55753 /* End of file */
55754+
55755diff -ruN linux/drivers/net/sk98lin/sky2.c linux-new/drivers/net/sk98lin/sky2.c
55756--- linux/drivers/net/sk98lin/sky2.c 1970-01-01 01:00:00.000000000 +0100
55757+++ linux-new/drivers/net/sk98lin/sky2.c 2006-01-18 14:37:24.000000000 +0100
615eba13 55758@@ -0,0 +1,2718 @@
5902d8ee 55759+/******************************************************************************
55760+ *
55761+ * Name: sky2.c
55762+ * Project: Yukon2 specific functions and implementations
55763+ * Version: $Revision$
55764+ * Date: $Date$
55765+ * Purpose: The main driver source module
55766+ *
55767+ *****************************************************************************/
55768+
55769+/******************************************************************************
55770+ *
55771+ * (C)Copyright 1998-2002 SysKonnect GmbH.
55772+ * (C)Copyright 2002-2005 Marvell.
55773+ *
55774+ * Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet
55775+ * Server Adapters.
55776+ *
55777+ * Author: Ralph Roesler (rroesler@syskonnect.de)
55778+ * Mirko Lindner (mlindner@syskonnect.de)
55779+ *
55780+ * Address all question to: linux@syskonnect.de
55781+ *
55782+ * This program is free software; you can redistribute it and/or modify
55783+ * it under the terms of the GNU General Public License as published by
55784+ * the Free Software Foundation; either version 2 of the License, or
55785+ * (at your option) any later version.
55786+ *
55787+ * The information in this file is provided "AS IS" without warranty.
55788+ *
55789+ *****************************************************************************/
55790+
55791+#include "h/skdrv1st.h"
55792+#include "h/skdrv2nd.h"
615eba13 55793+#include <linux/ip.h>
5902d8ee 55794+#include <linux/tcp.h>
55795+
55796+/******************************************************************************
55797+ *
55798+ * Local Function Prototypes
55799+ *
55800+ *****************************************************************************/
55801+
55802+static void InitPacketQueues(SK_AC *pAC,int Port);
55803+static void GiveTxBufferToHw(SK_AC *pAC,SK_IOC IoC,int Port);
55804+static void GiveRxBufferToHw(SK_AC *pAC,SK_IOC IoC,int Port,SK_PACKET *pPacket);
55805+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);
55806+static void CheckForSendComplete(SK_AC *pAC,SK_IOC IoC,int Port,SK_PKT_QUEUE *pPQ,SK_LE_TABLE *pLETab,unsigned int Done);
55807+static void UnmapAndFreeTxPktBuffer(SK_AC *pAC,SK_PACKET *pSkPacket,int TxPort);
55808+static SK_BOOL AllocateAndInitLETables(SK_AC *pAC);
55809+static SK_BOOL AllocatePacketBuffersYukon2(SK_AC *pAC);
55810+static void FreeLETables(SK_AC *pAC);
55811+static void FreePacketBuffers(SK_AC *pAC);
55812+static SK_BOOL AllocAndMapRxBuffer(SK_AC *pAC,SK_PACKET *pSkPacket,int Port);
55813+#ifdef CONFIG_SK98LIN_NAPI
55814+static SK_BOOL HandleStatusLEs(SK_AC *pAC,int *WorkDone,int WorkToDo);
55815+#else
55816+static SK_BOOL HandleStatusLEs(SK_AC *pAC);
55817+#endif
55818+
55819+extern void SkGeCheckTimer (DEV_NET *pNet);
55820+extern void SkLocalEventQueue( SK_AC *pAC,
55821+ SK_U32 Class,
55822+ SK_U32 Event,
55823+ SK_U32 Param1,
55824+ SK_U32 Param2,
55825+ SK_BOOL Flag);
55826+extern void SkLocalEventQueue64( SK_AC *pAC,
55827+ SK_U32 Class,
55828+ SK_U32 Event,
55829+ SK_U64 Param,
55830+ SK_BOOL Flag);
55831+
55832+/******************************************************************************
55833+ *
55834+ * Local Variables
55835+ *
55836+ *****************************************************************************/
55837+
55838+#define MAX_NBR_RX_BUFFERS_IN_HW 0x15
55839+static SK_U8 NbrRxBuffersInHW;
55840+#define FLUSH_OPC(le)
55841+
55842+/******************************************************************************
55843+ *
55844+ * Global Functions
55845+ *
55846+ *****************************************************************************/
55847+
55848+int SkY2Xmit( struct sk_buff *skb, struct SK_NET_DEVICE *dev);
55849+void FillReceiveTableYukon2(SK_AC *pAC,SK_IOC IoC,int Port);
55850+
55851+/*****************************************************************************
55852+ *
55853+ * SkY2RestartStatusUnit - restarts teh status unit
55854+ *
55855+ * Description:
55856+ * Reenables the status unit after any De-Init (e.g. when altering
55857+ * the sie of the MTU via 'ifconfig a.b.c.d mtu xxx')
55858+ *
55859+ * Returns: N/A
55860+ */
55861+void SkY2RestartStatusUnit(
55862+SK_AC *pAC) /* pointer to adapter control context */
55863+{
55864+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
55865+ ("==> SkY2RestartStatusUnit\n"));
55866+
55867+ /*
55868+ ** It might be that the TX timer is not started. Therefore
55869+ ** it is initialized here -> to be more investigated!
55870+ */
55871+ SK_OUT32(pAC->IoBase, STAT_TX_TIMER_INI, HW_MS_TO_TICKS(pAC,10));
55872+
55873+ pAC->StatusLETable.Done = 0;
55874+ pAC->StatusLETable.Put = 0;
55875+ pAC->StatusLETable.HwPut = 0;
55876+ SkGeY2InitStatBmu(pAC, pAC->IoBase, &pAC->StatusLETable);
55877+
55878+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
55879+ ("<== SkY2RestartStatusUnit\n"));
55880+}
55881+
55882+/*****************************************************************************
55883+ *
55884+ * SkY2RlmtSend - sends out a single RLMT notification
55885+ *
55886+ * Description:
55887+ * This function sends out an RLMT frame
55888+ *
55889+ * Returns:
55890+ * > 0 - on succes: the number of bytes in the message
55891+ * = 0 - on resource shortage: this frame sent or dropped, now
55892+ * the ring is full ( -> set tbusy)
55893+ * < 0 - on failure: other problems ( -> return failure to upper layers)
55894+ */
55895+int SkY2RlmtSend (
55896+SK_AC *pAC, /* pointer to adapter control context */
55897+int PortNr, /* index of port the packet(s) shall be send to */
55898+struct sk_buff *pMessage) /* pointer to send-message */
55899+{
55900+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
55901+ ("=== SkY2RlmtSend\n"));
55902+#if 0
55903+ return -1; // temporarily do not send out RLMT frames
55904+#endif
55905+ skb_shinfo(pMessage)->nr_frags = (2*MAX_SKB_FRAGS) + PortNr;
55906+ return(SkY2Xmit(pMessage, pAC->dev[PortNr])); // SkY2Xmit needs device
55907+}
55908+
55909+/*****************************************************************************
55910+ *
55911+ * SkY2AllocateResources - Allocates all required resources for Yukon2
55912+ *
55913+ * Description:
55914+ * This function allocates all memory needed for the Yukon2.
55915+ * It maps also RX buffers to the LETables and initializes the
55916+ * status list element table.
55917+ *
55918+ * Returns:
55919+ * SK_TRUE, if all resources could be allocated and setup succeeded
55920+ * SK_FALSE, if an error
55921+ */
55922+SK_BOOL SkY2AllocateResources (
55923+SK_AC *pAC) /* pointer to adapter control context */
55924+{
55925+ int CurrMac;
55926+
55927+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
55928+ ("==> SkY2AllocateResources\n"));
55929+
55930+ /*
55931+ ** Initialize the packet queue variables first
55932+ */
55933+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) {
55934+ InitPacketQueues(pAC, CurrMac);
55935+ }
55936+
55937+ /*
55938+ ** Get sufficient memory for the LETables
55939+ */
55940+ if (!AllocateAndInitLETables(pAC)) {
55941+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
55942+ SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR,
55943+ ("No memory for LETable.\n"));
55944+ return(SK_FALSE);
55945+ }
55946+
55947+ /*
55948+ ** Allocate and intialize memory for both RX and TX
55949+ ** packet and fragment buffers. On an error, free
55950+ ** previously allocated LETable memory and quit.
55951+ */
55952+ if (!AllocatePacketBuffersYukon2(pAC)) {
55953+ FreeLETables(pAC);
55954+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
55955+ SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR,
55956+ ("No memory for Packetbuffers.\n"));
55957+ return(SK_FALSE);
55958+ }
55959+
55960+ /*
55961+ ** Rx and Tx LE tables will be initialized in SkGeOpen()
55962+ **
55963+ ** It might be that the TX timer is not started. Therefore
55964+ ** it is initialized here -> to be more investigated!
55965+ */
55966+ SK_OUT32(pAC->IoBase, STAT_TX_TIMER_INI, HW_MS_TO_TICKS(pAC,10));
55967+ SkGeY2InitStatBmu(pAC, pAC->IoBase, &pAC->StatusLETable);
55968+
55969+ pAC->MaxUnusedRxLeWorking = MAX_UNUSED_RX_LE_WORKING;
55970+
55971+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
55972+ ("<== SkY2AllocateResources\n"));
55973+
55974+ return (SK_TRUE);
55975+}
55976+
55977+/*****************************************************************************
55978+ *
55979+ * SkY2FreeResources - Frees previously allocated resources of Yukon2
55980+ *
55981+ * Description:
55982+ * This function frees all previously allocated memory of the Yukon2.
55983+ *
55984+ * Returns: N/A
55985+ */
55986+void SkY2FreeResources (
55987+SK_AC *pAC) /* pointer to adapter control context */
55988+{
55989+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
55990+ ("==> SkY2FreeResources\n"));
55991+
55992+ FreeLETables(pAC);
55993+ FreePacketBuffers(pAC);
55994+
55995+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
55996+ ("<== SkY2FreeResources\n"));
55997+}
55998+
55999+/*****************************************************************************
56000+ *
56001+ * SkY2AllocateRxBuffers - Allocates the receive buffers for a port
56002+ *
56003+ * Description:
56004+ * This function allocated all the RX buffers of the Yukon2.
56005+ *
56006+ * Returns: N/A
56007+ */
56008+void SkY2AllocateRxBuffers (
56009+SK_AC *pAC, /* pointer to adapter control context */
56010+SK_IOC IoC, /* I/O control context */
56011+int Port) /* port index of RX */
56012+{
56013+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
56014+ ("==> SkY2AllocateRxBuffers (Port %c)\n", Port));
56015+
56016+ FillReceiveTableYukon2(pAC, IoC, Port);
56017+
56018+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
56019+ ("<== SkY2AllocateRxBuffers\n"));
56020+}
56021+
56022+/*****************************************************************************
56023+ *
56024+ * SkY2FreeRxBuffers - Free's all allocates RX buffers of
56025+ *
56026+ * Description:
56027+ * This function frees all RX buffers of the Yukon2 for a single port
56028+ *
56029+ * Returns: N/A
56030+ */
56031+void SkY2FreeRxBuffers (
56032+SK_AC *pAC, /* pointer to adapter control context */
56033+SK_IOC IoC, /* I/O control context */
56034+int Port) /* port index of RX */
56035+{
56036+ SK_PACKET *pSkPacket;
56037+ unsigned long Flags; /* for POP/PUSH macros */
56038+
56039+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56040+ ("==> SkY2FreeRxBuffers (Port %c)\n", Port));
56041+
56042+ if (pAC->RxPort[Port].ReceivePacketTable != NULL) {
56043+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket);
56044+ while (pSkPacket != NULL) {
56045+ if ((pSkPacket->pFrag) != NULL) {
56046+ pci_unmap_page(pAC->PciDev,
56047+ (dma_addr_t) pSkPacket->pFrag->pPhys,
56048+ pSkPacket->pFrag->FragLen - 2,
56049+ PCI_DMA_FROMDEVICE);
56050+
56051+ /* wipe out any rubbish data that may interfere */
56052+ skb_shinfo(pSkPacket->pMBuf)->nr_frags = 0;
56053+ skb_shinfo(pSkPacket->pMBuf)->frag_list = NULL;
56054+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf);
56055+ pSkPacket->pMBuf = NULL;
56056+ pSkPacket->pFrag->pPhys = (SK_U64) 0;
56057+ pSkPacket->pFrag->pVirt = NULL;
56058+ }
56059+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket);
56060+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket);
56061+ }
56062+ }
56063+
56064+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56065+ ("<== SkY2FreeRxBuffers\n"));
56066+}
56067+
56068+/*****************************************************************************
56069+ *
56070+ * SkY2FreeTxBuffers - Free's any currently maintained Tx buffer
56071+ *
56072+ * Description:
56073+ * This function frees the TX buffers of the Yukon2 for a single port
56074+ * which might be in use by a transmit action
56075+ *
56076+ * Returns: N/A
56077+ */
56078+void SkY2FreeTxBuffers (
56079+SK_AC *pAC, /* pointer to adapter control context */
56080+SK_IOC IoC, /* I/O control context */
56081+int Port) /* port index of TX */
56082+{
56083+ SK_PACKET *pSkPacket;
56084+ SK_FRAG *pSkFrag;
56085+ unsigned long Flags;
56086+
56087+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56088+ ("==> SkY2FreeTxBuffers (Port %c)\n", Port));
56089+
56090+ if (pAC->TxPort[Port][0].TransmitPacketTable != NULL) {
56091+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxAQ_working, pSkPacket);
56092+ while (pSkPacket != NULL) {
56093+ if ((pSkFrag = pSkPacket->pFrag) != NULL) {
56094+ UnmapAndFreeTxPktBuffer(pAC, pSkPacket, Port);
56095+ }
56096+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->TxPort[Port][0].TxQ_free, pSkPacket);
56097+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxAQ_working, pSkPacket);
56098+ }
56099+#if USE_SYNC_TX_QUEUE
56100+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxSQ_working, pSkPacket);
56101+ while (pSkPacket != NULL) {
56102+ if ((pSkFrag = pSkPacket->pFrag) != NULL) {
56103+ UnmapAndFreeTxPktBuffer(pAC, pSkPacket, Port);
56104+ }
56105+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->TxPort[Port][0].TxQ_free, pSkPacket);
56106+ POP_FIRST_PKT_FROM_QUEUE(&pAC->TxPort[Port][0].TxSQ_working, pSkPacket);
56107+ }
56108+#endif
56109+ }
56110+
56111+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56112+ ("<== SkY2FreeTxBuffers\n"));
56113+}
56114+
56115+/*****************************************************************************
56116+ *
56117+ * SkY2Isr - handle a receive IRQ for all yukon2 cards
56118+ *
56119+ * Description:
56120+ * This function is called when a receive IRQ is set. (only for yukon2)
56121+ * HandleReceives does the deferred processing of all outstanding
56122+ * interrupt operations.
56123+ *
56124+ * Returns: N/A
56125+ */
56126+SkIsrRetVar SkY2Isr (
56127+int irq, /* the irq we have received (might be shared!) */
56128+void *dev_id, /* current device id */
56129+struct pt_regs *ptregs) /* not used by our driver */
56130+{
56131+ struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id;
56132+ DEV_NET *pNet = (DEV_NET*) dev->priv;
56133+ SK_AC *pAC = pNet->pAC;
56134+ SK_U32 IntSrc;
56135+ unsigned long Flags;
56136+#ifndef CONFIG_SK98LIN_NAPI
56137+ SK_BOOL handledStatLE = SK_FALSE;
56138+#else
56139+ SK_BOOL SetIntMask = SK_FALSE;
56140+#endif
56141+
56142+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
56143+ ("==> SkY2Isr\n"));
56144+
56145+ SK_IN32(pAC->IoBase, B0_Y2_SP_ISRC2, &IntSrc);
56146+
56147+ if ((IntSrc == 0) && (!pNet->NetConsoleMode)){
56148+ SK_OUT32(pAC->IoBase, B0_Y2_SP_ICR, 2);
56149+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
56150+ ("No Interrupt\n ==> SkY2Isr\n"));
56151+ return SkIsrRetNone;
56152+
56153+ }
56154+
56155+#ifdef Y2_RECOVERY
56156+ if (pNet->InRecover) {
56157+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
56158+ ("Already in recover\n ==> SkY2Isr\n"));
56159+ SK_OUT32(pAC->IoBase, B0_Y2_SP_ICR, 2);
56160+ return SkIsrRetNone;
56161+ }
56162+#endif
56163+
56164+#ifdef CONFIG_SK98LIN_NAPI
56165+ if (netif_rx_schedule_prep(pAC->dev[0])) {
56166+ pAC->GIni.GIValIrqMask &= ~(Y2_IS_STAT_BMU);
56167+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
56168+ SetIntMask = SK_TRUE;
56169+ __netif_rx_schedule(pAC->dev[0]);
56170+ }
56171+
56172+ if (netif_rx_schedule_prep(pAC->dev[1])) {
56173+ if (!SetIntMask) {
56174+ pAC->GIni.GIValIrqMask &= ~(Y2_IS_STAT_BMU);
56175+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
56176+ }
56177+ __netif_rx_schedule(pAC->dev[1]);
56178+ }
56179+#else
56180+ handledStatLE = HandleStatusLEs(pAC);
56181+#endif
56182+
56183+ /*
56184+ ** Check for Special Interrupts
56185+ */
56186+ if ((IntSrc & ~Y2_IS_STAT_BMU) || pAC->CheckQueue || pNet->TimerExpired) {
56187+ pAC->CheckQueue = SK_FALSE;
56188+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
56189+ SkGeSirqIsr(pAC, pAC->IoBase, IntSrc);
56190+ SkEventDispatcher(pAC, pAC->IoBase);
56191+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
56192+ }
56193+
56194+ /* Speed enhancement for a2 chipsets */
56195+ if (HW_FEATURE(pAC, HWF_WA_DEV_42)) {
56196+ spin_lock_irqsave(&pAC->SetPutIndexLock, Flags);
56197+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_XA1,0), &pAC->TxPort[0][0].TxALET);
56198+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_R1,0), &pAC->RxPort[0].RxLET);
56199+ spin_unlock_irqrestore(&pAC->SetPutIndexLock, Flags);
56200+ }
56201+
56202+ /*
56203+ ** Reenable interrupts and signal end of ISR
56204+ */
56205+ SK_OUT32(pAC->IoBase, B0_Y2_SP_ICR, 2);
56206+
56207+ /*
56208+ ** Stop and restart TX timer in case a Status LE was handled
56209+ */
56210+#ifndef CONFIG_SK98LIN_NAPI
56211+ if ((HW_FEATURE(pAC, HWF_WA_DEV_43_418)) && (handledStatLE)) {
56212+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_STOP);
56213+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_START);
56214+ }
56215+#endif
56216+
56217+ if (!(IS_Q_EMPTY(&(pAC->TxPort[0][TX_PRIO_LOW].TxAQ_waiting)))) {
56218+ GiveTxBufferToHw(pAC, pAC->IoBase, 0);
56219+ }
56220+ if (!(IS_Q_EMPTY(&(pAC->TxPort[1][TX_PRIO_LOW].TxAQ_waiting)))) {
56221+ GiveTxBufferToHw(pAC, pAC->IoBase, 1);
56222+ }
56223+
56224+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
56225+ ("<== SkY2Isr\n"));
56226+
56227+ return SkIsrRetHandled;
56228+} /* SkY2Isr */
56229+
56230+/*****************************************************************************
56231+ *
56232+ * SkY2Xmit - Linux frame transmit function for Yukon2
56233+ *
56234+ * Description:
56235+ * The system calls this function to send frames onto the wire.
56236+ * It puts the frame in the tx descriptor ring. If the ring is
56237+ * full then, the 'tbusy' flag is set.
56238+ *
56239+ * Returns:
56240+ * 0, if everything is ok
56241+ * !=0, on error
56242+ *
56243+ * WARNING:
56244+ * returning 1 in 'tbusy' case caused system crashes (double
56245+ * allocated skb's) !!!
56246+ */
56247+int SkY2Xmit(
56248+struct sk_buff *skb, /* socket buffer to be sent */
56249+struct SK_NET_DEVICE *dev) /* via which device? */
56250+{
56251+ DEV_NET *pNet = (DEV_NET*) dev->priv;
56252+ SK_AC *pAC = pNet->pAC;
56253+ SK_U8 FragIdx = 0;
56254+ SK_PACKET *pSkPacket;
56255+ SK_FRAG *PrevFrag;
56256+ SK_FRAG *CurrFrag;
56257+ SK_PKT_QUEUE *pWorkQueue; /* corresponding TX queue */
56258+ SK_PKT_QUEUE *pWaitQueue;
56259+ SK_PKT_QUEUE *pFreeQueue;
56260+ SK_LE_TABLE *pLETab; /* corresponding LETable */
56261+ skb_frag_t *sk_frag;
56262+ SK_U64 PhysAddr;
56263+ unsigned long Flags;
56264+ unsigned int Port;
56265+ int CurrFragCtr;
56266+
56267+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56268+ ("==> SkY2Xmit\n"));
56269+
56270+ /*
56271+ ** Get port and return if no free packet is available
56272+ */
56273+ if (skb_shinfo(skb)->nr_frags > MAX_SKB_FRAGS) {
56274+ Port = skb_shinfo(skb)->nr_frags - (2*MAX_SKB_FRAGS);
56275+ skb_shinfo(skb)->nr_frags = 0;
56276+ } else {
56277+ Port = (pAC->RlmtNets == 2) ? pNet->PortNr : pAC->ActivePort;
56278+ }
56279+
56280+ if (IS_Q_EMPTY(&(pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free))) {
56281+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
56282+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR,
56283+ ("Not free packets available for send\n"));
56284+ return 1; /* zero bytes sent! */
56285+ }
56286+
56287+ /*
56288+ ** Put any new packet to be sent in the waiting queue and
56289+ ** handle also any possible fragment of that packet.
56290+ */
56291+ pWorkQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working);
56292+ pWaitQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting);
56293+ pFreeQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free);
56294+ pLETab = &(pAC->TxPort[Port][TX_PRIO_LOW].TxALET);
56295+
56296+ /*
56297+ ** Normal send operations require only one fragment, because
56298+ ** only one sk_buff data area is passed.
56299+ ** In contradiction to this, scatter-gather (zerocopy) send
56300+ ** operations might pass one or more additional fragments
56301+ ** where each fragment needs a separate fragment info packet.
56302+ */
56303+ if (((skb_shinfo(skb)->nr_frags + 1) * MAX_FRAG_OVERHEAD) >
56304+ NUM_FREE_LE_IN_TABLE(pLETab)) {
56305+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
56306+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR,
56307+ ("Not enough LE available for send\n"));
56308+ return 1; /* zero bytes sent! */
56309+ }
56310+
56311+ if ((skb_shinfo(skb)->nr_frags + 1) > MAX_NUM_FRAGS) {
56312+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
56313+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR,
56314+ ("Not even one fragment available for send\n"));
56315+ return 1; /* zero bytes sent! */
56316+ }
56317+
56318+ /*
56319+ ** Get first packet from free packet queue
56320+ */
56321+ POP_FIRST_PKT_FROM_QUEUE(pFreeQueue, pSkPacket);
56322+ if(pSkPacket == NULL) {
56323+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
56324+ SK_DBGCAT_DRV_TX_PROGRESS | SK_DBGCAT_DRV_ERROR,
56325+ ("Could not obtain free packet used for xmit\n"));
56326+ return 1; /* zero bytes sent! */
56327+ }
56328+
56329+ pSkPacket->pFrag = &(pSkPacket->FragArray[FragIdx]);
56330+
56331+ /*
56332+ ** map the sk_buff to be available for the adapter
56333+ */
56334+ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev,
56335+ virt_to_page(skb->data),
56336+ ((unsigned long) skb->data & ~PAGE_MASK),
56337+ skb_headlen(skb),
56338+ PCI_DMA_TODEVICE);
56339+ pSkPacket->pMBuf = skb;
56340+ pSkPacket->pFrag->pPhys = PhysAddr;
56341+ pSkPacket->pFrag->FragLen = skb_headlen(skb);
56342+ pSkPacket->pFrag->pNext = NULL; /* initial has no next default */
56343+ pSkPacket->NumFrags = skb_shinfo(skb)->nr_frags + 1;
56344+
56345+ PrevFrag = pSkPacket->pFrag;
56346+
56347+ /*
56348+ ** Each scatter-gather fragment need to be mapped...
56349+ */
56350+ for ( CurrFragCtr = 0;
56351+ CurrFragCtr < skb_shinfo(skb)->nr_frags;
56352+ CurrFragCtr++) {
56353+ FragIdx++;
56354+ sk_frag = &skb_shinfo(skb)->frags[CurrFragCtr];
56355+ CurrFrag = &(pSkPacket->FragArray[FragIdx]);
56356+
56357+ /*
56358+ ** map the sk_buff to be available for the adapter
56359+ */
56360+ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev,
56361+ sk_frag->page,
56362+ sk_frag->page_offset,
56363+ sk_frag->size,
56364+ PCI_DMA_TODEVICE);
56365+
56366+ CurrFrag->pPhys = PhysAddr;
56367+ CurrFrag->FragLen = sk_frag->size;
56368+ CurrFrag->pNext = NULL;
56369+
56370+ /*
56371+ ** Add the new fragment to the list of fragments
56372+ */
56373+ PrevFrag->pNext = CurrFrag;
56374+ PrevFrag = CurrFrag;
56375+ }
56376+
56377+ /*
56378+ ** Add packet to waiting packets queue
56379+ */
56380+ PUSH_PKT_AS_LAST_IN_QUEUE(pWaitQueue, pSkPacket);
56381+ GiveTxBufferToHw(pAC, pAC->IoBase, Port);
56382+ dev->trans_start = jiffies;
56383+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56384+ ("<== SkY2Xmit(return 0)\n"));
56385+ return (0);
56386+} /* SkY2Xmit */
56387+
56388+#ifdef CONFIG_SK98LIN_NAPI
56389+/*****************************************************************************
56390+ *
56391+ * SkY2Poll - NAPI Rx polling callback for Yukon2 chipsets
56392+ *
56393+ * Description:
56394+ * Called by the Linux system in case NAPI polling is activated
56395+ *
56396+ * Returns
56397+ * The number of work data still to be handled
56398+ *
56399+ * Notes
56400+ * The slowpath lock needs to be set because HW accesses may
56401+ * interfere with slowpath events (e.g. TWSI)
56402+ */
56403+int SkY2Poll(
56404+struct net_device *dev, /* device that needs to be polled */
56405+int *budget) /* how many budget do we have? */
56406+{
56407+ SK_AC *pAC = ((DEV_NET*)(dev->priv))->pAC;
56408+ int WorkToDo = min(*budget, dev->quota);
56409+ int WorkDone = 0;
56410+ SK_BOOL handledStatLE = SK_FALSE;
56411+ unsigned long Flags;
56412+
56413+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
56414+ handledStatLE = HandleStatusLEs(pAC, &WorkDone, WorkToDo);
56415+
56416+ *budget -= WorkDone;
56417+ dev->quota -= WorkDone;
56418+
56419+ if(WorkDone < WorkToDo) {
56420+ netif_rx_complete(dev);
56421+ pAC->GIni.GIValIrqMask |= (Y2_IS_STAT_BMU);
56422+ SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask);
56423+ if ((HW_FEATURE(pAC, HWF_WA_DEV_43_418)) && (handledStatLE)) {
56424+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_STOP);
56425+ SK_OUT8(pAC->IoBase, STAT_TX_TIMER_CTRL, TIM_START);
56426+ }
56427+ }
56428+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
56429+ return (WorkDone >= WorkToDo);
56430+} /* SkY2Poll */
56431+#endif
56432+
56433+/******************************************************************************
56434+ *
56435+ * SkY2PortStop - stop a port on Yukon2
56436+ *
56437+ * Description:
56438+ * This function stops a port of the Yukon2 chip. This stop
56439+ * stop needs to be performed in a specific order:
56440+ *
56441+ * a) Stop the Prefetch unit
56442+ * b) Stop the Port (MAC, PHY etc.)
56443+ *
56444+ * Returns: N/A
56445+ */
56446+void SkY2PortStop(
56447+SK_AC *pAC, /* adapter control context */
56448+SK_IOC IoC, /* I/O control context (address of adapter registers) */
56449+int Port, /* port to stop (MAC_1 + n) */
56450+int Dir, /* StopDirection (SK_STOP_RX, SK_STOP_TX, SK_STOP_ALL) */
56451+int RstMode) /* Reset Mode (SK_SOFT_RST, SK_HARD_RST) */
56452+{
56453+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56454+ ("==> SkY2PortStop (Port %c)\n", 'A' + Port));
56455+
56456+ /*
56457+ ** Stop the HW
56458+ */
56459+ SkGeStopPort(pAC, IoC, Port, Dir, RstMode);
56460+
56461+ /*
56462+ ** Move any TX packet from work queues into the free queue again
56463+ ** and initialize the TX LETable variables
56464+ */
56465+ SkY2FreeTxBuffers(pAC, pAC->IoBase, Port);
56466+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Bmu.RxTx.TcpWp = 0;
56467+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Bmu.RxTx.MssValue = 0;
56468+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.BufHighAddr = 0;
56469+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Done = 0;
56470+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Put = 0;
56471+ // pAC->GIni.GP[Port].PState = SK_PRT_STOP;
56472+
56473+ /*
56474+ ** Move any RX packet from work queue into the waiting queue
56475+ ** and initialize the RX LETable variables
56476+ */
56477+ SkY2FreeRxBuffers(pAC, pAC->IoBase, Port);
56478+ pAC->RxPort[Port].RxLET.BufHighAddr = 0;
56479+
56480+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56481+ ("<== SkY2PortStop()\n"));
56482+}
56483+
56484+/******************************************************************************
56485+ *
56486+ * SkY2PortStart - start a port on Yukon2
56487+ *
56488+ * Description:
56489+ * This function starts a port of the Yukon2 chip. This start
56490+ * action needs to be performed in a specific order:
56491+ *
56492+ * a) Initialize the LET indices (PUT/GET to 0)
56493+ * b) Initialize the LET in HW (enables also prefetch unit)
56494+ * c) Move all RX buffers from waiting queue to working queue
56495+ * which involves also setting up of RX list elements
56496+ * d) Initialize the FIFO settings of Yukon2 (Watermark etc.)
56497+ * e) Initialize the Port (MAC, PHY etc.)
56498+ * f) Initialize the MC addresses
56499+ *
56500+ * Returns: N/A
56501+ */
56502+void SkY2PortStart(
56503+SK_AC *pAC, /* adapter control context */
56504+SK_IOC IoC, /* I/O control context (address of adapter registers) */
56505+int Port) /* port to start */
56506+{
56507+ // SK_GEPORT *pPrt = &pAC->GIni.GP[Port];
56508+ SK_HWLE *pLE;
56509+ SK_U32 DWord;
56510+ SK_U32 PrefetchReg; /* register for Put index */
56511+
56512+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56513+ ("==> SkY2PortStart (Port %c)\n", 'A' + Port));
56514+
56515+ /*
56516+ ** Initialize the LET indices
56517+ */
56518+ pAC->RxPort[Port].RxLET.Done = 0;
56519+ pAC->RxPort[Port].RxLET.Put = 0;
56520+ pAC->RxPort[Port].RxLET.HwPut = 0;
56521+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Done = 0;
56522+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.Put = 0;
56523+ pAC->TxPort[Port][TX_PRIO_LOW].TxALET.HwPut = 0;
56524+ if (HW_SYNC_TX_SUPPORTED(pAC)) {
56525+ pAC->TxPort[Port][TX_PRIO_LOW].TxSLET.Done = 0;
56526+ pAC->TxPort[Port][TX_PRIO_LOW].TxSLET.Put = 0;
56527+ pAC->TxPort[Port][TX_PRIO_LOW].TxSLET.HwPut = 0;
56528+ }
56529+
56530+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) {
56531+ /*
56532+ ** It might be that we have to limit the RX buffers
56533+ ** effectively passed to HW. Initialize the start
56534+ ** value in that case...
56535+ */
56536+ NbrRxBuffersInHW = 0;
56537+ }
56538+
56539+ /*
56540+ ** TODO on dual net adapters we need to check if
56541+ ** StatusLETable need to be set...
56542+ **
56543+ ** pAC->StatusLETable.Done = 0;
56544+ ** pAC->StatusLETable.Put = 0;
56545+ ** pAC->StatusLETable.HwPut = 0;
56546+ ** SkGeY2InitPrefetchUnit(pAC, pAC->IoBase, Q_ST, &pAC->StatusLETable);
56547+ */
56548+
56549+ /*
56550+ ** Initialize the LET in HW (enables also prefetch unit)
56551+ */
56552+ SkGeY2InitPrefetchUnit(pAC, IoC,(Port == 0) ? Q_R1 : Q_R2,
56553+ &pAC->RxPort[Port].RxLET);
56554+ SkGeY2InitPrefetchUnit( pAC, IoC,(Port == 0) ? Q_XA1 : Q_XA2,
56555+ &pAC->TxPort[Port][TX_PRIO_LOW].TxALET);
56556+ if (HW_SYNC_TX_SUPPORTED(pAC)) {
56557+ SkGeY2InitPrefetchUnit( pAC, IoC, (Port == 0) ? Q_XS1 : Q_XS2,
56558+ &pAC->TxPort[Port][TX_PRIO_HIGH].TxSLET);
56559+ }
56560+
56561+
56562+ /*
56563+ ** Using new values for the watermarks and the timer for
56564+ ** low latency optimization
56565+ */
56566+ if (pAC->LowLatency) {
56567+ SK_OUT8(IoC, STAT_FIFO_WM, 1);
56568+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 1);
56569+ SK_OUT32(IoC, STAT_LEV_TIMER_INI, 50);
56570+ SK_OUT32(IoC, STAT_ISR_TIMER_INI, 10);
56571+ }
56572+
56573+
56574+ /*
56575+ ** Initialize the Port (MAC, PHY etc.)
56576+ */
56577+ if (SkGeInitPort(pAC, IoC, Port)) {
56578+ if (Port == 0) {
56579+ printk("%s: SkGeInitPort A failed.\n",pAC->dev[0]->name);
56580+ } else {
56581+ printk("%s: SkGeInitPort B failed.\n",pAC->dev[1]->name);
56582+ }
56583+ }
56584+
56585+ if (IS_GMAC(pAC)) {
56586+ /* disable Rx GMAC FIFO Flush Mode */
56587+ SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8) GMF_RX_F_FL_OFF);
56588+ }
56589+
56590+ /*
56591+ ** Initialize the MC addresses
56592+ */
56593+ SkAddrMcUpdate(pAC,IoC, Port);
56594+
56595+ SkMacRxTxEnable(pAC, IoC,Port);
56596+
56597+ if (pAC->RxPort[Port].UseRxCsum) {
56598+ SkGeRxCsum(pAC, IoC, Port, SK_TRUE);
56599+
56600+ GET_RX_LE(pLE, &pAC->RxPort[Port].RxLET);
56601+ RXLE_SET_STACS1(pLE, pAC->CsOfs1);
56602+ RXLE_SET_STACS2(pLE, pAC->CsOfs2);
56603+ RXLE_SET_CTRL(pLE, 0);
56604+
56605+ RXLE_SET_OPC(pLE, OP_TCPSTART | HW_OWNER);
56606+ FLUSH_OPC(pLE);
56607+ if (Port == 0) {
56608+ PrefetchReg=Y2_PREF_Q_ADDR(Q_R1,PREF_UNIT_PUT_IDX_REG);
56609+ } else {
56610+ PrefetchReg=Y2_PREF_Q_ADDR(Q_R2,PREF_UNIT_PUT_IDX_REG);
56611+ }
56612+ DWord = GET_PUT_IDX(&pAC->RxPort[Port].RxLET);
56613+ SK_OUT32(IoC, PrefetchReg, DWord);
56614+ UPDATE_HWPUT_IDX(&pAC->RxPort[Port].RxLET);
56615+ }
56616+
56617+ pAC->GIni.GP[Port].PState = SK_PRT_RUN;
56618+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
56619+ ("<== SkY2PortStart()\n"));
56620+}
56621+
56622+/******************************************************************************
56623+ *
56624+ * Local Functions
56625+ *
56626+ *****************************************************************************/
56627+
56628+/*****************************************************************************
56629+ *
56630+ * InitPacketQueues - initialize SW settings of packet queues
56631+ *
56632+ * Description:
56633+ * This function will initialize the packet queues for a port.
56634+ *
56635+ * Returns: N/A
56636+ */
56637+static void InitPacketQueues(
56638+SK_AC *pAC, /* pointer to adapter control context */
56639+int Port) /* index of port to be initialized */
56640+{
56641+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
56642+ ("==> InitPacketQueues(Port %c)\n", 'A' + Port));
56643+
56644+ pAC->RxPort[Port].RxQ_working.pHead = NULL;
56645+ pAC->RxPort[Port].RxQ_working.pTail = NULL;
56646+ spin_lock_init(&pAC->RxPort[Port].RxQ_working.QueueLock);
56647+
56648+ pAC->RxPort[Port].RxQ_waiting.pHead = NULL;
56649+ pAC->RxPort[Port].RxQ_waiting.pTail = NULL;
56650+ spin_lock_init(&pAC->RxPort[Port].RxQ_waiting.QueueLock);
56651+
56652+ pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free.pHead = NULL;
56653+ pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free.pTail = NULL;
56654+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxQ_free.QueueLock);
56655+
56656+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working.pHead = NULL;
56657+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working.pTail = NULL;
56658+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working.QueueLock);
56659+
56660+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting.pHead = NULL;
56661+ pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting.pTail = NULL;
56662+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting.QueueLock);
56663+
56664+#if USE_SYNC_TX_QUEUE
56665+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_working.pHead = NULL;
56666+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_working.pTail = NULL;
56667+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_working.QueueLock);
56668+
56669+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_waiting.pHead = NULL;
56670+ pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_waiting.pTail = NULL;
56671+ spin_lock_init(&pAC->TxPort[Port][TX_PRIO_LOW].TxSQ_waiting.QueueLock);
56672+#endif
56673+
56674+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
56675+ ("<== InitPacketQueues(Port %c)\n", 'A' + Port));
56676+} /* InitPacketQueues */
56677+
56678+/*****************************************************************************
56679+ *
56680+ * GiveTxBufferToHw - commits a previously allocated DMA area to HW
56681+ *
56682+ * Description:
56683+ * This functions gives transmit buffers to HW. If no list elements
56684+ * are available the buffers will be queued.
56685+ *
56686+ * Notes:
56687+ * This function can run only once in a system at one time.
56688+ *
56689+ * Returns: N/A
56690+ */
56691+static void GiveTxBufferToHw(
56692+SK_AC *pAC, /* pointer to adapter control context */
56693+SK_IOC IoC, /* I/O control context (address of registers) */
56694+int Port) /* port index for which the buffer is used */
56695+{
56696+ SK_HWLE *pLE;
56697+ SK_PACKET *pSkPacket;
56698+ SK_FRAG *pFrag;
56699+ SK_PKT_QUEUE *pWorkQueue; /* corresponding TX queue */
56700+ SK_PKT_QUEUE *pWaitQueue;
56701+ SK_LE_TABLE *pLETab; /* corresponding LETable */
56702+ SK_BOOL SetOpcodePacketFlag;
56703+ SK_U32 HighAddress;
56704+ SK_U32 LowAddress;
56705+ SK_U16 TcpSumStart;
56706+ SK_U16 TcpSumWrite;
56707+ SK_U8 OpCode;
56708+ SK_U8 Ctrl;
56709+ unsigned long Flags;
56710+ unsigned long LockFlag;
56711+ int Protocol;
56712+#ifdef NETIF_F_TSO
56713+ SK_U16 Mss;
56714+ int TcpOptLen;
56715+ int IpTcpLen;
56716+#endif
56717+
56718+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56719+ ("==> GiveTxBufferToHw\n"));
56720+
56721+ if (IS_Q_EMPTY(&(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting))) {
56722+ return;
56723+ }
56724+
56725+ spin_lock_irqsave(&pAC->TxQueueLock, LockFlag);
56726+
56727+ /*
56728+ ** Initialize queue settings
56729+ */
56730+ pWorkQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_working);
56731+ pWaitQueue = &(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting);
56732+ pLETab = &(pAC->TxPort[Port][TX_PRIO_LOW].TxALET);
56733+
56734+ POP_FIRST_PKT_FROM_QUEUE(pWaitQueue, pSkPacket);
56735+ while (pSkPacket != NULL) {
56736+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56737+ ("\tWe have a packet to send %p\n", pSkPacket));
56738+
56739+ /*
56740+ ** the first frag of a packet gets opcode OP_PACKET
56741+ */
56742+ SetOpcodePacketFlag = SK_TRUE;
56743+ pFrag = pSkPacket->pFrag;
56744+
56745+ /*
56746+ ** fill list elements with data from fragments
56747+ */
56748+ while (pFrag != NULL) {
56749+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56750+ ("\tGet LE\n"));
56751+#ifdef NETIF_F_TSO
56752+ Mss = skb_shinfo(pSkPacket->pMBuf)->tso_size;
56753+ if (Mss) {
56754+ TcpOptLen = ((pSkPacket->pMBuf->h.th->doff - 5) * 4);
56755+ IpTcpLen = ((pSkPacket->pMBuf->nh.iph->ihl * 4) +
56756+ sizeof(struct tcphdr));
56757+ Mss += (TcpOptLen + IpTcpLen + C_LEN_ETHERMAC_HEADER);
56758+ }
56759+ if (pLETab->Bmu.RxTx.MssValue != Mss) {
56760+ pLETab->Bmu.RxTx.MssValue = Mss;
56761+ /* Take a new LE for TSO from the table */
56762+ GET_TX_LE(pLE, pLETab);
56763+
56764+#if 0
56765+ if(pSkPacket->VlanId) {
56766+ TXLE_SET_OPC(pLE, OP_LRGLENVLAN | HW_OWNER);
56767+ TXLE_SET_VLAN(pLE, pSkPacket->VlanId);
56768+ pSkPacket->VlanId = 0;
56769+ Ctrl |= INS_VLAN;
56770+ } else {
56771+#endif
56772+ TXLE_SET_OPC(pLE, OP_LRGLEN | HW_OWNER);
56773+#if 0
56774+ }
56775+#endif
56776+ /* set maximum segment size for new packet */
56777+ TXLE_SET_LSLEN(pLE, pLETab->Bmu.RxTx.MssValue);
56778+ FLUSH_OPC(pLE) ;
56779+ }
56780+#endif
56781+ GET_TX_LE(pLE, pLETab);
56782+ Ctrl = 0;
56783+
56784+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56785+ ("\tGot empty LE %p idx %d\n", pLE, GET_PUT_IDX(pLETab)));
56786+
56787+ SK_DBG_DUMP_TX_LE(pLE);
56788+
56789+ LowAddress = (SK_U32) (pFrag->pPhys & 0xffffffff);
56790+ HighAddress = (SK_U32) (pFrag->pPhys >> 32);
56791+
56792+ if (HighAddress != pLETab->BufHighAddr) {
56793+ /* set opcode high part of the address in one LE */
56794+ OpCode = OP_ADDR64 | HW_OWNER;
56795+
56796+ /* Set now the 32 high bits of the address */
56797+ TXLE_SET_ADDR( pLE, HighAddress);
56798+
56799+ /* Set the opcode into the LE */
56800+ TXLE_SET_OPC(pLE, OpCode);
56801+
56802+ /* Flush the LE to memory */
56803+ FLUSH_OPC(pLE);
56804+
56805+ /* remember the HighAddress we gave to the Hardware */
56806+ pLETab->BufHighAddr = HighAddress;
56807+
56808+ /* get a new LE because we filled one with high address */
56809+ GET_TX_LE(pLE, pLETab);
56810+ }
56811+
56812+ /*
56813+ ** TCP checksum offload
56814+ */
56815+ if ((pSkPacket->pMBuf->ip_summed == CHECKSUM_HW) &&
56816+ (SetOpcodePacketFlag == SK_TRUE)) {
56817+ Protocol = ((SK_U8)pSkPacket->pMBuf->data[C_OFFSET_IPPROTO] & 0xff);
56818+ /* if (Protocol & C_PROTO_ID_IP) { Ctrl = 0; } */
56819+ if (Protocol & C_PROTO_ID_TCP) {
56820+ Ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
56821+ /* TCP Checksum Calculation Start Position */
56822+ TcpSumStart = C_LEN_ETHERMAC_HEADER + IP_HDR_LEN;
56823+ /* TCP Checksum Write Position */
56824+ TcpSumWrite = TcpSumStart + TCP_CSUM_OFFS;
56825+ } else {
56826+ Ctrl = UDPTCP | CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
56827+ /* TCP Checksum Calculation Start Position */
56828+ TcpSumStart = ETHER_MAC_HDR_LEN + IP_HDR_LEN;
56829+ /* UDP Checksum Write Position */
56830+ TcpSumWrite = TcpSumStart + UDP_CSUM_OFFS;
56831+ }
56832+
56833+ if ((Ctrl) && (pLETab->Bmu.RxTx.TcpWp != TcpSumWrite)) {
56834+ /* Update the last value of the write position */
56835+ pLETab->Bmu.RxTx.TcpWp = TcpSumWrite;
56836+
56837+ /* Set the Lock field for this LE: */
56838+ /* Checksum calculation for one packet only */
56839+ TXLE_SET_LCKCS(pLE, 1);
56840+
56841+ /* Set the start position for checksum. */
56842+ TXLE_SET_STACS(pLE, TcpSumStart);
56843+
56844+ /* Set the position where the checksum will be writen */
56845+ TXLE_SET_WRICS(pLE, TcpSumWrite);
56846+
56847+ /* Set the initial value for checksum */
56848+ /* PseudoHeader CS passed from Linux -> 0! */
56849+ TXLE_SET_INICS(pLE, 0);
56850+
56851+ /* Set the opcode for tcp checksum */
56852+ TXLE_SET_OPC(pLE, OP_TCPLISW | HW_OWNER);
56853+
56854+ /* Flush the LE to memory */
56855+ FLUSH_OPC(pLE);
56856+
56857+ /* get a new LE because we filled one with data for checksum */
56858+ GET_TX_LE(pLE, pLETab);
56859+ }
56860+ } /* end TCP offload handling */
56861+
56862+ TXLE_SET_ADDR(pLE, LowAddress);
56863+ TXLE_SET_LEN(pLE, pFrag->FragLen);
56864+
56865+ if (SetOpcodePacketFlag){
56866+#ifdef NETIF_F_TSO
56867+ if (Mss) {
56868+ OpCode = OP_LARGESEND | HW_OWNER;
56869+ } else {
56870+#endif
56871+ OpCode = OP_PACKET| HW_OWNER;
56872+#ifdef NETIF_F_TSO
56873+ }
56874+#endif
56875+ SetOpcodePacketFlag = SK_FALSE;
56876+ } else {
56877+ /* Follow packet in a sequence has always OP_BUFFER */
56878+ OpCode = OP_BUFFER | HW_OWNER;
56879+ }
56880+
56881+ /* Check if the low address is near the upper limit. */
56882+ CHECK_LOW_ADDRESS(pLETab->BufHighAddr, LowAddress, pFrag->FragLen);
56883+
56884+ pFrag = pFrag->pNext;
56885+ if (pFrag == NULL) {
56886+ /* mark last fragment */
56887+ Ctrl |= EOP;
56888+ }
56889+ TXLE_SET_CTRL(pLE, Ctrl);
56890+ TXLE_SET_OPC(pLE, OpCode);
56891+ FLUSH_OPC(pLE);
56892+
56893+ SK_DBG_DUMP_TX_LE(pLE);
56894+ }
56895+
56896+ /*
56897+ ** Remember next LE for tx complete
56898+ */
56899+ pSkPacket->NextLE = GET_PUT_IDX(pLETab);
56900+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56901+ ("\tNext LE for pkt %p is %d\n", pSkPacket, pSkPacket->NextLE));
56902+
56903+ /*
56904+ ** Add packet to working packets queue
56905+ */
56906+ PUSH_PKT_AS_LAST_IN_QUEUE(pWorkQueue, pSkPacket);
56907+
56908+ /*
56909+ ** give transmit start command
56910+ */
56911+ if (HW_FEATURE(pAC, HWF_WA_DEV_42)) {
56912+ spin_lock(&pAC->SetPutIndexLock);
56913+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_XA1,0), &pAC->TxPort[0][0].TxALET);
56914+ spin_unlock(&pAC->SetPutIndexLock);
56915+ } else {
56916+ /* write put index */
56917+ if (Port == 0) {
56918+ SK_OUT32(pAC->IoBase,
56919+ Y2_PREF_Q_ADDR(Q_XA1,PREF_UNIT_PUT_IDX_REG),
56920+ GET_PUT_IDX(&pAC->TxPort[0][0].TxALET));
56921+ UPDATE_HWPUT_IDX(&pAC->TxPort[0][0].TxALET);
56922+ } else {
56923+ SK_OUT32(pAC->IoBase,
56924+ Y2_PREF_Q_ADDR(Q_XA2, PREF_UNIT_PUT_IDX_REG),
56925+ GET_PUT_IDX(&pAC->TxPort[1][0].TxALET));
56926+ UPDATE_HWPUT_IDX(&pAC->TxPort[1][0].TxALET);
56927+ }
56928+ }
56929+
56930+ if (IS_Q_EMPTY(&(pAC->TxPort[Port][TX_PRIO_LOW].TxAQ_waiting))) {
56931+ break; /* get out of while */
56932+ }
56933+ POP_FIRST_PKT_FROM_QUEUE(pWaitQueue, pSkPacket);
56934+ } /* while (pSkPacket != NULL) */
56935+
56936+ spin_unlock_irqrestore(&pAC->TxQueueLock, LockFlag);
56937+
56938+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
56939+ ("<== GiveTxBufferToHw\n"));
56940+ return;
56941+} /* GiveTxBufferToHw */
56942+
56943+/***********************************************************************
56944+ *
56945+ * GiveRxBufferToHw - commits a previously allocated DMA area to HW
56946+ *
56947+ * Description:
56948+ * This functions gives receive buffers to HW. If no list elements
56949+ * are available the buffers will be queued.
56950+ *
56951+ * Notes:
56952+ * This function can run only once in a system at one time.
56953+ *
56954+ * Returns: N/A
56955+ */
56956+static void GiveRxBufferToHw(
56957+SK_AC *pAC, /* pointer to adapter control context */
56958+SK_IOC IoC, /* I/O control context (address of registers) */
56959+int Port, /* port index for which the buffer is used */
56960+SK_PACKET *pPacket) /* receive buffer(s) */
56961+{
56962+ SK_HWLE *pLE;
56963+ SK_LE_TABLE *pLETab;
56964+ SK_BOOL Done = SK_FALSE; /* at least on LE changed? */
56965+ SK_U32 LowAddress;
56966+ SK_U32 HighAddress;
56967+ SK_U32 PrefetchReg; /* register for Put index */
56968+ unsigned NumFree;
56969+ unsigned Required;
56970+ unsigned long Flags;
56971+
56972+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
56973+ ("==> GiveRxBufferToHw(Port %c, Packet %p)\n", 'A' + Port, pPacket));
56974+
56975+ pLETab = &pAC->RxPort[Port].RxLET;
56976+
56977+ if (Port == 0) {
56978+ PrefetchReg = Y2_PREF_Q_ADDR(Q_R1, PREF_UNIT_PUT_IDX_REG);
56979+ } else {
56980+ PrefetchReg = Y2_PREF_Q_ADDR(Q_R2, PREF_UNIT_PUT_IDX_REG);
56981+ }
56982+
56983+ if (pPacket != NULL) {
56984+ /*
56985+ ** For the time being, we have only one packet passed
56986+ ** to this function which might be changed in future!
56987+ */
56988+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket);
56989+ }
56990+
56991+ /*
56992+ ** now pPacket contains the very first waiting packet
56993+ */
56994+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket);
56995+ while (pPacket != NULL) {
56996+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) {
56997+ if (NbrRxBuffersInHW >= MAX_NBR_RX_BUFFERS_IN_HW) {
56998+ PUSH_PKT_AS_FIRST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket);
56999+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57000+ ("<== GiveRxBufferToHw()\n"));
57001+ return;
57002+ }
57003+ NbrRxBuffersInHW++;
57004+ }
57005+
57006+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57007+ ("Try to add packet %p\n", pPacket));
57008+
57009+ /*
57010+ ** Check whether we have enough listelements:
57011+ **
57012+ ** we have to take into account that each fragment
57013+ ** may need an additional list element for the high
57014+ ** part of the address here I simplified it by
57015+ ** using MAX_FRAG_OVERHEAD maybe it's worth to split
57016+ ** this constant for Rx and Tx or to calculate the
57017+ ** real number of needed LE's
57018+ */
57019+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57020+ ("\tNum %d Put %d Done %d Free %d %d\n",
57021+ pLETab->Num, pLETab->Put, pLETab->Done,
57022+ NUM_FREE_LE_IN_TABLE(pLETab),
57023+ (NUM_FREE_LE_IN_TABLE(pLETab))));
57024+
57025+ Required = pPacket->NumFrags + MAX_FRAG_OVERHEAD;
57026+ NumFree = NUM_FREE_LE_IN_TABLE(pLETab);
57027+ if (NumFree) {
57028+ NumFree--;
57029+ }
57030+
57031+ if (Required > NumFree ) {
57032+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
57033+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR,
57034+ ("\tOut of LEs have %d need %d\n",
57035+ NumFree, Required));
57036+
57037+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57038+ ("\tWaitQueue starts with packet %p\n", pPacket));
57039+ PUSH_PKT_AS_FIRST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket);
57040+ if (Done) {
57041+ /*
57042+ ** write Put index to BMU or Polling Unit and make the LE's
57043+ ** available for the hardware
57044+ */
57045+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57046+ ("\tWrite new Put Idx\n"));
57047+
57048+ SK_OUT32(IoC, PrefetchReg, GET_PUT_IDX(pLETab));
57049+ UPDATE_HWPUT_IDX(pLETab);
57050+ }
57051+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57052+ ("<== GiveRxBufferToHw()\n"));
57053+ return;
57054+ } else {
57055+ if (!AllocAndMapRxBuffer(pAC, pPacket, Port)) {
57056+ /*
57057+ ** Failure while allocating sk_buff might
57058+ ** be due to temporary short of resources
57059+ ** Maybe next time buffers are available.
57060+ ** Until this, the packet remains in the
57061+ ** RX waiting queue...
57062+ */
57063+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
57064+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR,
57065+ ("Failed to allocate Rx buffer\n"));
57066+
57067+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57068+ ("WaitQueue starts with packet %p\n", pPacket));
57069+ PUSH_PKT_AS_FIRST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket);
57070+ if (Done) {
57071+ /*
57072+ ** write Put index to BMU or Polling
57073+ ** Unit and make the LE's
57074+ ** available for the hardware
57075+ */
57076+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57077+ ("\tWrite new Put Idx\n"));
57078+
57079+ SK_OUT32(IoC, PrefetchReg, GET_PUT_IDX(pLETab));
57080+ UPDATE_HWPUT_IDX(pLETab);
57081+ }
57082+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57083+ ("<== GiveRxBufferToHw()\n"));
57084+ return;
57085+ }
57086+ }
57087+ Done = SK_TRUE;
57088+
57089+ LowAddress = (SK_U32) (pPacket->pFrag->pPhys & 0xffffffff);
57090+ HighAddress = (SK_U32) (pPacket->pFrag->pPhys >> 32);
57091+ if (HighAddress != pLETab->BufHighAddr) {
57092+ /* get a new LE for high address */
57093+ GET_RX_LE(pLE, pLETab);
57094+
57095+ /* Set now the 32 high bits of the address */
57096+ RXLE_SET_ADDR(pLE, HighAddress);
57097+
57098+ /* Set the control bits of the address */
57099+ RXLE_SET_CTRL(pLE, 0);
57100+
57101+ /* Set the opcode into the LE */
57102+ RXLE_SET_OPC(pLE, (OP_ADDR64 | HW_OWNER));
57103+
57104+ /* Flush the LE to memory */
57105+ FLUSH_OPC(pLE);
57106+
57107+ /* remember the HighAddress we gave to the Hardware */
57108+ pLETab->BufHighAddr = HighAddress;
57109+ }
57110+
57111+ /*
57112+ ** Fill data into listelement
57113+ */
57114+ GET_RX_LE(pLE, pLETab);
57115+ RXLE_SET_ADDR(pLE, LowAddress);
57116+ RXLE_SET_LEN(pLE, pPacket->pFrag->FragLen);
57117+ RXLE_SET_CTRL(pLE, 0);
57118+ RXLE_SET_OPC(pLE, (OP_PACKET | HW_OWNER));
57119+ FLUSH_OPC(pLE);
57120+
57121+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57122+ ("=== LE filled\n"));
57123+
57124+ SK_DBG_DUMP_RX_LE(pLE);
57125+
57126+ /*
57127+ ** Remember next LE for rx complete
57128+ */
57129+ pPacket->NextLE = GET_PUT_IDX(pLETab);
57130+
57131+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57132+ ("\tPackets Next LE is %d\n", pPacket->NextLE));
57133+
57134+ /*
57135+ ** Add packet to working receive buffer queue and get
57136+ ** any next packet out of the waiting queue
57137+ */
57138+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_working, pPacket);
57139+ if (IS_Q_EMPTY(&(pAC->RxPort[Port].RxQ_waiting))) {
57140+ break; /* get out of while processing */
57141+ }
57142+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pPacket);
57143+ }
57144+
57145+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57146+ ("\tWaitQueue is empty\n"));
57147+
57148+ if (Done) {
57149+ /*
57150+ ** write Put index to BMU or Polling Unit and make the LE's
57151+ ** available for the hardware
57152+ */
57153+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57154+ ("\tWrite new Put Idx\n"));
57155+
57156+ /* Speed enhancement for a2 chipsets */
57157+ if (HW_FEATURE(pAC, HWF_WA_DEV_42)) {
57158+ spin_lock_irqsave(&pAC->SetPutIndexLock, Flags);
57159+ SkGeY2SetPutIndex(pAC, pAC->IoBase, Y2_PREF_Q_ADDR(Q_R1,0), pLETab);
57160+ spin_unlock_irqrestore(&pAC->SetPutIndexLock, Flags);
57161+ } else {
57162+ /* write put index */
57163+ if (Port == 0) {
57164+ SK_OUT32(IoC,
57165+ Y2_PREF_Q_ADDR(Q_R1, PREF_UNIT_PUT_IDX_REG),
57166+ GET_PUT_IDX(pLETab));
57167+ } else {
57168+ SK_OUT32(IoC,
57169+ Y2_PREF_Q_ADDR(Q_R2, PREF_UNIT_PUT_IDX_REG),
57170+ GET_PUT_IDX(pLETab));
57171+ }
57172+
57173+ /* Update put index */
57174+ UPDATE_HWPUT_IDX(pLETab);
57175+ }
57176+ }
57177+
57178+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57179+ ("<== GiveRxBufferToHw()\n"));
57180+} /* GiveRxBufferToHw */
57181+
57182+/***********************************************************************
57183+ *
57184+ * FillReceiveTableYukon2 - map any waiting RX buffers to HW
57185+ *
57186+ * Description:
57187+ * If the list element table contains more empty elements than
57188+ * specified this function tries to refill them.
57189+ *
57190+ * Notes:
57191+ * This function can run only once per port in a system at one time.
57192+ *
57193+ * Returns: N/A
57194+ */
57195+void FillReceiveTableYukon2(
57196+SK_AC *pAC, /* pointer to adapter control context */
57197+SK_IOC IoC, /* I/O control context */
57198+int Port) /* port index of RX */
57199+{
57200+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57201+ ("==> FillReceiveTableYukon2 (Port %c)\n", 'A' + Port));
57202+
57203+ if (NUM_FREE_LE_IN_TABLE(&pAC->RxPort[Port].RxLET) >
57204+ pAC->MaxUnusedRxLeWorking) {
57205+
57206+ /*
57207+ ** Give alle waiting receive buffers down
57208+ ** The queue holds all RX packets that
57209+ ** need a fresh allocation of the sk_buff.
57210+ */
57211+ if (pAC->RxPort[Port].RxQ_waiting.pHead != NULL) {
57212+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57213+ ("Waiting queue is not empty -> give it to HW"));
57214+ GiveRxBufferToHw(pAC, IoC, Port, NULL);
57215+ }
57216+ }
57217+
57218+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57219+ ("<== FillReceiveTableYukon2 ()\n"));
57220+} /* FillReceiveTableYukon2 */
57221+
57222+/******************************************************************************
57223+ *
57224+ *
57225+ * HandleReceives - will pass any ready RX packet to kernel
57226+ *
57227+ * Description:
57228+ * This functions handles a received packet. It checks wether it is
57229+ * valid, updates the receive list element table and gives the receive
57230+ * buffer to Linux
57231+ *
57232+ * Notes:
57233+ * This function can run only once per port at one time in the system.
57234+ *
57235+ * Returns: N/A
57236+ */
57237+static SK_BOOL HandleReceives(
57238+SK_AC *pAC, /* adapter control context */
57239+int Port, /* port on which a packet has been received */
57240+SK_U16 Len, /* number of bytes which was actually received */
57241+SK_U32 FrameStatus, /* MAC frame status word */
57242+SK_U16 Tcp1, /* first hw checksum */
57243+SK_U16 Tcp2, /* second hw checksum */
57244+SK_U32 Tist, /* timestamp */
57245+SK_U16 Vlan) /* Vlan Id */
57246+{
57247+
57248+ SK_PACKET *pSkPacket;
57249+ SK_LE_TABLE *pLETab;
57250+ SK_MBUF *pRlmtMbuf; /* buffer for giving RLMT frame */
57251+ struct sk_buff *pMsg; /* ptr to message holding frame */
57252+#ifdef __ia64__
57253+ struct sk_buff *pNewMsg; /* used when IP aligning */
57254+#endif
57255+
57256+#ifdef CONFIG_SK98LIN_NAPI
57257+ SK_BOOL SlowPathLock = SK_FALSE;
57258+#else
57259+ SK_BOOL SlowPathLock = SK_TRUE;
57260+#endif
57261+ SK_BOOL IsGoodPkt;
57262+ SK_BOOL IsBc;
57263+ SK_BOOL IsMc;
57264+ SK_EVPARA EvPara; /* an event parameter union */
57265+ SK_I16 LenToFree; /* must be signed integer */
57266+
57267+ unsigned long Flags; /* for spin lock */
57268+ unsigned int RlmtNotifier;
57269+ unsigned short Type;
57270+ int IpFrameLength;
57271+ int FrameLength; /* total length of recvd frame */
57272+ int HeaderLength;
57273+ int NumBytes;
57274+ int Result;
57275+ int Offset = 0;
57276+
57277+#ifdef Y2_SYNC_CHECK
57278+ SK_U16 MyTcp;
57279+#endif
57280+
57281+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57282+ ("==> HandleReceives (Port %c)\n", 'A' + Port));
57283+
57284+ /*
57285+ ** initialize vars for selected port
57286+ */
57287+ pLETab = &pAC->RxPort[Port].RxLET;
57288+
57289+ /*
57290+ ** check whether we want to receive this packet
57291+ */
57292+ SK_Y2_RXSTAT_CHECK_PKT(Len, FrameStatus, IsGoodPkt);
57293+
57294+ /*
57295+ ** Remember length to free (in case of RxBuffer overruns;
57296+ ** unlikely, but might happen once in a while)
57297+ */
57298+ LenToFree = (SK_I16) Len;
57299+
57300+ /*
57301+ ** maybe we put these two checks into the SK_RXDESC_CHECK_PKT macro too
57302+ */
57303+ if (Len > pAC->RxPort[Port].RxBufSize) {
57304+ IsGoodPkt = SK_FALSE;
57305+ }
57306+
57307+ /*
57308+ ** take first receive buffer out of working queue
57309+ */
57310+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket);
57311+ if (pSkPacket == NULL) {
57312+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
57313+ SK_DBGCAT_DRV_ERROR,
57314+ ("Packet not available. NULL pointer.\n"));
57315+ return(SK_TRUE);
57316+ }
57317+
57318+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) {
57319+ NbrRxBuffersInHW--;
57320+ }
57321+
57322+ /*
57323+ ** Verify the received length of the frame! Note that having
57324+ ** multiple RxBuffers being aware of one single receive packet
57325+ ** (one packet spread over multiple RxBuffers) is not supported
57326+ ** by this driver!
57327+ */
57328+ if ((Len > pAC->RxPort[Port].RxBufSize) ||
57329+ (Len > (SK_U16) pSkPacket->PacketLen)) {
57330+ IsGoodPkt = SK_FALSE;
57331+ }
57332+
57333+ /*
57334+ ** Reset own bit in LE's between old and new Done index
57335+ ** This is not really necessary but makes debugging easier
57336+ */
57337+ CLEAR_LE_OWN_FROM_DONE_TO(pLETab, pSkPacket->NextLE);
57338+
57339+ /*
57340+ ** Free the list elements for new Rx buffers
57341+ */
57342+ SET_DONE_INDEX(pLETab, pSkPacket->NextLE);
57343+ pMsg = pSkPacket->pMBuf;
57344+ FrameLength = Len;
57345+
57346+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57347+ ("Received frame of length %d on port %d\n",FrameLength, Port));
57348+
57349+ if (!IsGoodPkt) {
57350+ /*
57351+ ** release the DMA mapping
57352+ */
57353+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
57354+ pci_dma_sync_single(pAC->PciDev,
57355+ (dma_addr_t) pSkPacket->pFrag->pPhys,
57356+ pSkPacket->pFrag->FragLen,
57357+ PCI_DMA_FROMDEVICE);
57358+
57359+#else
57360+ pci_dma_sync_single_for_cpu(pAC->PciDev,
57361+ (dma_addr_t) pSkPacket->pFrag->pPhys,
57362+ pSkPacket->pFrag->FragLen,
57363+ PCI_DMA_FROMDEVICE);
57364+#endif
57365+
57366+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf);
57367+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket);
57368+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57369+ ("<== HandleReceives (Port %c)\n", 'A' + Port));
57370+
57371+ /*
57372+ ** Sanity check for RxBuffer overruns...
57373+ */
57374+ LenToFree = LenToFree - (pSkPacket->pFrag->FragLen);
57375+ while (LenToFree > 0) {
57376+ POP_FIRST_PKT_FROM_QUEUE(&pAC->RxPort[Port].RxQ_working, pSkPacket);
57377+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) {
57378+ NbrRxBuffersInHW--;
57379+ }
57380+ CLEAR_LE_OWN_FROM_DONE_TO(pLETab, pSkPacket->NextLE);
57381+ SET_DONE_INDEX(pLETab, pSkPacket->NextLE);
57382+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
57383+ pci_dma_sync_single(pAC->PciDev,
57384+ (dma_addr_t) pSkPacket->pFrag->pPhys,
57385+ pSkPacket->pFrag->FragLen,
57386+ PCI_DMA_FROMDEVICE);
57387+#else
57388+ pci_dma_sync_single_for_device(pAC->PciDev,
57389+ (dma_addr_t) pSkPacket->pFrag->pPhys,
57390+ pSkPacket->pFrag->FragLen,
57391+ PCI_DMA_FROMDEVICE);
57392+#endif
57393+
57394+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf);
57395+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket);
57396+ LenToFree = LenToFree - ((SK_I16)(pSkPacket->pFrag->FragLen));
57397+
57398+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
57399+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR,
57400+ ("<==HandleReceives (Port %c) drop faulty len pkt(2)\n",'A'+Port));
57401+ }
57402+ return(SK_TRUE);
57403+ } else {
57404+ /*
57405+ ** Release the DMA mapping
57406+ */
57407+ pci_unmap_single(pAC->PciDev,
57408+ pSkPacket->pFrag->pPhys,
57409+ pAC->RxPort[Port].RxBufSize,
57410+ PCI_DMA_FROMDEVICE);
57411+
57412+ skb_put(pMsg, FrameLength); /* set message len */
57413+ pMsg->ip_summed = CHECKSUM_NONE; /* initial default */
57414+
57415+#ifdef Y2_SYNC_CHECK
57416+ pAC->FramesWithoutSyncCheck++;
57417+ if (pAC->FramesWithoutSyncCheck > Y2_RESYNC_WATERMARK) {
57418+ if ((Tcp1 != 1) || (Tcp2 != 0)) {
57419+ pAC->FramesWithoutSyncCheck = 0;
57420+ MyTcp = (SK_U16) SkCsCalculateChecksum(
57421+ &pMsg->data[14],
57422+ FrameLength - 14);
57423+ if (MyTcp != Tcp1) {
57424+ /* Queue port reset event */
57425+ SkLocalEventQueue(pAC, SKGE_DRV,
57426+ SK_DRV_RECOVER,Port,-1,SK_FALSE);
57427+ }
57428+ }
57429+ }
57430+#endif
57431+
57432+ if (pAC->RxPort[Port].UseRxCsum) {
57433+ Type = ntohs(*((short*)&pMsg->data[12]));
57434+ if (Type == 0x800) {
57435+ *((char *)&(IpFrameLength)) = pMsg->data[16];
57436+ *(((char *)&(IpFrameLength))+1) = pMsg->data[17];
57437+ IpFrameLength = ntohs(IpFrameLength);
57438+ HeaderLength = FrameLength - IpFrameLength;
57439+ if (HeaderLength == 0xe) {
57440+ Result =
57441+ SkCsGetReceiveInfo(pAC,&pMsg->data[14],Tcp1,Tcp2, Port);
57442+ if ((Result == SKCS_STATUS_IP_FRAGMENT) ||
57443+ (Result == SKCS_STATUS_IP_CSUM_OK) ||
57444+ (Result == SKCS_STATUS_TCP_CSUM_OK) ||
57445+ (Result == SKCS_STATUS_UDP_CSUM_OK)) {
57446+ pMsg->ip_summed = CHECKSUM_UNNECESSARY;
57447+ } else if ((Result == SKCS_STATUS_TCP_CSUM_ERROR) ||
57448+ (Result == SKCS_STATUS_UDP_CSUM_ERROR) ||
57449+ (Result == SKCS_STATUS_IP_CSUM_ERROR_UDP) ||
57450+ (Result == SKCS_STATUS_IP_CSUM_ERROR_TCP) ||
57451+ (Result == SKCS_STATUS_IP_CSUM_ERROR)) {
57452+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
57453+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR,
57454+ ("skge: CRC error. Frame dropped!\n"));
57455+ DEV_KFREE_SKB_ANY(pMsg);
57456+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket);
57457+ SK_DBG_MSG(pAC,SK_DBGMOD_DRV,SK_DBGCAT_DRV_RX_PROGRESS,
57458+ ("<==HandleReceives(Port %c)\n",'A'+Port));
57459+ return(SK_TRUE);
57460+ } else {
57461+ pMsg->ip_summed = CHECKSUM_NONE;
57462+ }
57463+ } /* end if (HeaderLength == valid) */
57464+ } /* end if (Type == 0x800) -> IP frame */
57465+ } /* end if (pRxPort->UseRxCsum) */
57466+
57467+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
57468+ SK_DBGCAT_DRV_RX_PROGRESS,("V"));
57469+ RlmtNotifier = SK_RLMT_RX_PROTOCOL;
57470+
57471+ IsBc = (FrameStatus & GMR_FS_BC) ? SK_TRUE : SK_FALSE;
57472+ SK_RLMT_PRE_LOOKAHEAD(pAC,Port,FrameLength,
57473+ IsBc,&Offset,&NumBytes);
57474+ if (NumBytes != 0) {
57475+ IsMc = (FrameStatus & GMR_FS_MC) ? SK_TRUE : SK_FALSE;
57476+ SK_RLMT_LOOKAHEAD(pAC,Port,&pMsg->data[Offset],
57477+ IsBc,IsMc,&RlmtNotifier);
57478+ }
57479+
57480+ if (RlmtNotifier == SK_RLMT_RX_PROTOCOL) {
57481+ SK_DBG_MSG(NULL,SK_DBGMOD_DRV,
57482+ SK_DBGCAT_DRV_RX_PROGRESS,("W"));
57483+ if ((Port == pAC->ActivePort)||(pAC->RlmtNets == 2)) {
57484+ /* send up only frames from active port */
57485+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
57486+ SK_DBGCAT_DRV_RX_PROGRESS,("U"));
57487+#ifdef xDEBUG
57488+ DumpMsg(pMsg, "Rx");
57489+#endif
57490+ SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC,
57491+ FrameLength, Port);
57492+#ifdef __ia64__
57493+ pNewMsg = alloc_skb(pMsg->len, GFP_ATOMIC);
57494+ skb_reserve(pNewMsg, 2); /* to align IP */
57495+ SK_MEMCPY(pNewMsg->data,pMsg->data,pMsg->len);
57496+ pNewMsg->ip_summed = pMsg->ip_summed;
57497+ skb_put(pNewMsg, pMsg->len);
57498+ DEV_KFREE_SKB_ANY(pMsg);
57499+ pMsg = pNewMsg;
57500+#endif
57501+ pMsg->dev = pAC->dev[Port];
57502+ pMsg->protocol = eth_type_trans(pMsg,
57503+ pAC->dev[Port]);
57504+ netif_rx(pMsg);
57505+ pAC->dev[Port]->last_rx = jiffies;
57506+ } else { /* drop frame */
57507+ SK_DBG_MSG(NULL,SK_DBGMOD_DRV,
57508+ SK_DBGCAT_DRV_RX_PROGRESS,("D"));
57509+ DEV_KFREE_SKB_ANY(pMsg);
57510+ }
57511+ } else { /* This is an RLMT-packet! */
57512+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
57513+ SK_DBGCAT_DRV_RX_PROGRESS,("R"));
57514+ pRlmtMbuf = SkDrvAllocRlmtMbuf(pAC,
57515+ pAC->IoBase, FrameLength);
57516+ if (pRlmtMbuf != NULL) {
57517+ pRlmtMbuf->pNext = NULL;
57518+ pRlmtMbuf->Length = FrameLength;
57519+ pRlmtMbuf->PortIdx = Port;
57520+ EvPara.pParaPtr = pRlmtMbuf;
57521+ SK_MEMCPY((char*)(pRlmtMbuf->pData),
57522+ (char*)(pMsg->data),FrameLength);
57523+
57524+ if (SlowPathLock == SK_TRUE) {
57525+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
57526+ SkEventQueue(pAC, SKGE_RLMT,
57527+ SK_RLMT_PACKET_RECEIVED,
57528+ EvPara);
57529+ pAC->CheckQueue = SK_TRUE;
57530+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
57531+ } else {
57532+ SkEventQueue(pAC, SKGE_RLMT,
57533+ SK_RLMT_PACKET_RECEIVED,
57534+ EvPara);
57535+ pAC->CheckQueue = SK_TRUE;
57536+ }
57537+
57538+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
57539+ SK_DBGCAT_DRV_RX_PROGRESS,("Q"));
57540+ }
57541+ if (pAC->dev[Port]->flags & (IFF_PROMISC | IFF_ALLMULTI)) {
57542+#ifdef __ia64__
57543+ pNewMsg = alloc_skb(pMsg->len, GFP_ATOMIC);
57544+ skb_reserve(pNewMsg, 2); /* to align IP */
57545+ SK_MEMCPY(pNewMsg->data,pMsg->data,pMsg->len);
57546+ pNewMsg->ip_summed = pMsg->ip_summed;
57547+ pNewMsg->len = pMsg->len;
57548+ DEV_KFREE_SKB_ANY(pMsg);
57549+ pMsg = pNewMsg;
57550+#endif
57551+ pMsg->dev = pAC->dev[Port];
57552+ pMsg->protocol = eth_type_trans(pMsg,pAC->dev[Port]);
57553+ netif_rx(pMsg);
57554+ pAC->dev[Port]->last_rx = jiffies;
57555+ } else {
57556+ DEV_KFREE_SKB_ANY(pMsg);
57557+ }
57558+ } /* if packet for rlmt */
57559+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[Port].RxQ_waiting, pSkPacket);
57560+ } /* end if-else (IsGoodPkt) */
57561+
57562+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
57563+ ("<== HandleReceives (Port %c)\n", 'A' + Port));
57564+ return(SK_TRUE);
57565+
57566+} /* HandleReceives */
57567+
57568+/***********************************************************************
57569+ *
57570+ * CheckForSendComplete - Frees any freeable Tx bufffer
57571+ *
57572+ * Description:
57573+ * This function checks the queues of a port for completed send
57574+ * packets and returns these packets back to the OS.
57575+ *
57576+ * Notes:
57577+ * This function can run simultaneously for both ports if
57578+ * the OS function OSReturnPacket() can handle this,
57579+ *
57580+ * Such a send complete does not mean, that the packet is really
57581+ * out on the wire. We just know that the adapter has copied it
57582+ * into its internal memory and the buffer in the systems memory
57583+ * is no longer needed.
57584+ *
57585+ * Returns: N/A
57586+ */
57587+static void CheckForSendComplete(
57588+SK_AC *pAC, /* pointer to adapter control context */
57589+SK_IOC IoC, /* I/O control context */
57590+int Port, /* port index */
57591+SK_PKT_QUEUE *pPQ, /* tx working packet queue to check */
57592+SK_LE_TABLE *pLETab, /* corresponding list element table */
57593+unsigned int Done) /* done index reported for this LET */
57594+{
57595+ SK_PACKET *pSkPacket;
57596+ SK_PKT_QUEUE SendCmplPktQ = { NULL, NULL, SPIN_LOCK_UNLOCKED };
57597+ SK_BOOL DoWakeQueue = SK_FALSE;
57598+ unsigned long Flags;
57599+ unsigned Put;
57600+
57601+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57602+ ("==> CheckForSendComplete(Port %c)\n", 'A' + Port));
57603+
57604+ /*
57605+ ** Reset own bit in LE's between old and new Done index
57606+ ** This is not really necessairy but makes debugging easier
57607+ */
57608+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57609+ ("Clear Own Bits in TxTable from %d to %d\n",
57610+ pLETab->Done, (Done == 0) ?
57611+ NUM_LE_IN_TABLE(pLETab) :
57612+ (Done - 1)));
57613+
57614+ spin_lock_irqsave(&(pPQ->QueueLock), Flags);
57615+
57616+ CLEAR_LE_OWN_FROM_DONE_TO(pLETab, Done);
57617+
57618+ Put = GET_PUT_IDX(pLETab);
57619+
57620+ /*
57621+ ** Check whether some packets have been completed
57622+ */
57623+ PLAIN_POP_FIRST_PKT_FROM_QUEUE(pPQ, pSkPacket);
57624+ while (pSkPacket != NULL) {
57625+
57626+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57627+ ("Check Completion of Tx packet %p\n", pSkPacket));
57628+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57629+ ("Put %d NewDone %d NextLe of Packet %d\n", Put, Done,
57630+ pSkPacket->NextLE));
57631+
57632+ if ((Put > Done) &&
57633+ ((pSkPacket->NextLE > Put) || (pSkPacket->NextLE <= Done))) {
57634+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket);
57635+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57636+ ("Packet finished (a)\n"));
57637+ } else if ((Done > Put) &&
57638+ (pSkPacket->NextLE > Put) && (pSkPacket->NextLE <= Done)) {
57639+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket);
57640+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57641+ ("Packet finished (b)\n"));
57642+ } else if ((Done == TXA_MAX_LE-1) && (Put == 0) && (pSkPacket->NextLE == 0)) {
57643+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket);
57644+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57645+ ("Packet finished (b)\n"));
57646+ DoWakeQueue = SK_TRUE;
57647+ } else if (Done == Put) {
57648+ /* all packets have been sent */
57649+ PLAIN_PUSH_PKT_AS_LAST_IN_QUEUE(&SendCmplPktQ, pSkPacket);
57650+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57651+ ("Packet finished (c)\n"));
57652+ } else {
57653+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57654+ ("Packet not yet finished\n"));
57655+ PLAIN_PUSH_PKT_AS_FIRST_IN_QUEUE(pPQ, pSkPacket);
57656+ break;
57657+ }
57658+ PLAIN_POP_FIRST_PKT_FROM_QUEUE(pPQ, pSkPacket);
57659+ }
57660+ spin_unlock_irqrestore(&(pPQ->QueueLock), Flags);
57661+
57662+ /*
57663+ ** Set new done index in list element table
57664+ */
57665+ SET_DONE_INDEX(pLETab, Done);
57666+
57667+ /*
57668+ ** All TX packets that are send complete should be added to
57669+ ** the free queue again for new sents to come
57670+ */
57671+ pSkPacket = SendCmplPktQ.pHead;
57672+ while (pSkPacket != NULL) {
57673+ while (pSkPacket->pFrag != NULL) {
57674+ pci_unmap_page(pAC->PciDev,
57675+ (dma_addr_t) pSkPacket->pFrag->pPhys,
57676+ pSkPacket->pFrag->FragLen,
57677+ PCI_DMA_FROMDEVICE);
57678+ pSkPacket->pFrag = pSkPacket->pFrag->pNext;
57679+ }
57680+
57681+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf);
57682+ pSkPacket->pMBuf = NULL;
57683+ pSkPacket = pSkPacket->pNext; /* get next packet */
57684+ }
57685+
57686+ /*
57687+ ** Append the available TX packets back to free queue
57688+ */
57689+ if (SendCmplPktQ.pHead != NULL) {
57690+ spin_lock_irqsave(&(pAC->TxPort[Port][0].TxQ_free.QueueLock), Flags);
57691+ if (pAC->TxPort[Port][0].TxQ_free.pTail != NULL) {
57692+ pAC->TxPort[Port][0].TxQ_free.pTail->pNext = SendCmplPktQ.pHead;
57693+ pAC->TxPort[Port][0].TxQ_free.pTail = SendCmplPktQ.pTail;
57694+ if (pAC->TxPort[Port][0].TxQ_free.pHead->pNext == NULL) {
57695+ netif_wake_queue(pAC->dev[Port]);
57696+ }
57697+ } else {
57698+ pAC->TxPort[Port][0].TxQ_free.pHead = SendCmplPktQ.pHead;
57699+ pAC->TxPort[Port][0].TxQ_free.pTail = SendCmplPktQ.pTail;
57700+ netif_wake_queue(pAC->dev[Port]);
57701+ }
57702+ if (Done == Put) {
57703+ netif_wake_queue(pAC->dev[Port]);
57704+ }
57705+ if (DoWakeQueue) {
57706+ netif_wake_queue(pAC->dev[Port]);
57707+ DoWakeQueue = SK_FALSE;
57708+ }
57709+ spin_unlock_irqrestore(&pAC->TxPort[Port][0].TxQ_free.QueueLock, Flags);
57710+ }
57711+
57712+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57713+ ("<== CheckForSendComplete()\n"));
57714+
57715+ return;
57716+} /* CheckForSendComplete */
57717+
57718+/*****************************************************************************
57719+ *
57720+ * UnmapAndFreeTxPktBuffer
57721+ *
57722+ * Description:
57723+ * This function free any allocated space of receive buffers
57724+ *
57725+ * Arguments:
57726+ * pAC - A pointer to the adapter context struct.
57727+ *
57728+ */
57729+static void UnmapAndFreeTxPktBuffer(
57730+SK_AC *pAC, /* pointer to adapter context */
57731+SK_PACKET *pSkPacket, /* pointer to port struct of ring to fill */
57732+int TxPort) /* TX port index */
57733+{
57734+ SK_FRAG *pFrag = pSkPacket->pFrag;
57735+
57736+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57737+ ("--> UnmapAndFreeTxPktBuffer\n"));
57738+
57739+ while (pFrag != NULL) {
57740+ pci_unmap_page(pAC->PciDev,
57741+ (dma_addr_t) pFrag->pPhys,
57742+ pFrag->FragLen,
57743+ PCI_DMA_FROMDEVICE);
57744+ pFrag = pFrag->pNext;
57745+ }
57746+
57747+ DEV_KFREE_SKB_ANY(pSkPacket->pMBuf);
57748+ pSkPacket->pMBuf = NULL;
57749+
57750+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
57751+ ("<-- UnmapAndFreeTxPktBuffer\n"));
57752+}
57753+
57754+/*****************************************************************************
57755+ *
57756+ * HandleStatusLEs
57757+ *
57758+ * Description:
57759+ * This function checks for any new status LEs that may have been
57760+ * received. Those status LEs may either be Rx or Tx ones.
57761+ *
57762+ * Returns: N/A
57763+ */
57764+static SK_BOOL HandleStatusLEs(
57765+#ifdef CONFIG_SK98LIN_NAPI
57766+SK_AC *pAC, /* pointer to adapter context */
57767+int *WorkDone, /* Done counter needed for NAPI */
57768+int WorkToDo) /* ToDo counter for NAPI */
57769+#else
57770+SK_AC *pAC) /* pointer to adapter context */
57771+#endif
57772+{
57773+ int DoneTxA[SK_MAX_MACS];
57774+ int DoneTxS[SK_MAX_MACS];
57775+ int Port;
57776+ SK_BOOL handledStatLE = SK_FALSE;
57777+ SK_BOOL NewDone = SK_FALSE;
57778+ SK_HWLE *pLE;
57779+ SK_U16 HighVal;
57780+ SK_U32 LowVal;
57781+ SK_U8 OpCode;
57782+ int i;
57783+
57784+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
57785+ ("==> HandleStatusLEs\n"));
57786+
57787+ do {
57788+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
57789+ ("Check next Own Bit of ST-LE[%d]: 0x%li \n",
57790+ (pAC->StatusLETable.Done + 1) % NUM_LE_IN_TABLE(&pAC->StatusLETable),
57791+ OWN_OF_FIRST_LE(&pAC->StatusLETable)));
57792+
57793+ while (OWN_OF_FIRST_LE(&pAC->StatusLETable) == HW_OWNER) {
57794+ GET_ST_LE(pLE, &pAC->StatusLETable);
57795+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
57796+ ("Working on finished status LE[%d]:\n",
57797+ GET_DONE_INDEX(&pAC->StatusLETable)));
57798+ SK_DBG_DUMP_ST_LE(pLE);
57799+ handledStatLE = SK_TRUE;
57800+ OpCode = STLE_GET_OPC(pLE) & ~HW_OWNER;
57801+ Port = STLE_GET_LINK(pLE);
57802+
57803+#ifdef USE_TIST_FOR_RESET
57804+ if (SK_ADAPTER_WAITING_FOR_TIST(pAC)) {
57805+ /* do we just have a tist LE ? */
57806+ if ((OpCode & OP_RXTIMESTAMP) == OP_RXTIMESTAMP) {
57807+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
57808+ if (SK_PORT_WAITING_FOR_ANY_TIST(pAC, i)) {
57809+ /* if a port is waiting for any tist it is done */
57810+ SK_CLR_STATE_FOR_PORT(pAC, i);
57811+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
57812+ ("Got any Tist on port %c (now 0x%X!!!)\n",
57813+ 'A' + i, pAC->AdapterResetState));
57814+ }
57815+ if (SK_PORT_WAITING_FOR_SPECIFIC_TIST(pAC, i)) {
57816+ Y2_GET_TIST_LOW_VAL(pAC->IoBase, &LowVal);
57817+ if ((pAC->MinTistHi != pAC->GIni.GITimeStampCnt) ||
57818+ (pAC->MinTistLo < LowVal)) {
57819+ /* time is up now */
57820+ SK_CLR_STATE_FOR_PORT(pAC, i);
57821+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
57822+ ("Got expected Tist on Port %c (now 0x%X)!!!\n",
57823+ 'A' + i, pAC->AdapterResetState));
57824+#ifdef Y2_SYNC_CHECK
57825+ pAC->FramesWithoutSyncCheck =
57826+ Y2_RESYNC_WATERMARK;
57827+#endif
57828+ } else {
57829+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
57830+ ("Got Tist %l:%l on Port %c but still waiting\n",
57831+ pAC->GIni.GITimeStampCnt, pAC->MinTistLo,
57832+ 'A' + i));
57833+ }
57834+ }
57835+ }
57836+#ifndef Y2_RECOVERY
57837+ if (!SK_ADAPTER_WAITING_FOR_TIST(pAC)) {
57838+ /* nobody needs tist anymore - turn it off */
57839+ Y2_DISABLE_TIST(pAC->IoBase);
57840+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
57841+ ("Turn off Tist !!!\n"));
57842+ }
57843+#endif
57844+ } else if (OpCode == OP_TXINDEXLE) {
57845+ /*
57846+ * change OpCode to notify the folowing code
57847+ * to ignore the done index from this LE
57848+ * unfortunately tist LEs will be generated only
57849+ * for RxStat LEs
57850+ * so in order to get a safe Done index for a
57851+ * port currently waiting for a tist we have to
57852+ * get the done index directly from the BMU
57853+ */
57854+ OpCode = OP_MOD_TXINDEX;
57855+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
57856+ ("Mark unusable TX_INDEX LE!!!\n"));
57857+ } else {
57858+ if (SK_PORT_WAITING_FOR_TIST(pAC, Port)) {
57859+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
57860+ ("Ignore LE 0x%X on Port %c!!!\n",
57861+ OpCode, 'A' + Port));
57862+ OpCode = OP_MOD_LE;
57863+#ifdef Y2_LE_CHECK
57864+ /* mark entries invalid */
57865+ pAC->LastOpc = 0xFF;
57866+ pAC->LastPort = 3;
57867+#endif
57868+ }
57869+ }
57870+ } /* if (SK_ADAPTER_WAITING_FOR_TIST(pAC)) */
57871+#endif
57872+
57873+
57874+
57875+
57876+
57877+#ifdef Y2_LE_CHECK
57878+ if (pAC->LastOpc != 0xFF) {
57879+ /* last opc is valid
57880+ * check if current opcode follows last opcode
57881+ */
57882+ if ((((OpCode & OP_RXTIMESTAMP) == OP_RXTIMESTAMP) && (pAC->LastOpc != OP_RXSTAT)) ||
57883+ (((OpCode & OP_RXCHKS) == OP_RXCHKS) && (pAC->LastOpc != OP_RXTIMESTAMP)) ||
57884+ ((OpCode == OP_RXSTAT) && (pAC->LastOpc != OP_RXCHKS))) {
57885+
57886+ /* opcode sequence broken
57887+ * current LE is invalid
57888+ */
57889+
57890+ if (pAC->LastOpc == OP_RXTIMESTAMP) {
57891+ /* force invalid checksum */
57892+ pLE->St.StUn.StRxTCPCSum.RxTCPSum1 = 1;
57893+ pLE->St.StUn.StRxTCPCSum.RxTCPSum2 = 0;
57894+ OpCode = pAC->LastOpc = OP_RXCHKS;
57895+ Port = pAC->LastPort;
57896+ } else if (pAC->LastOpc == OP_RXCHKS) {
57897+ /* force invalid frame */
57898+ Port = pAC->LastPort;
57899+ pLE->St.Stat.BufLen = 64;
57900+ pLE->St.StUn.StRxStatWord = GMR_FS_CRC_ERR;
57901+ OpCode = pAC->LastOpc = OP_RXSTAT;
57902+#ifdef Y2_SYNC_CHECK
57903+ /* force rx sync check */
57904+ pAC->FramesWithoutSyncCheck = Y2_RESYNC_WATERMARK;
57905+#endif
57906+ } else if (pAC->LastOpc == OP_RXSTAT) {
57907+ /* create dont care tist */
57908+ pLE->St.StUn.StRxTimeStamp = 0;
57909+ OpCode = pAC->LastOpc = OP_RXTIMESTAMP;
57910+ /* dont know the port yet */
57911+ } else {
57912+#ifdef DEBUG
57913+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
57914+ ("Unknown LastOpc %X for Timestamp on port %c.\n",
57915+ pAC->LastOpc, Port));
57916+#endif
57917+ }
57918+ }
57919+ }
57920+#endif
57921+
57922+ switch (OpCode) {
57923+ case OP_RXSTAT:
57924+#ifdef Y2_RECOVERY
57925+ pAC->LastOpc = OP_RXSTAT;
57926+#endif
57927+ /*
57928+ ** This is always the last Status LE belonging
57929+ ** to a received packet -> handle it...
57930+ */
57931+ if ((Port != 0) && (Port != 1)) {
57932+ /* Unknown port */
57933+ panic("sk98lin: Unknown port %d\n",
57934+ Port);
57935+ }
57936+
57937+ HandleReceives(
57938+ pAC,
57939+ Port,
57940+ STLE_GET_LEN(pLE),
57941+ STLE_GET_FRSTATUS(pLE),
57942+ pAC->StatusLETable.Bmu.Stat.TcpSum1,
57943+ pAC->StatusLETable.Bmu.Stat.TcpSum2,
57944+ pAC->StatusLETable.Bmu.Stat.RxTimeStamp,
57945+ pAC->StatusLETable.Bmu.Stat.VlanId);
57946+#ifdef CONFIG_SK98LIN_NAPI
57947+ if (*WorkDone >= WorkToDo) {
57948+ break;
57949+ }
57950+ (*WorkDone)++;
57951+#endif
57952+ break;
57953+ case OP_RXVLAN:
57954+ /* this value will be used for next RXSTAT */
57955+ pAC->StatusLETable.Bmu.Stat.VlanId = STLE_GET_VLAN(pLE);
57956+ break;
57957+ case OP_RXTIMEVLAN:
57958+ /* this value will be used for next RXSTAT */
57959+ pAC->StatusLETable.Bmu.Stat.VlanId = STLE_GET_VLAN(pLE);
57960+ /* fall through */
57961+ case OP_RXTIMESTAMP:
57962+ /* this value will be used for next RXSTAT */
57963+ pAC->StatusLETable.Bmu.Stat.RxTimeStamp = STLE_GET_TIST(pLE);
57964+#ifdef Y2_RECOVERY
57965+ pAC->LastOpc = OP_RXTIMESTAMP;
57966+ pAC->LastPort = Port;
57967+#endif
57968+ break;
57969+ case OP_RXCHKSVLAN:
57970+ /* this value will be used for next RXSTAT */
57971+ pAC->StatusLETable.Bmu.Stat.VlanId = STLE_GET_VLAN(pLE);
57972+ /* fall through */
57973+ case OP_RXCHKS:
57974+ /* this value will be used for next RXSTAT */
57975+ pAC->StatusLETable.Bmu.Stat.TcpSum1 = STLE_GET_TCP1(pLE);
57976+ pAC->StatusLETable.Bmu.Stat.TcpSum2 = STLE_GET_TCP2(pLE);
57977+#ifdef Y2_RECOVERY
57978+ pAC->LastPort = Port;
57979+ pAC->LastOpc = OP_RXCHKS;
57980+#endif
57981+ break;
57982+ case OP_RSS_HASH:
57983+ /* this value will be used for next RXSTAT */
57984+#if 0
57985+ pAC->StatusLETable.Bmu.Stat.RssHashValue = STLE_GET_RSS(pLE);
57986+#endif
57987+ break;
57988+ case OP_TXINDEXLE:
57989+ /*
57990+ ** :;:; TODO
57991+ ** it would be possible to check for which queues
57992+ ** the index has been changed and call
57993+ ** CheckForSendComplete() only for such queues
57994+ */
57995+ STLE_GET_DONE_IDX(pLE,LowVal,HighVal);
57996+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
57997+ ("LowVal: 0x%x HighVal: 0x%x\n", LowVal, HighVal));
57998+
57999+ /*
58000+ ** It would be possible to check whether we really
58001+ ** need the values for second port or sync queue,
58002+ ** but I think checking whether we need them is
58003+ ** more expensive than the calculation
58004+ */
58005+ DoneTxA[0] = STLE_GET_DONE_IDX_TXA1(LowVal,HighVal);
58006+ DoneTxS[0] = STLE_GET_DONE_IDX_TXS1(LowVal,HighVal);
58007+ DoneTxA[1] = STLE_GET_DONE_IDX_TXA2(LowVal,HighVal);
58008+ DoneTxS[1] = STLE_GET_DONE_IDX_TXS2(LowVal,HighVal);
58009+
58010+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
58011+ ("DoneTxa1 0x%x DoneTxS1: 0x%x DoneTxa2 0x%x DoneTxS2: 0x%x\n",
58012+ DoneTxA[0], DoneTxS[0], DoneTxA[1], DoneTxS[1]));
58013+
58014+ NewDone = SK_TRUE;
58015+ break;
58016+#ifdef USE_TIST_FOR_RESET
58017+ case OP_MOD_TXINDEX:
58018+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
58019+ ("OP_MOD_TXINDEX\n"));
58020+ SK_IN16(pAC->IoBase, Q_ADDR(Q_XA1, Q_DONE), &DoneTxA[0]);
58021+ if (pAC->GIni.GIMacsFound > 1) {
58022+ SK_IN16(pAC->IoBase, Q_ADDR(Q_XA2, Q_DONE), &DoneTxA[1]);
58023+ }
58024+ NewDone = SK_TRUE;
58025+ break;
58026+ case OP_MOD_LE:
58027+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DUMP,
58028+ ("Ignore marked LE on port in Reset\n"));
58029+ break;
58030+#endif
58031+
58032+ default:
58033+ /*
58034+ ** Have to handle the illegal Opcode in Status LE
58035+ */
58036+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
58037+ ("Unexpected OpCode\n"));
58038+ break;
58039+ }
58040+
58041+#ifdef Y2_RECOVERY
58042+ OpCode = STLE_GET_OPC(pLE) & ~HW_OWNER;
58043+ STLE_SET_OPC(pLE, OpCode);
58044+#else
58045+ /*
58046+ ** Reset own bit we have to do this in order to detect a overflow
58047+ */
58048+ STLE_SET_OPC(pLE, SW_OWNER);
58049+#endif
58050+ } /* while (OWN_OF_FIRST_LE(&pAC->StatusLETable) == HW_OWNER) */
58051+
58052+ /*
58053+ ** Now handle any new transmit complete
58054+ */
58055+ if (NewDone) {
58056+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
58057+ ("Done Index for Tx BMU has been changed\n"));
58058+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) {
58059+ /*
58060+ ** Do we have a new Done idx ?
58061+ */
58062+ if (DoneTxA[Port] != GET_DONE_INDEX(&pAC->TxPort[Port][0].TxALET)) {
58063+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
58064+ ("Check TxA%d\n", Port + 1));
58065+ CheckForSendComplete(pAC, pAC->IoBase, Port,
58066+ &(pAC->TxPort[Port][0].TxAQ_working),
58067+ &pAC->TxPort[Port][0].TxALET,
58068+ DoneTxA[Port]);
58069+ } else {
58070+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
58071+ ("No changes for TxA%d\n", Port + 1));
58072+ }
58073+#if USE_SYNC_TX_QUEUE
58074+ if (HW_SYNC_TX_SUPPORTED(pAC)) {
58075+ /*
58076+ ** Do we have a new Done idx ?
58077+ */
58078+ if (DoneTxS[Port] !=
58079+ GET_DONE_INDEX(&pAC->TxPort[Port][0].TxSLET)) {
58080+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
58081+ SK_DBGCAT_DRV_INT_SRC,
58082+ ("Check TxS%d\n", Port));
58083+ CheckForSendComplete(pAC, pAC->IoBase, Port,
58084+ &(pAC->TxPort[Port][0].TxSQ_working),
58085+ &pAC->TxPort[Port][0].TxSLET,
58086+ DoneTxS[Port]);
58087+ } else {
58088+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
58089+ SK_DBGCAT_DRV_INT_SRC,
58090+ ("No changes for TxS%d\n", Port));
58091+ }
58092+ }
58093+#endif
58094+ }
58095+ }
58096+ NewDone = SK_FALSE;
58097+
58098+ /*
58099+ ** Check whether we have to refill our RX table
58100+ */
58101+ if (HW_FEATURE(pAC, HWF_WA_DEV_420)) {
58102+ if (NbrRxBuffersInHW < MAX_NBR_RX_BUFFERS_IN_HW) {
58103+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) {
58104+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
58105+ ("Check for refill of RxBuffers on Port %c\n", 'A' + Port));
58106+ FillReceiveTableYukon2(pAC, pAC->IoBase, Port);
58107+ }
58108+ }
58109+ } else {
58110+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) {
58111+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
58112+ ("Check for refill of RxBuffers on Port %c\n", 'A' + Port));
58113+ if (NUM_FREE_LE_IN_TABLE(&pAC->RxPort[Port].RxLET) >= 64) {
58114+ FillReceiveTableYukon2(pAC, pAC->IoBase, Port);
58115+ }
58116+ }
58117+ }
58118+#ifdef CONFIG_SK98LIN_NAPI
58119+ if (*WorkDone >= WorkToDo) {
58120+ break;
58121+ }
58122+#endif
58123+ } while (OWN_OF_FIRST_LE(&pAC->StatusLETable) == HW_OWNER);
58124+
58125+ /*
58126+ ** Clear status BMU
58127+ */
58128+ SK_OUT32(pAC->IoBase, STAT_CTRL, SC_STAT_CLR_IRQ);
58129+
58130+ return(handledStatLE);
58131+} /* HandleStatusLEs */
58132+
58133+/*****************************************************************************
58134+ *
58135+ * AllocateAndInitLETables - allocate memory for the LETable and init
58136+ *
58137+ * Description:
58138+ * This function will allocate space for the LETable and will also
58139+ * initialize them. The size of the tables must have been specified
58140+ * before.
58141+ *
58142+ * Arguments:
58143+ * pAC - A pointer to the adapter context struct.
58144+ *
58145+ * Returns:
58146+ * SK_TRUE - all LETables initialized
58147+ * SK_FALSE - failed
58148+ */
58149+static SK_BOOL AllocateAndInitLETables(
58150+SK_AC *pAC) /* pointer to adapter context */
58151+{
58152+ char *pVirtMemAddr;
58153+ dma_addr_t pPhysMemAddr = 0;
58154+ SK_U32 CurrMac;
58155+ unsigned Size;
58156+ unsigned Aligned;
58157+ unsigned Alignment;
58158+
58159+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58160+ ("==> AllocateAndInitLETables()\n"));
58161+
58162+ /*
58163+ ** Determine how much memory we need with respect to alignment
58164+ */
58165+ Alignment = MAX_LEN_OF_LE_TAB;
58166+ Size = 0;
58167+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) {
58168+ SK_ALIGN_SIZE(LE_TAB_SIZE(RX_MAX_LE), Alignment, Aligned);
58169+ Size += Aligned;
58170+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXA_MAX_LE), Alignment, Aligned);
58171+ Size += Aligned;
58172+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXS_MAX_LE), Alignment, Aligned);
58173+ Size += Aligned;
58174+ }
58175+ SK_ALIGN_SIZE(LE_TAB_SIZE(ST_MAX_LE), Alignment, Aligned);
58176+ Size += Aligned;
58177+ Size += Alignment;
58178+ pAC->SizeOfAlignedLETables = Size;
58179+
58180+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58181+ ("Need %08x bytes in total\n", Size));
58182+
58183+ /*
58184+ ** Allocate the memory
58185+ */
58186+ pVirtMemAddr = pci_alloc_consistent(pAC->PciDev, Size, &pPhysMemAddr);
58187+ if (pVirtMemAddr == NULL) {
58188+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV,
58189+ SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR,
58190+ ("AllocateAndInitLETables: kernel malloc failed!\n"));
58191+ return (SK_FALSE);
58192+ }
58193+
58194+ /*
58195+ ** Initialize the memory
58196+ */
58197+ SK_MEMSET(pVirtMemAddr, 0, Size);
58198+ ALIGN_ADDR(pVirtMemAddr, Alignment); /* Macro defined in skgew.h */
58199+
58200+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58201+ ("Virtual address of LETab is %8p!\n", pVirtMemAddr));
58202+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58203+ ("Phys address of LETab is %8p!\n", (void *) pPhysMemAddr));
58204+
58205+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) {
58206+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58207+ ("RxLeTable for Port %c", 'A' + CurrMac));
58208+ SkGeY2InitSingleLETable(
58209+ pAC,
58210+ &pAC->RxPort[CurrMac].RxLET,
58211+ RX_MAX_LE,
58212+ pVirtMemAddr,
58213+ (SK_U32) (pPhysMemAddr & 0xffffffff),
58214+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32));
58215+
58216+ SK_ALIGN_SIZE(LE_TAB_SIZE(RX_MAX_LE), Alignment, Aligned);
58217+ pVirtMemAddr += Aligned;
58218+ pPhysMemAddr += Aligned;
58219+
58220+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58221+ ("TxALeTable for Port %c", 'A' + CurrMac));
58222+ SkGeY2InitSingleLETable(
58223+ pAC,
58224+ &pAC->TxPort[CurrMac][0].TxALET,
58225+ TXA_MAX_LE,
58226+ pVirtMemAddr,
58227+ (SK_U32) (pPhysMemAddr & 0xffffffff),
58228+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32));
58229+
58230+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXA_MAX_LE), Alignment, Aligned);
58231+ pVirtMemAddr += Aligned;
58232+ pPhysMemAddr += Aligned;
58233+
58234+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58235+ ("TxSLeTable for Port %c", 'A' + CurrMac));
58236+ SkGeY2InitSingleLETable(
58237+ pAC,
58238+ &pAC->TxPort[CurrMac][0].TxSLET,
58239+ TXS_MAX_LE,
58240+ pVirtMemAddr,
58241+ (SK_U32) (pPhysMemAddr & 0xffffffff),
58242+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32));
58243+
58244+ SK_ALIGN_SIZE(LE_TAB_SIZE(TXS_MAX_LE), Alignment, Aligned);
58245+ pVirtMemAddr += Aligned;
58246+ pPhysMemAddr += Aligned;
58247+ }
58248+
58249+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,("StLeTable"));
58250+
58251+ SkGeY2InitSingleLETable(
58252+ pAC,
58253+ &pAC->StatusLETable,
58254+ ST_MAX_LE,
58255+ pVirtMemAddr,
58256+ (SK_U32) (pPhysMemAddr & 0xffffffff),
58257+ (SK_U32) (((SK_U64) pPhysMemAddr) >> 32));
58258+
58259+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58260+ ("<== AllocateAndInitLETables(OK)\n"));
58261+ return(SK_TRUE);
58262+} /* AllocateAndInitLETables */
58263+
58264+/*****************************************************************************
58265+ *
58266+ * AllocatePacketBuffersYukon2 - allocate packet and fragment buffers
58267+ *
58268+ * Description:
58269+ * This function will allocate space for the packets and fragments
58270+ *
58271+ * Arguments:
58272+ * pAC - A pointer to the adapter context struct.
58273+ *
58274+ * Returns:
58275+ * SK_TRUE - Memory was allocated correctly
58276+ * SK_FALSE - An error occured
58277+ */
58278+static SK_BOOL AllocatePacketBuffersYukon2(
58279+SK_AC *pAC) /* pointer to adapter context */
58280+{
58281+ SK_PACKET *pRxPacket;
58282+ SK_PACKET *pTxPacket;
58283+ SK_U32 CurrBuff;
58284+ SK_U32 CurrMac;
58285+ unsigned long Flags; /* needed for POP/PUSH functions */
58286+
58287+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58288+ ("==> AllocatePacketBuffersYukon2()"));
58289+
58290+ for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) {
58291+ /*
58292+ ** Allocate RX packet space, initialize the packets and
58293+ ** add them to the RX waiting queue. Waiting queue means
58294+ ** that packet and fragment are initialized, but no sk_buff
58295+ ** has been assigned to it yet.
58296+ */
58297+ pAC->RxPort[CurrMac].ReceivePacketTable =
58298+ kmalloc((RX_MAX_NBR_BUFFERS * sizeof(SK_PACKET)), GFP_KERNEL);
58299+
58300+ if (pAC->RxPort[CurrMac].ReceivePacketTable == NULL) {
58301+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR,
58302+ ("AllocatePacketBuffersYukon2: no mem RxPkts (port %i)",CurrMac));
58303+ break;
58304+ } else {
58305+ SK_MEMSET(pAC->RxPort[CurrMac].ReceivePacketTable, 0,
58306+ (RX_MAX_NBR_BUFFERS * sizeof(SK_PACKET)));
58307+
58308+ pRxPacket = pAC->RxPort[CurrMac].ReceivePacketTable;
58309+
58310+ for (CurrBuff=0;CurrBuff<RX_MAX_NBR_BUFFERS;CurrBuff++) {
58311+ pRxPacket->pFrag = &(pRxPacket->FragArray[0]);
58312+ pRxPacket->NumFrags = 1;
58313+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->RxPort[CurrMac].RxQ_waiting, pRxPacket);
58314+ pRxPacket++;
58315+ }
58316+ }
58317+
58318+ /*
58319+ ** Allocate TX packet space, initialize the packets and
58320+ ** add them to the TX free queue. Free queue means that
58321+ ** packet is available and initialized, but no fragment
58322+ ** has been assigned to it. (Must be done at TX side)
58323+ */
58324+ pAC->TxPort[CurrMac][0].TransmitPacketTable =
58325+ kmalloc((TX_MAX_NBR_BUFFERS * sizeof(SK_PACKET)), GFP_KERNEL);
58326+
58327+ if (pAC->TxPort[CurrMac][0].TransmitPacketTable == NULL) {
58328+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_INIT | SK_DBGCAT_DRV_ERROR,
58329+ ("AllocatePacketBuffersYukon2: no mem TxPkts (port %i)",CurrMac));
58330+ kfree(pAC->RxPort[CurrMac].ReceivePacketTable);
58331+ return(SK_FALSE);
58332+ } else {
58333+ SK_MEMSET(pAC->TxPort[CurrMac][0].TransmitPacketTable, 0,
58334+ (TX_MAX_NBR_BUFFERS * sizeof(SK_PACKET)));
58335+
58336+ pTxPacket = pAC->TxPort[CurrMac][0].TransmitPacketTable;
58337+
58338+ for (CurrBuff=0;CurrBuff<TX_MAX_NBR_BUFFERS;CurrBuff++) {
58339+ PUSH_PKT_AS_LAST_IN_QUEUE(&pAC->TxPort[CurrMac][0].TxQ_free, pTxPacket);
58340+ pTxPacket++;
58341+ }
58342+ }
58343+ } /* end for (CurrMac = 0; CurrMac < pAC->GIni.GIMacsFound; CurrMac++) */
58344+
58345+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_INIT,
58346+ ("<== AllocatePacketBuffersYukon2 (OK)\n"));
58347+ return(SK_TRUE);
58348+
58349+} /* AllocatePacketBuffersYukon2 */
58350+
58351+/*****************************************************************************
58352+ *
58353+ * FreeLETables - release allocated memory of LETables
58354+ *
58355+ * Description:
58356+ * This function will free all resources of the LETables
58357+ *
58358+ * Arguments:
58359+ * pAC - A pointer to the adapter context struct.
58360+ *
58361+ * Returns: N/A
58362+ */
58363+static void FreeLETables(
58364+SK_AC *pAC) /* pointer to adapter control context */
58365+{
58366+ dma_addr_t pPhysMemAddr;
58367+ char *pVirtMemAddr;
58368+
58369+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
58370+ ("==> FreeLETables()\n"));
58371+
58372+ /*
58373+ ** The RxLETable is the first of all LET.
58374+ ** Therefore we can use its address for the input
58375+ ** of the free function.
58376+ */
58377+ pVirtMemAddr = (char *) pAC->RxPort[0].RxLET.pLETab;
58378+ pPhysMemAddr = (((SK_U64) pAC->RxPort[0].RxLET.pPhyLETABHigh << (SK_U64) 32) |
58379+ ((SK_U64) pAC->RxPort[0].RxLET.pPhyLETABLow));
58380+
58381+ /* free continuous memory */
58382+ pci_free_consistent(pAC->PciDev, pAC->SizeOfAlignedLETables,
58383+ pVirtMemAddr, pPhysMemAddr);
58384+
58385+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
58386+ ("<== FreeLETables()\n"));
58387+} /* FreeLETables */
58388+
58389+/*****************************************************************************
58390+ *
58391+ * FreePacketBuffers - free's all packet buffers of an adapter
58392+ *
58393+ * Description:
58394+ * This function will free all previously allocated memory of the
58395+ * packet buffers.
58396+ *
58397+ * Arguments:
58398+ * pAC - A pointer to the adapter context struct.
58399+ *
58400+ * Returns: N/A
58401+ */
58402+static void FreePacketBuffers(
58403+SK_AC *pAC) /* pointer to adapter control context */
58404+{
58405+ int Port;
58406+
58407+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
58408+ ("==> FreePacketBuffers()\n"));
58409+
58410+ for (Port = 0; Port < pAC->GIni.GIMacsFound; Port++) {
58411+ kfree(pAC->RxPort[Port].ReceivePacketTable);
58412+ kfree(pAC->TxPort[Port][0].TransmitPacketTable);
58413+ }
58414+
58415+ SK_DBG_MSG(pAC, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MSG,
58416+ ("<== FreePacketBuffers()\n"));
58417+} /* FreePacketBuffers */
58418+
58419+/*****************************************************************************
58420+ *
58421+ * AllocAndMapRxBuffer - fill one buffer into the receive packet/fragment
58422+ *
58423+ * Description:
58424+ * The function allocates a new receive buffer and assigns it to the
58425+ * the passsed receive packet/fragment
58426+ *
58427+ * Returns:
58428+ * SK_TRUE - a buffer was allocated and assigned
58429+ * SK_FALSE - a buffer could not be added
58430+ */
58431+static SK_BOOL AllocAndMapRxBuffer(
58432+SK_AC *pAC, /* pointer to the adapter control context */
58433+SK_PACKET *pSkPacket, /* pointer to packet that is to fill */
58434+int Port) /* port the packet belongs to */
58435+{
58436+ struct sk_buff *pMsgBlock; /* pointer to a new message block */
58437+ SK_U64 PhysAddr; /* physical address of a rx buffer */
58438+
58439+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
58440+ ("--> AllocAndMapRxBuffer (Port: %i)\n", Port));
58441+
58442+ pMsgBlock = alloc_skb(pAC->RxPort[Port].RxBufSize, GFP_ATOMIC);
58443+ if (pMsgBlock == NULL) {
58444+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
58445+ SK_DBGCAT_DRV_RX_PROGRESS | SK_DBGCAT_DRV_ERROR,
58446+ ("%s: Allocation of rx buffer failed !\n",
58447+ pAC->dev[Port]->name));
58448+ SK_PNMI_CNT_NO_RX_BUF(pAC, pAC->RxPort[Port].PortIndex);
58449+ return(SK_FALSE);
58450+ }
58451+ skb_reserve(pMsgBlock, 8);
58452+
58453+ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev,
58454+ virt_to_page(pMsgBlock->data),
58455+ ((unsigned long) pMsgBlock->data &
58456+ ~PAGE_MASK),
58457+ pAC->RxPort[Port].RxBufSize,
58458+ PCI_DMA_FROMDEVICE);
58459+
58460+ pSkPacket->pFrag->pVirt = pMsgBlock->data;
58461+ pSkPacket->pFrag->pPhys = PhysAddr;
58462+ pSkPacket->pFrag->FragLen = pAC->RxPort[Port].RxBufSize; /* for correct unmap */
58463+ pSkPacket->pMBuf = pMsgBlock;
58464+ pSkPacket->PacketLen = pAC->RxPort[Port].RxBufSize;
58465+
58466+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS,
58467+ ("<-- AllocAndMapRxBuffer\n"));
58468+
58469+ return (SK_TRUE);
58470+} /* AllocAndMapRxBuffer */
58471+
58472+/*******************************************************************************
58473+ *
58474+ * End of file
58475+ *
58476+ ******************************************************************************/
58477diff -ruN linux/drivers/net/sk98lin/sky2le.c linux-new/drivers/net/sk98lin/sky2le.c
58478--- linux/drivers/net/sk98lin/sky2le.c 1970-01-01 01:00:00.000000000 +0100
58479+++ linux-new/drivers/net/sk98lin/sky2le.c 2006-01-18 14:37:24.000000000 +0100
58480@@ -0,0 +1,512 @@
58481+/*****************************************************************************
58482+ *
58483+ * Name: sky2le.c
58484+ * Project: Gigabit Ethernet Adapters, Common Modules
58485+ * Version: $Revision$
58486+ * Date: $Date$
58487+ * Purpose: Functions for handling List Element Tables
58488+ *
58489+ *****************************************************************************/
58490+
58491+/******************************************************************************
58492+ *
58493+ * LICENSE:
58494+ * (C)Copyright 2002-2004 Marvell.
58495+ *
58496+ * This program is free software; you can redistribute it and/or modify
58497+ * it under the terms of the GNU General Public License as published by
58498+ * the Free Software Foundation; either version 2 of the License, or
58499+ * (at your option) any later version.
58500+ * The information in this file is provided "AS IS" without warranty.
58501+ * /LICENSE
58502+ *
58503+ ******************************************************************************/
58504+
58505+/*****************************************************************************
58506+ *
58507+ * Description:
58508+ *
58509+ * This module contains the code necessary for handling List Elements.
58510+ *
58511+ * Supported Gigabit Ethernet Chipsets:
58512+ * Yukon-2 (PCI, PCI-X, PCI-Express)
58513+ *
58514+ * Include File Hierarchy:
58515+ *
58516+ *
58517+ *****************************************************************************/
58518+#include "h/skdrv1st.h"
58519+#include "h/skdrv2nd.h"
58520+
58521+/* defines *******************************************************************/
58522+/* typedefs ******************************************************************/
58523+/* global variables **********************************************************/
58524+/* local variables ***********************************************************/
58525+
58526+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
58527+static const char SysKonnectFileId[] =
58528+ "@(#) $Id$ (C) Marvell.";
58529+#endif /* DEBUG || (!LINT && !SK_SLIM) */
58530+
58531+/* function prototypes *******************************************************/
58532+
58533+/*****************************************************************************
58534+ *
58535+ * SkGeY2InitSingleLETable() - initializes a list element table
58536+ *
58537+ * Description:
58538+ * This function will initialize the selected list element table.
58539+ * Should be called once during DriverInit. No InitLevel required.
58540+ *
58541+ * Arguments:
58542+ * pAC - pointer to the adapter context struct.
58543+ * pLETab - pointer to list element table structure
58544+ * NumLE - number of list elements in this table
58545+ * pVMem - virtual address of memory allocated for this LE table
58546+ * PMemLowAddr - physical address of memory to be used for the LE table
58547+ * PMemHighAddr
58548+ *
58549+ * Returns:
58550+ * nothing
58551+ */
58552+void SkGeY2InitSingleLETable(
58553+SK_AC *pAC, /* pointer to adapter context */
58554+SK_LE_TABLE *pLETab, /* pointer to list element table to be initialized */
58555+unsigned int NumLE, /* number of list elements to be filled in tab */
58556+void *pVMem, /* virtual address of memory used for list elements */
58557+SK_U32 PMemLowAddr, /* physical addr of mem used for LE */
58558+SK_U32 PMemHighAddr)
58559+{
58560+ unsigned int i;
58561+
58562+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58563+ ("==> SkGeY2InitSingleLETable()\n"));
58564+
58565+#ifdef DEBUG
58566+ if (NumLE != 2) { /* not table for polling unit */
58567+ if ((NumLE % MIN_LEN_OF_LE_TAB) != 0 || NumLE > MAX_LEN_OF_LE_TAB) {
58568+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
58569+ ("ERROR: Illegal number of list elements %d\n", NumLE));
58570+ }
58571+ }
58572+#endif /* DEBUG */
58573+
58574+ /* special case: unused list element table */
58575+ if (NumLE == 0) {
58576+ PMemLowAddr = 0;
58577+ PMemHighAddr = 0;
58578+ pVMem = 0;
58579+ }
58580+
58581+ /*
58582+ * in order to get the best possible performance the macros to access
58583+ * list elements use & instead of %
58584+ * this requires the length of LE tables to be a power of 2
58585+ */
58586+
58587+ /*
58588+ * this code guarantees that we use the next power of 2 below the
58589+ * value specified for NumLe - this way some LEs in the table may
58590+ * not be used but the macros work correctly
58591+ * this code does not check for bad values below 128 because in such a
58592+ * case we cannot do anything here
58593+ */
58594+
58595+ if ((NumLE != 2) && (NumLE != 0)) {
58596+ /* no check for polling unit and unused sync Tx */
58597+ i = MIN_LEN_OF_LE_TAB;
58598+ while (NumLE > i) {
58599+ i *= 2;
58600+ if (i > MAX_LEN_OF_LE_TAB) {
58601+ break;
58602+ }
58603+ }
58604+ if (NumLE != i) {
58605+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
58606+ ("ERROR: Illegal number of list elements %d adjusted to %d\n",
58607+ NumLE, (i / 2)));
58608+ NumLE = i / 2;
58609+ }
58610+ }
58611+
58612+ /* set addresses */
58613+ pLETab->pPhyLETABLow = PMemLowAddr;
58614+ pLETab->pPhyLETABHigh = PMemHighAddr;
58615+ pLETab->pLETab = pVMem;
58616+
58617+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58618+ ("contains %d LEs", NumLE));
58619+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58620+ (" and starts at virt %08lx and phys %08lx:%08lx\n",
58621+ pVMem, PMemHighAddr, PMemLowAddr));
58622+
58623+ /* initialize indexes */
58624+ pLETab->Done = 0;
58625+ pLETab->Put = 0;
58626+ pLETab->HwPut = 0;
58627+ /* initialize size */
58628+ pLETab->Num = NumLE;
58629+
58630+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58631+ ("<== SkGeY2InitSingleLETable()\n"));
58632+} /* SkGeY2InitSingleLETable */
58633+
58634+/*****************************************************************************
58635+ *
58636+ * SkGeY2InitPrefetchUnit() - Initialize a Prefetch Unit
58637+ *
58638+ * Description:
58639+ * Calling this function requires an already configured list element
58640+ * table. The prefetch unit to be configured is specified in the parameter
58641+ * 'Queue'. The function is able to initialze the prefetch units of
58642+ * the following queues: Q_R1, Q_R2, Q_XS1, Q_XS2, Q_XA1, Q_XA2.
58643+ * The funcution should be called before SkGeInitPort().
58644+ *
58645+ * Arguments:
58646+ * pAC - pointer to the adapter context struct.
58647+ * IoC - I/O context.
58648+ * Queue - I/O offset of queue e.g. Q_XA1.
58649+ * pLETab - pointer to list element table to be initialized
58650+ *
58651+ * Returns: N/A
58652+ */
58653+void SkGeY2InitPrefetchUnit(
58654+SK_AC *pAC, /* pointer to adapter context */
58655+SK_IOC IoC, /* I/O context */
58656+unsigned int Queue, /* Queue offset for finding the right registers */
58657+SK_LE_TABLE *pLETab) /* pointer to list element table to be initialized */
58658+{
58659+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58660+ ("==> SkGeY2InitPrefetchUnit()\n"));
58661+
58662+#ifdef DEBUG
58663+ if (Queue != Q_R1 && Queue != Q_R2 && Queue != Q_XS1 &&
58664+ Queue != Q_XS2 && Queue != Q_XA1 && Queue != Q_XA2) {
58665+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_ERR,
58666+ ("ERROR: Illegal queue identifier %x\n", Queue));
58667+ }
58668+#endif /* DEBUG */
58669+
58670+ /* disable the prefetch unit */
58671+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_SET);
58672+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_CLR);
58673+
58674+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58675+ ("Base address: %08lx:%08lx\n", pLETab->pPhyLETABHigh,
58676+ pLETab->pPhyLETABLow));
58677+
58678+ /* Set the list base address high part*/
58679+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_ADDR_HI_REG),
58680+ pLETab->pPhyLETABHigh);
58681+
58682+ /* Set the list base address low part */
58683+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_ADDR_LOW_REG),
58684+ pLETab->pPhyLETABLow);
58685+
58686+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58687+ ("Last index: %d\n", pLETab->Num-1));
58688+
58689+ /* Set the list last index */
58690+ SK_OUT16(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_LAST_IDX_REG),
58691+ (SK_U16)(pLETab->Num - 1));
58692+
58693+ /* turn on prefetch unit */
58694+ SK_OUT32(IoC, Y2_PREF_Q_ADDR(Queue, PREF_UNIT_CTRL_REG), PREF_UNIT_OP_ON);
58695+
58696+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58697+ ("<== SkGeY2InitPrefetchUnit()\n"));
58698+} /* SkGeY2InitPrefetchUnit */
58699+
58700+
58701+/*****************************************************************************
58702+ *
58703+ * SkGeY2InitStatBmu() - Initialize the Status BMU
58704+ *
58705+ * Description:
58706+ * Calling this function requires an already configured list element
58707+ * table. Ensure the status BMU is only initialized once during
58708+ * DriverInit - InitLevel2 required.
58709+ *
58710+ * Arguments:
58711+ * pAC - pointer to the adapter context struct.
58712+ * IoC - I/O context.
58713+ * pLETab - pointer to status LE table to be initialized
58714+ *
58715+ * Returns: N/A
58716+ */
58717+void SkGeY2InitStatBmu(
58718+SK_AC *pAC, /* pointer to adapter context */
58719+SK_IOC IoC, /* I/O context */
58720+SK_LE_TABLE *pLETab) /* pointer to status LE table */
58721+{
58722+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58723+ ("==> SkGeY2InitStatBmu()\n"));
58724+
58725+ /* disable the prefetch unit */
58726+ SK_OUT32(IoC, STAT_CTRL, SC_STAT_RST_SET);
58727+ SK_OUT32(IoC, STAT_CTRL, SC_STAT_RST_CLR);
58728+
58729+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58730+ ("Base address Low: %08lX\n", pLETab->pPhyLETABLow));
58731+
58732+ /* Set the list base address */
58733+ SK_OUT32(IoC, STAT_LIST_ADDR_LO, pLETab->pPhyLETABLow);
58734+
58735+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58736+ ("Base address High: %08lX\n", pLETab->pPhyLETABHigh));
58737+
58738+ SK_OUT32(IoC, STAT_LIST_ADDR_HI, pLETab->pPhyLETABHigh);
58739+
58740+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58741+ ("Last index: %d\n", pLETab->Num - 1));
58742+
58743+ /* Set the list last index */
58744+ SK_OUT16(IoC, STAT_LAST_IDX, (SK_U16)(pLETab->Num - 1));
58745+
58746+ if (HW_FEATURE(pAC, HWF_WA_DEV_43_418)) {
58747+
58748+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58749+ ("Set Tx index threshold\n"));
58750+ /* WA for dev. #4.3 */
58751+ SK_OUT16(IoC, STAT_TX_IDX_TH, ST_TXTH_IDX_MASK);
58752+
58753+ /* set Status-FIFO watermark */
58754+ SK_OUT8(IoC, STAT_FIFO_WM, 0x21); /* WA for dev. #4.18 */
58755+
58756+ /* set Status-FIFO ISR watermark */
58757+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 0x07); /* WA for dev. #4.18 */
58758+
58759+ /* WA for dev. #4.3 and #4.18 */
58760+ /* set Status-FIFO Tx timer init value */
58761+ SK_OUT32(IoC, STAT_TX_TIMER_INI, HW_MS_TO_TICKS(pAC, 10));
58762+ }
58763+ else {
58764+ /*
58765+ * Further settings may be added if required...
58766+ * 1) Status-FIFO watermark (STAT_FIFO_WM, STAT_FIFO_ISR_WM)
58767+ * 2) Status-FIFO timer values (STAT_TX_TIMER_INI,
58768+ * STAT_LEV_TIMER_INI and STAT_ISR_TIMER_INI)
58769+ * but tests shows that the default values give the best results,
58770+ * therefore the defaults are used.
58771+ */
58772+
58773+ /*
58774+ * Theses settings should avoid the
58775+ * temporary hanging of the status BMU.
58776+ * May be not all required... still under investigation...
58777+ */
58778+ SK_OUT16(IoC, STAT_TX_IDX_TH, 0x000a);
58779+
58780+ /* set Status-FIFO watermark */
58781+ SK_OUT8(IoC, STAT_FIFO_WM, 0x10);
58782+
58783+
58784+ /* set Status-FIFO ISR watermark */
58785+ if (HW_FEATURE(pAC, HWF_WA_DEV_4109)) {
58786+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 0x10);
58787+ }
58788+ else {
58789+ SK_OUT8(IoC, STAT_FIFO_ISR_WM, 0x04);
58790+ }
58791+
58792+ SK_OUT32(IoC, STAT_ISR_TIMER_INI, 0x0190);
58793+ }
58794+
58795+ /* start Status-FIFO timer */
58796+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58797+ ("Start Status FiFo timer\n"));
58798+
58799+ /* enable the prefetch unit */
58800+ /* operational bit not functional for Yukon-EC, but fixed in Yukon-2 */
58801+ SK_OUT32(IoC, STAT_CTRL, SC_STAT_OP_ON);
58802+
58803+ /* start Status-FIFO timer */
58804+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58805+ ("Start Status FiFo timer\n"));
58806+
58807+ SK_OUT8(IoC, STAT_TX_TIMER_CTRL, TIM_START);
58808+ SK_OUT8(IoC, STAT_LEV_TIMER_CTRL, TIM_START);
58809+ SK_OUT8(IoC, STAT_ISR_TIMER_CTRL, TIM_START);
58810+
58811+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58812+ ("<== SkGeY2InitStatBmu()\n"));
58813+} /* SkGeY2InitStatBmu */
58814+
58815+#ifdef USE_POLLING_UNIT
58816+/*****************************************************************************
58817+ *
58818+ * SkGeY2InitPollUnit() - Initialize the Polling Unit
58819+ *
58820+ * Description:
58821+ * This function will write the data of one polling LE table into the
58822+ * adapter.
58823+ *
58824+ * Arguments:
58825+ * pAC - pointer to the adapter context struct.
58826+ * IoC - I/O context.
58827+ * pLETab - pointer to polling LE table to be initialized
58828+ *
58829+ * Returns: N/A
58830+ */
58831+void SkGeY2InitPollUnit(
58832+SK_AC *pAC, /* pointer to adapter context */
58833+SK_IOC IoC, /* I/O context */
58834+SK_LE_TABLE *pLETab) /* pointer to polling LE table */
58835+{
58836+ SK_HWLE *pLE;
58837+ int i;
58838+#ifdef VCPU
58839+ VCPU_VARS();
58840+#endif /* VCPU */
58841+
58842+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58843+ ("==> SkGeY2InitPollUnit()\n"));
58844+
58845+#ifdef VCPU
58846+ for (i = 0; i < SK_MAX_MACS; i++) {
58847+ GET_PO_LE(pLE, pLETab, i);
58848+ VCPU_START_AND_COPY_LE();
58849+ /* initialize polling LE but leave indexes invalid */
58850+ POLE_SET_OPC(pLE, OP_PUTIDX | HW_OWNER);
58851+ POLE_SET_LINK(pLE, i);
58852+ POLE_SET_RXIDX(pLE, 0);
58853+ POLE_SET_TXAIDX(pLE, 0);
58854+ POLE_SET_TXSIDX(pLE, 0);
58855+ VCPU_WRITE_LE();
58856+ SK_DBG_DUMP_PO_LE(pLE);
58857+ }
58858+#endif /* VCPU */
58859+
58860+ /* disable the polling unit */
58861+ SK_OUT32(IoC, POLL_CTRL, PC_POLL_RST_SET);
58862+ SK_OUT32(IoC, POLL_CTRL, PC_POLL_RST_CLR);
58863+
58864+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58865+ ("Base address Low: %08lX\n", pLETab->pPhyLETABLow));
58866+
58867+ /* Set the list base address */
58868+ SK_OUT32(IoC, POLL_LIST_ADDR_LO, pLETab->pPhyLETABLow);
58869+
58870+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58871+ ("Base address High: %08lX\n", pLETab->pPhyLETABHigh));
58872+
58873+ SK_OUT32(IoC, POLL_LIST_ADDR_HI, pLETab->pPhyLETABHigh);
58874+
58875+ /* we don't need to write the last index - it is hardwired to 1 */
58876+
58877+ /* enable the prefetch unit */
58878+ SK_OUT32(IoC, POLL_CTRL, PC_POLL_OP_ON);
58879+
58880+ /*
58881+ * now we have to start the descriptor poll timer because it triggers
58882+ * the polling unit
58883+ */
58884+
58885+ /*
58886+ * still playing with the value (timer runs at 125 MHz)
58887+ * descriptor poll timer is enabled by GeInit
58888+ */
58889+ SK_OUT32(IoC, B28_DPT_INI,
58890+ (SK_DPOLL_DEF_Y2 * (SK_U32)pAC->GIni.GIHstClkFact / 100));
58891+
58892+ SK_OUT8(IoC, B28_DPT_CTRL, TIM_START);
58893+
58894+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
58895+ ("<== SkGeY2InitPollUnit()\n"));
58896+} /* SkGeY2InitPollUnit */
58897+#endif /* USE_POLLING_UNIT */
58898+
58899+
58900+/******************************************************************************
58901+ *
58902+ * SkGeY2SetPutIndex
58903+ *
58904+ * Description:
58905+ * This function is writing the Done index of a transmit
58906+ * list element table.
58907+ *
58908+ * Notes:
58909+ * Dev. Issue 4.2
58910+ *
58911+ * Returns: N/A
58912+ */
58913+void SkGeY2SetPutIndex(
58914+SK_AC *pAC, /* pointer to adapter context */
58915+SK_IOC IoC, /* pointer to the IO context */
58916+SK_U32 StartAddrPrefetchUnit, /* start address of the prefetch unit */
58917+SK_LE_TABLE *pLETab) /* list element table to work with */
58918+{
58919+ unsigned int Put;
58920+ SK_U16 EndOfListIndex;
58921+ SK_U16 HwGetIndex;
58922+ SK_U16 HwPutIndex;
58923+
58924+ /* set put index we would like to write */
58925+ Put = GET_PUT_IDX(pLETab);
58926+
58927+ /*
58928+ * in this case we wrap around
58929+ * new put is lower than last put given to hw
58930+ */
58931+ if (Put < pLETab->HwPut) {
58932+
58933+ /* set put index = last index of list */
58934+ EndOfListIndex = (NUM_LE_IN_TABLE(pLETab)-1);
58935+
58936+ /* read get index of hw prefetch unit */
58937+ SK_IN16(IoC, (StartAddrPrefetchUnit + PREF_UNIT_GET_IDX_REG),
58938+ &HwGetIndex);
58939+
58940+ /* read put index of hw prefetch unit */
58941+ SK_IN16(IoC, (StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG),
58942+ &HwPutIndex);
58943+
58944+ /* prefetch unit reached end of list */
58945+ /* prefetch unit reached first list element */
58946+ if (HwGetIndex == 0) {
58947+ /* restore watermark */
58948+ SK_OUT8(IoC, StartAddrPrefetchUnit + PREF_UNIT_FIFO_WM_REG, 0xe0U);
58949+ /* write put index */
58950+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG,
58951+ (SK_U16)Put);
58952+
58953+ /* remember put index we wrote to hw */
58954+ pLETab->HwPut = Put;
58955+ }
58956+ else if (HwGetIndex == EndOfListIndex) {
58957+ /* set watermark to one list element */
58958+ SK_OUT8(IoC, StartAddrPrefetchUnit + PREF_UNIT_FIFO_WM_REG, 8);
58959+ /* set put index to first list element */
58960+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG, 0);
58961+ }
58962+ /* prefetch unit did not reach end of list yet */
58963+ /* and we did not write put index to end of list yet */
58964+ else if ((HwPutIndex != EndOfListIndex) &&
58965+ (HwGetIndex != EndOfListIndex)) {
58966+ /* write put index */
58967+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG,
58968+ EndOfListIndex);
58969+ }
58970+ else {
58971+ /* do nothing */
58972+ }
58973+ }
58974+ else {
58975+#ifdef XXX /* leads in to problems in the Windows Driver */
58976+ if (Put != pLETab->HwPut) {
58977+ /* write put index */
58978+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG,
58979+ (SK_U16)Put);
58980+ /* update put index */
58981+ UPDATE_HWPUT_IDX(pLETab);
58982+ }
58983+#else
58984+ /* write put index */
58985+ SK_OUT16(IoC, StartAddrPrefetchUnit + PREF_UNIT_PUT_IDX_REG,
58986+ (SK_U16)Put);
58987+ /* update put index */
58988+ UPDATE_HWPUT_IDX(pLETab);
58989+#endif
58990+ }
58991+} /* SkGeY2SetPutIndex */
58992+
58993diff -ruN linux/Documentation/networking/sk98lin.txt linux-new/Documentation/networking/sk98lin.txt
58994--- linux/Documentation/networking/sk98lin.txt 2006-04-11 19:19:28.000000000 +0200
58995+++ linux-new/drivers/net/sk98lin/sk98lin.txt 2006-01-18 14:37:24.000000000 +0100
58996@@ -1,38 +1,56 @@
58997-(C)Copyright 1999-2004 Marvell(R).
58998-All rights reserved
58999-===========================================================================
59000+(C)Copyright 1999-2006 Marvell(R).
59001+All rights reserved.
59002+================================================================================
59003
59004-sk98lin.txt created 13-Feb-2004
59005+sk98lin.txt created 18-Jan-2006
59006
59007-Readme File for sk98lin v6.23
59008-Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX
59009+Readme File for sk98lin v8.31.2.3
59010+Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter driver for LINUX
59011
59012 This file contains
59013 1 Overview
59014- 2 Required Files
59015- 3 Installation
59016- 3.1 Driver Installation
59017- 3.2 Inclusion of adapter at system start
59018- 4 Driver Parameters
59019- 4.1 Per-Port Parameters
59020- 4.2 Adapter Parameters
59021- 5 Large Frame Support
59022- 6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
59023- 7 Troubleshooting
59024+ 2 Supported Functions
59025+ 3 Required Files
59026+ 4 Installation
59027+ 4.1 Driver Installation
59028+ 4.2 Inclusion of adapter at system start
59029+ 5 Driver Parameters
59030+ 5.1 Per-Port Parameters
59031+ 5.2 Adapter Parameters
59032+ 6 Ethtool Support
59033+ 7 Large Frame Support
59034+ 8 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
59035+ 9 Wake on Lan support
59036+10 Troubleshooting
59037
59038-===========================================================================
59039+================================================================================
59040
59041
59042 1 Overview
59043 ===========
59044
59045-The sk98lin driver supports the Marvell Yukon and SysKonnect
59046-SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux. It has
59047-been tested with Linux on Intel/x86 machines.
59048+The sk98lin driver supports the Marvell Yukon, Yukon EC/FE, Yukon 2
59049+and SysKonnect SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux.
59050+It has been tested with Linux on Intel/x86, x86_64 and IA64 machines.
59051 ***
59052
59053+2 Supported Functions
59054+======================
59055+
59056+The following functions are supported by the driver:
59057
59058-2 Required Files
59059+ NOTE 1: The hardware support depends on the used card
59060+
59061+ - RX/TX HW Checksum
59062+ - Hardware interrupt moderation (static/dynamic)
59063+ - Transmit poll
59064+ - Zerocopy/Scatter-Gather
59065+ - Ethtool support
59066+ - Wake on Lan (Magic Packet only) (From suspend and APM only)
59067+ - DualNet
59068+
59069+
59070+3 Required Files
59071 =================
59072
59073 The linux kernel source.
59074@@ -40,16 +58,14 @@
59075 ***
59076
59077
59078-3 Installation
59079+4 Installation
59080 ===============
59081
59082 It is recommended to download the latest version of the driver from the
59083-SysKonnect web site www.syskonnect.com. If you have downloaded the latest
59084-driver, the Linux kernel has to be patched before the driver can be
59085-installed. For details on how to patch a Linux kernel, refer to the
59086-patch.txt file.
59087+SysKonnect web site www.syskonnect.com. For details on Installation
59088+Instructions for sk98lin Driver, please refer to the README.txt file.
59089
59090-3.1 Driver Installation
59091+4.1 Driver Installation
59092 ------------------------
59093
59094 The following steps describe the actions that are required to install
59095@@ -91,7 +107,7 @@
59096 with (M)
59097 5. Execute the command "make modules".
59098 6. Execute the command "make modules_install".
59099- The appropriate modules will be installed.
59100+ The appropiate modules will be installed.
59101 7. Reboot your system.
59102
59103
59104@@ -110,13 +126,13 @@
59105
59106 NOTE 1: If you have more than one Marvell Yukon or SysKonnect SK-98xx
59107 adapter installed, the adapters will be listed as 'eth0',
59108- 'eth1', 'eth2', etc.
59109- For each adapter, repeat steps 3 and 4 below.
59110+ 'eth1', 'eth2', etc.
59111+ For each adapter, repeat steps 3 and 4 below.
59112
59113 NOTE 2: If you have other Ethernet adapters installed, your Marvell
59114 Yukon or SysKonnect SK-98xx adapter will be mapped to the
59115- next available number, e.g. 'eth1'. The mapping is executed
59116- automatically.
59117+ next available number, e.g. 'eth1'. The mapping is executed
59118+ automatically.
59119 The module installation message (displayed either in a system
59120 log file or on the console) prints a line for each adapter
59121 found containing the corresponding 'ethX'.
59122@@ -153,7 +169,7 @@
59123 1. Execute the command "ifconfig eth0 down".
59124 2. Execute the command "rmmod sk98lin".
59125
59126-3.2 Inclusion of adapter at system start
59127+4.2 Inclusion of adapter at system start
59128 -----------------------------------------
59129
59130 Since a large number of different Linux distributions are
59131@@ -165,7 +181,8 @@
59132
59133 ***
59134
59135-4 Driver Parameters
59136+
59137+5 Driver Parameters
59138 ====================
59139
59140 Parameters can be set at the command line after the module has been
59141@@ -174,7 +191,7 @@
59142 to the driver module.
59143
59144 If you use the kernel module loader, you can set driver parameters
59145-in the file /etc/modprobe.conf (or /etc/modules.conf in 2.4 or earlier).
59146+in the file /etc/modules.conf (or old name: /etc/conf.modules).
59147 To set the driver parameters in this file, proceed as follows:
59148
59149 1. Insert a line of the form :
59150@@ -208,7 +225,7 @@
59151 more adapters, adjust this and recompile.
59152
59153
59154-4.1 Per-Port Parameters
59155+5.1 Per-Port Parameters
59156 ------------------------
59157
59158 These settings are available for each port on the adapter.
59159@@ -245,7 +262,7 @@
59160 This parameters is only relevant if auto-negotiation for this port is
59161 not set to "Sense". If auto-negotiation is set to "On", all three values
59162 are possible. If it is set to "Off", only "Full" and "Half" are allowed.
59163-This parameter is useful if your link partner does not support all
59164+This parameter is usefull if your link partner does not support all
59165 possible combinations.
59166
59167 Flow Control
59168@@ -282,7 +299,7 @@
59169 with this parameter.
59170
59171
59172-4.2 Adapter Parameters
59173+5.2 Adapter Parameters
59174 -----------------------
59175
59176 Connection Type (SK-98xx V2.0 copper adapters only)
59177@@ -379,7 +396,6 @@
59178 is tremendous. On the other hand, selecting a very short moderation time might
59179 compensate the use of any moderation being applied.
59180
59181-
59182 Preferred Port
59183 --------------
59184 Parameter: PrefPort
59185@@ -394,7 +410,7 @@
59186 ------------------------------------------------
59187 Parameter: RlmtMode
59188 Values: CheckLinkState,CheckLocalPort, CheckSeg, DualNet
59189-Default: CheckLinkState
59190+Default: CheckLinkState (DualNet on dual port adapters)
59191
59192 RLMT monitors the status of the port. If the link of the active port
59193 fails, RLMT switches immediately to the standby link. The virtual link is
59194@@ -429,10 +445,94 @@
59195 where a network path between the ports on one adapter exists.
59196 Moreover, they are not designed to work where adapters are connected
59197 back-to-back.
59198+
59199+LowLatency
59200+----------
59201+Parameter: LowLatency
59202+Values: On, Off
59203+Default: Off
59204+
59205+This is used to reduce the packet latency time of the adapter. Setting the
59206+LowLatency parameter to 'On' forces the adapter to pass any received packet
59207+immediately to upper network layers and to send out any transmit packet as
59208+fast as possible.
59209+
59210+NOTE 1: The system load increases if LowLatency is set to 'On' and a lot
59211+ of data packets are transmitted and received.
59212+
59213+NOTE 2: This parameter is only used on adapters which are based on
59214+ PCI Express compatible chipsets.
59215 ***
59216
59217
59218-5 Large Frame Support
59219+6 Ethtool Support
59220+==================
59221+
59222+The sk98lin driver provides built-in ethtool support. The ethtool
59223+can be used to display or modify interface specific configurations.
59224+
59225+Ethtool commands are invoked using a single parameter which reflects
59226+the requested ethtool command plus an optional number of parameters
59227+which belong to the desired command.
59228+
59229+It is not the intention of this section to explain the ethtool command
59230+line tool and all its options. For further information refer to the
59231+manpage of the ethtool. This sections describes only the sk98lin
59232+driver supported ethtool commands.
59233+
59234+Pause Parameters
59235+----------------
59236+Query command: -a
59237+Set command: -A [autoneg on|off] [rx on|off] [tx on|off]
59238+Sample: ethtool -A eth0 rx off tx off
59239+
59240+Coalescing Parameters
59241+---------------------
59242+Query command: -c
59243+Set command: -C [sample-interval I]
59244+ [rx-usecs N] [tx-usecs N]
59245+ [rx-usecs-low N] [tx-usecs-low N]
59246+ [rx-usecs-high N] [tx-usecs-high N]
59247+Parameter: I = Length of sample interval, in seconds
59248+ (supported values range from 1...10)
59249+ N = Length of coalescing interval, in microseconds
59250+ (supported values range from 25...33,333)
59251+Sample: ethtool -C eth2 rx-usecs 500 tx-usecs 500
59252+
59253+NOTE: The sk98lin driver does not support different settings
59254+ for the rx and tx interrupt coalescing parameters.
59255+
59256+Driver Information
59257+------------------
59258+Query command: -i
59259+Sample: ethtool -i eth1
59260+
59261+Checksumming Parameters
59262+-----------------------
59263+Query command: -k
59264+Set command: -K [rx on|off] [tx on|off] [sg on|off]
59265+Sample: ethtool -K eth0 sg off
59266+
59267+Locate NIC Command
59268+------------------
59269+Query command: -p [N]
59270+Parameter: N = Amount of time to perform locate NIC command, in seconds
59271+Sample: ethtool -p 10 eth1
59272+
59273+Driver-specific Statistics
59274+--------------------------
59275+Query command: -S
59276+Sample: ethtool -S eth0
59277+
59278+Setting Parameters
59279+------------------
59280+Set command: -s [speed 10|100|1000] [duplex half|full]
59281+ [autoneg on|off] [wol gd]
59282+Sample: ethtool -s eth2 wol d
59283+***
59284+
59285+
59286+7 Large Frame Support
59287 ======================
59288
59289 The driver supports large frames (also called jumbo frames). Using large
59290@@ -444,10 +544,10 @@
59291 ifconfig eth0 mtu 9000
59292 This will only work if you have two adapters connected back-to-back
59293 or if you use a switch that supports large frames. When using a switch,
59294-it should be configured to allow large frames and auto-negotiation should
59295-be set to OFF. The setting must be configured on all adapters that can be
59296-reached by the large frames. If one adapter is not set to receive large
59297-frames, it will simply drop them.
59298+it should be configured to allow large frames. The setting must be
59299+configured on all adapters that can be reached by the large frames.
59300+If one adapter is not set to receive large frames, it will simply drop
59301+them.
59302
59303 You can switch back to the standard ethernet frame size by executing the
59304 following command:
59305@@ -459,7 +559,7 @@
59306 ***
59307
59308
59309-6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
59310+8 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
59311 ==================================================================
59312
59313 The Marvell Yukon/SysKonnect Linux drivers are able to support VLAN and
59314@@ -477,8 +577,21 @@
59315 cause problems when unloading the driver.
59316
59317
59318-7 Troubleshooting
59319-==================
59320+9 Wake on Lan support
59321+======================
59322+
59323+The sk98lin driver supports wake up from suspend mode with MagicPacket
59324+on APM systems. Wake on Lan support is enabled by default. To disable it
59325+please use the ethtool.
59326+
59327+NOTE 1: APM support has to be enabled in BIOS and in the kernel.
59328+
59329+NOTE 2: Refer to the kernel documentation for additional requirements
59330+ regarding APM support.
59331+
59332+
59333+10 Troubleshooting
59334+===================
59335
59336 If any problems occur during the installation process, check the
59337 following list:
59338diff -ruN linux/drivers/net/Kconfig linux-new/drivers/net/Kconfig
59339--- linux/drivers/net/Kconfig 2006-04-12 18:56:12.000000000 +0200
59340+++ linux-new/drivers/net/Kconfig 2006-04-12 18:59:13.633862750 +0200
59341@@ -2181,22 +2181,32 @@
59342 To compile this driver as a module, choose M here: the module
59343 will be called sky2. This is recommended.
59344
59345+
59346 config SK98LIN
59347 tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
59348 depends on PCI
59349 ---help---
59350 Say Y here if you have a Marvell Yukon or SysKonnect SK-98xx/SK-95xx
59351- compliant Gigabit Ethernet Adapter.
59352-
59353- This driver supports the original Yukon chipset. A cleaner driver is
59354- also available (skge) which seems to work better than this one.
59355-
59356- This driver does not support the newer Yukon2 chipset. A seperate
59357- driver, sky2, is provided to support Yukon2-based adapters.
59358-
59359- The following adapters are supported by this driver:
59360+ compliant Gigabit Ethernet Adapter. The following adapters are supported
59361+ by this driver:
59362 - 3Com 3C940 Gigabit LOM Ethernet Adapter
59363 - 3Com 3C941 Gigabit LOM Ethernet Adapter
59364+ - 88E8021 Marvell 1000 Mbit PCI-X, single Port Copper
59365+ - 88E8021 Marvell 1000 Mbit PCI-X, single Port Fiber LX
59366+ - 88E8021 Marvell 1000 Mbit PCI-X, single Port Fiber SX
59367+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Copper
59368+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Copper (Gateway)
59369+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Fiber LX
59370+ - 88E8022 Marvell 1000 Mbit PCI-X, dual Port Fiber SX
59371+ - 88E8061 Marvell 1000 Mbit PCI-E, single Port Copper
59372+ - 88E8061 Marvell 1000 Mbit PCI-E, single Port Fiber LX
59373+ - 88E8061 Marvell 1000 Mbit PCI-E, single Port Fiber SX
59374+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Copper
59375+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Copper (Gateway)
59376+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Fiber LX
59377+ - 88E8062 Marvell 1000 Mbit PCI-E, dual Port Fiber SX
59378+ - Abocom EFE3K - 10/100 Ethernet Expresscard
59379+ - Abocom EGE5K - Giga Ethernet Expresscard
59380 - Allied Telesyn AT-2970LX Gigabit Ethernet Adapter
59381 - Allied Telesyn AT-2970LX/2SC Gigabit Ethernet Adapter
59382 - Allied Telesyn AT-2970SX Gigabit Ethernet Adapter
59383@@ -2206,31 +2216,82 @@
59384 - Allied Telesyn AT-2971SX Gigabit Ethernet Adapter
59385 - Allied Telesyn AT-2971T Gigabit Ethernet Adapter
59386 - Belkin Gigabit Desktop Card 10/100/1000Base-T Adapter, Copper RJ-45
59387+ - DGE-530T Gigabit Ethernet Adapter
59388+ - DGE-560T Gigabit Ethernet Adapter
59389 - EG1032 v2 Instant Gigabit Network Adapter
59390 - EG1064 v2 Instant Gigabit Network Adapter
59391- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Abit)
59392- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Albatron)
59393- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Asus)
59394- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (ECS)
59395- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Epox)
59396- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Foxconn)
59397- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Gigabyte)
59398- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Iwill)
59399- - Marvell 88E8050 Gigabit LOM Ethernet Adapter (Intel)
59400+ - Marvell 88E8001 Gigabit Ethernet Controller (Abit)
59401+ - Marvell 88E8001 Gigabit Ethernet Controller (Albatron)
59402+ - Marvell 88E8001 Gigabit Ethernet Controller (Asus)
59403+ - Marvell 88E8001 Gigabit Ethernet Controller (Chaintech)
59404+ - Marvell 88E8001 Gigabit Ethernet Controller (ECS)
59405+ - Marvell 88E8001 Gigabit Ethernet Controller (Epox)
59406+ - Marvell 88E8001 Gigabit Ethernet Controller (Foxconn)
59407+ - Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte)
59408+ - Marvell 88E8001 Gigabit Ethernet Controller (Iwill)
59409+ - Marvell 88E8035 Fast Ethernet Controller (LGE)
59410+ - Marvell 88E8035 Fast Ethernet Controller (Toshiba)
59411+ - Marvell 88E8036 Fast Ethernet Controller (Arima)
59412+ - Marvell 88E8036 Fast Ethernet Controller (Compal)
59413+ - Marvell 88E8036 Fast Ethernet Controller (Inventec)
59414+ - Marvell 88E8036 Fast Ethernet Controller (LGE)
59415+ - Marvell 88E8036 Fast Ethernet Controller (Mitac)
59416+ - Marvell 88E8036 Fast Ethernet Controller (Panasonic)
59417+ - Marvell 88E8036 Fast Ethernet Controller (Quanta)
59418+ - Marvell 88E8036 Fast Ethernet Controller (Toshiba)
59419+ - Marvell 88E8036 Fast Ethernet Controller (Wistron)
59420+ - Marvell 88E8050 Gigabit Ethernet Controller (Gateway)
59421+ - Marvell 88E8050 Gigabit Ethernet Controller (Intel)
59422+ - Marvell 88E8052 Gigabit Ethernet Controller (ASRock)
59423+ - Marvell 88E8052 Gigabit Ethernet Controller (Aopen)
59424+ - Marvell 88E8052 Gigabit Ethernet Controller (Asus)
59425+ - Marvell 88E8052 Gigabit Ethernet Controller (Gateway)
59426+ - Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)
59427+ - Marvell 88E8052 Gigabit Ethernet Controller (MSI)
59428+ - Marvell 88E8052 Gigabit Ethernet Controller (Wistron)
59429+ - Marvell 88E8053 Gigabit Ethernet Controller (ASRock)
59430+ - Marvell 88E8053 Gigabit Ethernet Controller (Albatron)
59431+ - Marvell 88E8053 Gigabit Ethernet Controller (Aopen)
59432+ - Marvell 88E8053 Gigabit Ethernet Controller (Arima)
59433+ - Marvell 88E8053 Gigabit Ethernet Controller (Asus)
59434+ - Marvell 88E8053 Gigabit Ethernet Controller (Chaintech)
59435+ - Marvell 88E8053 Gigabit Ethernet Controller (Clevo)
59436+ - Marvell 88E8053 Gigabit Ethernet Controller (Compal)
59437+ - Marvell 88E8053 Gigabit Ethernet Controller (DFI)
59438+ - Marvell 88E8053 Gigabit Ethernet Controller (ECS)
59439+ - Marvell 88E8053 Gigabit Ethernet Controller (Epox)
59440+ - Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)
59441+ - Marvell 88E8053 Gigabit Ethernet Controller (Inventec)
59442+ - Marvell 88E8053 Gigabit Ethernet Controller (LGE)
59443+ - Marvell 88E8053 Gigabit Ethernet Controller (MSI)
59444+ - Marvell 88E8053 Gigabit Ethernet Controller (Mitac)
59445+ - Marvell 88E8053 Gigabit Ethernet Controller (Panasonic)
59446+ - Marvell 88E8053 Gigabit Ethernet Controller (Quanta)
59447+ - Marvell 88E8053 Gigabit Ethernet Controller (SOYO)
59448+ - Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
59449+ - Marvell 88E8053 Gigabit Ethernet Controller (Toshiba)
59450+ - Marvell 88E8053 Gigabit Ethernet Controller (Trigem)
59451+ - Marvell RDK-8001
59452 - Marvell RDK-8001 Adapter
59453 - Marvell RDK-8002 Adapter
59454+ - Marvell RDK-8003
59455 - Marvell RDK-8003 Adapter
59456 - Marvell RDK-8004 Adapter
59457 - Marvell RDK-8006 Adapter
59458 - Marvell RDK-8007 Adapter
59459 - Marvell RDK-8008 Adapter
59460 - Marvell RDK-8009 Adapter
59461- - Marvell RDK-8010 Adapter
59462+ - Marvell RDK-8010
59463 - Marvell RDK-8011 Adapter
59464 - Marvell RDK-8012 Adapter
59465- - Marvell RDK-8052 Adapter
59466- - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (32 bit)
59467- - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (64 bit)
59468+ - Marvell RDK-8035
59469+ - Marvell RDK-8036
59470+ - Marvell RDK-8052
59471+ - Marvell RDK-8053
59472+ - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit)
59473+ - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit)
59474+ - Marvell Yukon-EC Ultra, no ASF (Battery Power Service Support)
59475+ - Marvell Yukon-FE Fast Ethernet, Reduced Battery Power Service Support)
59476 - N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)
59477 - SK-9521 10/100/1000Base-T Adapter
59478 - SK-9521 V2.0 10/100/1000Base-T Adapter
59479@@ -2250,21 +2311,37 @@
59480 - SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)
59481 - SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
59482 - SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
59483+ - SK-9S21 Server Adapter
59484+ - SK-9S22 Server Adapter
59485+ - SK-9S24 Server Adapter
59486+ - SK-9S34 Server Adapter
59487+ - SK-9S81 Server Adapter
59488+ - SK-9S82 Server Adapter
59489+ - SK-9S91 Server Adapter
59490+ - SK-9S92 Server Adapter
59491 - SMC EZ Card 1000 (SMC9452TXV.2)
59492
59493 The adapters support Jumbo Frames.
59494 The dual link adapters support link-failover and dual port features.
59495 Both Marvell Yukon and SysKonnect SK-98xx/SK-95xx adapters support
59496 the scatter-gather functionality with sendfile(). Please refer to
59497- <file:Documentation/networking/sk98lin.txt> for more information about
59498+ Documentation/networking/sk98lin.txt for more information about
59499 optional driver parameters.
59500 Questions concerning this driver may be addressed to:
59501- <linux@syskonnect.de>
59502+ linux@syskonnect.de
59503
59504 If you want to compile this driver as a module ( = code which can be
59505 inserted in and removed from the running kernel whenever you want),
59506- say M here and read <file:Documentation/kbuild/modules.txt>. The module will
59507- be called sk98lin. This is recommended.
59508+ say M here and read Documentation/modules.txt. This is recommended.
59509+ The module will be called sk98lin. This is recommended.
59510+
59511+config SK98LIN_NAPI
59512+ bool "Use Rx polling (NAPI)"
59513+ depends on SK98LIN
59514+ help
59515+ NAPI is a new driver API designed to reduce CPU and interrupt load
59516+ when the driver is receiving lots of packets from the card.
59517+
59518
59519 config VIA_VELOCITY
59520 tristate "VIA Velocity support"
This page took 6.94259 seconds and 4 git commands to generate.