Lines Matching refs:sc

77 static void patm_feed_sbufs(struct patm_softc *sc);
78 static void patm_feed_lbufs(struct patm_softc *sc);
79 static void patm_feed_vbufs(struct patm_softc *sc);
80 static void patm_intr_tsif(struct patm_softc *sc);
81 static void patm_intr_raw(struct patm_softc *sc);
91 patm_fbq_write(struct patm_softc *sc, u_int queue, uint32_t h0,
94 patm_debug(sc, FREEQ, "supplying(%u,%#x,%#x,%#x,%#x)",
96 patm_nor_write(sc, IDT_NOR_D0, h0);
97 patm_nor_write(sc, IDT_NOR_D1, p0);
98 patm_nor_write(sc, IDT_NOR_D2, h1);
99 patm_nor_write(sc, IDT_NOR_D3, p1);
100 patm_cmd_exec(sc, IDT_CMD_WFBQ | queue);
109 struct patm_softc *sc = p;
118 mtx_lock(&sc->mtx);
120 stat = patm_nor_read(sc, IDT_NOR_STAT);
121 patm_nor_write(sc, IDT_NOR_STAT, stat & (ints | fbqa));
123 if (!(sc->ifp->if_drv_flags & IFF_DRV_RUNNING)) {
126 patm_debug(sc, INTR, "PHYI (stopped)");
127 utopia_intr(&sc->utopia);
129 mtx_unlock(&sc->mtx);
133 patm_debug(sc, INTR, "stat=%08x", stat);
140 cfg = patm_nor_read(sc, IDT_NOR_CFG);
142 patm_feed_sbufs(sc);
144 patm_feed_lbufs(sc);
150 patm_intr_rsq(sc);
151 patm_feed_vbufs(sc);
153 if ((patm_nor_read(sc, IDT_NOR_STAT) & fbqa) &&
156 patm_nor_write(sc, IDT_NOR_CFG, cfg & ~IDT_CFG_FBIE);
157 patm_printf(sc, "out of buffers -- intr disabled\n");
159 patm_printf(sc, "bufQ intr re-enabled\n");
160 patm_nor_write(sc, IDT_NOR_CFG, cfg | IDT_CFG_FBIE);
162 patm_nor_write(sc, IDT_NOR_STAT, fbqa);
168 patm_printf(sc, "%s: excessive interrupts\n", __func__);
169 patm_stop(sc);
173 patm_debug(sc, INTR, "TSIF");
174 patm_intr_tsif(sc);
177 patm_printf(sc, "incomplete PDU transmitted\n");
180 patm_printf(sc, "TSQF\n");
181 patm_intr_tsif(sc);
184 patm_debug(sc, INTR, "TMROF");
185 patm_intr_tsif(sc);
188 patm_debug(sc, INTR, "PHYI");
189 utopia_intr(&sc->utopia);
192 patm_printf(sc, "RSQF\n");
193 patm_intr_rsq(sc);
196 patm_debug(sc, INTR, "EPDU");
197 patm_intr_rsq(sc);
200 patm_debug(sc, INTR, "RAWCF");
201 patm_intr_raw(sc);
204 patm_debug(sc, INTR, "RSQAF");
205 patm_intr_rsq(sc);
211 patm_intr_rsq(sc);
214 stat = patm_nor_read(sc, IDT_NOR_STAT);
215 patm_nor_write(sc, IDT_NOR_STAT, ints & stat);
216 patm_debug(sc, INTR, "stat=%08x", stat);
219 mtx_unlock(&sc->mtx);
221 patm_debug(sc, INTR, "... exit");
234 patm_feed_cnt(struct patm_softc *sc, u_int q)
241 reg = patm_nor_read(sc, IDT_NOR_FBQP0 + 4 * q);
256 patm_debug(sc, FREEQ, "feeding %u buffers into queue %u", feed, q);
266 patm_feed_sbufs(struct patm_softc *sc)
273 feed = patm_feed_cnt(sc, 0);
276 if ((v0 = mbp_alloc(sc->sbuf_pool, &p0, &h0)) == NULL)
278 if (mbp_alloc(sc->sbuf_pool, &p1, &h1) == NULL) {
279 mbp_free(sc->sbuf_pool, v0);
282 patm_fbq_write(sc, 0,
294 patm_feed_vbufs(struct patm_softc *sc)
301 feed = patm_feed_cnt(sc, 2);
304 if ((v0 = mbp_alloc(sc->vbuf_pool, &p0, &h0)) == NULL)
306 if (mbp_alloc(sc->vbuf_pool, &p1, &h1) == NULL) {
307 mbp_free(sc->vbuf_pool, v0);
310 patm_fbq_write(sc, 2,
322 patm_lmbuf_alloc(struct patm_softc *sc)
333 if ((b = SLIST_FIRST(&sc->lbuf_free_list)) == NULL) {
339 error = bus_dmamap_load(sc->lbuf_tag, b->map, m->m_data, LMBUF_SIZE,
342 patm_printf(sc, "%s -- bus_dmamap_load: %d\n", __func__, error);
347 SLIST_REMOVE_HEAD(&sc->lbuf_free_list, link);
357 patm_feed_lbufs(struct patm_softc *sc)
362 feed = patm_feed_cnt(sc, 1);
365 if ((b0 = patm_lmbuf_alloc(sc)) == NULL)
367 if ((b1 = patm_lmbuf_alloc(sc)) == NULL) {
368 patm_lbuf_free(sc, b0);
371 patm_fbq_write(sc, 1,
383 patm_intr_tsif(struct patm_softc *sc)
385 struct idt_tsqe *tsqe = sc->tsq_next;
397 patm_tx(sc, stamp, le32toh(tsqe->stat));
401 patm_tx_idle(sc, le32toh(tsqe->stat));
411 if (++tsqe == &sc->tsq[IDT_TSQ_SIZE])
412 tsqe = &sc->tsq[0];
417 sc->tsq_next = tsqe;
418 patm_nor_write(sc, IDT_NOR_TSQH, ((prev - sc->tsq) << IDT_TSQE_SHIFT));
425 patm_intr_rsq(struct patm_softc *sc)
430 if (sc->rsq_last + 1 == PATM_RSQ_SIZE)
431 rsqe = &sc->rsq[0];
433 rsqe = &sc->rsq[sc->rsq_last + 1];
439 patm_rx(sc, rsqe);
448 if (++sc->rsq_last == PATM_RSQ_SIZE)
449 sc->rsq_last = 0;
450 if (++rsqe == &sc->rsq[PATM_RSQ_SIZE])
451 rsqe = sc->rsq;
456 patm_nor_write(sc, IDT_NOR_RSQH, sc->rsq_phy | (sc->rsq_last << 2));
458 patm_feed_sbufs(sc);
459 patm_feed_lbufs(sc);
460 patm_feed_vbufs(sc);
472 patm_intr_raw(struct patm_softc *sc)
478 bus_dma_sync_size(sc->sq_tag, sc->sq_map, IDT_TSQ_SIZE * IDT_TSQE_SIZE +
479 PATM_RSQ_SIZE * IDT_RSQE_SIZE, sizeof(*sc->rawhnd),
483 if (sc->rawh == NULL) {
484 sc->rawh = &sc->lbufs[le32toh(sc->rawhnd->handle) & MBUF_HMASK];
486 tail = le32toh(sc->rawhnd->tail);
487 if (tail == sc->rawh->phy)
491 while (tail + 64 != sc->rawh->phy + sc->rawi * 64) {
493 bus_dmamap_sync_size(sc->lbuf_tag, sc->rawh->map,
494 sc->rawi * 64, 64, BUS_DMASYNC_POSTREAD);
496 cell = (uint32_t *)(mtod(sc->rawh->m, u_char *) +
497 sc->rawi * 64);
498 if (sc->rawi == (LMBUF_SIZE / 64) - 1) {
501 patm_lbuf_free(sc, sc->rawh);
502 sc->rawh = &sc->lbufs[h & MBUF_HMASK];
503 sc->rawi = 0;
507 patm_rx_raw(sc, (u_char *)cell);
508 sc->rawi++;
516 patm_lbuf_free(struct patm_softc *sc, struct lmbuf *b)
519 bus_dmamap_unload(sc->lbuf_tag, b->map);
524 SLIST_INSERT_HEAD(&sc->lbuf_free_list, b, link);
532 struct patm_softc *sc;
540 sc = devclass_get_softc(dc, unit);
541 if (sc == NULL) {
546 mbp_count(sc->sbuf_pool, &used, &card, &free);
549 mbp_count(sc->vbuf_pool, &used, &card, &free);