Lines Matching +full:0 +full:xf0020000
86 static const u16 fec_enet_vlan_pri_to_queue[8] = {0, 0, 1, 1, 1, 2, 2, 2};
88 #define FEC_ENET_RSEM_V 0x84
90 #define FEC_ENET_RAEM_V 0x8
91 #define FEC_ENET_RAFL_V 0x8
92 #define FEC_ENET_OPD_V 0xFFF0
95 #define FEC_ENET_XDP_PASS 0
96 #define FEC_ENET_XDP_CONSUMED BIT(0)
186 .driver_data = 0,
209 module_param_array(macaddr, byte, NULL, 0);
218 #define FEC_FLASHMAC 0xf0006006
220 #define FEC_FLASHMAC 0xf0006000
222 #define FEC_FLASHMAC 0xf0020000
224 #define FEC_FLASHMAC (0xffe04000 + 4)
226 #define FEC_FLASHMAC 0xffc0406b
228 #define FEC_FLASHMAC 0
259 #define OPT_FRAME_SIZE 0
264 #define FEC_MMFR_ST_C45 (0)
268 #define FEC_MMFR_OP_ADDR_WRITE (0)
269 #define FEC_MMFR_PA(v) ((v & 0x1f) << 23)
270 #define FEC_MMFR_RA(v) ((v & 0x1f) << 18)
272 #define FEC_MMFR_DATA(v) (v & 0xffff)
274 #define FEC_ECR_RESET BIT(0)
281 #define FEC_RCR_LOOP BIT(0)
297 #define FEC_PAUSE_FLAG_AUTONEG 0x1
298 #define FEC_PAUSE_FLAG_ENABLE 0x2
299 #define FEC_WOL_HAS_MAGIC_PACKET (0x1 << 0)
300 #define FEC_WOL_FLAG_ENABLE (0x1 << 1)
301 #define FEC_WOL_FLAG_SLEEP_ON (0x1 << 2)
340 return entries >= 0 ? entries : entries + txq->bd.ring_size; in fec_enet_get_free_txdesc_num()
348 for (i = 0; i < len; i += 4, buf++) in swap_buffer()
357 int index = 0; in fec_dump()
362 txq = fep->tx_queue[0]; in fec_dump()
366 pr_info("%3u %c%c 0x%04x 0x%08x %4u %p\n", in fec_dump()
453 return 0; in fec_enet_clear_csum()
455 if (unlikely(skb_cow_head(skb, 0))) in fec_enet_clear_csum()
459 ip_hdr(skb)->check = 0; in fec_enet_clear_csum()
460 *(__sum16 *)(skb->head + skb->csum_start + skb->csum_offset) = 0; in fec_enet_clear_csum()
462 return 0; in fec_enet_clear_csum()
471 .order = 0, in fec_enet_create_page_pool()
489 err = xdp_rxq_info_reg(&rxq->xdp_rxq, fep->netdev, rxq->id, 0); in fec_enet_create_page_pool()
490 if (err < 0) in fec_enet_create_page_pool()
498 return 0; in fec_enet_create_page_pool()
519 unsigned int estatus = 0; in fec_enet_txq_submit_frag_skb()
526 for (frag = 0; frag < nr_frags; frag++) { in fec_enet_txq_submit_frag_skb()
553 ebdp->cbd_bdu = 0; in fec_enet_txq_submit_frag_skb()
589 for (i = 0; i < frag; i++) { in fec_enet_txq_submit_frag_skb()
607 unsigned int estatus = 0; in fec_enet_txq_submit_skb()
688 ebdp->cbd_bdu = 0; in fec_enet_txq_submit_skb()
717 writel(0, txq->bd.reg_desc_active); in fec_enet_txq_submit_skb()
719 return 0; in fec_enet_txq_submit_skb()
731 unsigned int estatus = 0; in fec_enet_txq_put_data_tso()
764 ebdp->cbd_bdu = 0; in fec_enet_txq_put_data_tso()
779 return 0; in fec_enet_txq_put_data_tso()
793 unsigned int estatus = 0; in fec_enet_txq_put_hdr_tso()
827 ebdp->cbd_bdu = 0; in fec_enet_txq_put_hdr_tso()
833 return 0; in fec_enet_txq_put_hdr_tso()
846 unsigned int index = 0; in fec_enet_txq_submit_tso()
866 while (total_len > 0) { in fec_enet_txq_submit_tso()
875 tso_build_hdr(skb, hdr, &tso, data_left, total_len == 0); in fec_enet_txq_submit_tso()
880 while (data_left > 0) { in fec_enet_txq_submit_tso()
890 total_len == 0); in fec_enet_txq_submit_tso()
913 writel(0, txq->bd.reg_desc_active); in fec_enet_txq_submit_tso()
915 return 0; in fec_enet_txq_submit_tso()
931 tmp_bdp->cbd_sc = 0; in fec_enet_txq_submit_tso()
932 tmp_bdp->cbd_datlen = 0; in fec_enet_txq_submit_tso()
933 tmp_bdp->cbd_bufaddr = 0; in fec_enet_txq_submit_tso()
938 ebdp->cbd_esc = 0; in fec_enet_txq_submit_tso()
988 for (q = 0; q < fep->num_rx_queues; q++) { in fec_enet_bd_init()
993 for (i = 0; i < rxq->bd.ring_size; i++) { in fec_enet_bd_init()
999 bdp->cbd_sc = cpu_to_fec16(0); in fec_enet_bd_init()
1010 for (q = 0; q < fep->num_tx_queues; q++) { in fec_enet_bd_init()
1016 for (i = 0; i < txq->bd.ring_size; i++) { in fec_enet_bd_init()
1018 bdp->cbd_sc = cpu_to_fec16(0); in fec_enet_bd_init()
1041 page_pool_put_page(page->pp, page, 0, false); in fec_enet_bd_init()
1047 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_bd_init()
1063 for (i = 0; i < fep->num_rx_queues; i++) in fec_enet_active_rxring()
1064 writel(0, fep->rx_queue[i]->bd.reg_desc_active); in fec_enet_active_rxring()
1074 for (i = 0; i < fep->num_rx_queues; i++) { in fec_enet_enable_ring()
1085 for (i = 0; i < fep->num_tx_queues; i++) { in fec_enet_enable_ring()
1106 u32 rcntl = OPT_FRAME_SIZE | 0x04; in fec_restart()
1118 writel(0, fep->hwp + FEC_ECNTRL); in fec_restart()
1129 writel((__force u32)cpu_to_be32(temp_mac[0]), in fec_restart()
1135 writel((0xffffffff & ~FEC_ENET_MII), fep->hwp + FEC_IEVENT); in fec_restart()
1144 writel(0x04, fep->hwp + FEC_X_CNTRL); in fec_restart()
1147 rcntl |= 0x02; in fec_restart()
1148 writel(0x0, fep->hwp + FEC_X_CNTRL); in fec_restart()
1176 rcntl |= 0x40000000 | 0x00000020; in fec_restart()
1203 writel(0, fep->hwp + FEC_MIIGSK_ENR); in fec_restart()
1249 writel(0, fep->hwp + FEC_HASH_TABLE_HIGH); in fec_restart()
1250 writel(0, fep->hwp + FEC_HASH_TABLE_LOW); in fec_restart()
1272 writel(0 << 31, fep->hwp + FEC_MIB_CTRLSTAT); in fec_restart()
1288 writel(0, fep->hwp + FEC_IMASK); in fec_restart()
1300 return 0; in fec_enet_ipc_handle_init()
1315 if (idx < 0) in fec_enet_ipg_stop_set()
1316 idx = 0; in fec_enet_ipg_stop_set()
1319 val = enabled ? 1 : 0; in fec_enet_ipg_stop_set()
1335 BIT(stop_gpr->bit), 0); in fec_enet_stop_mode()
1347 writel(0, fep->hwp + FEC_IMASK); in fec_irqs_disable()
1354 writel(0, fep->hwp + FEC_IMASK); in fec_irqs_disable_except_wakeup()
1382 writel(0, fep->hwp + FEC_ECNTRL); in fec_stop()
1453 memset(hwtstamps, 0, sizeof(*hwtstamps)); in fec_enet_hwtstamp()
1467 int index = 0; in fec_enet_tx_queue()
1499 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_tx_queue()
1504 * the "budget" is 0. Because NAPI is called with budget of in fec_enet_tx_queue()
1505 * 0 (such as netpoll) indicates we may be in an IRQ context, in fec_enet_tx_queue()
1522 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_tx_queue()
1580 /* The dma_sync_size = 0 as XDP_TX has already synced DMA for_device */ in fec_enet_tx_queue()
1581 page_pool_put_page(page->pp, page, 0, true); in fec_enet_tx_queue()
1609 readl(txq->bd.reg_desc_active) == 0) in fec_enet_tx_queue()
1610 writel(0, txq->bd.reg_desc_active); in fec_enet_tx_queue()
1619 for (i = fep->num_tx_queues - 1; i >= 0; i--) in fec_enet_tx()
1638 return 0; in fec_enet_update_cbd()
1721 int pkt_received = 0; in fec_enet_rx_queue()
1725 int index = 0; in fec_enet_rx_queue()
1906 ebdp->cbd_prot = 0; in fec_enet_rx_queue()
1907 ebdp->cbd_bdu = 0; in fec_enet_rx_queue()
1922 writel(0, rxq->bd.reg_desc_active); in fec_enet_rx_queue()
1935 int i, done = 0; in fec_enet_rx()
1938 for (i = fep->num_rx_queues - 1; i >= 0; i--) in fec_enet_rx()
1955 return int_events != 0; in fec_enet_collect_events()
1970 writel(0, fep->hwp + FEC_IMASK); in fec_enet_interrupt()
1982 int done = 0; in fec_enet_rx_napi()
2008 * fec.macaddr=0x00,0x04,0x9f,0x01,0x30,0xe0 in fec_get_mac()
2045 *((__be32 *) &tmpaddr[0]) = in fec_get_mac()
2049 iap = &tmpaddr[0]; in fec_get_mac()
2061 return 0; in fec_get_mac()
2065 eth_hw_addr_gen(ndev, iap, iap == macaddr ? fep->dev_id : 0); in fec_get_mac()
2067 return 0; in fec_get_mac()
2096 sleep_cycle = 0; in fec_enet_eee_mode_set()
2097 wake_cycle = 0; in fec_enet_eee_mode_set()
2103 return 0; in fec_enet_eee_mode_set()
2110 int status_change = 0; in fec_enet_adjust_link()
2118 fep->link = 0; in fec_enet_adjust_link()
2184 int ret = 0, frame_start, frame_addr, frame_op; in fec_enet_mdio_read_c22()
2187 if (ret < 0) in fec_enet_mdio_read_c22()
2221 int ret = 0, frame_start, frame_op; in fec_enet_mdio_read_c45()
2224 if (ret < 0) in fec_enet_mdio_read_c45()
2232 FEC_MMFR_TA | (regnum & 0xFFFF), in fec_enet_mdio_read_c45()
2273 if (ret < 0) in fec_enet_mdio_write_c22()
2305 if (ret < 0) in fec_enet_mdio_write_c45()
2313 FEC_MMFR_TA | (regnum & 0xFFFF), in fec_enet_mdio_write_c45()
2405 return 0; in fec_enet_clk_enable()
2428 /* For rgmii tx internal delay, valid values are 0ps and 2000ps */ in fec_enet_parse_rgmii_delay()
2430 if (rgmii_tx_delay != 0 && rgmii_tx_delay != 2000) { in fec_enet_parse_rgmii_delay()
2431 dev_err(&fep->pdev->dev, "The only allowed RGMII TX delay values are: 0ps, 2000ps"); in fec_enet_parse_rgmii_delay()
2438 /* For rgmii rx internal delay, valid values are 0ps and 2000ps */ in fec_enet_parse_rgmii_delay()
2440 if (rgmii_rx_delay != 0 && rgmii_rx_delay != 2000) { in fec_enet_parse_rgmii_delay()
2441 dev_err(&fep->pdev->dev, "The only allowed RGMII RX delay values are: 0ps, 2000ps"); in fec_enet_parse_rgmii_delay()
2448 return 0; in fec_enet_parse_rgmii_delay()
2462 &fec_enet_adjust_link, 0, in fec_enet_mii_probe()
2470 for (phy_id = 0; (phy_id < PHY_MAX_ADDR); phy_id++) { in fec_enet_mii_probe()
2481 strscpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); in fec_enet_mii_probe()
2482 phy_id = 0; in fec_enet_mii_probe()
2511 fep->link = 0; in fec_enet_mii_probe()
2512 fep->full_duplex = 0; in fec_enet_mii_probe()
2516 return 0; in fec_enet_mii_probe()
2548 if ((fep->quirks & FEC_QUIRK_SINGLE_MDIO) && fep->dev_id > 0) { in fec_enet_mii_init()
2553 return 0; in fec_enet_mii_init()
2593 * The HOLDTIME bitfield takes values between 0 and 7 (inclusive). in fec_enet_mii_init()
2608 * - mmfr[31:0]_not_zero & mscr[7:0]_is_zero & in fec_enet_mii_init()
2609 * mscr_reg_data_in[7:0] != 0 in fec_enet_mii_init()
2611 * - mscr[7:0]_not_zero in fec_enet_mii_init()
2613 writel(0, fep->hwp + FEC_MII_DATA); in fec_enet_mii_init()
2645 for (addr = 0; addr < PHY_MAX_ADDR; addr++) { in fec_enet_mii_init()
2657 return 0; in fec_enet_mii_init()
2668 if (--mii_cnt == 0) { in fec_enet_mii_remove()
2688 int s = 0; in fec_enet_get_regs_len()
2690 r = platform_get_resource(fep->pdev, IORESOURCE_MEM, 0); in fec_enet_get_regs_len()
2799 if (ret < 0) in fec_enet_get_regs()
2804 memset(buf, 0, regs->len); in fec_enet_get_regs()
2806 for (i = 0; i < reg_cnt; i++) { in fec_enet_get_regs()
2840 return 0; in fec_enet_get_ts_info()
2853 pause->autoneg = (fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) != 0; in fec_enet_get_pauseparam()
2854 pause->tx_pause = (fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) != 0; in fec_enet_get_pauseparam()
2872 fep->pause_flag = 0; in fec_enet_set_pauseparam()
2875 fep->pause_flag |= pause->rx_pause ? FEC_PAUSE_FLAG_ENABLE : 0; in fec_enet_set_pauseparam()
2876 fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0; in fec_enet_set_pauseparam()
2895 return 0; in fec_enet_set_pauseparam()
2967 "rx_xdp_redirect", /* RX_XDP_REDIRECT = 0, */
2981 for (i = 0; i < ARRAY_SIZE(fec_stats); i++) in fec_enet_update_ethtool_stats()
2987 u64 xdp_stats[XDP_STATS_TOTAL] = { 0 }; in fec_enet_get_xdp_stats()
2991 for (i = fep->num_rx_queues - 1; i >= 0; i--) { in fec_enet_get_xdp_stats()
2994 for (j = 0; j < XDP_STATS_TOTAL; j++) in fec_enet_get_xdp_stats()
3008 for (i = fep->num_rx_queues - 1; i >= 0; i--) { in fec_enet_page_pool_stats()
3044 for (i = 0; i < ARRAY_SIZE(fec_stats); i++) { in fec_enet_get_strings()
3047 for (i = 0; i < ARRAY_SIZE(fec_xdp_stat_strs); i++) { in fec_enet_get_strings()
3085 for (i = 0; i < ARRAY_SIZE(fec_stats); i++) in fec_enet_clear_ethtool_stats()
3086 writel(0, fep->hwp + fec_stats[i].offset); in fec_enet_clear_ethtool_stats()
3088 for (i = fep->num_rx_queues - 1; i >= 0; i--) { in fec_enet_clear_ethtool_stats()
3090 for (j = 0; j < XDP_STATS_TOTAL; j++) in fec_enet_clear_ethtool_stats()
3091 rxq->stats[j] = 0; in fec_enet_clear_ethtool_stats()
3095 writel(0, fep->hwp + FEC_MIB_CTRLSTAT); in fec_enet_clear_ethtool_stats()
3099 #define FEC_STATS_SIZE 0
3172 return 0; in fec_enet_get_coalesce()
3198 if (cycle > 0xFFFF) { in fec_enet_set_coalesce()
3204 if (cycle > 0xFFFF) { in fec_enet_set_coalesce()
3217 return 0; in fec_enet_set_coalesce()
3255 wol->wolopts = fep->wol_flag & FEC_WOL_FLAG_ENABLE ? WAKE_MAGIC : 0; in fec_enet_get_wol()
3257 wol->supported = wol->wolopts = 0; in fec_enet_get_wol()
3278 return 0; in fec_enet_set_wol()
3316 for (q = 0; q < fep->num_rx_queues; q++) { in fec_enet_free_buffers()
3318 for (i = 0; i < rxq->bd.ring_size; i++) in fec_enet_free_buffers()
3321 for (i = 0; i < XDP_STATS_TOTAL; i++) in fec_enet_free_buffers()
3322 rxq->stats[i] = 0; in fec_enet_free_buffers()
3330 for (q = 0; q < fep->num_tx_queues; q++) { in fec_enet_free_buffers()
3332 for (i = 0; i < txq->bd.ring_size; i++) { in fec_enet_free_buffers()
3348 page_pool_put_page(page->pp, page, 0, false); in fec_enet_free_buffers()
3363 for (i = 0; i < fep->num_tx_queues; i++) in fec_enet_free_queue()
3371 for (i = 0; i < fep->num_rx_queues; i++) in fec_enet_free_queue()
3373 for (i = 0; i < fep->num_tx_queues; i++) in fec_enet_free_queue()
3381 int ret = 0; in fec_enet_alloc_queue()
3384 for (i = 0; i < fep->num_tx_queues; i++) { in fec_enet_alloc_queue()
3407 for (i = 0; i < fep->num_rx_queues; i++) { in fec_enet_alloc_queue()
3439 if (err < 0) { in fec_enet_alloc_rxq_buffers()
3444 for (i = 0; i < rxq->bd.ring_size; i++) { in fec_enet_alloc_rxq_buffers()
3467 return 0; in fec_enet_alloc_rxq_buffers()
3484 for (i = 0; i < txq->bd.ring_size; i++) { in fec_enet_alloc_txq_buffers()
3489 bdp->cbd_sc = cpu_to_fec16(0); in fec_enet_alloc_txq_buffers()
3490 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_alloc_txq_buffers()
3504 return 0; in fec_enet_alloc_txq_buffers()
3516 for (i = 0; i < fep->num_rx_queues; i++) in fec_enet_alloc_buffers()
3520 for (i = 0; i < fep->num_tx_queues; i++) in fec_enet_alloc_buffers()
3523 return 0; in fec_enet_alloc_buffers()
3534 if (ret < 0) in fec_enet_open()
3579 cpu_latency_qos_add_request(&fep->pm_qos_req, 0); in fec_enet_open()
3588 return 0; in fec_enet_open()
3631 return 0; in fec_enet_close()
3652 unsigned int hash_high = 0, hash_low = 0; in set_multicast_list()
3656 tmp |= 0x8; in set_multicast_list()
3662 tmp &= ~0x8; in set_multicast_list()
3669 writel(0xffffffff, fep->hwp + FEC_GRP_HASH_TABLE_HIGH); in set_multicast_list()
3670 writel(0xffffffff, fep->hwp + FEC_GRP_HASH_TABLE_LOW); in set_multicast_list()
3683 hash = (crc >> (32 - FEC_HASH_BITS)) & 0x3f; in set_multicast_list()
3714 return 0; in fec_set_mac_address()
3717 (ndev->dev_addr[1] << 16) | (ndev->dev_addr[0] << 24), in fec_set_mac_address()
3721 return 0; in fec_set_mac_address()
3760 return 0; in fec_set_features()
3767 u16 vlan_tag = 0; in fec_enet_select_queue()
3824 return 0; in fec_enet_bpf()
3837 if (unlikely(index < 0)) in fec_enet_xdp_get_tx_queue()
3838 return 0; in fec_enet_xdp_get_tx_queue()
3905 ebdp->cbd_bdu = 0; in fec_enet_txq_xmit_frame()
3929 writel(0, txq->bd.reg_desc_active); in fec_enet_txq_xmit_frame()
3931 return 0; in fec_enet_txq_xmit_frame()
3965 unsigned int sent_frames = 0; in fec_enet_xdp_xmit()
3978 for (i = 0; i < num_frames; i++) { in fec_enet_xdp_xmit()
3979 if (fec_enet_txq_xmit_frame(fep, txq, frames[i], 0, true) < 0) in fec_enet_xdp_xmit()
4002 return 0; in fec_hwtstamp_get()
4063 fep->rx_align = 0xf; in fec_enet_init()
4064 fep->tx_align = 0xf; in fec_enet_init()
4066 fep->rx_align = 0x3; in fec_enet_init()
4067 fep->tx_align = 0x3; in fec_enet_init()
4076 if (ret < 0) { in fec_enet_init()
4101 for (i = 0; i < fep->num_rx_queues; i++) { in fec_enet_init()
4117 for (i = 0; i < fep->num_tx_queues; i++) { in fec_enet_init()
4156 fep->tx_align = 0; in fec_enet_init()
4157 fep->rx_align = 0x3f; in fec_enet_init()
4173 return 0; in fec_enet_init()
4192 int msec = 1, phy_post_delay = 0; in fec_reset_phy()
4197 return 0; in fec_reset_phy()
4216 return 0; in fec_reset_phy()
4223 gpiod_set_value_cansleep(phy_reset, 0); in fec_reset_phy()
4226 return 0; in fec_reset_phy()
4234 return 0; in fec_reset_phy()
4243 return 0; in fec_reset_phy()
4286 else if (irq_cnt <= 0) in fec_enet_get_irq_cnt()
4299 fep->wake_irq = fep->irq[0]; in fec_enet_get_wakeup_irq()
4307 int ret = 0; in fec_enet_init_stop_mode()
4309 gpr_np = of_parse_phandle(np, "fsl,stop-mode", 0); in fec_enet_init_stop_mode()
4311 return 0; in fec_enet_init_stop_mode()
4344 int i, irq, ret = 0; in fec_probe()
4385 fep->hwp = devm_platform_ioremap_resource(pdev, 0); in fec_probe()
4412 phy_node = of_parse_phandle(np, "phy-handle", 0); in fec_probe()
4415 if (ret < 0) { in fec_probe()
4530 for (i = 0; i < irq_cnt; i++) { in fec_probe()
4533 if (irq < 0) in fec_probe()
4535 if (irq < 0) { in fec_probe()
4540 0, pdev->name, ndev); in fec_probe()
4576 return 0; in fec_probe()
4620 if (ret < 0) in fec_drv_remove()
4639 if (ret >= 0) { in fec_drv_remove()
4671 if (fep->wake_irq > 0) { in fec_suspend()
4683 if (ret < 0) { in fec_suspend()
4698 fep->link = 0; in fec_suspend()
4700 return 0; in fec_suspend()
4750 return 0; in fec_resume()
4766 return 0; in fec_runtime_suspend()
4782 return 0; in fec_runtime_resume()