Lines Matching defs:sc

96 static void	am7990_start_locked(struct lance_softc *sc);
104 am7990_config(struct am7990_softc *sc, const char* name, int unit)
108 sc->lsc.sc_meminit = am7990_meminit;
109 sc->lsc.sc_start_locked = am7990_start_locked;
111 error = lance_config(&sc->lsc, name, unit);
116 sc->lsc.sc_initaddr = mem;
118 sc->lsc.sc_rmdaddr = mem;
119 mem += sizeof(struct lermd) * sc->lsc.sc_nrbuf;
120 sc->lsc.sc_tmdaddr = mem;
121 mem += sizeof(struct letmd) * sc->lsc.sc_ntbuf;
122 sc->lsc.sc_rbufaddr = mem;
123 mem += LEBLEN * sc->lsc.sc_nrbuf;
124 sc->lsc.sc_tbufaddr = mem;
125 mem += LEBLEN * sc->lsc.sc_ntbuf;
127 if (mem > sc->lsc.sc_memsize)
130 lance_attach(&sc->lsc);
136 am7990_detach(struct am7990_softc *sc)
139 lance_detach(&sc->lsc);
146 am7990_meminit(struct lance_softc *sc)
148 struct ifnet *ifp = sc->sc_ifp;
155 LE_LOCK_ASSERT(sc, MA_OWNED);
162 init.init_padr[0] = (sc->sc_enaddr[1] << 8) | sc->sc_enaddr[0];
163 init.init_padr[1] = (sc->sc_enaddr[3] << 8) | sc->sc_enaddr[2];
164 init.init_padr[2] = (sc->sc_enaddr[5] << 8) | sc->sc_enaddr[4];
165 lance_setladrf(sc, init.init_ladrf);
167 sc->sc_last_rd = 0;
168 sc->sc_first_td = sc->sc_last_td = sc->sc_no_td = 0;
170 a = sc->sc_addr + LE_RMDADDR(sc, 0);
172 init.init_rlen = (a >> 16) | ((ffs(sc->sc_nrbuf) - 1) << 13);
174 a = sc->sc_addr + LE_TMDADDR(sc, 0);
176 init.init_tlen = (a >> 16) | ((ffs(sc->sc_ntbuf) - 1) << 13);
178 (*sc->sc_copytodesc)(sc, &init, LE_INITADDR(sc), sizeof(init));
183 for (bix = 0; bix < sc->sc_nrbuf; bix++) {
184 a = sc->sc_addr + LE_RBUFADDR(sc, bix);
190 (*sc->sc_copytodesc)(sc, &rmd, LE_RMDADDR(sc, bix),
197 for (bix = 0; bix < sc->sc_ntbuf; bix++) {
198 a = sc->sc_addr + LE_TBUFADDR(sc, bix);
204 (*sc->sc_copytodesc)(sc, &tmd, LE_TMDADDR(sc, bix),
210 am7990_rint(struct lance_softc *sc)
212 struct ifnet *ifp = sc->sc_ifp;
222 bix = sc->sc_last_rd;
226 rp = LE_RMDADDR(sc, bix);
227 (*sc->sc_copyfromdesc)(sc, &rmd, rp, sizeof(rmd));
258 if (sc->sc_flags & LE_DEBUG)
259 am7990_recv_print(sc, bix);
262 m = lance_get(sc, LE_RBUFADDR(sc, bix),
269 (*sc->sc_copytodesc)(sc, &rmd, rp, sizeof(rmd));
271 if (++bix == sc->sc_nrbuf)
287 if (ether_cmp(eh->ether_dhost, sc->sc_enaddr) &&
295 LE_UNLOCK(sc);
297 LE_LOCK(sc);
302 sc->sc_last_rd = bix;
306 am7990_tint(struct lance_softc *sc)
308 struct ifnet *ifp = sc->sc_ifp;
312 bix = sc->sc_first_td;
315 if (sc->sc_no_td <= 0)
318 (*sc->sc_copyfromdesc)(sc, &tmd, LE_TMDADDR(sc, bix),
322 if (sc->sc_flags & LE_DEBUG)
341 lance_init_locked(sc);
345 if (sc->sc_flags & LE_CARRIER)
348 sc->sc_flags &= ~LE_CARRIER;
349 if (sc->sc_nocarrier)
350 (*sc->sc_nocarrier)(sc);
373 if (++bix == sc->sc_ntbuf)
376 --sc->sc_no_td;
379 sc->sc_first_td = bix;
381 sc->sc_wdog_timer = sc->sc_no_td > 0 ? 5 : 0;
390 struct lance_softc *sc = arg;
391 struct ifnet *ifp = sc->sc_ifp;
394 LE_LOCK(sc);
396 if (sc->sc_hwintr && (*sc->sc_hwintr)(sc) == -1) {
398 lance_init_locked(sc);
399 LE_UNLOCK(sc);
403 isr = (*sc->sc_rdcsr)(sc, LE_CSR0);
405 if (sc->sc_flags & LE_DEBUG)
409 LE_UNLOCK(sc);
421 (*sc->sc_wrcsr)(sc, LE_CSR0, isr & ~(LE_C0_INEA | LE_C0_TDMD |
445 lance_init_locked(sc);
446 LE_UNLOCK(sc);
454 lance_init_locked(sc);
455 LE_UNLOCK(sc);
461 lance_init_locked(sc);
462 LE_UNLOCK(sc);
469 if (!(sc->sc_flags & LE_CARRIER))
471 sc->sc_flags |= LE_CARRIER;
474 am7990_rint(sc);
476 am7990_tint(sc);
479 (*sc->sc_wrcsr)(sc, LE_CSR0, LE_C0_INEA);
482 am7990_start_locked(sc);
484 LE_UNLOCK(sc);
493 am7990_start_locked(struct lance_softc *sc)
495 struct ifnet *ifp = sc->sc_ifp;
500 LE_LOCK_ASSERT(sc, MA_OWNED);
506 bix = sc->sc_last_td;
509 for (; sc->sc_no_td < sc->sc_ntbuf &&
511 rp = LE_TMDADDR(sc, bix);
512 (*sc->sc_copyfromdesc)(sc, &tmd, rp, sizeof(tmd));
518 sc->sc_no_td, sc->sc_last_td);
534 len = lance_put(sc, LE_TBUFADDR(sc, bix), m);
548 (*sc->sc_copytodesc)(sc, &tmd, rp, sizeof(tmd));
551 if (sc->sc_flags & LE_DEBUG)
552 am7990_xmit_print(sc, bix);
555 (*sc->sc_wrcsr)(sc, LE_CSR0, LE_C0_INEA | LE_C0_TDMD);
558 if (++bix == sc->sc_ntbuf)
561 if (++sc->sc_no_td == sc->sc_ntbuf) {
567 sc->sc_last_td = bix;
570 sc->sc_wdog_timer = 5;
575 am7990_recv_print(struct lance_softc *sc, int no)
577 struct ifnet *ifp = sc->sc_ifp;
582 (*sc->sc_copyfromdesc)(sc, &rmd, LE_RMDADDR(sc, no), sizeof(rmd));
585 if_printf(ifp, "status %04x\n", (*sc->sc_rdcsr)(sc, LE_CSR0));
590 (*sc->sc_copyfrombuf)(sc, &eh, LE_RBUFADDR(sc, no), sizeof(eh));
598 am7990_xmit_print(struct lance_softc *sc, int no)
600 struct ifnet *ifp = sc->sc_ifp;
605 (*sc->sc_copyfromdesc)(sc, &tmd, LE_TMDADDR(sc, no), sizeof(tmd));
608 if_printf(ifp, "status %04x\n", (*sc->sc_rdcsr)(sc, LE_CSR0));
613 (*sc->sc_copyfrombuf)(sc, &eh, LE_TBUFADDR(sc, no), sizeof(eh));