phy.h revision 143440
1169695Skan/***************************************************************************\ 2169695Skan|* *| 3169695Skan|* Copyright 2001-2004 NVIDIA Corporation. All Rights Reserved. *| 4169695Skan|* *| 5169695Skan|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND CONFIDENTIAL *| 6169695Skan|* TO NVIDIA, CORPORATION. USE, REPRODUCTION OR DISCLOSURE TO ANY *| 7169695Skan|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA, CORP. *| 8169695Skan|* *| 9169695Skan|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *| 10169695Skan|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *| 11169695Skan|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A *| 12169695Skan|* PARTICULAR PURPOSE. *| 13169695Skan|* *| 14169695Skan\***************************************************************************/ 15169695Skan 16169695Skan/* 17169695Skan FILE: phy.h 18169695Skan DATE: 2/7/00 19169695Skan 20169695Skan This file contains the functional interface to the PHY. 21169695Skan*/ 22169695Skan#ifndef _PHY_H_ 23169695Skan#define _PHY_H_ 24169695Skan 25169695Skan//#include "basetype.h" 26169695Skan//#include "nvevent.h" 27169695Skan 28169695Skan#ifdef __cplusplus 29169695Skanextern "C" { 30169695Skan#endif 31169695Skan 32169695Skan#define DEFAULT_PHY_ADDRESS 1 33169695Skan 34169695Skan 35169695Skan#define HDP_VERSION_STRING "HDR P: $Revision: #23 $" 36169695Skan 37169695Skan// 38169695Skan// Defaults for PHY timeout values. 39169695Skan// 40169695Skan#define PHY_POWER_ISOLATION_MS_TIMEOUT_DEFAULT 50 41169695Skan#define PHY_RESET_MS_TIMEOUT_DEFAULT 50 42169695Skan#define PHY_AUTONEG_MS_TIMEOUT_DEFAULT 3000 43169695Skan#define PHY_LINK_UP_MS_TIMEOUT_DEFAULT 2400 44169695Skan#define PHY_RDWR_US_TIMEOUT_DEFAULT 2048 45169695Skan#define PHY_POWER_DOWN_US_TIMEOUT_DEFAULT 500 46169695Skan 47169695Skan 48169695Skan///////////////////////////////////////////////////////////////////////// 49169695Skan// The phy module knows the values that need to go into the phy registers 50169695Skan// but typically the method of writing those registers is controlled by 51169695Skan// another module (usually the adapter because it is really the hardware 52169695Skan// interface.) Hence, the phy needs routines to call to read and write the 53169695Skan// phy registers. This structure with appropriate routines will be provided 54169695Skan// in the PHY_Open call. 55169695Skan 56169695Skantypedef NV_API_CALL NV_SINT32 (* PFN_READ_PHY) (PNV_VOID pvData, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 *pulValue); 57169695Skantypedef NV_API_CALL NV_SINT32 (* PFN_WRITE_PHY) (PNV_VOID pvData, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 ulValue); 58169695Skan 59169695Skantypedef struct PHY_SUPPORT_API 60169695Skan{ 61169695Skan PNV_VOID pADCX; 62169695Skan PFN_READ_PHY pfnRead; 63169695Skan PFN_WRITE_PHY pfnWrite; 64169695Skan // PFN_EVENT_OCCURED pfnEventOccurred; 65169695Skan 66169695Skan // 67169695Skan // These fields are passed down via the FD. FD get's them 68169695Skan // from the registry. They allow one to fine tune the timeout 69169695Skan // values in the PHY. 70169695Skan // 71169695Skan NV_UINT32 PhyPowerIsolationTimeoutInms; 72169695Skan NV_UINT32 PhyResetTimeoutInms; 73169695Skan NV_UINT32 PhyAutonegotiateTimeoutInms; 74169695Skan NV_UINT32 PhyLinkupTimeoutInms; 75169695Skan NV_UINT32 PhyPowerdownOnCloseInus; 76169695Skan 77169695Skan} PHY_SUPPORT_API, *PPHY_SUPPORT_API; 78169695Skan///////////////////////////////////////////////////////////////////////// 79169695Skan 80169695Skan 81169695Skan///////////////////////////////////////////////////////////////////////// 82169695Skan// The functional typedefs for the PHY Api 83169695Skantypedef NV_SINT32 (* PFN_PHY_INIT) (PNV_VOID pvContext, NV_UINT32 *pulLinkState, NV_UINT32 PhyMode); 84169695Skantypedef NV_SINT32 (* PFN_PHY_DEINIT) (PNV_VOID pvContext); 85169695Skantypedef NV_SINT32 (* PFN_PHY_CLOSE) (PNV_VOID pvContext); 86169695Skantypedef NV_SINT32 (* PFN_GET_LINK_SPEED) (PNV_VOID pvContext); 87169695Skantypedef NV_SINT32 (* PFN_GET_LINK_MODE) (PNV_VOID pvContext); 88169695Skantypedef NV_SINT32 (* PFN_GET_LINK_STATE) (PNV_VOID pvContext, NV_UINT32 *pulLinkState); 89169695Skantypedef NV_SINT32 (* PFN_IS_LINK_INITIALIZING) (PNV_VOID pvContext); 90169695Skantypedef NV_SINT32 (* PFN_RESET_PHY_INIT_STATE) (PNV_VOID pvContext); 91169695Skantypedef NV_SINT32 (* PFN_FORCE_SPEED_DUPLEX) (PNV_VOID pvContext, NV_UINT16 usSpeed, NV_UINT8 ucForceDpx, NV_UINT8 ucForceMode); 92169695Skantypedef NV_SINT32 (* PFN_PHY_POWERDOWN) (PNV_VOID pvContext); 93169695Skantypedef NV_SINT32 (* PFN_SET_LOW_SPEED_FOR_PM) (PNV_VOID pvContext); 94169695Skan 95169695Skan 96169695Skantypedef struct _PHY_API 97169695Skan{ 98169695Skan // This is the context to pass back in as the first arg on all 99169695Skan // the calls in the API below. 100169695Skan PNV_VOID pPHYCX; 101169695Skan 102169695Skan PFN_PHY_INIT pfnInit; 103169695Skan PFN_PHY_INIT pfnInitFast; 104169695Skan PFN_PHY_DEINIT pfnDeinit; 105169695Skan PFN_PHY_CLOSE pfnClose; 106169695Skan PFN_GET_LINK_SPEED pfnGetLinkSpeed; 107169695Skan PFN_GET_LINK_MODE pfnGetLinkMode; 108169695Skan PFN_GET_LINK_STATE pfnGetLinkState; 109169695Skan PFN_IS_LINK_INITIALIZING pfnIsLinkInitializing; 110169695Skan PFN_RESET_PHY_INIT_STATE pfnResetPhyInitState; 111169695Skan PFN_FORCE_SPEED_DUPLEX pfnForceSpeedDuplex; 112169695Skan PFN_PHY_POWERDOWN pfnPowerdown; 113169695Skan PFN_SET_LOW_SPEED_FOR_PM pfnSetLowSpeedForPM; 114169695Skan} PHY_API, *PPHY_API; 115169695Skan///////////////////////////////////////////////////////////////////////// 116169695Skan 117169695Skan 118169695Skan///////////////////////////////////////////////////////////////////////// 119169695Skan// This is the one function in the PHY interface that is publicly 120169695Skan// available. The rest of the interface is returned in the pPhyApi; 121169695Skan// The first argument needs to be cast to a POS_API structure ptr. 122169695Skan// On input the second argument is a ptr to a PPHY_SUPPORT_API. 123169695Skan// On output, the second argument should be treated as a ptr to a 124169695Skan// PPHY_API and set appropriately. 125169695Skanextern NV_SINT32 PHY_Open (PNV_VOID pvOSApi, PNV_VOID pPhyApi, NV_UINT32 *pulPhyAddr, NV_UINT32 *pulPhyConnected); 126169695Skan///////////////////////////////////////////////////////////////////////// 127169695Skan 128169695Skan 129169695Skan///////////////////////////////////////////////////////////////////////// 130169695Skan// Here are the error codes the phy functions can return. 131169695Skan#define PHYERR_NONE 0x0000 132169695Skan#define PHYERR_COULD_NOT_ALLOC_CONTEXT 0x0001 133169695Skan#define PHYERR_RESET_NEVER_FINISHED 0x0002 134169695Skan#define PHYERR_NO_AVAILABLE_LINK_SPEED 0x0004 135169695Skan#define PHYERR_INVALID_SETTINGS 0x0005 136169695Skan#define PHYERR_READ_FAILED 0x0006 137169695Skan#define PHYERR_WRITE_FAILED 0x0007 138169695Skan#define PHYERR_NO_PHY 0x0008 139169695Skan#define PHYERR_NO_RESOURCE 0x0009 140169695Skan#define PHYERR_POWER_ISOLATION_TIMEOUT 0x000A 141169695Skan#define PHYERR_POWER_DOWN_TIMEOUT 0x000B 142169695Skan#define PHYERR_AUTONEG_TIMEOUT 0x000C 143169695Skan#define PHYERR_PHY_LINK_SPEED_UNCHANGED 0x000D 144169695Skan 145169695Skan#define PHY_INVALID_PHY_ADDR 0xFFFF; 146169695Skan 147169695Skan///////////////////////////////////////////////////////////////////////// 148169695Skan 149169695Skan// This value can be used in the ulPhyLinkSpeed field. 150169695Skan#define PHY_LINK_SPEED_UNKNOWN 0x0FFFFFFFF 151169695Skan 152169695Skan// 153169695Skan// Values used to configure PHY mode. 154169695Skan// 155169695Skan#define PHY_MODE_MII 1 156169695Skan#define PHY_MODE_RGMII 2 157169695Skan 158169695Skantypedef NV_VOID (* PTIMER_FUNC) (PNV_VOID pvContext); 159169695Skan 160169695Skan#ifdef __cplusplus 161169695Skan} // extern "C" 162169695Skan#endif 163169695Skan 164169695Skan#endif //_PHY_H_ 165169695Skan