Lines Matching defs:hwq

526 gmac_hwqueue_desc(gmac_hwqueue_t *hwq, size_t i)
528 i += hwq->hwq_wptr;
529 if (i >= hwq->hwq_size)
530 i -= hwq->hwq_size;
531 return hwq->hwq_base + i;
535 gmac_hwqueue_txconsume(gmac_hwqueue_t *hwq, const gmac_desc_t *d)
537 gmac_hwqmem_t * const hqm = hwq->hwq_hqm;
542 IF_DEQUEUE(&hwq->hwq_ifq, m);
552 ifp = hwq->hwq_ifp;
557 hwq, d - hwq->hwq_base, d, ifp->if_xname, m);
564 gmac_hwqueue_sync(gmac_hwqueue_t *hwq)
566 gmac_hwqmem_t * const hqm = hwq->hwq_hqm;
573 old_rptr = hwq->hwq_rptr;
574 v = bus_space_read_4(hwq->hwq_iot, hwq->hwq_qrwptr_ioh, 0);
575 hwq->hwq_rptr = (v >> 0) & 0xffff;
576 hwq->hwq_wptr = (v >> 16) & 0xffff;
578 if (old_rptr == hwq->hwq_rptr)
582 hwq, old_rptr, hwq->hwq_rptr, hwq->hwq_free,
583 hwq->hwq_size - hwq->hwq_free - 1);
585 hwq->hwq_free += (hwq->hwq_rptr - old_rptr) & (hwq->hwq_size - 1);
587 rptr != hwq->hwq_rptr;
588 rptr = (rptr + 1) & (hwq->hwq_size - 1)) {
589 gmac_desc_t * const d = hwq->hwq_base + rptr;
592 sizeof(gmac_desc_t [hwq->hwq_qoff + rptr]),
596 gmac_hwqueue_txconsume(hwq, d);
599 sizeof(gmac_desc_t [hwq->hwq_qoff + rptr]),
604 hwq, rptr, d, d->d_desc0, d->d_desc1,
607 sizeof(gmac_desc_t [hwq->hwq_qoff + rptr]),
614 hwq, old_rptr, hwq->hwq_rptr, hwq->hwq_free,
615 hwq->hwq_size - hwq->hwq_free - 1);
619 gmac_hwqueue_produce(gmac_hwqueue_t *hwq, size_t count)
621 gmac_hwqmem_t * const hqm = hwq->hwq_hqm;
623 uint16_t rptr = bus_space_read_4(hwq->hwq_iot, hwq->hwq_qrwptr_ioh, 0);
625 KASSERT(count < hwq->hwq_free);
627 KASSERT(hwq->hwq_wptr == bus_space_read_4(hwq->hwq_iot, hwq->hwq_qrwptr_ioh, 0) >> 16);
630 hwq, count, hwq->hwq_rptr, rptr, hwq->hwq_wptr);
632 hwq->hwq_free -= count;
634 for (wptr = hwq->hwq_wptr;
636 count--, wptr = (wptr + 1) & (hwq->hwq_size - 1)) {
637 KASSERT(((wptr + 1) & (hwq->hwq_size - 1)) != hwq->hwq_rptr);
639 sizeof(gmac_desc_t [hwq->hwq_qoff + wptr]),
644 hwq->hwq_wptr = wptr;
646 if (hwq->hwq_wptr + count >= hwq->hwq_size) {
648 sizeof(gmac_desc_t [hwq->hwq_qoff + hwq->hwq_wptr]),
649 sizeof(gmac_desc_t [hwq->hwq_size - hwq->hwq_wptr]),
651 count -= hwq->hwq_size - hwq->hwq_wptr;
652 hwq->hwq_wptr = 0;
656 sizeof(gmac_desc_t [hwq->hwq_qoff + hwq->hwq_wptr]),
659 hwq->hwq_wptr += count;
660 hwq->hwq_wptr &= (hwq->hwq_size - 1);
668 bus_space_write_4(hwq->hwq_iot, hwq->hwq_qrwptr_ioh, 0,
669 hwq->hwq_wptr << 16);
671 aprint_debug(" new=%u\n", hwq->hwq_wptr);
675 gmac_rxproduce(gmac_hwqueue_t *hwq, size_t free_min)
677 gmac_hwqmem_t * const hqm = hwq->hwq_hqm;
681 hwq, hwq->hwq_free, hwq->hwq_size - hwq->hwq_free - 1,
682 free_min, hwq->hwq_ifq.ifq_len);
684 gmac_hwqueue_sync(hwq);
687 hwq, hwq->hwq_free, hwq->hwq_size - hwq->hwq_free - 1);
689 for (i = 0; hwq->hwq_free > 0 && hwq->hwq_size - hwq->hwq_free - 1 < free_min; i++) {
691 gmac_desc_t * const d = gmac_hwqueue_desc(hwq, 0);
696 gmac_hwqueue_produce(hwq, 1);
725 map, map->_dm_size, m, hwq->hwq_wptr, error);
737 for (m0 = hwq->hwq_ifq.ifq_head; m0 != NULL; m0 = m0->m_nextpkt)
739 m->m_len = d - hwq->hwq_base;
740 IF_ENQUEUE(&hwq->hwq_ifq, m);
742 "gmac_rxproduce(%p): m=%p %zu@%p=%#x/%#x/%#x/%#x\n", hwq,
743 m, d - hwq->hwq_base, d, d->d_desc0, d->d_desc1,
745 gmac_hwqueue_produce(hwq, 1);
749 hwq, hwq->hwq_free, hwq->hwq_size - hwq->hwq_free - 1,
750 free_min, hwq->hwq_ifq.ifq_len);
756 gmac_hwqueue_rxconsume(gmac_hwqueue_t *hwq, const gmac_desc_t *d)
758 gmac_hwqmem_t * const hqm = hwq->hwq_hqm;
759 struct ifnet * const ifp = hwq->hwq_ifp;
767 aprint_debug("gmac_hwqueue_rxconsume(%p): entry\n", hwq);
770 hwq, hwq->hwq_ifp, hwq->hwq_ifp->if_xname,
780 KASSERT(hwq->hwq_producer->hwq_free != hwq->hwq_producer->hwq_size - 1);
781 for (mp = &hwq->hwq_producer->hwq_ifq.ifq_head, last_m = NULL, depth=0;
788 hwq, depth, m, map->dm_segs->ds_addr, m->m_len);
791 if (hwq->hwq_producer->hwq_ifq.ifq_tail == m)
792 hwq->hwq_producer->hwq_ifq.ifq_tail = last_m;
793 hwq->hwq_producer->hwq_ifq.ifq_len--;
798 hwq, hwq->hwq_ifp, hwq->hwq_ifp->if_xname, m, depth);
801 hwq->hwq_producer->hwq_base[m->m_len].d_bufaddr);
807 for (m0 = hwq->hwq_producer->hwq_ifq.ifq_head; m0 != NULL; m0 = m0->m_nextpkt)
811 KASSERT(hwq->hwq_producer->hwq_base[m->m_len].d_bufaddr == d->d_bufaddr);
812 hwq->hwq_producer->hwq_base[m->m_len].d_bufaddr = htole32(0xdead0000 | m->m_len);
816 KASSERT(hwq->hwq_rxmbuf == NULL);
821 KASSERT(hwq->hwq_rxmbuf != NULL);
822 hwq->hwq_rxmbuf->m_pkthdr.len += buflen;
838 *hwq->hwq_mp = m;
843 hwq->hwq_mp = &m->m_next;
857 m = hwq->hwq_rxmbuf;
870 hwq->hwq_rxmbuf = NULL;
871 hwq->hwq_mp = &hwq->hwq_rxmbuf;
877 gmac_hwqueue_consume(gmac_hwqueue_t *hwq, size_t free_min)
879 gmac_hwqmem_t * const hqm = hwq->hwq_hqm;
887 aprint_debug("gmac_hwqueue_consume(%p): entry\n", hwq);
890 v = bus_space_read_4(hwq->hwq_iot, hwq->hwq_qrwptr_ioh, 0);
892 hwq->hwq_wptr = (v >> 16) & 0xffff;
893 KASSERT(rptr == hwq->hwq_rptr);
894 if (rptr == hwq->hwq_wptr)
898 for (; rptr != hwq->hwq_wptr; rptr = (rptr + 1) & (hwq->hwq_size - 1)) {
900 sizeof(gmac_desc_t [hwq->hwq_qoff + rptr]),
903 d.d_desc0 = le32toh(hwq->hwq_base[rptr].d_desc0);
904 d.d_desc1 = le32toh(hwq->hwq_base[rptr].d_desc1);
905 d.d_bufaddr = le32toh(hwq->hwq_base[rptr].d_bufaddr);
906 d.d_desc3 = le32toh(hwq->hwq_base[rptr].d_desc3);
907 hwq->hwq_base[rptr].d_desc0 = 0;
908 hwq->hwq_base[rptr].d_desc1 = 0;
909 hwq->hwq_base[rptr].d_bufaddr = 0xdeadbeef;
910 hwq->hwq_base[rptr].d_desc3 = 0;
912 sizeof(gmac_desc_t [hwq->hwq_qoff + rptr]),
917 hwq, rptr);
918 if (!gmac_hwqueue_rxconsume(hwq, &d)) {
919 rptr = (rptr + 1) & (hwq->hwq_size - 1);
920 i += gmac_rxproduce(hwq->hwq_producer, free_min);
929 hwq, hwq->hwq_rptr, rptr, hwq->hwq_wptr);
930 bus_space_write_4(hwq->hwq_iot, hwq->hwq_qrwptr_ioh, 0, rptr);
931 hwq->hwq_rptr = rptr;
933 aprint_debug("gmac_hwqueue_consume(%p): exit\n", hwq);
1021 gmac_hwqueue_destroy(gmac_hwqueue_t *hwq)
1023 gmac_hwqmem_t * const hqm = hwq->hwq_hqm;
1024 KASSERT(hqm->hqm_refs & hwq->hwq_ref);
1025 hqm->hqm_refs &= ~hwq->hwq_ref;
1029 IF_DEQUEUE(&hwq->hwq_ifq, m);
1037 kmem_free(hwq, sizeof(*hwq));
1047 gmac_hwqueue_t *hwq;
1053 hwq = kmem_zalloc(sizeof(*hwq), KM_SLEEP);
1054 hwq->hwq_size = hqm->hqm_ndesc;
1055 hwq->hwq_iot = iot;
1057 &hwq->hwq_qrwptr_ioh);
1059 hwq->hwq_hqm = hqm;
1060 hwq->hwq_ref = 1 << qno;
1061 hqm->hqm_refs |= hwq->hwq_ref;
1062 hwq->hwq_qoff = hqm->hqm_ndesc * qno;
1063 hwq->hwq_base = hqm->hqm_base + hwq->hwq_qoff;
1066 bus_space_write_4(hwq->hwq_iot, ioh, qbase,
1070 v = bus_space_read_4(hwq->hwq_iot, hwq->hwq_qrwptr_ioh, 0);
1071 hwq->hwq_rptr = (v >> 0) & 0xffff;
1072 hwq->hwq_wptr = (v >> 16) & 0xffff;
1076 hwq, qrwptr, hwq->hwq_qrwptr_ioh, hwq->hwq_wptr, hwq->hwq_rptr,
1077 hwq->hwq_base,
1078 hqm->hqm_segs->ds_addr + sizeof(gmac_desc_t [hwq->hwq_qoff]),
1079 bus_space_read_4(hwq->hwq_iot, ioh, qbase), qno);
1081 hwq->hwq_free = hwq->hwq_size - 1;
1082 hwq->hwq_ifq.ifq_maxlen = hwq->hwq_free;
1083 hwq->hwq_mp = &hwq->hwq_rxmbuf;
1085 return hwq;