Lines Matching +full:synquacer +full:- +full:netsec
1 // SPDX-License-Identifier: GPL-2.0+
247 #define NETSEC_RX_BUF_SIZE (PAGE_SIZE - NETSEC_RX_BUF_NON_DATA)
312 struct netsec_de { /* Netsec Descriptor layout */
333 writel(val, priv->ioaddr + reg_addr); in netsec_write()
338 return readl(priv->ioaddr + reg_addr); in netsec_read()
366 while (--timeout && netsec_read(priv, addr) & mask) in netsec_wait_while_busy()
372 while (--timeout && netsec_read(priv, addr) & mask) in netsec_wait_while_busy()
378 netdev_WARN(priv->ndev, "%s: timeout\n", __func__); in netsec_wait_while_busy()
380 return -ETIMEDOUT; in netsec_wait_while_busy()
417 } while (--timeout && (data & mask)); in netsec_mac_wait_while_busy()
430 } while (--timeout && (data & mask)); in netsec_mac_wait_while_busy()
435 netdev_WARN(priv->ndev, "%s: timeout\n", __func__); in netsec_mac_wait_while_busy()
437 return -ETIMEDOUT; in netsec_mac_wait_while_busy()
442 struct phy_device *phydev = priv->ndev->phydev; in netsec_mac_update_to_phy_state()
445 value = phydev->duplex ? NETSEC_GMAC_MCR_REG_FULL_DUPLEX_COMMON : in netsec_mac_update_to_phy_state()
448 if (phydev->speed != SPEED_1000) in netsec_mac_update_to_phy_state()
451 if (priv->phy_interface != PHY_INTERFACE_MODE_GMII && in netsec_mac_update_to_phy_state()
452 phydev->speed == SPEED_100) in netsec_mac_update_to_phy_state()
457 if (phy_interface_mode_is_rgmii(priv->phy_interface)) in netsec_mac_update_to_phy_state()
461 return -ETIMEDOUT; in netsec_mac_update_to_phy_state()
472 struct netsec_priv *priv = bus->priv; in netsec_phy_write()
475 return -ETIMEDOUT; in netsec_phy_write()
480 (netsec_clk_type(priv->freq) << in netsec_phy_write()
482 return -ETIMEDOUT; in netsec_phy_write()
491 * To meet this requirement, netsec driver needs to issue dummy in netsec_phy_write()
501 struct netsec_priv *priv = bus->priv; in netsec_phy_read()
508 (netsec_clk_type(priv->freq) << in netsec_phy_read()
510 return -ETIMEDOUT; in netsec_phy_read()
529 strlcpy(info->driver, "netsec", sizeof(info->driver)); in netsec_et_get_drvinfo()
530 strlcpy(info->bus_info, dev_name(net_device->dev.parent), in netsec_et_get_drvinfo()
531 sizeof(info->bus_info)); in netsec_et_get_drvinfo()
539 *et_coalesce = priv->et_coalesce; in netsec_et_get_coalesce()
549 priv->et_coalesce = *et_coalesce; in netsec_et_set_coalesce()
551 if (priv->et_coalesce.tx_coalesce_usecs < 50) in netsec_et_set_coalesce()
552 priv->et_coalesce.tx_coalesce_usecs = 50; in netsec_et_set_coalesce()
553 if (priv->et_coalesce.tx_max_coalesced_frames < 1) in netsec_et_set_coalesce()
554 priv->et_coalesce.tx_max_coalesced_frames = 1; in netsec_et_set_coalesce()
557 priv->et_coalesce.tx_max_coalesced_frames); in netsec_et_set_coalesce()
559 priv->et_coalesce.tx_coalesce_usecs); in netsec_et_set_coalesce()
563 if (priv->et_coalesce.rx_coalesce_usecs < 50) in netsec_et_set_coalesce()
564 priv->et_coalesce.rx_coalesce_usecs = 50; in netsec_et_set_coalesce()
565 if (priv->et_coalesce.rx_max_coalesced_frames < 1) in netsec_et_set_coalesce()
566 priv->et_coalesce.rx_max_coalesced_frames = 1; in netsec_et_set_coalesce()
569 priv->et_coalesce.rx_max_coalesced_frames); in netsec_et_set_coalesce()
571 priv->et_coalesce.rx_coalesce_usecs); in netsec_et_set_coalesce()
582 return priv->msg_enable; in netsec_et_get_msglevel()
589 priv->msg_enable = datum; in netsec_et_set_msglevel()
612 struct netsec_de *de = dring->vaddr + DESC_SZ * idx; in netsec_set_rx_de()
617 if (idx == DESC_NUM - 1) in netsec_set_rx_de()
620 de->data_buf_addr_up = upper_32_bits(desc->dma_addr); in netsec_set_rx_de()
621 de->data_buf_addr_lw = lower_32_bits(desc->dma_addr); in netsec_set_rx_de()
622 de->buf_len_info = desc->len; in netsec_set_rx_de()
623 de->attr = attr; in netsec_set_rx_de()
626 dring->desc[idx].dma_addr = desc->dma_addr; in netsec_set_rx_de()
627 dring->desc[idx].addr = desc->addr; in netsec_set_rx_de()
628 dring->desc[idx].len = desc->len; in netsec_set_rx_de()
633 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; in netsec_clean_tx_dring()
635 int tail = dring->tail; in netsec_clean_tx_dring()
639 spin_lock(&dring->lock); in netsec_clean_tx_dring()
642 entry = dring->vaddr + DESC_SZ * tail; in netsec_clean_tx_dring()
644 while (!(entry->attr & (1U << NETSEC_TX_SHIFT_OWN_FIELD)) && in netsec_clean_tx_dring()
649 desc = &dring->desc[tail]; in netsec_clean_tx_dring()
650 eop = (entry->attr >> NETSEC_TX_LAST) & 1; in netsec_clean_tx_dring()
656 if (desc->buf_type != TYPE_NETSEC_XDP_TX) in netsec_clean_tx_dring()
657 dma_unmap_single(priv->dev, desc->dma_addr, desc->len, in netsec_clean_tx_dring()
663 if (desc->buf_type == TYPE_NETSEC_SKB) { in netsec_clean_tx_dring()
664 bytes += desc->skb->len; in netsec_clean_tx_dring()
665 dev_kfree_skb(desc->skb); in netsec_clean_tx_dring()
667 bytes += desc->xdpf->len; in netsec_clean_tx_dring()
668 xdp_return_frame(desc->xdpf); in netsec_clean_tx_dring()
676 /* entry->attr is not going to be accessed by the NIC until in netsec_clean_tx_dring()
679 entry->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; in netsec_clean_tx_dring()
681 dring->tail = (tail + 1) % DESC_NUM; in netsec_clean_tx_dring()
683 tail = dring->tail; in netsec_clean_tx_dring()
684 entry = dring->vaddr + DESC_SZ * tail; in netsec_clean_tx_dring()
688 spin_unlock(&dring->lock); in netsec_clean_tx_dring()
696 priv->ndev->stats.tx_packets += cnt; in netsec_clean_tx_dring()
697 priv->ndev->stats.tx_bytes += bytes; in netsec_clean_tx_dring()
699 netdev_completed_queue(priv->ndev, cnt, bytes); in netsec_clean_tx_dring()
706 struct net_device *ndev = priv->ndev; in netsec_process_tx()
725 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; in netsec_alloc_rx_data()
728 page = page_pool_dev_alloc_pages(dring->page_pool); in netsec_alloc_rx_data()
732 /* We allocate the same buffer length for XDP and non-XDP cases. in netsec_alloc_rx_data()
737 /* Make sure the incoming payload fits in the page for XDP and non-XDP in netsec_alloc_rx_data()
747 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; in netsec_rx_fill()
751 netsec_set_rx_de(priv, dring, idx, &dring->desc[idx]); in netsec_rx_fill()
755 num--; in netsec_rx_fill()
780 int idx = dring->head; in netsec_set_tx_de()
784 de = dring->vaddr + (DESC_SZ * idx); in netsec_set_tx_de()
791 (tx_ctrl->cksum_offload_flag << NETSEC_TX_SHIFT_CO) | in netsec_set_tx_de()
792 (tx_ctrl->tcp_seg_offload_flag << NETSEC_TX_SHIFT_SO) | in netsec_set_tx_de()
794 if (idx == DESC_NUM - 1) in netsec_set_tx_de()
797 de->data_buf_addr_up = upper_32_bits(desc->dma_addr); in netsec_set_tx_de()
798 de->data_buf_addr_lw = lower_32_bits(desc->dma_addr); in netsec_set_tx_de()
799 de->buf_len_info = (tx_ctrl->tcp_seg_len << 16) | desc->len; in netsec_set_tx_de()
800 de->attr = attr; in netsec_set_tx_de()
802 dring->desc[idx] = *desc; in netsec_set_tx_de()
803 if (desc->buf_type == TYPE_NETSEC_SKB) in netsec_set_tx_de()
804 dring->desc[idx].skb = buf; in netsec_set_tx_de()
805 else if (desc->buf_type == TYPE_NETSEC_XDP_TX || in netsec_set_tx_de()
806 desc->buf_type == TYPE_NETSEC_XDP_NDO) in netsec_set_tx_de()
807 dring->desc[idx].xdpf = buf; in netsec_set_tx_de()
810 dring->head = (dring->head + 1) % DESC_NUM; in netsec_set_tx_de()
818 struct netsec_desc_ring *tx_ring = &priv->desc_ring[NETSEC_RING_TX]; in netsec_xdp_queue_one()
819 struct page *page = virt_to_page(xdpf->data); in netsec_xdp_queue_one()
825 if (tx_ring->head >= tx_ring->tail) in netsec_xdp_queue_one()
826 filled = tx_ring->head - tx_ring->tail; in netsec_xdp_queue_one()
828 filled = tx_ring->head + DESC_NUM - tx_ring->tail; in netsec_xdp_queue_one()
830 if (DESC_NUM - filled <= 1) in netsec_xdp_queue_one()
837 dma_handle = dma_map_single(priv->dev, xdpf->data, xdpf->len, in netsec_xdp_queue_one()
839 if (dma_mapping_error(priv->dev, dma_handle)) in netsec_xdp_queue_one()
847 &priv->desc_ring[NETSEC_RING_RX]; in netsec_xdp_queue_one()
849 page_pool_get_dma_dir(rx_ring->page_pool); in netsec_xdp_queue_one()
851 dma_handle = page_pool_get_dma_addr(page) + xdpf->headroom + in netsec_xdp_queue_one()
853 dma_sync_single_for_device(priv->dev, dma_handle, xdpf->len, in netsec_xdp_queue_one()
859 tx_desc.addr = xdpf->data; in netsec_xdp_queue_one()
860 tx_desc.len = xdpf->len; in netsec_xdp_queue_one()
862 netdev_sent_queue(priv->ndev, xdpf->len); in netsec_xdp_queue_one()
870 struct netsec_desc_ring *tx_ring = &priv->desc_ring[NETSEC_RING_TX]; in netsec_xdp_xmit_back()
877 spin_lock(&tx_ring->lock); in netsec_xdp_xmit_back()
879 spin_unlock(&tx_ring->lock); in netsec_xdp_xmit_back()
887 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; in netsec_run_xdp()
888 unsigned int sync, len = xdp->data_end - xdp->data; in netsec_run_xdp()
897 sync = xdp->data_end - xdp->data_hard_start - NETSEC_RXBUF_HEADROOM; in netsec_run_xdp()
907 page = virt_to_head_page(xdp->data); in netsec_run_xdp()
908 page_pool_put_page(dring->page_pool, page, sync, true); in netsec_run_xdp()
912 err = xdp_do_redirect(priv->ndev, xdp, prog); in netsec_run_xdp()
917 page = virt_to_head_page(xdp->data); in netsec_run_xdp()
918 page_pool_put_page(dring->page_pool, page, sync, true); in netsec_run_xdp()
925 trace_xdp_exception(priv->ndev, prog, act); in netsec_run_xdp()
929 page = virt_to_head_page(xdp->data); in netsec_run_xdp()
930 page_pool_put_page(dring->page_pool, page, sync, true); in netsec_run_xdp()
939 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; in netsec_process_rx()
940 struct net_device *ndev = priv->ndev; in netsec_process_rx()
949 xdp.rxq = &dring->xdp_rxq; in netsec_process_rx()
953 xdp_prog = READ_ONCE(priv->xdp_prog); in netsec_process_rx()
954 dma_dir = page_pool_get_dma_dir(dring->page_pool); in netsec_process_rx()
957 u16 idx = dring->tail; in netsec_process_rx()
958 struct netsec_de *de = dring->vaddr + (DESC_SZ * idx); in netsec_process_rx()
959 struct netsec_desc *desc = &dring->desc[idx]; in netsec_process_rx()
960 struct page *page = virt_to_page(desc->addr); in netsec_process_rx()
967 if (de->attr & (1U << NETSEC_RX_PKT_OWN_FIELD)) { in netsec_process_rx()
980 pkt_len = de->buf_len_info >> 16; in netsec_process_rx()
981 rx_info.err_code = (de->attr >> NETSEC_RX_PKT_ERR_FIELD) & in netsec_process_rx()
983 rx_info.err_flag = (de->attr >> NETSEC_RX_PKT_ER_FIELD) & 1; in netsec_process_rx()
985 netif_err(priv, drv, priv->ndev, in netsec_process_rx()
988 ndev->stats.rx_dropped++; in netsec_process_rx()
989 dring->tail = (dring->tail + 1) % DESC_NUM; in netsec_process_rx()
995 (de->attr >> NETSEC_RX_PKT_CO_FIELD) & 3; in netsec_process_rx()
1005 dma_sync_single_for_cpu(priv->dev, desc->dma_addr, pkt_len, in netsec_process_rx()
1007 prefetch(desc->addr); in netsec_process_rx()
1009 xdp.data_hard_start = desc->addr; in netsec_process_rx()
1010 xdp.data = desc->addr + NETSEC_RXBUF_HEADROOM; in netsec_process_rx()
1023 skb = build_skb(desc->addr, desc->len + NETSEC_RX_BUF_NON_DATA); in netsec_process_rx()
1031 page_pool_put_page(dring->page_pool, page, pkt_len, in netsec_process_rx()
1033 netif_err(priv, drv, priv->ndev, in netsec_process_rx()
1037 page_pool_release_page(dring->page_pool, page); in netsec_process_rx()
1039 skb_reserve(skb, xdp.data - xdp.data_hard_start); in netsec_process_rx()
1040 skb_put(skb, xdp.data_end - xdp.data); in netsec_process_rx()
1041 skb->protocol = eth_type_trans(skb, priv->ndev); in netsec_process_rx()
1043 if (priv->rx_cksum_offload_flag && in netsec_process_rx()
1045 skb->ip_summed = CHECKSUM_UNNECESSARY; in netsec_process_rx()
1049 napi_gro_receive(&priv->napi, skb); in netsec_process_rx()
1051 ndev->stats.rx_packets++; in netsec_process_rx()
1052 ndev->stats.rx_bytes += xdp.data_end - xdp.data; in netsec_process_rx()
1056 desc->len = desc_len; in netsec_process_rx()
1057 desc->dma_addr = dma_handle; in netsec_process_rx()
1058 desc->addr = buf_addr; in netsec_process_rx()
1061 dring->tail = (dring->tail + 1) % DESC_NUM; in netsec_process_rx()
1083 spin_lock_irqsave(&priv->reglock, flags); in netsec_napi_poll()
1086 spin_unlock_irqrestore(&priv->reglock, flags); in netsec_napi_poll()
1097 if (dring->head >= dring->tail) in netsec_desc_used()
1098 used = dring->head - dring->tail; in netsec_desc_used()
1100 used = dring->head + DESC_NUM - dring->tail; in netsec_desc_used()
1107 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; in netsec_check_stop_tx()
1110 if (DESC_NUM - used < 2) { in netsec_check_stop_tx()
1111 netif_stop_queue(priv->ndev); in netsec_check_stop_tx()
1119 if (DESC_NUM - used < 2) in netsec_check_stop_tx()
1122 netif_wake_queue(priv->ndev); in netsec_check_stop_tx()
1132 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; in netsec_netdev_start_xmit()
1138 spin_lock_bh(&dring->lock); in netsec_netdev_start_xmit()
1141 spin_unlock_bh(&dring->lock); in netsec_netdev_start_xmit()
1143 dev_name(priv->dev), ndev->name); in netsec_netdev_start_xmit()
1147 if (skb->ip_summed == CHECKSUM_PARTIAL) in netsec_netdev_start_xmit()
1151 tso_seg_len = skb_shinfo(skb)->gso_size; in netsec_netdev_start_xmit()
1154 if (skb->protocol == htons(ETH_P_IP)) { in netsec_netdev_start_xmit()
1155 ip_hdr(skb)->tot_len = 0; in netsec_netdev_start_xmit()
1156 tcp_hdr(skb)->check = in netsec_netdev_start_xmit()
1157 ~tcp_v4_check(0, ip_hdr(skb)->saddr, in netsec_netdev_start_xmit()
1158 ip_hdr(skb)->daddr, 0); in netsec_netdev_start_xmit()
1167 tx_desc.dma_addr = dma_map_single(priv->dev, skb->data, in netsec_netdev_start_xmit()
1169 if (dma_mapping_error(priv->dev, tx_desc.dma_addr)) { in netsec_netdev_start_xmit()
1170 spin_unlock_bh(&dring->lock); in netsec_netdev_start_xmit()
1171 netif_err(priv, drv, priv->ndev, in netsec_netdev_start_xmit()
1173 ndev->stats.tx_dropped++; in netsec_netdev_start_xmit()
1177 tx_desc.addr = skb->data; in netsec_netdev_start_xmit()
1182 netdev_sent_queue(priv->ndev, skb->len); in netsec_netdev_start_xmit()
1185 spin_unlock_bh(&dring->lock); in netsec_netdev_start_xmit()
1193 struct netsec_desc_ring *dring = &priv->desc_ring[id]; in netsec_uninit_pkt_dring()
1197 if (!dring->vaddr || !dring->desc) in netsec_uninit_pkt_dring()
1200 desc = &dring->desc[idx]; in netsec_uninit_pkt_dring()
1201 if (!desc->addr) in netsec_uninit_pkt_dring()
1205 struct page *page = virt_to_page(desc->addr); in netsec_uninit_pkt_dring()
1207 page_pool_put_full_page(dring->page_pool, page, false); in netsec_uninit_pkt_dring()
1209 dma_unmap_single(priv->dev, desc->dma_addr, desc->len, in netsec_uninit_pkt_dring()
1211 dev_kfree_skb(desc->skb); in netsec_uninit_pkt_dring()
1217 if (xdp_rxq_info_is_reg(&dring->xdp_rxq)) in netsec_uninit_pkt_dring()
1218 xdp_rxq_info_unreg(&dring->xdp_rxq); in netsec_uninit_pkt_dring()
1219 page_pool_destroy(dring->page_pool); in netsec_uninit_pkt_dring()
1222 memset(dring->desc, 0, sizeof(struct netsec_desc) * DESC_NUM); in netsec_uninit_pkt_dring()
1223 memset(dring->vaddr, 0, DESC_SZ * DESC_NUM); in netsec_uninit_pkt_dring()
1225 dring->head = 0; in netsec_uninit_pkt_dring()
1226 dring->tail = 0; in netsec_uninit_pkt_dring()
1229 netdev_reset_queue(priv->ndev); in netsec_uninit_pkt_dring()
1234 struct netsec_desc_ring *dring = &priv->desc_ring[id]; in netsec_free_dring()
1236 if (dring->vaddr) { in netsec_free_dring()
1237 dma_free_coherent(priv->dev, DESC_SZ * DESC_NUM, in netsec_free_dring()
1238 dring->vaddr, dring->desc_dma); in netsec_free_dring()
1239 dring->vaddr = NULL; in netsec_free_dring()
1242 kfree(dring->desc); in netsec_free_dring()
1243 dring->desc = NULL; in netsec_free_dring()
1248 struct netsec_desc_ring *dring = &priv->desc_ring[id]; in netsec_alloc_dring()
1250 dring->vaddr = dma_alloc_coherent(priv->dev, DESC_SZ * DESC_NUM, in netsec_alloc_dring()
1251 &dring->desc_dma, GFP_KERNEL); in netsec_alloc_dring()
1252 if (!dring->vaddr) in netsec_alloc_dring()
1255 dring->desc = kcalloc(DESC_NUM, sizeof(*dring->desc), GFP_KERNEL); in netsec_alloc_dring()
1256 if (!dring->desc) in netsec_alloc_dring()
1263 return -ENOMEM; in netsec_alloc_dring()
1268 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; in netsec_setup_tx_dring()
1274 de = dring->vaddr + (DESC_SZ * i); in netsec_setup_tx_dring()
1275 /* de->attr is not going to be accessed by the NIC in netsec_setup_tx_dring()
1279 de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; in netsec_setup_tx_dring()
1285 struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; in netsec_setup_rx_dring()
1286 struct bpf_prog *xdp_prog = READ_ONCE(priv->xdp_prog); in netsec_setup_rx_dring()
1293 .dev = priv->dev, in netsec_setup_rx_dring()
1300 dring->page_pool = page_pool_create(&pp_params); in netsec_setup_rx_dring()
1301 if (IS_ERR(dring->page_pool)) { in netsec_setup_rx_dring()
1302 err = PTR_ERR(dring->page_pool); in netsec_setup_rx_dring()
1303 dring->page_pool = NULL; in netsec_setup_rx_dring()
1307 err = xdp_rxq_info_reg(&dring->xdp_rxq, priv->ndev, 0); in netsec_setup_rx_dring()
1311 err = xdp_rxq_info_reg_mem_model(&dring->xdp_rxq, MEM_TYPE_PAGE_POOL, in netsec_setup_rx_dring()
1312 dring->page_pool); in netsec_setup_rx_dring()
1317 struct netsec_desc *desc = &dring->desc[i]; in netsec_setup_rx_dring()
1325 err = -ENOMEM; in netsec_setup_rx_dring()
1328 desc->dma_addr = dma_handle; in netsec_setup_rx_dring()
1329 desc->addr = buf; in netsec_setup_rx_dring()
1330 desc->len = len; in netsec_setup_rx_dring()
1351 return -ENOMEM; in netsec_netdev_load_ucode_region()
1365 addr_h = readl(priv->eeprom_base + NETSEC_EEPROM_HM_ME_ADDRESS_H); in netsec_netdev_load_microcode()
1366 addr_l = readl(priv->eeprom_base + NETSEC_EEPROM_HM_ME_ADDRESS_L); in netsec_netdev_load_microcode()
1367 size = readl(priv->eeprom_base + NETSEC_EEPROM_HM_ME_SIZE); in netsec_netdev_load_microcode()
1373 addr_h = readl(priv->eeprom_base + NETSEC_EEPROM_MH_ME_ADDRESS_H); in netsec_netdev_load_microcode()
1374 addr_l = readl(priv->eeprom_base + NETSEC_EEPROM_MH_ME_ADDRESS_L); in netsec_netdev_load_microcode()
1375 size = readl(priv->eeprom_base + NETSEC_EEPROM_MH_ME_SIZE); in netsec_netdev_load_microcode()
1382 addr_l = readl(priv->eeprom_base + NETSEC_EEPROM_PKT_ME_ADDRESS); in netsec_netdev_load_microcode()
1383 size = readl(priv->eeprom_base + NETSEC_EEPROM_PKT_ME_SIZE); in netsec_netdev_load_microcode()
1423 upper_32_bits(priv->desc_ring[NETSEC_RING_RX].desc_dma)); in netsec_reset_hardware()
1425 lower_32_bits(priv->desc_ring[NETSEC_RING_RX].desc_dma)); in netsec_reset_hardware()
1428 upper_32_bits(priv->desc_ring[NETSEC_RING_TX].desc_dma)); in netsec_reset_hardware()
1430 lower_32_bits(priv->desc_ring[NETSEC_RING_TX].desc_dma)); in netsec_reset_hardware()
1441 netif_err(priv, probe, priv->ndev, in netsec_reset_hardware()
1449 netsec_write(priv, NETSEC_REG_DMA_TMR_CTRL, priv->freq / 1000000 - 1); in netsec_reset_hardware()
1456 netif_err(priv, probe, priv->ndev, in netsec_reset_hardware()
1458 return -ENXIO; in netsec_reset_hardware()
1464 if (priv->ndev->mtu > ETH_DATA_LEN) in netsec_reset_hardware()
1486 struct phy_device *phydev = priv->ndev->phydev; in netsec_start_gmac()
1490 if (phydev->speed != SPEED_1000) in netsec_start_gmac()
1495 return -ETIMEDOUT; in netsec_start_gmac()
1498 return -ETIMEDOUT; in netsec_start_gmac()
1507 return -EAGAIN; in netsec_start_gmac()
1511 return -ETIMEDOUT; in netsec_start_gmac()
1515 return -ETIMEDOUT; in netsec_start_gmac()
1519 return -ETIMEDOUT; in netsec_start_gmac()
1522 return -ETIMEDOUT; in netsec_start_gmac()
1525 return -ETIMEDOUT; in netsec_start_gmac()
1527 return -ETIMEDOUT; in netsec_start_gmac()
1543 netsec_et_set_coalesce(priv->ndev, &priv->et_coalesce); in netsec_start_gmac()
1546 return -ETIMEDOUT; in netsec_start_gmac()
1573 if (ndev->phydev->link) in netsec_phy_adjust_link()
1578 phy_print_status(ndev->phydev); in netsec_phy_adjust_link()
1597 spin_lock_irqsave(&priv->reglock, flags); in netsec_irq_handler()
1599 spin_unlock_irqrestore(&priv->reglock, flags); in netsec_irq_handler()
1601 napi_schedule(&priv->napi); in netsec_irq_handler()
1611 pm_runtime_get_sync(priv->dev); in netsec_netdev_open()
1616 netif_err(priv, probe, priv->ndev, in netsec_netdev_open()
1621 ret = request_irq(priv->ndev->irq, netsec_irq_handler, in netsec_netdev_open()
1622 IRQF_SHARED, "netsec", priv); in netsec_netdev_open()
1624 netif_err(priv, drv, priv->ndev, "request_irq failed\n"); in netsec_netdev_open()
1628 if (dev_of_node(priv->dev)) { in netsec_netdev_open()
1629 if (!of_phy_connect(priv->ndev, priv->phy_np, in netsec_netdev_open()
1631 priv->phy_interface)) { in netsec_netdev_open()
1632 netif_err(priv, link, priv->ndev, "missing PHY\n"); in netsec_netdev_open()
1633 ret = -ENODEV; in netsec_netdev_open()
1637 ret = phy_connect_direct(priv->ndev, priv->phydev, in netsec_netdev_open()
1639 priv->phy_interface); in netsec_netdev_open()
1641 netif_err(priv, link, priv->ndev, in netsec_netdev_open()
1647 phy_start(ndev->phydev); in netsec_netdev_open()
1650 napi_enable(&priv->napi); in netsec_netdev_open()
1658 free_irq(priv->ndev->irq, priv); in netsec_netdev_open()
1662 pm_runtime_put_sync(priv->dev); in netsec_netdev_open()
1671 netif_stop_queue(priv->ndev); in netsec_netdev_stop()
1674 napi_disable(&priv->napi); in netsec_netdev_stop()
1679 free_irq(priv->ndev->irq, priv); in netsec_netdev_stop()
1684 phy_stop(ndev->phydev); in netsec_netdev_stop()
1685 phy_disconnect(ndev->phydev); in netsec_netdev_stop()
1689 pm_runtime_put_sync(priv->dev); in netsec_netdev_stop()
1711 data = netsec_phy_read(priv->mii_bus, priv->phy_addr, MII_BMCR); in netsec_netdev_init()
1712 netsec_phy_write(priv->mii_bus, priv->phy_addr, MII_BMCR, in netsec_netdev_init()
1720 netsec_phy_write(priv->mii_bus, priv->phy_addr, MII_BMCR, data); in netsec_netdev_init()
1722 spin_lock_init(&priv->desc_ring[NETSEC_RING_TX].lock); in netsec_netdev_init()
1723 spin_lock_init(&priv->desc_ring[NETSEC_RING_RX].lock); in netsec_netdev_init()
1746 priv->rx_cksum_offload_flag = !!(features & NETIF_F_RXCSUM); in netsec_netdev_set_features()
1755 struct netsec_desc_ring *tx_ring = &priv->desc_ring[NETSEC_RING_TX]; in netsec_xdp_xmit()
1760 return -EINVAL; in netsec_xdp_xmit()
1762 spin_lock(&tx_ring->lock); in netsec_xdp_xmit()
1772 tx_ring->xdp_xmit++; in netsec_xdp_xmit()
1775 spin_unlock(&tx_ring->lock); in netsec_xdp_xmit()
1778 netsec_xdp_ring_tx_db(priv, tx_ring->xdp_xmit); in netsec_xdp_xmit()
1779 tx_ring->xdp_xmit = 0; in netsec_xdp_xmit()
1782 return n - drops; in netsec_xdp_xmit()
1788 struct net_device *dev = priv->ndev; in netsec_xdp_setup()
1792 if (prog && dev->mtu > 1500) { in netsec_xdp_setup()
1794 return -EOPNOTSUPP; in netsec_xdp_setup()
1801 old_prog = xchg(&priv->xdp_prog, prog); in netsec_xdp_setup()
1815 switch (xdp->command) { in netsec_xdp()
1817 return netsec_xdp_setup(priv, xdp->prog, xdp->extack); in netsec_xdp()
1819 return -EINVAL; in netsec_xdp()
1842 err = of_get_phy_mode(pdev->dev.of_node, &priv->phy_interface); in netsec_of_probe()
1844 dev_err(&pdev->dev, "missing required property 'phy-mode'\n"); in netsec_of_probe()
1849 * SynQuacer is physically configured with TX and RX delays in netsec_of_probe()
1853 if (of_machine_is_compatible("socionext,developer-box") && in netsec_of_probe()
1854 priv->phy_interface != PHY_INTERFACE_MODE_RGMII_ID) { in netsec_of_probe()
1855 dev_warn(&pdev->dev, "Outdated firmware reports incorrect PHY mode, overriding\n"); in netsec_of_probe()
1856 priv->phy_interface = PHY_INTERFACE_MODE_RGMII_ID; in netsec_of_probe()
1859 priv->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0); in netsec_of_probe()
1860 if (!priv->phy_np) { in netsec_of_probe()
1861 dev_err(&pdev->dev, "missing required property 'phy-handle'\n"); in netsec_of_probe()
1862 return -EINVAL; in netsec_of_probe()
1865 *phy_addr = of_mdio_parse_addr(&pdev->dev, priv->phy_np); in netsec_of_probe()
1867 priv->clk = devm_clk_get(&pdev->dev, NULL); /* get by 'phy_ref_clk' */ in netsec_of_probe()
1868 if (IS_ERR(priv->clk)) { in netsec_of_probe()
1869 dev_err(&pdev->dev, "phy_ref_clk not found\n"); in netsec_of_probe()
1870 return PTR_ERR(priv->clk); in netsec_of_probe()
1872 priv->freq = clk_get_rate(priv->clk); in netsec_of_probe()
1883 return -ENODEV; in netsec_acpi_probe()
1888 * PHY correctly but passes the wrong mode string in the phy-mode in netsec_acpi_probe()
1891 priv->phy_interface = PHY_INTERFACE_MODE_NA; in netsec_acpi_probe()
1893 ret = device_property_read_u32(&pdev->dev, "phy-channel", phy_addr); in netsec_acpi_probe()
1895 dev_err(&pdev->dev, in netsec_acpi_probe()
1896 "missing required property 'phy-channel'\n"); in netsec_acpi_probe()
1900 ret = device_property_read_u32(&pdev->dev, in netsec_acpi_probe()
1901 "socionext,phy-clock-frequency", in netsec_acpi_probe()
1902 &priv->freq); in netsec_acpi_probe()
1904 dev_err(&pdev->dev, in netsec_acpi_probe()
1905 "missing required property 'socionext,phy-clock-frequency'\n"); in netsec_acpi_probe()
1911 struct phy_device *phydev = priv->phydev; in netsec_unregister_mdio()
1913 if (!dev_of_node(priv->dev) && phydev) { in netsec_unregister_mdio()
1918 mdiobus_unregister(priv->mii_bus); in netsec_unregister_mdio()
1926 bus = devm_mdiobus_alloc(priv->dev); in netsec_register_mdio()
1928 return -ENOMEM; in netsec_register_mdio()
1930 snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(priv->dev)); in netsec_register_mdio()
1931 bus->priv = priv; in netsec_register_mdio()
1932 bus->name = "SNI NETSEC MDIO"; in netsec_register_mdio()
1933 bus->read = netsec_phy_read; in netsec_register_mdio()
1934 bus->write = netsec_phy_write; in netsec_register_mdio()
1935 bus->parent = priv->dev; in netsec_register_mdio()
1936 priv->mii_bus = bus; in netsec_register_mdio()
1938 if (dev_of_node(priv->dev)) { in netsec_register_mdio()
1939 struct device_node *mdio_node, *parent = dev_of_node(priv->dev); in netsec_register_mdio()
1948 dev_info(priv->dev, "Upgrade f/w for mdio subnode!\n"); in netsec_register_mdio()
1955 dev_err(priv->dev, "mdiobus register err(%d)\n", ret); in netsec_register_mdio()
1960 bus->phy_mask = ~0; in netsec_register_mdio()
1963 dev_err(priv->dev, "mdiobus register err(%d)\n", ret); in netsec_register_mdio()
1967 priv->phydev = get_phy_device(bus, phy_addr, false); in netsec_register_mdio()
1968 if (IS_ERR(priv->phydev)) { in netsec_register_mdio()
1969 ret = PTR_ERR(priv->phydev); in netsec_register_mdio()
1970 dev_err(priv->dev, "get_phy_device err(%d)\n", ret); in netsec_register_mdio()
1971 priv->phydev = NULL; in netsec_register_mdio()
1973 return -ENODEV; in netsec_register_mdio()
1976 ret = phy_device_register(priv->phydev); in netsec_register_mdio()
1978 phy_device_free(priv->phydev); in netsec_register_mdio()
1980 dev_err(priv->dev, in netsec_register_mdio()
1999 dev_err(&pdev->dev, "No MMIO resource found.\n"); in netsec_probe()
2000 return -ENODEV; in netsec_probe()
2005 dev_info(&pdev->dev, "No EEPROM resource found.\n"); in netsec_probe()
2006 return -ENODEV; in netsec_probe()
2011 dev_err(&pdev->dev, "No IRQ resource found.\n"); in netsec_probe()
2012 return -ENODEV; in netsec_probe()
2017 return -ENOMEM; in netsec_probe()
2021 spin_lock_init(&priv->reglock); in netsec_probe()
2022 SET_NETDEV_DEV(ndev, &pdev->dev); in netsec_probe()
2024 ndev->irq = irq_res->start; in netsec_probe()
2025 priv->dev = &pdev->dev; in netsec_probe()
2026 priv->ndev = ndev; in netsec_probe()
2028 priv->msg_enable = NETIF_MSG_TX_ERR | NETIF_MSG_HW | NETIF_MSG_DRV | in netsec_probe()
2031 priv->ioaddr = devm_ioremap(&pdev->dev, mmio_res->start, in netsec_probe()
2033 if (!priv->ioaddr) { in netsec_probe()
2034 dev_err(&pdev->dev, "devm_ioremap() failed\n"); in netsec_probe()
2035 ret = -ENXIO; in netsec_probe()
2039 priv->eeprom_base = devm_ioremap(&pdev->dev, eeprom_res->start, in netsec_probe()
2041 if (!priv->eeprom_base) { in netsec_probe()
2042 dev_err(&pdev->dev, "devm_ioremap() failed for EEPROM\n"); in netsec_probe()
2043 ret = -ENXIO; in netsec_probe()
2047 mac = device_get_mac_address(&pdev->dev, macbuf, sizeof(macbuf)); in netsec_probe()
2049 ether_addr_copy(ndev->dev_addr, mac); in netsec_probe()
2051 if (priv->eeprom_base && in netsec_probe()
2052 (!mac || !is_valid_ether_addr(ndev->dev_addr))) { in netsec_probe()
2053 void __iomem *macp = priv->eeprom_base + in netsec_probe()
2056 ndev->dev_addr[0] = readb(macp + 3); in netsec_probe()
2057 ndev->dev_addr[1] = readb(macp + 2); in netsec_probe()
2058 ndev->dev_addr[2] = readb(macp + 1); in netsec_probe()
2059 ndev->dev_addr[3] = readb(macp + 0); in netsec_probe()
2060 ndev->dev_addr[4] = readb(macp + 7); in netsec_probe()
2061 ndev->dev_addr[5] = readb(macp + 6); in netsec_probe()
2064 if (!is_valid_ether_addr(ndev->dev_addr)) { in netsec_probe()
2065 dev_warn(&pdev->dev, "No MAC address found, using random\n"); in netsec_probe()
2069 if (dev_of_node(&pdev->dev)) in netsec_probe()
2076 priv->phy_addr = phy_addr; in netsec_probe()
2078 if (!priv->freq) { in netsec_probe()
2079 dev_err(&pdev->dev, "missing PHY reference clock frequency\n"); in netsec_probe()
2080 ret = -ENODEV; in netsec_probe()
2085 priv->et_coalesce.rx_coalesce_usecs = 500; in netsec_probe()
2086 priv->et_coalesce.rx_max_coalesced_frames = 8; in netsec_probe()
2087 priv->et_coalesce.tx_coalesce_usecs = 500; in netsec_probe()
2088 priv->et_coalesce.tx_max_coalesced_frames = 8; in netsec_probe()
2090 ret = device_property_read_u32(&pdev->dev, "max-frame-size", in netsec_probe()
2091 &ndev->max_mtu); in netsec_probe()
2093 ndev->max_mtu = ETH_DATA_LEN; in netsec_probe()
2096 pm_runtime_enable(&pdev->dev); in netsec_probe()
2097 pm_runtime_get_sync(&pdev->dev); in netsec_probe()
2100 /* this driver only supports F_TAIKI style NETSEC */ in netsec_probe()
2103 ret = -ENODEV; in netsec_probe()
2107 dev_info(&pdev->dev, "hardware revision %d.%d\n", in netsec_probe()
2110 netif_napi_add(ndev, &priv->napi, netsec_napi_poll, NAPI_POLL_WEIGHT); in netsec_probe()
2112 ndev->netdev_ops = &netsec_netdev_ops; in netsec_probe()
2113 ndev->ethtool_ops = &netsec_ethtool_ops; in netsec_probe()
2115 ndev->features |= NETIF_F_HIGHDMA | NETIF_F_RXCSUM | NETIF_F_GSO | in netsec_probe()
2117 ndev->hw_features = ndev->features; in netsec_probe()
2119 priv->rx_cksum_offload_flag = true; in netsec_probe()
2125 if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40))) in netsec_probe()
2126 dev_warn(&pdev->dev, "Failed to set DMA mask\n"); in netsec_probe()
2134 pm_runtime_put_sync(&pdev->dev); in netsec_probe()
2140 netif_napi_del(&priv->napi); in netsec_probe()
2142 pm_runtime_put_sync(&pdev->dev); in netsec_probe()
2143 pm_runtime_disable(&pdev->dev); in netsec_probe()
2146 dev_err(&pdev->dev, "init failed\n"); in netsec_probe()
2155 unregister_netdev(priv->ndev); in netsec_remove()
2159 netif_napi_del(&priv->napi); in netsec_remove()
2161 pm_runtime_disable(&pdev->dev); in netsec_remove()
2162 free_netdev(priv->ndev); in netsec_remove()
2174 clk_disable_unprepare(priv->clk); in netsec_runtime_suspend()
2183 clk_prepare_enable(priv->clk); in netsec_runtime_resume()
2197 { .compatible = "socionext,synquacer-netsec" },
2214 .name = "netsec",
2224 MODULE_DESCRIPTION("NETSEC Ethernet driver");