skgepnmi.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:201k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  *
  3.  * Name: skgepnmi.c
  4.  * Project: GEnesis, PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.87 $
  6.  * Date: $Date: 2001/04/06 13:35:09 $
  7.  * Purpose: Private Network Management Interface
  8.  *
  9.  ****************************************************************************/
  10. /******************************************************************************
  11.  *
  12.  * (C)Copyright 1998-2001 SysKonnect GmbH.
  13.  *
  14.  * This program is free software; you can redistribute it and/or modify
  15.  * it under the terms of the GNU General Public License as published by
  16.  * the Free Software Foundation; either version 2 of the License, or
  17.  * (at your option) any later version.
  18.  *
  19.  * The information in this file is provided "AS IS" without warranty.
  20.  *
  21.  ******************************************************************************/
  22. /*****************************************************************************
  23.  *
  24.  * History:
  25.  *
  26.  * $Log: skgepnmi.c,v $
  27.  * Revision 1.87  2001/04/06 13:35:09  mkunz
  28.  * -Bugs fixed in handling of OID_SKGE_MTU and the VPD OID's
  29.  *
  30.  * Revision 1.86  2001/03/09 09:18:03  mkunz
  31.  * Changes in SK_DBG_MSG
  32.  *
  33.  * Revision 1.85  2001/03/08 09:37:31  mkunz
  34.  * Bugfix in ResetCounter for Pnmi.Port structure
  35.  *
  36.  * Revision 1.84  2001/03/06 09:04:55  mkunz
  37.  * Made some changes in instance calculation
  38.  * C ^VS:
  39.  *
  40.  * Revision 1.83  2001/02/15 09:15:32  mkunz
  41.  * Necessary changes for dual net mode added
  42.  *
  43.  * Revision 1.82  2001/02/07 08:24:19  mkunz
  44.  * -Made changes in handling of OID_SKGE_MTU
  45.  *
  46.  * Revision 1.81  2001/02/06 09:58:00  mkunz
  47.  * -Vpd bug fixed
  48.  * -OID_SKGE_MTU added
  49.  * -pnmi support for dual net mode. Interface function and macros extended
  50.  *
  51.  * Revision 1.80  2001/01/22 13:41:35  rassmann
  52.  * Supporting two nets on dual-port adapters.
  53.  *
  54.  * Revision 1.79  2000/12/05 14:57:40  cgoos
  55.  * SetStruct failed before first Link Up (link mode of virtual
  56.  * port "INDETERMINATED").
  57.  *
  58.  * Revision 1.78  2000/09/12 10:44:58  cgoos
  59.  * Fixed SK_PNMI_STORE_U32 calls with typecasted argument.
  60.  *
  61.  * Revision 1.77  2000/09/07 08:10:19  rwahl
  62.  * - Modified algorithm for 64bit NDIS statistic counters;
  63.  *   returns 64bit or 32bit value depending on passed buffer
  64.  *   size. Indicate capability for 64bit NDIS counter, if passed
  65.  *   buffer size is zero. OID_GEN_XMIT_ERROR, OID_GEN_RCV_ERROR,
  66.  *   and OID_GEN_RCV_NO_BUFFER handled as 64bit counter, too.
  67.  * - corrected OID_SKGE_RLMT_PORT_PREFERRED.
  68.  *
  69.  * Revision 1.76  2000/08/03 15:23:39  rwahl
  70.  * - Correction for FrameTooLong counter has to be moved to OID handling
  71.  *   routines (instead of statistic counter routine).
  72.  * - Fix in XMAC Reset Event handling: Only offset counter for hardware
  73.  *   statistic registers are updated.
  74.  *
  75.  * Revision 1.75  2000/08/01 16:46:05  rwahl
  76.  * - Added StatRxLongFrames counter and correction of FrameTooLong counter.
  77.  * - Added directive to control width (default = 32bit) of NDIS statistic
  78.  *   counters (SK_NDIS_64BIT_CTR).
  79.  *
  80.  * Revision 1.74  2000/07/04 11:41:53  rwahl
  81.  * - Added volition connector type.
  82.  *
  83.  * Revision 1.73  2000/03/15 16:33:10  rwahl
  84.  * Fixed bug 10510; wrong reset of virtual port statistic counters.
  85.  *
  86.  * Revision 1.72  1999/12/06 16:15:53  rwahl
  87.  * Fixed problem of instance range for current and factory MAC address.
  88.  *
  89.  * Revision 1.71  1999/12/06 10:14:20  rwahl
  90.  * Fixed bug 10476; set operation for PHY_OPERATION_MODE.
  91.  *
  92.  * Revision 1.70  1999/11/22 13:33:34  cgoos
  93.  * Changed license header to GPL.
  94.  *
  95.  * Revision 1.69  1999/10/18 11:42:15  rwahl
  96.  * Added typecasts for checking event dependent param (debug only).
  97.  *
  98.  * Revision 1.68  1999/10/06 09:35:59  cgoos
  99.  * Added state check to PHY_READ call (hanged if called during startup).
  100.  *
  101.  * Revision 1.67  1999/09/22 09:53:20  rwahl
  102.  * - Read Broadcom register for updating fcs error counter (1000Base-T).
  103.  *
  104.  * Revision 1.66  1999/08/26 13:47:56  rwahl
  105.  * Added SK_DRIVER_SENDEVENT when queueing RLMT_CHANGE_THRES trap.
  106.  *
  107.  * Revision 1.65  1999/07/26 07:49:35  cgoos
  108.  * Added two typecasts to avoid compiler warnings.
  109.  *
  110.  * Revision 1.64  1999/05/20 09:24:12  cgoos
  111.  * Changes for 1000Base-T (sensors, Master/Slave).
  112.  *
  113.  * Revision 1.63  1999/04/13 15:11:58  mhaveman
  114.  * Moved include of rlmt.h to header skgepnmi.h because some macros
  115.  * are needed there.
  116.  *
  117.  * Revision 1.62  1999/04/13 15:08:07  mhaveman
  118.  * Replaced again SK_RLMT_CHECK_LINK with SK_PNMI_RLMT_MODE_CHK_LINK
  119.  * to grant unified interface by only using the PNMI header file.
  120.  * SK_PNMI_RLMT_MODE_CHK_LINK is defined the same as SK_RLMT_CHECK_LINK.
  121.  *
  122.  * Revision 1.61  1999/04/13 15:02:48  mhaveman
  123.  * Changes caused by review:
  124.  * -Changed some comments
  125.  * -Removed redundant check for OID_SKGE_PHYS_FAC_ADDR
  126.  * -Optimized PRESET check.
  127.  * -Meaning of error SK_ADDR_DUPLICATE_ADDRESS changed. Set of same
  128.  *  address will now not cause this error. Removed corresponding check.
  129.  *
  130.  * Revision 1.60  1999/03/23 10:41:23  mhaveman
  131.  * Added comments.
  132.  *
  133.  * Revision 1.59  1999/02/19 08:01:28  mhaveman
  134.  * Fixed bug 10372 that after counter reset all ports were displayed
  135.  * as inactive.
  136.  *
  137.  * Revision 1.58  1999/02/16 18:04:47  mhaveman
  138.  * Fixed problem of twisted OIDs SENSOR_WAR_TIME and SENSOR_ERR_TIME.
  139.  *
  140.  * Revision 1.56  1999/01/27 12:29:11  mhaveman
  141.  * SkTimerStart was called with time value in milli seconds but needs
  142.  * micro seconds.
  143.  *
  144.  * Revision 1.55  1999/01/25 15:00:38  mhaveman
  145.  * Added support to allow multiple ports to be active. If this feature in
  146.  * future will be used, the Management Data Base variables PORT_ACTIVE
  147.  * and PORT_PREFERED should be moved to the port specific part of RLMT.
  148.  * Currently they return the values of the first active physical port
  149.  * found. A set to the virtual port will actually change all active
  150.  * physical ports. A get returns the melted values of all active physical
  151.  * ports. If the port values differ a return value INDETERMINATED will
  152.  * be returned. This effects especially the CONF group.
  153.  *
  154.  * Revision 1.54  1999/01/19 10:10:22  mhaveman
  155.  * -Fixed bug 10354: Counter values of virtual port were wrong after port
  156.  *  switches
  157.  * -Added check if a switch to the same port is notified.
  158.  *
  159.  * Revision 1.53  1999/01/07 09:25:21  mhaveman
  160.  * Forgot to initialize a variable.
  161.  *
  162.  * Revision 1.52  1999/01/05 10:34:33  mhaveman
  163.  * Fixed little error in RlmtChangeEstimate calculation.
  164.  *
  165.  * Revision 1.51  1999/01/05 09:59:07  mhaveman
  166.  * -Moved timer start to init level 2
  167.  * -Redesigned port switch average calculation to avoid 64bit
  168.  *  arithmetic.
  169.  *
  170.  * Revision 1.50  1998/12/10 15:13:59  mhaveman
  171.  * -Fixed: PHYS_CUR_ADDR returned wrong addresses
  172.  * -Fixed: RLMT_PORT_PREFERED and RLMT_CHANGE_THRES preset returned
  173.  *         always BAD_VALUE.
  174.  * -Fixed: TRAP buffer seemed to sometimes suddenly empty
  175.  *
  176.  * Revision 1.49  1998/12/09 16:17:07  mhaveman
  177.  * Fixed: Couldnot delete VPD keys on UNIX.
  178.  *
  179.  * Revision 1.48  1998/12/09 14:11:10  mhaveman
  180.  * -Add: Debugmessage for XMAC_RESET supressed to minimize output.
  181.  * -Fixed: RlmtChangeThreshold will now be initialized.
  182.  * -Fixed: VPD_ENTRIES_LIST extended value with unnecessary space char.
  183.  * -Fixed: On VPD key creation an invalid key name could be created
  184.  *         (e.g. A5)
  185.  * -Some minor changes in comments and code.
  186.  *
  187.  * Revision 1.47  1998/12/08 16:00:31  mhaveman
  188.  * -Fixed: For RLMT_PORT_ACTIVE will now be returned a 0 if no port
  189.  * is active.
  190.  * -Fixed: For the RLMT statistics group only the last value was
  191.  * returned and the rest of the buffer was filled with 0xff
  192.  * -Fixed: Mysteriously the preset on RLMT_MODE still returned
  193.  * BAD_VALUE.
  194.  * Revision 1.46  1998/12/08 10:04:56  mhaveman
  195.  * -Fixed: Preset on RLMT_MODE returned always BAD_VALUE error.
  196.  * -Fixed: Alignment error in GetStruct
  197.  * -Fixed: If for Get/Preset/SetStruct the buffer size is equal or
  198.  *         larger than SK_PNMI_MIN_STRUCT_SIZE the return value is stored
  199.  * to the buffer. In this case the caller should always return
  200.  *         ok to its upper routines. Only if the buffer size is less
  201.  *         than SK_PNMI_MIN_STRUCT_SIZE and the return value is unequal
  202.  *         to 0, an error should be returned by the caller.
  203.  * -Fixed: Wrong number of instances with RLMT statistic.
  204.  * -Fixed: Return now SK_LMODE_STAT_UNKNOWN if the LinkModeStatus is 0.
  205.  *
  206.  * Revision 1.45  1998/12/03 17:17:24  mhaveman
  207.  * -Removed for VPD create action the buffer size limitation to 4 bytes.
  208.  * -Pass now physical/active physical port to ADDR for CUR_ADDR set
  209.  *
  210.  * Revision 1.44  1998/12/03 15:14:35  mhaveman
  211.  * Another change to Vpd instance evaluation.
  212.  *
  213.  * Revision 1.43  1998/12/03 14:18:10  mhaveman
  214.  * -Fixed problem in PnmiSetStruct. It was impossible to set any value.
  215.  * -Removed VPD key evaluation for VPD_FREE_BYTES and VPD_ACTION.
  216.  *
  217.  * Revision 1.42  1998/12/03 11:31:47  mhaveman
  218.  * Inserted cast to satisfy lint.
  219.  *
  220.  * Revision 1.41  1998/12/03 11:28:16  mhaveman
  221.  * Removed SK_PNMI_CHECKPTR
  222.  *
  223.  * Revision 1.40  1998/12/03 11:19:07  mhaveman
  224.  * Fixed problems
  225.  * -A set to virtual port will now be ignored. A set with broadcast
  226.  *  address to any port will be ignored.
  227.  * -GetStruct function made VPD instance calculation wrong.
  228.  * -Prefered port returned -1 instead of 0.
  229.  *
  230.  * Revision 1.39  1998/11/26 15:30:29  mhaveman
  231.  * Added sense mode to link mode.
  232.  *
  233.  * Revision 1.38  1998/11/23 15:34:00  mhaveman
  234.  * -Fixed bug for RX counters. On an RX overflow interrupt the high
  235.  *  words of all RX counters were incremented.
  236.  * -SET operations on FLOWCTRL_MODE and LINK_MODE accept now the
  237.  *  value 0, which has no effect. It is usefull for multiple instance
  238.  *  SETs.
  239.  *
  240.  * Revision 1.37  1998/11/20 08:02:04  mhaveman
  241.  * -Fixed: Ports were compared with MAX_SENSORS
  242.  * -Fixed: Crash in GetTrapEntry with MEMSET macro
  243.  * -Fixed: Conversions between physical, logical port index and instance
  244.  *
  245.  * Revision 1.36  1998/11/16 07:48:53  mhaveman
  246.  * Casted SK_DRIVER_SENDEVENT with (void) to eleminate compiler warnings
  247.  * on Solaris.
  248.  *
  249.  * Revision 1.35  1998/11/16 07:45:34  mhaveman
  250.  * SkAddrOverride now returns value and will be checked.
  251.  *
  252.  * Revision 1.34  1998/11/10 13:40:37  mhaveman
  253.  * Needed to change interface, because NT driver needs a return value
  254.  * of needed buffer space on TOO_SHORT errors. Therefore all
  255.  * SkPnmiGet/Preset/Set functions now have a pointer to the length
  256.  * parameter, where the needed space on error is returned.
  257.  *
  258.  * Revision 1.33  1998/11/03 13:52:46  mhaveman
  259.  * Made file lint conform.
  260.  *
  261.  * Revision 1.32  1998/11/03 13:19:07  mhaveman
  262.  * The events SK_HWEV_SET_LMODE and SK_HWEV_SET_FLOWMODE pass now in
  263.  * Para32[0] the physical MAC index and in Para32[1] the new mode.
  264.  *
  265.  * Revision 1.31  1998/11/03 12:30:40  gklug
  266.  * fix: compiler warning memset
  267.  *
  268.  * Revision 1.30  1998/11/03 12:04:46  mhaveman
  269.  * Fixed problem in SENSOR_VALUE, which wrote beyond the buffer end
  270.  * Fixed alignment problem with CHIPSET.
  271.  *
  272.  * Revision 1.29  1998/11/02 11:23:54  mhaveman
  273.  * Corrected SK_ERROR_LOG to SK_ERR_LOG. Sorry.
  274.  *
  275.  * Revision 1.28  1998/11/02 10:47:16  mhaveman
  276.  * Added syslog messages for internal errors.
  277.  *
  278.  * Revision 1.27  1998/10/30 15:48:06  mhaveman
  279.  * Fixed problems after simulation of SK_PNMI_EVT_CHG_EST_TIMER and
  280.  * RlmtChangeThreshold calculation.
  281.  *
  282.  * Revision 1.26  1998/10/29 15:36:55  mhaveman
  283.  * -Fixed bug in trap buffer handling.
  284.  * -OID_SKGE_DRIVER_DESCR, OID_SKGE_DRIVER_VERSION, OID_SKGE_HW_DESCR,
  285.  *  OID_SKGE_HW_VERSION, OID_SKGE_VPD_ENTRIES_LIST, OID_SKGE_VPD_KEY,
  286.  *  OID_SKGE_VPD_VALUE, and OID_SKGE_SENSOR_DESCR return values with
  287.  *  a leading octet before each string storing the string length.
  288.  * -Perform a RlmtUpdate during SK_PNMI_EVT_XMAC_RESET to minimize
  289.  *  RlmtUpdate calls in GetStatVal.
  290.  * -Inserted SK_PNMI_CHECKFLAGS macro increase readability.
  291.  *
  292.  * Revision 1.25  1998/10/29 08:50:36  mhaveman
  293.  * Fixed problems after second event simulation.
  294.  *
  295.  * Revision 1.24  1998/10/28 08:44:37  mhaveman
  296.  * -Fixed alignment problem
  297.  * -Fixed problems during event simulation
  298.  * -Fixed sequence of error return code (INSTANCE -> ACCESS -> SHORT)
  299.  * -Changed type of parameter Instance back to SK_U32 because of VPD
  300.  * -Updated new VPD function calls
  301.  *
  302.  * Revision 1.23  1998/10/23 10:16:37  mhaveman
  303.  * Fixed bugs after buffer test simulation.
  304.  *
  305.  * Revision 1.22  1998/10/21 13:23:52  mhaveman
  306.  * -Call syntax of SkOsGetTime() changed to SkOsGetTime(pAc).
  307.  * -Changed calculation of hundrets of seconds.
  308.  *
  309.  * Revision 1.20  1998/10/20 07:30:45  mhaveman
  310.  * Made type changes to unsigned integer where possible.
  311.  *
  312.  * Revision 1.19  1998/10/19 10:51:30  mhaveman
  313.  * -Made Bug fixes after simulation run
  314.  * -Renamed RlmtMAC... to RlmtPort...
  315.  * -Marked workarounds with Errata comments
  316.  *
  317.  * Revision 1.18  1998/10/14 07:50:08  mhaveman
  318.  * -For OID_SKGE_LINK_STATUS the link down detection has moved from RLMT
  319.  *  to HWACCESS.
  320.  * -Provided all MEMCPY/MEMSET macros with (char *) pointers, because
  321.  *  Solaris throwed warnings when mapping to bcopy/bset.
  322.  *
  323.  * Revision 1.17  1998/10/13 07:42:01  mhaveman
  324.  * -Added OIDs OID_SKGE_TRAP_NUMBER and OID_SKGE_ALL_DATA
  325.  * -Removed old cvs history entries
  326.  * -Renamed MacNumber to PortNumber
  327.  *
  328.  * Revision 1.16  1998/10/07 10:52:49  mhaveman
  329.  * -Inserted handling of some OID_GEN_ Ids for windows
  330.  * -Fixed problem with 803.2 statistic.
  331.  *
  332.  * Revision 1.15  1998/10/01 09:16:29  mhaveman
  333.  * Added Debug messages for function call and UpdateFlag tracing.
  334.  *
  335.  * Revision 1.14  1998/09/30 13:39:09  mhaveman
  336.  * -Reduced namings of 'MAC' by replacing them with 'PORT'.
  337.  * -Completed counting of OID_SKGE_RX_HW_ERROR_CTS,
  338.  *       OID_SKGE_TX_HW_ERROR_CTS,
  339.  *  OID_SKGE_IN_ERRORS_CTS, and OID_SKGE_OUT_ERROR_CTS.
  340.  * -SET check for RlmtMode
  341.  *
  342.  * Revision 1.13  1998/09/28 13:13:08  mhaveman
  343.  * Hide strcmp, strlen, and strncpy behind macros SK_STRCMP, SK_STRLEN,
  344.  * and SK_STRNCPY. (Same reasons as for mem.. and MEM..)
  345.  *
  346.  * Revision 1.12  1998/09/16 08:18:36  cgoos
  347.  * Fix: XM_INxx and XM_OUTxx called with different parameter order:
  348.  *      sometimes IoC,Mac,...  sometimes Mac,IoC,... Now always first variant.
  349.  * Fix: inserted "Pnmi." into some pAC->pDriverDescription / Version.
  350.  * Change: memset, memcpy to makros SK_MEMSET, SK_MEMCPY
  351.  *
  352.  * Revision 1.11  1998/09/04 17:01:45  mhaveman
  353.  * Added SyncCounter as macro and OID_SKGE_.._NO_DESCR_CTS to
  354.  * OID_SKGE_RX_NO_BUF_CTS.
  355.  *
  356.  * Revision 1.10  1998/09/04 14:35:35  mhaveman
  357.  * Added macro counters, that are counted by driver.
  358.  *
  359.  ****************************************************************************/
  360. static const char SysKonnectFileId[] =
  361. "@(#) $Id: skgepnmi.c,v 1.87 2001/04/06 13:35:09 mkunz Exp $"
  362. " (C) SysKonnect.";
  363. #include "h/skdrv1st.h"
  364. #include "h/sktypes.h"
  365. #include "h/xmac_ii.h"
  366. #include "h/skdebug.h"
  367. #include "h/skqueue.h"
  368. #include "h/skgepnmi.h"
  369. #include "h/skgesirq.h"
  370. #include "h/skcsum.h"
  371. #include "h/skvpd.h"
  372. #include "h/skgehw.h"
  373. #include "h/skgeinit.h"
  374. #include "h/skdrv2nd.h"
  375. #include "h/skgepnm2.h"
  376. /*
  377.  * Public Function prototypes
  378.  */
  379. int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int level);
  380. int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
  381. unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
  382. int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
  383. unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
  384. int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void *pBuf,
  385. unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
  386. int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf,
  387. unsigned int *pLen, SK_U32 NetIndex);
  388. int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, 
  389. unsigned int *pLen, SK_U32 NetIndex);
  390. int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, 
  391. unsigned int *pLen, SK_U32 NetIndex);
  392. int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Param);
  393. /*
  394.  * Private Function prototypes
  395.  */
  396. static int Addr(SK_AC *pAC, SK_IOC IoC, int action,
  397. SK_U32 Id, char *pBuf, unsigned int *pLen, SK_U32 Instance,
  398. unsigned int TableIndex, SK_U32 NetIndex);
  399. static SK_U8 CalculateLinkModeStatus(SK_AC *pAC, SK_IOC IoC, unsigned int
  400. PhysPortIndex);
  401. static SK_U8 CalculateLinkStatus(SK_AC *pAC, SK_IOC IoC, unsigned int
  402. PhysPortIndex);
  403. static void CopyMac(char *pDst, SK_MAC_ADDR *pMac);
  404. static void CopyTrapQueue(SK_AC *pAC, char *pDstBuf);
  405. static int CsumStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  406. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  407. unsigned int TableIndex, SK_U32 NetIndex);
  408. static int General(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  409. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  410. unsigned int TableIndex, SK_U32 NetIndex);
  411. static SK_U64 GetPhysStatVal(SK_AC *pAC, SK_IOC IoC,
  412. unsigned int PhysPortIndex, unsigned int StatIndex);
  413. static SK_U64 GetStatVal(SK_AC *pAC, SK_IOC IoC, unsigned int LogPortIndex,
  414. unsigned int StatIndex, SK_U32 NetIndex);
  415. static char* GetTrapEntry(SK_AC *pAC, SK_U32 TrapId, unsigned int Size);
  416. static void GetTrapQueueLen(SK_AC *pAC, unsigned int *pLen,
  417. unsigned int *pEntries);
  418. static int GetVpdKeyArr(SK_AC *pAC, SK_IOC IoC, char *pKeyArr,
  419. unsigned int KeyArrLen, unsigned int *pKeyNo);
  420. static int LookupId(SK_U32 Id);
  421. static int Mac8023Stat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  422. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  423. unsigned int TableIndex, SK_U32 NetIndex);
  424. static int MacPrivateConf(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  425. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  426. unsigned int TableIndex, SK_U32 NetIndex);
  427. static int MacPrivateStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  428. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  429. unsigned int TableIndex, SK_U32 NetIndex);
  430. static int MacUpdate(SK_AC *pAC, SK_IOC IoC, unsigned int FirstMac,
  431. unsigned int LastMac);
  432. static int Monitor(SK_AC *pAC, SK_IOC IoC, int action,
  433. SK_U32 Id, char *pBuf, unsigned int *pLen, SK_U32 Instance,
  434. unsigned int TableIndex, SK_U32 NetIndex);
  435. static int OidStruct(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  436. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  437. unsigned int TableIndex, SK_U32 NetIndex);
  438. static int Perform(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  439. char *pBuf, unsigned int* pLen, SK_U32 Instance,
  440. unsigned int TableIndex, SK_U32 NetIndex);
  441. static int PnmiStruct(SK_AC *pAC, SK_IOC IoC, int Action, char *pBuf,
  442. unsigned int *pLen, SK_U32 NetIndex);
  443. static int PnmiVar(SK_AC *pAC, SK_IOC IoC, int Action, SK_U32 Id,
  444. char *pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
  445. static void QueueRlmtNewMacTrap(SK_AC *pAC, unsigned int ActiveMac);
  446. static void QueueRlmtPortTrap(SK_AC *pAC, SK_U32 TrapId,
  447. unsigned int PortIndex);
  448. static void QueueSensorTrap(SK_AC *pAC, SK_U32 TrapId,
  449. unsigned int SensorIndex);
  450. static void QueueSimpleTrap(SK_AC *pAC, SK_U32 TrapId);
  451. static void ResetCounter(SK_AC *pAC, SK_IOC IoC, SK_U32 NetIndex);
  452. static int Rlmt(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  453. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  454. unsigned int TableIndex, SK_U32 NetIndex);
  455. static int RlmtStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  456. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  457. unsigned int TableIndex, SK_U32 NetIndex);
  458. static int RlmtUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 NetIndex);
  459. static int SensorStat(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  460. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  461. unsigned int TableIndex, SK_U32 NetIndex);
  462. static int SirqUpdate(SK_AC *pAC, SK_IOC IoC);
  463. static void VirtualConf(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, char *pBuf);
  464. static int Vpd(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id,
  465. char *pBuf, unsigned int *pLen, SK_U32 Instance,
  466. unsigned int TableIndex, SK_U32 NetIndex);
  467. /******************************************************************************
  468.  *
  469.  * Global variables
  470.  */
  471. /*
  472.  * Table to correlate OID with handler function and index to
  473.  * hardware register stored in StatAddress if applicable.
  474.  */
  475. static const SK_PNMI_TAB_ENTRY IdTable[] = {
  476. {OID_GEN_XMIT_OK,
  477. 0,
  478. 0,
  479. 0,
  480. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX},
  481. {OID_GEN_RCV_OK,
  482. 0,
  483. 0,
  484. 0,
  485. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX},
  486. {OID_GEN_XMIT_ERROR,
  487. 0,
  488. 0,
  489. 0,
  490. SK_PNMI_RO, General, 0},
  491. {OID_GEN_RCV_ERROR,
  492. 0,
  493. 0,
  494. 0,
  495. SK_PNMI_RO, General, 0},
  496. {OID_GEN_RCV_NO_BUFFER,
  497. 0,
  498. 0,
  499. 0,
  500. SK_PNMI_RO, General, 0},
  501. {OID_GEN_DIRECTED_FRAMES_XMIT,
  502. 0,
  503. 0,
  504. 0,
  505. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_UNICAST},
  506. {OID_GEN_MULTICAST_FRAMES_XMIT,
  507. 0,
  508. 0,
  509. 0,
  510. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_MULTICAST},
  511. {OID_GEN_BROADCAST_FRAMES_XMIT,
  512. 0,
  513. 0,
  514. 0,
  515. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_BROADCAST},
  516. {OID_GEN_DIRECTED_FRAMES_RCV,
  517. 0,
  518. 0,
  519. 0,
  520. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_UNICAST},
  521. {OID_GEN_MULTICAST_FRAMES_RCV,
  522. 0,
  523. 0,
  524. 0,
  525. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_MULTICAST},
  526. {OID_GEN_BROADCAST_FRAMES_RCV,
  527. 0,
  528. 0,
  529. 0,
  530. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_BROADCAST},
  531. {OID_GEN_RCV_CRC_ERROR,
  532. 0,
  533. 0,
  534. 0,
  535. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_FCS},
  536. {OID_GEN_TRANSMIT_QUEUE_LENGTH,
  537. 0,
  538. 0,
  539. 0,
  540. SK_PNMI_RO, General, 0},
  541. {OID_802_3_PERMANENT_ADDRESS,
  542. 0,
  543. 0,
  544. 0,
  545. SK_PNMI_RO, Mac8023Stat, 0},
  546. {OID_802_3_CURRENT_ADDRESS,
  547. 0,
  548. 0,
  549. 0,
  550. SK_PNMI_RO, Mac8023Stat, 0},
  551. {OID_802_3_RCV_ERROR_ALIGNMENT,
  552. 0,
  553. 0,
  554. 0,
  555. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_FRAMING},
  556. {OID_802_3_XMIT_ONE_COLLISION,
  557. 0,
  558. 0,
  559. 0,
  560. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_SINGLE_COL},
  561. {OID_802_3_XMIT_MORE_COLLISIONS,
  562. 0,
  563. 0,
  564. 0,
  565. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_MULTI_COL},
  566. {OID_802_3_XMIT_DEFERRED,
  567. 0,
  568. 0,
  569. 0,
  570. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_DEFFERAL},
  571. {OID_802_3_XMIT_MAX_COLLISIONS,
  572. 0,
  573. 0,
  574. 0,
  575. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_EXCESS_COL},
  576. {OID_802_3_RCV_OVERRUN,
  577. 0,
  578. 0,
  579. 0,
  580. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HRX_OVERFLOW},
  581. {OID_802_3_XMIT_UNDERRUN,
  582. 0,
  583. 0,
  584. 0,
  585. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_UNDERRUN},
  586. {OID_802_3_XMIT_TIMES_CRS_LOST,
  587. 0,
  588. 0,
  589. 0,
  590. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_CARRIER},
  591. {OID_802_3_XMIT_LATE_COLLISIONS,
  592. 0,
  593. 0,
  594. 0,
  595. SK_PNMI_RO, Mac8023Stat, SK_PNMI_HTX_LATE_COL},
  596. {OID_SKGE_MDB_VERSION,
  597. 1,
  598. 0,
  599. SK_PNMI_MAI_OFF(MgmtDBVersion),
  600. SK_PNMI_RO, General, 0},
  601. {OID_SKGE_SUPPORTED_LIST,
  602. 0,
  603. 0,
  604. 0,
  605. SK_PNMI_RO, General, 0},
  606. {OID_SKGE_ALL_DATA,
  607. 0,
  608. 0,
  609. 0,
  610. SK_PNMI_RW, OidStruct, 0},
  611. {OID_SKGE_VPD_FREE_BYTES,
  612. 1,
  613. 0,
  614. SK_PNMI_MAI_OFF(VpdFreeBytes),
  615. SK_PNMI_RO, Vpd, 0},
  616. {OID_SKGE_VPD_ENTRIES_LIST,
  617. 1,
  618. 0,
  619. SK_PNMI_MAI_OFF(VpdEntriesList),
  620. SK_PNMI_RO, Vpd, 0},
  621. {OID_SKGE_VPD_ENTRIES_NUMBER,
  622. 1,
  623. 0,
  624. SK_PNMI_MAI_OFF(VpdEntriesNumber),
  625. SK_PNMI_RO, Vpd, 0},
  626. {OID_SKGE_VPD_KEY,
  627. SK_PNMI_VPD_ENTRIES,
  628. sizeof(SK_PNMI_VPD),
  629. SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdKey),
  630. SK_PNMI_RO, Vpd, 0},
  631. {OID_SKGE_VPD_VALUE,
  632. SK_PNMI_VPD_ENTRIES,
  633. sizeof(SK_PNMI_VPD),
  634. SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdValue),
  635. SK_PNMI_RO, Vpd, 0},
  636. {OID_SKGE_VPD_ACCESS,
  637. SK_PNMI_VPD_ENTRIES,
  638. sizeof(SK_PNMI_VPD),
  639. SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdAccess),
  640. SK_PNMI_RO, Vpd, 0},
  641. {OID_SKGE_VPD_ACTION,
  642. SK_PNMI_VPD_ENTRIES,
  643. sizeof(SK_PNMI_VPD),
  644. SK_PNMI_OFF(Vpd) + SK_PNMI_VPD_OFF(VpdAction),
  645. SK_PNMI_RW, Vpd, 0},
  646. {OID_SKGE_PORT_NUMBER,
  647. 1,
  648. 0,
  649. SK_PNMI_MAI_OFF(PortNumber),
  650. SK_PNMI_RO, General, 0},
  651. {OID_SKGE_DEVICE_TYPE,
  652. 1,
  653. 0,
  654. SK_PNMI_MAI_OFF(DeviceType),
  655. SK_PNMI_RO, General, 0},
  656. {OID_SKGE_DRIVER_DESCR,
  657. 1,
  658. 0,
  659. SK_PNMI_MAI_OFF(DriverDescr),
  660. SK_PNMI_RO, General, 0},
  661. {OID_SKGE_DRIVER_VERSION,
  662. 1,
  663. 0,
  664. SK_PNMI_MAI_OFF(DriverVersion),
  665. SK_PNMI_RO, General, 0},
  666. {OID_SKGE_HW_DESCR,
  667. 1,
  668. 0,
  669. SK_PNMI_MAI_OFF(HwDescr),
  670. SK_PNMI_RO, General, 0},
  671. {OID_SKGE_HW_VERSION,
  672. 1,
  673. 0,
  674. SK_PNMI_MAI_OFF(HwVersion),
  675. SK_PNMI_RO, General, 0},
  676. {OID_SKGE_CHIPSET,
  677. 1,
  678. 0,
  679. SK_PNMI_MAI_OFF(Chipset),
  680. SK_PNMI_RO, General, 0},
  681. {OID_SKGE_ACTION,
  682. 1,
  683. 0,
  684. SK_PNMI_MAI_OFF(Action),
  685. SK_PNMI_RW, Perform, 0},
  686. {OID_SKGE_RESULT,
  687. 1,
  688. 0,
  689. SK_PNMI_MAI_OFF(TestResult),
  690. SK_PNMI_RO, General, 0},
  691. {OID_SKGE_BUS_TYPE,
  692. 1,
  693. 0,
  694. SK_PNMI_MAI_OFF(BusType),
  695. SK_PNMI_RO, General, 0},
  696. {OID_SKGE_BUS_SPEED,
  697. 1,
  698. 0,
  699. SK_PNMI_MAI_OFF(BusSpeed),
  700. SK_PNMI_RO, General, 0},
  701. {OID_SKGE_BUS_WIDTH,
  702. 1,
  703. 0,
  704. SK_PNMI_MAI_OFF(BusWidth),
  705. SK_PNMI_RO, General, 0},
  706. {OID_SKGE_TX_SW_QUEUE_LEN,
  707. 1,
  708. 0,
  709. SK_PNMI_MAI_OFF(TxSwQueueLen),
  710. SK_PNMI_RO, General, 0},
  711. {OID_SKGE_TX_SW_QUEUE_MAX,
  712. 1,
  713. 0,
  714. SK_PNMI_MAI_OFF(TxSwQueueMax),
  715. SK_PNMI_RO, General, 0},
  716. {OID_SKGE_TX_RETRY,
  717. 1,
  718. 0,
  719. SK_PNMI_MAI_OFF(TxRetryCts),
  720. SK_PNMI_RO, General, 0},
  721. {OID_SKGE_RX_INTR_CTS,
  722. 1,
  723. 0,
  724. SK_PNMI_MAI_OFF(RxIntrCts),
  725. SK_PNMI_RO, General, 0},
  726. {OID_SKGE_TX_INTR_CTS,
  727. 1,
  728. 0,
  729. SK_PNMI_MAI_OFF(TxIntrCts),
  730. SK_PNMI_RO, General, 0},
  731. {OID_SKGE_RX_NO_BUF_CTS,
  732. 1,
  733. 0,
  734. SK_PNMI_MAI_OFF(RxNoBufCts),
  735. SK_PNMI_RO, General, 0},
  736. {OID_SKGE_TX_NO_BUF_CTS,
  737. 1,
  738. 0,
  739. SK_PNMI_MAI_OFF(TxNoBufCts),
  740. SK_PNMI_RO, General, 0},
  741. {OID_SKGE_TX_USED_DESCR_NO,
  742. 1,
  743. 0,
  744. SK_PNMI_MAI_OFF(TxUsedDescrNo),
  745. SK_PNMI_RO, General, 0},
  746. {OID_SKGE_RX_DELIVERED_CTS,
  747. 1,
  748. 0,
  749. SK_PNMI_MAI_OFF(RxDeliveredCts),
  750. SK_PNMI_RO, General, 0},
  751. {OID_SKGE_RX_OCTETS_DELIV_CTS,
  752. 1,
  753. 0,
  754. SK_PNMI_MAI_OFF(RxOctetsDeliveredCts),
  755. SK_PNMI_RO, General, 0},
  756. {OID_SKGE_RX_HW_ERROR_CTS,
  757. 1,
  758. 0,
  759. SK_PNMI_MAI_OFF(RxHwErrorsCts),
  760. SK_PNMI_RO, General, 0},
  761. {OID_SKGE_TX_HW_ERROR_CTS,
  762. 1,
  763. 0,
  764. SK_PNMI_MAI_OFF(TxHwErrorsCts),
  765. SK_PNMI_RO, General, 0},
  766. {OID_SKGE_IN_ERRORS_CTS,
  767. 1,
  768. 0,
  769. SK_PNMI_MAI_OFF(InErrorsCts),
  770. SK_PNMI_RO, General, 0},
  771. {OID_SKGE_OUT_ERROR_CTS,
  772. 1,
  773. 0,
  774. SK_PNMI_MAI_OFF(OutErrorsCts),
  775. SK_PNMI_RO, General, 0},
  776. {OID_SKGE_ERR_RECOVERY_CTS,
  777. 1,
  778. 0,
  779. SK_PNMI_MAI_OFF(ErrRecoveryCts),
  780. SK_PNMI_RO, General, 0},
  781. {OID_SKGE_SYSUPTIME,
  782. 1,
  783. 0,
  784. SK_PNMI_MAI_OFF(SysUpTime),
  785. SK_PNMI_RO, General, 0},
  786. {OID_SKGE_SENSOR_NUMBER,
  787. 1,
  788. 0,
  789. SK_PNMI_MAI_OFF(SensorNumber),
  790. SK_PNMI_RO, General, 0},
  791. {OID_SKGE_SENSOR_INDEX,
  792. SK_PNMI_SENSOR_ENTRIES,
  793. sizeof(SK_PNMI_SENSOR),
  794. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorIndex),
  795. SK_PNMI_RO, SensorStat, 0},
  796. {OID_SKGE_SENSOR_DESCR,
  797. SK_PNMI_SENSOR_ENTRIES,
  798. sizeof(SK_PNMI_SENSOR),
  799. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorDescr),
  800. SK_PNMI_RO, SensorStat, 0},
  801. {OID_SKGE_SENSOR_TYPE,
  802. SK_PNMI_SENSOR_ENTRIES,
  803. sizeof(SK_PNMI_SENSOR),
  804. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorType),
  805. SK_PNMI_RO, SensorStat, 0},
  806. {OID_SKGE_SENSOR_VALUE,
  807. SK_PNMI_SENSOR_ENTRIES,
  808. sizeof(SK_PNMI_SENSOR),
  809. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorValue),
  810. SK_PNMI_RO, SensorStat, 0},
  811. {OID_SKGE_SENSOR_WAR_THRES_LOW,
  812. SK_PNMI_SENSOR_ENTRIES,
  813. sizeof(SK_PNMI_SENSOR),
  814. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningThresholdLow),
  815. SK_PNMI_RO, SensorStat, 0},
  816. {OID_SKGE_SENSOR_WAR_THRES_UPP,
  817. SK_PNMI_SENSOR_ENTRIES,
  818. sizeof(SK_PNMI_SENSOR),
  819. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningThresholdHigh),
  820. SK_PNMI_RO, SensorStat, 0},
  821. {OID_SKGE_SENSOR_ERR_THRES_LOW,
  822. SK_PNMI_SENSOR_ENTRIES,
  823. sizeof(SK_PNMI_SENSOR),
  824. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorThresholdLow),
  825. SK_PNMI_RO, SensorStat, 0},
  826. {OID_SKGE_SENSOR_ERR_THRES_UPP,
  827. SK_PNMI_SENSOR_ENTRIES,
  828. sizeof(SK_PNMI_SENSOR),
  829. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorThresholdHigh),
  830. SK_PNMI_RO, SensorStat, 0},
  831. {OID_SKGE_SENSOR_STATUS,
  832. SK_PNMI_SENSOR_ENTRIES,
  833. sizeof(SK_PNMI_SENSOR),
  834. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorStatus),
  835. SK_PNMI_RO, SensorStat, 0},
  836. {OID_SKGE_SENSOR_WAR_CTS,
  837. SK_PNMI_SENSOR_ENTRIES,
  838. sizeof(SK_PNMI_SENSOR),
  839. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningCts),
  840. SK_PNMI_RO, SensorStat, 0},
  841. {OID_SKGE_SENSOR_ERR_CTS,
  842. SK_PNMI_SENSOR_ENTRIES,
  843. sizeof(SK_PNMI_SENSOR),
  844. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorCts),
  845. SK_PNMI_RO, SensorStat, 0},
  846. {OID_SKGE_SENSOR_WAR_TIME,
  847. SK_PNMI_SENSOR_ENTRIES,
  848. sizeof(SK_PNMI_SENSOR),
  849. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorWarningTimestamp),
  850. SK_PNMI_RO, SensorStat, 0},
  851. {OID_SKGE_SENSOR_ERR_TIME,
  852. SK_PNMI_SENSOR_ENTRIES,
  853. sizeof(SK_PNMI_SENSOR),
  854. SK_PNMI_OFF(Sensor) + SK_PNMI_SEN_OFF(SensorErrorTimestamp),
  855. SK_PNMI_RO, SensorStat, 0},
  856. {OID_SKGE_CHKSM_NUMBER,
  857. 1,
  858. 0,
  859. SK_PNMI_MAI_OFF(ChecksumNumber),
  860. SK_PNMI_RO, General, 0},
  861. {OID_SKGE_CHKSM_RX_OK_CTS,
  862. SKCS_NUM_PROTOCOLS,
  863. sizeof(SK_PNMI_CHECKSUM),
  864. SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxOkCts),
  865. SK_PNMI_RO, CsumStat, 0},
  866. {OID_SKGE_CHKSM_RX_UNABLE_CTS,
  867. SKCS_NUM_PROTOCOLS,
  868. sizeof(SK_PNMI_CHECKSUM),
  869. SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxUnableCts),
  870. SK_PNMI_RO, CsumStat, 0},
  871. {OID_SKGE_CHKSM_RX_ERR_CTS,
  872. SKCS_NUM_PROTOCOLS,
  873. sizeof(SK_PNMI_CHECKSUM),
  874. SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumRxErrCts),
  875. SK_PNMI_RO, CsumStat, 0},
  876. {OID_SKGE_CHKSM_TX_OK_CTS,
  877. SKCS_NUM_PROTOCOLS,
  878. sizeof(SK_PNMI_CHECKSUM),
  879. SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumTxOkCts),
  880. SK_PNMI_RO, CsumStat, 0},
  881. {OID_SKGE_CHKSM_TX_UNABLE_CTS,
  882. SKCS_NUM_PROTOCOLS,
  883. sizeof(SK_PNMI_CHECKSUM),
  884. SK_PNMI_OFF(Checksum) + SK_PNMI_CHK_OFF(ChecksumTxUnableCts),
  885. SK_PNMI_RO, CsumStat, 0},
  886. {OID_SKGE_STAT_TX,
  887. SK_PNMI_MAC_ENTRIES,
  888. sizeof(SK_PNMI_STAT),
  889. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxOkCts),
  890. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX},
  891. {OID_SKGE_STAT_TX_OCTETS,
  892. SK_PNMI_MAC_ENTRIES,
  893. sizeof(SK_PNMI_STAT),
  894. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxOctetsOkCts),
  895. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_OCTET},
  896. {OID_SKGE_STAT_TX_BROADCAST,
  897. SK_PNMI_MAC_ENTRIES,
  898. sizeof(SK_PNMI_STAT),
  899. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxBroadcastOkCts),
  900. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_BROADCAST},
  901. {OID_SKGE_STAT_TX_MULTICAST,
  902. SK_PNMI_MAC_ENTRIES,
  903. sizeof(SK_PNMI_STAT),
  904. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMulticastOkCts),
  905. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MULTICAST},
  906. {OID_SKGE_STAT_TX_UNICAST,
  907. SK_PNMI_MAC_ENTRIES,
  908. sizeof(SK_PNMI_STAT),
  909. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxUnicastOkCts),
  910. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_UNICAST},
  911. {OID_SKGE_STAT_TX_LONGFRAMES,
  912. SK_PNMI_MAC_ENTRIES,
  913. sizeof(SK_PNMI_STAT),
  914. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxLongFramesCts),
  915. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_LONGFRAMES},
  916. {OID_SKGE_STAT_TX_BURST,
  917. SK_PNMI_MAC_ENTRIES,
  918. sizeof(SK_PNMI_STAT),
  919. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxBurstCts),
  920. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_BURST},
  921. {OID_SKGE_STAT_TX_PFLOWC,
  922. SK_PNMI_MAC_ENTRIES,
  923. sizeof(SK_PNMI_STAT),
  924. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxPauseMacCtrlCts),
  925. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_PMACC},
  926. {OID_SKGE_STAT_TX_FLOWC,
  927. SK_PNMI_MAC_ENTRIES,
  928. sizeof(SK_PNMI_STAT),
  929. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMacCtrlCts),
  930. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MACC},
  931. {OID_SKGE_STAT_TX_SINGLE_COL,
  932. SK_PNMI_MAC_ENTRIES,
  933. sizeof(SK_PNMI_STAT),
  934. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSingleCollisionCts),
  935. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SINGLE_COL},
  936. {OID_SKGE_STAT_TX_MULTI_COL,
  937. SK_PNMI_MAC_ENTRIES,
  938. sizeof(SK_PNMI_STAT),
  939. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMultipleCollisionCts),
  940. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MULTI_COL},
  941. {OID_SKGE_STAT_TX_EXCESS_COL,
  942. SK_PNMI_MAC_ENTRIES,
  943. sizeof(SK_PNMI_STAT),
  944. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxExcessiveCollisionCts),
  945. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_EXCESS_COL},
  946. {OID_SKGE_STAT_TX_LATE_COL,
  947. SK_PNMI_MAC_ENTRIES,
  948. sizeof(SK_PNMI_STAT),
  949. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxLateCollisionCts),
  950. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_LATE_COL},
  951. {OID_SKGE_STAT_TX_DEFFERAL,
  952. SK_PNMI_MAC_ENTRIES,
  953. sizeof(SK_PNMI_STAT),
  954. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxDeferralCts),
  955. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_DEFFERAL},
  956. {OID_SKGE_STAT_TX_EXCESS_DEF,
  957. SK_PNMI_MAC_ENTRIES,
  958. sizeof(SK_PNMI_STAT),
  959. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxExcessiveDeferralCts),
  960. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_EXCESS_DEF},
  961. {OID_SKGE_STAT_TX_UNDERRUN,
  962. SK_PNMI_MAC_ENTRIES,
  963. sizeof(SK_PNMI_STAT),
  964. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxFifoUnderrunCts),
  965. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_UNDERRUN},
  966. {OID_SKGE_STAT_TX_CARRIER,
  967. SK_PNMI_MAC_ENTRIES,
  968. sizeof(SK_PNMI_STAT),
  969. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxCarrierCts),
  970. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_CARRIER},
  971. /* {OID_SKGE_STAT_TX_UTIL,
  972. SK_PNMI_MAC_ENTRIES,
  973. sizeof(SK_PNMI_STAT),
  974. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxUtilization),
  975. SK_PNMI_RO, MacPrivateStat, (SK_U16)(-1)}, */
  976. {OID_SKGE_STAT_TX_64,
  977. SK_PNMI_MAC_ENTRIES,
  978. sizeof(SK_PNMI_STAT),
  979. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx64Cts),
  980. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_64},
  981. {OID_SKGE_STAT_TX_127,
  982. SK_PNMI_MAC_ENTRIES,
  983. sizeof(SK_PNMI_STAT),
  984. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx127Cts),
  985. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_127},
  986. {OID_SKGE_STAT_TX_255,
  987. SK_PNMI_MAC_ENTRIES,
  988. sizeof(SK_PNMI_STAT),
  989. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx255Cts),
  990. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_255},
  991. {OID_SKGE_STAT_TX_511,
  992. SK_PNMI_MAC_ENTRIES,
  993. sizeof(SK_PNMI_STAT),
  994. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx511Cts),
  995. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_511},
  996. {OID_SKGE_STAT_TX_1023,
  997. SK_PNMI_MAC_ENTRIES,
  998. sizeof(SK_PNMI_STAT),
  999. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTx1023Cts),
  1000. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_1023},
  1001. {OID_SKGE_STAT_TX_MAX,
  1002. SK_PNMI_MAC_ENTRIES,
  1003. sizeof(SK_PNMI_STAT),
  1004. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxMaxCts),
  1005. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_MAX},
  1006. {OID_SKGE_STAT_TX_SYNC,
  1007. SK_PNMI_MAC_ENTRIES,
  1008. sizeof(SK_PNMI_STAT),
  1009. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSyncCts),
  1010. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SYNC},
  1011. {OID_SKGE_STAT_TX_SYNC_OCTETS,
  1012. SK_PNMI_MAC_ENTRIES,
  1013. sizeof(SK_PNMI_STAT),
  1014. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatTxSyncOctetsCts),
  1015. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HTX_SYNC_OCTET},
  1016. {OID_SKGE_STAT_RX,
  1017. SK_PNMI_MAC_ENTRIES,
  1018. sizeof(SK_PNMI_STAT),
  1019. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxOkCts),
  1020. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX},
  1021. {OID_SKGE_STAT_RX_OCTETS,
  1022. SK_PNMI_MAC_ENTRIES,
  1023. sizeof(SK_PNMI_STAT),
  1024. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxOctetsOkCts),
  1025. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_OCTET},
  1026. {OID_SKGE_STAT_RX_BROADCAST,
  1027. SK_PNMI_MAC_ENTRIES,
  1028. sizeof(SK_PNMI_STAT),
  1029. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxBroadcastOkCts),
  1030. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_BROADCAST},
  1031. {OID_SKGE_STAT_RX_MULTICAST,
  1032. SK_PNMI_MAC_ENTRIES,
  1033. sizeof(SK_PNMI_STAT),
  1034. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMulticastOkCts),
  1035. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MULTICAST},
  1036. {OID_SKGE_STAT_RX_UNICAST,
  1037. SK_PNMI_MAC_ENTRIES,
  1038. sizeof(SK_PNMI_STAT),
  1039. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxUnicastOkCts),
  1040. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_UNICAST},
  1041. {OID_SKGE_STAT_RX_LONGFRAMES,
  1042. SK_PNMI_MAC_ENTRIES,
  1043. sizeof(SK_PNMI_STAT),
  1044. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxLongFramesCts),
  1045. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_LONGFRAMES},
  1046. {OID_SKGE_STAT_RX_PFLOWC,
  1047. SK_PNMI_MAC_ENTRIES,
  1048. sizeof(SK_PNMI_STAT),
  1049. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxPauseMacCtrlCts),
  1050. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_PMACC},
  1051. {OID_SKGE_STAT_RX_FLOWC,
  1052. SK_PNMI_MAC_ENTRIES,
  1053. sizeof(SK_PNMI_STAT),
  1054. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMacCtrlCts),
  1055. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MACC},
  1056. {OID_SKGE_STAT_RX_PFLOWC_ERR,
  1057. SK_PNMI_MAC_ENTRIES,
  1058. sizeof(SK_PNMI_STAT),
  1059. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxPauseMacCtrlErrorCts),
  1060. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_PMACC_ERR},
  1061. {OID_SKGE_STAT_RX_FLOWC_UNKWN,
  1062. SK_PNMI_MAC_ENTRIES,
  1063. sizeof(SK_PNMI_STAT),
  1064. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMacCtrlUnknownCts),
  1065. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MACC_UNKWN},
  1066. {OID_SKGE_STAT_RX_BURST,
  1067. SK_PNMI_MAC_ENTRIES,
  1068. sizeof(SK_PNMI_STAT),
  1069. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxBurstCts),
  1070. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_BURST},
  1071. {OID_SKGE_STAT_RX_MISSED,
  1072. SK_PNMI_MAC_ENTRIES,
  1073. sizeof(SK_PNMI_STAT),
  1074. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMissedCts),
  1075. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MISSED},
  1076. {OID_SKGE_STAT_RX_FRAMING,
  1077. SK_PNMI_MAC_ENTRIES,
  1078. sizeof(SK_PNMI_STAT),
  1079. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFramingCts),
  1080. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_FRAMING},
  1081. {OID_SKGE_STAT_RX_OVERFLOW,
  1082. SK_PNMI_MAC_ENTRIES,
  1083. sizeof(SK_PNMI_STAT),
  1084. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFifoOverflowCts),
  1085. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_OVERFLOW},
  1086. {OID_SKGE_STAT_RX_JABBER,
  1087. SK_PNMI_MAC_ENTRIES,
  1088. sizeof(SK_PNMI_STAT),
  1089. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxJabberCts),
  1090. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_JABBER},
  1091. {OID_SKGE_STAT_RX_CARRIER,
  1092. SK_PNMI_MAC_ENTRIES,
  1093. sizeof(SK_PNMI_STAT),
  1094. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxCarrierCts),
  1095. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_CARRIER},
  1096. {OID_SKGE_STAT_RX_IR_LENGTH,
  1097. SK_PNMI_MAC_ENTRIES,
  1098. sizeof(SK_PNMI_STAT),
  1099. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxIRLengthCts),
  1100. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_IRLENGTH},
  1101. {OID_SKGE_STAT_RX_SYMBOL,
  1102. SK_PNMI_MAC_ENTRIES,
  1103. sizeof(SK_PNMI_STAT),
  1104. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxSymbolCts),
  1105. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_SYMBOL},
  1106. {OID_SKGE_STAT_RX_SHORTS,
  1107. SK_PNMI_MAC_ENTRIES,
  1108. sizeof(SK_PNMI_STAT),
  1109. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxShortsCts),
  1110. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_SHORTS},
  1111. {OID_SKGE_STAT_RX_RUNT,
  1112. SK_PNMI_MAC_ENTRIES,
  1113. sizeof(SK_PNMI_STAT),
  1114. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxRuntCts),
  1115. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_RUNT},
  1116. {OID_SKGE_STAT_RX_CEXT,
  1117. SK_PNMI_MAC_ENTRIES,
  1118. sizeof(SK_PNMI_STAT),
  1119. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxCextCts),
  1120. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_CEXT},
  1121. {OID_SKGE_STAT_RX_TOO_LONG,
  1122. SK_PNMI_MAC_ENTRIES,
  1123. sizeof(SK_PNMI_STAT),
  1124. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxTooLongCts),
  1125. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_TOO_LONG},
  1126. {OID_SKGE_STAT_RX_FCS,
  1127. SK_PNMI_MAC_ENTRIES,
  1128. sizeof(SK_PNMI_STAT),
  1129. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxFcsCts),
  1130. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_FCS},
  1131. /* {OID_SKGE_STAT_RX_UTIL,
  1132. SK_PNMI_MAC_ENTRIES,
  1133. sizeof(SK_PNMI_STAT),
  1134. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxUtilization),
  1135. SK_PNMI_RO, MacPrivateStat, (SK_U16)(-1)}, */
  1136. {OID_SKGE_STAT_RX_64,
  1137. SK_PNMI_MAC_ENTRIES,
  1138. sizeof(SK_PNMI_STAT),
  1139. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx64Cts),
  1140. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_64},
  1141. {OID_SKGE_STAT_RX_127,
  1142. SK_PNMI_MAC_ENTRIES,
  1143. sizeof(SK_PNMI_STAT),
  1144. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx127Cts),
  1145. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_127},
  1146. {OID_SKGE_STAT_RX_255,
  1147. SK_PNMI_MAC_ENTRIES,
  1148. sizeof(SK_PNMI_STAT),
  1149. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx255Cts),
  1150. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_255},
  1151. {OID_SKGE_STAT_RX_511,
  1152. SK_PNMI_MAC_ENTRIES,
  1153. sizeof(SK_PNMI_STAT),
  1154. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx511Cts),
  1155. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_511},
  1156. {OID_SKGE_STAT_RX_1023,
  1157. SK_PNMI_MAC_ENTRIES,
  1158. sizeof(SK_PNMI_STAT),
  1159. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRx1023Cts),
  1160. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_1023},
  1161. {OID_SKGE_STAT_RX_MAX,
  1162. SK_PNMI_MAC_ENTRIES,
  1163. sizeof(SK_PNMI_STAT),
  1164. SK_PNMI_OFF(Stat) + SK_PNMI_STA_OFF(StatRxMaxCts),
  1165. SK_PNMI_RO, MacPrivateStat, SK_PNMI_HRX_MAX},
  1166. {OID_SKGE_PHYS_CUR_ADDR,
  1167. SK_PNMI_MAC_ENTRIES,
  1168. sizeof(SK_PNMI_CONF),
  1169. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfMacCurrentAddr),
  1170. SK_PNMI_RW, Addr, 0},
  1171. {OID_SKGE_PHYS_FAC_ADDR,
  1172. SK_PNMI_MAC_ENTRIES,
  1173. sizeof(SK_PNMI_CONF),
  1174. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfMacFactoryAddr),
  1175. SK_PNMI_RO, Addr, 0},
  1176. {OID_SKGE_PMD,
  1177. SK_PNMI_MAC_ENTRIES,
  1178. sizeof(SK_PNMI_CONF),
  1179. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPMD),
  1180. SK_PNMI_RO, MacPrivateConf, 0},
  1181. {OID_SKGE_CONNECTOR,
  1182. SK_PNMI_MAC_ENTRIES,
  1183. sizeof(SK_PNMI_CONF),
  1184. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfConnector),
  1185. SK_PNMI_RO, MacPrivateConf, 0},
  1186. {OID_SKGE_LINK_CAP,
  1187. SK_PNMI_MAC_ENTRIES,
  1188. sizeof(SK_PNMI_CONF),
  1189. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkCapability),
  1190. SK_PNMI_RO, MacPrivateConf, 0},
  1191. {OID_SKGE_LINK_MODE,
  1192. SK_PNMI_MAC_ENTRIES,
  1193. sizeof(SK_PNMI_CONF),
  1194. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkMode),
  1195. SK_PNMI_RW, MacPrivateConf, 0},
  1196. {OID_SKGE_LINK_MODE_STATUS,
  1197. SK_PNMI_MAC_ENTRIES,
  1198. sizeof(SK_PNMI_CONF),
  1199. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkModeStatus),
  1200. SK_PNMI_RO, MacPrivateConf, 0},
  1201. {OID_SKGE_LINK_STATUS,
  1202. SK_PNMI_MAC_ENTRIES,
  1203. sizeof(SK_PNMI_CONF),
  1204. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfLinkStatus),
  1205. SK_PNMI_RO, MacPrivateConf, 0},
  1206. {OID_SKGE_FLOWCTRL_CAP,
  1207. SK_PNMI_MAC_ENTRIES,
  1208. sizeof(SK_PNMI_CONF),
  1209. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlCapability),
  1210. SK_PNMI_RO, MacPrivateConf, 0},
  1211. {OID_SKGE_FLOWCTRL_MODE,
  1212. SK_PNMI_MAC_ENTRIES,
  1213. sizeof(SK_PNMI_CONF),
  1214. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlMode),
  1215. SK_PNMI_RW, MacPrivateConf, 0},
  1216. {OID_SKGE_FLOWCTRL_STATUS,
  1217. SK_PNMI_MAC_ENTRIES,
  1218. sizeof(SK_PNMI_CONF),
  1219. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfFlowCtrlStatus),
  1220. SK_PNMI_RO, MacPrivateConf, 0},
  1221. {OID_SKGE_PHY_OPERATION_CAP,
  1222. SK_PNMI_MAC_ENTRIES,
  1223. sizeof(SK_PNMI_CONF),
  1224. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationCapability),
  1225. SK_PNMI_RO, MacPrivateConf, 0},
  1226. {OID_SKGE_PHY_OPERATION_MODE,
  1227. SK_PNMI_MAC_ENTRIES,
  1228. sizeof(SK_PNMI_CONF),
  1229. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationMode),
  1230. SK_PNMI_RW, MacPrivateConf, 0},
  1231. {OID_SKGE_PHY_OPERATION_STATUS,
  1232. SK_PNMI_MAC_ENTRIES,
  1233. sizeof(SK_PNMI_CONF),
  1234. SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyOperationStatus),
  1235. SK_PNMI_RO, MacPrivateConf, 0},
  1236. {OID_SKGE_TRAP,
  1237. 1,
  1238. 0,
  1239. SK_PNMI_MAI_OFF(Trap),
  1240. SK_PNMI_RO, General, 0},
  1241. {OID_SKGE_TRAP_NUMBER,
  1242. 1,
  1243. 0,
  1244. SK_PNMI_MAI_OFF(TrapNumber),
  1245. SK_PNMI_RO, General, 0},
  1246. {OID_SKGE_RLMT_MODE,
  1247. 1,
  1248. 0,
  1249. SK_PNMI_MAI_OFF(RlmtMode),
  1250. SK_PNMI_RW, Rlmt, 0},
  1251. {OID_SKGE_RLMT_PORT_NUMBER,
  1252. 1,
  1253. 0,
  1254. SK_PNMI_MAI_OFF(RlmtPortNumber),
  1255. SK_PNMI_RO, Rlmt, 0},
  1256. {OID_SKGE_RLMT_PORT_ACTIVE,
  1257. 1,
  1258. 0,
  1259. SK_PNMI_MAI_OFF(RlmtPortActive),
  1260. SK_PNMI_RO, Rlmt, 0},
  1261. {OID_SKGE_RLMT_PORT_PREFERRED,
  1262. 1,
  1263. 0,
  1264. SK_PNMI_MAI_OFF(RlmtPortPreferred),
  1265. SK_PNMI_RW, Rlmt, 0},
  1266. {OID_SKGE_RLMT_CHANGE_CTS,
  1267. 1,
  1268. 0,
  1269. SK_PNMI_MAI_OFF(RlmtChangeCts),
  1270. SK_PNMI_RO, Rlmt, 0},
  1271. {OID_SKGE_RLMT_CHANGE_TIME,
  1272. 1,
  1273. 0,
  1274. SK_PNMI_MAI_OFF(RlmtChangeTime),
  1275. SK_PNMI_RO, Rlmt, 0},
  1276. {OID_SKGE_RLMT_CHANGE_ESTIM,
  1277. 1,
  1278. 0,
  1279. SK_PNMI_MAI_OFF(RlmtChangeEstimate),
  1280. SK_PNMI_RO, Rlmt, 0},
  1281. {OID_SKGE_RLMT_CHANGE_THRES,
  1282. 1,
  1283. 0,
  1284. SK_PNMI_MAI_OFF(RlmtChangeThreshold),
  1285. SK_PNMI_RW, Rlmt, 0},
  1286. {OID_SKGE_RLMT_PORT_INDEX,
  1287. SK_PNMI_MAC_ENTRIES,
  1288. sizeof(SK_PNMI_RLMT),
  1289. SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtIndex),
  1290. SK_PNMI_RO, RlmtStat, 0},
  1291. {OID_SKGE_RLMT_STATUS,
  1292. SK_PNMI_MAC_ENTRIES,
  1293. sizeof(SK_PNMI_RLMT),
  1294. SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtStatus),
  1295. SK_PNMI_RO, RlmtStat, 0},
  1296. {OID_SKGE_RLMT_TX_HELLO_CTS,
  1297. SK_PNMI_MAC_ENTRIES,
  1298. sizeof(SK_PNMI_RLMT),
  1299. SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtTxHelloCts),
  1300. SK_PNMI_RO, RlmtStat, 0},
  1301. {OID_SKGE_RLMT_RX_HELLO_CTS,
  1302. SK_PNMI_MAC_ENTRIES,
  1303. sizeof(SK_PNMI_RLMT),
  1304. SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtRxHelloCts),
  1305. SK_PNMI_RO, RlmtStat, 0},
  1306. {OID_SKGE_RLMT_TX_SP_REQ_CTS,
  1307. SK_PNMI_MAC_ENTRIES,
  1308. sizeof(SK_PNMI_RLMT),
  1309. SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtTxSpHelloReqCts),
  1310. SK_PNMI_RO, RlmtStat, 0},
  1311. {OID_SKGE_RLMT_RX_SP_CTS,
  1312. SK_PNMI_MAC_ENTRIES,
  1313. sizeof(SK_PNMI_RLMT),
  1314. SK_PNMI_OFF(Rlmt) + SK_PNMI_RLM_OFF(RlmtRxSpHelloCts),
  1315. SK_PNMI_RO, RlmtStat, 0},
  1316. {OID_SKGE_RLMT_MONITOR_NUMBER,
  1317. 1,
  1318. 0,
  1319. SK_PNMI_MAI_OFF(RlmtMonitorNumber),
  1320. SK_PNMI_RO, General, 0},
  1321. {OID_SKGE_RLMT_MONITOR_INDEX,
  1322. SK_PNMI_MONITOR_ENTRIES,
  1323. sizeof(SK_PNMI_RLMT_MONITOR),
  1324. SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorIndex),
  1325. SK_PNMI_RO, Monitor, 0},
  1326. {OID_SKGE_RLMT_MONITOR_ADDR,
  1327. SK_PNMI_MONITOR_ENTRIES,
  1328. sizeof(SK_PNMI_RLMT_MONITOR),
  1329. SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorAddr),
  1330. SK_PNMI_RO, Monitor, 0},
  1331. {OID_SKGE_RLMT_MONITOR_ERRS,
  1332. SK_PNMI_MONITOR_ENTRIES,
  1333. sizeof(SK_PNMI_RLMT_MONITOR),
  1334. SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorErrorCts),
  1335. SK_PNMI_RO, Monitor, 0},
  1336. {OID_SKGE_RLMT_MONITOR_TIMESTAMP,
  1337. SK_PNMI_MONITOR_ENTRIES,
  1338. sizeof(SK_PNMI_RLMT_MONITOR),
  1339. SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorTimestamp),
  1340. SK_PNMI_RO, Monitor, 0},
  1341. {OID_SKGE_RLMT_MONITOR_ADMIN,
  1342. SK_PNMI_MONITOR_ENTRIES,
  1343. sizeof(SK_PNMI_RLMT_MONITOR),
  1344. SK_PNMI_OFF(RlmtMonitor) + SK_PNMI_MON_OFF(RlmtMonitorAdmin),
  1345. SK_PNMI_RW, Monitor, 0},
  1346. {OID_SKGE_MTU,
  1347. 1,
  1348. 0,
  1349. SK_PNMI_MAI_OFF(MtuSize),
  1350. SK_PNMI_RW, MacPrivateConf, 0},
  1351. };
  1352. /*
  1353.  * Table for hardware register saving on resets and port switches
  1354.  */
  1355. static const SK_PNMI_STATADDR StatAddress[SK_PNMI_MAX_IDX] = {
  1356. /*  0 */ {TRUE, XM_TXF_OK},
  1357. /*  1 */ {TRUE, 0},
  1358. /*  2 */ {FALSE, 0},
  1359. /*  3 */ {TRUE, XM_TXF_BC_OK},
  1360. /*  4 */ {TRUE, XM_TXF_MC_OK},
  1361. /*  5 */ {TRUE, XM_TXF_UC_OK},
  1362. /*  6 */ {TRUE, XM_TXF_LONG},
  1363. /*  7 */ {TRUE, XM_TXE_BURST},
  1364. /*  8 */ {TRUE, XM_TXF_MPAUSE},
  1365. /*  9 */ {TRUE, XM_TXF_MCTRL},
  1366. /* 10 */ {TRUE, XM_TXF_SNG_COL},
  1367. /* 11 */ {TRUE, XM_TXF_MUL_COL},
  1368. /* 12 */ {TRUE, XM_TXF_ABO_COL},
  1369. /* 13 */ {TRUE, XM_TXF_LAT_COL},
  1370. /* 14 */ {TRUE, XM_TXF_DEF},
  1371. /* 15 */ {TRUE, XM_TXF_EX_DEF},
  1372. /* 16 */ {TRUE, XM_TXE_FIFO_UR},
  1373. /* 17 */ {TRUE, XM_TXE_CS_ERR},
  1374. /* 18 */ {FALSE, 0},
  1375. /* 19 */ {FALSE, 0},
  1376. /* 20 */ {TRUE, XM_TXF_64B},
  1377. /* 21 */ {TRUE, XM_TXF_127B},
  1378. /* 22 */ {TRUE, XM_TXF_255B},
  1379. /* 23 */ {TRUE, XM_TXF_511B},
  1380. /* 24 */ {TRUE, XM_TXF_1023B},
  1381. /* 25 */ {TRUE, XM_TXF_MAX_SZ},
  1382. /* 26 */ {FALSE, 0},
  1383. /* 27 */ {FALSE, 0},
  1384. /* 28 */ {FALSE, 0},
  1385. /* 29 */ {FALSE, 0},
  1386. /* 30 */ {FALSE, 0},
  1387. /* 31 */ {FALSE, 0},
  1388. /* 32 */ {TRUE, XM_RXF_OK},
  1389. /* 33 */ {TRUE, 0},
  1390. /* 34 */ {FALSE, 0},
  1391. /* 35 */ {TRUE, XM_RXF_BC_OK},
  1392. /* 36 */ {TRUE, XM_RXF_MC_OK},
  1393. /* 37 */ {TRUE, XM_RXF_UC_OK},
  1394. /* 38 */ {TRUE, XM_RXF_MPAUSE},
  1395. /* 39 */ {TRUE, XM_RXF_MCTRL},
  1396. /* 40 */ {TRUE, XM_RXF_INV_MP},
  1397. /* 41 */ {TRUE, XM_RXF_INV_MOC},
  1398. /* 42 */ {TRUE, XM_RXE_BURST},
  1399. /* 43 */ {TRUE, XM_RXE_FMISS},
  1400. /* 44 */ {TRUE, XM_RXF_FRA_ERR},
  1401. /* 45 */ {TRUE, XM_RXE_FIFO_OV},
  1402. /* 46 */ {TRUE, XM_RXF_JAB_PKT},
  1403. /* 47 */ {TRUE, XM_RXE_CAR_ERR},
  1404. /* 48 */ {TRUE, XM_RXF_LEN_ERR},
  1405. /* 49 */ {TRUE, XM_RXE_SYM_ERR},
  1406. /* 50 */ {TRUE, XM_RXE_SHT_ERR},
  1407. /* 51 */ {TRUE, XM_RXE_RUNT},
  1408. /* 52 */ {TRUE, XM_RXF_LNG_ERR},
  1409. /* 53 */ {TRUE, XM_RXF_FCS_ERR},
  1410. /* 54 */ {FALSE, 0},
  1411. /* 55 */ {TRUE, XM_RXF_CEX_ERR},
  1412. /* 56 */ {FALSE, 0},
  1413. /* 57 */ {FALSE, 0},
  1414. /* 58 */ {TRUE, XM_RXF_64B},
  1415. /* 59 */ {TRUE, XM_RXF_127B},
  1416. /* 60 */ {TRUE, XM_RXF_255B},
  1417. /* 61 */ {TRUE, XM_RXF_511B},
  1418. /* 62 */ {TRUE, XM_RXF_1023B},
  1419. /* 63 */ {TRUE, XM_RXF_MAX_SZ},
  1420. /* 64 */ {FALSE, 0},
  1421. /* 65 */ {FALSE, 0},
  1422. /* 66 */ {TRUE, 0}
  1423. };
  1424. /*****************************************************************************
  1425.  *
  1426.  * Public functions
  1427.  *
  1428.  */
  1429. /*****************************************************************************
  1430.  *
  1431.  * SkPnmiInit - Init function of PNMI
  1432.  *
  1433.  * Description:
  1434.  * SK_INIT_DATA: Initialises the data structures
  1435.  * SK_INIT_IO:   Resets the XMAC statistics, determines the device and
  1436.  *               connector type.
  1437.  * SK_INIT_RUN:  Starts a timer event for port switch per hour
  1438.  *               calculation.
  1439.  *
  1440.  * Returns:
  1441.  * Always 0
  1442.  */
  1443. int SkPnmiInit(
  1444. SK_AC *pAC, /* Pointer to adapter context */
  1445. SK_IOC IoC, /* IO context handle */
  1446. int Level) /* Initialization level */
  1447. {
  1448. unsigned int PortMax; /* Number of ports */
  1449. unsigned int PortIndex; /* Current port index in loop */
  1450. SK_U16 Val16; /* Multiple purpose 16 bit variable */
  1451. SK_U8 Val8; /* Mulitple purpose 8 bit variable */
  1452. SK_EVPARA EventParam; /* Event struct for timer event */
  1453. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1454. ("PNMI: SkPnmiInit: Called, level=%dn", Level));
  1455. switch (Level) {
  1456. case SK_INIT_DATA:
  1457. SK_MEMSET((char *)&pAC->Pnmi, 0, sizeof(pAC->Pnmi));
  1458. pAC->Pnmi.TrapBufFree = SK_PNMI_TRAP_QUEUE_LEN;
  1459. pAC->Pnmi.StartUpTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));
  1460. pAC->Pnmi.RlmtChangeThreshold = SK_PNMI_DEF_RLMT_CHG_THRES;
  1461. for (PortIndex = 0; PortIndex < SK_MAX_MACS; PortIndex ++) {
  1462. pAC->Pnmi.Port[PortIndex].ActiveFlag = SK_FALSE;
  1463. pAC->Pnmi.DualNetActiveFlag = SK_FALSE;
  1464. }
  1465. break;
  1466. case SK_INIT_IO:
  1467. /*
  1468.  * Reset MAC counters
  1469.  */
  1470. PortMax = pAC->GIni.GIMacsFound;
  1471. for (PortIndex = 0; PortIndex < PortMax; PortIndex ++) {
  1472. Val16 = XM_SC_CLR_RXC | XM_SC_CLR_TXC;
  1473. XM_OUT16(IoC, PortIndex, XM_STAT_CMD, Val16);
  1474. /* Clear two times according to Errata #3 */
  1475. XM_OUT16(IoC, PortIndex, XM_STAT_CMD, Val16);
  1476. }
  1477. /*
  1478.  * Get pci bus speed
  1479.  */
  1480. SK_IN16(IoC, B0_CTST, &Val16);
  1481. if ((Val16 & CS_BUS_CLOCK) == 0) {
  1482. pAC->Pnmi.PciBusSpeed = 33;
  1483. }
  1484. else {
  1485. pAC->Pnmi.PciBusSpeed = 66;
  1486. }
  1487. /*
  1488.  * Get pci bus width
  1489.  */
  1490. SK_IN16(IoC, B0_CTST, &Val16);
  1491. if ((Val16 & CS_BUS_SLOT_SZ) == 0) {
  1492. pAC->Pnmi.PciBusWidth = 32;
  1493. }
  1494. else {
  1495. pAC->Pnmi.PciBusWidth = 64;
  1496. }
  1497. /*
  1498.  * Get PMD and DeviceType
  1499.  */
  1500. SK_IN8(IoC, B2_PMD_TYP, &Val8);
  1501. switch (Val8) {
  1502. case 'S':
  1503. pAC->Pnmi.PMD = 3;
  1504. if (pAC->GIni.GIMacsFound > 1) {
  1505. pAC->Pnmi.DeviceType = 0x00020002;
  1506. }
  1507. else {
  1508. pAC->Pnmi.DeviceType = 0x00020001;
  1509. }
  1510. break;
  1511. case 'L':
  1512. pAC->Pnmi.PMD = 2;
  1513. if (pAC->GIni.GIMacsFound > 1) {
  1514. pAC->Pnmi.DeviceType = 0x00020004;
  1515. }
  1516. else {
  1517. pAC->Pnmi.DeviceType = 0x00020003;
  1518. }
  1519. break;
  1520. case 'C':
  1521. pAC->Pnmi.PMD = 4;
  1522. if (pAC->GIni.GIMacsFound > 1) {
  1523. pAC->Pnmi.DeviceType = 0x00020006;
  1524. }
  1525. else {
  1526. pAC->Pnmi.DeviceType = 0x00020005;
  1527. }
  1528. break;
  1529. case 'T':
  1530. pAC->Pnmi.PMD = 5;
  1531. if (pAC->GIni.GIMacsFound > 1) {
  1532. pAC->Pnmi.DeviceType = 0x00020008;
  1533. }
  1534. else {
  1535. pAC->Pnmi.DeviceType = 0x00020007;
  1536. }
  1537. break;
  1538. default :
  1539. pAC->Pnmi.PMD = 1;
  1540. pAC->Pnmi.DeviceType = 0;
  1541. break;
  1542. }
  1543. /*
  1544.  * Get connector
  1545.  */
  1546. SK_IN8(IoC, B2_CONN_TYP, &Val8);
  1547. switch (Val8) {
  1548. case 'C':
  1549. pAC->Pnmi.Connector = 2;
  1550. break;
  1551. case 'D':
  1552. pAC->Pnmi.Connector = 3;
  1553. break;
  1554. case 'F':
  1555. pAC->Pnmi.Connector = 4;
  1556. break;
  1557. case 'J':
  1558. pAC->Pnmi.Connector = 5;
  1559. break;
  1560. case 'V':
  1561. pAC->Pnmi.Connector = 6;
  1562. break;
  1563. default:
  1564. pAC->Pnmi.Connector = 1;
  1565. break;
  1566. }
  1567. break;
  1568. case SK_INIT_RUN:
  1569. /*
  1570.  * Start timer for RLMT change counter
  1571.  */
  1572. SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
  1573. SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer,
  1574. 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER,
  1575. EventParam);
  1576. break;
  1577. default:
  1578. break; /* Nothing todo */
  1579. }
  1580. return (0);
  1581. }
  1582. /*****************************************************************************
  1583.  *
  1584.  * SkPnmiGetVar - Retrieves the value of a single OID
  1585.  *
  1586.  * Description:
  1587.  * Calls a general sub-function for all this stuff. If the instance
  1588.  * -1 is passed, the values of all instances are returned in an
  1589.  * array of values.
  1590.  *
  1591.  * Returns:
  1592.  * SK_PNMI_ERR_OK           The request was successfully performed
  1593.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured
  1594.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to take
  1595.  *                          the data.
  1596.  * SK_PNMI_ERR_UNKNOWN_OID  The requested OID is unknown
  1597.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  1598.  *                               exist (e.g. port instance 3 on a two port
  1599.  *                          adapter.
  1600.  */
  1601. int SkPnmiGetVar(
  1602. SK_AC *pAC, /* Pointer to adapter context */
  1603. SK_IOC IoC, /* IO context handle */
  1604. SK_U32 Id, /* Object ID that is to be processed */
  1605. void *pBuf, /* Buffer to which to mgmt data will be retrieved */
  1606. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  1607. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  1608. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  1609. {
  1610. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1611. ("PNMI: SkPnmiGetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%dn",
  1612. Id, *pLen, Instance, NetIndex));
  1613. return (PnmiVar(pAC, IoC, SK_PNMI_GET, Id, (char *)pBuf, pLen,
  1614. Instance, NetIndex));
  1615. }
  1616. /*****************************************************************************
  1617.  *
  1618.  * SkPnmiPreSetVar - Presets the value of a single OID
  1619.  *
  1620.  * Description:
  1621.  * Calls a general sub-function for all this stuff. The preset does
  1622.  * the same as a set, but returns just before finally setting the
  1623.  * new value. This is usefull to check if a set might be successfull.
  1624.  * If as instance a -1 is passed, an array of values is supposed and
  1625.  * all instance of the OID will be set.
  1626.  *
  1627.  * Returns:
  1628.  * SK_PNMI_ERR_OK           The request was successfully performed.
  1629.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  1630.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  1631.  *                          the correct data (e.g. a 32bit value is
  1632.  *                          needed, but a 16 bit value was passed).
  1633.  * SK_PNMI_ERR_BAD_VALUE    The passed value is not in the valid
  1634.  *                          value range.
  1635.  * SK_PNMI_ERR_READ_ONLY    The OID is read-only and cannot be set.
  1636.  * SK_PNMI_ERR_UNKNOWN_OID  The requested OID is unknown.
  1637.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  1638.  *                               exist (e.g. port instance 3 on a two port
  1639.  *                          adapter.
  1640.  */
  1641. int SkPnmiPreSetVar(
  1642. SK_AC *pAC, /* Pointer to adapter context */
  1643. SK_IOC IoC, /* IO context handle */
  1644. SK_U32 Id, /* Object ID that is to be processed */
  1645. void *pBuf, /* Buffer which stores the mgmt data to be set */
  1646. unsigned int *pLen, /* Total length of mgmt data */
  1647. SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */
  1648. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  1649. {
  1650. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1651. ("PNMI: SkPnmiPreSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%dn",
  1652. Id, *pLen, Instance, NetIndex));
  1653. return (PnmiVar(pAC, IoC, SK_PNMI_PRESET, Id, (char *)pBuf, pLen,
  1654. Instance, NetIndex));
  1655. }
  1656. /*****************************************************************************
  1657.  *
  1658.  * SkPnmiSetVar - Sets the value of a single OID
  1659.  *
  1660.  * Description:
  1661.  * Calls a general sub-function for all this stuff. The preset does
  1662.  * the same as a set, but returns just before finally setting the
  1663.  * new value. This is usefull to check if a set might be successfull.
  1664.  * If as instance a -1 is passed, an array of values is supposed and
  1665.  * all instance of the OID will be set.
  1666.  *
  1667.  * Returns:
  1668.  * SK_PNMI_ERR_OK           The request was successfully performed.
  1669.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  1670.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  1671.  *                          the correct data (e.g. a 32bit value is
  1672.  *                          needed, but a 16 bit value was passed).
  1673.  * SK_PNMI_ERR_BAD_VALUE    The passed value is not in the valid
  1674.  *                          value range.
  1675.  * SK_PNMI_ERR_READ_ONLY    The OID is read-only and cannot be set.
  1676.  * SK_PNMI_ERR_UNKNOWN_OID  The requested OID is unknown.
  1677.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  1678.  *                               exist (e.g. port instance 3 on a two port
  1679.  *                          adapter.
  1680.  */
  1681. int SkPnmiSetVar(
  1682. SK_AC *pAC, /* Pointer to adapter context */
  1683. SK_IOC IoC, /* IO context handle */
  1684. SK_U32 Id, /* Object ID that is to be processed */
  1685. void *pBuf, /* Buffer which stores the mgmt data to be set */
  1686. unsigned int *pLen, /* Total length of mgmt data */
  1687. SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */
  1688. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  1689. {
  1690. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1691. ("PNMI: SkPnmiSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%dn",
  1692. Id, *pLen, Instance, NetIndex));
  1693. return (PnmiVar(pAC, IoC, SK_PNMI_SET, Id, (char *)pBuf, pLen,
  1694. Instance, NetIndex));
  1695. }
  1696. /*****************************************************************************
  1697.  *
  1698.  * SkPnmiGetStruct - Retrieves the management database in SK_PNMI_STRUCT_DATA
  1699.  *
  1700.  * Description:
  1701.  * Runs through the IdTable, queries the single OIDs and stores the
  1702.  * returned data into the management database structure
  1703.  * SK_PNMI_STRUCT_DATA. The offset of the OID in the structure
  1704.  * is stored in the IdTable. The return value of the function will also
  1705.  * be stored in SK_PNMI_STRUCT_DATA if the passed buffer has the
  1706.  * minimum size of SK_PNMI_MIN_STRUCT_SIZE.
  1707.  *
  1708.  * Returns:
  1709.  * SK_PNMI_ERR_OK           The request was successfully performed
  1710.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured
  1711.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to take
  1712.  *                          the data.
  1713.  * SK_PNMI_ERR_UNKNOWN_NET  The requested NetIndex doesn't exist 
  1714.  */
  1715. int SkPnmiGetStruct(
  1716. SK_AC *pAC, /* Pointer to adapter context */
  1717. SK_IOC IoC, /* IO context handle */
  1718. void *pBuf, /* Buffer which will store the retrieved data */
  1719. unsigned int *pLen, /* Length of buffer */
  1720. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  1721. {
  1722. int Ret;
  1723. unsigned int TableIndex;
  1724. unsigned int DstOffset;
  1725. unsigned int InstanceNo;
  1726. unsigned int InstanceCnt;
  1727. SK_U32 Instance;
  1728. unsigned int TmpLen;
  1729. char KeyArr[SK_PNMI_VPD_ENTRIES][SK_PNMI_VPD_KEY_SIZE];
  1730. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1731. ("PNMI: SkPnmiGetStruct: Called, BufLen=%d, NetIndex=%dn",
  1732. *pLen, NetIndex));
  1733. if (*pLen < SK_PNMI_STRUCT_SIZE) {
  1734. if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) {
  1735. SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT,
  1736. (SK_U32)(-1));
  1737. }
  1738. *pLen = SK_PNMI_STRUCT_SIZE;
  1739. return (SK_PNMI_ERR_TOO_SHORT);
  1740. }
  1741.     /*
  1742.      * Check NetIndex
  1743.      */
  1744. if (NetIndex >= pAC->Rlmt.NumNets) {
  1745. return (SK_PNMI_ERR_UNKNOWN_NET);
  1746. }
  1747. /* Update statistic */
  1748. SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On call");
  1749. if ((Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1)) !=
  1750. SK_PNMI_ERR_OK) {
  1751. SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
  1752. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  1753. return (Ret);
  1754. }
  1755. if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {
  1756. SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
  1757. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  1758. return (Ret);
  1759. }
  1760. if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {
  1761. SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
  1762. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  1763. return (Ret);
  1764. }
  1765. /*
  1766.  * Increment semaphores to indicate that an update was
  1767.  * already done
  1768.  */
  1769. pAC->Pnmi.MacUpdatedFlag ++;
  1770. pAC->Pnmi.RlmtUpdatedFlag ++;
  1771. pAC->Pnmi.SirqUpdatedFlag ++;
  1772. /* Get vpd keys for instance calculation */
  1773. Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &TmpLen);
  1774. if (Ret != SK_PNMI_ERR_OK) {
  1775. pAC->Pnmi.MacUpdatedFlag --;
  1776. pAC->Pnmi.RlmtUpdatedFlag --;
  1777. pAC->Pnmi.SirqUpdatedFlag --;
  1778. SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");
  1779. SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
  1780. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  1781. return (SK_PNMI_ERR_GENERAL);
  1782. }
  1783. /* Retrieve values */
  1784. SK_MEMSET((char *)pBuf, 0, SK_PNMI_STRUCT_SIZE);
  1785. for (TableIndex = 0; TableIndex < sizeof(IdTable)/sizeof(IdTable[0]);
  1786. TableIndex ++) {
  1787. InstanceNo = IdTable[TableIndex].InstanceNo;
  1788. for (InstanceCnt = 1; InstanceCnt <= InstanceNo;
  1789. InstanceCnt ++) {
  1790. DstOffset = IdTable[TableIndex].Offset +
  1791. (InstanceCnt - 1) *
  1792. IdTable[TableIndex].StructSize;
  1793. /*
  1794.  * For the VPD the instance is not an index number
  1795.  * but the key itself. Determin with the instance
  1796.  * counter the VPD key to be used.
  1797.  */
  1798. if (IdTable[TableIndex].Id == OID_SKGE_VPD_KEY ||
  1799. IdTable[TableIndex].Id == OID_SKGE_VPD_VALUE ||
  1800. IdTable[TableIndex].Id == OID_SKGE_VPD_ACCESS ||
  1801. IdTable[TableIndex].Id == OID_SKGE_VPD_ACTION) {
  1802. SK_STRNCPY((char *)&Instance, KeyArr[InstanceCnt - 1], 4);
  1803. }
  1804. else {
  1805. Instance = (SK_U32)InstanceCnt;
  1806. }
  1807. TmpLen = *pLen - DstOffset;
  1808. Ret = IdTable[TableIndex].Func(pAC, IoC, SK_PNMI_GET,
  1809. IdTable[TableIndex].Id, (char *)pBuf +
  1810. DstOffset, &TmpLen, Instance, TableIndex, NetIndex);
  1811. /*
  1812.  * An unknown instance error means that we reached
  1813.  * the last instance of that variable. Proceed with
  1814.  * the next OID in the table and ignore the return
  1815.  * code.
  1816.  */
  1817. if (Ret == SK_PNMI_ERR_UNKNOWN_INST) {
  1818.                 break;
  1819. }
  1820. if (Ret != SK_PNMI_ERR_OK) {
  1821. pAC->Pnmi.MacUpdatedFlag --;
  1822. pAC->Pnmi.RlmtUpdatedFlag --;
  1823. pAC->Pnmi.SirqUpdatedFlag --;
  1824. SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");
  1825. SK_PNMI_SET_STAT(pBuf, Ret, DstOffset);
  1826. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  1827. return (Ret);
  1828. }
  1829. }
  1830. }
  1831. pAC->Pnmi.MacUpdatedFlag --;
  1832. pAC->Pnmi.RlmtUpdatedFlag --;
  1833. pAC->Pnmi.SirqUpdatedFlag --;
  1834. *pLen = SK_PNMI_STRUCT_SIZE;
  1835. SK_PNMI_CHECKFLAGS("SkPnmiGetStruct: On return");
  1836. SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_OK, (SK_U32)(-1));
  1837. return (SK_PNMI_ERR_OK);
  1838. }
  1839. /*****************************************************************************
  1840.  *
  1841.  * SkPnmiPreSetStruct - Presets the management database in SK_PNMI_STRUCT_DATA
  1842.  *
  1843.  * Description:
  1844.  * Calls a general sub-function for all this set stuff. The preset does
  1845.  * the same as a set, but returns just before finally setting the
  1846.  * new value. This is usefull to check if a set might be successfull.
  1847.  * The sub-function runs through the IdTable, checks which OIDs are able
  1848.  * to set, and calls the handler function of the OID to perform the
  1849.  * preset. The return value of the function will also be stored in
  1850.  * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of
  1851.  * SK_PNMI_MIN_STRUCT_SIZE.
  1852.  *
  1853.  * Returns:
  1854.  * SK_PNMI_ERR_OK           The request was successfully performed.
  1855.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  1856.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  1857.  *                          the correct data (e.g. a 32bit value is
  1858.  *                          needed, but a 16 bit value was passed).
  1859.  * SK_PNMI_ERR_BAD_VALUE    The passed value is not in the valid
  1860.  *                          value range.
  1861.  */
  1862. int SkPnmiPreSetStruct(
  1863. SK_AC *pAC, /* Pointer to adapter context */
  1864. SK_IOC IoC, /* IO context handle */
  1865. void *pBuf, /* Buffer which contains the data to be set */
  1866. unsigned int *pLen, /* Length of buffer */
  1867. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  1868. {
  1869. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1870. ("PNMI: SkPnmiPreSetStruct: Called, BufLen=%d, NetIndex=%dn",
  1871. *pLen, NetIndex));
  1872. return (PnmiStruct(pAC, IoC, SK_PNMI_PRESET, (char *)pBuf, 
  1873.      pLen, NetIndex));
  1874. }
  1875. /*****************************************************************************
  1876.  *
  1877.  * SkPnmiSetStruct - Sets the management database in SK_PNMI_STRUCT_DATA
  1878.  *
  1879.  * Description:
  1880.  * Calls a general sub-function for all this set stuff. The return value
  1881.  * of the function will also be stored in SK_PNMI_STRUCT_DATA if the
  1882.  * passed buffer has the minimum size of SK_PNMI_MIN_STRUCT_SIZE.
  1883.  * The sub-function runs through the IdTable, checks which OIDs are able
  1884.  * to set, and calls the handler function of the OID to perform the
  1885.  * set. The return value of the function will also be stored in
  1886.  * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of
  1887.  * SK_PNMI_MIN_STRUCT_SIZE.
  1888.  *
  1889.  * Returns:
  1890.  * SK_PNMI_ERR_OK           The request was successfully performed.
  1891.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  1892.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  1893.  *                          the correct data (e.g. a 32bit value is
  1894.  *                          needed, but a 16 bit value was passed).
  1895.  * SK_PNMI_ERR_BAD_VALUE    The passed value is not in the valid
  1896.  *                          value range.
  1897.  */
  1898. int SkPnmiSetStruct(
  1899. SK_AC *pAC, /* Pointer to adapter context */
  1900. SK_IOC IoC, /* IO context handle */
  1901. void *pBuf, /* Buffer which contains the data to be set */
  1902. unsigned int *pLen, /* Length of buffer */
  1903. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  1904. {
  1905. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1906. ("PNMI: SkPnmiSetStruct: Called, BufLen=%d, NetIndex=%dn",
  1907. *pLen, NetIndex));
  1908. return (PnmiStruct(pAC, IoC, SK_PNMI_SET, (char *)pBuf, 
  1909.      pLen, NetIndex));
  1910. }
  1911. /*****************************************************************************
  1912.  *
  1913.  * SkPnmiEvent - Event handler
  1914.  *
  1915.  * Description:
  1916.  * Handles the following events:
  1917.  * SK_PNMI_EVT_SIRQ_OVERFLOW     When a hardware counter overflows an
  1918.  *                               interrupt will be generated which is
  1919.  *                               first handled by SIRQ which generates a
  1920.  *                               this event. The event increments the
  1921.  *                               upper 32 bit of the 64 bit counter.
  1922.  * SK_PNMI_EVT_SEN_XXX           The event is generated by the I2C module
  1923.  *                               when a sensor reports a warning or
  1924.  *                               error. The event will store a trap
  1925.  *                               message in the trap buffer.
  1926.  * SK_PNMI_EVT_CHG_EST_TIMER     The timer event was initiated by this
  1927.  *                               module and is used to calculate the
  1928.  *                               port switches per hour.
  1929.  * SK_PNMI_EVT_CLEAR_COUNTER     The event clears all counters and
  1930.  *                               timestamps.
  1931.  * SK_PNMI_EVT_XMAC_RESET        The event is generated by the driver
  1932.  *                               before a hard reset of the XMAC is
  1933.  *                               performed. All counters will be saved
  1934.  *                               and added to the hardware counter
  1935.  *                               values after reset to grant continuous
  1936.  *                               counter values.
  1937.  * SK_PNMI_EVT_RLMT_PORT_UP      Generated by RLMT to notify that a port
  1938.  *                               went logically up. A trap message will
  1939.  *                               be stored to the trap buffer.
  1940.  * SK_PNMI_EVT_RLMT_PORT_DOWN    Generated by RLMT to notify that a port
  1941.  *                               went logically down. A trap message will
  1942.  *                               be stored to the trap buffer.
  1943.  * SK_PNMI_EVT_RLMT_SEGMENTATION Generated by RLMT to notify that two
  1944.  *                               spanning tree root bridges were
  1945.  *                               detected. A trap message will be stored
  1946.  *                               to the trap buffer.
  1947.  * SK_PNMI_EVT_RLMT_ACTIVE_DOWN  Notifies PNMI that an active port went
  1948.  *                               down. PNMI will not further add the
  1949.  *                               statistic values to the virtual port.
  1950.  * SK_PNMI_EVT_RLMT_ACTIVE_UP    Notifies PNMI that a port went up and
  1951.  *                               is now an active port. PNMI will now
  1952.  *                               add the statistic data of this port to
  1953.  *                               the virtual port.
  1954.  * SK_PNMI_EVT_RLMT_SET_NETS     Notifies PNMI about the net mode. The first Parameter
  1955.  *                               contains the number of nets. 1 means single net, 2 means
  1956.  *                               dual net. The second Parameter is -1
  1957.  *
  1958.  * Returns:
  1959.  * Always 0
  1960.  */
  1961. int SkPnmiEvent(
  1962. SK_AC *pAC, /* Pointer to adapter context */
  1963. SK_IOC IoC, /* IO context handle */
  1964. SK_U32 Event, /* Event-Id */
  1965. SK_EVPARA Param) /* Event dependent parameter */
  1966. {
  1967. unsigned int PhysPortIndex;
  1968.     unsigned int MaxNetNumber;
  1969. int CounterIndex;
  1970. int Ret;
  1971. SK_U16 MacStatus;
  1972. SK_U64 OverflowStatus;
  1973. SK_U64 Mask;
  1974. SK_U32 MacCntEvent;
  1975. SK_U64 Value;
  1976. SK_U16 Register;
  1977. SK_EVPARA EventParam;
  1978. SK_U64 NewestValue;
  1979. SK_U64 OldestValue;
  1980. SK_U64 Delta;
  1981. SK_PNMI_ESTIMATE *pEst;
  1982. SK_U32 NetIndex;
  1983. #ifdef DEBUG
  1984. if (Event != SK_PNMI_EVT_XMAC_RESET) {
  1985. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1986. ("PNMI: SkPnmiEvent: Called, Event=0x%x, Param=0x%xn",
  1987. (unsigned long)Event, (unsigned long)Param.Para64));
  1988. }
  1989. #endif
  1990. SK_PNMI_CHECKFLAGS("SkPnmiEvent: On call");
  1991. switch (Event) {
  1992. case SK_PNMI_EVT_SIRQ_OVERFLOW:
  1993. PhysPortIndex = (int)Param.Para32[0];
  1994. MacStatus = (SK_U16)Param.Para32[1];
  1995. #ifdef DEBUG
  1996. if (PhysPortIndex >= SK_MAX_MACS) {
  1997. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  1998. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SIRQ_OVERFLOW parameter wrong, PhysPortIndex=0x%xn",
  1999. PhysPortIndex));
  2000. return (0);
  2001. }
  2002. #endif
  2003. OverflowStatus = 0;
  2004. /*
  2005.  * Check which source caused an overflow interrupt. The
  2006.  * interrupt source is a self-clearing register. We only
  2007.  * need to check the interrupt source once. Another check
  2008.  * will be done by the SIRQ module to be sure that no
  2009.  * interrupt get lost during process time.
  2010.  */
  2011. if ((MacStatus & XM_IS_RXC_OV) == XM_IS_RXC_OV) {
  2012. XM_IN32(IoC, PhysPortIndex, XM_RX_CNT_EV,
  2013. &MacCntEvent);
  2014. OverflowStatus |= (SK_U64)MacCntEvent << 32;
  2015. }
  2016. if ((MacStatus & XM_IS_TXC_OV) == XM_IS_TXC_OV) {
  2017. XM_IN32(IoC, PhysPortIndex, XM_TX_CNT_EV,
  2018. &MacCntEvent);
  2019. OverflowStatus |= (SK_U64)MacCntEvent;
  2020. }
  2021. if (OverflowStatus == 0) {
  2022. SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
  2023. return (0);
  2024. }
  2025. /*
  2026.  * Check the overflow status register and increment
  2027.  * the upper dword of corresponding counter.
  2028.  */
  2029. for (CounterIndex = 0; CounterIndex < sizeof(Mask) * 8;
  2030. CounterIndex ++) {
  2031. Mask = (SK_U64)1 << CounterIndex;
  2032. if ((OverflowStatus & Mask) == 0) {
  2033. continue;
  2034. }
  2035. switch (CounterIndex) {
  2036. case SK_PNMI_HTX_UTILUNDER:
  2037. case SK_PNMI_HTX_UTILOVER:
  2038. XM_IN16(IoC, PhysPortIndex, XM_TX_CMD,
  2039. &Register);
  2040. Register |= XM_TX_SAM_LINE;
  2041. XM_OUT16(IoC, PhysPortIndex, XM_TX_CMD,
  2042. Register);
  2043. break;
  2044. case SK_PNMI_HRX_UTILUNDER:
  2045. case SK_PNMI_HRX_UTILOVER:
  2046. XM_IN16(IoC, PhysPortIndex, XM_RX_CMD,
  2047. &Register);
  2048. Register |= XM_RX_SAM_LINE;
  2049. XM_OUT16(IoC, PhysPortIndex, XM_RX_CMD,
  2050. Register);
  2051. break;
  2052. case SK_PNMI_HTX_OCTETHIGH:
  2053. case SK_PNMI_HTX_OCTETLOW:
  2054. case SK_PNMI_HTX_RESERVED26:
  2055. case SK_PNMI_HTX_RESERVED27:
  2056. case SK_PNMI_HTX_RESERVED28:
  2057. case SK_PNMI_HTX_RESERVED29:
  2058. case SK_PNMI_HTX_RESERVED30:
  2059. case SK_PNMI_HTX_RESERVED31:
  2060. case SK_PNMI_HRX_OCTETHIGH:
  2061. case SK_PNMI_HRX_OCTETLOW:
  2062. case SK_PNMI_HRX_IRLENGTH:
  2063. case SK_PNMI_HRX_RESERVED22:
  2064. /*
  2065.  * the following counters aren't be handled (id > 63)
  2066.  */
  2067. case SK_PNMI_HTX_SYNC:
  2068. case SK_PNMI_HTX_SYNC_OCTET:
  2069. case SK_PNMI_HRX_LONGFRAMES:
  2070. break;
  2071. default:
  2072. pAC->Pnmi.Port[PhysPortIndex].
  2073. CounterHigh[CounterIndex] ++;
  2074. }
  2075. }
  2076. break;
  2077. case SK_PNMI_EVT_SEN_WAR_LOW:
  2078. #ifdef DEBUG
  2079. if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
  2080. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2081. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_LOW parameter wrong, SensorIndex=%dn",
  2082. (unsigned int)Param.Para64));
  2083. return (0);
  2084. }
  2085. #endif
  2086. /*
  2087.  * Store a trap message in the trap buffer and generate
  2088.  * an event for user space applications with the
  2089.  * SK_DRIVER_SENDEVENT macro.
  2090.  */
  2091. QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_WAR_LOW,
  2092. (unsigned int)Param.Para64);
  2093. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2094. break;
  2095. case SK_PNMI_EVT_SEN_WAR_UPP:
  2096. #ifdef DEBUG
  2097. if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
  2098. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2099. ("PNMI: ERR:SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_UPP parameter wrong, SensorIndex=%dn",
  2100. (unsigned int)Param.Para64));
  2101. return (0);
  2102. }
  2103. #endif
  2104. /*
  2105.  * Store a trap message in the trap buffer and generate
  2106.  * an event for user space applications with the
  2107.  * SK_DRIVER_SENDEVENT macro.
  2108.  */
  2109. QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_WAR_UPP,
  2110. (unsigned int)Param.Para64);
  2111. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2112. break;
  2113. case SK_PNMI_EVT_SEN_ERR_LOW:
  2114. #ifdef DEBUG
  2115. if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
  2116. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2117. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_ERR_LOW parameter wrong, SensorIndex=%dn",
  2118. (unsigned int)Param.Para64));
  2119. return (0);
  2120. }
  2121. #endif
  2122. /*
  2123.  * Store a trap message in the trap buffer and generate
  2124.  * an event for user space applications with the
  2125.  * SK_DRIVER_SENDEVENT macro.
  2126.  */
  2127. QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_ERR_LOW,
  2128. (unsigned int)Param.Para64);
  2129. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2130. break;
  2131. case SK_PNMI_EVT_SEN_ERR_UPP:
  2132. #ifdef DEBUG
  2133. if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) {
  2134. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2135. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_ERR_UPP parameter wrong, SensorIndex=%dn",
  2136. (unsigned int)Param.Para64));
  2137. return (0);
  2138. }
  2139. #endif
  2140. /*
  2141.  * Store a trap message in the trap buffer and generate
  2142.  * an event for user space applications with the
  2143.  * SK_DRIVER_SENDEVENT macro.
  2144.  */
  2145. QueueSensorTrap(pAC, OID_SKGE_TRAP_SEN_ERR_UPP,
  2146. (unsigned int)Param.Para64);
  2147. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2148. break;
  2149. case SK_PNMI_EVT_CHG_EST_TIMER:
  2150. /*
  2151.  * Calculate port switch average on a per hour basis
  2152.  *   Time interval for check       : 28125 ms
  2153.  *   Number of values for average  : 8
  2154.  *
  2155.  * Be careful in changing these values, on change check
  2156.  *   - typedef of SK_PNMI_ESTIMATE (Size of EstValue
  2157.  *     array one less than value number)
  2158.  *   - Timer initilization SkTimerStart() in SkPnmiInit
  2159.  *   - Delta value below must be multiplicated with
  2160.  *     power of 2
  2161.  *
  2162.  */
  2163. pEst = &pAC->Pnmi.RlmtChangeEstimate;
  2164. CounterIndex = pEst->EstValueIndex + 1;
  2165. if (CounterIndex == 7) {
  2166. CounterIndex = 0;
  2167. }
  2168. pEst->EstValueIndex = CounterIndex;
  2169. NewestValue = pAC->Pnmi.RlmtChangeCts;
  2170. OldestValue = pEst->EstValue[CounterIndex];
  2171. pEst->EstValue[CounterIndex] = NewestValue;
  2172. /*
  2173.  * Calculate average. Delta stores the number of
  2174.  * port switches per 28125 * 8 = 225000 ms
  2175.  */
  2176. if (NewestValue >= OldestValue) {
  2177. Delta = NewestValue - OldestValue;
  2178. }
  2179. else {
  2180. /* Overflow situation */
  2181. Delta = (SK_U64)(0 - OldestValue) + NewestValue;
  2182. }
  2183. /*
  2184.  * Extrapolate delta to port switches per hour.
  2185.  *     Estimate = Delta * (3600000 / 225000)
  2186.  *              = Delta * 16
  2187.  *              = Delta << 4
  2188.  */
  2189. pAC->Pnmi.RlmtChangeEstimate.Estimate = Delta << 4;
  2190. /*
  2191.  * Check if threshold is exceeded. If the threshold is
  2192.  * permanently exceeded every 28125 ms an event will be
  2193.  * generated to remind the user of this condition.
  2194.  */
  2195. if ((pAC->Pnmi.RlmtChangeThreshold != 0) &&
  2196. (pAC->Pnmi.RlmtChangeEstimate.Estimate >=
  2197. pAC->Pnmi.RlmtChangeThreshold)) {
  2198. QueueSimpleTrap(pAC, OID_SKGE_TRAP_RLMT_CHANGE_THRES);
  2199. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2200. }
  2201. SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam));
  2202. SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer,
  2203. 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER,
  2204. EventParam);
  2205. break;
  2206. case SK_PNMI_EVT_CLEAR_COUNTER:
  2207. /*
  2208.  *  Param.Para32[0] contains the NetIndex (0 ..1).
  2209.  *  Param.Para32[1] is reserved, contains -1.
  2210.  */
  2211. NetIndex = (SK_U32)Param.Para32[0];
  2212. #ifdef DEBUG
  2213. if (NetIndex >= pAC->Rlmt.NumNets) {
  2214. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2215. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_CLEAR_COUNTER parameter wrong, NetIndex=%dn",
  2216. NetIndex));
  2217. return (0);
  2218. }
  2219. #endif
  2220. /*
  2221.  * Set all counters and timestamps to zero
  2222.  */
  2223. ResetCounter(pAC, IoC, NetIndex); /* the according NetIndex is required
  2224. as a Parameter of the Event */ 
  2225. break;
  2226. case SK_PNMI_EVT_XMAC_RESET:
  2227. /*
  2228.  * To grant continuous counter values store the current
  2229.  * XMAC statistic values to the entries 1..n of the
  2230.  * CounterOffset array. XMAC Errata #2 
  2231.  */
  2232. #ifdef DEBUG
  2233. if ((unsigned int)Param.Para64 >= SK_MAX_MACS) {
  2234. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2235. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_XMAC_RESET parameter wrong, PhysPortIndex=%dn",
  2236. (unsigned int)Param.Para64));
  2237. return (0);
  2238. }
  2239. #endif
  2240. PhysPortIndex = (unsigned int)Param.Para64;
  2241. /*
  2242.  * Update XMAC statistic to get fresh values
  2243.  */
  2244. Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);
  2245. if (Ret != SK_PNMI_ERR_OK) {
  2246. SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
  2247. return (0);
  2248. }
  2249. /*
  2250.  * Increment semaphore to indicate that an update was
  2251.  * already done
  2252.  */
  2253. pAC->Pnmi.MacUpdatedFlag ++;
  2254. for (CounterIndex = 0; CounterIndex < SK_PNMI_SCNT_NOT;
  2255. CounterIndex ++) {
  2256. if (!StatAddress[CounterIndex].GetOffset) {
  2257. continue;
  2258. }
  2259. pAC->Pnmi.Port[PhysPortIndex].
  2260. CounterOffset[CounterIndex] = GetPhysStatVal(
  2261. pAC, IoC, PhysPortIndex, CounterIndex);
  2262. pAC->Pnmi.Port[PhysPortIndex].
  2263. CounterHigh[CounterIndex] = 0;
  2264. }
  2265. pAC->Pnmi.MacUpdatedFlag --;
  2266. break;
  2267. case SK_PNMI_EVT_RLMT_PORT_UP:
  2268. #ifdef DEBUG
  2269. if ((unsigned int)Param.Para32[0] >= SK_MAX_MACS) {
  2270. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2271. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_PORT_UP parameter wrong, PhysPortIndex=%dn",
  2272. (unsigned int)Param.Para32[0]));
  2273. return (0);
  2274. }
  2275. #endif
  2276. /*
  2277.  * Store a trap message in the trap buffer and generate an event for
  2278.  * user space applications with the SK_DRIVER_SENDEVENT macro.
  2279.  */
  2280. QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_UP,
  2281. (unsigned int)Param.Para32[0]);
  2282. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2283. break;
  2284. case SK_PNMI_EVT_RLMT_PORT_DOWN:
  2285. #ifdef DEBUG
  2286. if ((unsigned int)Param.Para32[0] >= SK_MAX_MACS) {
  2287. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2288. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_PORT_DOWN parameter wrong, PhysPortIndex=%dn",
  2289. (unsigned int)Param.Para32[0]));
  2290. return (0);
  2291. }
  2292. #endif
  2293. /*
  2294.  * Store a trap message in the trap buffer and generate an event for
  2295.  * user space applications with the SK_DRIVER_SENDEVENT macro.
  2296.  */
  2297. QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_DOWN,
  2298. (unsigned int)Param.Para32[0]);
  2299. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2300. break;
  2301. case SK_PNMI_EVT_RLMT_ACTIVE_DOWN:
  2302. PhysPortIndex = (unsigned int)Param.Para32[0];
  2303. NetIndex = (SK_U32)Param.Para32[1];
  2304. #ifdef DEBUG
  2305. if (PhysPortIndex >= SK_MAX_MACS) {
  2306. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2307. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_DOWN parameter too high, PhysPort=%dn",
  2308. PhysPortIndex));
  2309. }
  2310. if (NetIndex >= pAC->Rlmt.NumNets) {
  2311. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2312. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_DOWN parameter too high, NetIndex=%dn",
  2313. NetIndex));
  2314. }
  2315. #endif
  2316. /*
  2317.  * For now, ignore event if NetIndex != 0.
  2318.  */
  2319. if (Param.Para32[1] != 0) {
  2320. return (0);
  2321. }
  2322. /*
  2323.  * Nothing to do if port is already inactive
  2324.  */
  2325. if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
  2326. return (0);
  2327. }
  2328. /*
  2329.  * Update statistic counters to calculate new offset for the virtual
  2330.  * port and increment semaphore to indicate that an update was already
  2331.  * done.
  2332.  */
  2333. if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) !=
  2334. SK_PNMI_ERR_OK) {
  2335. SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
  2336. return (0);
  2337. }
  2338. pAC->Pnmi.MacUpdatedFlag ++;
  2339. /*
  2340.  * Calculate new counter offset for virtual port to grant continous
  2341.  * counting on port switches. The virtual port consists of all currently
  2342.  * active ports. The port down event indicates that a port is removed
  2343.  * from the virtual port. Therefore add the counter value of the removed
  2344.  * port to the CounterOffset for the virtual port to grant the same
  2345.  * counter value.
  2346.  */
  2347. for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;
  2348. CounterIndex ++) {
  2349. if (!StatAddress[CounterIndex].GetOffset) {
  2350. continue;
  2351. }
  2352. Value = GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);
  2353. pAC->Pnmi.VirtualCounterOffset[CounterIndex] += Value;
  2354. }
  2355. /*
  2356.  * Set port to inactive
  2357.  */
  2358. pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_FALSE;
  2359. pAC->Pnmi.MacUpdatedFlag --;
  2360. break;
  2361. case SK_PNMI_EVT_RLMT_ACTIVE_UP:
  2362. PhysPortIndex = (unsigned int)Param.Para32[0];
  2363. NetIndex = (SK_U32)Param.Para32[1];
  2364. #ifdef DEBUG
  2365. if (PhysPortIndex >= SK_MAX_MACS) {
  2366. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2367. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_UP parameter too high, PhysPort=%dn",
  2368. PhysPortIndex));
  2369. }
  2370. if (NetIndex >= pAC->Rlmt.NumNets) {
  2371. SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL,
  2372. ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_UP parameter too high, NetIndex=%dn",
  2373. NetIndex));
  2374. }
  2375. #endif
  2376. /*
  2377.  * For now, ignore event if NetIndex != 0.
  2378.  */
  2379. if (Param.Para32[1] != 0) {
  2380. return (0);
  2381. }
  2382. /*
  2383.  * Nothing to do if port is already active
  2384.  */
  2385. if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) {
  2386. return (0);
  2387. }
  2388. /*
  2389.  * Statistic maintenance
  2390.  */
  2391. pAC->Pnmi.RlmtChangeCts ++;
  2392. pAC->Pnmi.RlmtChangeTime = SK_PNMI_HUNDREDS_SEC(SkOsGetTime(pAC));
  2393. /*
  2394.  * Store a trap message in the trap buffer and generate an event for
  2395.  * user space applications with the SK_DRIVER_SENDEVENT macro.
  2396.  */
  2397. QueueRlmtNewMacTrap(pAC, PhysPortIndex);
  2398. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2399. /*
  2400.  * Update statistic counters to calculate new offset for the virtual
  2401.  * port and increment semaphore to indicate that an update was
  2402.  * already done.
  2403.  */
  2404. if (MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1) !=
  2405. SK_PNMI_ERR_OK) {
  2406. SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
  2407. return (0);
  2408. }
  2409. pAC->Pnmi.MacUpdatedFlag ++;
  2410. /*
  2411.  * Calculate new counter offset for virtual port to grant continous
  2412.  * counting on port switches. A new port is added to the virtual port.
  2413.  * Therefore substract the counter value of the new port from the
  2414.  * CounterOffset for the virtual port to grant the same value.
  2415.  */
  2416. for (CounterIndex = 0; CounterIndex < SK_PNMI_MAX_IDX;
  2417. CounterIndex ++) {
  2418. if (!StatAddress[CounterIndex].GetOffset) {
  2419. continue;
  2420. }
  2421. Value = GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex);
  2422. pAC->Pnmi.VirtualCounterOffset[CounterIndex] -= Value;
  2423. }
  2424. /*
  2425.  * Set port to active
  2426.  */
  2427. pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_TRUE;
  2428. pAC->Pnmi.MacUpdatedFlag --;
  2429. break;
  2430. case SK_PNMI_EVT_RLMT_SEGMENTATION:
  2431. /*
  2432.  * Para.Para32[0] contains the NetIndex.
  2433.  */
  2434. /*
  2435.  * Store a trap message in the trap buffer and generate an event for
  2436.  * user space applications with the SK_DRIVER_SENDEVENT macro.
  2437.  */
  2438. QueueSimpleTrap(pAC, OID_SKGE_TRAP_RLMT_SEGMENTATION);
  2439. (void)SK_DRIVER_SENDEVENT(pAC, IoC);
  2440. break;
  2441.     case SK_PNMI_EVT_RLMT_SET_NETS:
  2442. /*
  2443.  *  Param.Para32[0] contains the number of Nets.
  2444.  *  Param.Para32[1] is reserved, contains -1.
  2445.  */
  2446.     /*
  2447.       * Check number of nets
  2448.  */
  2449. MaxNetNumber = pAC->GIni.GIMacsFound;
  2450. if (((unsigned int)Param.Para32[0] < 1)
  2451. || ((unsigned int)Param.Para32[0] > MaxNetNumber)) {
  2452. return (SK_PNMI_ERR_UNKNOWN_NET);
  2453. }
  2454.         if((unsigned int)Param.Para32[0] == 1){ /* single net mode */
  2455.          pAC->Pnmi.DualNetActiveFlag = SK_FALSE;
  2456.         }
  2457.         else { /* dual net mode */
  2458.          pAC->Pnmi.DualNetActiveFlag = SK_TRUE;
  2459.         }
  2460.         break;
  2461. default:
  2462. break;
  2463. }
  2464. SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return");
  2465. return (0);
  2466. }
  2467. /******************************************************************************
  2468.  *
  2469.  * Private functions
  2470.  *
  2471.  */
  2472. /*****************************************************************************
  2473.  *
  2474.  * PnmiVar - Gets, presets, and sets single OIDs
  2475.  *
  2476.  * Description:
  2477.  * Looks up the requested OID, calls the corresponding handler
  2478.  * function, and passes the parameters with the get, preset, or
  2479.  * set command. The function is called by SkGePnmiGetVar,
  2480.  * SkGePnmiPreSetVar, or SkGePnmiSetVar.
  2481.  *
  2482.  * Returns:
  2483.  * SK_PNMI_ERR_XXX. For details have a look to the description of the
  2484.  * calling functions.
  2485.  * SK_PNMI_ERR_UNKNOWN_NET  The requested NetIndex doesn't exist 
  2486.  */
  2487. static int PnmiVar(
  2488. SK_AC *pAC, /* Pointer to adapter context */
  2489. SK_IOC IoC, /* IO context handle */
  2490. int Action, /* Get/PreSet/Set action */
  2491. SK_U32 Id, /* Object ID that is to be processed */
  2492. char *pBuf, /* Buffer which stores the mgmt data to be set */
  2493. unsigned int *pLen, /* Total length of mgmt data */
  2494. SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */
  2495. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  2496. {
  2497. unsigned int TableIndex;
  2498. int Ret;
  2499. if ((TableIndex = LookupId(Id)) == (unsigned int)(-1)) {
  2500. *pLen = 0;
  2501. return (SK_PNMI_ERR_UNKNOWN_OID);
  2502. }
  2503.     /* 
  2504.      * Check NetIndex 
  2505.      */
  2506. if (NetIndex >= pAC->Rlmt.NumNets) {
  2507. return (SK_PNMI_ERR_UNKNOWN_NET);
  2508. }
  2509. SK_PNMI_CHECKFLAGS("PnmiVar: On call");
  2510. Ret = IdTable[TableIndex].Func(pAC, IoC, Action, Id, pBuf, pLen,
  2511. Instance, TableIndex, NetIndex);
  2512. SK_PNMI_CHECKFLAGS("PnmiVar: On return");
  2513. return (Ret);
  2514. }
  2515. /*****************************************************************************
  2516.  *
  2517.  * PnmiStruct - Presets and Sets data in structure SK_PNMI_STRUCT_DATA
  2518.  *
  2519.  * Description:
  2520.  * The return value of the function will also be stored in
  2521.  * SK_PNMI_STRUCT_DATA if the passed buffer has the minimum size of
  2522.  * SK_PNMI_MIN_STRUCT_SIZE. The sub-function runs through the IdTable,
  2523.  * checks which OIDs are able to set, and calls the handler function of
  2524.  * the OID to perform the set. The return value of the function will
  2525.  * also be stored in SK_PNMI_STRUCT_DATA if the passed buffer has the
  2526.  * minimum size of SK_PNMI_MIN_STRUCT_SIZE. The function is called
  2527.  * by SkGePnmiPreSetStruct and SkGePnmiSetStruct.
  2528.  *
  2529.  * Returns:
  2530.  * SK_PNMI_ERR_XXX. The codes are described in the calling functions.
  2531.  * SK_PNMI_ERR_UNKNOWN_NET  The requested NetIndex doesn't exist 
  2532.  */
  2533. static int PnmiStruct(
  2534. SK_AC *pAC, /* Pointer to adapter context */
  2535. SK_IOC IoC, /* IO context handle */
  2536. int  Action, /* Set action to be performed */
  2537. char *pBuf, /* Buffer which contains the data to be set */
  2538. unsigned int *pLen, /* Length of buffer */
  2539. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  2540. {
  2541. int Ret;
  2542. unsigned int TableIndex;
  2543. unsigned int DstOffset;
  2544. unsigned int Len;
  2545. unsigned int InstanceNo;
  2546. unsigned int InstanceCnt;
  2547. SK_U32 Instance;
  2548. SK_U32 Id;
  2549. /* Check if the passed buffer has the right size */
  2550. if (*pLen < SK_PNMI_STRUCT_SIZE) {
  2551. /* Check if we can return the error within the buffer */
  2552. if (*pLen >= SK_PNMI_MIN_STRUCT_SIZE) {
  2553. SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_TOO_SHORT,
  2554. (SK_U32)(-1));
  2555. }
  2556. *pLen = SK_PNMI_STRUCT_SIZE;
  2557. return (SK_PNMI_ERR_TOO_SHORT);
  2558. }
  2559.     /* 
  2560.      * Check NetIndex 
  2561.      */
  2562. if (NetIndex >= pAC->Rlmt.NumNets) {
  2563. return (SK_PNMI_ERR_UNKNOWN_NET);
  2564. }
  2565. SK_PNMI_CHECKFLAGS("PnmiStruct: On call");
  2566. /*
  2567.  * Update the values of RLMT and SIRQ and increment semaphores to
  2568.  * indicate that an update was already done.
  2569.  */
  2570. if ((Ret = RlmtUpdate(pAC, IoC, NetIndex)) != SK_PNMI_ERR_OK) {
  2571. SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
  2572. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  2573. return (Ret);
  2574. }
  2575. if ((Ret = SirqUpdate(pAC, IoC)) != SK_PNMI_ERR_OK) {
  2576. SK_PNMI_SET_STAT(pBuf, Ret, (SK_U32)(-1));
  2577. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  2578. return (Ret);
  2579. }
  2580. pAC->Pnmi.RlmtUpdatedFlag ++;
  2581. pAC->Pnmi.SirqUpdatedFlag ++;
  2582. /* Preset/Set values */
  2583. for (TableIndex = 0; TableIndex < sizeof(IdTable)/sizeof(IdTable[0]);
  2584. TableIndex ++) {
  2585. if (IdTable[TableIndex].Access != SK_PNMI_RW) {
  2586. continue;
  2587. }
  2588. InstanceNo = IdTable[TableIndex].InstanceNo;
  2589. Id = IdTable[TableIndex].Id;
  2590. for (InstanceCnt = 1; InstanceCnt <= InstanceNo;
  2591. InstanceCnt ++) {
  2592. DstOffset = IdTable[TableIndex].Offset +
  2593. (InstanceCnt - 1) *
  2594. IdTable[TableIndex].StructSize;
  2595. /*
  2596.  * Because VPD multiple instance variables are
  2597.  * not setable we do not need to evaluate VPD
  2598.  * instances. Have a look to VPD instance
  2599.  * calculation in SkPnmiGetStruct().
  2600.  */
  2601. Instance = (SK_U32)InstanceCnt;
  2602. /*
  2603.  * Evaluate needed buffer length
  2604.  */
  2605. Len = 0;
  2606. Ret = IdTable[TableIndex].Func(pAC, IoC,
  2607. SK_PNMI_GET, IdTable[TableIndex].Id,
  2608. NULL, &Len, Instance, TableIndex, NetIndex);
  2609. if (Ret == SK_PNMI_ERR_UNKNOWN_INST) {
  2610. break;
  2611. }
  2612. if (Ret != SK_PNMI_ERR_TOO_SHORT) {
  2613. pAC->Pnmi.RlmtUpdatedFlag --;
  2614. pAC->Pnmi.SirqUpdatedFlag --;
  2615. SK_PNMI_CHECKFLAGS("PnmiStruct: On return");
  2616. SK_PNMI_SET_STAT(pBuf,
  2617. SK_PNMI_ERR_GENERAL, DstOffset);
  2618. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  2619. return (SK_PNMI_ERR_GENERAL);
  2620. }
  2621. if (Id == OID_SKGE_VPD_ACTION) {
  2622. switch (*(pBuf + DstOffset)) {
  2623. case SK_PNMI_VPD_CREATE:
  2624. Len = 3 + *(pBuf + DstOffset + 3);
  2625. break;
  2626. case SK_PNMI_VPD_DELETE:
  2627. Len = 3;
  2628. break;
  2629. default:
  2630. Len = 1;
  2631. break;
  2632. }
  2633. }
  2634. /* Call the OID handler function */
  2635. Ret = IdTable[TableIndex].Func(pAC, IoC, Action,
  2636. IdTable[TableIndex].Id, pBuf + DstOffset,
  2637. &Len, Instance, TableIndex, NetIndex);
  2638. if (Ret != SK_PNMI_ERR_OK) {
  2639. pAC->Pnmi.RlmtUpdatedFlag --;
  2640. pAC->Pnmi.SirqUpdatedFlag --;
  2641. SK_PNMI_CHECKFLAGS("PnmiStruct: On return");
  2642. SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_BAD_VALUE,
  2643. DstOffset);
  2644. *pLen = SK_PNMI_MIN_STRUCT_SIZE;
  2645. return (SK_PNMI_ERR_BAD_VALUE);
  2646. }
  2647. }
  2648. }
  2649. pAC->Pnmi.RlmtUpdatedFlag --;
  2650. pAC->Pnmi.SirqUpdatedFlag --;
  2651. SK_PNMI_CHECKFLAGS("PnmiStruct: On return");
  2652. SK_PNMI_SET_STAT(pBuf, SK_PNMI_ERR_OK, (SK_U32)(-1));
  2653. return (SK_PNMI_ERR_OK);
  2654. }
  2655. /*****************************************************************************
  2656.  *
  2657.  * LookupId - Lookup an OID in the IdTable
  2658.  *
  2659.  * Description:
  2660.  * Scans the IdTable to find the table entry of an OID.
  2661.  *
  2662.  * Returns:
  2663.  * The table index or -1 if not found.
  2664.  */
  2665. static int LookupId(
  2666. SK_U32 Id) /* Object identifier to be searched */
  2667. {
  2668. int i;
  2669. int Len = sizeof(IdTable)/sizeof(IdTable[0]);
  2670. for (i=0; i<Len; i++) {
  2671. if (IdTable[i].Id == Id) {
  2672. return i;
  2673. }
  2674. }
  2675. return (-1);
  2676. }
  2677. /*****************************************************************************
  2678.  *
  2679.  * OidStruct - Handler of OID_SKGE_ALL_DATA
  2680.  *
  2681.  * Description:
  2682.  * This OID performs a Get/Preset/SetStruct call and returns all data
  2683.  * in a SK_PNMI_STRUCT_DATA structure.
  2684.  *
  2685.  * Returns:
  2686.  * SK_PNMI_ERR_OK           The request was successfully performed.
  2687.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  2688.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  2689.  *                          the correct data (e.g. a 32bit value is
  2690.  *                          needed, but a 16 bit value was passed).
  2691.  * SK_PNMI_ERR_BAD_VALUE    The passed value is not in the valid
  2692.  *                          value range.
  2693.  * SK_PNMI_ERR_READ_ONLY    The OID is read-only and cannot be set.
  2694.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  2695.  *                               exist (e.g. port instance 3 on a two port
  2696.  *                          adapter.
  2697.  */
  2698. static int OidStruct(
  2699. SK_AC *pAC, /* Pointer to adapter context */
  2700. SK_IOC IoC, /* IO context handle */
  2701. int Action, /* Get/PreSet/Set action */
  2702. SK_U32 Id, /* Object ID that is to be processed */
  2703. char *pBuf, /* Buffer to which to mgmt data will be retrieved */
  2704. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  2705. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  2706. unsigned int TableIndex, /* Index to the Id table */
  2707. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  2708. {
  2709. if (Id != OID_SKGE_ALL_DATA) {
  2710. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR003,
  2711. SK_PNMI_ERR003MSG);
  2712. *pLen = 0;
  2713. return (SK_PNMI_ERR_GENERAL);
  2714. }
  2715. /*
  2716.  * Check instance. We only handle single instance variables
  2717.  */
  2718. if (Instance != (SK_U32)(-1) && Instance != 1) {
  2719. *pLen = 0;
  2720. return (SK_PNMI_ERR_UNKNOWN_INST);
  2721. }
  2722. switch (Action) {
  2723. case SK_PNMI_GET:
  2724. return (SkPnmiGetStruct(pAC, IoC, pBuf, pLen, NetIndex));
  2725. case SK_PNMI_PRESET:
  2726. return (SkPnmiPreSetStruct(pAC, IoC, pBuf, pLen, NetIndex));
  2727. case SK_PNMI_SET:
  2728. return (SkPnmiSetStruct(pAC, IoC, pBuf, pLen, NetIndex));
  2729. }
  2730. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR004, SK_PNMI_ERR004MSG);
  2731. *pLen = 0;
  2732. return (SK_PNMI_ERR_GENERAL);
  2733. }
  2734. /*****************************************************************************
  2735.  *
  2736.  * Perform - OID handler of OID_SKGE_ACTION
  2737.  *
  2738.  * Description:
  2739.  * None.
  2740.  *
  2741.  * Returns:
  2742.  * SK_PNMI_ERR_OK           The request was successfully performed.
  2743.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  2744.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  2745.  *                          the correct data (e.g. a 32bit value is
  2746.  *                          needed, but a 16 bit value was passed).
  2747.  * SK_PNMI_ERR_BAD_VALUE    The passed value is not in the valid
  2748.  *                          value range.
  2749.  * SK_PNMI_ERR_READ_ONLY    The OID is read-only and cannot be set.
  2750.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  2751.  *                               exist (e.g. port instance 3 on a two port
  2752.  *                          adapter.
  2753.  */
  2754. static int Perform(
  2755. SK_AC *pAC, /* Pointer to adapter context */
  2756. SK_IOC IoC, /* IO context handle */
  2757. int Action, /* Get/PreSet/Set action */
  2758. SK_U32 Id, /* Object ID that is to be processed */
  2759. char *pBuf, /* Buffer to which to mgmt data will be retrieved */
  2760. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  2761. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  2762. unsigned int TableIndex, /* Index to the Id table */
  2763. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  2764. {
  2765. int Ret;
  2766. SK_U32 ActionOp;
  2767. /*
  2768.  * Check instance. We only handle single instance variables
  2769.  */
  2770. if (Instance != (SK_U32)(-1) && Instance != 1) {
  2771. *pLen = 0;
  2772. return (SK_PNMI_ERR_UNKNOWN_INST);
  2773. }
  2774. if (*pLen < sizeof(SK_U32)) {
  2775. *pLen = sizeof(SK_U32);
  2776. return (SK_PNMI_ERR_TOO_SHORT);
  2777. }
  2778. /* Check if a get should be performed */
  2779. if (Action == SK_PNMI_GET) {
  2780. /* A get is easy. We always return the same value */
  2781. ActionOp = (SK_U32)SK_PNMI_ACT_IDLE;
  2782. SK_PNMI_STORE_U32(pBuf, ActionOp);
  2783. *pLen = sizeof(SK_U32);
  2784. return (SK_PNMI_ERR_OK);
  2785. }
  2786. /* Continue with PRESET/SET action */
  2787. if (*pLen > sizeof(SK_U32)) {
  2788. return (SK_PNMI_ERR_BAD_VALUE);
  2789. }
  2790. /* Check if the command is a known one */
  2791. SK_PNMI_READ_U32(pBuf, ActionOp);
  2792. if (*pLen > sizeof(SK_U32) ||
  2793. (ActionOp != SK_PNMI_ACT_IDLE &&
  2794. ActionOp != SK_PNMI_ACT_RESET &&
  2795. ActionOp != SK_PNMI_ACT_SELFTEST &&
  2796. ActionOp != SK_PNMI_ACT_RESETCNT)) {
  2797. *pLen = 0;
  2798. return (SK_PNMI_ERR_BAD_VALUE);
  2799. }
  2800. /* A preset ends here */
  2801. if (Action == SK_PNMI_PRESET) {
  2802. return (SK_PNMI_ERR_OK);
  2803. }
  2804. switch (ActionOp) {
  2805. case SK_PNMI_ACT_IDLE:
  2806. /* Nothing to do */
  2807. break;
  2808. case SK_PNMI_ACT_RESET:
  2809. /*
  2810.  * Perform a driver reset or something that comes near
  2811.  * to this.
  2812.  */
  2813. Ret = SK_DRIVER_RESET(pAC, IoC);
  2814. if (Ret != 0) {
  2815. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR005,
  2816. SK_PNMI_ERR005MSG);
  2817. return (SK_PNMI_ERR_GENERAL);
  2818. }
  2819. break;
  2820. case SK_PNMI_ACT_SELFTEST:
  2821. /*
  2822.  * Perform a driver selftest or something similar to this.
  2823.  * Currently this feature is not used and will probably
  2824.  * implemented in another way.
  2825.  */
  2826. Ret = SK_DRIVER_SELFTEST(pAC, IoC);
  2827. pAC->Pnmi.TestResult = Ret;
  2828. break;
  2829. case SK_PNMI_ACT_RESETCNT:
  2830. /* Set all counters and timestamps to zero */
  2831. ResetCounter(pAC, IoC, NetIndex);
  2832. break;
  2833. default:
  2834. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR006,
  2835. SK_PNMI_ERR006MSG);
  2836. return (SK_PNMI_ERR_GENERAL);
  2837. }
  2838. return (SK_PNMI_ERR_OK);
  2839. }
  2840. /*****************************************************************************
  2841.  *
  2842.  * Mac8023Stat - OID handler of OID_GEN_XXX and OID_802_3_XXX
  2843.  *
  2844.  * Description:
  2845.  * Retrieves the statistic values of the virtual port (logical
  2846.  * index 0). Only special OIDs of NDIS are handled which consist
  2847.  * of a 32 bit instead of a 64 bit value. The OIDs are public
  2848.  * because perhaps some other platform can use them too.
  2849.  *
  2850.  * Returns:
  2851.  * SK_PNMI_ERR_OK           The request was successfully performed.
  2852.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  2853.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  2854.  *                          the correct data (e.g. a 32bit value is
  2855.  *                          needed, but a 16 bit value was passed).
  2856.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  2857.  *                               exist (e.g. port instance 3 on a two port
  2858.  *                          adapter.
  2859.  */
  2860. static int Mac8023Stat(
  2861. SK_AC *pAC, /* Pointer to adapter context */
  2862. SK_IOC IoC, /* IO context handle */
  2863. int Action, /* Get/PreSet/Set action */
  2864. SK_U32 Id, /* Object ID that is to be processed */
  2865. char *pBuf, /* Buffer to which to mgmt data will be retrieved */
  2866. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  2867. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  2868. unsigned int TableIndex, /* Index to the Id table */
  2869. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  2870. {
  2871. int    Ret;
  2872. SK_U64 StatVal;
  2873. SK_BOOL Is64BitReq = SK_FALSE;
  2874. /*
  2875.  * Only the active Mac is returned
  2876.  */
  2877. if (Instance != (SK_U32)(-1) && Instance != 1) {
  2878. *pLen = 0;
  2879. return (SK_PNMI_ERR_UNKNOWN_INST);
  2880. }
  2881. /*
  2882.  * Check action type
  2883.  */
  2884. if (Action != SK_PNMI_GET) {
  2885. *pLen = 0;
  2886. return (SK_PNMI_ERR_READ_ONLY);
  2887. }
  2888. /*
  2889.  * Check length
  2890.  */
  2891. switch (Id) {
  2892. case OID_802_3_PERMANENT_ADDRESS:
  2893. case OID_802_3_CURRENT_ADDRESS:
  2894. if (*pLen < sizeof(SK_MAC_ADDR)) {
  2895. *pLen = sizeof(SK_MAC_ADDR);
  2896. return (SK_PNMI_ERR_TOO_SHORT);
  2897. }
  2898. break;
  2899. default:
  2900. #ifndef SK_NDIS_64BIT_CTR
  2901. if (*pLen < sizeof(SK_U32)) {
  2902. *pLen = sizeof(SK_U32);
  2903. return (SK_PNMI_ERR_TOO_SHORT);
  2904. }
  2905. #else /* SK_NDIS_64BIT_CTR */
  2906. /*
  2907.  * for compatibility, at least 32bit are required for oid
  2908.  */
  2909. if (*pLen < sizeof(SK_U32)) {
  2910. /*
  2911. * but indicate handling for 64bit values,
  2912. * if insufficient space is provided
  2913. */
  2914. *pLen = sizeof(SK_U64);
  2915. return (SK_PNMI_ERR_TOO_SHORT);
  2916. }
  2917. Is64BitReq = (*pLen < sizeof(SK_U64)) ? SK_FALSE : SK_TRUE;
  2918. #endif /* SK_NDIS_64BIT_CTR */
  2919. break;
  2920. }
  2921. /*
  2922.  * Update all statistics, because we retrieve virtual MAC, which
  2923.  * consists of multiple physical statistics and increment semaphore
  2924.  * to indicate that an update was already done.
  2925.  */
  2926. Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);
  2927. if ( Ret != SK_PNMI_ERR_OK) {
  2928. *pLen = 0;
  2929. return (Ret);
  2930. }
  2931. pAC->Pnmi.MacUpdatedFlag ++;
  2932. /*
  2933.  * Get value (MAC Index 0 identifies the virtual MAC)
  2934.  */
  2935. switch (Id) {
  2936. case OID_802_3_PERMANENT_ADDRESS:
  2937. CopyMac(pBuf, &pAC->Addr.Net[NetIndex].PermanentMacAddress);
  2938. *pLen = sizeof(SK_MAC_ADDR);
  2939. break;
  2940. case OID_802_3_CURRENT_ADDRESS:
  2941. CopyMac(pBuf, &pAC->Addr.Net[NetIndex].CurrentMacAddress);
  2942. *pLen = sizeof(SK_MAC_ADDR);
  2943. break;
  2944. default:
  2945. StatVal = GetStatVal(pAC, IoC, 0, IdTable[TableIndex].Param, NetIndex);
  2946. /*
  2947.  * by default 32bit values are evaluated
  2948.  */
  2949. if (!Is64BitReq) {
  2950. SK_U32 StatVal32;
  2951. StatVal32 = (SK_U32)StatVal;
  2952. SK_PNMI_STORE_U32(pBuf, StatVal32);
  2953. *pLen = sizeof(SK_U32);
  2954. }
  2955. else {
  2956. SK_PNMI_STORE_U64(pBuf, StatVal);
  2957. *pLen = sizeof(SK_U64);
  2958. }
  2959. break;
  2960. }
  2961. pAC->Pnmi.MacUpdatedFlag --;
  2962. return (SK_PNMI_ERR_OK);
  2963. }
  2964. /*****************************************************************************
  2965.  *
  2966.  * MacPrivateStat - OID handler function of OID_SKGE_STAT_XXX
  2967.  *
  2968.  * Description:
  2969.  * Retrieves the XMAC statistic data.
  2970.  *
  2971.  * Returns:
  2972.  * SK_PNMI_ERR_OK           The request was successfully performed.
  2973.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  2974.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  2975.  *                          the correct data (e.g. a 32bit value is
  2976.  *                          needed, but a 16 bit value was passed).
  2977.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  2978.  *                               exist (e.g. port instance 3 on a two port
  2979.  *                          adapter.
  2980.  */
  2981. static int MacPrivateStat(
  2982. SK_AC *pAC, /* Pointer to adapter context */
  2983. SK_IOC IoC, /* IO context handle */
  2984. int Action, /* Get/PreSet/Set action */
  2985. SK_U32 Id, /* Object ID that is to be processed */
  2986. char *pBuf, /* Buffer to which to mgmt data will be retrieved */
  2987. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  2988. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  2989. unsigned int TableIndex, /* Index to the Id table */
  2990. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  2991. {
  2992. unsigned int LogPortMax;
  2993. unsigned int LogPortIndex;
  2994. unsigned int PhysPortMax;
  2995. unsigned int Limit;
  2996. unsigned int Offset;
  2997. int Ret;
  2998. SK_U64 StatVal;
  2999. /*
  3000.  * Calculate instance if wished. MAC index 0 is the virtual
  3001.  * MAC.
  3002.  */
  3003. PhysPortMax = pAC->GIni.GIMacsFound;
  3004. LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);
  3005. if(pAC->Pnmi.DualNetActiveFlag == SK_TRUE){ /* Dual net mode */
  3006. LogPortMax--;
  3007. }
  3008. if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */
  3009. /* Check instance range */
  3010. if ((Instance < 1) || (Instance > LogPortMax)) {
  3011. *pLen = 0;
  3012. return (SK_PNMI_ERR_UNKNOWN_INST);
  3013. }
  3014. LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);
  3015. Limit = LogPortIndex + 1;
  3016. }
  3017. else { /* Instance == (SK_U32)(-1), get all Instances of that OID */
  3018. LogPortIndex = 0;
  3019. Limit = LogPortMax;
  3020. }
  3021. /*
  3022.  * Check action
  3023.  */
  3024. if (Action != SK_PNMI_GET) {
  3025. *pLen = 0;
  3026. return (SK_PNMI_ERR_READ_ONLY);
  3027. }
  3028. /*
  3029.  * Check length
  3030.  */
  3031. if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U64)) {
  3032. *pLen = (Limit - LogPortIndex) * sizeof(SK_U64);
  3033. return (SK_PNMI_ERR_TOO_SHORT);
  3034. }
  3035. /*
  3036.  * Update XMAC statistic and increment semaphore to indicate that
  3037.  * an update was already done.
  3038.  */
  3039. Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1);
  3040. if (Ret != SK_PNMI_ERR_OK) {
  3041. *pLen = 0;
  3042. return (Ret);
  3043. }
  3044. pAC->Pnmi.MacUpdatedFlag ++;
  3045. /*
  3046.  * Get value
  3047.  */
  3048. Offset = 0;
  3049. for (; LogPortIndex < Limit; LogPortIndex ++) {
  3050. switch (Id) {
  3051. /* XXX not yet implemented due to XMAC problems
  3052. case OID_SKGE_STAT_TX_UTIL:
  3053. return (SK_PNMI_ERR_GENERAL);
  3054. */
  3055. /* XXX not yet implemented due to XMAC problems
  3056. case OID_SKGE_STAT_RX_UTIL:
  3057. return (SK_PNMI_ERR_GENERAL);
  3058. */
  3059. /*
  3060.  * Frames longer than IEEE 802.3 frame max size are counted
  3061.  * by XMAC in frame_too_long counter even reception of long
  3062.  * frames was enabled and the frame was correct.
  3063.  * So correct the value by subtracting RxLongFrame counter.
  3064.  */
  3065. case OID_SKGE_STAT_RX_TOO_LONG:
  3066. StatVal = GetStatVal(pAC, IoC, LogPortIndex,
  3067.      IdTable[TableIndex].Param, NetIndex) -
  3068. GetStatVal(pAC, IoC, LogPortIndex,
  3069.    SK_PNMI_HRX_LONGFRAMES, NetIndex);
  3070. SK_PNMI_STORE_U64(pBuf + Offset, StatVal);
  3071. break;
  3072. default:
  3073. StatVal = GetStatVal(pAC, IoC, LogPortIndex,
  3074. IdTable[TableIndex].Param, NetIndex);
  3075. SK_PNMI_STORE_U64(pBuf + Offset, StatVal);
  3076. break;
  3077. }
  3078. Offset += sizeof(SK_U64);
  3079. }
  3080. *pLen = Offset;
  3081. pAC->Pnmi.MacUpdatedFlag --;
  3082. return (SK_PNMI_ERR_OK);
  3083. }
  3084. /*****************************************************************************
  3085.  *
  3086.  * Addr - OID handler function of OID_SKGE_PHYS_CUR_ADDR and _FAC_ADDR
  3087.  *
  3088.  * Description:
  3089.  * Get/Presets/Sets the current and factory MAC address. The MAC
  3090.  * address of the virtual port, which is reported to the OS, may
  3091.  * not be changed, but the physical ones. A set to the virtual port
  3092.  * will be ignored. No error should be reported because otherwise
  3093.  * a multiple instance set (-1) would always fail.
  3094.  *
  3095.  * Returns:
  3096.  * SK_PNMI_ERR_OK           The request was successfully performed.
  3097.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  3098.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  3099.  *                          the correct data (e.g. a 32bit value is
  3100.  *                          needed, but a 16 bit value was passed).
  3101.  * SK_PNMI_ERR_BAD_VALUE    The passed value is not in the valid
  3102.  *                          value range.
  3103.  * SK_PNMI_ERR_READ_ONLY    The OID is read-only and cannot be set.
  3104.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  3105.  *                               exist (e.g. port instance 3 on a two port
  3106.  *                          adapter.
  3107.  */
  3108. static int Addr(
  3109. SK_AC *pAC, /* Pointer to adapter context */
  3110. SK_IOC IoC, /* IO context handle */
  3111. int Action, /* Get/PreSet/Set action */
  3112. SK_U32 Id, /* Object ID that is to be processed */
  3113. char *pBuf, /* Buffer to which to mgmt data will be retrieved */
  3114. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  3115. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  3116. unsigned int TableIndex, /* Index to the Id table */
  3117. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  3118. {
  3119. int Ret;
  3120. unsigned int LogPortMax;
  3121. unsigned int PhysPortMax;
  3122. unsigned int LogPortIndex;
  3123. unsigned int PhysPortIndex;
  3124. unsigned int Limit;
  3125. unsigned int Offset = 0;
  3126. /*
  3127.  * Calculate instance if wished. MAC index 0 is the virtual
  3128.  * MAC.
  3129.  */
  3130. PhysPortMax = pAC->GIni.GIMacsFound;
  3131. LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax);
  3132. if(pAC->Pnmi.DualNetActiveFlag == SK_TRUE){ /* Dual net mode */
  3133. LogPortMax--;
  3134. }
  3135. if ((Instance != (SK_U32)(-1))) { /* Only one specific instance is queried */
  3136. /* Check instance range */
  3137. if ((Instance < 1) || (Instance > LogPortMax)) {
  3138. *pLen = 0;
  3139. return (SK_PNMI_ERR_UNKNOWN_INST);
  3140. }
  3141. LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance);
  3142. Limit = LogPortIndex + 1;
  3143. }
  3144. else { /* Instance == (SK_U32)(-1), get all Instances of that OID */
  3145. LogPortIndex = 0;
  3146. Limit = LogPortMax;
  3147. }
  3148. /*
  3149.  * Perform Action
  3150.  */
  3151. if (Action == SK_PNMI_GET) {
  3152. /*
  3153.  * Check length
  3154. */
  3155. if (*pLen < (Limit - LogPortIndex) * 6) {
  3156. *pLen = (Limit - LogPortIndex) * 6;
  3157. return (SK_PNMI_ERR_TOO_SHORT);
  3158. }
  3159. /*
  3160.  * Get value
  3161.  */
  3162. for (; LogPortIndex < Limit; LogPortIndex ++) {
  3163. switch (Id) {
  3164. case OID_SKGE_PHYS_CUR_ADDR:
  3165. if (LogPortIndex == 0) {
  3166. CopyMac(pBuf + Offset, &pAC->Addr.Net[NetIndex].CurrentMacAddress);
  3167. }
  3168. else {
  3169. PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
  3170. CopyMac(pBuf + Offset,
  3171. &pAC->Addr.Port[PhysPortIndex].CurrentMacAddress);
  3172. }
  3173. Offset += 6;
  3174. break;
  3175. case OID_SKGE_PHYS_FAC_ADDR:
  3176. if (LogPortIndex == 0) {
  3177. CopyMac(pBuf + Offset,
  3178. &pAC->Addr.Net[NetIndex].PermanentMacAddress);
  3179. }
  3180. else {
  3181. PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
  3182. pAC, LogPortIndex);
  3183. CopyMac(pBuf + Offset,
  3184. &pAC->Addr.Port[PhysPortIndex].PermanentMacAddress);
  3185. }
  3186. Offset += 6;
  3187. break;
  3188. default:
  3189. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR008,
  3190. SK_PNMI_ERR008MSG);
  3191. *pLen = 0;
  3192. return (SK_PNMI_ERR_GENERAL);
  3193. }
  3194. }
  3195. *pLen = Offset;
  3196. }
  3197. else {
  3198. /*
  3199.  * The logical MAC address may not be changed only
  3200.  * the physical ones
  3201.  */
  3202. if (Id == OID_SKGE_PHYS_FAC_ADDR) {
  3203. *pLen = 0;
  3204. return (SK_PNMI_ERR_READ_ONLY);
  3205. }
  3206. /*
  3207.  * Only the current address may be changed
  3208.  */
  3209. if (Id != OID_SKGE_PHYS_CUR_ADDR) {
  3210. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR009,
  3211. SK_PNMI_ERR009MSG);
  3212. *pLen = 0;
  3213. return (SK_PNMI_ERR_GENERAL);
  3214. }
  3215. /*
  3216.  * Check length
  3217. */
  3218. if (*pLen < (Limit - LogPortIndex) * 6) {
  3219. *pLen = (Limit - LogPortIndex) * 6;
  3220. return (SK_PNMI_ERR_TOO_SHORT);
  3221. }
  3222. if (*pLen > (Limit - LogPortIndex) * 6) {
  3223. *pLen = 0;
  3224. return (SK_PNMI_ERR_BAD_VALUE);
  3225. }
  3226. /*
  3227.  * Check Action
  3228.  */
  3229. if (Action == SK_PNMI_PRESET) {
  3230. *pLen = 0;
  3231. return (SK_PNMI_ERR_OK);
  3232. }
  3233. /*
  3234.  * Set OID_SKGE_MAC_CUR_ADDR
  3235.  */
  3236. for (; LogPortIndex < Limit; LogPortIndex ++, Offset += 6) {
  3237. /*
  3238.  * A set to virtual port and set of broadcast
  3239.  * address will be ignored
  3240.  */
  3241. if (LogPortIndex == 0 || SK_MEMCMP(pBuf + Offset,
  3242. "xffxffxffxffxffxff", 6) == 0) {
  3243. continue;
  3244. }
  3245. PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC,
  3246. LogPortIndex);
  3247. Ret = SkAddrOverride(pAC, IoC, PhysPortIndex,
  3248. (SK_MAC_ADDR *)(pBuf + Offset),
  3249. (LogPortIndex == 0 ? SK_ADDR_VIRTUAL_ADDRESS :
  3250. SK_ADDR_PHYSICAL_ADDRESS));
  3251. if (Ret != SK_ADDR_OVERRIDE_SUCCESS) {
  3252. return (SK_PNMI_ERR_GENERAL);
  3253. }
  3254. }
  3255. *pLen = Offset;
  3256. }
  3257. return (SK_PNMI_ERR_OK);
  3258. }
  3259. /*****************************************************************************
  3260.  *
  3261.  * CsumStat - OID handler function of OID_SKGE_CHKSM_XXX
  3262.  *
  3263.  * Description:
  3264.  * Retrieves the statistic values of the CSUM module. The CSUM data
  3265.  * structure must be available in the SK_AC even if the CSUM module
  3266.  * is not included, because PNMI reads the statistic data from the
  3267.  * CSUM part of SK_AC directly.
  3268.  *
  3269.  * Returns:
  3270.  * SK_PNMI_ERR_OK           The request was successfully performed.
  3271.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  3272.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  3273.  *                          the correct data (e.g. a 32bit value is
  3274.  *                          needed, but a 16 bit value was passed).
  3275.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  3276.  *                               exist (e.g. port instance 3 on a two port
  3277.  *                          adapter.
  3278.  */
  3279. static int CsumStat(
  3280. SK_AC *pAC, /* Pointer to adapter context */
  3281. SK_IOC IoC, /* IO context handle */
  3282. int Action, /* Get/PreSet/Set action */
  3283. SK_U32 Id, /* Object ID that is to be processed */
  3284. char *pBuf, /* Buffer to which to mgmt data will be retrieved */
  3285. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  3286. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  3287. unsigned int TableIndex, /* Index to the Id table */
  3288. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  3289. {
  3290. unsigned int Index;
  3291. unsigned int Limit;
  3292. unsigned int Offset = 0;
  3293. SK_U64 StatVal;
  3294. /*
  3295.  * Calculate instance if wished
  3296.  */
  3297. if (Instance != (SK_U32)(-1)) {
  3298. if ((Instance < 1) || (Instance > SKCS_NUM_PROTOCOLS)) {
  3299. *pLen = 0;
  3300. return (SK_PNMI_ERR_UNKNOWN_INST);
  3301. }
  3302. Index = (unsigned int)Instance - 1;
  3303. Limit = Index + 1;
  3304. }
  3305. else {
  3306. Index = 0;
  3307. Limit = SKCS_NUM_PROTOCOLS;
  3308. }
  3309. /*
  3310.  * Check action
  3311.  */
  3312. if (Action != SK_PNMI_GET) {
  3313. *pLen = 0;
  3314. return (SK_PNMI_ERR_READ_ONLY);
  3315. }
  3316. /*
  3317.  * Check length
  3318.  */
  3319. if (*pLen < (Limit - Index) * sizeof(SK_U64)) {
  3320. *pLen = (Limit - Index) * sizeof(SK_U64);
  3321. return (SK_PNMI_ERR_TOO_SHORT);
  3322. }
  3323. /*
  3324.  * Get value
  3325.  */
  3326. for (; Index < Limit; Index ++) {
  3327. switch (Id) {
  3328. case OID_SKGE_CHKSM_RX_OK_CTS:
  3329. StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxOkCts;
  3330. break;
  3331. case OID_SKGE_CHKSM_RX_UNABLE_CTS:
  3332. StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxUnableCts;
  3333. break;
  3334. case OID_SKGE_CHKSM_RX_ERR_CTS:
  3335. StatVal = pAC->Csum.ProtoStats[NetIndex][Index].RxErrCts;
  3336. break;
  3337. case OID_SKGE_CHKSM_TX_OK_CTS:
  3338. StatVal = pAC->Csum.ProtoStats[NetIndex][Index].TxOkCts;
  3339. break;
  3340. case OID_SKGE_CHKSM_TX_UNABLE_CTS:
  3341. StatVal = pAC->Csum.ProtoStats[NetIndex][Index].TxUnableCts;
  3342. break;
  3343. default:
  3344. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR010,
  3345. SK_PNMI_ERR010MSG);
  3346. *pLen = 0;
  3347. return (SK_PNMI_ERR_GENERAL);
  3348. }
  3349. SK_PNMI_STORE_U64(pBuf + Offset, StatVal);
  3350. Offset += sizeof(SK_U64);
  3351. }
  3352. /*
  3353.  * Store used buffer space
  3354.  */
  3355. *pLen = Offset;
  3356. return (SK_PNMI_ERR_OK);
  3357. }
  3358. /*****************************************************************************
  3359.  *
  3360.  * SensorStat - OID handler function of OID_SKGE_SENSOR_XXX
  3361.  *
  3362.  * Description:
  3363.  * Retrieves the statistic values of the I2C module, which handles
  3364.  * the temperature and voltage sensors.
  3365.  *
  3366.  * Returns:
  3367.  * SK_PNMI_ERR_OK           The request was successfully performed.
  3368.  * SK_PNMI_ERR_GENERAL      A general severe internal error occured.
  3369.  * SK_PNMI_ERR_TOO_SHORT    The passed buffer is too short to contain
  3370.  *                          the correct data (e.g. a 32bit value is
  3371.  *                          needed, but a 16 bit value was passed).
  3372.  * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't
  3373.  *                               exist (e.g. port instance 3 on a two port
  3374.  *                          adapter.
  3375.  */
  3376. static int SensorStat(
  3377. SK_AC *pAC, /* Pointer to adapter context */
  3378. SK_IOC IoC, /* IO context handle */
  3379. int Action, /* Get/PreSet/Set action */
  3380. SK_U32 Id, /* Object ID that is to be processed */
  3381. char *pBuf, /* Buffer to which to mgmt data will be retrieved */
  3382. unsigned int *pLen, /* On call: buffer length. On return: used buffer */
  3383. SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */
  3384. unsigned int TableIndex, /* Index to the Id table */
  3385. SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */
  3386. {
  3387. unsigned int i;
  3388. unsigned int Index;
  3389. unsigned int Limit;
  3390. unsigned int Offset;
  3391. unsigned int Len;
  3392. SK_U32 Val32;
  3393. SK_U64 Val64;
  3394. /*
  3395.  * Calculate instance if wished
  3396.  */
  3397. if ((Instance != (SK_U32)(-1))) {
  3398. if ((Instance < 1) || (Instance > (SK_U32)pAC->I2c.MaxSens)) {
  3399. *pLen = 0;
  3400. return (SK_PNMI_ERR_UNKNOWN_INST);
  3401. }
  3402. Index = (unsigned int)Instance -1;
  3403. Limit = (unsigned int)Instance;
  3404. }
  3405. else {
  3406. Index = 0;
  3407. Limit = (unsigned int) pAC->I2c.MaxSens;
  3408. }
  3409. /*
  3410.  * Check action
  3411.  */
  3412. if (Action != SK_PNMI_GET) {
  3413. *pLen = 0;
  3414. return (SK_PNMI_ERR_READ_ONLY);
  3415. }
  3416. /*
  3417.  * Check length
  3418.  */
  3419. switch (Id) {
  3420. case OID_SKGE_SENSOR_VALUE:
  3421. case OID_SKGE_SENSOR_WAR_THRES_LOW:
  3422. case OID_SKGE_SENSOR_WAR_THRES_UPP:
  3423. case OID_SKGE_SENSOR_ERR_THRES_LOW:
  3424. case OID_SKGE_SENSOR_ERR_THRES_UPP:
  3425. if (*pLen < (Limit - Index) * sizeof(SK_U32)) {
  3426. *pLen = (Limit - Index) * sizeof(SK_U32);
  3427. return (SK_PNMI_ERR_TOO_SHORT);
  3428. }
  3429. break;
  3430. case OID_SKGE_SENSOR_DESCR:
  3431. for (Offset = 0, i = Index; i < Limit; i ++) {
  3432. Len = (unsigned int)
  3433. SK_STRLEN(pAC->I2c.SenTable[i].SenDesc) + 1;
  3434. if (Len >= SK_PNMI_STRINGLEN2) {
  3435. SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR011,
  3436. SK_PNMI_ERR011MSG);
  3437. *pLen = 0;
  3438. return (SK_PNMI_ERR_GENERAL);
  3439. }
  3440. Offset += Len;
  3441. }
  3442. if (*pLen < Offset) {
  3443. *pLen = Offset;
  3444. return (SK_PNMI_ERR_TOO_SHORT);
  3445. }
  3446. break;
  3447. case OID_SKGE_SENSOR_INDEX: