hc
2024-03-26 e0728245c89800c2038c23308f2d88969d5b41c8
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
/** @file
 
  Copyright (c) 2020 Jared McNeill. All rights reserved.
  Copyright (c) 2020 Andrey Warkentin <andrey.warkentin@gmail.com>
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
 
**/
 
#ifndef GENERICPHY_H__
#define GENERICPHY_H__
 
//
// Basic Control Register
//
#define GENERIC_PHY_BMCR                0x00
#define  GENERIC_PHY_BMCR_RESET         BIT15
#define  GENERIC_PHY_BMCR_ANE           BIT12
#define  GENERIC_PHY_BMCR_RESTART_AN    BIT9
 
//
// Basic Status Register
//
#define GENERIC_PHY_BMSR                0x01
#define  GENERIC_PHY_BMSR_ANEG_COMPLETE BIT5
#define  GENERIC_PHY_BMSR_LINK_STATUS   BIT2
 
//
// PHY Identifier I & II
//
#define GENERIC_PHY_PHYIDR1             0x02
#define GENERIC_PHY_PHYIDR2             0x03
 
//
// Auto-Negotiation Advertisement Register
//
#define GENERIC_PHY_ANAR                0x04
#define  GENERIC_PHY_ANAR_100BASETX_FDX BIT8
#define  GENERIC_PHY_ANAR_100BASETX     BIT7
#define  GENERIC_PHY_ANAR_10BASET_FDX   BIT6
#define  GENERIC_PHY_ANAR_10BASET       BIT5
 
//
// Auto-Negotiation Link Partner Ability Register
//
#define GENERIC_PHY_ANLPAR              0x05
 
//
// 1000Base-T Control Register
//
#define GENERIC_PHY_GBCR                0x09
#define  GENERIC_PHY_GBCR_1000BASET_FDX BIT9
#define  GENERIC_PHY_GBCR_1000BASET     BIT8
 
//
// 1000Base-T Status Register
//
#define GENERIC_PHY_GBSR                0x0A
 
typedef enum {
  PHY_SPEED_NONE  = 0,
  PHY_SPEED_10    = 10,
  PHY_SPEED_100   = 100,
  PHY_SPEED_1000  = 1000
} GENERIC_PHY_SPEED;
 
typedef enum {
  PHY_DUPLEX_HALF,
  PHY_DUPLEX_FULL
} GENERIC_PHY_DUPLEX;
 
typedef
EFI_STATUS
(EFIAPI *GENERIC_PHY_READ) (
  IN VOID                     *Priv,
  IN UINT8                    PhyAddr,
  IN UINT8                    Reg,
  OUT UINT16 *                Data
  );
 
typedef
EFI_STATUS
(EFIAPI *GENERIC_PHY_WRITE) (
  IN VOID                     *Priv,
  IN UINT8                    PhyAddr,
  IN UINT8                    Reg,
  IN UINT16                   Data
  );
 
typedef
EFI_STATUS
(EFIAPI *GENERIC_PHY_RESET_ACTION) (
  IN VOID                     *Priv
  );
 
typedef
VOID
(EFIAPI *GENERIC_PHY_CONFIGURE) (
  IN VOID                     *Priv,
  IN GENERIC_PHY_SPEED        Speed,
  IN GENERIC_PHY_DUPLEX       Duplex
  );
 
typedef struct {
  GENERIC_PHY_READ            Read;
  GENERIC_PHY_WRITE           Write;
  GENERIC_PHY_RESET_ACTION    ResetAction;
  GENERIC_PHY_CONFIGURE       Configure;
  VOID                        *PrivateData;
 
  UINT8                       PhyAddr;
  BOOLEAN                     LinkUp;
} GENERIC_PHY_PRIVATE_DATA;
 
EFI_STATUS
EFIAPI
GenericPhyInit (
  IN GENERIC_PHY_PRIVATE_DATA *Phy
  );
 
EFI_STATUS
EFIAPI
GenericPhyUpdateConfig (
  IN GENERIC_PHY_PRIVATE_DATA *Phy
  );
 
EFI_STATUS
EFIAPI
GenericPhyReset (
  IN GENERIC_PHY_PRIVATE_DATA *Phy
  );
 
#endif // GENERICPHY_H__