1 /** @file
2 *
3 *  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
4 *
5 *  SPDX-License-Identifier: BSD-2-Clause-Patent
6 *
7 **/
8 
9 #ifndef __LAN9118_DXE_UTIL_H__
10 #define __LAN9118_DXE_UTIL_H__
11 
12 // Most common CRC32 Polynomial for little endian machines
13 #define CRC_POLYNOMIAL               0xEDB88320
14 
15 /**
16   This internal function reverses bits for 32bit data.
17 
18   @param  Value                 The data to be reversed.
19 
20   @return                       Data reversed.
21 
22 **/
23 UINT32
24 ReverseBits (
25   UINT32  Value
26   );
27 
28 // Create an Ethernet CRC
29 UINT32
30 GenEtherCrc32 (
31   IN    EFI_MAC_ADDRESS *Mac,
32   IN    UINT32 AddrLen
33   );
34 
35 UINT32
36 Lan9118RawMmioRead32(
37   UINTN Address,
38   UINTN Delay
39   );
40 #define Lan9118MmioRead32(a) \
41 	Lan9118RawMmioRead32(a, a ## _RD_DELAY)
42 
43 UINT32
44 Lan9118RawMmioWrite32(
45   UINTN Address,
46   UINT32 Value,
47   UINTN Delay
48   );
49 #define Lan9118MmioWrite32(a, v) \
50 	Lan9118RawMmioWrite32(a, v, a ## _WR_DELAY)
51 
52 /* ------------------ MAC CSR Access ------------------- */
53 
54 // Read from MAC indirect registers
55 UINT32
56 IndirectMACRead32 (
57   UINT32 Index
58   );
59 
60 
61 // Write to indirect registers
62 UINT32
63 IndirectMACWrite32 (
64   UINT32 Index,
65   UINT32 Value
66   );
67 
68 
69 /* --------------- PHY Registers Access ---------------- */
70 
71 // Read from MII register (PHY Access)
72 UINT32
73 IndirectPHYRead32(
74   UINT32 Index
75   );
76 
77 
78 // Write to the MII register (PHY Access)
79 UINT32
80 IndirectPHYWrite32(
81   UINT32 Index,
82   UINT32 Value
83   );
84 
85 /* ---------------- EEPROM Operations ------------------ */
86 
87 // Read from EEPROM memory
88 UINT32
89 IndirectEEPROMRead32 (
90   UINT32 Index
91   );
92 
93 // Write to EEPROM memory
94 UINT32
95 IndirectEEPROMWrite32 (
96   UINT32 Index,
97   UINT32 Value
98   );
99 
100 /* ---------------- General Operations ----------------- */
101 
102 VOID
103 Lan9118SetMacAddress (
104   EFI_MAC_ADDRESS             *Mac,
105   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
106   );
107 
108 // Initialise the LAN9118
109 EFI_STATUS
110 Lan9118Initialize (
111   IN  EFI_SIMPLE_NETWORK_PROTOCOL *Snp
112   );
113 
114 // Flags for software reset
115 #define SOFT_RESET_CHECK_MAC_ADDR_LOAD                  BIT0
116 #define SOFT_RESET_CLEAR_INT                            BIT1
117 #define SOFT_RESET_SELF_TEST                            BIT2
118 
119 // Perform software reset on the LAN9118
120 EFI_STATUS
121 SoftReset (
122   UINT32 Flags,
123   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
124   );
125 
126 // Flags for PHY reset
127 #define PHY_RESET_PMT                                   BIT0
128 #define PHY_RESET_BCR                                   BIT1
129 #define PHY_SOFT_RESET_CLEAR_INT                        BIT2
130 
131 // Perform PHY software reset
132 EFI_STATUS
133 PhySoftReset (
134   UINT32 Flags,
135   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
136   );
137 
138 // Flags for Hardware configuration
139 #define HW_CONF_USE_LEDS                                BIT0
140 
141 // Configure hardware for LAN9118
142 EFI_STATUS
143 ConfigureHardware (
144   UINT32 Flags,
145   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
146   );
147 
148 // Configure flow control
149 EFI_STATUS
150 ConfigureFlow (
151   UINT32 Flags,
152   UINT32 HighTrig,
153   UINT32 LowTrig,
154   UINT32 BPDuration,
155   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
156   );
157 
158 // Flags for auto negotiation
159 #define AUTO_NEGOTIATE_COLLISION_TEST         BIT0
160 #define AUTO_NEGOTIATE_ADVERTISE_ALL          BIT1
161 
162 // Do auto-negotiation
163 EFI_STATUS
164 AutoNegotiate (
165   UINT32 Flags,
166   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
167   );
168 
169 // Check the Link Status and take appropriate action
170 EFI_STATUS
171 CheckLinkStatus (
172   UINT32 Flags,
173   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
174   );
175 
176 // Stop transmitter flags
177 #define STOP_TX_MAC                       BIT0
178 #define STOP_TX_CFG                       BIT1
179 #define STOP_TX_CLEAR                     BIT2
180 
181 // Stop the transmitter
182 EFI_STATUS
183 StopTx (
184   UINT32 Flags,
185   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
186   );
187 
188 // Stop receiver flags
189 #define STOP_RX_CLEAR                     BIT0
190 
191 // Stop the receiver
192 EFI_STATUS
193 StopRx (
194   UINT32 Flags,
195   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
196   );
197 
198 // Start transmitter flags
199 #define START_TX_MAC                      BIT0
200 #define START_TX_CFG                      BIT1
201 #define START_TX_CLEAR                    BIT2
202 
203 // Start the transmitter
204 EFI_STATUS
205 StartTx (
206   UINT32 Flags,
207   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
208   );
209 
210 // Stop receiver flags
211 #define START_RX_CLEAR                     BIT0
212 
213 // Start the receiver
214 EFI_STATUS
215 StartRx (
216   UINT32 Flags,
217   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
218   );
219 
220 // Check Tx Data available space
221 UINT32
222 TxDataFreeSpace (
223   UINT32 Flags,
224   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
225   );
226 
227 // Check Tx Status used space
228 UINT32
229 TxStatusUsedSpace (
230   UINT32 Flags,
231   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
232   );
233 
234 // Check Rx Data used space
235 UINT32
236 RxDataUsedSpace (
237   UINT32 Flags,
238   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
239   );
240 
241 // Check Rx Status used space
242 UINT32
243 RxStatusUsedSpace (
244   UINT32 Flags,
245   EFI_SIMPLE_NETWORK_PROTOCOL *Snp
246   );
247 
248 
249 // Flags for FIFO allocation
250 #define ALLOC_USE_DEFAULT                 BIT0
251 #define ALLOC_USE_FIFOS                   BIT1
252 #define ALLOC_USE_DMA                     BIT2
253 
254 // FIFO min and max sizes
255 #define TX_FIFO_MIN_SIZE            0x00000600
256 #define TX_FIFO_MAX_SIZE            0x00003600
257 //#define RX_FIFO_MIN_SIZE
258 //#define RX_FIFO_MAX_SIZE
259 
260 // Change the allocation of FIFOs
261 EFI_STATUS
262 ChangeFifoAllocation (
263   IN      UINT32 Flags,
264   IN  OUT UINTN  *TxDataSize    OPTIONAL,
265   IN  OUT UINTN  *RxDataSize    OPTIONAL,
266   IN  OUT UINT32 *TxStatusSize  OPTIONAL,
267   IN  OUT UINT32 *RxStatusSize  OPTIONAL,
268   IN  OUT EFI_SIMPLE_NETWORK_PROTOCOL *Snp
269   );
270 
271 VOID
272 Lan9118ReadMacAddress (
273   OUT EFI_MAC_ADDRESS *Mac
274   );
275 
276 #endif // __LAN9118_DXE_UTIL_H__
277