Lines Matching +full:ext +full:- +full:regs
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
284 device_printf(sc->dev, in enetc_setup_fixed()
285 "Device has fixed-link node without link speed specified\n"); in enetc_setup_fixed()
302 device_printf(sc->dev, "Unsupported link speed value of %d\n", in enetc_setup_fixed()
308 if (OF_hasprop(node, "full-duplex")) in enetc_setup_fixed()
313 sc->fixed_link = true; in enetc_setup_fixed()
315 ifmedia_init(&sc->fixed_ifmedia, 0, enetc_fixed_media_change, in enetc_setup_fixed()
317 ifmedia_add(&sc->fixed_ifmedia, speed, 0, NULL); in enetc_setup_fixed()
318 ifmedia_set(&sc->fixed_ifmedia, speed); in enetc_setup_fixed()
319 sc->shared->isc_media = &sc->fixed_ifmedia; in enetc_setup_fixed()
332 node = ofw_bus_get_node(sc->dev); in enetc_setup_phy()
333 fixed_link = ofw_bus_find_child(node, "fixed-link"); in enetc_setup_phy()
337 size = OF_getencprop(node, "phy-handle", &phy_handle, sizeof(phy_handle)); in enetc_setup_phy()
339 device_printf(sc->dev, in enetc_setup_phy()
346 device_printf(sc->dev, "Failed to obtain PHY address\n"); in enetc_setup_phy()
349 error = mii_attach(sc->dev, &sc->miibus, iflib_get_ifp(sc->ctx), in enetc_setup_phy()
353 device_printf(sc->dev, "mii_attach failed\n"); in enetc_setup_phy()
356 miid = device_get_softc(sc->miibus); in enetc_setup_phy()
357 sc->shared->isc_media = &miid->mii_media; in enetc_setup_phy()
371 sc->ctx = ctx; in enetc_attach_pre()
372 sc->dev = iflib_get_dev(ctx); in enetc_attach_pre()
373 sc->shared = scctx; in enetc_attach_pre()
375 mtx_init(&sc->mii_lock, "enetc_mdio", NULL, MTX_DEF); in enetc_attach_pre()
377 pci_save_state(sc->dev); in enetc_attach_pre()
378 pcie_flr(sc->dev, 1000, false); in enetc_attach_pre()
379 pci_restore_state(sc->dev); in enetc_attach_pre()
382 sc->regs = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); in enetc_attach_pre()
383 if (sc->regs == NULL) { in enetc_attach_pre()
384 device_printf(sc->dev, in enetc_attach_pre()
392 &sc->ctrl_queue.dma, in enetc_attach_pre()
395 device_printf(sc->dev, "Failed to allocate control ring\n"); in enetc_attach_pre()
398 sc->ctrl_queue.ring = (struct enetc_cbd*)sc->ctrl_queue.dma.idi_vaddr; in enetc_attach_pre()
400 scctx->isc_txrx = &enetc_txrx; in enetc_attach_pre()
401 scctx->isc_tx_nsegments = ENETC_MAX_SCATTER; in enetc_attach_pre()
402 enetc_max_nqueues(sc, &scctx->isc_nrxqsets_max, &scctx->isc_ntxqsets_max); in enetc_attach_pre()
404 if (scctx->isc_ntxd[0] % ENETC_DESC_ALIGN != 0) { in enetc_attach_pre()
405 device_printf(sc->dev, in enetc_attach_pre()
411 if (scctx->isc_nrxd[0] % ENETC_DESC_ALIGN != 0) { in enetc_attach_pre()
412 device_printf(sc->dev, in enetc_attach_pre()
418 scctx->isc_txqsizes[0] = scctx->isc_ntxd[0] * sizeof(union enetc_tx_bd); in enetc_attach_pre()
419 scctx->isc_rxqsizes[0] = scctx->isc_nrxd[0] * sizeof(union enetc_rx_bd); in enetc_attach_pre()
420 scctx->isc_txd_size[0] = sizeof(union enetc_tx_bd); in enetc_attach_pre()
421 scctx->isc_rxd_size[0] = sizeof(union enetc_rx_bd); in enetc_attach_pre()
422 scctx->isc_tx_csum_flags = 0; in enetc_attach_pre()
423 scctx->isc_capabilities = scctx->isc_capenable = ENETC_IFCAPS; in enetc_attach_pre()
429 scctx->isc_msix_bar = pci_msix_table_bar(sc->dev); in enetc_attach_pre()
459 for (i = 0; i < sc->rx_num_queues; i++) in enetc_detach()
460 iflib_irq_free(ctx, &sc->rx_queues[i].irq); in enetc_detach()
462 bus_generic_detach(sc->dev); in enetc_detach()
464 if (sc->regs != NULL) in enetc_detach()
465 error = bus_release_resource(sc->dev, SYS_RES_MEMORY, in enetc_detach()
466 rman_get_rid(sc->regs), sc->regs); in enetc_detach()
468 if (sc->ctrl_queue.dma.idi_size != 0) in enetc_detach()
469 iflib_dma_free(&sc->ctrl_queue.dma); in enetc_detach()
471 mtx_destroy(&sc->mii_lock); in enetc_detach()
488 sc->tx_queues = mallocarray(sc->tx_num_queues, in enetc_tx_queues_alloc()
490 if (sc->tx_queues == NULL) { in enetc_tx_queues_alloc()
491 device_printf(sc->dev, in enetc_tx_queues_alloc()
496 for (i = 0; i < sc->tx_num_queues; i++) { in enetc_tx_queues_alloc()
497 queue = &sc->tx_queues[i]; in enetc_tx_queues_alloc()
498 queue->sc = sc; in enetc_tx_queues_alloc()
499 queue->ring = (union enetc_tx_bd*)(vaddrs[i]); in enetc_tx_queues_alloc()
500 queue->ring_paddr = paddrs[i]; in enetc_tx_queues_alloc()
501 queue->cidx = 0; in enetc_tx_queues_alloc()
518 sc->rx_queues = mallocarray(sc->rx_num_queues, in enetc_rx_queues_alloc()
520 if (sc->rx_queues == NULL) { in enetc_rx_queues_alloc()
521 device_printf(sc->dev, in enetc_rx_queues_alloc()
526 for (i = 0; i < sc->rx_num_queues; i++) { in enetc_rx_queues_alloc()
527 queue = &sc->rx_queues[i]; in enetc_rx_queues_alloc()
528 queue->sc = sc; in enetc_rx_queues_alloc()
529 queue->qid = i; in enetc_rx_queues_alloc()
530 queue->ring = (union enetc_rx_bd*)(vaddrs[i]); in enetc_rx_queues_alloc()
531 queue->ring_paddr = paddrs[i]; in enetc_rx_queues_alloc()
544 if (sc->tx_queues != NULL) { in enetc_queues_free()
545 free(sc->tx_queues, M_DEVBUF); in enetc_queues_free()
546 sc->tx_queues = NULL; in enetc_queues_free()
548 if (sc->rx_queues != NULL) { in enetc_queues_free()
549 free(sc->rx_queues, M_DEVBUF); in enetc_queues_free()
550 sc->rx_queues = NULL; in enetc_queues_free()
570 ether_gen_addr(iflib_get_ifp(sc->ctx), &hwaddr); in enetc_get_hwaddr()
571 device_printf(sc->dev, in enetc_get_hwaddr()
577 iflib_set_mac(sc->ctx, hwaddr.octet); in enetc_get_hwaddr()
588 ifp = iflib_get_ifp(sc->ctx); in enetc_set_hwaddr()
618 ENETC_WR4(sc, ENETC_SIRBGCR, sc->rx_num_queues); in enetc_setup_rss()
620 error = iflib_dma_alloc_align(sc->ctx, in enetc_setup_rss()
626 device_printf(sc->dev, "Failed to allocate DMA buffer for RSS\n"); in enetc_setup_rss()
632 rss_table[i] = i % sc->rx_num_queues; in enetc_setup_rss()
637 device_printf(sc->dev, "Failed to setup RSS table\n"); in enetc_setup_rss()
652 queue = &sc->ctrl_queue; in enetc_ctrl_send()
653 desc = &queue->ring[queue->pidx]; in enetc_ctrl_send()
655 if (++queue->pidx == ENETC_MIN_DESC) in enetc_ctrl_send()
656 queue->pidx = 0; in enetc_ctrl_send()
658 desc->addr[0] = (uint32_t)dma->idi_paddr; in enetc_ctrl_send()
659 desc->addr[1] = (uint32_t)(dma->idi_paddr >> 32); in enetc_ctrl_send()
660 desc->index = 0; in enetc_ctrl_send()
661 desc->length = (uint16_t)size; in enetc_ctrl_send()
662 desc->cmd = (uint8_t)cmd; in enetc_ctrl_send()
663 desc->cls = (uint8_t)(cmd >> 8); in enetc_ctrl_send()
664 desc->status_flags = 0; in enetc_ctrl_send()
667 bus_dmamap_sync(dma->idi_tag, dma->idi_map, BUS_DMASYNC_PREWRITE); in enetc_ctrl_send()
669 bus_dmamap_sync(queue->dma.idi_tag, queue->dma.idi_map, BUS_DMASYNC_PREWRITE); in enetc_ctrl_send()
670 ENETC_WR4(sc, ENETC_SICBDRPIR, queue->pidx); in enetc_ctrl_send()
672 while (--timeout != 0) { in enetc_ctrl_send()
674 if (ENETC_RD4(sc, ENETC_SICBDRCIR) == queue->pidx) in enetc_ctrl_send()
681 bus_dmamap_sync(dma->idi_tag, dma->idi_map, BUS_DMASYNC_POSTREAD); in enetc_ctrl_send()
695 val = ENETC_PSICFGR0_SET_TXBDR(sc->tx_num_queues); in enetc_init_hw()
696 val |= ENETC_PSICFGR0_SET_RXBDR(sc->rx_num_queues); in enetc_init_hw()
723 struct enetc_ctrl_queue *queue = &sc->ctrl_queue; in enetc_init_ctrl()
726 (uint32_t)queue->dma.idi_paddr); in enetc_init_ctrl()
728 (uint32_t)(queue->dma.idi_paddr >> 32)); in enetc_init_ctrl()
730 queue->dma.idi_size / sizeof(struct enetc_cbd)); in enetc_init_ctrl()
732 queue->pidx = 0; in enetc_init_ctrl()
733 ENETC_WR4(sc, ENETC_SICBDRPIR, queue->pidx); in enetc_init_ctrl()
734 ENETC_WR4(sc, ENETC_SICBDRCIR, queue->pidx); in enetc_init_ctrl()
744 for (i = 0; i < sc->tx_num_queues; i++) { in enetc_init_tx()
745 queue = &sc->tx_queues[i]; in enetc_init_tx()
748 (uint32_t)queue->ring_paddr); in enetc_init_tx()
750 (uint32_t)(queue->ring_paddr >> 32)); in enetc_init_tx()
751 ENETC_TXQ_WR4(sc, i, ENETC_TBLENR, sc->tx_queue_size); in enetc_init_tx()
775 rx_buf_size = iflib_get_rx_mbuf_sz(sc->ctx); in enetc_init_rx()
777 for (i = 0; i < sc->rx_num_queues; i++) { in enetc_init_rx()
778 queue = &sc->rx_queues[i]; in enetc_init_rx()
781 (uint32_t)queue->ring_paddr); in enetc_init_rx()
783 (uint32_t)(queue->ring_paddr >> 32)); in enetc_init_rx()
784 ENETC_RXQ_WR4(sc, i, ENETC_RBLENR, sc->rx_queue_size); in enetc_init_rx()
788 queue->enabled = false; in enetc_init_rx()
831 revid = pci_get_revid(sc->dev); in enetc_setup_multicast()
871 if (++sc->vlan_bitmap[hash] != 1) in enetc_vlan_register()
891 MPASS(sc->vlan_bitmap[hash] > 0); in enetc_vlan_unregister()
892 if (--sc->vlan_bitmap[hash] != 0) in enetc_vlan_unregister()
914 max_frame_length = sc->shared->isc_max_frame_size; in enetc_init()
930 sc->rbmr = ENETC_RBMR_EN; in enetc_init()
933 sc->rbmr |= ENETC_RBMR_VTE; in enetc_init()
941 if (sc->fixed_link) { in enetc_init()
942 baudrate = ifmedia_baudrate(sc->fixed_ifmedia.ifm_cur->ifm_media); in enetc_init()
943 iflib_link_state_change(sc->ctx, LINK_STATE_UP, baudrate); in enetc_init()
949 miid = device_get_softc(sc->miibus); in enetc_init()
966 while (pidx != cidx && timeout--) { in enetc_disable_txq()
972 device_printf(sc->dev, in enetc_disable_txq()
987 for (i = 0; i < sc->rx_num_queues; i++) in enetc_stop()
990 for (i = 0; i < sc->tx_num_queues; i++) in enetc_stop()
1005 MPASS(sc->rx_num_queues + 1 <= ENETC_MSIX_COUNT); in enetc_msix_intr_assign()
1006 MPASS(sc->rx_num_queues == sc->tx_num_queues); in enetc_msix_intr_assign()
1008 for (i = 0; i < sc->rx_num_queues; i++, vector++) { in enetc_msix_intr_assign()
1009 rx_queue = &sc->rx_queues[i]; in enetc_msix_intr_assign()
1012 &rx_queue->irq, vector + 1, IFLIB_INTR_RXTX, in enetc_msix_intr_assign()
1023 for (i = 0;i < sc->tx_num_queues; i++, vector++) { in enetc_msix_intr_assign()
1024 tx_queue = &sc->tx_queues[i]; in enetc_msix_intr_assign()
1026 iflib_softirq_alloc_generic(ctx, &tx_queue->irq, in enetc_msix_intr_assign()
1034 for (i = 0; i < sc->rx_num_queues; i++) { in enetc_msix_intr_assign()
1035 rx_queue = &sc->rx_queues[i]; in enetc_msix_intr_assign()
1036 iflib_irq_free(ctx, &rx_queue->irq); in enetc_msix_intr_assign()
1068 for (i = 0; i < sc->rx_num_queues; i++) in enetc_intr_enable()
1071 for (i = 0; i < sc->tx_num_queues; i++) in enetc_intr_enable()
1083 for (i = 0; i < sc->rx_num_queues; i++) in enetc_intr_disable()
1086 for (i = 0; i < sc->tx_num_queues; i++) in enetc_intr_disable()
1100 queue = &sc->tx_queues[ipi->ipi_qsidx]; in enetc_isc_txd_encap()
1101 segs = ipi->ipi_segs; in enetc_isc_txd_encap()
1102 pidx = ipi->ipi_pidx; in enetc_isc_txd_encap()
1103 queue_len = sc->tx_queue_size; in enetc_isc_txd_encap()
1109 desc = &queue->ring[pidx]; in enetc_isc_txd_encap()
1111 desc->frm_len = ipi->ipi_len; in enetc_isc_txd_encap()
1112 desc->addr = segs[i].ds_addr; in enetc_isc_txd_encap()
1113 desc->buf_len = segs[i].ds_len; in enetc_isc_txd_encap()
1114 if (ipi->ipi_flags & IPI_TX_INTR) in enetc_isc_txd_encap()
1115 desc->flags = ENETC_TXBD_FLAGS_FI; in enetc_isc_txd_encap()
1121 if (ipi->ipi_mflags & M_VLANTAG) { in enetc_isc_txd_encap()
1123 desc->flags |= ENETC_TXBD_FLAGS_EX; in enetc_isc_txd_encap()
1124 desc = &queue->ring[pidx]; in enetc_isc_txd_encap()
1126 desc->ext.vid = ipi->ipi_vtag; in enetc_isc_txd_encap()
1127 desc->ext.e_flags = ENETC_TXBD_E_FLAGS_VLAN_INS; in enetc_isc_txd_encap()
1133 for (;i < ipi->ipi_nsegs; i++) { in enetc_isc_txd_encap()
1134 desc = &queue->ring[pidx]; in enetc_isc_txd_encap()
1136 desc->addr = segs[i].ds_addr; in enetc_isc_txd_encap()
1137 desc->buf_len = segs[i].ds_len; in enetc_isc_txd_encap()
1143 desc->flags |= ENETC_TXBD_FLAGS_F; in enetc_isc_txd_encap()
1144 ipi->ipi_new_pidx = pidx; in enetc_isc_txd_encap()
1164 queue = &sc->tx_queues[qid]; in enetc_isc_txd_credits_update()
1166 cidx = queue->cidx; in enetc_isc_txd_credits_update()
1169 * RM states that the ring can hold at most ring_size - 1 descriptors. in enetc_isc_txd_credits_update()
1184 count = hw_cidx - cidx; in enetc_isc_txd_credits_update()
1186 count += sc->tx_queue_size; in enetc_isc_txd_credits_update()
1188 queue->cidx = hw_cidx; in enetc_isc_txd_credits_update()
1202 queue = &sc->rx_queues[qid]; in enetc_isc_rxd_available()
1203 desc = &queue->ring[pidx]; in enetc_isc_rxd_available()
1204 queue_len = sc->rx_queue_size; in enetc_isc_rxd_available()
1206 if (desc->r.lstatus == 0) in enetc_isc_rxd_available()
1214 desc = &queue->ring[pidx]; in enetc_isc_rxd_available()
1215 if (desc->r.lstatus & ENETC_RXBD_LSTATUS_F) in enetc_isc_rxd_available()
1236 cidx = ri->iri_cidx; in enetc_isc_rxd_pkt_get()
1237 queue = &sc->rx_queues[ri->iri_qsidx]; in enetc_isc_rxd_pkt_get()
1238 desc = &queue->ring[cidx]; in enetc_isc_rxd_pkt_get()
1239 status = desc->r.lstatus; in enetc_isc_rxd_pkt_get()
1240 queue_len = sc->rx_queue_size; in enetc_isc_rxd_pkt_get()
1251 ri->iri_flowid = desc->r.rss_hash; in enetc_isc_rxd_pkt_get()
1252 ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH; in enetc_isc_rxd_pkt_get()
1256 ri->iri_csum_flags = CSUM_IP_CHECKED; in enetc_isc_rxd_pkt_get()
1257 if ((desc->r.parse_summary & ENETC_RXBD_PARSER_ERROR) == 0) in enetc_isc_rxd_pkt_get()
1258 ri->iri_csum_flags |= CSUM_IP_VALID; in enetc_isc_rxd_pkt_get()
1262 ri->iri_vtag = desc->r.vlan_opt; in enetc_isc_rxd_pkt_get()
1263 ri->iri_flags = M_VLANTAG; in enetc_isc_rxd_pkt_get()
1267 buf_len = desc->r.buf_len; in enetc_isc_rxd_pkt_get()
1268 ri->iri_frags[i].irf_idx = cidx; in enetc_isc_rxd_pkt_get()
1269 ri->iri_frags[i].irf_len = buf_len; in enetc_isc_rxd_pkt_get()
1271 if (desc->r.lstatus & ENETC_RXBD_LSTATUS_F) in enetc_isc_rxd_pkt_get()
1277 desc = &queue->ring[cidx]; in enetc_isc_rxd_pkt_get()
1279 ri->iri_nfrags = i + 1; in enetc_isc_rxd_pkt_get()
1280 ri->iri_len = pkt_size; in enetc_isc_rxd_pkt_get()
1282 MPASS(desc->r.lstatus & ENETC_RXBD_LSTATUS_F); in enetc_isc_rxd_pkt_get()
1299 queue = &sc->rx_queues[iru->iru_qsidx]; in enetc_isc_rxd_refill()
1300 paddrs = iru->iru_paddrs; in enetc_isc_rxd_refill()
1301 pidx = iru->iru_pidx; in enetc_isc_rxd_refill()
1302 count = iru->iru_count; in enetc_isc_rxd_refill()
1303 queue_len = sc->rx_queue_size; in enetc_isc_rxd_refill()
1306 desc = &queue->ring[pidx]; in enetc_isc_rxd_refill()
1309 desc->w.addr = paddrs[i]; in enetc_isc_rxd_refill()
1319 if (!queue->enabled && pidx >= 8) { in enetc_isc_rxd_refill()
1320 ENETC_RXQ_WR4(sc, iru->iru_qsidx, ENETC_RBMR, sc->rbmr); in enetc_isc_rxd_refill()
1321 queue->enabled = true; in enetc_isc_rxd_refill()
1366 sc->shared->isc_max_frame_size = max_frame_size; in enetc_mtu_set()
1408 if (!sc->fixed_link) { in enetc_update_admin_status()
1409 miid = device_get_softc(sc->miibus); in enetc_update_admin_status()
1432 mtx_lock(&sc->mii_lock); in enetc_miibus_readreg()
1433 val = enetc_mdio_read(sc->regs, ENETC_PORT_BASE + ENETC_EMDIO_BASE, in enetc_miibus_readreg()
1435 mtx_unlock(&sc->mii_lock); in enetc_miibus_readreg()
1448 mtx_lock(&sc->mii_lock); in enetc_miibus_writereg()
1449 ret = enetc_mdio_write(sc->regs, ENETC_PORT_BASE + ENETC_EMDIO_BASE, in enetc_miibus_writereg()
1451 mtx_unlock(&sc->mii_lock); in enetc_miibus_writereg()
1471 miid = device_get_softc(sc->miibus); in enetc_miibus_statchg()
1473 baudrate = ifmedia_baudrate(miid->mii_media_active); in enetc_miibus_statchg()
1474 if (miid->mii_media_status & IFM_AVALID) { in enetc_miibus_statchg()
1475 if (miid->mii_media_status & IFM_ACTIVE) in enetc_miibus_statchg()
1483 iflib_link_state_change(sc->ctx, link_state, baudrate); in enetc_miibus_statchg()
1494 miid = device_get_softc(sc->miibus); in enetc_media_change()
1507 miid = device_get_softc(sc->miibus); in enetc_media_status()
1511 ifmr->ifm_active = miid->mii_media_active; in enetc_media_status()
1512 ifmr->ifm_status = miid->mii_media_status; in enetc_media_status()
1519 if_printf(ifp, "Can't change media in fixed-link mode.\n"); in enetc_fixed_media_change()
1529 ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; in enetc_fixed_media_status()
1530 ifmr->ifm_active = sc->fixed_ifmedia.ifm_cur->ifm_media; in enetc_fixed_media_status()