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