1 /*-
2 *******************************************************************************
3 Copyright (C) 2015 Annapurna Labs Ltd.
4
5 This file may be licensed under the terms of the Annapurna Labs Commercial
6 License Agreement.
7
8 Alternatively, this file can be distributed under the terms of the GNU General
9 Public License V2 as published by the Free Software Foundation and can be
10 found at http://www.gnu.org/licenses/gpl-2.0.html
11
12 Alternatively, redistribution and use in source and binary forms, with or
13 without modification, are permitted provided that the following conditions are
14 met:
15
16 * Redistributions of source code must retain the above copyright notice,
17 this list of conditions and the following disclaimer.
18
19 * Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in
21 the documentation and/or other materials provided with the
22 distribution.
23
24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
28 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
35 *******************************************************************************/
36
37 /**
38 * @defgroup group_eth_api API
39 * Ethernet Controller HAL driver API
40 * @ingroup group_eth
41 * @{
42 * @file al_hal_eth.h
43 *
44 * @brief Header file for Unified GbE and 10GbE Ethernet Controllers This is a
45 * common header file that covers both Standard and Advanced Controller
46 *
47 *
48 */
49
50 #ifndef __AL_HAL_ETH_H__
51 #define __AL_HAL_ETH_H__
52
53 #include "al_hal_common.h"
54 #include "al_hal_udma.h"
55 #include "al_hal_eth_alu.h"
56 #ifdef AL_ETH_EX
57 #include "al_hal_eth_ex.h"
58 #include "al_hal_eth_ex_internal.h"
59 #endif
60
61 /* *INDENT-OFF* */
62 #ifdef __cplusplus
63 extern "C" {
64 #endif
65 /* *INDENT-ON* */
66
67 #ifndef AL_ETH_PKT_MAX_BUFS
68 #ifndef AL_ETH_EX
69 #define AL_ETH_PKT_MAX_BUFS 19
70 #else
71 #define AL_ETH_PKT_MAX_BUFS 30
72 #endif
73 #endif
74
75 #define AL_ETH_UDMA_TX_QUEUES 4
76 #define AL_ETH_UDMA_RX_QUEUES 4
77
78 /* PCI Adapter Device/Revision ID */
79 #define AL_ETH_DEV_ID_STANDARD 0x0001
80 #define AL_ETH_DEV_ID_ADVANCED 0x0002
81 #define AL_ETH_REV_ID_0 0 /* Alpine V1 Rev 0 */
82 #define AL_ETH_REV_ID_1 1 /* Alpine V1 Rev 1 */
83 #define AL_ETH_REV_ID_2 2 /* Alpine V2 basic */
84 #define AL_ETH_REV_ID_3 3 /* Alpine V2 advanced */
85
86 /* PCI BARs */
87 #define AL_ETH_UDMA_BAR 0
88 #define AL_ETH_EC_BAR 4
89 #define AL_ETH_MAC_BAR 2
90
91 #define AL_ETH_MAX_FRAME_LEN 10000
92 #define AL_ETH_MIN_FRAME_LEN 60
93
94 #define AL_ETH_TSO_MSS_MAX_IDX 8
95 #define AL_ETH_TSO_MSS_MIN_VAL 1
96 /*TODO: update with correct value*/
97 #define AL_ETH_TSO_MSS_MAX_VAL (AL_ETH_MAX_FRAME_LEN - 200)
98
99 enum AL_ETH_PROTO_ID {
100 AL_ETH_PROTO_ID_UNKNOWN = 0,
101 AL_ETH_PROTO_ID_IPv4 = 8,
102 AL_ETH_PROTO_ID_IPv6 = 11,
103 AL_ETH_PROTO_ID_TCP = 12,
104 AL_ETH_PROTO_ID_UDP = 13,
105 AL_ETH_PROTO_ID_FCOE = 21,
106 AL_ETH_PROTO_ID_GRH = 22, /** RoCE l3 header */
107 AL_ETH_PROTO_ID_BTH = 23, /** RoCE l4 header */
108 AL_ETH_PROTO_ID_ANY = 32, /**< for sw usage only */
109 };
110 #define AL_ETH_PROTOCOLS_NUM (AL_ETH_PROTO_ID_ANY)
111
112 enum AL_ETH_TX_TUNNEL_MODE {
113 AL_ETH_NO_TUNNELING = 0,
114 AL_ETH_TUNNEL_NO_UDP = 1, /* NVGRE / IP over IP */
115 AL_ETH_TUNNEL_WITH_UDP = 3, /* VXLAN */
116 };
117
118 #define AL_ETH_RX_THASH_TABLE_SIZE (1 << 8)
119 #define AL_ETH_RX_FSM_TABLE_SIZE (1 << 7)
120 #define AL_ETH_RX_CTRL_TABLE_SIZE (1 << 11)
121 #define AL_ETH_RX_HASH_KEY_NUM 10
122 #define AL_ETH_FWD_MAC_NUM 32
123 #define AL_ETH_FWD_MAC_HASH_NUM 256
124 #define AL_ETH_FWD_PBITS_TABLE_NUM (1 << 3)
125 #define AL_ETH_FWD_PRIO_TABLE_NUM (1 << 3)
126 #define AL_ETH_FWD_VID_TABLE_NUM (1 << 12)
127 #define AL_ETH_FWD_DSCP_TABLE_NUM (1 << 8)
128 #define AL_ETH_FWD_TC_TABLE_NUM (1 << 8)
129
130 /** MAC media mode */
131 enum al_eth_mac_mode {
132 AL_ETH_MAC_MODE_RGMII,
133 AL_ETH_MAC_MODE_SGMII,
134 AL_ETH_MAC_MODE_SGMII_2_5G,
135 AL_ETH_MAC_MODE_10GbE_Serial, /**< Applies to XFI and KR modes */
136 AL_ETH_MAC_MODE_10G_SGMII, /**< SGMII using the 10G MAC, don't use*/
137 AL_ETH_MAC_MODE_XLG_LL_40G, /**< applies to 40G mode using the 40G low latency (LL) MAC */
138 AL_ETH_MAC_MODE_KR_LL_25G, /**< applies to 25G mode using the 10/25G low latency (LL) MAC */
139 AL_ETH_MAC_MODE_XLG_LL_50G, /**< applies to 50G mode using the 40/50G low latency (LL) MAC */
140 AL_ETH_MAC_MODE_XLG_LL_25G /**< applies to 25G mode using the 40/50G low latency (LL) MAC */
141 };
142
143 struct al_eth_capabilities {
144 al_bool speed_10_HD;
145 al_bool speed_10_FD;
146 al_bool speed_100_HD;
147 al_bool speed_100_FD;
148 al_bool speed_1000_HD;
149 al_bool speed_1000_FD;
150 al_bool speed_10000_HD;
151 al_bool speed_10000_FD;
152 al_bool pfc; /**< priority flow control */
153 al_bool eee; /**< Energy Efficient Ethernet */
154 };
155
156 /** interface type used for MDIO */
157 enum al_eth_mdio_if {
158 AL_ETH_MDIO_IF_1G_MAC = 0,
159 AL_ETH_MDIO_IF_10G_MAC = 1
160 };
161
162 /** MDIO protocol type */
163 enum al_eth_mdio_type {
164 AL_ETH_MDIO_TYPE_CLAUSE_22 = 0,
165 AL_ETH_MDIO_TYPE_CLAUSE_45 = 1
166 };
167
168 /** flow control mode */
169 enum al_eth_flow_control_type {
170 AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE,
171 AL_ETH_FLOW_CONTROL_TYPE_PFC
172 };
173
174 /** Tx to Rx switching decision type */
175 enum al_eth_tx_switch_dec_type {
176 AL_ETH_TX_SWITCH_TYPE_MAC = 0,
177 AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE = 1,
178 AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE_AND_MAC = 2,
179 AL_ETH_TX_SWITCH_TYPE_BITMAP = 3
180 };
181
182 /** Tx to Rx VLAN ID selection type */
183 enum al_eth_tx_switch_vid_sel_type {
184 AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN1 = 0,
185 AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN2 = 1,
186 AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN1 = 2,
187 AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN2 = 3,
188 AL_ETH_TX_SWITCH_VID_SEL_TYPE_DEFAULT_VLAN1 = 4,
189 AL_ETH_TX_SWITCH_VID_SEL_TYPE_FINAL_VLAN1 = 5
190 };
191
192 /** Rx descriptor configurations */
193 /* Note: when selecting rx descriptor field to inner packet, then that field
194 * will be set according to inner packet when packet is tunneled, for non-tunneled
195 * packets, the field will be set according to the packets header */
196
197 /** selection of the LRO_context_value result in the Metadata */
198 enum al_eth_rx_desc_lro_context_val_res {
199 AL_ETH_LRO_CONTEXT_VALUE = 0, /**< LRO_context_value */
200 AL_ETH_L4_OFFSET = 1, /**< L4_offset */
201 };
202
203 /** selection of the L4 offset in the Metadata */
204 enum al_eth_rx_desc_l4_offset_sel {
205 AL_ETH_L4_OFFSET_OUTER = 0, /**< set L4 offset of the outer packet */
206 AL_ETH_L4_OFFSET_INNER = 1, /**< set L4 offset of the inner packet */
207 };
208
209 /** selection of the L4 checksum result in the Metadata */
210 enum al_eth_rx_desc_l4_chk_res_sel {
211 AL_ETH_L4_INNER_CHK = 0, /**< L4 checksum */
212 AL_ETH_L4_INNER_OUTER_CHK = 1, /**< Logic AND between outer and inner
213 L4 checksum result */
214 };
215
216 /** selection of the L3 checksum result in the Metadata */
217 enum al_eth_rx_desc_l3_chk_res_sel {
218 AL_ETH_L3_CHK_TYPE_0 = 0, /**< L3 checksum */
219 AL_ETH_L3_CHK_TYPE_1 = 1, /**< L3 checksum or RoCE/FCoE CRC,
220 based on outer header */
221 AL_ETH_L3_CHK_TYPE_2 = 2, /**< If tunnel exist = 0,
222 L3 checksum or RoCE/FCoE CRC,
223 based on outer header.
224 Else,
225 logic AND between outer L3 checksum
226 (Ipv4) and inner CRC (RoCE or FcoE) */
227 AL_ETH_L3_CHK_TYPE_3 = 3, /**< combination of the L3 checksum result and
228 CRC result,based on the checksum and
229 RoCE/FCoE CRC input selections. */
230 };
231
232 /** selection of the L3 protocol index in the Metadata */
233 enum al_eth_rx_desc_l3_proto_idx_sel {
234 AL_ETH_L3_PROTO_IDX_OUTER = 0, /**< set L3 proto index of the outer packet */
235 AL_ETH_L3_PROTO_IDX_INNER = 1, /**< set L3 proto index of the inner packet */
236 };
237
238 /** selection of the L3 offset in the Metadata */
239 enum al_eth_rx_desc_l3_offset_sel {
240 AL_ETH_L3_OFFSET_OUTER = 0, /**< set L3 offset of the outer packet */
241 AL_ETH_L3_OFFSET_INNER = 1, /**< set L3 offset of the inner packet */
242 };
243
244
245 /** selection of the L4 protocol index in the Metadata */
246 enum al_eth_rx_desc_l4_proto_idx_sel {
247 AL_ETH_L4_PROTO_IDX_OUTER = 0, /**< set L4 proto index of the outer packet */
248 AL_ETH_L4_PROTO_IDX_INNER = 1, /**< set L4 proto index of the inner packet */
249 };
250
251 /** selection of the frag indication in the Metadata */
252 enum al_eth_rx_desc_frag_sel {
253 AL_ETH_FRAG_OUTER = 0, /**< set frag of the outer packet */
254 AL_ETH_FRAG_INNER = 1, /**< set frag of the inner packet */
255 };
256
257 /** Ethernet Rx completion descriptor */
258 typedef struct {
259 uint32_t ctrl_meta;
260 uint32_t len;
261 uint32_t word2;
262 uint32_t word3;
263 } al_eth_rx_cdesc;
264
265 /** Flow Contol parameters */
266 struct al_eth_flow_control_params{
267 enum al_eth_flow_control_type type; /**< flow control type */
268 al_bool obay_enable; /**< stop tx when pause received */
269 al_bool gen_enable; /**< generate pause frames */
270 uint16_t rx_fifo_th_high;
271 uint16_t rx_fifo_th_low;
272 uint16_t quanta;
273 uint16_t quanta_th;
274 uint8_t prio_q_map[4][8]; /**< for each UDMA, defines the mapping between
275 * PFC priority and queues(in bit mask).
276 * same mapping used for obay and generation.
277 * for example:
278 * if prio_q_map[1][7] = 0xC, then TX queues 2
279 * and 3 of UDMA 1 will be stopped when pause
280 * received with priority 7, also, when RX queues
281 * 2 and 3 of UDMA 1 become almost full, then
282 * pause frame with priority 7 will be sent.
283 *
284 *note:
285 * 1) if specific a queue is not used, the caller must
286 * make set the prio_q_map to 0 otherwise that queue
287 * will make the controller keep sending PAUSE packets.
288 * 2) queues of unused UDMA must be treated as above.
289 * 3) when working in LINK PAUSE mode, only entries at
290 * priority 0 will be considered.
291 */
292 };
293
294 /* Packet Tx flags */
295 #define AL_ETH_TX_FLAGS_TSO AL_BIT(7) /**< Enable TCP/UDP segmentation offloading */
296 #define AL_ETH_TX_FLAGS_IPV4_L3_CSUM AL_BIT(13) /**< Enable IPv4 header checksum calculation */
297 #define AL_ETH_TX_FLAGS_L4_CSUM AL_BIT(14) /**< Enable TCP/UDP checksum calculation */
298 #define AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM AL_BIT(17) /**< L4 partial checksum calculation */
299 #define AL_ETH_TX_FLAGS_L2_MACSEC_PKT AL_BIT(16) /**< L2 Packet type 802_3 or 802_3_MACSEC, V2 */
300 #define AL_ETH_TX_FLAGS_ENCRYPT AL_BIT(16) /**< Enable TX packet encryption, V3 */
301 #define AL_ETH_TX_FLAGS_L2_DIS_FCS AL_BIT(15) /**< Disable CRC calculation*/
302 #define AL_ETH_TX_FLAGS_TS AL_BIT(21) /**< Timestamp the packet */
303
304 #define AL_ETH_TX_FLAGS_INT AL_M2S_DESC_INT_EN
305 #define AL_ETH_TX_FLAGS_NO_SNOOP AL_M2S_DESC_NO_SNOOP_H
306
307 /** this structure used for tx packet meta data */
308 struct al_eth_meta_data{
309 uint8_t store :1; /**< store the meta into the queues cache */
310 uint8_t words_valid :4; /**< valid bit per word */
311
312 uint8_t vlan1_cfi_sel:2;
313 uint8_t vlan2_vid_sel:2;
314 uint8_t vlan2_cfi_sel:2;
315 uint8_t vlan2_pbits_sel:2;
316 uint8_t vlan2_ether_sel:2;
317
318 uint16_t vlan1_new_vid:12;
319 uint8_t vlan1_new_cfi :1;
320 uint8_t vlan1_new_pbits :3;
321 uint16_t vlan2_new_vid:12;
322 uint8_t vlan2_new_cfi :1;
323 uint8_t vlan2_new_pbits :3;
324
325 uint8_t l3_header_len; /**< in bytes */
326 uint8_t l3_header_offset;
327 uint8_t l4_header_len; /**< in words(32-bits) */
328
329 /* rev 0 specific */
330 uint8_t mss_idx_sel:3; /**< for TSO, select the register that holds the MSS */
331
332 /* rev 1 specific */
333 uint8_t ts_index:4; /**< index of regiser where to store the tx timestamp */
334 uint16_t mss_val :14; /**< for TSO, set the mss value */
335 uint8_t outer_l3_offset; /**< for tunneling mode. up to 64 bytes */
336 uint8_t outer_l3_len; /**< for tunneling mode. up to 128 bytes */
337 };
338
339 /* Packet Rx flags when adding buffer to receive queue */
340
341 /**<
342 * Target-ID to be assigned to the packet descriptors
343 * Requires Target-ID in descriptor to be enabled for the specific UDMA
344 * queue.
345 */
346 #define AL_ETH_RX_FLAGS_TGTID_MASK AL_FIELD_MASK(15, 0)
347 #define AL_ETH_RX_FLAGS_NO_SNOOP AL_M2S_DESC_NO_SNOOP_H
348 #define AL_ETH_RX_FLAGS_INT AL_M2S_DESC_INT_EN
349 #define AL_ETH_RX_FLAGS_DUAL_BUF AL_BIT(31)
350
351 /* Packet Rx flags set by HW when receiving packet */
352 #define AL_ETH_RX_ERROR AL_BIT(16) /**< layer 2 errors (FCS, bad len, etc) */
353 #define AL_ETH_RX_FLAGS_L4_CSUM_ERR AL_BIT(14)
354 #define AL_ETH_RX_FLAGS_L3_CSUM_ERR AL_BIT(13)
355
356 /* Packet Rx flags - word 3 in Rx completion descriptor */
357 #define AL_ETH_RX_FLAGS_CRC AL_BIT(31)
358 #define AL_ETH_RX_FLAGS_L3_CSUM_2 AL_BIT(30)
359 #define AL_ETH_RX_FLAGS_L4_CSUM_2 AL_BIT(29)
360 #define AL_ETH_RX_FLAGS_SW_SRC_PORT_SHIFT 13
361 #define AL_ETH_RX_FLAGS_SW_SRC_PORT_MASK AL_FIELD_MASK(15, 13)
362 #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_SHIFT 3
363 #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_MASK AL_FIELD_MASK(10, 3)
364 #define AL_ETH_RX_FLAGS_L4_OFFSET_SHIFT 3
365 #define AL_ETH_RX_FLAGS_L4_OFFSET_MASK AL_FIELD_MASK(10, 3)
366 #define AL_ETH_RX_FLAGS_PRIORITY_SHIFT 0
367 #define AL_ETH_RX_FLAGS_PRIORITY_MASK AL_FIELD_MASK(2, 0)
368
369 /** packet structure. used for packet transmission and reception */
370 struct al_eth_pkt{
371 uint32_t flags; /**< see flags above, depends on context(tx or rx) */
372 enum AL_ETH_PROTO_ID l3_proto_idx;
373 enum AL_ETH_PROTO_ID l4_proto_idx;
374 uint8_t source_vlan_count:2;
375 uint8_t vlan_mod_add_count:2;
376 uint8_t vlan_mod_del_count:2;
377 uint8_t vlan_mod_v1_ether_sel:2;
378 uint8_t vlan_mod_v1_vid_sel:2;
379 uint8_t vlan_mod_v1_pbits_sel:2;
380
381 /* rev 1 specific */
382 enum AL_ETH_TX_TUNNEL_MODE tunnel_mode;
383 enum AL_ETH_PROTO_ID outer_l3_proto_idx; /**< for tunneling mode */
384
385 /**<
386 * Target-ID to be assigned to the packet descriptors
387 * Requires Target-ID in descriptor to be enabled for the specific UDMA
388 * queue.
389 */
390 uint16_t tgtid;
391
392 uint32_t rx_header_len; /**< header buffer length of rx packet, not used */
393 struct al_eth_meta_data *meta; /**< if null, then no meta added */
394 #ifdef AL_ETH_RX_DESC_RAW_GET
395 uint32_t rx_desc_raw[4];
396 #endif
397 uint16_t rxhash;
398 uint16_t l3_offset;
399
400 #ifdef AL_ETH_EX
401 struct al_eth_ext_metadata *ext_meta_data;
402 #endif
403
404 uint8_t num_of_bufs;
405 struct al_buf bufs[AL_ETH_PKT_MAX_BUFS];
406 };
407
408 struct al_ec_regs;
409
410
411 /** Ethernet Adapter private data structure used by this driver */
412 struct al_hal_eth_adapter{
413 uint8_t rev_id; /**<PCI adapter revision ID */
414 uint8_t udma_id; /**< the id of the UDMA used by this adapter */
415 struct unit_regs __iomem * unit_regs;
416 void __iomem *udma_regs_base;
417 struct al_ec_regs __iomem *ec_regs_base;
418 void __iomem *ec_ints_base;
419 struct al_eth_mac_regs __iomem *mac_regs_base;
420 struct interrupt_controller_ctrl __iomem *mac_ints_base;
421
422 char *name; /**< the upper layer must keep the string area */
423
424 struct al_udma tx_udma;
425 /* uint8_t tx_queues;*//* number of tx queues */
426 struct al_udma rx_udma;
427 /* uint8_t rx_queues;*//* number of tx queues */
428
429 uint8_t enable_rx_parser; /**< config and enable rx parsing */
430
431 enum al_eth_flow_control_type fc_type; /**< flow control*/
432
433 enum al_eth_mac_mode mac_mode;
434 enum al_eth_mdio_if mdio_if; /**< which mac mdio interface to use */
435 enum al_eth_mdio_type mdio_type; /**< mdio protocol type */
436 al_bool shared_mdio_if; /**< when AL_TRUE, the mdio interface is shared with other controllers.*/
437 uint8_t curr_lt_unit;
438 uint8_t serdes_lane;
439 #ifdef AL_ETH_EX
440 struct al_eth_ex_state ex_state;
441 #endif
442 };
443
444 /** parameters from upper layer */
445 struct al_eth_adapter_params{
446 uint8_t rev_id; /**<PCI adapter revision ID */
447 uint8_t udma_id; /**< the id of the UDMA used by this adapter */
448 uint8_t enable_rx_parser; /**< when true, the rx epe parser will be enabled */
449 void __iomem *udma_regs_base; /**< UDMA register base address */
450 void __iomem *ec_regs_base; /**< Ethernet controller registers base address
451 * can be null if the function is virtual
452 */
453 void __iomem *mac_regs_base; /**< Ethernet MAC registers base address
454 * can be null if the function is virtual
455 */
456 char *name; /**< the upper layer must keep the string area */
457
458 uint8_t serdes_lane; /**< serdes lane (relevant to 25G macs only) */
459 };
460
461 /* adapter management */
462 /**
463 * initialize the ethernet adapter's DMA
464 * - initialize the adapter data structure
465 * - initialize the Tx and Rx UDMA
466 * - enable the Tx and Rx UDMA, the rings will be still disabled at this point.
467 *
468 * @param adapter pointer to the private structure
469 * @param params the parameters passed from upper layer
470 *
471 * @return 0 on success. otherwise on failure.
472 */
473 int al_eth_adapter_init(struct al_hal_eth_adapter *adapter, struct al_eth_adapter_params *params);
474
475 /**
476 * stop the DMA of the ethernet adapter
477 *
478 * @param adapter pointer to the private structure
479 *
480 * @return 0 on success. otherwise on failure.
481 */
482 int al_eth_adapter_stop(struct al_hal_eth_adapter *adapter);
483
484 int al_eth_adapter_reset(struct al_hal_eth_adapter *adapter);
485
486 /**
487 * enable the ec and mac interrupts
488 *
489 * @param adapter pointer to the private structure
490 *
491 * @return 0 on success. otherwise on failure.
492 */
493 int al_eth_ec_mac_ints_config(struct al_hal_eth_adapter *adapter);
494
495 /**
496 * ec and mac interrupt service routine
497 * read and print asserted interrupts
498 *
499 * @param adapter pointer to the private structure
500 *
501 * @return 0 on success. otherwise on failure.
502 */
503 int al_eth_ec_mac_isr(struct al_hal_eth_adapter *adapter);
504
505 /* Q management */
506 /**
507 * Configure and enable a queue ring
508 *
509 * @param adapter pointer to the private structure
510 * @param type tx or rx
511 * @param qid queue index
512 * @param q_params queue parameters
513 *
514 * @return 0 on success. otherwise on failure.
515 */
516 int al_eth_queue_config(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid,
517 struct al_udma_q_params *q_params);
518
519
520 /**
521 * enable a queue if it was previously disabled
522 *
523 * @param adapter pointer to the private structure
524 * @param type tx or rx
525 * @param qid queue index
526 *
527 * @return -EPERM (not implemented yet).
528 */
529 int al_eth_queue_enable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid);
530
531 /**
532 * disable a queue
533 * @param adapter pointer to the private structure
534 * @param type tx or rx
535 * @param qid queue index
536 *
537 * @return -EPERM (not implemented yet).
538 */
539 int al_eth_queue_disable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid);
540
541 /* MAC layer */
542
543 /**
544 * configure the mac media type.
545 * this function only sets the mode, but not the speed as certain mac modes
546 * support multiple speeds as will be negotiated by the link layer.
547 * @param adapter pointer to the private structure.
548 * @param mode media mode
549 *
550 * @return 0 on success. negative errno on failure.
551 */
552 int al_eth_mac_config(struct al_hal_eth_adapter *adapter, enum al_eth_mac_mode mode);
553
554 /**
555 * stop the mac tx and rx paths.
556 * @param adapter pointer to the private structure.
557 *
558 * @return 0 on success. negative error on failure.
559 */
560 int al_eth_mac_stop(struct al_hal_eth_adapter *adapter);
561
562 /**
563 * start the mac tx and rx paths.
564 * @param adapter pointer to the private structure.
565 *
566 * @return 0 on success. negative error on failure.
567 */
568 int al_eth_mac_start(struct al_hal_eth_adapter *adapter);
569
570 /**
571 * Perform gearbox reset for tx lanes And/Or Rx lanes.
572 * applicable only when the controller is connected to srds25G.
573 * This reset should be performed after each operation that changes the clocks
574 * (such as serdes reset, mac stop, etc.)
575 *
576 * @param adapter pointer to the private structure.
577 * @param tx_reset assert and de-assert reset for tx lanes
578 * @param rx_reset assert and de-assert reset for rx lanes
579 */
580 void al_eth_gearbox_reset(struct al_hal_eth_adapter *adapter, al_bool tx_reset, al_bool rx_reset);
581
582 /**
583 * Enable / Disable forward error correction (FEC)
584 *
585 * @param adapter pointer to the private structure.
586 * @param enable true to enable FEC. false to disable FEC.
587 *
588 * @return 0 on success. negative error on failure.
589 */
590 int al_eth_fec_enable(struct al_hal_eth_adapter *adapter, al_bool enable);
591
592 /**
593 * Get forward error correction (FEC) statistics
594 *
595 * @param adapter pointer to the private structure.
596 * @param corrected number of bits been corrected by the FEC
597 * @param uncorrectable number of bits that FEC couldn't correct.
598 *
599 * @return 0 on success. negative error on failure.
600 */
601 int al_eth_fec_stats_get(struct al_hal_eth_adapter *adapter,
602 uint32_t *corrected, uint32_t *uncorrectable);
603
604 /**
605 * get the adapter capabilities (speed, duplex,..)
606 * this function must not be called before configuring the mac mode using al_eth_mac_config()
607 * @param adapter pointer to the private structure.
608 * @param caps pointer to structure that will be updated by this function
609 *
610 * @return 0 on success. negative errno on failure.
611 */
612 int al_eth_capabilities_get(struct al_hal_eth_adapter *adapter, struct al_eth_capabilities *caps);
613
614 /**
615 * update link auto negotiation speed and duplex mode
616 * this function assumes the mac mode already set using the al_eth_mac_config()
617 * function.
618 *
619 * @param adapter pointer to the private structure
620 * @param force_1000_base_x set to AL_TRUE to force the mac to work on 1000baseX
621 * (not relevant to RGMII)
622 * @param an_enable set to AL_TRUE to enable auto negotiation
623 * (not relevant to RGMII)
624 * @param speed in mega bits, e.g 1000 stands for 1Gbps (relevant only in case
625 * an_enable is AL_FALSE)
626 * @param full_duplex set to AL_TRUE to enable full duplex mode (relevant only
627 * in case an_enable is AL_FALSE)
628 *
629 * @return 0 on success. otherwise on failure.
630 */
631 int al_eth_mac_link_config(struct al_hal_eth_adapter *adapter,
632 al_bool force_1000_base_x,
633 al_bool an_enable,
634 uint32_t speed,
635 al_bool full_duplex);
636 /**
637 * Enable/Disable Loopback mode
638 *
639 * @param adapter pointer to the private structure
640 * @param enable set to AL_TRUE to enable full duplex mode
641 *
642 * @return 0 on success. otherwise on failure.
643 */
644 int al_eth_mac_loopback_config(struct al_hal_eth_adapter *adapter, int enable);
645
646 /**
647 * configure minimum and maximum rx packet length
648 *
649 * @param adapter pointer to the private structure
650 * @param min_rx_len minimum rx packet length
651 * @param max_rx_len maximum rx packet length
652 * both length limits in bytes and it includes the MAC Layer header and FCS.
653 * @return 0 on success, otherwise on failure.
654 */
655 int al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter *adapter, uint32_t min_rx_len, uint32_t max_rx_len);
656
657
658 /* MDIO */
659
660 /* Reference clock frequency (platform specific) */
661 enum al_eth_ref_clk_freq {
662 AL_ETH_REF_FREQ_375_MHZ = 0,
663 AL_ETH_REF_FREQ_187_5_MHZ = 1,
664 AL_ETH_REF_FREQ_250_MHZ = 2,
665 AL_ETH_REF_FREQ_500_MHZ = 3,
666 AL_ETH_REF_FREQ_428_MHZ = 4,
667 };
668
669 /**
670 * configure the MDIO hardware interface
671 * @param adapter pointer to the private structure
672 * @param mdio_type clause type
673 * @param shared_mdio_if set to AL_TRUE if multiple controllers using the same
674 * @param ref_clk_freq reference clock frequency
675 * @param mdio_clk_freq_khz the required MDC/MDIO clock frequency [Khz]
676 * MDIO pins of the chip.
677 *
678 * @return 0 on success, otherwise on failure.
679 */
680 int al_eth_mdio_config(struct al_hal_eth_adapter *adapter,
681 enum al_eth_mdio_type mdio_type,
682 al_bool shared_mdio_if,
683 enum al_eth_ref_clk_freq ref_clk_freq,
684 unsigned int mdio_clk_freq_khz);
685
686 /**
687 * read mdio register
688 * this function uses polling mode, and as the mdio is slow interface, it might
689 * block the cpu for long time (milliseconds).
690 * @param adapter pointer to the private structure
691 * @param phy_addr address of mdio phy
692 * @param device address of mdio device (used only in CLAUSE 45)
693 * @param reg index of the register
694 * @param val pointer for read value of the register
695 *
696 * @return 0 on success, negative errno on failure
697 */
698 int al_eth_mdio_read(struct al_hal_eth_adapter *adapter, uint32_t phy_addr,
699 uint32_t device, uint32_t reg, uint16_t *val);
700
701 /**
702 * write mdio register
703 * this function uses polling mode, and as the mdio is slow interface, it might
704 * block the cpu for long time (milliseconds).
705 * @param adapter pointer to the private structure
706 * @param phy_addr address of mdio phy
707 * @param device address of mdio device (used only in CLAUSE 45)
708 * @param reg index of the register
709 * @param val value to write
710 *
711 * @return 0 on success, negative errno on failure
712 */
713 int al_eth_mdio_write(struct al_hal_eth_adapter *adapter, uint32_t phy_addr,
714 uint32_t device, uint32_t reg, uint16_t val);
715
716 /* TX */
717 /**
718 * get number of free tx descriptors
719 *
720 * @param adapter adapter handle
721 * @param qid queue index
722 *
723 * @return num of free descriptors.
724 */
al_eth_tx_available_get(struct al_hal_eth_adapter * adapter,uint32_t qid)725 static INLINE uint32_t al_eth_tx_available_get(struct al_hal_eth_adapter *adapter,
726 uint32_t qid)
727 {
728 struct al_udma_q *udma_q;
729
730 al_udma_q_handle_get(&adapter->tx_udma, qid, &udma_q);
731
732 return al_udma_available_get(udma_q);
733 }
734
735 /**
736 * prepare packet descriptors in tx queue.
737 *
738 * This functions prepares the descriptors for the given packet in the tx
739 * submission ring. the caller must call al_eth_tx_pkt_action() below
740 * in order to notify the hardware about the new descriptors.
741 *
742 * @param tx_dma_q pointer to UDMA tx queue
743 * @param pkt the packet to transmit
744 *
745 * @return number of descriptors used for this packet, 0 if no free
746 * room in the descriptors ring
747 */
748 int al_eth_tx_pkt_prepare(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt);
749
750
751 /**
752 * Trigger the DMA about previously added tx descriptors.
753 *
754 * @param tx_dma_q pointer to UDMA tx queue
755 * @param tx_descs number of descriptors to notify the DMA about.
756 * the tx_descs can be sum of descriptor numbers of multiple prepared packets,
757 * this way the caller can use this function to notify the DMA about multiple
758 * packets.
759 */
760 void al_eth_tx_dma_action(struct al_udma_q *tx_dma_q, uint32_t tx_descs);
761
762 /**
763 * get number of completed tx descriptors, upper layer should derive from
764 * this information which packets were completed.
765 *
766 * @param tx_dma_q pointer to UDMA tx queue
767 *
768 * @return number of completed tx descriptors.
769 */
770 int al_eth_comp_tx_get(struct al_udma_q *tx_dma_q);
771
772 /**
773 * configure a TSO MSS val
774 *
775 * the TSO MSS vals are preconfigured values for MSS stored in hardware and the
776 * packet could use them when not working in MSS explicit mode.
777 * @param adapter pointer to the private structure
778 * @param idx the mss index
779 * @param mss_val the MSS value
780 *
781 * @return 0 on success. otherwise on failure.
782 */
783 int al_eth_tso_mss_config(struct al_hal_eth_adapter *adapter, uint8_t idx, uint32_t mss_val);
784
785 /* RX */
786 /**
787 * Config the RX descriptor fields
788 *
789 * @param adapter pointer to the private structure
790 * @param lro_sel select LRO context or l4 offset
791 * @param l4_offset_sel select l4 offset source
792 * @param l4_sel select the l4 checksum result
793 * @param l3_sel select the l3 checksum result
794 * @param l3_proto_sel select the l3 protocol index source
795 * @param l4_proto_sel select the l4 protocol index source
796 * @param frag_sel select the frag indication source
797 */
798 void al_eth_rx_desc_config(
799 struct al_hal_eth_adapter *adapter,
800 enum al_eth_rx_desc_lro_context_val_res lro_sel,
801 enum al_eth_rx_desc_l4_offset_sel l4_offset_sel,
802 enum al_eth_rx_desc_l3_offset_sel l3_offset_sel,
803 enum al_eth_rx_desc_l4_chk_res_sel l4_sel,
804 enum al_eth_rx_desc_l3_chk_res_sel l3_sel,
805 enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel,
806 enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel,
807 enum al_eth_rx_desc_frag_sel frag_sel);
808
809 /**
810 * Configure RX header split
811 *
812 * @param adapter pointer to the private structure
813 * @param enable header split when AL_TRUE
814 * @param header_split_len length in bytes of the header split, this value used when
815 * CTRL TABLE header split len select is set to
816 * AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_REG, in this case the controller will
817 * store the first header_split_len bytes into buf2, then the rest (if any) into buf1.
818 * when CTRL_TABLE header split len select set to other value, then the header_len
819 * determined according to the parser, and the header_split_len parameter is not
820 * used.
821 *
822 * return 0 on success. otherwise on failure.
823 */
824 int al_eth_rx_header_split_config(struct al_hal_eth_adapter *adapter, al_bool enable, uint32_t header_len);
825
826 /**
827 * enable / disable header split in the udma queue.
828 * length will be taken from the udma configuration to enable different length per queue.
829 *
830 * @param adapter pointer to the private structure
831 * @param enable header split when AL_TRUE
832 * @param qid the queue id to enable/disable header split
833 * @param header_len in what len the udma will cut the header
834 *
835 * return 0 on success.
836 */
837 int al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter *adapter,
838 al_bool enable,
839 uint32_t qid,
840 uint32_t header_len);
841
842 /**
843 * add buffer to receive queue
844 *
845 * @param rx_dma_q pointer to UDMA rx queue
846 * @param buf pointer to data buffer
847 * @param flags bitwise of AL_ETH_RX_FLAGS
848 * @param header_buf this is not used for far and header_buf should be set to
849 * NULL.
850 *
851 * @return 0 on success. otherwise on failure.
852 */
853 int al_eth_rx_buffer_add(struct al_udma_q *rx_dma_q,
854 struct al_buf *buf, uint32_t flags,
855 struct al_buf *header_buf);
856
857 /**
858 * notify the hw engine about rx descriptors that were added to the receive queue
859 *
860 * @param rx_dma_q pointer to UDMA rx queue
861 * @param descs_num number of rx descriptors
862 */
863 void al_eth_rx_buffer_action(struct al_udma_q *rx_dma_q,
864 uint32_t descs_num);
865
866 /**
867 * get packet from RX completion ring
868 *
869 * @param rx_dma_q pointer to UDMA rx queue
870 * @param pkt pointer to a packet data structure, this function fills this
871 * structure with the information about the received packet. the buffers
872 * structures filled only with the length of the data written into the buffer,
873 * the address fields are not updated as the upper layer can retrieve this
874 * information by itself because the hardware uses the buffers in the same order
875 * were those buffers inserted into the ring of the receive queue.
876 * this structure should be allocated by the caller function.
877 *
878 * @return return number of descriptors or 0 if no completed packet found.
879 */
880 uint32_t al_eth_pkt_rx(struct al_udma_q *rx_dma_q, struct al_eth_pkt *pkt);
881
882
883 /* RX parser table */
884 struct al_eth_epe_p_reg_entry {
885 uint32_t data;
886 uint32_t mask;
887 uint32_t ctrl;
888 };
889
890 struct al_eth_epe_control_entry {
891 uint32_t data[6];
892 };
893
894 /**
895 * update rx parser entry
896 *
897 * @param adapter pointer to the private structure
898 * @param idx the protocol index to update
899 * @param reg_entry contents of parser register entry
900 * @param control entry contents of control table entry
901 *
902 * @return 0 on success. otherwise on failure.
903 */
904 int al_eth_rx_parser_entry_update(struct al_hal_eth_adapter *adapter, uint32_t idx,
905 struct al_eth_epe_p_reg_entry *reg_entry,
906 struct al_eth_epe_control_entry *control_entry);
907
908 /* Flow Steering and filtering */
909 int al_eth_thash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma, uint32_t queue);
910
911 /* FSM table bits */
912 /** FSM table has 7 bits input address:
913 * bits[2:0] are the outer packet's type (IPv4, TCP...)
914 * bits[5:3] are the inner packet's type
915 * bit[6] is set when packet is tunneled.
916 *
917 * The output of each entry:
918 * bits[1:0] - input selection: selects the input for the thash (2/4 tuple, inner/outer)
919 * bit[2] - selects whether to use thash output, or default values for the queue and udma
920 * bits[6:3] default UDMA mask: the UDMAs to select when bit 2 above was unset
921 * bits[9:5] defualt queue: the queue index to select when bit 2 above was unset
922 */
923
924 #define AL_ETH_FSM_ENTRY_IPV4_TCP 0
925 #define AL_ETH_FSM_ENTRY_IPV4_UDP 1
926 #define AL_ETH_FSM_ENTRY_IPV6_TCP 2
927 #define AL_ETH_FSM_ENTRY_IPV6_UDP 3
928 #define AL_ETH_FSM_ENTRY_IPV6_NO_UDP_TCP 4
929 #define AL_ETH_FSM_ENTRY_IPV4_NO_UDP_TCP 5
930 #define AL_ETH_FSM_ENTRY_IPV4_FRAGMENTED 6
931 #define AL_ETH_FSM_ENTRY_NOT_IP 7
932
933 #define AL_ETH_FSM_ENTRY_OUTER(idx) ((idx) & 7)
934 #define AL_ETH_FSM_ENTRY_INNER(idx) (((idx) >> 3) & 7)
935 #define AL_ETH_FSM_ENTRY_TUNNELED(idx) (((idx) >> 6) & 1)
936
937 /* FSM DATA format */
938 #define AL_ETH_FSM_DATA_OUTER_2_TUPLE 0
939 #define AL_ETH_FSM_DATA_OUTER_4_TUPLE 1
940 #define AL_ETH_FSM_DATA_INNER_2_TUPLE 2
941 #define AL_ETH_FSM_DATA_INNER_4_TUPLE 3
942
943 #define AL_ETH_FSM_DATA_HASH_SEL (1 << 2)
944
945 #define AL_ETH_FSM_DATA_DEFAULT_Q_SHIFT 5
946 #define AL_ETH_FSM_DATA_DEFAULT_UDMA_SHIFT 3
947
948 /* set fsm table entry */
949 int al_eth_fsm_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry);
950
951 enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT {
952 AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_0 = 0,
953 AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_1 = 1,
954 AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_ANY = 2,
955 };
956
957 enum AL_ETH_FWD_CTRL_IDX_TUNNEL {
958 AL_ETH_FWD_CTRL_IDX_TUNNEL_NOT_EXIST = 0,
959 AL_ETH_FWD_CTRL_IDX_TUNNEL_EXIST = 1,
960 AL_ETH_FWD_CTRL_IDX_TUNNEL_ANY = 2,
961 };
962
963 enum AL_ETH_FWD_CTRL_IDX_VLAN {
964 AL_ETH_FWD_CTRL_IDX_VLAN_NOT_EXIST = 0,
965 AL_ETH_FWD_CTRL_IDX_VLAN_EXIST = 1,
966 AL_ETH_FWD_CTRL_IDX_VLAN_ANY = 2,
967 };
968
969 enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE {
970 AL_ETH_FWD_CTRL_IDX_MAC_TABLE_NO_MATCH = 0,
971 AL_ETH_FWD_CTRL_IDX_MAC_TABLE_MATCH = 1,
972 AL_ETH_FWD_CTRL_IDX_MAC_TABLE_ANY = 2,
973 };
974
975 enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE {
976 AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_UC = 0, /**< unicast */
977 AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_MC = 1, /**< multicast */
978 AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_BC = 2, /**< broadcast */
979 AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_ANY = 4, /**< for sw usage */
980 };
981
982 /**
983 * This structure defines the index or group of indeces within the control table.
984 * each field has special enum value (with _ANY postfix) that indicates all
985 * possible values of that field.
986 */
987 struct al_eth_fwd_ctrl_table_index {
988 enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT vlan_table_out;
989 enum AL_ETH_FWD_CTRL_IDX_TUNNEL tunnel_exist;
990 enum AL_ETH_FWD_CTRL_IDX_VLAN vlan_exist;
991 enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE mac_table_match;
992 enum AL_ETH_PROTO_ID protocol_id;
993 enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE mac_type;
994 };
995
996 enum AL_ETH_CTRL_TABLE_PRIO_SEL {
997 AL_ETH_CTRL_TABLE_PRIO_SEL_PBITS_TABLE = 0,
998 AL_ETH_CTRL_TABLE_PRIO_SEL_DSCP_TABLE = 1,
999 AL_ETH_CTRL_TABLE_PRIO_SEL_TC_TABLE = 2,
1000 AL_ETH_CTRL_TABLE_PRIO_SEL_REG1 = 3,
1001 AL_ETH_CTRL_TABLE_PRIO_SEL_REG2 = 4,
1002 AL_ETH_CTRL_TABLE_PRIO_SEL_REG3 = 5,
1003 AL_ETH_CTRL_TABLE_PRIO_SEL_REG4 = 6,
1004 AL_ETH_CTRL_TABLE_PRIO_SEL_REG5 = 7,
1005 AL_ETH_CTRL_TABLE_PRIO_SEL_REG6 = 7,
1006 AL_ETH_CTRL_TABLE_PRIO_SEL_REG7 = 9,
1007 AL_ETH_CTRL_TABLE_PRIO_SEL_REG8 = 10,
1008 AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_3 = 11,
1009 AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_0 = 12,
1010 };
1011 /** where to select the initial queue from */
1012 enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1 {
1013 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_PRIO_TABLE = 0,
1014 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_THASH_TABLE = 1,
1015 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MAC_TABLE = 2,
1016 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MHASH_TABLE = 3,
1017 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG1 = 4,
1018 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG2 = 5,
1019 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG3 = 6,
1020 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG4 = 7,
1021 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_3 = 12,
1022 AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_0 = 13,
1023 };
1024
1025 /** target queue will be built up from the priority and initial queue */
1026 enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2 {
1027 AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_TABLE = 0, /**< target queue is the output of priority table */
1028 AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO = 1, /**< target queue is the priority */
1029 AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_QUEUE = 2, /**< target queue is initial queue[0], priority[1] */
1030 AL_ETH_CTRL_TABLE_QUEUE_SEL_2_NO_PRIO = 3, /**< target queue is the initial */
1031 };
1032
1033 enum AL_ETH_CTRL_TABLE_UDMA_SEL {
1034 AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_TABLE = 0,
1035 AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_AND_VLAN = 1,
1036 AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_TABLE = 2,
1037 AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_AND_MAC = 3,
1038 AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_TABLE = 4,
1039 AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_AND_MHASH = 5,
1040 AL_ETH_CTRL_TABLE_UDMA_SEL_MHASH_TABLE = 6,
1041 AL_ETH_CTRL_TABLE_UDMA_SEL_REG1 = 7,
1042 AL_ETH_CTRL_TABLE_UDMA_SEL_REG2 = 8,
1043 AL_ETH_CTRL_TABLE_UDMA_SEL_REG3 = 9,
1044 AL_ETH_CTRL_TABLE_UDMA_SEL_REG4 = 10,
1045 AL_ETH_CTRL_TABLE_UDMA_SEL_REG5 = 11,
1046 AL_ETH_CTRL_TABLE_UDMA_SEL_REG6 = 12,
1047 AL_ETH_CTRL_TABLE_UDMA_SEL_REG7 = 13,
1048 AL_ETH_CTRL_TABLE_UDMA_SEL_REG8 = 14,
1049 AL_ETH_CTRL_TABLE_UDMA_SEL_VAL_0 = 15,
1050 };
1051
1052 enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL {
1053 AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_0 = 0,
1054 AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_REG = 1, /**< select header len from the hdr_split register (set by al_eth_rx_header_split_config())*/
1055 AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L3_OFFSET = 2,
1056 AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L4_OFFSET = 3,
1057 AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_TUNNEL_START_OFFSET = 4,
1058 AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L3_OFFSET = 5,
1059 AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L4_OFFSET = 6,
1060 };
1061
1062 struct al_eth_fwd_ctrl_table_entry {
1063 enum AL_ETH_CTRL_TABLE_PRIO_SEL prio_sel;
1064 enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1 queue_sel_1; /**< queue id source */
1065 enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2 queue_sel_2; /**< mix queue id with priority */
1066 enum AL_ETH_CTRL_TABLE_UDMA_SEL udma_sel;
1067 enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL hdr_split_len_sel;
1068 al_bool filter; /**< set to AL_TRUE to enable filtering */
1069 };
1070 /**
1071 * Configure default control table entry
1072 *
1073 * @param adapter pointer to the private structure
1074 * @param use_table set to AL_TRUE if control table is used, when set to AL_FALSE
1075 * then control table will be bypassed and the entry value will be used.
1076 * @param entry defines the value to be used when bypassing control table.
1077 *
1078 * @return 0 on success. otherwise on failure.
1079 */
1080 int al_eth_ctrl_table_def_set(struct al_hal_eth_adapter *adapter,
1081 al_bool use_table,
1082 struct al_eth_fwd_ctrl_table_entry *entry);
1083
1084 /**
1085 * Configure control table entry
1086 *
1087 * @param adapter pointer to the private structure
1088 * @param index the entry index within the control table.
1089 * @param entry the value to write to the control table entry
1090 *
1091 * @return 0 on success. otherwise on failure.
1092 */
1093 int al_eth_ctrl_table_set(struct al_hal_eth_adapter *adapter,
1094 struct al_eth_fwd_ctrl_table_index *index,
1095 struct al_eth_fwd_ctrl_table_entry *entry);
1096
1097 int al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry);
1098 int al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter *adapter, uint32_t val);
1099
1100 /**
1101 * Configure hash key initial registers
1102 * Those registers define the initial key values, those values used for
1103 * the THASH and MHASH hash functions.
1104 *
1105 * @param adapter pointer to the private structure
1106 * @param idx the register index
1107 * @param val the register value
1108 *
1109 * @return 0 on success. otherwise on failure.
1110 */
1111 int al_eth_hash_key_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t val);
1112
1113 struct al_eth_fwd_mac_table_entry {
1114 uint8_t addr[6]; /**< byte 0 is the first byte seen on the wire */
1115 uint8_t mask[6];
1116 al_bool tx_valid;
1117 uint8_t tx_target;
1118 al_bool rx_valid;
1119 uint8_t udma_mask; /**< target udma */
1120 uint8_t qid; /**< target queue */
1121 al_bool filter; /**< set to AL_TRUE to enable filtering */
1122 };
1123
1124 /**
1125 * Configure mac table entry
1126 * The HW traverse this table and looks for match from lowest index,
1127 * when the packets MAC DA & mask == addr, and the valid bit is set, then match occurs.
1128 *
1129 * @param adapter pointer to the private structure
1130 * @param idx the entry index within the mac table.
1131 * @param entry the contents of the MAC table entry
1132 *
1133 * @return 0 on success. otherwise on failure.
1134 */
1135 int al_eth_fwd_mac_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
1136 struct al_eth_fwd_mac_table_entry *entry);
1137
1138 int al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
1139 uint32_t addr_lo, uint32_t addr_hi, uint32_t mask_lo, uint32_t mask_hi);
1140 int al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t ctrl);
1141
1142 int al_eth_mac_addr_store(void * __iomem ec_base, uint32_t idx, uint8_t *addr);
1143 int al_eth_mac_addr_read(void * __iomem ec_base, uint32_t idx, uint8_t *addr);
1144
1145 /**
1146 * Configure pbits table entry
1147 * The HW uses this table to translate between vlan pbits field to priority.
1148 * The vlan pbits is used as the index of this table.
1149 *
1150 * @param adapter pointer to the private structure
1151 * @param idx the entry index within the table.
1152 * @param prio the priority to set for this entry
1153 *
1154 * @return 0 on success. otherwise on failure.
1155 */
1156 int al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
1157
1158 /**
1159 * Configure priority table entry
1160 * The HW uses this table to translate between priority to queue index.
1161 * The priority is used as the index of this table.
1162 *
1163 * @param adapter pointer to the private structure
1164 * @param prio the entry index within the table.
1165 * @param qid the queue index to set for this entry (priority).
1166 *
1167 * @return 0 on success. otherwise on failure.
1168 */
1169 int al_eth_fwd_priority_table_set(struct al_hal_eth_adapter *adapter, uint8_t prio, uint8_t qid);
1170
1171 /**
1172 * Configure DSCP table entry
1173 * The HW uses this table to translate between IPv4 DSCP field to priority.
1174 * The IPv4 byte 1 (DSCP+ECN) used as index to this table.
1175 *
1176 * @param adapter pointer to the private structure
1177 * @param idx the entry index within the table.
1178 * @param prio the queue index to set for this entry (priority).
1179 *
1180 * @return 0 on success. otherwise on failure.
1181 */
1182 int al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
1183
1184 /**
1185 * Configure TC table entry
1186 * The HW uses this table to translate between IPv6 TC field to priority.
1187 * The IPv6 TC used as index to this table.
1188 *
1189 * @param adapter pointer to the private structure
1190 * @param idx the entry index within the table.
1191 * @param prio the queue index to set for this entry (priority).
1192 *
1193 * @return 0 on success. otherwise on failure.
1194 */
1195 int al_eth_fwd_tc_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio);
1196
1197 /**
1198 * Configure MAC HASH table entry
1199 * The HW uses 8 bits from the hash result on the MAC DA as index to this table.
1200 *
1201 * @param adapter pointer to the private structure
1202 * @param idx the entry index within the table.
1203 * @param udma_mask the target udma to set for this entry.
1204 * @param qid the target queue index to set for this entry.
1205 *
1206 * @return 0 on success. otherwise on failure.
1207 */
1208 int al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, uint8_t qid);
1209
1210 struct al_eth_fwd_vid_table_entry {
1211 uint8_t control:1; /**< used as input for the control table */
1212 uint8_t filter:1; /**< set to 1 to enable filtering */
1213 uint8_t udma_mask:4; /**< target udmas */
1214 };
1215
1216 /**
1217 * Configure default vlan table entry
1218 *
1219 * @param adapter pointer to the private structure
1220 * @param use_table set to AL_TRUE if vlan table is used, when set to AL_FALSE
1221 * then vid table will be bypassed and the default_entry value will be used.
1222 * @param default_entry defines the value to be used when bypassing vid table.
1223 * @param default_vlan defines the value will be used when untagget packet
1224 * received. this value will be used only for steering and filtering control,
1225 * the packet's data will not be changed.
1226 *
1227 * @return 0 on success. otherwise on failure.
1228 */
1229 int al_eth_fwd_vid_config_set(struct al_hal_eth_adapter *adapter, al_bool use_table,
1230 struct al_eth_fwd_vid_table_entry *default_entry,
1231 uint32_t default_vlan);
1232 /**
1233 * Configure vlan table entry
1234 *
1235 * @param adapter pointer to the private structure
1236 * @param idx the entry index within the vlan table. The HW uses the vlan id
1237 * field of the packet when accessing this table.
1238 * @param entry the value to write to the vlan table entry
1239 *
1240 * @return 0 on success. otherwise on failure.
1241 */
1242 int al_eth_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
1243 struct al_eth_fwd_vid_table_entry *entry);
1244
1245
1246 /**
1247 * Configure default UDMA register
1248 * When the control table entry udma selection set to AL_ETH_CTRL_TABLE_UDMA_SEL_REG<n>,
1249 * then the target UDMA will be set according to the register n of the default
1250 * UDMA registers.
1251 *
1252 * @param adapter pointer to the private structure
1253 * @param idx the index of the default register.
1254 * @param udma_mask the value of the register.
1255 *
1256 * @return 0 on success. otherwise on failure.
1257 */
1258 int al_eth_fwd_default_udma_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
1259 uint8_t udma_mask);
1260
1261 /**
1262 * Configure default queue register
1263 * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG<n>,
1264 * then the target queue will be set according to the register n of the default
1265 * queue registers.
1266 *
1267 * @param adapter pointer to the private structure
1268 * @param idx the index of the default register.
1269 * @param qid the value of the register.
1270 *
1271 * @return 0 on success. otherwise on failure.
1272 */
1273 int al_eth_fwd_default_queue_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
1274 uint8_t qid);
1275
1276 /**
1277 * Configure default priority register
1278 * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_PRIO_SEL_1_REG<n>,
1279 * then the target priority will be set according to the register n of the default
1280 * priority registers.
1281 *
1282 * @param adapter pointer to the private structure
1283 * @param idx the index of the default register.
1284 * @param prio the value of the register.
1285 *
1286 * @return 0 on success. otherwise on failure.
1287 */
1288 int al_eth_fwd_default_priority_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
1289 uint8_t prio);
1290
1291
1292
1293 /* filter undetected MAC DA */
1294 #define AL_ETH_RFW_FILTER_UNDET_MAC (1 << 0)
1295 /* filter specific MAC DA based on MAC table output */
1296 #define AL_ETH_RFW_FILTER_DET_MAC (1 << 1)
1297 /* filter all tagged */
1298 #define AL_ETH_RFW_FILTER_TAGGED (1 << 2)
1299 /* filter all untagged */
1300 #define AL_ETH_RFW_FILTER_UNTAGGED (1 << 3)
1301 /* filter all broadcast */
1302 #define AL_ETH_RFW_FILTER_BC (1 << 4)
1303 /* filter all multicast */
1304 #define AL_ETH_RFW_FILTER_MC (1 << 5)
1305 /* filter packet based on parser drop */
1306 #define AL_ETH_RFW_FILTER_PARSE (1 << 6)
1307 /* filter packet based on VLAN table output */
1308 #define AL_ETH_RFW_FILTER_VLAN_VID (1 << 7)
1309 /* filter packet based on control table output */
1310 #define AL_ETH_RFW_FILTER_CTRL_TABLE (1 << 8)
1311 /* filter packet based on protocol index */
1312 #define AL_ETH_RFW_FILTER_PROT_INDEX (1 << 9)
1313 /* filter packet based on WoL decision */
1314 #define AL_ETH_RFW_FILTER_WOL (1 << 10)
1315
1316
1317 struct al_eth_filter_params {
1318 al_bool enable;
1319 uint32_t filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to enable */
1320 al_bool filter_proto[AL_ETH_PROTOCOLS_NUM]; /**< set AL_TRUE for protocols to filter */
1321 };
1322
1323 struct al_eth_filter_override_params {
1324 uint32_t filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to override */
1325 uint8_t udma; /**< target udma id */
1326 uint8_t qid; /**< target queue id */
1327 };
1328
1329 /**
1330 * Configure the receive filters
1331 * this function enables/disables filtering packets and which filtering
1332 * types to apply.
1333 * filters that indicated in tables (MAC table, VLAN and Control tables)
1334 * are not configured by this function. This functions only enables/disables
1335 * respecting the filter indication from those tables.
1336 *
1337 * @param adapter pointer to the private structure
1338 * @param params the parameters passed from upper layer
1339 *
1340 * @return 0 on success. otherwise on failure.
1341 */
1342 int al_eth_filter_config(struct al_hal_eth_adapter *adapter, struct al_eth_filter_params *params);
1343
1344 /**
1345 * Configure the receive override filters
1346 * This function controls whither to force forwarding filtered packets
1347 * to a specific UDMA/queue. The override filters apply only for
1348 * filters that enabled by al_eth_filter_config().
1349 *
1350 * @param adapter pointer to the private structure
1351 * @param params override config parameters
1352 *
1353 * @return 0 on success. otherwise on failure.
1354 */
1355 int al_eth_filter_override_config(struct al_hal_eth_adapter *adapter,
1356 struct al_eth_filter_override_params *params);
1357
1358
1359 int al_eth_switching_config_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t forward_all_to_mac, uint8_t enable_int_switching,
1360 enum al_eth_tx_switch_vid_sel_type vid_sel_type,
1361 enum al_eth_tx_switch_dec_type uc_dec,
1362 enum al_eth_tx_switch_dec_type mc_dec,
1363 enum al_eth_tx_switch_dec_type bc_dec);
1364 int al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t udma_uc_bitmask,
1365 uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask);
1366 int al_eth_flow_control_config(struct al_hal_eth_adapter *adapter, struct al_eth_flow_control_params *params);
1367
1368 struct al_eth_eee_params{
1369 uint8_t enable;
1370 uint32_t tx_eee_timer; /**< time in cycles the interface delays prior to entering eee state */
1371 uint32_t min_interval; /**< minimum interval in cycles between two eee states */
1372 uint32_t stop_cnt; /**< time in cycles to stop Tx mac i/f after getting out of eee state */
1373 al_bool fast_wake; /**< fast_wake is only applicable to 40/50G, otherwise the mode is deep_sleep */
1374 };
1375
1376 /**
1377 * configure EEE mode
1378 * @param adapter pointer to the private structure.
1379 * @param params pointer to the eee input parameters.
1380 *
1381 * @return return 0 on success. otherwise on failure.
1382 */
1383 int al_eth_eee_config(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params);
1384
1385 /**
1386 * get EEE configuration
1387 * @param adapter pointer to the private structure.
1388 * @param params pointer to the eee output parameters.
1389 *
1390 * @return return 0 on success. otherwise on failure.
1391 */
1392 int al_eth_eee_get(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params);
1393
1394 int al_eth_vlan_mod_config(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint16_t udma_etype, uint16_t vlan1_data, uint16_t vlan2_data);
1395
1396 /* Timestamp
1397 * This is a generic time-stamp mechanism that can be used as generic to
1398 * time-stamp every received or transmit packet it can also support IEEE 1588v2
1399 * PTP time synchronization protocol.
1400 * In addition to time-stamp, an internal system time is maintained. For
1401 * further accuracy, the chip support transmit/receive clock synchronization
1402 * including recovery of master clock from one of the ports and distributing it
1403 * to the rest of the ports - that is outside the scope of the Ethernet
1404 * Controller - please refer to Annapurna Labs Alpine Hardware Wiki
1405 */
1406
1407 /* Timestamp management APIs */
1408
1409 /**
1410 * prepare the adapter for timestamping packets.
1411 * Rx timestamps requires using 8 words (8x4 bytes) rx completion descriptor
1412 * size as the timestamp value added into word 4.
1413 *
1414 * This function should be called after al_eth_mac_config() and before
1415 * enabling the queues.
1416 * @param adapter pointer to the private structure.
1417 * @return 0 on success. otherwise on failure.
1418 */
1419 int al_eth_ts_init(struct al_hal_eth_adapter *adapter);
1420
1421 /* Timestamp data path APIs */
1422
1423 /*
1424 * This is the size of the on-chip array that keeps the time-stamp of the
1425 * latest transmitted packets
1426 */
1427 #define AL_ETH_PTH_TX_SAMPLES_NUM 16
1428
1429 /**
1430 * read Timestamp sample value of previously transmitted packet.
1431 *
1432 * The adapter includes AL_ETH_PTH_TX_SAMPLES_NUM timestamp samples for tx
1433 * packets, those samples shared for all the UDMAs and queues. the al_eth_pkt
1434 * data structure includes the index of which sample to use for the packet
1435 * to transmit. It's the caller's responsibility to manage those samples,
1436 * for example, when using an index, the caller must make sure the packet
1437 * is completed and the tx time is sampled before using that index for
1438 * another packet.
1439 *
1440 * This function should be called after the completion indication of the
1441 * tx packet. however, there is a little chance that the timestamp sample
1442 * won't be updated yet, thus this function must be called again when it
1443 * returns -EAGAIN.
1444 * @param adapter pointer to the private structure.
1445 * @param ts_index the index (out of 16) of the timestamp register
1446 * @param timestamp the timestamp value in 2^18 femtoseconds resolution.
1447 * @return -EAGAIN if the sample was not updated yet. 0 when the sample
1448 * was updated and no errors found.
1449 */
1450 int al_eth_tx_ts_val_get(struct al_hal_eth_adapter *adapter, uint8_t ts_index,
1451 uint32_t *timestamp);
1452
1453 /* Timestamp PTH (PTP Timestamp Handler) control and times management */
1454 /** structure for describing PTH epoch time */
1455 struct al_eth_pth_time {
1456 uint32_t seconds; /**< seconds */
1457 uint64_t femto; /**< femto seconds */
1458 };
1459
1460 /**
1461 * Read the systime value
1462 * This API should not be used to get the timestamp of packets.
1463 * The HW maintains 50 bits for the sub-seconds portion in femto resolution,
1464 * but this function reads only the 32 MSB bits since the LSB provides
1465 * sub-nanoseconds accuracy, which is not needed.
1466 * @param adapter pointer to the private structure.
1467 * @param systime pointer to structure where the time will be stored.
1468 * @return 0 on success. otherwise on failure.
1469 */
1470 int al_eth_pth_systime_read(struct al_hal_eth_adapter *adapter,
1471 struct al_eth_pth_time *systime);
1472
1473 /**
1474 * Set the clock period to a given value.
1475 * The systime will be incremented by this value on each posedge of the
1476 * adapters internal clock which driven by the SouthBridge clock.
1477 * @param adapter pointer to the private structure.
1478 * @param clk_period the clock period in femto seconds.
1479 * @return 0 on success. otherwise on failure.
1480 */
1481 int al_eth_pth_clk_period_write(struct al_hal_eth_adapter *adapter,
1482 uint64_t clk_period);
1483
1484 /**< enum for methods when updating systime using triggers */
1485 enum al_eth_pth_update_method {
1486 AL_ETH_PTH_UPDATE_METHOD_SET = 0, /**< Set the time in int/ext update time */
1487 AL_ETH_PTH_UPDATE_METHOD_INC = 1, /**< increment */
1488 AL_ETH_PTH_UPDATE_METHOD_DEC = 2, /**< decrement */
1489 AL_ETH_PTH_UPDATE_METHOD_ADD_TO_LAST = 3, /**< Set to last time + int/ext update time.*/
1490 };
1491
1492 /**< systime internal update trigger types */
1493 enum al_eth_pth_int_trig {
1494 AL_ETH_PTH_INT_TRIG_OUT_PULSE_0 = 0, /**< use output pulse as trigger */
1495 AL_ETH_PTH_INT_TRIG_REG_WRITE = 1, /**< use the int update register
1496 * write as a trigger
1497 */
1498 };
1499
1500 /**< parameters for internal trigger update */
1501 struct al_eth_pth_int_update_params {
1502 al_bool enable; /**< enable internal trigger update */
1503 enum al_eth_pth_update_method method; /**< internal trigger update
1504 * method
1505 */
1506 enum al_eth_pth_int_trig trigger; /**< which internal trigger to
1507 * use
1508 */
1509 };
1510
1511 /**
1512 * Configure the systime internal update
1513 *
1514 * @param adapter pointer to the private structure.
1515 * @param params the configuration of the internal update.
1516 * @return 0 on success. otherwise on failure.
1517 */
1518 int al_eth_pth_int_update_config(struct al_hal_eth_adapter *adapter,
1519 struct al_eth_pth_int_update_params *params);
1520
1521 /**
1522 * set internal update time
1523 *
1524 * The update time used when updating the systime with
1525 * internal update method.
1526 *
1527 * @param adapter pointer to the private structure.
1528 * @param time the internal update time value
1529 * @return 0 on success. otherwise on failure.
1530 */
1531 int al_eth_pth_int_update_time_set(struct al_hal_eth_adapter *adapter,
1532 struct al_eth_pth_time *time);
1533
1534 /**< parameters for external trigger update */
1535 struct al_eth_pth_ext_update_params {
1536 uint8_t triggers; /**< bitmask of external triggers to enable */
1537 enum al_eth_pth_update_method method; /**< external trigger update
1538 * method
1539 */
1540 };
1541
1542 /**
1543 * Configure the systime external update.
1544 * external update triggered by external signals such as GPIO or pulses
1545 * from other eth controllers on the SoC.
1546 *
1547 * @param adapter pointer to the private structure.
1548 * @param params the configuration of the external update.
1549 * @return 0 on success. otherwise on failure.
1550 */
1551 int al_eth_pth_ext_update_config(struct al_hal_eth_adapter *adapter,
1552 struct al_eth_pth_ext_update_params *params);
1553
1554 /**
1555 * set external update time
1556 *
1557 * The update time used when updating the systime with
1558 * external update method.
1559 * @param adapter pointer to the private structure.
1560 * @param time the external update time value
1561 * @return 0 on success. otherwise on failure.
1562 */
1563 int al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter *adapter,
1564 struct al_eth_pth_time *time);
1565 /**
1566 * set the read compensation delay
1567 *
1568 * When reading the systime, the HW adds this value to compensate
1569 * read latency.
1570 *
1571 * @param adapter pointer to the private structure.
1572 * @param subseconds the read latency delay in femto seconds.
1573 * @return 0 on success. otherwise on failure.
1574 */
1575 int al_eth_pth_read_compensation_set(struct al_hal_eth_adapter *adapter,
1576 uint64_t subseconds);
1577 /**
1578 * set the internal write compensation delay
1579 *
1580 * When updating the systime due to an internal trigger's event, the HW adds
1581 * this value to compensate latency.
1582 *
1583 * @param adapter pointer to the private structure.
1584 * @param subseconds the write latency delay in femto seconds.
1585 * @return 0 on success. otherwise on failure.
1586 */
1587 int al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter *adapter,
1588 uint64_t subseconds);
1589
1590 /**
1591 * set the external write compensation delay
1592 *
1593 * When updating the systime due to an external trigger's event, the HW adds
1594 * this value to compensate pulse propagation latency.
1595 *
1596 * @param adapter pointer to the private structure.
1597 * @param subseconds the write latency delay in femto seconds.
1598 * @return 0 on success. otherwise on failure.
1599 */
1600 int al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter *adapter,
1601 uint64_t subseconds);
1602
1603 /**
1604 * set the sync compensation delay
1605 *
1606 * When the adapter passes systime from PTH to MAC to do the packets
1607 * timestamping, the sync compensation delay is added to systime value to
1608 * compensate the latency between the PTH and the MAC.
1609 *
1610 * @param adapter pointer to the private structure.
1611 * @param subseconds the sync latency delay in femto seconds.
1612 * @return 0 on success. otherwise on failure.
1613 */
1614 int al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter *adapter,
1615 uint64_t subseconds);
1616
1617 #define AL_ETH_PTH_PULSE_OUT_NUM 8
1618 struct al_eth_pth_pulse_out_params {
1619 uint8_t index; /**< id of the pulse (0..7) */
1620 al_bool enable;
1621 al_bool periodic; /**< when true, generate periodic pulse (PPS) */
1622 uint8_t period_sec; /**< for periodic pulse, this is seconds
1623 * portion of the period time
1624 */
1625 uint32_t period_us; /**< this is microseconds portion of the
1626 * period
1627 */
1628 struct al_eth_pth_time start_time; /**< when to start pulse triggering */
1629 uint64_t pulse_width; /**< pulse width in femto seconds */
1630 };
1631
1632 /**
1633 * Configure an output pulse
1634 * This function configures an output pulse coming from the internal System
1635 * Time. This is typically a 1Hhz pulse that is used to synchronize the
1636 * rest of the components of the system. This API configure the Ethernet
1637 * Controller pulse. An additional set up is required to configure the chip
1638 * General Purpose I/O (GPIO) to enable the chip output pin.
1639 *
1640 * @param adapter pointer to the private structure.
1641 * @param params output pulse configuration.
1642 * @return 0 on success. otherwise on failure.
1643 */
1644 int al_eth_pth_pulse_out_config(struct al_hal_eth_adapter *adapter,
1645 struct al_eth_pth_pulse_out_params *params);
1646
1647 /* link */
1648 struct al_eth_link_status {
1649 al_bool link_up;
1650 al_bool local_fault;
1651 al_bool remote_fault;
1652 };
1653
1654 /**
1655 * get link status
1656 *
1657 * this function should be used when no external phy is used to get
1658 * information about the link
1659 *
1660 * @param adapter pointer to the private structure.
1661 * @param status pointer to struct where to set link information
1662 *
1663 * @return return 0 on success. otherwise on failure.
1664 */
1665 int al_eth_link_status_get(struct al_hal_eth_adapter *adapter,
1666 struct al_eth_link_status *status);
1667
1668 /**
1669 * clear link status
1670 *
1671 * this function clear latched status of the link.
1672 *
1673 * @param adapter pointer to the private structure.
1674 *
1675 * @return return 0 if supported.
1676 */
1677 int al_eth_link_status_clear(struct al_hal_eth_adapter *adapter);
1678
1679 /**
1680 * Set LEDs to represent link status.
1681 *
1682 * @param adapter pointer to the private structure.
1683 * @param link_is_up boolean indicating current link status.
1684 * In case link is down the leds will be turned off.
1685 * In case link is up the leds will be turned on, that means
1686 * leds will be blinking on traffic and will be constantly lighting
1687 * on inactive link
1688 * @return return 0 on success. otherwise on failure.
1689 */
1690 int al_eth_led_set(struct al_hal_eth_adapter *adapter, al_bool link_is_up);
1691
1692 /* get statistics */
1693
1694 struct al_eth_mac_stats{
1695 /* sum the data and padding octets (i.e. without header and FCS) received with a valid frame. */
1696 uint64_t aOctetsReceivedOK;
1697 /* sum of Payload and padding octets of frames transmitted without error*/
1698 uint64_t aOctetsTransmittedOK;
1699 /* total number of packets received. Good and bad packets */
1700 uint32_t etherStatsPkts;
1701 /* number of received unicast packets */
1702 uint32_t ifInUcastPkts;
1703 /* number of received multicast packets */
1704 uint32_t ifInMulticastPkts;
1705 /* number of received broadcast packets */
1706 uint32_t ifInBroadcastPkts;
1707 /* Number of frames received with FIFO Overflow, CRC, Payload Length, Jabber and Oversized, Alignment or PHY/PCS error indication */
1708 uint32_t ifInErrors;
1709
1710 /* number of transmitted unicast packets */
1711 uint32_t ifOutUcastPkts;
1712 /* number of transmitted multicast packets */
1713 uint32_t ifOutMulticastPkts;
1714 /* number of transmitted broadcast packets */
1715 uint32_t ifOutBroadcastPkts;
1716 /* number of frames transmitted with FIFO Overflow, FIFO Underflow or Controller indicated error */
1717 uint32_t ifOutErrors;
1718
1719 /* number of Frame received without error (Including Pause Frames). */
1720 uint32_t aFramesReceivedOK;
1721 /* number of Frames transmitter without error (Including Pause Frames) */
1722 uint32_t aFramesTransmittedOK;
1723 /* number of packets received with less than 64 octets */
1724 uint32_t etherStatsUndersizePkts;
1725 /* Too short frames with CRC error, available only for RGMII and 1G Serial modes */
1726 uint32_t etherStatsFragments;
1727 /* Too long frames with CRC error */
1728 uint32_t etherStatsJabbers;
1729 /* packet that exceeds the valid maximum programmed frame length */
1730 uint32_t etherStatsOversizePkts;
1731 /* number of frames received with a CRC error */
1732 uint32_t aFrameCheckSequenceErrors;
1733 /* number of frames received with alignment error */
1734 uint32_t aAlignmentErrors;
1735 /* number of dropped packets due to FIFO overflow */
1736 uint32_t etherStatsDropEvents;
1737 /* number of transmitted pause frames. */
1738 uint32_t aPAUSEMACCtrlFramesTransmitted;
1739 /* number of received pause frames. */
1740 uint32_t aPAUSEMACCtrlFramesReceived;
1741 /* frame received exceeded the maximum length programmed with register FRM_LGTH, available only for 10G modes */
1742 uint32_t aFrameTooLongErrors;
1743 /* received frame with bad length/type (between 46 and 0x600 or less
1744 * than 46 for packets longer than 64), available only for 10G modes */
1745 uint32_t aInRangeLengthErrors;
1746 /* Valid VLAN tagged frames transmitted */
1747 uint32_t VLANTransmittedOK;
1748 /* Valid VLAN tagged frames received */
1749 uint32_t VLANReceivedOK;
1750 /* Total number of octets received. Good and bad packets */
1751 uint32_t etherStatsOctets;
1752
1753 /* packets of 64 octets length is received (good and bad frames are counted) */
1754 uint32_t etherStatsPkts64Octets;
1755 /* Frames (good and bad) with 65 to 127 octets */
1756 uint32_t etherStatsPkts65to127Octets;
1757 /* Frames (good and bad) with 128 to 255 octets */
1758 uint32_t etherStatsPkts128to255Octets;
1759 /* Frames (good and bad) with 256 to 511 octets */
1760 uint32_t etherStatsPkts256to511Octets;
1761 /* Frames (good and bad) with 512 to 1023 octets */
1762 uint32_t etherStatsPkts512to1023Octets;
1763 /* Frames (good and bad) with 1024 to 1518 octets */
1764 uint32_t etherStatsPkts1024to1518Octets;
1765 /* frames with 1519 bytes to the maximum length programmed in the register FRAME_LENGTH. */
1766 uint32_t etherStatsPkts1519toX;
1767
1768 uint32_t eee_in;
1769 uint32_t eee_out;
1770 };
1771
1772 /**
1773 * get mac statistics
1774 * @param adapter pointer to the private structure.
1775 * @param stats pointer to structure that will be filled with statistics.
1776 *
1777 * @return return 0 on success. otherwise on failure.
1778 */
1779 int al_eth_mac_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_mac_stats *stats);
1780
1781 struct al_eth_ec_stats{
1782 /* Rx Frequency adjust FIFO input packets */
1783 uint32_t faf_in_rx_pkt;
1784 /* Rx Frequency adjust FIFO input short error packets */
1785 uint32_t faf_in_rx_short;
1786 /* Rx Frequency adjust FIFO input long error packets */
1787 uint32_t faf_in_rx_long;
1788 /* Rx Frequency adjust FIFO output packets */
1789 uint32_t faf_out_rx_pkt;
1790 /* Rx Frequency adjust FIFO output short error packets */
1791 uint32_t faf_out_rx_short;
1792 /* Rx Frequency adjust FIFO output long error packets */
1793 uint32_t faf_out_rx_long;
1794 /* Rx Frequency adjust FIFO output drop packets */
1795 uint32_t faf_out_drop;
1796 /* Number of packets written into the Rx FIFO (without FIFO error indication) */
1797 uint32_t rxf_in_rx_pkt;
1798 /* Number of error packets written into the Rx FIFO (with FIFO error indication, */
1799 /* FIFO full indication during packet reception) */
1800 uint32_t rxf_in_fifo_err;
1801 /* Number of packets read from Rx FIFO 1 */
1802 uint32_t lbf_in_rx_pkt;
1803 /* Number of packets read from Rx FIFO 2 (loopback FIFO) */
1804 uint32_t lbf_in_fifo_err;
1805 /* Rx FIFO output drop packets from FIFO 1 */
1806 uint32_t rxf_out_rx_1_pkt;
1807 /* Rx FIFO output drop packets from FIFO 2 (loop back) */
1808 uint32_t rxf_out_rx_2_pkt;
1809 /* Rx FIFO output drop packets from FIFO 1 */
1810 uint32_t rxf_out_drop_1_pkt;
1811 /* Rx FIFO output drop packets from FIFO 2 (loop back) */
1812 uint32_t rxf_out_drop_2_pkt;
1813 /* Rx Parser 1, input packet counter */
1814 uint32_t rpe_1_in_rx_pkt;
1815 /* Rx Parser 1, output packet counter */
1816 uint32_t rpe_1_out_rx_pkt;
1817 /* Rx Parser 2, input packet counter */
1818 uint32_t rpe_2_in_rx_pkt;
1819 /* Rx Parser 2, output packet counter */
1820 uint32_t rpe_2_out_rx_pkt;
1821 /* Rx Parser 3 (MACsec), input packet counter */
1822 uint32_t rpe_3_in_rx_pkt;
1823 /* Rx Parser 3 (MACsec), output packet counter */
1824 uint32_t rpe_3_out_rx_pkt;
1825 /* Tx parser, input packet counter */
1826 uint32_t tpe_in_tx_pkt;
1827 /* Tx parser, output packet counter */
1828 uint32_t tpe_out_tx_pkt;
1829 /* Tx packet modification, input packet counter */
1830 uint32_t tpm_tx_pkt;
1831 /* Tx forwarding input packet counter */
1832 uint32_t tfw_in_tx_pkt;
1833 /* Tx forwarding input packet counter */
1834 uint32_t tfw_out_tx_pkt;
1835 /* Rx forwarding input packet counter */
1836 uint32_t rfw_in_rx_pkt;
1837 /* Rx Forwarding, packet with VLAN command drop indication */
1838 uint32_t rfw_in_vlan_drop;
1839 /* Rx Forwarding, packets with parse drop indication */
1840 uint32_t rfw_in_parse_drop;
1841 /* Rx Forwarding, multicast packets */
1842 uint32_t rfw_in_mc;
1843 /* Rx Forwarding, broadcast packets */
1844 uint32_t rfw_in_bc;
1845 /* Rx Forwarding, tagged packets */
1846 uint32_t rfw_in_vlan_exist;
1847 /* Rx Forwarding, untagged packets */
1848 uint32_t rfw_in_vlan_nexist;
1849 /* Rx Forwarding, packets with MAC address drop indication (from the MAC address table) */
1850 uint32_t rfw_in_mac_drop;
1851 /* Rx Forwarding, packets with undetected MAC address */
1852 uint32_t rfw_in_mac_ndet_drop;
1853 /* Rx Forwarding, packets with drop indication from the control table */
1854 uint32_t rfw_in_ctrl_drop;
1855 /* Rx Forwarding, packets with L3_protocol_index drop indication */
1856 uint32_t rfw_in_prot_i_drop;
1857 /* EEE, number of times the system went into EEE state */
1858 uint32_t eee_in;
1859 };
1860
1861 /**
1862 * get ec statistics
1863 * @param adapter pointer to the private structure.
1864 * @param stats pointer to structure that will be filled with statistics.
1865 *
1866 * @return return 0 on success. otherwise on failure.
1867 */
1868 int al_eth_ec_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_ec_stats *stats);
1869
1870 struct al_eth_ec_stat_udma{
1871 /* Rx forwarding output packet counter */
1872 uint32_t rfw_out_rx_pkt;
1873 /* Rx forwarding output drop packet counter */
1874 uint32_t rfw_out_drop;
1875 /* Multi-stream write, number of Rx packets */
1876 uint32_t msw_in_rx_pkt;
1877 /* Multi-stream write, number of dropped packets at SOP, Q full indication */
1878 uint32_t msw_drop_q_full;
1879 /* Multi-stream write, number of dropped packets at SOP */
1880 uint32_t msw_drop_sop;
1881 /* Multi-stream write, number of dropped packets at EOP, */
1882 /*EOP was written with error indication (not all packet data was written) */
1883 uint32_t msw_drop_eop;
1884 /* Multi-stream write, number of packets written to the stream FIFO with EOP and without packet loss */
1885 uint32_t msw_wr_eop;
1886 /* Multi-stream write, number of packets read from the FIFO into the stream */
1887 uint32_t msw_out_rx_pkt;
1888 /* Number of transmitted packets without TSO enabled */
1889 uint32_t tso_no_tso_pkt;
1890 /* Number of transmitted packets with TSO enabled */
1891 uint32_t tso_tso_pkt;
1892 /* Number of TSO segments that were generated */
1893 uint32_t tso_seg_pkt;
1894 /* Number of TSO segments that required padding */
1895 uint32_t tso_pad_pkt;
1896 /* Tx Packet modification, MAC SA spoof error */
1897 uint32_t tpm_tx_spoof;
1898 /* Tx MAC interface, input packet counter */
1899 uint32_t tmi_in_tx_pkt;
1900 /* Tx MAC interface, number of packets forwarded to the MAC */
1901 uint32_t tmi_out_to_mac;
1902 /* Tx MAC interface, number of packets forwarded to the Rx data path */
1903 uint32_t tmi_out_to_rx;
1904 /* Tx MAC interface, number of transmitted bytes */
1905 uint32_t tx_q0_bytes;
1906 /* Tx MAC interface, number of transmitted bytes */
1907 uint32_t tx_q1_bytes;
1908 /* Tx MAC interface, number of transmitted bytes */
1909 uint32_t tx_q2_bytes;
1910 /* Tx MAC interface, number of transmitted bytes */
1911 uint32_t tx_q3_bytes;
1912 /* Tx MAC interface, number of transmitted packets */
1913 uint32_t tx_q0_pkts;
1914 /* Tx MAC interface, number of transmitted packets */
1915 uint32_t tx_q1_pkts;
1916 /* Tx MAC interface, number of transmitted packets */
1917 uint32_t tx_q2_pkts;
1918 /* Tx MAC interface, number of transmitted packets */
1919 uint32_t tx_q3_pkts;
1920 };
1921
1922 /**
1923 * get per_udma statistics
1924 * @param adapter pointer to the private structure.
1925 * @param idx udma_id value
1926 * @param stats pointer to structure that will be filled with statistics.
1927 *
1928 * @return return 0 on success. otherwise on failure.
1929 */
1930 int al_eth_ec_stat_udma_get(struct al_hal_eth_adapter *adapter, uint8_t idx, struct al_eth_ec_stat_udma *stats);
1931
1932 /* trafic control */
1933
1934 /**
1935 * perform Function Level Reset RMN
1936 *
1937 * Addressing RMN: 714
1938 *
1939 * @param pci_read_config_u32 pointer to function that reads register from pci header
1940 * @param pci_write_config_u32 pointer to function that writes register from pci header
1941 * @param handle pointer passes to the above functions as first parameter
1942 * @param mac_base base address of the MAC registers
1943 *
1944 * @return 0.
1945 */
1946 int al_eth_flr_rmn(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
1947 int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
1948 void *handle,
1949 void __iomem *mac_base);
1950
1951 /**
1952 * perform Function Level Reset RMN but restore registers that contain board specific data
1953 *
1954 * the data that save and restored is the board params and mac addresses
1955 *
1956 * @param pci_read_config_u32 pointer to function that reads register from pci header
1957 * @param pci_write_config_u32 pointer to function that writes register from pci header
1958 * @param handle pointer passes to the above functions as first parameter
1959 * @param mac_base base address of the MAC registers
1960 * @param ec_base base address of the Ethernet Controller registers
1961 * @param mac_addresses_num number of mac addresses to restore
1962 *
1963 * @return 0.
1964 */
1965 int al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
1966 int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
1967 void *handle,
1968 void __iomem *mac_base,
1969 void __iomem *ec_base,
1970 int mac_addresses_num);
1971
1972 /* board specific information (media type, phy address, etc.. */
1973
1974
1975 enum al_eth_board_media_type {
1976 AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT = 0,
1977 AL_ETH_BOARD_MEDIA_TYPE_RGMII = 1,
1978 AL_ETH_BOARD_MEDIA_TYPE_10GBASE_SR = 2,
1979 AL_ETH_BOARD_MEDIA_TYPE_SGMII = 3,
1980 AL_ETH_BOARD_MEDIA_TYPE_1000BASE_X = 4,
1981 AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT_AUTO_SPEED = 5,
1982 AL_ETH_BOARD_MEDIA_TYPE_SGMII_2_5G = 6,
1983 AL_ETH_BOARD_MEDIA_TYPE_NBASE_T = 7,
1984 AL_ETH_BOARD_MEDIA_TYPE_25G = 8,
1985 };
1986
1987 enum al_eth_board_mdio_freq {
1988 AL_ETH_BOARD_MDIO_FREQ_2_5_MHZ = 0,
1989 AL_ETH_BOARD_MDIO_FREQ_1_MHZ = 1,
1990 };
1991
1992 enum al_eth_board_ext_phy_if {
1993 AL_ETH_BOARD_PHY_IF_MDIO = 0,
1994 AL_ETH_BOARD_PHY_IF_XMDIO = 1,
1995 AL_ETH_BOARD_PHY_IF_I2C = 2,
1996
1997 };
1998
1999 enum al_eth_board_auto_neg_mode {
2000 AL_ETH_BOARD_AUTONEG_OUT_OF_BAND = 0,
2001 AL_ETH_BOARD_AUTONEG_IN_BAND = 1,
2002
2003 };
2004
2005 /* declare the 1G mac active speed when auto negotiation disabled */
2006 enum al_eth_board_1g_speed {
2007 AL_ETH_BOARD_1G_SPEED_1000M = 0,
2008 AL_ETH_BOARD_1G_SPEED_100M = 1,
2009 AL_ETH_BOARD_1G_SPEED_10M = 2,
2010 };
2011
2012 enum al_eth_retimer_channel {
2013 AL_ETH_RETIMER_CHANNEL_A = 0,
2014 AL_ETH_RETIMER_CHANNEL_B = 1,
2015 AL_ETH_RETIMER_CHANNEL_C = 2,
2016 AL_ETH_RETIMER_CHANNEL_D = 3,
2017 AL_ETH_RETIMER_CHANNEL_E = 4,
2018 AL_ETH_RETIMER_CHANNEL_F = 5,
2019 AL_ETH_RETIMER_CHANNEL_G = 6,
2020 AL_ETH_RETIMER_CHANNEL_H = 7,
2021 AL_ETH_RETIMER_CHANNEL_MAX = 8
2022 };
2023
2024 /* list of supported retimers */
2025 enum al_eth_retimer_type {
2026 AL_ETH_RETIMER_BR_210 = 0,
2027 AL_ETH_RETIMER_BR_410 = 1,
2028 AL_ETH_RETIMER_DS_25 = 2,
2029
2030 AL_ETH_RETIMER_TYPE_MAX = 4,
2031 };
2032
2033 /** structure represents the board information. this info set by boot loader
2034 * and read by OS driver.
2035 */
2036 struct al_eth_board_params {
2037 enum al_eth_board_media_type media_type;
2038 al_bool phy_exist; /**< external phy exist */
2039 uint8_t phy_mdio_addr; /**< mdio address of external phy */
2040 al_bool sfp_plus_module_exist; /**< SFP+ module connected */
2041 al_bool autoneg_enable; /**< enable Auto-Negotiation */
2042 al_bool kr_lt_enable; /**< enable KR Link-Training */
2043 al_bool kr_fec_enable; /**< enable KR FEC */
2044 enum al_eth_board_mdio_freq mdio_freq; /**< MDIO frequency */
2045 uint8_t i2c_adapter_id; /**< identifier for the i2c adapter to use to access SFP+ module */
2046 enum al_eth_board_ext_phy_if phy_if; /**< phy interface */
2047 enum al_eth_board_auto_neg_mode an_mode; /**< auto-negotiation mode (in-band / out-of-band) */
2048 uint8_t serdes_grp; /**< serdes's group id */
2049 uint8_t serdes_lane; /**< serdes's lane id */
2050 enum al_eth_ref_clk_freq ref_clk_freq; /**< reference clock frequency */
2051 al_bool dont_override_serdes; /**< prevent override serdes parameters */
2052 al_bool force_1000_base_x; /**< set mac to 1000 base-x mode (instead sgmii) */
2053 al_bool an_disable; /**< disable auto negotiation */
2054 enum al_eth_board_1g_speed speed; /**< port speed if AN disabled */
2055 al_bool half_duplex; /**< force half duplex if AN disabled */
2056 al_bool fc_disable; /**< disable flow control */
2057 al_bool retimer_exist; /**< retimer is exist on the board */
2058 uint8_t retimer_bus_id; /**< in what i2c bus the retimer is on */
2059 uint8_t retimer_i2c_addr; /**< i2c address of the retimer */
2060 enum al_eth_retimer_channel retimer_channel; /**< what channel connected to this port (Rx) */
2061 al_bool dac; /**< assume direct attached cable is connected if auto detect is off or failed */
2062 uint8_t dac_len; /**< assume this cable length if auto detect is off or failed */
2063 enum al_eth_retimer_type retimer_type; /**< the type of the specific retimer */
2064 enum al_eth_retimer_channel retimer_tx_channel; /**< what channel connected to this port (Tx) */
2065 uint8_t gpio_sfp_present; /**< gpio number of sfp present for this port. 0 if not exist */
2066 };
2067
2068 /**
2069 * set board parameter of the eth port
2070 * this function used to set the board parameters into scratchpad
2071 * registers. those paramters can be read later by OS driver.
2072 *
2073 * @param mac_base the virtual address of the mac registers (PCI BAR 2)
2074 * @param params pointer to structure the includes the paramters
2075 *
2076 * @return 0 on success. otherwise on failure.
2077 */
2078 int al_eth_board_params_set(void * __iomem mac_base, struct al_eth_board_params *params);
2079
2080 /**
2081 * get board parameter of the eth port
2082 * this function used to get the board parameters from scratchpad
2083 * registers.
2084 *
2085 * @param mac_base the virtual address of the mac registers (PCI BAR 2)
2086 * @param params pointer to structure where the parameters will be stored.
2087 *
2088 * @return 0 on success. otherwise on failure.
2089 */
2090 int al_eth_board_params_get(void * __iomem mac_base, struct al_eth_board_params *params);
2091
2092 /*
2093 * Wake-On-Lan (WoL)
2094 *
2095 * The following few functions configure the Wake-On-Lan packet detection
2096 * inside the Integrated Ethernet MAC.
2097 *
2098 * There are other alternative ways to set WoL, such using the
2099 * external 1000Base-T transceiver to set WoL mode.
2100 *
2101 * These APIs do not set the system-wide power-state, nor responsible on the
2102 * transition from Sleep to Normal power state.
2103 *
2104 * For system level considerations, please refer to Annapurna Labs Alpine Wiki.
2105 */
2106 /* Interrupt enable WoL MAC DA Unicast detected packet */
2107 #define AL_ETH_WOL_INT_UNICAST AL_BIT(0)
2108 /* Interrupt enable WoL L2 Multicast detected packet */
2109 #define AL_ETH_WOL_INT_MULTICAST AL_BIT(1)
2110 /* Interrupt enable WoL L2 Broadcast detected packet */
2111 #define AL_ETH_WOL_INT_BROADCAST AL_BIT(2)
2112 /* Interrupt enable WoL IPv4 detected packet */
2113 #define AL_ETH_WOL_INT_IPV4 AL_BIT(3)
2114 /* Interrupt enable WoL IPv6 detected packet */
2115 #define AL_ETH_WOL_INT_IPV6 AL_BIT(4)
2116 /* Interrupt enable WoL EtherType+MAC DA detected packet */
2117 #define AL_ETH_WOL_INT_ETHERTYPE_DA AL_BIT(5)
2118 /* Interrupt enable WoL EtherType+L2 Broadcast detected packet */
2119 #define AL_ETH_WOL_INT_ETHERTYPE_BC AL_BIT(6)
2120 /* Interrupt enable WoL parser detected packet */
2121 #define AL_ETH_WOL_INT_PARSER AL_BIT(7)
2122 /* Interrupt enable WoL magic detected packet */
2123 #define AL_ETH_WOL_INT_MAGIC AL_BIT(8)
2124 /* Interrupt enable WoL magic+password detected packet */
2125 #define AL_ETH_WOL_INT_MAGIC_PSWD AL_BIT(9)
2126
2127 /* Forward enable WoL MAC DA Unicast detected packet */
2128 #define AL_ETH_WOL_FWRD_UNICAST AL_BIT(0)
2129 /* Forward enable WoL L2 Multicast detected packet */
2130 #define AL_ETH_WOL_FWRD_MULTICAST AL_BIT(1)
2131 /* Forward enable WoL L2 Broadcast detected packet */
2132 #define AL_ETH_WOL_FWRD_BROADCAST AL_BIT(2)
2133 /* Forward enable WoL IPv4 detected packet */
2134 #define AL_ETH_WOL_FWRD_IPV4 AL_BIT(3)
2135 /* Forward enable WoL IPv6 detected packet */
2136 #define AL_ETH_WOL_FWRD_IPV6 AL_BIT(4)
2137 /* Forward enable WoL EtherType+MAC DA detected packet */
2138 #define AL_ETH_WOL_FWRD_ETHERTYPE_DA AL_BIT(5)
2139 /* Forward enable WoL EtherType+L2 Broadcast detected packet */
2140 #define AL_ETH_WOL_FWRD_ETHERTYPE_BC AL_BIT(6)
2141 /* Forward enable WoL parser detected packet */
2142 #define AL_ETH_WOL_FWRD_PARSER AL_BIT(7)
2143
2144 struct al_eth_wol_params {
2145 uint8_t *dest_addr; /**< 6 bytes array of destanation address for
2146 magic packet detection */
2147 uint8_t *pswd; /**< 6 bytes array of the password to use */
2148 uint8_t *ipv4; /**< 4 bytes array of the ipv4 to use.
2149 example: for ip = 192.168.1.2
2150 ipv4[0]=2, ipv4[1]=1, ipv4[2]=168, ipv4[3]=192 */
2151 uint8_t *ipv6; /** 16 bytes array of the ipv6 to use.
2152 example: ip = 2607:f0d0:1002:0051:0000:0000:5231:1234
2153 ipv6[0]=34, ipv6[1]=12, ipv6[2]=31 .. */
2154 uint16_t ethr_type1; /**< first ethertype to use */
2155 uint16_t ethr_type2; /**< secound ethertype to use */
2156 uint16_t forward_mask; /**< bitmask of AL_ETH_WOL_FWRD_* of the packet
2157 types needed to be forward. */
2158 uint16_t int_mask; /**< bitmask of AL_ETH_WOL_INT_* of the packet types
2159 that will send interrupt to wake the system. */
2160 };
2161
2162 /**
2163 * enable the wol mechanism
2164 * set what type of packets will wake up the system and what type of packets
2165 * neet to forward after the system is up
2166 *
2167 * beside this function wol filter also need to be set by
2168 * calling al_eth_filter_config with AL_ETH_RFW_FILTER_WOL
2169 *
2170 * @param adapter pointer to the private structure
2171 * @param wol the parameters needed to configure the wol
2172 *
2173 * @return 0 on success. otherwise on failure.
2174 */
2175 int al_eth_wol_enable(
2176 struct al_hal_eth_adapter *adapter,
2177 struct al_eth_wol_params *wol);
2178
2179 /**
2180 * Disable the WoL mechnism.
2181 *
2182 * @param adapter pointer to the private structure
2183 *
2184 * @return 0 on success. otherwise on failure.
2185 */
2186 int al_eth_wol_disable(
2187 struct al_hal_eth_adapter *adapter);
2188
2189 /**
2190 * Configure tx fwd vlan table entry
2191 *
2192 * @param adapter pointer to the private structure
2193 * @param idx the entry index within the vlan table. The HW uses the vlan id
2194 * field of the packet when accessing this table.
2195 * @param udma_mask vlan table value that indicates that the packet should be forward back to
2196 * the udmas, through the Rx path (udma_mask is one-hot representation)
2197 * @param fwd_to_mac vlan table value that indicates that the packet should be forward to mac
2198 *
2199 * @return 0 on success. otherwise on failure.
2200 */
2201 int al_eth_tx_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, al_bool fwd_to_mac);
2202
2203 /** Tx Generic protocol detect Cam compare table entry */
2204 struct al_eth_tx_gpd_cam_entry {
2205 enum AL_ETH_PROTO_ID l3_proto_idx;
2206 enum AL_ETH_PROTO_ID l4_proto_idx;
2207 enum AL_ETH_TX_TUNNEL_MODE tunnel_control;
2208 uint8_t source_vlan_count:2;
2209 uint8_t tx_gpd_cam_ctrl:1;
2210 uint8_t l3_proto_idx_mask:5;
2211 uint8_t l4_proto_idx_mask:5;
2212 uint8_t tunnel_control_mask:3;
2213 uint8_t source_vlan_count_mask:2;
2214 };
2215
2216 /** Rx Generic protocol detect Cam compare table entry */
2217 struct al_eth_rx_gpd_cam_entry {
2218 enum AL_ETH_PROTO_ID outer_l3_proto_idx;
2219 enum AL_ETH_PROTO_ID outer_l4_proto_idx;
2220 enum AL_ETH_PROTO_ID inner_l3_proto_idx;
2221 enum AL_ETH_PROTO_ID inner_l4_proto_idx;
2222 uint8_t parse_ctrl;
2223 uint8_t outer_l3_len;
2224 uint8_t l3_priority;
2225 uint8_t l4_dst_port_lsb;
2226 uint8_t rx_gpd_cam_ctrl:1;
2227 uint8_t outer_l3_proto_idx_mask:5;
2228 uint8_t outer_l4_proto_idx_mask:5;
2229 uint8_t inner_l3_proto_idx_mask:5;
2230 uint8_t inner_l4_proto_idx_mask:5;
2231 uint8_t parse_ctrl_mask;
2232 uint8_t outer_l3_len_mask;
2233 uint8_t l3_priority_mask;
2234 uint8_t l4_dst_port_lsb_mask;
2235 };
2236
2237 enum AL_ETH_TX_GCP_ALU_OPSEL {
2238 AL_ETH_TX_GCP_ALU_L3_OFFSET = 0,
2239 AL_ETH_TX_GCP_ALU_OUTER_L3_OFFSET = 1,
2240 AL_ETH_TX_GCP_ALU_L3_LEN = 2,
2241 AL_ETH_TX_GCP_ALU_OUTER_L3_LEN = 3,
2242 AL_ETH_TX_GCP_ALU_L4_OFFSET = 4,
2243 AL_ETH_TX_GCP_ALU_L4_LEN = 5,
2244 AL_ETH_TX_GCP_ALU_TABLE_VAL = 10
2245 };
2246
2247 enum AL_ETH_RX_GCP_ALU_OPSEL {
2248 AL_ETH_RX_GCP_ALU_OUTER_L3_OFFSET = 0,
2249 AL_ETH_RX_GCP_ALU_INNER_L3_OFFSET = 1,
2250 AL_ETH_RX_GCP_ALU_OUTER_L4_OFFSET = 2,
2251 AL_ETH_RX_GCP_ALU_INNER_L4_OFFSET = 3,
2252 AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_LAT = 4,
2253 AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_LAT = 5,
2254 AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_SEL = 6,
2255 AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_SEL = 7,
2256 AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_1 = 8,
2257 AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_2 = 9,
2258 AL_ETH_RX_GCP_ALU_TABLE_VAL = 10
2259 };
2260
2261 /** Tx Generic crc prameters table entry */
2262
2263 struct al_eth_tx_gcp_table_entry {
2264 uint8_t poly_sel:1;
2265 uint8_t crc32_bit_comp:1;
2266 uint8_t crc32_bit_swap:1;
2267 uint8_t crc32_byte_swap:1;
2268 uint8_t data_bit_swap:1;
2269 uint8_t data_byte_swap:1;
2270 uint8_t trail_size:4;
2271 uint8_t head_size:8;
2272 uint8_t head_calc:1;
2273 uint8_t mask_polarity:1;
2274 enum AL_ETH_ALU_OPCODE tx_alu_opcode_1;
2275 enum AL_ETH_ALU_OPCODE tx_alu_opcode_2;
2276 enum AL_ETH_ALU_OPCODE tx_alu_opcode_3;
2277 enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_1;
2278 enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_2;
2279 enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_3;
2280 enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_4;
2281 uint32_t gcp_mask[6];
2282 uint32_t crc_init;
2283 uint8_t gcp_table_res:7;
2284 uint16_t alu_val:9;
2285 };
2286
2287 /** Rx Generic crc prameters table entry */
2288
2289 struct al_eth_rx_gcp_table_entry {
2290 uint8_t poly_sel:1;
2291 uint8_t crc32_bit_comp:1;
2292 uint8_t crc32_bit_swap:1;
2293 uint8_t crc32_byte_swap:1;
2294 uint8_t data_bit_swap:1;
2295 uint8_t data_byte_swap:1;
2296 uint8_t trail_size:4;
2297 uint8_t head_size:8;
2298 uint8_t head_calc:1;
2299 uint8_t mask_polarity:1;
2300 enum AL_ETH_ALU_OPCODE rx_alu_opcode_1;
2301 enum AL_ETH_ALU_OPCODE rx_alu_opcode_2;
2302 enum AL_ETH_ALU_OPCODE rx_alu_opcode_3;
2303 enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_1;
2304 enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_2;
2305 enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_3;
2306 enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_4;
2307 uint32_t gcp_mask[6];
2308 uint32_t crc_init;
2309 uint32_t gcp_table_res:27;
2310 uint16_t alu_val:9;
2311 };
2312
2313 /** Tx per_protocol_number crc & l3_checksum & l4_checksum command table entry */
2314
2315 struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry {
2316 al_bool crc_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
2317 al_bool crc_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
2318 al_bool crc_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
2319 al_bool crc_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
2320 al_bool l4_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
2321 al_bool l4_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
2322 al_bool l4_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
2323 al_bool l4_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
2324 al_bool l3_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */
2325 al_bool l3_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */
2326 al_bool l3_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */
2327 al_bool l3_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */
2328 };
2329
2330 /**
2331 * Configure tx_gpd_entry
2332 *
2333 * @param adapter pointer to the private structure
2334 * @param idx the entry index
2335 * @param tx_gpd_entry entry data for the Tx protocol detect Cam compare table
2336 *
2337 * @return 0 on success. otherwise on failure.
2338 *
2339 */
2340 int al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2341 struct al_eth_tx_gpd_cam_entry *tx_gpd_entry);
2342
2343 /**
2344 * Configure tx_gcp_entry
2345 *
2346 * @param adapter pointer to the private structure
2347 * @param idx the entry index
2348 * @param tx_gcp_entry entry data for the Tx Generic crc prameters table
2349 *
2350 * @return 0 on success. otherwise on failure.
2351 *
2352 */
2353 int al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2354 struct al_eth_tx_gcp_table_entry *tx_gcp_entry);
2355
2356 /**
2357 * Configure tx_crc_chksum_replace_cmd_entry
2358 *
2359 * @param adapter pointer to the private structure
2360 * @param idx the entry index
2361 * @param tx_replace_entry entry data for the Tx crc_&_l3_checksum_&_l4_checksum replace command table
2362 *
2363 * @return 0 on success. otherwise on failure.
2364 *
2365 */
2366 int al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2367 struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry *tx_replace_entry);
2368
2369 /**
2370 * Configure rx_gpd_entry
2371 *
2372 * @param adapter pointer to the private structure
2373 * @param idx the entry index
2374 * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table
2375 *
2376 * @return 0 on success. otherwise on failure.
2377 *
2378 */
2379 int al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2380 struct al_eth_rx_gpd_cam_entry *rx_gpd_entry);
2381
2382 /**
2383 * Configure rx_gcp_entry
2384 *
2385 * @param adapter pointer to the private structure
2386 * @param idx the entry index
2387 * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table
2388 * @param rx_gcp_entry entry data for the Tx Generic crc prameters table
2389 *
2390 * @return 0 on success. otherwise on failure.
2391 *
2392 */
2393 int al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
2394 struct al_eth_rx_gcp_table_entry *rx_gcp_entry);
2395
2396 /**
2397 * Configure tx_gpd_table and regs
2398 *
2399 * @param adapter pointer to the private structure
2400 *
2401 */
2402 int al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter);
2403
2404 /**
2405 * Configure crc_chksum_replace_cmd_table
2406 *
2407 * @param adapter pointer to the private structure
2408 *
2409 */
2410 int al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter *adapter);
2411
2412 /**
2413 * Configure tx_gcp_table and regs
2414 *
2415 * @param adapter pointer to the private structure
2416 *
2417 */
2418 int al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter *adapter);
2419
2420 /**
2421 * Configure rx_gpd_table and regs
2422 *
2423 * @param adapter pointer to the private structure
2424 *
2425 */
2426 int al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter);
2427
2428 /**
2429 * Configure rx_gcp_table and regs
2430 *
2431 * @param adapter pointer to the private structure
2432 *
2433 */
2434 int al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter *adapter);
2435
2436 #ifdef __cplusplus
2437 }
2438 #endif
2439 /* *INDENT-ON* */
2440 #endif /* __AL_HAL_ETH_H__ */
2441 /** @} end of Ethernet group */
2442