summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/nve/phy.h
blob: 87596a59adcc79bc1747ea07c0131789c2d68408 (plain)
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_
OpenPOWER on IntegriCloud