patch-2.4.0-test9 linux/drivers/net/sk98lin/skgepnmi.c
Next file: linux/drivers/net/sk98lin/skgesirq.c
Previous file: linux/drivers/net/sk98lin/skgeinit.c
Back to the patch index
Back to the overall index
- Lines: 513
- Date:
Fri Sep 15 14:34:19 2000
- Orig file:
v2.4.0-test8/linux/drivers/net/sk98lin/skgepnmi.c
- Orig date:
Tue Nov 23 10:15:42 1999
diff -u --recursive --new-file v2.4.0-test8/linux/drivers/net/sk98lin/skgepnmi.c linux/drivers/net/sk98lin/skgepnmi.c
@@ -2,8 +2,8 @@
*
* Name: skgepnmi.c
* Project: GEnesis, PCI Gigabit Ethernet Adapter
- * Version: $Revision: 1.69 $
- * Date: $Date: 1999/10/18 11:42:15 $
+ * Version: $Revision: 1.78 $
+ * Date: $Date: 2000/09/12 10:44:58 $
* Purpose: Private Network Management Interface
*
****************************************************************************/
@@ -13,8 +13,6 @@
* (C)Copyright 1998,1999 SysKonnect,
* a business unit of Schneider & Koch & Co. Datensysteme GmbH.
*
- * See the file "skge.c" for further information.
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -29,6 +27,43 @@
* History:
*
* $Log: skgepnmi.c,v $
+ * Revision 1.78 2000/09/12 10:44:58 cgoos
+ * Fixed SK_PNMI_STORE_U32 calls with typecasted argument.
+ *
+ * Revision 1.77 2000/09/07 08:10:19 rwahl
+ * - Modified algorithm for 64bit NDIS statistic counters;
+ * returns 64bit or 32bit value depending on passed buffer
+ * size. Indicate capability for 64bit NDIS counter, if passed
+ * buffer size is zero. OID_GEN_XMIT_ERROR, OID_GEN_RCV_ERROR,
+ * and OID_GEN_RCV_NO_BUFFER handled as 64bit counter, too.
+ * - corrected OID_SKGE_RLMT_PORT_PREFERRED.
+ *
+ * Revision 1.76 2000/08/03 15:23:39 rwahl
+ * - Correction for FrameTooLong counter has to be moved to OID handling
+ * routines (instead of statistic counter routine).
+ * - Fix in XMAC Reset Event handling: Only offset counter for hardware
+ * statistic registers are updated.
+ *
+ * Revision 1.75 2000/08/01 16:46:05 rwahl
+ * - Added StatRxLongFrames counter and correction of FrameTooLong counter.
+ * - Added directive to control width (default = 32bit) of NDIS statistic
+ * counters (SK_NDIS_64BIT_CTR).
+ *
+ * Revision 1.74 2000/07/04 11:41:53 rwahl
+ * - Added volition connector type.
+ *
+ * Revision 1.73 2000/03/15 16:33:10 rwahl
+ * Fixed bug 10510; wrong reset of virtual port statistic counters.
+ *
+ * Revision 1.72 1999/12/06 16:15:53 rwahl
+ * Fixed problem of instance range for current and factory MAC address.
+ *
+ * Revision 1.71 1999/12/06 10:14:20 rwahl
+ * Fixed bug 10476; set operation for PHY_OPERATION_MODE.
+ *
+ * Revision 1.70 1999/11/22 13:33:34 cgoos
+ * Changed license header to GPL.
+ *
* Revision 1.69 1999/10/18 11:42:15 rwahl
* Added typecasts for checking event dependent param (debug only).
*
@@ -297,7 +332,8 @@
static const char SysKonnectFileId[] =
- "@(#) $Id: skgepnmi.c,v 1.69 1999/10/18 11:42:15 rwahl Exp $ (C) SysKonnect.";
+ "@(#) $Id: skgepnmi.c,v 1.78 2000/09/12 10:44:58 cgoos Exp $"
+ " (C) SysKonnect.";
#include "h/skdrv1st.h"
#include "h/sktypes.h"
@@ -982,6 +1018,11 @@
sizeof(SK_PNMI_STAT),
SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxUnicastOkCts),
SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_UNICAST},
+ {OID_SKGE_STAT_RX_LONGFRAMES,
+ SK_PNMI_MAC_ENTRIES,
+ sizeof(SK_PNMI_STAT),
+ SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxLongFramesCts),
+ SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_LONGFRAMES},
{OID_SKGE_STAT_RX_PFLOWC,
SK_PNMI_MAC_ENTRIES,
sizeof(SK_PNMI_STAT),
@@ -1197,7 +1238,7 @@
0,
SK_PNMI_MAI_OFF(RlmtPortActive),
SK_PNMI_RO, Rlmt, 0},
- {OID_SKGE_RLMT_PORT_PREFERED,
+ {OID_SKGE_RLMT_PORT_PREFERRED,
1,
0,
SK_PNMI_MAI_OFF(RlmtPortPreferred),
@@ -1353,7 +1394,8 @@
/* 62 */ {TRUE, XM_RXF_1023B},
/* 63 */ {TRUE, XM_RXF_MAX_SZ},
/* 64 */ {FALSE, 0},
- /* 65 */ {FALSE, 0}
+ /* 65 */ {FALSE, 0},
+ /* 66 */ {TRUE, 0}
};
@@ -1520,6 +1562,10 @@
pAC->Pnmi.Connector = 5;
break;
+ case 'V':
+ pAC->Pnmi.Connector = 6;
+ break;
+
default:
pAC->Pnmi.Connector = 1;
break;
@@ -2074,8 +2120,13 @@
case SK_PNMI_HRX_OCTETLOW:
case SK_PNMI_HRX_IRLENGTH:
case SK_PNMI_HRX_RESERVED22:
+
+ /*
+ * the following counters aren't be handled (id > 63)
+ */
case SK_PNMI_HTX_SYNC:
case SK_PNMI_HTX_SYNC_OCTET:
+ case SK_PNMI_HRX_LONGFRAMES:
break;
default:
@@ -2270,7 +2321,7 @@
*/
pAC->Pnmi.MacUpdatedFlag ++;
- for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;
+ for (CounterIndex = 0; CounterIndex < SK_PNMI_SCNT_NOT;
CounterIndex ++) {
if (!StatAddress[CounterIndex].GetOffset) {
@@ -2985,9 +3036,9 @@
SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
unsigned int TableIndex) /* Index to the Id table */
{
- int Ret;
- SK_U32 StatVal;
-
+ int Ret;
+ SK_U64 StatVal;
+ SK_BOOL Is64BitReq = SK_FALSE;
/*
* Only the active Mac is returned
@@ -3022,11 +3073,28 @@
break;
default:
- if (*pLen < 4) {
+#ifndef SK_NDIS_64BIT_CTR
+ if (*pLen < sizeof(SK_U32)) {
+ *pLen = sizeof(SK_U32);
+ return (SK_PNMI_ERR_TOO_SHORT);
+ }
- *pLen = 4;
+#else /* SK_NDIS_64BIT_CTR */
+
+ /*
+ * for compatibility, at least 32bit are required for oid
+ */
+ if (*pLen < sizeof(SK_U32)) {
+ /*
+ * but indicate handling for 64bit values,
+ * if insufficient space is provided
+ */
+ *pLen = sizeof(SK_U64);
return (SK_PNMI_ERR_TOO_SHORT);
}
+
+ Is64BitReq = (*pLen < sizeof(SK_U64)) ? SK_FALSE : SK_TRUE;
+#endif /* SK_NDIS_64BIT_CTR */
break;
}
@@ -3059,10 +3127,21 @@
break;
default:
- StatVal = (SK_U32)GetStatVal(pAC, IoC, 0,
- IdTable[TableIndex].Param);
- SK_PNMI_STORE_U32(pBuf, StatVal);
- *pLen = sizeof(SK_U32);
+ StatVal = GetStatVal(pAC, IoC, 0, IdTable[TableIndex].Param);
+
+ /*
+ * by default 32bit values are evaluated
+ */
+ if (!Is64BitReq) {
+ SK_U32 StatVal32;
+ StatVal32 = (SK_U32)StatVal;
+ SK_PNMI_STORE_U32(pBuf, StatVal32);
+ *pLen = sizeof(SK_U32);
+ }
+ else {
+ SK_PNMI_STORE_U64(pBuf, StatVal);
+ *pLen = sizeof(SK_U64);
+ }
break;
}
@@ -3177,6 +3256,20 @@
case OID_SKGE_STAT_RX_UTIL:
return (SK_PNMI_ERR_GENERAL);
*/
+ /*
+ * Frames longer than IEEE 802.3 frame max size are counted
+ * by XMAC in frame_too_long counter even reception of long
+ * frames was enabled and the frame was correct.
+ * So correct the value by subtracting RxLongFrame counter.
+ */
+ case OID_SKGE_STAT_RX_TOO_LONG:
+ StatVal = GetStatVal(pAC, IoC, LogPortIndex,
+ IdTable[TableIndex].Param) -
+ GetStatVal(pAC, IoC, LogPortIndex,
+ SK_PNMI_HRX_LONGFRAMES);
+ SK_PNMI_STORE_U64(pBuf + Offset, StatVal);
+ break;
+
default:
StatVal = GetStatVal(pAC, IoC, LogPortIndex,
IdTable[TableIndex].Param);
@@ -3245,7 +3338,7 @@
if ((Instance != (SK_U32)(-1))) {
- if ((Instance < 1) || (Instance > SKCS_NUM_PROTOCOLS)) {
+ if ((Instance < 1) || (Instance > LogPortMax)) {
*pLen = 0;
return (SK_PNMI_ERR_UNKNOWN_INST);
@@ -4289,6 +4382,7 @@
SK_U64 Val64;
SK_U64 Val64RxHwErrs = 0;
SK_U64 Val64TxHwErrs = 0;
+ SK_BOOL Is64BitReq = SK_FALSE;
char Buf[256];
@@ -4315,13 +4409,37 @@
*/
switch (Id) {
+ case OID_GEN_XMIT_ERROR:
+ case OID_GEN_RCV_ERROR:
+ case OID_GEN_RCV_NO_BUFFER:
+#ifndef SK_NDIS_64BIT_CTR
+ if (*pLen < sizeof(SK_U32)) {
+ *pLen = sizeof(SK_U32);
+ return (SK_PNMI_ERR_TOO_SHORT);
+ }
+
+#else /* SK_NDIS_64BIT_CTR */
+
+ /*
+ * for compatibility, at least 32bit are required for oid
+ */
+ if (*pLen < sizeof(SK_U32)) {
+ /*
+ * but indicate handling for 64bit values,
+ * if insufficient space is provided
+ */
+ *pLen = sizeof(SK_U64);
+ return (SK_PNMI_ERR_TOO_SHORT);
+ }
+
+ Is64BitReq = (*pLen < sizeof(SK_U64)) ? SK_FALSE : SK_TRUE;
+#endif /* SK_NDIS_64BIT_CTR */
+ break;
+
case OID_SKGE_PORT_NUMBER:
case OID_SKGE_DEVICE_TYPE:
case OID_SKGE_RESULT:
case OID_SKGE_RLMT_MONITOR_NUMBER:
- case OID_GEN_XMIT_ERROR:
- case OID_GEN_RCV_ERROR:
- case OID_GEN_RCV_NO_BUFFER:
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
case OID_SKGE_TRAP_NUMBER:
case OID_SKGE_MDB_VERSION:
@@ -4420,7 +4538,8 @@
GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SYMBOL) +
GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SHORTS) +
GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_RUNT) +
- GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_TOO_LONG)+
+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_TOO_LONG)-
+ GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_LONGFRAMES)+
GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FCS) +
GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_CEXT);
break;
@@ -4748,21 +4867,57 @@
break;
case OID_GEN_RCV_ERROR:
- Val32 = (SK_U32)(Val64RxHwErrs + pAC->Pnmi.RxNoBufCts);
- SK_PNMI_STORE_U32(pBuf, Val32);
- *pLen = sizeof(SK_U32);
+ Val64 = Val64RxHwErrs + pAC->Pnmi.RxNoBufCts;
+
+ /*
+ * by default 32bit values are evaluated
+ */
+ if (!Is64BitReq) {
+ SK_U32 Val32;
+ Val32 = (SK_U32)Val64;
+ SK_PNMI_STORE_U32(pBuf, Val32);
+ *pLen = sizeof(SK_U32);
+ }
+ else {
+ SK_PNMI_STORE_U64(pBuf, Val64);
+ *pLen = sizeof(SK_U64);
+ }
break;
case OID_GEN_XMIT_ERROR:
- Val32 = (SK_U32)(Val64TxHwErrs + pAC->Pnmi.TxNoBufCts);
- SK_PNMI_STORE_U32(pBuf, Val32);
- *pLen = sizeof(SK_U32);
+ Val64 = Val64TxHwErrs + pAC->Pnmi.TxNoBufCts;
+
+ /*
+ * by default 32bit values are evaluated
+ */
+ if (!Is64BitReq) {
+ SK_U32 Val32;
+ Val32 = (SK_U32)Val64;
+ SK_PNMI_STORE_U32(pBuf, Val32);
+ *pLen = sizeof(SK_U32);
+ }
+ else {
+ SK_PNMI_STORE_U64(pBuf, Val64);
+ *pLen = sizeof(SK_U64);
+ }
break;
case OID_GEN_RCV_NO_BUFFER:
- Val32 = (SK_U32)pAC->Pnmi.RxNoBufCts;
- SK_PNMI_STORE_U32(pBuf, Val32);
- *pLen = sizeof(SK_U32);
+ Val64 = pAC->Pnmi.RxNoBufCts;
+
+ /*
+ * by default 32bit values are evaluated
+ */
+ if (!Is64BitReq) {
+ SK_U32 Val32;
+ Val32 = (SK_U32)Val64;
+ SK_PNMI_STORE_U32(pBuf, Val32);
+ *pLen = sizeof(SK_U32);
+ }
+ else {
+ SK_PNMI_STORE_U64(pBuf, Val64);
+ *pLen = sizeof(SK_U64);
+ }
break;
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
@@ -4853,7 +5008,7 @@
case OID_SKGE_RLMT_MODE:
case OID_SKGE_RLMT_PORT_ACTIVE:
- case OID_SKGE_RLMT_PORT_PREFERED:
+ case OID_SKGE_RLMT_PORT_PREFERRED:
if (*pLen < sizeof(SK_U8)) {
*pLen = sizeof(SK_U8);
@@ -4941,7 +5096,7 @@
*pLen = sizeof(char);
break;
- case OID_SKGE_RLMT_PORT_PREFERED:
+ case OID_SKGE_RLMT_PORT_PREFERRED:
*pBuf = (char)SK_PNMI_PORT_PHYS2LOG(
pAC->Rlmt.MacPreferred);
*pLen = sizeof(char);
@@ -5021,7 +5176,7 @@
}
break;
- case OID_SKGE_RLMT_PORT_PREFERED:
+ case OID_SKGE_RLMT_PORT_PREFERRED:
/* Check if the buffer length is plausible */
if (*pLen < sizeof(char)) {
@@ -5622,6 +5777,7 @@
case OID_SKGE_LINK_MODE:
case OID_SKGE_FLOWCTRL_MODE:
+ case OID_SKGE_PHY_OPERATION_MODE:
if (*pLen < Limit - LogPortIndex) {
*pLen = Limit - LogPortIndex;
@@ -5798,6 +5954,82 @@
Offset += sizeof(char);
break;
+ case OID_SKGE_PHY_OPERATION_MODE :
+ /* Check the value range */
+ Val8 = *(pBuf + Offset);
+ if (Val8 == 0) {
+ /* mode of this port remains unchanged */
+ Offset += sizeof(char);
+ break;
+ }
+ if (Val8 < SK_MS_MODE_AUTO ||
+ Val8 > SK_MS_MODE_SLAVE) {
+
+ *pLen = 0;
+ return (SK_PNMI_ERR_BAD_VALUE);
+ }
+
+ /* The preset ends here */
+ if (Action == SK_PNMI_PRESET) {
+
+ return (SK_PNMI_ERR_OK);
+ }
+
+ if (LogPortIndex == 0) {
+
+ /*
+ * The virtual port consists of all currently
+ * active ports. Find them and send an event
+ * with new master/slave (role) mode to SIRQ.
+ */
+ for (PhysPortIndex = 0;
+ PhysPortIndex < PhysPortMax;
+ PhysPortIndex ++) {
+
+ if (!pAC->Pnmi.Port[PhysPortIndex].
+ ActiveFlag) {
+
+ continue;
+ }
+
+ EventParam.Para32[0] = PhysPortIndex;
+ EventParam.Para32[1] = (SK_U32)Val8;
+ if (SkGeSirqEvent(pAC, IoC,
+ SK_HWEV_SET_ROLE,
+ EventParam) > 0) {
+
+ SK_ERR_LOG(pAC, SK_ERRCL_SW,
+ SK_PNMI_ERR052,
+ SK_PNMI_ERR052MSG);
+
+ *pLen = 0;
+ return (SK_PNMI_ERR_GENERAL);
+ }
+ }
+ }
+ else {
+ /*
+ * Send an event with the new master/slave
+ * (role) mode to the SIRQ module.
+ */
+ EventParam.Para32[0] = SK_PNMI_PORT_LOG2PHYS(
+ pAC, LogPortIndex);
+ EventParam.Para32[1] = (SK_U32)Val8;
+ if (SkGeSirqEvent(pAC, IoC,
+ SK_HWEV_SET_ROLE, EventParam) > 0) {
+
+ SK_ERR_LOG(pAC, SK_ERRCL_SW,
+ SK_PNMI_ERR052,
+ SK_PNMI_ERR052MSG);
+
+ *pLen = 0;
+ return (SK_PNMI_ERR_GENERAL);
+ }
+ }
+
+ Offset += sizeof(char);
+ break;
+
default:
SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR045,
SK_PNMI_ERR045MSG);
@@ -6670,6 +6902,12 @@
32);
break;
+ case SK_PNMI_HRX_LONGFRAMES:
+ LowVal = (SK_U32)pAC->Pnmi.Port[PhysPortIndex].StatRxLongFrameCts;
+ HighVal = (SK_U32)
+ (pAC->Pnmi.Port[PhysPortIndex].StatRxLongFrameCts >> 32);
+ break;
+
case SK_PNMI_HRX_FCS:
/*
* Broadcom filters fcs errors and counts it in
@@ -6765,11 +7003,16 @@
SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].
StatSyncOctetsCts, 0, sizeof(pAC->Pnmi.Port[
PhysPortIndex].StatSyncOctetsCts));
+ SK_MEMSET((char *)&pAC->Pnmi.Port[PhysPortIndex].
+ StatRxLongFrameCts, 0, sizeof(pAC->Pnmi.Port[
+ PhysPortIndex].StatRxLongFrameCts));
}
/*
* Clear local statistics
*/
+ SK_MEMSET((char *)&pAC->Pnmi.VirtualCounterOffset, 0,
+ sizeof(pAC->Pnmi.VirtualCounterOffset));
pAC->Pnmi.RlmtChangeCts = 0;
pAC->Pnmi.RlmtChangeTime = 0;
SK_MEMSET((char *)&pAC->Pnmi.RlmtChangeEstimate.EstValue[0], 0,
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)