Lines Matching refs:sc

220 #define RD4(sc, off)		(bus_read_4((sc)->mem_res, (off)))  argument
221 #define WR4(sc, off, val) (bus_write_4((sc)->mem_res, (off), (val))) argument
222 #define BARRIER(sc, off, len, flags) \ argument
223 (bus_barrier((sc)->mem_res, (off), (len), (flags))
225 #define CGEM_LOCK(sc) mtx_lock(&(sc)->sc_mtx) argument
226 #define CGEM_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) argument
227 #define CGEM_LOCK_INIT(sc) mtx_init(&(sc)->sc_mtx, \ argument
228 device_get_nameunit((sc)->dev), MTX_NETWORK_LOCK, MTX_DEF)
229 #define CGEM_LOCK_DESTROY(sc) mtx_destroy(&(sc)->sc_mtx) argument
230 #define CGEM_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) argument
246 cgem_get_mac(struct cgem_softc *sc, u_char eaddr[]) in cgem_get_mac() argument
253 uint32_t low = RD4(sc, CGEM_SPEC_ADDR_LOW(i)); in cgem_get_mac()
254 uint32_t high = RD4(sc, CGEM_SPEC_ADDR_HI(i)) & 0xffff; in cgem_get_mac()
277 device_printf(sc->dev, "no mac address found, assigning " in cgem_get_mac()
283 WR4(sc, CGEM_SPEC_ADDR_LOW(0), (eaddr[3] << 24) | in cgem_get_mac()
285 WR4(sc, CGEM_SPEC_ADDR_HI(0), (eaddr[5] << 8) | eaddr[4]); in cgem_get_mac()
288 WR4(sc, CGEM_SPEC_ADDR_LOW(i), 0); in cgem_get_mac()
289 WR4(sc, CGEM_SPEC_ADDR_HI(i), 0); in cgem_get_mac()
338 cgem_rx_filter(struct cgem_softc *sc) in cgem_rx_filter() argument
340 if_t ifp = sc->ifp; in cgem_rx_filter()
343 sc->net_cfg_shadow &= ~(CGEM_NET_CFG_MULTI_HASH_EN | in cgem_rx_filter()
347 sc->net_cfg_shadow |= CGEM_NET_CFG_COPY_ALL; in cgem_rx_filter()
350 sc->net_cfg_shadow |= CGEM_NET_CFG_NO_BCAST; in cgem_rx_filter()
358 sc->net_cfg_shadow |= CGEM_NET_CFG_MULTI_HASH_EN; in cgem_rx_filter()
361 WR4(sc, CGEM_HASH_TOP, hashes[0]); in cgem_rx_filter()
362 WR4(sc, CGEM_HASH_BOT, hashes[1]); in cgem_rx_filter()
363 WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); in cgem_rx_filter()
378 cgem_null_qs(struct cgem_softc *sc) in cgem_null_qs() argument
386 queue_mask = (RD4(sc, CGEM_DESIGN_CFG6) & in cgem_null_qs()
392 memset(sc->null_qs, 0, sizeof(struct cgem_rx_desc) + in cgem_null_qs()
394 rx_desc = sc->null_qs; in cgem_null_qs()
401 WR4(sc, CGEM_RX_QN_BAR(n), sc->null_qs_physaddr); in cgem_null_qs()
402 WR4(sc, CGEM_TX_QN_BAR(n), sc->null_qs_physaddr + in cgem_null_qs()
409 cgem_setup_descs(struct cgem_softc *sc) in cgem_setup_descs() argument
415 if (sc->neednullqs) in cgem_setup_descs()
419 sc->txring = NULL; in cgem_setup_descs()
420 sc->rxring = NULL; in cgem_setup_descs()
423 err = bus_dma_tag_create(bus_get_dma_tag(sc->dev), 1, in cgem_setup_descs()
431 busdma_lock_mutex, &sc->sc_mtx, &sc->desc_dma_tag); in cgem_setup_descs()
436 err = bus_dma_tag_create(bus_get_dma_tag(sc->dev), 1, 0, in cgem_setup_descs()
438 TX_MAX_DMA_SEGS, MCLBYTES, 0, busdma_lock_mutex, &sc->sc_mtx, in cgem_setup_descs()
439 &sc->mbuf_dma_tag); in cgem_setup_descs()
449 err = bus_dmamem_alloc(sc->desc_dma_tag, (void **)&sc->rxring, in cgem_setup_descs()
451 &sc->rxring_dma_map); in cgem_setup_descs()
456 err = bus_dmamap_load(sc->desc_dma_tag, sc->rxring_dma_map, in cgem_setup_descs()
457 (void *)sc->rxring, desc_rings_size, in cgem_setup_descs()
458 cgem_getaddr, &sc->rxring_physaddr, BUS_DMA_NOWAIT); in cgem_setup_descs()
464 sc->rxring[i].addr = CGEM_RXDESC_OWN; in cgem_setup_descs()
465 sc->rxring[i].ctl = 0; in cgem_setup_descs()
466 sc->rxring_m[i] = NULL; in cgem_setup_descs()
467 sc->rxring_m_dmamap[i] = NULL; in cgem_setup_descs()
469 sc->rxring[CGEM_NUM_RX_DESCS - 1].addr |= CGEM_RXDESC_WRAP; in cgem_setup_descs()
471 sc->rxring_hd_ptr = 0; in cgem_setup_descs()
472 sc->rxring_tl_ptr = 0; in cgem_setup_descs()
473 sc->rxring_queued = 0; in cgem_setup_descs()
475 sc->txring = (struct cgem_tx_desc *)(sc->rxring + CGEM_NUM_RX_DESCS); in cgem_setup_descs()
476 sc->txring_physaddr = sc->rxring_physaddr + CGEM_NUM_RX_DESCS * in cgem_setup_descs()
481 sc->txring[i].addr = 0; in cgem_setup_descs()
482 sc->txring[i].ctl = CGEM_TXDESC_USED; in cgem_setup_descs()
483 sc->txring_m[i] = NULL; in cgem_setup_descs()
484 sc->txring_m_dmamap[i] = NULL; in cgem_setup_descs()
486 sc->txring[CGEM_NUM_TX_DESCS - 1].ctl |= CGEM_TXDESC_WRAP; in cgem_setup_descs()
488 sc->txring_hd_ptr = 0; in cgem_setup_descs()
489 sc->txring_tl_ptr = 0; in cgem_setup_descs()
490 sc->txring_queued = 0; in cgem_setup_descs()
492 if (sc->neednullqs) { in cgem_setup_descs()
493 sc->null_qs = (void *)(sc->txring + CGEM_NUM_TX_DESCS); in cgem_setup_descs()
494 sc->null_qs_physaddr = sc->txring_physaddr + in cgem_setup_descs()
497 cgem_null_qs(sc); in cgem_setup_descs()
505 cgem_fill_rqueue(struct cgem_softc *sc) in cgem_fill_rqueue() argument
511 CGEM_ASSERT_LOCKED(sc); in cgem_fill_rqueue()
513 while (sc->rxring_queued < sc->rxbufs) { in cgem_fill_rqueue()
521 m->m_pkthdr.rcvif = sc->ifp; in cgem_fill_rqueue()
524 if (bus_dmamap_create(sc->mbuf_dma_tag, 0, in cgem_fill_rqueue()
525 &sc->rxring_m_dmamap[sc->rxring_hd_ptr])) { in cgem_fill_rqueue()
526 sc->rxdmamapfails++; in cgem_fill_rqueue()
530 if (bus_dmamap_load_mbuf_sg(sc->mbuf_dma_tag, in cgem_fill_rqueue()
531 sc->rxring_m_dmamap[sc->rxring_hd_ptr], m, in cgem_fill_rqueue()
533 sc->rxdmamapfails++; in cgem_fill_rqueue()
534 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_fill_rqueue()
535 sc->rxring_m_dmamap[sc->rxring_hd_ptr]); in cgem_fill_rqueue()
536 sc->rxring_m_dmamap[sc->rxring_hd_ptr] = NULL; in cgem_fill_rqueue()
540 sc->rxring_m[sc->rxring_hd_ptr] = m; in cgem_fill_rqueue()
543 bus_dmamap_sync(sc->mbuf_dma_tag, in cgem_fill_rqueue()
544 sc->rxring_m_dmamap[sc->rxring_hd_ptr], in cgem_fill_rqueue()
548 sc->rxring[sc->rxring_hd_ptr].ctl = 0; in cgem_fill_rqueue()
550 sc->rxring[sc->rxring_hd_ptr].addrhi = segs[0].ds_addr >> 32; in cgem_fill_rqueue()
552 if (sc->rxring_hd_ptr == CGEM_NUM_RX_DESCS - 1) { in cgem_fill_rqueue()
553 sc->rxring[sc->rxring_hd_ptr].addr = segs[0].ds_addr | in cgem_fill_rqueue()
555 sc->rxring_hd_ptr = 0; in cgem_fill_rqueue()
557 sc->rxring[sc->rxring_hd_ptr++].addr = segs[0].ds_addr; in cgem_fill_rqueue()
559 sc->rxring_queued++; in cgem_fill_rqueue()
565 cgem_recv(struct cgem_softc *sc) in cgem_recv() argument
567 if_t ifp = sc->ifp; in cgem_recv()
571 CGEM_ASSERT_LOCKED(sc); in cgem_recv()
576 while (sc->rxring_queued > 0 && in cgem_recv()
577 (sc->rxring[sc->rxring_tl_ptr].addr & CGEM_RXDESC_OWN) != 0) { in cgem_recv()
578 ctl = sc->rxring[sc->rxring_tl_ptr].ctl; in cgem_recv()
581 m = sc->rxring_m[sc->rxring_tl_ptr]; in cgem_recv()
582 sc->rxring_m[sc->rxring_tl_ptr] = NULL; in cgem_recv()
585 bus_dmamap_sync(sc->mbuf_dma_tag, in cgem_recv()
586 sc->rxring_m_dmamap[sc->rxring_tl_ptr], in cgem_recv()
590 bus_dmamap_unload(sc->mbuf_dma_tag, in cgem_recv()
591 sc->rxring_m_dmamap[sc->rxring_tl_ptr]); in cgem_recv()
592 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_recv()
593 sc->rxring_m_dmamap[sc->rxring_tl_ptr]); in cgem_recv()
594 sc->rxring_m_dmamap[sc->rxring_tl_ptr] = NULL; in cgem_recv()
597 if (++sc->rxring_tl_ptr == CGEM_NUM_RX_DESCS) in cgem_recv()
598 sc->rxring_tl_ptr = 0; in cgem_recv()
599 sc->rxring_queued--; in cgem_recv()
650 cgem_fill_rqueue(sc); in cgem_recv()
653 CGEM_UNLOCK(sc); in cgem_recv()
661 CGEM_LOCK(sc); in cgem_recv()
666 cgem_clean_tx(struct cgem_softc *sc) in cgem_clean_tx() argument
671 CGEM_ASSERT_LOCKED(sc); in cgem_clean_tx()
674 while (sc->txring_queued > 0 && in cgem_clean_tx()
675 ((ctl = sc->txring[sc->txring_tl_ptr].ctl) & in cgem_clean_tx()
678 bus_dmamap_sync(sc->mbuf_dma_tag, in cgem_clean_tx()
679 sc->txring_m_dmamap[sc->txring_tl_ptr], in cgem_clean_tx()
683 bus_dmamap_unload(sc->mbuf_dma_tag, in cgem_clean_tx()
684 sc->txring_m_dmamap[sc->txring_tl_ptr]); in cgem_clean_tx()
685 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_clean_tx()
686 sc->txring_m_dmamap[sc->txring_tl_ptr]); in cgem_clean_tx()
687 sc->txring_m_dmamap[sc->txring_tl_ptr] = NULL; in cgem_clean_tx()
690 m = sc->txring_m[sc->txring_tl_ptr]; in cgem_clean_tx()
691 sc->txring_m[sc->txring_tl_ptr] = NULL; in cgem_clean_tx()
698 device_printf(sc->dev, in cgem_clean_tx()
700 sc->txring[sc->txring_tl_ptr].addrhi, in cgem_clean_tx()
701 sc->txring[sc->txring_tl_ptr].addr); in cgem_clean_tx()
703 device_printf(sc->dev, in cgem_clean_tx()
705 sc->txring[sc->txring_tl_ptr].addr); in cgem_clean_tx()
709 if_inc_counter(sc->ifp, IFCOUNTER_OERRORS, 1); in cgem_clean_tx()
711 if_inc_counter(sc->ifp, IFCOUNTER_OPACKETS, 1); in cgem_clean_tx()
720 sc->txring_tl_ptr = 0; in cgem_clean_tx()
722 sc->txring_tl_ptr++; in cgem_clean_tx()
723 sc->txring_queued--; in cgem_clean_tx()
725 ctl = sc->txring[sc->txring_tl_ptr].ctl; in cgem_clean_tx()
727 sc->txring[sc->txring_tl_ptr].ctl = in cgem_clean_tx()
733 sc->txring_tl_ptr = 0; in cgem_clean_tx()
735 sc->txring_tl_ptr++; in cgem_clean_tx()
736 sc->txring_queued--; in cgem_clean_tx()
738 if_setdrvflagbits(sc->ifp, 0, IFF_DRV_OACTIVE); in cgem_clean_tx()
746 struct cgem_softc *sc = (struct cgem_softc *) if_getsoftc(ifp); in cgem_start_locked() local
752 CGEM_ASSERT_LOCKED(sc); in cgem_start_locked()
759 if (sc->txring_queued >= in cgem_start_locked()
762 cgem_clean_tx(sc); in cgem_start_locked()
765 if (sc->txring_queued >= in cgem_start_locked()
768 sc->txfull++; in cgem_start_locked()
779 if (bus_dmamap_create(sc->mbuf_dma_tag, 0, in cgem_start_locked()
780 &sc->txring_m_dmamap[sc->txring_hd_ptr])) { in cgem_start_locked()
782 sc->txdmamapfails++; in cgem_start_locked()
785 err = bus_dmamap_load_mbuf_sg(sc->mbuf_dma_tag, in cgem_start_locked()
786 sc->txring_m_dmamap[sc->txring_hd_ptr], m, segs, &nsegs, in cgem_start_locked()
793 sc->txdefragfails++; in cgem_start_locked()
795 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_start_locked()
796 sc->txring_m_dmamap[sc->txring_hd_ptr]); in cgem_start_locked()
797 sc->txring_m_dmamap[sc->txring_hd_ptr] = NULL; in cgem_start_locked()
801 err = bus_dmamap_load_mbuf_sg(sc->mbuf_dma_tag, in cgem_start_locked()
802 sc->txring_m_dmamap[sc->txring_hd_ptr], m, segs, in cgem_start_locked()
804 sc->txdefrags++; in cgem_start_locked()
809 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_start_locked()
810 sc->txring_m_dmamap[sc->txring_hd_ptr]); in cgem_start_locked()
811 sc->txring_m_dmamap[sc->txring_hd_ptr] = NULL; in cgem_start_locked()
812 sc->txdmamapfails++; in cgem_start_locked()
815 sc->txring_m[sc->txring_hd_ptr] = m; in cgem_start_locked()
818 bus_dmamap_sync(sc->mbuf_dma_tag, in cgem_start_locked()
819 sc->txring_m_dmamap[sc->txring_hd_ptr], in cgem_start_locked()
823 wrap = sc->txring_hd_ptr + nsegs + TX_MAX_DMA_SEGS >= in cgem_start_locked()
832 sc->txring[sc->txring_hd_ptr + i].addr = in cgem_start_locked()
835 sc->txring[sc->txring_hd_ptr + i].addrhi = in cgem_start_locked()
845 sc->txring[sc->txring_hd_ptr + i].ctl = ctl; in cgem_start_locked()
848 sc->txring_m[sc->txring_hd_ptr + i] = NULL; in cgem_start_locked()
852 sc->txring_hd_ptr = 0; in cgem_start_locked()
854 sc->txring_hd_ptr += nsegs; in cgem_start_locked()
855 sc->txring_queued += nsegs; in cgem_start_locked()
858 WR4(sc, CGEM_NET_CTRL, sc->net_ctl_shadow | in cgem_start_locked()
869 struct cgem_softc *sc = (struct cgem_softc *) if_getsoftc(ifp); in cgem_start() local
871 CGEM_LOCK(sc); in cgem_start()
873 CGEM_UNLOCK(sc); in cgem_start()
877 cgem_poll_hw_stats(struct cgem_softc *sc) in cgem_poll_hw_stats() argument
881 CGEM_ASSERT_LOCKED(sc); in cgem_poll_hw_stats()
883 sc->stats.tx_bytes += RD4(sc, CGEM_OCTETS_TX_BOT); in cgem_poll_hw_stats()
884 sc->stats.tx_bytes += (uint64_t)RD4(sc, CGEM_OCTETS_TX_TOP) << 32; in cgem_poll_hw_stats()
886 sc->stats.tx_frames += RD4(sc, CGEM_FRAMES_TX); in cgem_poll_hw_stats()
887 sc->stats.tx_frames_bcast += RD4(sc, CGEM_BCAST_FRAMES_TX); in cgem_poll_hw_stats()
888 sc->stats.tx_frames_multi += RD4(sc, CGEM_MULTI_FRAMES_TX); in cgem_poll_hw_stats()
889 sc->stats.tx_frames_pause += RD4(sc, CGEM_PAUSE_FRAMES_TX); in cgem_poll_hw_stats()
890 sc->stats.tx_frames_64b += RD4(sc, CGEM_FRAMES_64B_TX); in cgem_poll_hw_stats()
891 sc->stats.tx_frames_65to127b += RD4(sc, CGEM_FRAMES_65_127B_TX); in cgem_poll_hw_stats()
892 sc->stats.tx_frames_128to255b += RD4(sc, CGEM_FRAMES_128_255B_TX); in cgem_poll_hw_stats()
893 sc->stats.tx_frames_256to511b += RD4(sc, CGEM_FRAMES_256_511B_TX); in cgem_poll_hw_stats()
894 sc->stats.tx_frames_512to1023b += RD4(sc, CGEM_FRAMES_512_1023B_TX); in cgem_poll_hw_stats()
895 sc->stats.tx_frames_1024to1536b += RD4(sc, CGEM_FRAMES_1024_1518B_TX); in cgem_poll_hw_stats()
896 sc->stats.tx_under_runs += RD4(sc, CGEM_TX_UNDERRUNS); in cgem_poll_hw_stats()
898 n = RD4(sc, CGEM_SINGLE_COLL_FRAMES); in cgem_poll_hw_stats()
899 sc->stats.tx_single_collisn += n; in cgem_poll_hw_stats()
900 if_inc_counter(sc->ifp, IFCOUNTER_COLLISIONS, n); in cgem_poll_hw_stats()
901 n = RD4(sc, CGEM_MULTI_COLL_FRAMES); in cgem_poll_hw_stats()
902 sc->stats.tx_multi_collisn += n; in cgem_poll_hw_stats()
903 if_inc_counter(sc->ifp, IFCOUNTER_COLLISIONS, n); in cgem_poll_hw_stats()
904 n = RD4(sc, CGEM_EXCESSIVE_COLL_FRAMES); in cgem_poll_hw_stats()
905 sc->stats.tx_excsv_collisn += n; in cgem_poll_hw_stats()
906 if_inc_counter(sc->ifp, IFCOUNTER_COLLISIONS, n); in cgem_poll_hw_stats()
907 n = RD4(sc, CGEM_LATE_COLL); in cgem_poll_hw_stats()
908 sc->stats.tx_late_collisn += n; in cgem_poll_hw_stats()
909 if_inc_counter(sc->ifp, IFCOUNTER_COLLISIONS, n); in cgem_poll_hw_stats()
911 sc->stats.tx_deferred_frames += RD4(sc, CGEM_DEFERRED_TX_FRAMES); in cgem_poll_hw_stats()
912 sc->stats.tx_carrier_sense_errs += RD4(sc, CGEM_CARRIER_SENSE_ERRS); in cgem_poll_hw_stats()
914 sc->stats.rx_bytes += RD4(sc, CGEM_OCTETS_RX_BOT); in cgem_poll_hw_stats()
915 sc->stats.rx_bytes += (uint64_t)RD4(sc, CGEM_OCTETS_RX_TOP) << 32; in cgem_poll_hw_stats()
917 sc->stats.rx_frames += RD4(sc, CGEM_FRAMES_RX); in cgem_poll_hw_stats()
918 sc->stats.rx_frames_bcast += RD4(sc, CGEM_BCAST_FRAMES_RX); in cgem_poll_hw_stats()
919 sc->stats.rx_frames_multi += RD4(sc, CGEM_MULTI_FRAMES_RX); in cgem_poll_hw_stats()
920 sc->stats.rx_frames_pause += RD4(sc, CGEM_PAUSE_FRAMES_RX); in cgem_poll_hw_stats()
921 sc->stats.rx_frames_64b += RD4(sc, CGEM_FRAMES_64B_RX); in cgem_poll_hw_stats()
922 sc->stats.rx_frames_65to127b += RD4(sc, CGEM_FRAMES_65_127B_RX); in cgem_poll_hw_stats()
923 sc->stats.rx_frames_128to255b += RD4(sc, CGEM_FRAMES_128_255B_RX); in cgem_poll_hw_stats()
924 sc->stats.rx_frames_256to511b += RD4(sc, CGEM_FRAMES_256_511B_RX); in cgem_poll_hw_stats()
925 sc->stats.rx_frames_512to1023b += RD4(sc, CGEM_FRAMES_512_1023B_RX); in cgem_poll_hw_stats()
926 sc->stats.rx_frames_1024to1536b += RD4(sc, CGEM_FRAMES_1024_1518B_RX); in cgem_poll_hw_stats()
927 sc->stats.rx_frames_undersize += RD4(sc, CGEM_UNDERSZ_RX); in cgem_poll_hw_stats()
928 sc->stats.rx_frames_oversize += RD4(sc, CGEM_OVERSZ_RX); in cgem_poll_hw_stats()
929 sc->stats.rx_frames_jabber += RD4(sc, CGEM_JABBERS_RX); in cgem_poll_hw_stats()
930 sc->stats.rx_frames_fcs_errs += RD4(sc, CGEM_FCS_ERRS); in cgem_poll_hw_stats()
931 sc->stats.rx_frames_length_errs += RD4(sc, CGEM_LENGTH_FIELD_ERRS); in cgem_poll_hw_stats()
932 sc->stats.rx_symbol_errs += RD4(sc, CGEM_RX_SYMBOL_ERRS); in cgem_poll_hw_stats()
933 sc->stats.rx_align_errs += RD4(sc, CGEM_ALIGN_ERRS); in cgem_poll_hw_stats()
934 sc->stats.rx_resource_errs += RD4(sc, CGEM_RX_RESOURCE_ERRS); in cgem_poll_hw_stats()
935 sc->stats.rx_overrun_errs += RD4(sc, CGEM_RX_OVERRUN_ERRS); in cgem_poll_hw_stats()
936 sc->stats.rx_ip_hdr_csum_errs += RD4(sc, CGEM_IP_HDR_CKSUM_ERRS); in cgem_poll_hw_stats()
937 sc->stats.rx_tcp_csum_errs += RD4(sc, CGEM_TCP_CKSUM_ERRS); in cgem_poll_hw_stats()
938 sc->stats.rx_udp_csum_errs += RD4(sc, CGEM_UDP_CKSUM_ERRS); in cgem_poll_hw_stats()
944 struct cgem_softc *sc = (struct cgem_softc *)arg; in cgem_tick() local
947 CGEM_ASSERT_LOCKED(sc); in cgem_tick()
950 if (sc->miibus != NULL) { in cgem_tick()
951 mii = device_get_softc(sc->miibus); in cgem_tick()
956 cgem_poll_hw_stats(sc); in cgem_tick()
959 if (sc->rxhangwar && sc->rx_frames_prev == sc->stats.rx_frames) { in cgem_tick()
965 WR4(sc, CGEM_NET_CTRL, sc->net_ctl_shadow & in cgem_tick()
968 WR4(sc, CGEM_NET_CTRL, sc->net_ctl_shadow); in cgem_tick()
970 sc->rx_frames_prev = sc->stats.rx_frames; in cgem_tick()
973 callout_reset(&sc->tick_ch, hz, cgem_tick, sc); in cgem_tick()
980 struct cgem_softc *sc = (struct cgem_softc *)arg; in cgem_intr() local
981 if_t ifp = sc->ifp; in cgem_intr()
984 CGEM_LOCK(sc); in cgem_intr()
987 CGEM_UNLOCK(sc); in cgem_intr()
992 istatus = RD4(sc, CGEM_INTR_STAT); in cgem_intr()
993 WR4(sc, CGEM_INTR_STAT, istatus); in cgem_intr()
997 cgem_recv(sc); in cgem_intr()
1000 cgem_clean_tx(sc); in cgem_intr()
1004 device_printf(sc->dev, in cgem_intr()
1006 RD4(sc, CGEM_RX_STAT)); in cgem_intr()
1007 WR4(sc, CGEM_RX_STAT, CGEM_RX_STAT_HRESP_NOT_OK); in cgem_intr()
1013 WR4(sc, CGEM_RX_STAT, CGEM_RX_STAT_OVERRUN); in cgem_intr()
1014 sc->rxoverruns++; in cgem_intr()
1019 WR4(sc, CGEM_NET_CTRL, sc->net_ctl_shadow | in cgem_intr()
1021 cgem_fill_rqueue(sc); in cgem_intr()
1022 sc->rxnobufs++; in cgem_intr()
1029 CGEM_UNLOCK(sc); in cgem_intr()
1034 cgem_reset(struct cgem_softc *sc) in cgem_reset() argument
1037 CGEM_ASSERT_LOCKED(sc); in cgem_reset()
1040 switch (RD4(sc, CGEM_DESIGN_CFG1) & in cgem_reset()
1043 sc->net_cfg_shadow = CGEM_NET_CFG_DBUS_WIDTH_64; in cgem_reset()
1046 sc->net_cfg_shadow = CGEM_NET_CFG_DBUS_WIDTH_128; in cgem_reset()
1049 sc->net_cfg_shadow = CGEM_NET_CFG_DBUS_WIDTH_32; in cgem_reset()
1052 WR4(sc, CGEM_NET_CTRL, 0); in cgem_reset()
1053 WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); in cgem_reset()
1054 WR4(sc, CGEM_NET_CTRL, CGEM_NET_CTRL_CLR_STAT_REGS); in cgem_reset()
1055 WR4(sc, CGEM_TX_STAT, CGEM_TX_STAT_ALL); in cgem_reset()
1056 WR4(sc, CGEM_RX_STAT, CGEM_RX_STAT_ALL); in cgem_reset()
1057 WR4(sc, CGEM_INTR_DIS, CGEM_INTR_ALL); in cgem_reset()
1058 WR4(sc, CGEM_HASH_BOT, 0); in cgem_reset()
1059 WR4(sc, CGEM_HASH_TOP, 0); in cgem_reset()
1060 WR4(sc, CGEM_TX_QBAR, 0); /* manual says do this. */ in cgem_reset()
1061 WR4(sc, CGEM_RX_QBAR, 0); in cgem_reset()
1064 sc->net_cfg_shadow |= CGEM_NET_CFG_MDC_CLK_DIV_48; in cgem_reset()
1065 WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); in cgem_reset()
1067 sc->net_ctl_shadow = CGEM_NET_CTRL_MGMT_PORT_EN; in cgem_reset()
1068 WR4(sc, CGEM_NET_CTRL, sc->net_ctl_shadow); in cgem_reset()
1073 cgem_config(struct cgem_softc *sc) in cgem_config() argument
1075 if_t ifp = sc->ifp; in cgem_config()
1079 CGEM_ASSERT_LOCKED(sc); in cgem_config()
1082 sc->net_cfg_shadow &= (CGEM_NET_CFG_MDC_CLK_DIV_MASK | in cgem_config()
1084 sc->net_cfg_shadow |= (CGEM_NET_CFG_FCS_REMOVE | in cgem_config()
1090 if (sc->phy_contype == MII_CONTYPE_SGMII) { in cgem_config()
1091 sc->net_cfg_shadow |= CGEM_NET_CFG_SGMII_EN; in cgem_config()
1092 sc->net_cfg_shadow |= CGEM_NET_CFG_PCS_SEL; in cgem_config()
1097 sc->net_cfg_shadow |= CGEM_NET_CFG_RX_CHKSUM_OFFLD_EN; in cgem_config()
1099 WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); in cgem_config()
1115 WR4(sc, CGEM_DMA_CFG, dma_cfg); in cgem_config()
1118 WR4(sc, CGEM_RX_QBAR, (uint32_t)sc->rxring_physaddr); in cgem_config()
1119 WR4(sc, CGEM_TX_QBAR, (uint32_t)sc->txring_physaddr); in cgem_config()
1121 WR4(sc, CGEM_RX_QBAR_HI, (uint32_t)(sc->rxring_physaddr >> 32)); in cgem_config()
1122 WR4(sc, CGEM_TX_QBAR_HI, (uint32_t)(sc->txring_physaddr >> 32)); in cgem_config()
1126 sc->net_ctl_shadow |= (CGEM_NET_CTRL_TX_EN | CGEM_NET_CTRL_RX_EN); in cgem_config()
1127 WR4(sc, CGEM_NET_CTRL, sc->net_ctl_shadow); in cgem_config()
1130 WR4(sc, CGEM_SPEC_ADDR_LOW(0), (eaddr[3] << 24) | in cgem_config()
1132 WR4(sc, CGEM_SPEC_ADDR_HI(0), (eaddr[5] << 8) | eaddr[4]); in cgem_config()
1135 WR4(sc, CGEM_INTR_EN, CGEM_INTR_RX_COMPLETE | CGEM_INTR_RX_OVERRUN | in cgem_config()
1142 cgem_init_locked(struct cgem_softc *sc) in cgem_init_locked() argument
1146 CGEM_ASSERT_LOCKED(sc); in cgem_init_locked()
1148 if ((if_getdrvflags(sc->ifp) & IFF_DRV_RUNNING) != 0) in cgem_init_locked()
1151 cgem_config(sc); in cgem_init_locked()
1152 cgem_fill_rqueue(sc); in cgem_init_locked()
1154 if_setdrvflagbits(sc->ifp, IFF_DRV_RUNNING, IFF_DRV_OACTIVE); in cgem_init_locked()
1156 if (sc->miibus != NULL) { in cgem_init_locked()
1157 mii = device_get_softc(sc->miibus); in cgem_init_locked()
1161 callout_reset(&sc->tick_ch, hz, cgem_tick, sc); in cgem_init_locked()
1167 struct cgem_softc *sc = (struct cgem_softc *)arg; in cgem_init() local
1169 CGEM_LOCK(sc); in cgem_init()
1170 cgem_init_locked(sc); in cgem_init()
1171 CGEM_UNLOCK(sc); in cgem_init()
1176 cgem_stop(struct cgem_softc *sc) in cgem_stop() argument
1180 CGEM_ASSERT_LOCKED(sc); in cgem_stop()
1182 callout_stop(&sc->tick_ch); in cgem_stop()
1185 cgem_reset(sc); in cgem_stop()
1188 memset(sc->txring, 0, CGEM_NUM_TX_DESCS * sizeof(struct cgem_tx_desc)); in cgem_stop()
1190 sc->txring[i].ctl = CGEM_TXDESC_USED; in cgem_stop()
1191 if (sc->txring_m[i]) { in cgem_stop()
1193 bus_dmamap_unload(sc->mbuf_dma_tag, in cgem_stop()
1194 sc->txring_m_dmamap[i]); in cgem_stop()
1195 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_stop()
1196 sc->txring_m_dmamap[i]); in cgem_stop()
1197 sc->txring_m_dmamap[i] = NULL; in cgem_stop()
1198 m_freem(sc->txring_m[i]); in cgem_stop()
1199 sc->txring_m[i] = NULL; in cgem_stop()
1202 sc->txring[CGEM_NUM_TX_DESCS - 1].ctl |= CGEM_TXDESC_WRAP; in cgem_stop()
1204 sc->txring_hd_ptr = 0; in cgem_stop()
1205 sc->txring_tl_ptr = 0; in cgem_stop()
1206 sc->txring_queued = 0; in cgem_stop()
1209 memset(sc->rxring, 0, CGEM_NUM_RX_DESCS * sizeof(struct cgem_rx_desc)); in cgem_stop()
1211 sc->rxring[i].addr = CGEM_RXDESC_OWN; in cgem_stop()
1212 if (sc->rxring_m[i]) { in cgem_stop()
1214 bus_dmamap_unload(sc->mbuf_dma_tag, in cgem_stop()
1215 sc->rxring_m_dmamap[i]); in cgem_stop()
1216 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_stop()
1217 sc->rxring_m_dmamap[i]); in cgem_stop()
1218 sc->rxring_m_dmamap[i] = NULL; in cgem_stop()
1220 m_freem(sc->rxring_m[i]); in cgem_stop()
1221 sc->rxring_m[i] = NULL; in cgem_stop()
1224 sc->rxring[CGEM_NUM_RX_DESCS - 1].addr |= CGEM_RXDESC_WRAP; in cgem_stop()
1226 sc->rxring_hd_ptr = 0; in cgem_stop()
1227 sc->rxring_tl_ptr = 0; in cgem_stop()
1228 sc->rxring_queued = 0; in cgem_stop()
1231 sc->mii_media_active = 0; in cgem_stop()
1237 struct cgem_softc *sc = if_getsoftc(ifp); in cgem_ioctl() local
1244 CGEM_LOCK(sc); in cgem_ioctl()
1247 if (((if_getflags(ifp) ^ sc->if_old_flags) & in cgem_ioctl()
1249 cgem_rx_filter(sc); in cgem_ioctl()
1252 cgem_init_locked(sc); in cgem_ioctl()
1256 cgem_stop(sc); in cgem_ioctl()
1258 sc->if_old_flags = if_getflags(ifp); in cgem_ioctl()
1259 CGEM_UNLOCK(sc); in cgem_ioctl()
1266 CGEM_LOCK(sc); in cgem_ioctl()
1267 cgem_rx_filter(sc); in cgem_ioctl()
1268 CGEM_UNLOCK(sc); in cgem_ioctl()
1274 if (sc->miibus == NULL) in cgem_ioctl()
1276 mii = device_get_softc(sc->miibus); in cgem_ioctl()
1281 CGEM_LOCK(sc); in cgem_ioctl()
1291 WR4(sc, CGEM_DMA_CFG, in cgem_ioctl()
1292 RD4(sc, CGEM_DMA_CFG) | in cgem_ioctl()
1300 WR4(sc, CGEM_DMA_CFG, in cgem_ioctl()
1301 RD4(sc, CGEM_DMA_CFG) & in cgem_ioctl()
1310 sc->net_cfg_shadow |= in cgem_ioctl()
1312 WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); in cgem_ioctl()
1317 sc->net_cfg_shadow &= in cgem_ioctl()
1319 WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); in cgem_ioctl()
1328 CGEM_UNLOCK(sc); in cgem_ioctl()
1343 struct cgem_softc *sc = (struct cgem_softc *) if_getsoftc(ifp); in cgem_ifmedia_upd() local
1348 mii = device_get_softc(sc->miibus); in cgem_ifmedia_upd()
1349 CGEM_LOCK(sc); in cgem_ifmedia_upd()
1355 CGEM_UNLOCK(sc); in cgem_ifmedia_upd()
1363 struct cgem_softc *sc = (struct cgem_softc *) if_getsoftc(ifp); in cgem_ifmedia_sts() local
1366 mii = device_get_softc(sc->miibus); in cgem_ifmedia_sts()
1367 CGEM_LOCK(sc); in cgem_ifmedia_sts()
1371 CGEM_UNLOCK(sc); in cgem_ifmedia_sts()
1377 struct cgem_softc *sc = device_get_softc(dev); in cgem_miibus_readreg() local
1380 WR4(sc, CGEM_PHY_MAINT, CGEM_PHY_MAINT_CLAUSE_22 | in cgem_miibus_readreg()
1387 while ((RD4(sc, CGEM_NET_STAT) & CGEM_NET_STAT_PHY_MGMT_IDLE) == 0) { in cgem_miibus_readreg()
1395 val = RD4(sc, CGEM_PHY_MAINT) & CGEM_PHY_MAINT_DATA_MASK; in cgem_miibus_readreg()
1410 struct cgem_softc *sc = device_get_softc(dev); in cgem_miibus_writereg() local
1413 WR4(sc, CGEM_PHY_MAINT, CGEM_PHY_MAINT_CLAUSE_22 | in cgem_miibus_writereg()
1421 while ((RD4(sc, CGEM_NET_STAT) & CGEM_NET_STAT_PHY_MGMT_IDLE) == 0) { in cgem_miibus_writereg()
1435 struct cgem_softc *sc = device_get_softc(dev); in cgem_miibus_statchg() local
1436 struct mii_data *mii = device_get_softc(sc->miibus); in cgem_miibus_statchg()
1438 CGEM_ASSERT_LOCKED(sc); in cgem_miibus_statchg()
1442 sc->mii_media_active != mii->mii_media_active) in cgem_miibus_statchg()
1443 cgem_mediachange(sc, mii); in cgem_miibus_statchg()
1449 struct cgem_softc *sc = device_get_softc(dev); in cgem_miibus_linkchg() local
1450 struct mii_data *mii = device_get_softc(sc->miibus); in cgem_miibus_linkchg()
1452 CGEM_ASSERT_LOCKED(sc); in cgem_miibus_linkchg()
1456 sc->mii_media_active != mii->mii_media_active) in cgem_miibus_linkchg()
1457 cgem_mediachange(sc, mii); in cgem_miibus_linkchg()
1474 cgem_mediachange(struct cgem_softc *sc, struct mii_data *mii) in cgem_mediachange() argument
1478 CGEM_ASSERT_LOCKED(sc); in cgem_mediachange()
1481 sc->net_cfg_shadow &= ~(CGEM_NET_CFG_SPEED100 | CGEM_NET_CFG_GIGE_EN | in cgem_mediachange()
1486 sc->net_cfg_shadow |= (CGEM_NET_CFG_SPEED100 | in cgem_mediachange()
1491 sc->net_cfg_shadow |= CGEM_NET_CFG_SPEED100; in cgem_mediachange()
1499 sc->net_cfg_shadow |= CGEM_NET_CFG_FULL_DUPLEX; in cgem_mediachange()
1501 WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); in cgem_mediachange()
1503 if (sc->ref_clk != NULL) { in cgem_mediachange()
1504 CGEM_UNLOCK(sc); in cgem_mediachange()
1505 if (clk_set_freq(sc->ref_clk, ref_clk_freq, 0)) in cgem_mediachange()
1506 device_printf(sc->dev, "could not set ref clk to %d\n", in cgem_mediachange()
1508 CGEM_LOCK(sc); in cgem_mediachange()
1511 sc->mii_media_active = mii->mii_media_active; in cgem_mediachange()
1517 struct cgem_softc *sc = device_get_softc(dev); in cgem_add_sysctls() local
1526 &sc->rxbufs, 0, "Number receive buffers to provide"); in cgem_add_sysctls()
1529 &sc->rxhangwar, 0, "Enable receive hang work-around"); in cgem_add_sysctls()
1532 &sc->rxoverruns, 0, "Receive overrun events"); in cgem_add_sysctls()
1535 &sc->rxnobufs, 0, "Receive buf queue empty events"); in cgem_add_sysctls()
1538 &sc->rxdmamapfails, 0, "Receive DMA map failures"); in cgem_add_sysctls()
1541 &sc->txfull, 0, "Transmit ring full events"); in cgem_add_sysctls()
1544 &sc->txdmamapfails, 0, "Transmit DMA map failures"); in cgem_add_sysctls()
1547 &sc->txdefrags, 0, "Transmit m_defrag() calls"); in cgem_add_sysctls()
1550 &sc->txdefragfails, 0, "Transmit m_defrag() failures"); in cgem_add_sysctls()
1557 &sc->stats.tx_bytes, "Total bytes transmitted"); in cgem_add_sysctls()
1560 &sc->stats.tx_frames, 0, "Total frames transmitted"); in cgem_add_sysctls()
1563 &sc->stats.tx_frames_bcast, 0, in cgem_add_sysctls()
1567 &sc->stats.tx_frames_multi, 0, in cgem_add_sysctls()
1571 CTLFLAG_RD, &sc->stats.tx_frames_pause, 0, in cgem_add_sysctls()
1575 &sc->stats.tx_frames_64b, 0, in cgem_add_sysctls()
1579 &sc->stats.tx_frames_65to127b, 0, in cgem_add_sysctls()
1583 CTLFLAG_RD, &sc->stats.tx_frames_128to255b, 0, in cgem_add_sysctls()
1587 CTLFLAG_RD, &sc->stats.tx_frames_256to511b, 0, in cgem_add_sysctls()
1591 CTLFLAG_RD, &sc->stats.tx_frames_512to1023b, 0, in cgem_add_sysctls()
1595 CTLFLAG_RD, &sc->stats.tx_frames_1024to1536b, 0, in cgem_add_sysctls()
1599 CTLFLAG_RD, &sc->stats.tx_under_runs, 0, in cgem_add_sysctls()
1603 CTLFLAG_RD, &sc->stats.tx_single_collisn, 0, in cgem_add_sysctls()
1607 CTLFLAG_RD, &sc->stats.tx_multi_collisn, 0, in cgem_add_sysctls()
1611 CTLFLAG_RD, &sc->stats.tx_excsv_collisn, 0, in cgem_add_sysctls()
1615 CTLFLAG_RD, &sc->stats.tx_late_collisn, 0, in cgem_add_sysctls()
1619 CTLFLAG_RD, &sc->stats.tx_deferred_frames, 0, in cgem_add_sysctls()
1623 CTLFLAG_RD, &sc->stats.tx_carrier_sense_errs, 0, in cgem_add_sysctls()
1627 &sc->stats.rx_bytes, "Total bytes received"); in cgem_add_sysctls()
1630 &sc->stats.rx_frames, 0, "Total frames received"); in cgem_add_sysctls()
1633 CTLFLAG_RD, &sc->stats.rx_frames_bcast, 0, in cgem_add_sysctls()
1637 CTLFLAG_RD, &sc->stats.rx_frames_multi, 0, in cgem_add_sysctls()
1641 CTLFLAG_RD, &sc->stats.rx_frames_pause, 0, in cgem_add_sysctls()
1645 CTLFLAG_RD, &sc->stats.rx_frames_64b, 0, in cgem_add_sysctls()
1649 CTLFLAG_RD, &sc->stats.rx_frames_65to127b, 0, in cgem_add_sysctls()
1653 CTLFLAG_RD, &sc->stats.rx_frames_128to255b, 0, in cgem_add_sysctls()
1657 CTLFLAG_RD, &sc->stats.rx_frames_256to511b, 0, in cgem_add_sysctls()
1661 CTLFLAG_RD, &sc->stats.rx_frames_512to1023b, 0, in cgem_add_sysctls()
1665 CTLFLAG_RD, &sc->stats.rx_frames_1024to1536b, 0, in cgem_add_sysctls()
1669 CTLFLAG_RD, &sc->stats.rx_frames_undersize, 0, in cgem_add_sysctls()
1673 CTLFLAG_RD, &sc->stats.rx_frames_oversize, 0, in cgem_add_sysctls()
1677 CTLFLAG_RD, &sc->stats.rx_frames_jabber, 0, in cgem_add_sysctls()
1681 CTLFLAG_RD, &sc->stats.rx_frames_fcs_errs, 0, in cgem_add_sysctls()
1685 CTLFLAG_RD, &sc->stats.rx_frames_length_errs, 0, in cgem_add_sysctls()
1689 CTLFLAG_RD, &sc->stats.rx_symbol_errs, 0, in cgem_add_sysctls()
1693 CTLFLAG_RD, &sc->stats.rx_align_errs, 0, in cgem_add_sysctls()
1697 CTLFLAG_RD, &sc->stats.rx_resource_errs, 0, in cgem_add_sysctls()
1701 CTLFLAG_RD, &sc->stats.rx_overrun_errs, 0, in cgem_add_sysctls()
1705 CTLFLAG_RD, &sc->stats.rx_ip_hdr_csum_errs, 0, in cgem_add_sysctls()
1709 CTLFLAG_RD, &sc->stats.rx_tcp_csum_errs, 0, in cgem_add_sysctls()
1713 CTLFLAG_RD, &sc->stats.rx_udp_csum_errs, 0, in cgem_add_sysctls()
1734 struct cgem_softc *sc = device_get_softc(dev); in cgem_attach() local
1741 sc->dev = dev; in cgem_attach()
1742 CGEM_LOCK_INIT(sc); in cgem_attach()
1747 sc->neednullqs = 1; in cgem_attach()
1749 sc->rxhangwar = 1; in cgem_attach()
1751 if (clk_get_by_ofw_name(dev, 0, "tx_clk", &sc->ref_clk) != 0) in cgem_attach()
1754 else if (clk_enable(sc->ref_clk) != 0) in cgem_attach()
1758 if (clk_get_by_ofw_name(dev, 0, "pclk", &sc->ref_clk) != 0) in cgem_attach()
1761 else if (clk_enable(sc->ref_clk) != 0) in cgem_attach()
1766 sc->phy_contype = mii_fdt_get_contype(node); in cgem_attach()
1770 sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in cgem_attach()
1772 if (sc->mem_res == NULL) { in cgem_attach()
1779 sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in cgem_attach()
1781 if (sc->irq_res == NULL) { in cgem_attach()
1788 ifp = sc->ifp = if_alloc(IFT_ETHER); in cgem_attach()
1789 if_setsoftc(ifp, sc); in cgem_attach()
1805 sc->if_old_flags = if_getflags(ifp); in cgem_attach()
1806 sc->rxbufs = DEFAULT_NUM_RX_BUFS; in cgem_attach()
1809 CGEM_LOCK(sc); in cgem_attach()
1810 cgem_reset(sc); in cgem_attach()
1811 CGEM_UNLOCK(sc); in cgem_attach()
1814 err = mii_attach(dev, &sc->miibus, ifp, in cgem_attach()
1821 err = cgem_setup_descs(sc); in cgem_attach()
1829 cgem_get_mac(sc, eaddr); in cgem_attach()
1832 callout_init_mtx(&sc->tick_ch, &sc->sc_mtx, 0); in cgem_attach()
1836 err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE | in cgem_attach()
1837 INTR_EXCL, NULL, cgem_intr, sc, &sc->intrhand); in cgem_attach()
1853 struct cgem_softc *sc = device_get_softc(dev); in cgem_detach() local
1856 if (sc == NULL) in cgem_detach()
1860 CGEM_LOCK(sc); in cgem_detach()
1861 cgem_stop(sc); in cgem_detach()
1862 CGEM_UNLOCK(sc); in cgem_detach()
1863 callout_drain(&sc->tick_ch); in cgem_detach()
1864 if_setflagbits(sc->ifp, 0, IFF_UP); in cgem_detach()
1865 ether_ifdetach(sc->ifp); in cgem_detach()
1868 if (sc->miibus != NULL) { in cgem_detach()
1869 device_delete_child(dev, sc->miibus); in cgem_detach()
1870 sc->miibus = NULL; in cgem_detach()
1874 if (sc->mem_res != NULL) { in cgem_detach()
1876 rman_get_rid(sc->mem_res), sc->mem_res); in cgem_detach()
1877 sc->mem_res = NULL; in cgem_detach()
1879 if (sc->irq_res != NULL) { in cgem_detach()
1880 if (sc->intrhand) in cgem_detach()
1881 bus_teardown_intr(dev, sc->irq_res, sc->intrhand); in cgem_detach()
1883 rman_get_rid(sc->irq_res), sc->irq_res); in cgem_detach()
1884 sc->irq_res = NULL; in cgem_detach()
1888 if (sc->rxring != NULL) { in cgem_detach()
1889 if (sc->rxring_physaddr != 0) { in cgem_detach()
1890 bus_dmamap_unload(sc->desc_dma_tag, in cgem_detach()
1891 sc->rxring_dma_map); in cgem_detach()
1892 sc->rxring_physaddr = 0; in cgem_detach()
1893 sc->txring_physaddr = 0; in cgem_detach()
1894 sc->null_qs_physaddr = 0; in cgem_detach()
1896 bus_dmamem_free(sc->desc_dma_tag, sc->rxring, in cgem_detach()
1897 sc->rxring_dma_map); in cgem_detach()
1898 sc->rxring = NULL; in cgem_detach()
1899 sc->txring = NULL; in cgem_detach()
1900 sc->null_qs = NULL; in cgem_detach()
1903 if (sc->rxring_m_dmamap[i] != NULL) { in cgem_detach()
1904 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_detach()
1905 sc->rxring_m_dmamap[i]); in cgem_detach()
1906 sc->rxring_m_dmamap[i] = NULL; in cgem_detach()
1909 if (sc->txring_m_dmamap[i] != NULL) { in cgem_detach()
1910 bus_dmamap_destroy(sc->mbuf_dma_tag, in cgem_detach()
1911 sc->txring_m_dmamap[i]); in cgem_detach()
1912 sc->txring_m_dmamap[i] = NULL; in cgem_detach()
1915 if (sc->desc_dma_tag != NULL) { in cgem_detach()
1916 bus_dma_tag_destroy(sc->desc_dma_tag); in cgem_detach()
1917 sc->desc_dma_tag = NULL; in cgem_detach()
1919 if (sc->mbuf_dma_tag != NULL) { in cgem_detach()
1920 bus_dma_tag_destroy(sc->mbuf_dma_tag); in cgem_detach()
1921 sc->mbuf_dma_tag = NULL; in cgem_detach()
1924 if (sc->ref_clk != NULL) { in cgem_detach()
1925 clk_release(sc->ref_clk); in cgem_detach()
1926 sc->ref_clk = NULL; in cgem_detach()
1931 CGEM_LOCK_DESTROY(sc); in cgem_detach()