1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
/***************************************************************************\
|* *|
|* Copyright 2001-2004 NVIDIA Corporation. All Rights Reserved. *|
|* *|
|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND CONFIDENTIAL *|
|* TO NVIDIA, CORPORATION. USE, REPRODUCTION OR DISCLOSURE TO ANY *|
|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA, CORP. *|
|* *|
|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *|
|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *|
|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A *|
|* PARTICULAR PURPOSE. *|
|* *|
\***************************************************************************/
/*
FILE: phy.h
DATE: 2/7/00
This file contains the functional interface to the PHY.
*/
#ifndef _PHY_H_
#define _PHY_H_
//#include "basetype.h"
//#include "nvevent.h"
#ifdef __cplusplus
extern "C" {
#endif
#define DEFAULT_PHY_ADDRESS 1
#define HDP_VERSION_STRING "HDR P: $Revision: #23 $"
//
// Defaults for PHY timeout values.
//
#define PHY_POWER_ISOLATION_MS_TIMEOUT_DEFAULT 50
#define PHY_RESET_MS_TIMEOUT_DEFAULT 50
#define PHY_AUTONEG_MS_TIMEOUT_DEFAULT 3000
#define PHY_LINK_UP_MS_TIMEOUT_DEFAULT 2400
#define PHY_RDWR_US_TIMEOUT_DEFAULT 2048
#define PHY_POWER_DOWN_US_TIMEOUT_DEFAULT 500
/////////////////////////////////////////////////////////////////////////
// The phy module knows the values that need to go into the phy registers
// but typically the method of writing those registers is controlled by
// another module (usually the adapter because it is really the hardware
// interface.) Hence, the phy needs routines to call to read and write the
// phy registers. This structure with appropriate routines will be provided
// in the PHY_Open call.
typedef NV_API_CALL NV_SINT32 (* PFN_READ_PHY) (PNV_VOID pvData, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 *pulValue);
typedef NV_API_CALL NV_SINT32 (* PFN_WRITE_PHY) (PNV_VOID pvData, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 ulValue);
typedef struct PHY_SUPPORT_API
{
PNV_VOID pADCX;
PFN_READ_PHY pfnRead;
PFN_WRITE_PHY pfnWrite;
// PFN_EVENT_OCCURED pfnEventOccurred;
//
// These fields are passed down via the FD. FD get's them
// from the registry. They allow one to fine tune the timeout
// values in the PHY.
//
NV_UINT32 PhyPowerIsolationTimeoutInms;
NV_UINT32 PhyResetTimeoutInms;
NV_UINT32 PhyAutonegotiateTimeoutInms;
NV_UINT32 PhyLinkupTimeoutInms;
NV_UINT32 PhyPowerdownOnCloseInus;
} PHY_SUPPORT_API, *PPHY_SUPPORT_API;
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
// The functional typedefs for the PHY Api
typedef NV_SINT32 (* PFN_PHY_INIT) (PNV_VOID pvContext, NV_UINT32 *pulLinkState, NV_UINT32 PhyMode);
typedef NV_SINT32 (* PFN_PHY_DEINIT) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_PHY_CLOSE) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_GET_LINK_SPEED) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_GET_LINK_MODE) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_GET_LINK_STATE) (PNV_VOID pvContext, NV_UINT32 *pulLinkState);
typedef NV_SINT32 (* PFN_IS_LINK_INITIALIZING) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_RESET_PHY_INIT_STATE) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_FORCE_SPEED_DUPLEX) (PNV_VOID pvContext, NV_UINT16 usSpeed, NV_UINT8 ucForceDpx, NV_UINT8 ucForceMode);
typedef NV_SINT32 (* PFN_PHY_POWERDOWN) (PNV_VOID pvContext);
typedef NV_SINT32 (* PFN_SET_LOW_SPEED_FOR_PM) (PNV_VOID pvContext);
typedef struct _PHY_API
{
// This is the context to pass back in as the first arg on all
// the calls in the API below.
PNV_VOID pPHYCX;
PFN_PHY_INIT pfnInit;
PFN_PHY_INIT pfnInitFast;
PFN_PHY_DEINIT pfnDeinit;
PFN_PHY_CLOSE pfnClose;
PFN_GET_LINK_SPEED pfnGetLinkSpeed;
PFN_GET_LINK_MODE pfnGetLinkMode;
PFN_GET_LINK_STATE pfnGetLinkState;
PFN_IS_LINK_INITIALIZING pfnIsLinkInitializing;
PFN_RESET_PHY_INIT_STATE pfnResetPhyInitState;
PFN_FORCE_SPEED_DUPLEX pfnForceSpeedDuplex;
PFN_PHY_POWERDOWN pfnPowerdown;
PFN_SET_LOW_SPEED_FOR_PM pfnSetLowSpeedForPM;
} PHY_API, *PPHY_API;
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
// This is the one function in the PHY interface that is publicly
// available. The rest of the interface is returned in the pPhyApi;
// The first argument needs to be cast to a POS_API structure ptr.
// On input the second argument is a ptr to a PPHY_SUPPORT_API.
// On output, the second argument should be treated as a ptr to a
// PPHY_API and set appropriately.
extern NV_SINT32 PHY_Open (PNV_VOID pvOSApi, PNV_VOID pPhyApi, NV_UINT32 *pulPhyAddr, NV_UINT32 *pulPhyConnected);
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
// Here are the error codes the phy functions can return.
#define PHYERR_NONE 0x0000
#define PHYERR_COULD_NOT_ALLOC_CONTEXT 0x0001
#define PHYERR_RESET_NEVER_FINISHED 0x0002
#define PHYERR_NO_AVAILABLE_LINK_SPEED 0x0004
#define PHYERR_INVALID_SETTINGS 0x0005
#define PHYERR_READ_FAILED 0x0006
#define PHYERR_WRITE_FAILED 0x0007
#define PHYERR_NO_PHY 0x0008
#define PHYERR_NO_RESOURCE 0x0009
#define PHYERR_POWER_ISOLATION_TIMEOUT 0x000A
#define PHYERR_POWER_DOWN_TIMEOUT 0x000B
#define PHYERR_AUTONEG_TIMEOUT 0x000C
#define PHYERR_PHY_LINK_SPEED_UNCHANGED 0x000D
#define PHY_INVALID_PHY_ADDR 0xFFFF;
/////////////////////////////////////////////////////////////////////////
// This value can be used in the ulPhyLinkSpeed field.
#define PHY_LINK_SPEED_UNKNOWN 0x0FFFFFFFF
//
// Values used to configure PHY mode.
//
#define PHY_MODE_MII 1
#define PHY_MODE_RGMII 2
typedef NV_VOID (* PTIMER_FUNC) (PNV_VOID pvContext);
#ifdef __cplusplus
} // extern "C"
#endif
#endif //_PHY_H_
|