2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 2003-2012 Broadcom Corporation
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
18 * THIS SOFTWARE IS PROVIDED BY BROADCOM ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
33 #include <sys/types.h>
34 #include <sys/systm.h>
36 #include <mips/nlm/hal/mips-extns.h>
37 #include <mips/nlm/hal/haldefs.h>
38 #include <mips/nlm/hal/iomap.h>
39 #include <mips/nlm/hal/sys.h>
40 #include <mips/nlm/hal/nae.h>
41 #include <mips/nlm/hal/mdio.h>
42 #include <mips/nlm/hal/sgmii.h>
43 #include <mips/nlm/hal/xaui.h>
45 #include <mips/nlm/board.h>
46 #include <mips/nlm/xlp.h>
49 nlm_nae_flush_free_fifo(uint64_t nae_base, int nblocks)
51 uint32_t data, fifo_mask;
53 fifo_mask = (1 << (4 * nblocks)) - 1;
55 nlm_write_nae_reg(nae_base, NAE_RX_FREE_FIFO_POP, fifo_mask);
57 data = nlm_read_nae_reg(nae_base, NAE_RX_FREE_FIFO_POP);
58 } while (data != fifo_mask);
60 nlm_write_nae_reg(nae_base, NAE_RX_FREE_FIFO_POP, 0);
64 nlm_program_nae_parser_seq_fifo(uint64_t nae_base, int maxports,
65 struct nae_port_config *cfg)
68 int start = 0, size, i;
70 for (i = 0; i < maxports; i++) {
71 size = cfg[i].pseq_fifo_size;
72 val = (((size & 0x1fff) << 17) |
73 ((start & 0xfff) << 5) |
75 nlm_write_nae_reg(nae_base, NAE_PARSER_SEQ_FIFO_CFG, val);
81 nlm_setup_rx_cal_cfg(uint64_t nae_base, int total_num_ports,
82 struct nae_port_config *cfg)
84 int rx_slots = 0, port;
85 int cal_len, cal = 0, last_free = 0;
88 for (port = 0; port < total_num_ports; port++) {
89 if (cfg[port].rx_slots_reqd)
90 rx_slots += cfg[port].rx_slots_reqd;
91 if (rx_slots > MAX_CAL_SLOTS) {
92 rx_slots = MAX_CAL_SLOTS;
97 cal_len = rx_slots - 1;
100 if (cal >= MAX_CAL_SLOTS)
103 for (port = 0; port < total_num_ports; port++) {
104 if (cfg[port].rx_slots_reqd > 0) {
105 val = (cal_len << 16) | (port << 8) | cal;
106 nlm_write_nae_reg(nae_base,
107 NAE_RX_IF_SLOT_CAL, val);
109 cfg[port].rx_slots_reqd--;
112 if (last_free == cal)
118 nlm_setup_tx_cal_cfg(uint64_t nae_base, int total_num_ports,
119 struct nae_port_config *cfg)
121 int tx_slots = 0, port;
122 int cal = 0, last_free = 0;
125 for (port = 0; port < total_num_ports; port++) {
126 if (cfg[port].tx_slots_reqd)
127 tx_slots += cfg[port].tx_slots_reqd;
128 if (tx_slots > MAX_CAL_SLOTS) {
129 tx_slots = MAX_CAL_SLOTS;
134 nlm_write_nae_reg(nae_base, NAE_EGR_NIOR_CAL_LEN_REG, tx_slots - 1);
136 if (cal >= MAX_CAL_SLOTS)
139 for (port = 0; port < total_num_ports; port++) {
140 if (cfg[port].tx_slots_reqd > 0) {
141 val = (port << 7) | (cal << 1) | 1;
142 nlm_write_nae_reg(nae_base,
143 NAE_EGR_NIOR_CRDT_CAL_PROG, val);
145 cfg[port].tx_slots_reqd--;
148 if (last_free == cal)
154 nlm_deflate_frin_fifo_carving(uint64_t nae_base, int total_num_ports)
156 const int minimum_size = 8;
160 for (intf = 0; intf < total_num_ports; intf++) {
161 start = minimum_size * intf;
162 value = (minimum_size << 20) | (start << 8) | (intf);
163 nlm_write_nae_reg(nae_base, NAE_FREE_IN_FIFO_CFG, value);
168 nlm_reset_nae(int node)
172 uint64_t nae_pcibase;
177 sysbase = nlm_get_sys_regbase(node);
178 nae_base = nlm_get_nae_regbase(node);
179 nae_pcibase = nlm_get_nae_pcibase(node);
181 bar0 = nlm_read_pci_reg(nae_pcibase, XLP_PCI_CFGREG4);
183 #if BYTE_ORDER == LITTLE_ENDIAN
184 if (nlm_is_xlp8xx_ax()) {
187 val = (bar0 >> 24) & 0xff;
188 bar0 = (val << 24) | (val << 16) | (val << 8) | val;
198 nlm_write_sys_reg(sysbase, SYS_RESET, (1 << reset_bit));
200 /* XXXJC - 1s delay here may be too high */
202 nlm_write_sys_reg(sysbase, SYS_RESET, (0 << reset_bit));
205 rx_config = nlm_read_nae_reg(nae_base, NAE_RX_CONFIG);
206 nlm_write_pci_reg(nae_pcibase, XLP_PCI_CFGREG4, bar0);
210 nlm_setup_poe_class_config(uint64_t nae_base, int max_poe_classes,
211 int num_contexts, int *poe_cl_tbl)
214 int i, max_poe_class_ctxt_tbl_sz;
216 max_poe_class_ctxt_tbl_sz = num_contexts/max_poe_classes;
217 for (i = 0; i < max_poe_class_ctxt_tbl_sz; i++) {
218 val = (poe_cl_tbl[(i/max_poe_classes) & 0x7] << 8) | i;
219 nlm_write_nae_reg(nae_base, NAE_POE_CLASS_SETUP_CFG, val);
224 nlm_setup_vfbid_mapping(uint64_t nae_base)
229 /* 127 is max vfbid */
230 for (vfbid = 127; vfbid >= 0; vfbid--) {
231 dest_vc = nlm_get_vfbid_mapping(vfbid);
234 val = (dest_vc << 16) | (vfbid << 4) | 1;
235 nlm_write_nae_reg(nae_base, NAE_VFBID_DESTMAP_CMD, val);
240 nlm_setup_flow_crc_poly(uint64_t nae_base, uint32_t poly)
242 nlm_write_nae_reg(nae_base, NAE_FLOW_CRC16_POLY_CFG, poly);
246 nlm_setup_iface_fifo_cfg(uint64_t nae_base, int maxports,
247 struct nae_port_config *cfg)
250 int fifo_xoff_thresh = 12;
252 int cur_iface_start = 0;
254 for (i = 0; i < maxports; i++) {
255 size = cfg[i].iface_fifo_size;
256 reg = ((fifo_xoff_thresh << 25) |
257 ((size & 0x1ff) << 16) |
258 ((cur_iface_start & 0xff) << 8) |
260 nlm_write_nae_reg(nae_base, NAE_IFACE_FIFO_CFG, reg);
261 cur_iface_start += size;
266 nlm_setup_rx_base_config(uint64_t nae_base, int maxports,
267 struct nae_port_config *cfg)
274 for (i = 0; i < (maxports/2); i++) {
275 id = 0x12 + i; /* RX_IF_BASE_CONFIG0 */
277 val = (base & 0x3ff);
278 base += cfg[(i * 2)].num_channels;
280 val |= ((base & 0x3ff) << 16);
281 base += cfg[(i * 2) + 1].num_channels;
283 nlm_write_nae_reg(nae_base, NAE_REG(7, 0, id), val);
288 nlm_setup_rx_buf_config(uint64_t nae_base, int maxports,
289 struct nae_port_config *cfg)
296 for (i = 0; i < maxports; i++) {
297 if (cfg[i].type == UNKNOWN)
299 for (k = 0; k < cfg[i].num_channels; k++) {
300 /* write index (context num) */
301 nlm_write_nae_reg(nae_base, NAE_RXBUF_BASE_DPTH_ADDR,
304 /* write value (rx buf sizes) */
305 sz = cfg[i].rxbuf_size;
306 val = 0x80000000 | ((base << 2) & 0x3fff); /* base */
307 val |= (((sz << 2) & 0x3fff) << 16); /* size */
309 nlm_write_nae_reg(nae_base, NAE_RXBUF_BASE_DPTH, val);
310 nlm_write_nae_reg(nae_base, NAE_RXBUF_BASE_DPTH,
314 context += cfg[i].num_channels;
319 nlm_setup_freein_fifo_cfg(uint64_t nae_base, struct nae_port_config *cfg)
323 int start = 0, maxbufpool;
326 maxbufpool = MAX_FREE_FIFO_POOL_8XX;
328 maxbufpool = MAX_FREE_FIFO_POOL_3XX;
329 for (i = 0; i < maxbufpool; i++) {
330 /* Each entry represents 2 descs; hence division by 2 */
331 size = (cfg[i].num_free_descs / 2);
334 reg = ((size & 0x3ff ) << 20) | /* fcSize */
335 ((start & 0x1ff) << 8) | /* fcStart */
338 nlm_write_nae_reg(nae_base, NAE_FREE_IN_FIFO_CFG, reg);
343 /* XXX function name */
345 nlm_get_flow_mask(int num_ports)
347 const int max_bits = 5; /* upto 32 ports */
350 /* Compute the number of bits to needed to
351 * represent all the ports */
352 for (i = 0; i < max_bits; i++) {
353 if (num_ports <= (2 << i))
360 nlm_program_flow_cfg(uint64_t nae_base, int port,
361 uint32_t cur_flow_base, uint32_t flow_mask)
365 val = (cur_flow_base << 16) | port;
366 val |= ((flow_mask & 0x1f) << 8);
367 nlm_write_nae_reg(nae_base, NAE_FLOW_BASEMASK_CFG, val);
371 xlp_ax_nae_lane_reset_txpll(uint64_t nae_base, int block, int lane_ctrl,
374 uint32_t val = 0, saved_data;
377 val = PHY_LANE_CTRL_RST |
378 PHY_LANE_CTRL_PWRDOWN |
379 (mode << PHY_LANE_CTRL_PHYMODE_POS);
381 /* set comma bypass for XAUI */
382 if (mode != PHYMODE_SGMII)
383 val |= PHY_LANE_CTRL_BPC_XAUI;
385 nlm_write_nae_reg(nae_base, NAE_REG(block, PHY, lane_ctrl), val);
387 if (lane_ctrl != 4) {
388 rext_sel = (1 << 23);
389 if (mode != PHYMODE_SGMII)
390 rext_sel |= PHY_LANE_CTRL_BPC_XAUI;
392 val = nlm_read_nae_reg(nae_base,
393 NAE_REG(block, PHY, lane_ctrl));
394 val &= ~PHY_LANE_CTRL_RST;
397 /* Resetting PMA for non-zero lanes */
398 nlm_write_nae_reg(nae_base,
399 NAE_REG(block, PHY, lane_ctrl), val);
401 DELAY(20000); /* 20 ms delay, XXXJC: needed? */
403 val |= PHY_LANE_CTRL_RST;
404 nlm_write_nae_reg(nae_base,
405 NAE_REG(block, PHY, lane_ctrl), val);
410 /* Come out of reset for TXPLL */
411 saved_data = nlm_read_nae_reg(nae_base,
412 NAE_REG(block, PHY, lane_ctrl)) & 0xFFC00000;
414 nlm_write_nae_reg(nae_base,
415 NAE_REG(block, PHY, lane_ctrl),
416 (0x66 << PHY_LANE_CTRL_ADDR_POS)
417 | PHY_LANE_CTRL_CMD_READ
418 | PHY_LANE_CTRL_CMD_START
423 while (((val = nlm_read_nae_reg(nae_base,
424 NAE_REG(block, PHY, lane_ctrl))) &
425 PHY_LANE_CTRL_CMD_PENDING));
428 /* set bit[4] to 0 */
430 nlm_write_nae_reg(nae_base,
431 NAE_REG(block, PHY, lane_ctrl),
432 (0x66 << PHY_LANE_CTRL_ADDR_POS)
433 | PHY_LANE_CTRL_CMD_WRITE
434 | PHY_LANE_CTRL_CMD_START
435 | (0x0 << 19) /* (0x4 << 19) */
441 nlm_write_nae_reg(nae_base,
442 NAE_REG(block, PHY, lane_ctrl),
443 (0x66 << PHY_LANE_CTRL_ADDR_POS)
444 | PHY_LANE_CTRL_CMD_WRITE
445 | PHY_LANE_CTRL_CMD_START
446 | (0x0 << 19) /* (0x4 << 19) */
451 while (!((val = nlm_read_nae_reg(nae_base,
452 NAE_REG(block, PHY, (lane_ctrl - PHY_LANE_0_CTRL)))) &
455 /* Clear the Power Down bit */
456 val = nlm_read_nae_reg(nae_base, NAE_REG(block, PHY, lane_ctrl));
457 val &= ~((1 << 29) | (0x7ffff));
458 nlm_write_nae_reg(nae_base, NAE_REG(block, PHY, lane_ctrl),
463 xlp_nae_lane_reset_txpll(uint64_t nae_base, int block, int lane_ctrl,
470 rext_sel = (1 << 23);
472 val = nlm_read_nae_reg(nae_base,
473 NAE_REG(block, PHY, lane_ctrl));
475 /* set comma bypass for XAUI */
476 if (mode != PHYMODE_SGMII)
477 val |= PHY_LANE_CTRL_BPC_XAUI;
479 val |= (mode << PHY_LANE_CTRL_PHYMODE_POS);
481 nlm_write_nae_reg(nae_base,
482 NAE_REG(block, PHY, lane_ctrl), val);
484 val = nlm_read_nae_reg(nae_base,
485 NAE_REG(block, PHY, lane_ctrl));
487 nlm_write_nae_reg(nae_base,
488 NAE_REG(block, PHY, lane_ctrl), val);
490 /* clear the power down bit */
491 val = nlm_read_nae_reg(nae_base,
492 NAE_REG(block, PHY, lane_ctrl));
493 val &= ~( (1 << 29) | (0x7ffff));
494 nlm_write_nae_reg(nae_base,
495 NAE_REG(block, PHY, lane_ctrl), rext_sel | val);
499 xlp_nae_config_lane_gmac(uint64_t nae_base, int cplx_mask)
501 int block, lane_ctrl;
502 int cplx_lane_enable;
505 cplx_lane_enable = LM_SGMII |
510 /* Lane mode progamming */
515 lane_enable |= cplx_lane_enable;
518 lane_enable |= (cplx_lane_enable << 16);
521 nlm_write_nae_reg(nae_base,
522 NAE_REG(block, LANE_CFG, LANE_CFG_CPLX_0_1),
528 lane_enable |= cplx_lane_enable;
531 lane_enable |= (cplx_lane_enable << 16);
533 nlm_write_nae_reg(nae_base,
534 NAE_REG(block, LANE_CFG, LANE_CFG_CPLX_2_3),
538 /* XXXJC : fix duplicate code */
539 if (cplx_mask & 0x10) {
540 nlm_write_nae_reg(nae_base,
541 NAE_REG(block, LANE_CFG, LANE_CFG_CPLX_4),
542 ((LM_SGMII << 4) | LM_SGMII));
543 for (lane_ctrl = PHY_LANE_0_CTRL;
544 lane_ctrl <= PHY_LANE_1_CTRL; lane_ctrl++) {
545 if (!nlm_is_xlp8xx_ax())
546 xlp_nae_lane_reset_txpll(nae_base,
547 4, lane_ctrl, PHYMODE_SGMII);
549 xlp_ax_nae_lane_reset_txpll(nae_base, 4,
550 lane_ctrl, PHYMODE_SGMII);
554 for (block = 0; block < 4; block++) {
555 if ((cplx_mask & (1 << block)) == 0)
558 for (lane_ctrl = PHY_LANE_0_CTRL;
559 lane_ctrl <= PHY_LANE_3_CTRL; lane_ctrl++) {
560 if (!nlm_is_xlp8xx_ax())
561 xlp_nae_lane_reset_txpll(nae_base,
562 block, lane_ctrl, PHYMODE_SGMII);
564 xlp_ax_nae_lane_reset_txpll(nae_base, block,
565 lane_ctrl, PHYMODE_SGMII);
571 config_egress_fifo_carvings(uint64_t nae_base, int hwport, int start_ctxt,
572 int num_ctxts, int max_ctxts, struct nae_port_config *cfg)
574 static uint32_t cur_start[6] = {0, 0, 0, 0, 0, 0};
576 uint32_t start = 0, size, offset;
579 limit = start_ctxt + num_ctxts;
581 start = cur_start[0];
582 for (i = start_ctxt; i < limit; i++) {
583 size = cfg[hwport].stg2_fifo_size / max_ctxts;
588 if (offset > cfg[hwport].max_stg2_offset)
589 offset = cfg[hwport].max_stg2_offset;
590 data = offset << 23 |
594 nlm_write_nae_reg(nae_base, NAE_STG2_PMEM_PROG, data);
597 cur_start[0] = start;
600 start = cur_start[1];
601 for (i = start_ctxt; i < limit; i++) {
602 size = cfg[hwport].eh_fifo_size / max_ctxts;
607 if (offset > cfg[hwport].max_eh_offset)
608 offset = cfg[hwport].max_eh_offset;
609 data = offset << 23 |
613 nlm_write_nae_reg(nae_base, NAE_EH_PMEM_PROG, data);
616 cur_start[1] = start;
619 start = cur_start[2];
620 for (i = start_ctxt; i < limit; i++) {
621 size = cfg[hwport].frout_fifo_size / max_ctxts;
626 if (offset > cfg[hwport].max_frout_offset)
627 offset = cfg[hwport].max_frout_offset;
628 data = offset << 23 |
632 nlm_write_nae_reg(nae_base, NAE_FREE_PMEM_PROG, data);
635 cur_start[2] = start;
638 start = cur_start[3];
639 for (i = start_ctxt; i < limit; i++) {
640 size = cfg[hwport].ms_fifo_size / max_ctxts;
645 if (offset > cfg[hwport].max_ms_offset)
646 offset = cfg[hwport].max_ms_offset;
647 data = offset << 22 | /* FIXME in PRM */
651 nlm_write_nae_reg(nae_base, NAE_STR_PMEM_CMD, data);
654 cur_start[3] = start;
657 start = cur_start[4];
658 for (i = start_ctxt; i < limit; i++) {
659 size = cfg[hwport].pkt_fifo_size / max_ctxts;
664 if (offset > cfg[hwport].max_pmem_offset)
665 offset = cfg[hwport].max_pmem_offset;
666 nlm_write_nae_reg(nae_base, NAE_TX_PKT_PMEM_CMD1, offset);
671 nlm_write_nae_reg(nae_base, NAE_TX_PKT_PMEM_CMD0, data);
674 cur_start[4] = start;
677 start = cur_start[5];
678 for (i = start_ctxt; i < limit; i++) {
679 size = cfg[hwport].pktlen_fifo_size / max_ctxts;
684 data = offset << 22 |
688 nlm_write_nae_reg(nae_base, NAE_TX_PKTLEN_PMEM_CMD, data);
691 cur_start[5] = start;
695 config_egress_fifo_credits(uint64_t nae_base, int hwport, int start_ctxt,
696 int num_ctxts, int max_ctxts, struct nae_port_config *cfg)
698 uint32_t data, credit, max_credit;
701 limit = start_ctxt + num_ctxts;
702 /* Stage1 -> Stage2 */
703 max_credit = cfg[hwport].max_stg2_offset + 1;
704 for (i = start_ctxt; i < limit; i++) {
705 credit = cfg[hwport].stg1_2_credit / max_ctxts;
706 if (credit > max_credit)
708 data = credit << 16 |
711 nlm_write_nae_reg(nae_base, NAE_STG1_STG2CRDT_CMD, data);
715 max_credit = cfg[hwport].max_eh_offset + 1;
716 for (i = start_ctxt; i < limit; i++) {
717 credit = cfg[hwport].stg2_eh_credit / max_ctxts;
718 if (credit > max_credit)
720 data = credit << 16 |
723 nlm_write_nae_reg(nae_base, NAE_STG2_EHCRDT_CMD, data);
726 /* Stage2 -> Frout */
727 max_credit = cfg[hwport].max_frout_offset + 1;
728 for (i = start_ctxt; i < limit; i++) {
729 credit = cfg[hwport].stg2_frout_credit / max_ctxts;
730 if (credit > max_credit)
732 data = credit << 16 |
735 nlm_write_nae_reg(nae_base, NAE_EH_FREECRDT_CMD, data);
739 max_credit = cfg[hwport].max_ms_offset + 1;
740 for (i = start_ctxt; i < limit; i++) {
741 credit = cfg[hwport].stg2_ms_credit / max_ctxts;
742 if (credit > max_credit)
744 data = credit << 16 |
747 nlm_write_nae_reg(nae_base, NAE_STG2_STRCRDT_CMD, data);
752 nlm_config_freein_fifo_uniq_cfg(uint64_t nae_base, int port,
753 int nblock_free_desc)
758 size_in_clines = (nblock_free_desc / NAE_CACHELINE_SIZE);
759 val = (size_in_clines << 8) | (port & 0x1f);
760 nlm_write_nae_reg(nae_base, NAE_FREEIN_FIFO_UNIQ_SZ_CFG, val);
763 /* XXXJC: redundant, see ucore_spray_config() */
765 nlm_config_ucore_iface_mask_cfg(uint64_t nae_base, int port,
766 int nblock_ucore_mask)
770 val = ( 0x1U << 31) | ((nblock_ucore_mask & 0xffff) << 8) |
772 nlm_write_nae_reg(nae_base, NAE_UCORE_IFACEMASK_CFG, val);
776 nlm_nae_init_netior(uint64_t nae_base, int nblocks)
778 uint32_t ctrl1, ctrl2, ctrl3;
796 printf("WARNING: unsupported blocks %d\n", nblocks);
800 nlm_write_nae_reg(nae_base, NAE_LANE_CFG_SOFTRESET, 0);
801 nlm_write_nae_reg(nae_base, NAE_NETIOR_MISC_CTRL3, ctrl3);
802 nlm_write_nae_reg(nae_base, NAE_NETIOR_MISC_CTRL2, ctrl2);
803 nlm_write_nae_reg(nae_base, NAE_NETIOR_MISC_CTRL1, ctrl1);
804 nlm_write_nae_reg(nae_base, NAE_NETIOR_MISC_CTRL1, 0x0);
809 nlm_nae_init_ingress(uint64_t nae_base, uint32_t desc_size)
812 uint32_t parser_threshold = 384;
814 rx_cfg = nlm_read_nae_reg(nae_base, NAE_RX_CONFIG);
815 rx_cfg &= ~(0x3 << 1); /* reset max message size */
816 rx_cfg &= ~(0xff << 4); /* clear freein desc cluster size */
817 rx_cfg &= ~(0x3f << 24); /* reset rx status mask */ /*XXX: why not 7f */
819 rx_cfg |= 1; /* rx enable */
820 rx_cfg |= (0x0 << 1); /* max message size */
821 rx_cfg |= (0x43 & 0x7f) << 24; /* rx status mask */
822 rx_cfg |= ((desc_size / 64) & 0xff) << 4; /* freein desc cluster size */
823 nlm_write_nae_reg(nae_base, NAE_RX_CONFIG, rx_cfg);
824 nlm_write_nae_reg(nae_base, NAE_PARSER_CONFIG,
825 (parser_threshold & 0x3ff) |
826 (((parser_threshold / desc_size) + 1) & 0xff) << 12 |
827 (((parser_threshold / 64) % desc_size) & 0xff) << 20);
829 /*nlm_write_nae_reg(nae_base, NAE_RX_FREE_FIFO_THRESH, 33);*/
833 nlm_nae_init_egress(uint64_t nae_base)
837 tx_cfg = nlm_read_nae_reg(nae_base, NAE_TX_CONFIG);
838 if (!nlm_is_xlp8xx_ax()) {
839 nlm_write_nae_reg(nae_base, NAE_TX_CONFIG,
841 0x1 | /* tx enable */
843 0x4 | /* tx compatible */
846 nlm_write_nae_reg(nae_base, NAE_TX_CONFIG,
848 0x1 | /* tx enable */
854 ucore_spray_config(uint32_t interface, uint32_t ucore_mask, int cmd)
856 return ((cmd & 0x1) << 31) | ((ucore_mask & 0xffff) << 8) |
861 nlm_nae_init_ucore(uint64_t nae_base, int if_num, u_int ucore_mask)
865 ucfg = ucore_spray_config(if_num, ucore_mask, 1); /* 1 : write */
866 nlm_write_nae_reg(nae_base, NAE_UCORE_IFACEMASK_CFG, ucfg);
870 nae_tx_desc(u_int type, u_int rdex, u_int fbid, u_int len, uint64_t addr)
872 return ((uint64_t)type << 62) |
873 ((uint64_t)rdex << 61) |
874 ((uint64_t)fbid << 54) |
875 ((uint64_t)len << 40) | addr;
879 nlm_setup_l2type(uint64_t nae_base, int hwport, uint32_t l2extlen,
880 uint32_t l2extoff, uint32_t extra_hdrsize, uint32_t proto_offset,
881 uint32_t fixed_hdroff, uint32_t l2proto)
885 val = ((l2extlen & 0x3f) << 26) |
886 ((l2extoff & 0x3f) << 20) |
887 ((extra_hdrsize & 0x3f) << 14) |
888 ((proto_offset & 0x3f) << 8) |
889 ((fixed_hdroff & 0x3f) << 2) |
891 nlm_write_nae_reg(nae_base, (NAE_L2_TYPE_PORT0 + hwport), val);
895 nlm_setup_l3ctable_mask(uint64_t nae_base, int hwport, uint32_t ptmask,
900 val = ((ptmask & 0x1) << 6) |
901 ((l3portmask & 0x1) << 5) |
903 nlm_write_nae_reg(nae_base, NAE_L3_CTABLE_MASK0, val);
907 nlm_setup_l3ctable_even(uint64_t nae_base, int entry, uint32_t l3hdroff,
908 uint32_t ipcsum_en, uint32_t l4protooff,
909 uint32_t l2proto, uint32_t eth_type)
913 val = ((l3hdroff & 0x3f) << 26) |
914 ((l4protooff & 0x3f) << 20) |
915 ((ipcsum_en & 0x1) << 18) |
916 ((l2proto & 0x3) << 16) |
918 nlm_write_nae_reg(nae_base, (NAE_L3CTABLE0 + (entry * 2)), val);
922 nlm_setup_l3ctable_odd(uint64_t nae_base, int entry, uint32_t l3off0,
923 uint32_t l3len0, uint32_t l3off1, uint32_t l3len1,
924 uint32_t l3off2, uint32_t l3len2)
928 val = ((l3off0 & 0x3f) << 26) |
929 ((l3len0 & 0x1f) << 21) |
930 ((l3off1 & 0x3f) << 15) |
931 ((l3len1 & 0x1f) << 10) |
932 ((l3off2 & 0x3f) << 4) |
934 nlm_write_nae_reg(nae_base, (NAE_L3CTABLE0 + ((entry * 2) + 1)), val);
938 nlm_setup_l4ctable_even(uint64_t nae_base, int entry, uint32_t im,
939 uint32_t l3cm, uint32_t l4pm, uint32_t port,
940 uint32_t l3camaddr, uint32_t l4proto)
944 val = ((im & 0x1) << 19) |
945 ((l3cm & 0x1) << 18) |
946 ((l4pm & 0x1) << 17) |
947 ((port & 0x1f) << 12) |
948 ((l3camaddr & 0xf) << 8) |
950 nlm_write_nae_reg(nae_base, (NAE_L4CTABLE0 + (entry * 2)), val);
954 nlm_setup_l4ctable_odd(uint64_t nae_base, int entry, uint32_t l4off0,
955 uint32_t l4len0, uint32_t l4off1, uint32_t l4len1)
959 val = ((l4off0 & 0x3f) << 21) |
960 ((l4len0 & 0xf) << 17) |
961 ((l4off1 & 0x3f) << 11) |
963 nlm_write_nae_reg(nae_base, (NAE_L4CTABLE0 + ((entry * 2) + 1)), val);
967 nlm_enable_hardware_parser(uint64_t nae_base)
971 val = nlm_read_nae_reg(nae_base, NAE_RX_CONFIG);
972 val |= (1 << 12); /* hardware parser enable */
973 nlm_write_nae_reg(nae_base, NAE_RX_CONFIG, val);
975 /***********************************************
976 * program L3 CAM table
977 ***********************************************/
980 * entry-0 is ipv4 MPLS type 1 label
982 /* l3hdroff = 4 bytes, ether_type = 0x8847 for MPLS_type1 */
983 nlm_setup_l3ctable_even(nae_base, 0, 4, 1, 9, 1, 0x8847);
984 /* l3off0 (8 bytes) -> l3len0 (1 byte) := ip proto
985 * l3off1 (12 bytes) -> l3len1 (4 bytes) := src ip
986 * l3off2 (16 bytes) -> l3len2 (4 bytes) := dst ip
988 nlm_setup_l3ctable_odd(nae_base, 0, 9, 1, 12, 4, 16, 4);
991 * entry-1 is for ethernet IPv4 packets
993 nlm_setup_l3ctable_even(nae_base, 1, 0, 1, 9, 1, 0x0800);
994 /* l3off0 (8 bytes) -> l3len0 (1 byte) := ip proto
995 * l3off1 (12 bytes) -> l3len1 (4 bytes) := src ip
996 * l3off2 (16 bytes) -> l3len2 (4 bytes) := dst ip
998 nlm_setup_l3ctable_odd(nae_base, 1, 9, 1, 12, 4, 16, 4);
1001 * entry-2 is for ethernet IPv6 packets
1003 nlm_setup_l3ctable_even(nae_base, 2, 0, 1, 6, 1, 0x86dd);
1004 /* l3off0 (6 bytes) -> l3len0 (1 byte) := next header (ip proto)
1005 * l3off1 (8 bytes) -> l3len1 (16 bytes) := src ip
1006 * l3off2 (24 bytes) -> l3len2 (16 bytes) := dst ip
1008 nlm_setup_l3ctable_odd(nae_base, 2, 6, 1, 8, 16, 24, 16);
1011 * entry-3 is for ethernet ARP packets
1013 nlm_setup_l3ctable_even(nae_base, 3, 0, 0, 9, 1, 0x0806);
1014 /* extract 30 bytes from packet start */
1015 nlm_setup_l3ctable_odd(nae_base, 3, 0, 30, 0, 0, 0, 0);
1018 * entry-4 is for ethernet FCoE packets
1020 nlm_setup_l3ctable_even(nae_base, 4, 0, 0, 9, 1, 0x8906);
1021 /* FCoE packet consists of 4 byte start-of-frame,
1022 * and 24 bytes of frame header, followed by
1023 * 64 bytes of optional-header (ESP, network..),
1024 * 2048 bytes of payload, 36 bytes of optional
1025 * "fill bytes" or ESP trailer, 4 bytes of CRC,
1026 * and 4 bytes of end-of-frame
1027 * We extract the first 4 + 24 = 28 bytes
1029 nlm_setup_l3ctable_odd(nae_base, 4, 0, 28, 0, 0, 0, 0);
1032 * entry-5 is for vlan tagged frames (0x8100)
1034 nlm_setup_l3ctable_even(nae_base, 5, 0, 0, 9, 1, 0x8100);
1035 /* we extract 31 bytes from the payload */
1036 nlm_setup_l3ctable_odd(nae_base, 5, 0, 31, 0, 0, 0, 0);
1039 * entry-6 is for ieee 802.1ad provider bridging
1040 * tagged frames (0x88a8)
1042 nlm_setup_l3ctable_even(nae_base, 6, 0, 0, 9, 1, 0x88a8);
1043 /* we extract 31 bytes from the payload */
1044 nlm_setup_l3ctable_odd(nae_base, 6, 0, 31, 0, 0, 0, 0);
1047 * entry-7 is for Cisco's Q-in-Q tagged frames (0x9100)
1049 nlm_setup_l3ctable_even(nae_base, 7, 0, 0, 9, 1, 0x9100);
1050 /* we extract 31 bytes from the payload */
1051 nlm_setup_l3ctable_odd(nae_base, 7, 0, 31, 0, 0, 0, 0);
1054 * entry-8 is for Ethernet Jumbo frames (0x8870)
1056 nlm_setup_l3ctable_even(nae_base, 8, 0, 0, 9, 1, 0x8870);
1057 /* we extract 31 bytes from the payload */
1058 nlm_setup_l3ctable_odd(nae_base, 8, 0, 31, 0, 0, 0, 0);
1061 * entry-9 is for MPLS Multicast frames (0x8848)
1063 nlm_setup_l3ctable_even(nae_base, 9, 0, 0, 9, 1, 0x8848);
1064 /* we extract 31 bytes from the payload */
1065 nlm_setup_l3ctable_odd(nae_base, 9, 0, 31, 0, 0, 0, 0);
1068 * entry-10 is for IEEE 802.1ae MAC Security frames (0x88e5)
1070 nlm_setup_l3ctable_even(nae_base, 10, 0, 0, 9, 1, 0x88e5);
1071 /* we extract 31 bytes from the payload */
1072 nlm_setup_l3ctable_odd(nae_base, 10, 0, 31, 0, 0, 0, 0);
1075 * entry-11 is for PTP frames (0x88f7)
1077 nlm_setup_l3ctable_even(nae_base, 11, 0, 0, 9, 1, 0x88f7);
1078 /* PTP messages can be sent as UDP messages over
1079 * IPv4 or IPv6; and as a raw ethernet message
1080 * with ethertype 0x88f7. The message contents
1081 * are the same for UDP or ethernet based encapsulations
1082 * The header is 34 bytes long, and we extract
1085 nlm_setup_l3ctable_odd(nae_base, 11, 0, 31, 31, 2, 0, 0);
1088 * entry-12 is for ethernet Link Control Protocol (LCP)
1091 nlm_setup_l3ctable_even(nae_base, 12, 0, 0, 9, 1, 0xc021);
1092 /* LCP packet consists of 1 byte of code, 1 byte of
1093 * identifier and two bytes of length followed by
1094 * data (upto length bytes).
1095 * We extract 4 bytes from start of packet
1097 nlm_setup_l3ctable_odd(nae_base, 12, 0, 4, 0, 0, 0, 0);
1100 * entry-13 is for ethernet Link Quality Report (0xc025)
1103 nlm_setup_l3ctable_even(nae_base, 13, 0, 0, 9, 1, 0xc025);
1104 /* We extract 31 bytes from packet start */
1105 nlm_setup_l3ctable_odd(nae_base, 13, 0, 31, 0, 0, 0, 0);
1108 * entry-14 is for PPPoE Session (0x8864)
1110 nlm_setup_l3ctable_even(nae_base, 14, 0, 0, 9, 1, 0x8864);
1111 /* We extract 31 bytes from packet start */
1112 nlm_setup_l3ctable_odd(nae_base, 14, 0, 31, 0, 0, 0, 0);
1115 * entry-15 - default entry
1117 nlm_setup_l3ctable_even(nae_base, 15, 0, 0, 0, 0, 0x0000);
1118 /* We extract 31 bytes from packet start */
1119 nlm_setup_l3ctable_odd(nae_base, 15, 0, 31, 0, 0, 0, 0);
1121 /***********************************************
1122 * program L4 CAM table
1123 ***********************************************/
1126 * entry-0 - tcp packets (0x6)
1128 nlm_setup_l4ctable_even(nae_base, 0, 0, 0, 1, 0, 0, 0x6);
1129 /* tcp header is 20 bytes without tcp options
1130 * We extract 20 bytes from tcp start */
1131 nlm_setup_l4ctable_odd(nae_base, 0, 0, 15, 15, 5);
1134 * entry-1 - udp packets (0x11)
1136 nlm_setup_l4ctable_even(nae_base, 1, 0, 0, 1, 0, 0, 0x11);
1137 /* udp header is 8 bytes in size.
1138 * We extract 8 bytes from udp start */
1139 nlm_setup_l4ctable_odd(nae_base, 1, 0, 8, 0, 0);
1142 * entry-2 - sctp packets (0x84)
1144 nlm_setup_l4ctable_even(nae_base, 2, 0, 0, 1, 0, 0, 0x84);
1145 /* sctp packets have a 12 byte generic header
1146 * and various chunks.
1147 * We extract 12 bytes from sctp start */
1148 nlm_setup_l4ctable_odd(nae_base, 2, 0, 12, 0, 0);
1151 * entry-3 - RDP packets (0x1b)
1153 nlm_setup_l4ctable_even(nae_base, 3, 0, 0, 1, 0, 0, 0x1b);
1154 /* RDP packets have 18 bytes of generic header
1155 * before variable header starts.
1156 * We extract 18 bytes from rdp start */
1157 nlm_setup_l4ctable_odd(nae_base, 3, 0, 15, 15, 3);
1160 * entry-4 - DCCP packets (0x21)
1162 nlm_setup_l4ctable_even(nae_base, 4, 0, 0, 1, 0, 0, 0x21);
1163 /* DCCP has two types of generic headers of
1164 * sizes 16 bytes and 12 bytes if X = 1.
1165 * We extract 16 bytes from dccp start */
1166 nlm_setup_l4ctable_odd(nae_base, 4, 0, 15, 15, 1);
1169 * entry-5 - ipv6 encapsulated in ipv4 packets (0x29)
1171 nlm_setup_l4ctable_even(nae_base, 5, 0, 0, 1, 0, 0, 0x29);
1172 /* ipv4 header is 20 bytes excluding IP options.
1173 * We extract 20 bytes from IPv4 start */
1174 nlm_setup_l4ctable_odd(nae_base, 5, 0, 15, 15, 5);
1177 * entry-6 - ip in ip encapsulation packets (0x04)
1179 nlm_setup_l4ctable_even(nae_base, 6, 0, 0, 1, 0, 0, 0x04);
1180 /* ipv4 header is 20 bytes excluding IP options.
1181 * We extract 20 bytes from ipv4 start */
1182 nlm_setup_l4ctable_odd(nae_base, 6, 0, 15, 15, 5);
1185 * entry-7 - default entry (0x0)
1187 nlm_setup_l4ctable_even(nae_base, 7, 0, 0, 1, 0, 0, 0x0);
1188 /* We extract 20 bytes from packet start */
1189 nlm_setup_l4ctable_odd(nae_base, 7, 0, 15, 15, 5);
1193 nlm_enable_hardware_parser_per_port(uint64_t nae_base, int block, int port)
1195 int hwport = (block * 4) + (port & 0x3);
1197 /* program L2 and L3 header extraction for each port */
1198 /* enable ethernet L2 mode on port */
1199 nlm_setup_l2type(nae_base, hwport, 0, 0, 0, 0, 0, 1);
1201 /* l2proto and ethtype included in l3cam */
1202 nlm_setup_l3ctable_mask(nae_base, hwport, 1, 0);
1206 nlm_prepad_enable(uint64_t nae_base, int size)
1210 val = nlm_read_nae_reg(nae_base, NAE_RX_CONFIG);
1211 val |= (1 << 13); /* prepad enable */
1212 val |= ((size & 0x3) << 22); /* prepad size */
1213 nlm_write_nae_reg(nae_base, NAE_RX_CONFIG, val);
1217 nlm_setup_1588_timer(uint64_t nae_base, struct nae_port_config *cfg)
1219 uint32_t hi, lo, val;
1221 hi = cfg[0].ieee1588_userval >> 32;
1222 lo = cfg[0].ieee1588_userval & 0xffffffff;
1223 nlm_write_nae_reg(nae_base, NAE_1588_PTP_USER_VALUE_HI, hi);
1224 nlm_write_nae_reg(nae_base, NAE_1588_PTP_USER_VALUE_LO, lo);
1226 hi = cfg[0].ieee1588_ptpoff >> 32;
1227 lo = cfg[0].ieee1588_ptpoff & 0xffffffff;
1228 nlm_write_nae_reg(nae_base, NAE_1588_PTP_OFFSET_HI, hi);
1229 nlm_write_nae_reg(nae_base, NAE_1588_PTP_OFFSET_LO, lo);
1231 hi = cfg[0].ieee1588_tmr1 >> 32;
1232 lo = cfg[0].ieee1588_tmr1 & 0xffffffff;
1233 nlm_write_nae_reg(nae_base, NAE_1588_PTP_TMR1_HI, hi);
1234 nlm_write_nae_reg(nae_base, NAE_1588_PTP_TMR1_LO, lo);
1236 hi = cfg[0].ieee1588_tmr2 >> 32;
1237 lo = cfg[0].ieee1588_tmr2 & 0xffffffff;
1238 nlm_write_nae_reg(nae_base, NAE_1588_PTP_TMR2_HI, hi);
1239 nlm_write_nae_reg(nae_base, NAE_1588_PTP_TMR2_LO, lo);
1241 hi = cfg[0].ieee1588_tmr3 >> 32;
1242 lo = cfg[0].ieee1588_tmr3 & 0xffffffff;
1243 nlm_write_nae_reg(nae_base, NAE_1588_PTP_TMR3_HI, hi);
1244 nlm_write_nae_reg(nae_base, NAE_1588_PTP_TMR3_LO, lo);
1246 nlm_write_nae_reg(nae_base, NAE_1588_PTP_INC_INTG,
1247 cfg[0].ieee1588_inc_intg);
1248 nlm_write_nae_reg(nae_base, NAE_1588_PTP_INC_NUM,
1249 cfg[0].ieee1588_inc_num);
1250 nlm_write_nae_reg(nae_base, NAE_1588_PTP_INC_DEN,
1251 cfg[0].ieee1588_inc_den);
1253 val = nlm_read_nae_reg(nae_base, NAE_1588_PTP_CONTROL);
1254 /* set and clear freq_mul = 1 */
1255 nlm_write_nae_reg(nae_base, NAE_1588_PTP_CONTROL, val | (0x1 << 1));
1256 nlm_write_nae_reg(nae_base, NAE_1588_PTP_CONTROL, val);
1257 /* set and clear load_user_val = 1 */
1258 nlm_write_nae_reg(nae_base, NAE_1588_PTP_CONTROL, val | (0x1 << 6));
1259 nlm_write_nae_reg(nae_base, NAE_1588_PTP_CONTROL, val);
1263 nlm_mac_enable(uint64_t nae_base, int nblock, int port_type, int port)
1265 uint32_t mac_cfg1, xaui_cfg;
1267 int iface = port & 0x3;
1271 netwk_inf = nlm_read_nae_reg(nae_base,
1272 SGMII_NET_IFACE_CTRL(nblock, iface));
1273 nlm_write_nae_reg(nae_base,
1274 SGMII_NET_IFACE_CTRL(nblock, iface),
1276 (1 << 2)); /* enable tx */
1277 mac_cfg1 = nlm_read_nae_reg(nae_base,
1278 SGMII_MAC_CONF1(nblock, iface));
1279 nlm_write_nae_reg(nae_base,
1280 SGMII_MAC_CONF1(nblock, iface),
1282 (1 << 2) | /* rx enable */
1286 xaui_cfg = nlm_read_nae_reg(nae_base,
1287 XAUI_CONFIG1(nblock));
1288 nlm_write_nae_reg(nae_base,
1289 XAUI_CONFIG1(nblock),
1300 nlm_mac_disable(uint64_t nae_base, int nblock, int port_type, int port)
1302 uint32_t mac_cfg1, xaui_cfg;
1304 int iface = port & 0x3;
1308 mac_cfg1 = nlm_read_nae_reg(nae_base,
1309 SGMII_MAC_CONF1(nblock, iface));
1310 nlm_write_nae_reg(nae_base,
1311 SGMII_MAC_CONF1(nblock, iface),
1313 ~((1 << 2) | /* rx enable */
1314 1)); /* tx enable */
1315 netwk_inf = nlm_read_nae_reg(nae_base,
1316 SGMII_NET_IFACE_CTRL(nblock, iface));
1317 nlm_write_nae_reg(nae_base,
1318 SGMII_NET_IFACE_CTRL(nblock, iface),
1320 ~(1 << 2)); /* enable tx */
1323 xaui_cfg = nlm_read_nae_reg(nae_base,
1324 XAUI_CONFIG1(nblock));
1325 nlm_write_nae_reg(nae_base,
1326 XAUI_CONFIG1(nblock),
1328 ~(XAUI_CONFIG_TFEN |
1337 * Set IOR credits for the ports in ifmask to valmask
1340 nlm_nae_set_ior_credit(uint64_t nae_base, uint32_t ifmask, uint32_t valmask)
1342 uint32_t tx_config, tx_ior_credit;
1344 tx_ior_credit = nlm_read_nae_reg(nae_base, NAE_TX_IORCRDT_INIT);
1345 tx_ior_credit &= ~ifmask;
1346 tx_ior_credit |= valmask;
1347 nlm_write_nae_reg(nae_base, NAE_TX_IORCRDT_INIT, tx_ior_credit);
1349 tx_config = nlm_read_nae_reg(nae_base, NAE_TX_CONFIG);
1350 /* need to toggle these bits for credits to be loaded */
1351 nlm_write_nae_reg(nae_base, NAE_TX_CONFIG,
1352 tx_config | (TXINITIORCR(ifmask)));
1353 nlm_write_nae_reg(nae_base, NAE_TX_CONFIG,
1354 tx_config & ~(TXINITIORCR(ifmask)));
1358 nlm_nae_open_if(uint64_t nae_base, int nblock, int port_type,
1359 int port, uint32_t desc_size)
1362 uint32_t mac_cfg1, netior_ctrl3;
1363 int iface, iface_ctrl_reg, iface_ctrl3_reg, conf1_reg, conf2_reg;
1365 switch (port_type) {
1367 netwk_inf = nlm_read_nae_reg(nae_base,
1368 XAUI_NETIOR_XGMAC_CTRL1(nblock));
1369 netwk_inf |= (1 << NETIOR_XGMAC_STATS_CLR_POS);
1370 nlm_write_nae_reg(nae_base,
1371 XAUI_NETIOR_XGMAC_CTRL1(nblock), netwk_inf);
1373 nlm_nae_set_ior_credit(nae_base, 0xf << port, 0xf << port);
1377 nlm_nae_set_ior_credit(nae_base, 0xff << port, 0xff << port);
1381 nlm_nae_set_ior_credit(nae_base, 0x1 << port, 0);
1384 * XXXJC: split this and merge to sgmii.c
1385 * some of this is duplicated from there.
1387 /* init phy id to access internal PCS */
1389 iface_ctrl_reg = SGMII_NET_IFACE_CTRL(nblock, iface);
1390 conf1_reg = SGMII_MAC_CONF1(nblock, iface);
1391 conf2_reg = SGMII_MAC_CONF2(nblock, iface);
1393 netwk_inf = nlm_read_nae_reg(nae_base, iface_ctrl_reg);
1394 netwk_inf &= 0x7ffffff;
1395 netwk_inf |= (port << 27);
1396 nlm_write_nae_reg(nae_base, iface_ctrl_reg, netwk_inf);
1398 /* Sofreset sgmii port - set bit 11 to 0 */
1399 netwk_inf &= 0xfffff7ff;
1400 nlm_write_nae_reg(nae_base, iface_ctrl_reg, netwk_inf);
1403 mac_cfg1 = nlm_read_nae_reg(nae_base, conf1_reg);
1404 nlm_write_nae_reg(nae_base, conf1_reg,
1406 (1U << 31) | /* soft reset */
1407 (1 << 2) | /* rx enable */
1408 (1)); /* tx enable */
1411 nlm_write_nae_reg(nae_base,
1413 (0x7 << 12) | /* interface preamble length */
1414 (0x2 << 8) | /* interface mode */
1415 (0x1 << 2) | /* pad crc enable */
1416 (0x1)); /* full duplex */
1418 /* clear gmac reset */
1419 mac_cfg1 = nlm_read_nae_reg(nae_base, conf1_reg);
1420 nlm_write_nae_reg(nae_base, conf1_reg, mac_cfg1 & ~(1U << 31));
1422 /* clear speed debug bit */
1423 iface_ctrl3_reg = SGMII_NET_IFACE_CTRL3(nblock, iface);
1424 netior_ctrl3 = nlm_read_nae_reg(nae_base, iface_ctrl3_reg);
1425 nlm_write_nae_reg(nae_base, iface_ctrl3_reg,
1426 netior_ctrl3 & ~(1 << 6));
1428 /* disable TX, RX for now */
1429 mac_cfg1 = nlm_read_nae_reg(nae_base, conf1_reg);
1430 nlm_write_nae_reg(nae_base, conf1_reg, mac_cfg1 & ~(0x5));
1431 netwk_inf = nlm_read_nae_reg(nae_base, iface_ctrl_reg);
1432 nlm_write_nae_reg(nae_base, iface_ctrl_reg,
1433 netwk_inf & ~(0x1 << 2));
1435 /* clear stats counters */
1436 netwk_inf = nlm_read_nae_reg(nae_base, iface_ctrl_reg);
1437 nlm_write_nae_reg(nae_base, iface_ctrl_reg,
1438 netwk_inf | (1 << 15));
1440 /* enable stats counters */
1441 netwk_inf = nlm_read_nae_reg(nae_base, iface_ctrl_reg);
1442 nlm_write_nae_reg(nae_base, iface_ctrl_reg,
1443 (netwk_inf & ~(1 << 15)) | (1 << 16));
1446 mac_cfg1 = nlm_read_nae_reg(nae_base, conf1_reg);
1447 nlm_write_nae_reg(nae_base, conf1_reg,
1448 mac_cfg1 | (0x3 << 4));
1452 nlm_nae_init_ingress(nae_base, desc_size);
1453 nlm_nae_init_egress(nae_base);