Lines Matching refs:sc

209 i82596_probe(sc)
210 struct ie_softc *sc;
214 sc->scp = sc->sc_msize - IE_SCP_SZ;
215 sc->iscp = 0;
216 sc->scb = 32;
218 (sc->ie_bus_write16)(sc, IE_ISCP_BUSY(sc->iscp), 1);
219 (sc->ie_bus_write16)(sc, IE_ISCP_SCB(sc->iscp), sc->scb);
220 (sc->ie_bus_write24)(sc, IE_ISCP_BASE(sc->iscp), sc->sc_maddr);
221 (sc->ie_bus_write24)(sc, IE_SCP_ISCP(sc->scp), sc->sc_maddr);
222 (sc->ie_bus_write16)(sc, IE_SCP_BUS_USE(sc->scp), sc->sysbus);
224 (sc->hwreset)(sc, IE_CARD_RESET);
226 if ((sc->ie_bus_read16)(sc, IE_ISCP_BUSY(sc->iscp))) {
228 printf("%s: ISCP set failed\n", sc->sc_dev.dv_xname);
233 if (sc->port) {
234 (sc->ie_bus_write24)(sc, sc->scp, 0);
235 (sc->ie_bus_write24)(sc, IE_SCP_TEST(sc->scp), -1);
236 (sc->port)(sc, IE_PORT_TEST);
238 (sc->ie_bus_read16)(sc, IE_SCP_TEST(sc->scp));
252 * (through `sc->scb') as an offset against the shared-memory bus handle.
269 i82596_attach(struct ie_softc *sc, const char *name, u_int8_t *etheraddr,
273 struct ifnet *ifp = &sc->sc_arpcom.ac_if;
276 (sc->ie_bus_write16)(sc, IE_ISCP_BUSY(sc->iscp), 1);
277 (sc->ie_bus_write16)(sc, IE_ISCP_SCB(sc->iscp), sc->scb);
278 (sc->ie_bus_write24)(sc, IE_ISCP_BASE(sc->iscp), sc->sc_maddr);
279 (sc->ie_bus_write24)(sc, IE_SCP_ISCP(sc->scp), sc->sc_maddr +sc->iscp);
280 (sc->ie_bus_write16)(sc, IE_SCP_BUS_USE(sc->scp), sc->sysbus);
281 (sc->hwreset)(sc, IE_CARD_RESET);
284 bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ);
285 ifp->if_softc = sc;
296 ifmedia_init(&sc->sc_media, 0, i82596_mediachange, i82596_mediastatus);
299 ifmedia_add(&sc->sc_media, media[i], 0, NULL);
300 ifmedia_set(&sc->sc_media, defmedia);
302 ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL);
303 ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
311 sc->sc_dev.dv_xname);
320 printf(" %s v%d.%d, address %s\n", name, sc->sc_vers / 10,
321 sc->sc_vers % 10, ether_sprintf(etheraddr));
334 struct ie_softc *sc = ifp->if_softc;
336 log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
339 i82596_reset(sc, 1);
343 i82596_cmd_wait(sc)
344 struct ie_softc *sc;
351 off = IE_SCB_CMD(sc->scb);
352 bus_space_barrier(sc->bt, sc->bh, off, 2,
354 if ((sc->ie_bus_read16)(sc, off) == 0) {
356 if (sc->sc_debug & IED_CMDS)
358 sc->sc_dev.dv_xname, (180000 - i) * 5);
365 if (sc->sc_debug & IED_CMDS)
367 sc->async_cmd_inprogress? "a" : "",
368 sc->ie_bus_read16(sc, IE_SCB_STATUS(sc->scb)),
385 i82596_start_cmd(sc, cmd, iecmdbuf, mask, async)
386 struct ie_softc *sc;
395 if (sc->sc_debug & IED_CMDS)
397 sc, cmd, iecmdbuf, mask, IE_STAT_BITS, async?"a":"");
399 if (sc->async_cmd_inprogress != 0) {
404 if (i82596_cmd_wait(sc) != 0)
406 sc->async_cmd_inprogress = 0;
409 off = IE_SCB_CMD(sc->scb);
410 (sc->ie_bus_write16)(sc, off, cmd);
411 bus_space_barrier(sc->bt, sc->bh, off, 2, BUS_SPACE_BARRIER_WRITE);
412 (sc->chan_attn)(sc);
415 sc->async_cmd_inprogress = 1;
430 bus_space_barrier(sc->bt, sc->bh, off, 2,
432 status = (sc->ie_bus_read16)(sc, off);
435 if (sc->sc_debug & IED_CMDS)
437 sc->sc_dev.dv_xname,
448 return (i82596_cmd_wait(sc));
459 i82596_count_errors(struct ie_softc *sc)
461 int scb = sc->scb;
463 sc->sc_arpcom.ac_if.if_ierrors +=
464 sc->ie_bus_read16(sc, IE_SCB_ERRCRC(scb)) +
465 sc->ie_bus_read16(sc, IE_SCB_ERRALN(scb)) +
466 sc->ie_bus_read16(sc, IE_SCB_ERRRES(scb)) +
467 sc->ie_bus_read16(sc, IE_SCB_ERROVR(scb));
470 sc->ie_bus_write16(sc, IE_SCB_ERRCRC(scb), 0);
471 sc->ie_bus_write16(sc, IE_SCB_ERRALN(scb), 0);
472 sc->ie_bus_write16(sc, IE_SCB_ERRRES(scb), 0);
473 sc->ie_bus_write16(sc, IE_SCB_ERROVR(scb), 0);
477 i82596_rx_errors(struct ie_softc *sc, int fn, int status)
479 log(LOG_ERR, "%s: rx error (frame# %d): %b\n", sc->sc_dev.dv_xname, fn,
490 register struct ie_softc *sc = v;
494 off = IE_SCB_STATUS(sc->scb);
495 bus_space_barrier(sc->bt, sc->bh, off, 2, BUS_SPACE_BARRIER_READ);
496 status = sc->ie_bus_read16(sc, off) /* & IE_ST_WHENCE */;
499 if (sc->intrhook)
500 (sc->intrhook)(sc, IE_INTR_EXIT);
507 i82596_start_cmd(sc, status & IE_ST_WHENCE, 0, 0, 1);
510 if (sc->intrhook)
511 (sc->intrhook)(sc, IE_INTR_ENRCV);
513 if (i82596_rint(sc, status) != 0)
518 if (sc->intrhook)
519 (sc->intrhook)(sc, IE_INTR_ENSND);
521 if (i82596_tint(sc, status) != 0)
526 if ((status & IE_ST_CNA) && (sc->sc_debug & IED_CNA))
527 printf("%s: cna; status=%b\n", sc->sc_dev.dv_xname,
530 if (sc->intrhook)
531 (sc->intrhook)(sc, IE_INTR_LOOP);
540 if (i82596_cmd_wait(sc))
543 bus_space_barrier(sc->bt, sc->bh, off, 2, BUS_SPACE_BARRIER_READ);
544 status = sc->ie_bus_read16(sc, off);
549 if (sc->intrhook)
550 (sc->intrhook)(sc, IE_INTR_EXIT);
554 i82596_cmd_wait(sc);
555 i82596_reset(sc, 1);
563 i82596_rint(sc, scbstatus)
564 struct ie_softc *sc;
571 if (sc->sc_debug & IED_RINT)
573 sc->sc_dev.dv_xname, scbstatus, IE_ST_BITS);
579 i = sc->rfhead;
580 off = IE_RFRAME_STATUS(sc->rframes, i);
581 bus_space_barrier(sc->bt, sc->bh, off, 2,
583 status = sc->ie_bus_read16(sc, off);
586 if (sc->sc_debug & IED_RINT)
588 sc->sc_dev.dv_xname, i, status, IE_ST_BITS);
593 sc->sc_dev.dv_xname);
594 i82596_rx_errors(sc, i, status);
599 i82596_count_errors(sc);
609 i82596_rx_errors(sc, i, status);
616 sc->sc_dev.dv_xname, i, status, IE_ST_BITS);
625 sc->ie_bus_write16(sc, off, 0);
628 off = IE_RFRAME_LAST(sc->rframes, i);
629 sc->ie_bus_write16(sc, off, IE_FD_EOL|IE_FD_SUSP);
632 off = IE_RFRAME_BUFDESC(sc->rframes, i);
633 sc->ie_bus_write16(sc, off, 0xffff);
636 off = IE_RFRAME_LAST(sc->rframes, sc->rftail);
637 sc->ie_bus_write16(sc, off, 0);
639 if (++sc->rftail == sc->nframes)
640 sc->rftail = 0;
641 if (++sc->rfhead == sc->nframes)
642 sc->rfhead = 0;
646 i82596_drop_frames(sc);
648 sc->rnr_expect = 1;
649 sc->sc_arpcom.ac_if.if_ierrors++;
650 } else if (i82596_readframe(sc, i) != 0)
671 if (i82596_start_cmd(sc, IE_RUC_RESUME, 0, 0, 0) == 0)
674 sc->sc_dev.dv_xname);
678 if (sc->rnr_expect != 0) {
684 i82596_start_transceiver(sc);
685 sc->rnr_expect = 0;
695 if (i82596_chk_rx_ring(sc) != 0)
698 i82596_start_transceiver(sc);
699 sc->sc_arpcom.ac_if.if_ierrors++;
703 sc->sc_dev.dv_xname, scbstatus, IE_ST_BITS);
705 sc->sc_arpcom.ac_if.if_ierrors++;
718 i82596_tint(sc, scbstatus)
719 struct ie_softc *sc;
722 register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
729 if (sc->xmit_busy <= 0) {
732 sc->sc_dev.dv_xname,
733 sc->xmit_busy, sc->xctail, sc->xchead);
738 off = IE_CMD_XMIT_STATUS(sc->xmit_cmds, sc->xctail);
739 status = sc->ie_bus_read16(sc, off);
742 if (sc->sc_debug & IED_TINT)
744 sc->sc_dev.dv_xname, scbstatus, IE_ST_BITS,
750 "status=%b; tail=%d\n", sc->sc_dev.dv_xname,
751 status, IE_XS_BITS, sc->xctail);
765 printf("%s: send aborted\n", sc->sc_dev.dv_xname);
767 printf("%s: no carrier\n", sc->sc_dev.dv_xname);
769 printf("%s: lost CTS\n", sc->sc_dev.dv_xname);
771 printf("%s: DMA underrun\n", sc->sc_dev.dv_xname);
777 sc->sc_dev.dv_xname);
779 sc->sc_arpcom.ac_if.if_collisions += 16;
788 if (sc->want_mcsetup) {
789 ie_mc_setup(sc, IE_XBUF_ADDR(sc, sc->xctail));
790 sc->want_mcsetup = 0;
794 sc->xmit_busy--;
795 sc->xctail = (sc->xctail + 1) % NTXBUF;
798 if (sc->xmit_busy > 0)
799 i82596_xmit(sc);
809 i82596_get_rbd_list(sc, start, end, pktlen)
810 struct ie_softc *sc;
815 int off, rbbase = sc->rbds;
820 *start = rbindex = sc->rbhead;
824 bus_space_barrier(sc->bt, sc->bh, off, 2,
826 rbdstatus = sc->ie_bus_read16(sc, off);
833 print_rbd(sc, rbindex);
837 sc->sc_dev.dv_xname, rbindex);
842 if (++rbindex == sc->nrxbuf)
857 i82596_release_rbd_list(sc, start, end)
858 struct ie_softc *sc;
862 register int off, rbbase = sc->rbds;
868 sc->ie_bus_write16(sc, off, 0);
869 if (++rbindex == sc->nrxbuf)
874 rbindex = ((rbindex == 0) ? sc->nrxbuf : rbindex) - 1;
876 sc->ie_bus_write16(sc, off, IE_RBUF_SIZE|IE_RBD_EOL);
879 off = IE_RBD_BUFLEN(rbbase, sc->rbtail);
880 sc->ie_bus_write16(sc, off, IE_RBUF_SIZE);
884 sc->rbhead = end;
885 sc->rbtail = rbindex;
895 i82596_drop_frames(sc)
896 struct ie_softc *sc;
901 if (!i82596_get_rbd_list(sc, &bstart, &bend, &pktlen))
903 i82596_release_rbd_list(sc, bstart, bend);
917 i82596_chk_rx_ring(sc)
918 struct ie_softc *sc;
922 for (n = 0; n < sc->nrxbuf; n++) {
923 off = IE_RBD_BUFLEN(sc->rbds, n);
924 val = sc->ie_bus_read16(sc, off);
925 if ((n == sc->rbtail) ^ ((val & IE_RBD_EOL) != 0)) {
929 sc->sc_dev.dv_xname, n);
936 for (n = 0; n < sc->nframes; n++) {
937 off = IE_RFRAME_LAST(sc->rframes, n);
938 val = sc->ie_bus_read16(sc, off);
939 if ((n == sc->rftail) ^ ((val & (IE_FD_EOL|IE_FD_SUSP)) != 0)) {
943 sc->sc_dev.dv_xname, n);
962 i82596_get(struct ie_softc *sc, int head, int totlen)
972 (sc->memcopyin)(sc, &eh, IE_RBUF_ADDR(sc, head),
1037 off = IE_RBUF_ADDR(sc,head) + thisrboff;
1038 (sc->memcopyin)(sc, mtod(m, caddr_t) + thismboff, off, len);
1048 if (++head == sc->nrxbuf)
1077 i82596_readframe(sc, num)
1078 struct ie_softc *sc;
1081 struct ifnet *ifp = &sc->sc_arpcom.ac_if;
1087 if (i82596_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) {
1092 m = i82596_get(sc, bstart, pktlen);
1093 i82596_release_rbd_list(sc, bstart, bend);
1096 sc->sc_arpcom.ac_if.if_ierrors++;
1101 if (sc->sc_debug & IED_READFRAME) {
1105 sc->sc_dev.dv_xname, ether_sprintf(eh->ether_shost),
1121 i82596_xmit(sc)
1122 struct ie_softc *sc;
1126 cur = sc->xctail;
1129 if (sc->sc_debug & IED_XMIT)
1130 printf("%s: xmit buffer %d\n", sc->sc_dev.dv_xname, cur);
1136 sc->ie_bus_write16(sc, IE_CMD_XMIT_DESC(sc->xmit_cmds, cur),
1137 IE_XBD_ADDR(sc->xbds, cur));
1139 sc->ie_bus_write16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds, cur), 0);
1141 if (sc->do_xmitnopchain) {
1145 sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
1146 IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
1147 sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
1153 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, cur), 0);
1154 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, cur),
1155 IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
1161 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, prev), 0);
1162 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, prev),
1163 IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
1165 off = IE_SCB_STATUS(sc->scb);
1166 bus_space_barrier(sc->bt, sc->bh, off, 2,
1168 if ((sc->ie_bus_read16(sc, off) & IE_CUS_ACTIVE) == 0) {
1170 i82596_start_transceiver(sc);
1173 sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds,cur),
1176 sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
1179 off = IE_SCB_CMDLST(sc->scb);
1180 sc->ie_bus_write16(sc, off, IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
1181 bus_space_barrier(sc->bt, sc->bh, off, 2,
1184 if (i82596_start_cmd(sc, IE_CUC_START, 0, 0, 1)) {
1186 if (sc->sc_debug & IED_XMIT)
1189 sc->sc_dev.dv_xname);
1194 sc->sc_arpcom.ac_if.if_timer = 5;
1205 struct ie_softc *sc = ifp->if_softc;
1211 if (sc->sc_debug & IED_ENQ)
1219 if (sc->xmit_busy == NTXBUF) {
1239 printf("%s: tbuf overflow\n", sc->sc_dev.dv_xname);
1241 head = sc->xchead;
1242 sc->xchead = (head + 1) % NTXBUF;
1243 buffer = IE_XBUF_ADDR(sc, head);
1246 if (sc->sc_debug & IED_ENQ)
1248 sc->sc_dev.dv_xname, head, buffer);
1253 if (sc->sc_debug & IED_ENQ) {
1261 sc->sc_dev.dv_xname);
1266 (sc->memcopyout)(sc, mtod(m,caddr_t), buffer, m->m_len);
1272 (sc->memcopyout)(sc, padbuf, buffer,
1279 if (sc->sc_debug & IED_ENQ)
1289 xbase = sc->xbds;
1290 sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head),
1292 sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff);
1293 sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head),
1294 sc->sc_maddr + IE_XBUF_ADDR(sc, head));
1297 if (sc->xmit_busy++ == 0)
1298 i82596_xmit(sc);
1307 i82596_proberam(sc)
1308 struct ie_softc *sc;
1313 off = IE_SCP_BUS_USE(sc->scp);
1314 (sc->ie_bus_write16)(sc, off, 0);
1315 bus_space_barrier(sc->bt, sc->bh, off, 2, BUS_SPACE_BARRIER_WRITE);
1318 off = IE_ISCP_BUSY(sc->iscp);
1319 (sc->ie_bus_write16)(sc, off, 1);
1320 bus_space_barrier(sc->bt, sc->bh, off, 2, BUS_SPACE_BARRIER_WRITE);
1322 if (sc->hwreset)
1323 (sc->hwreset)(sc, IE_CHIP_PROBE);
1325 (sc->chan_attn) (sc);
1330 off = IE_ISCP_BUSY(sc->iscp);
1331 bus_space_barrier(sc->bt, sc->bh, off, 1, BUS_SPACE_BARRIER_READ);
1332 result = (sc->ie_bus_read16)(sc, off) == 0;
1335 ie_ack(sc, IE_ST_WHENCE);
1341 i82596_reset(sc, hard)
1342 struct ie_softc *sc;
1349 printf("%s: reset\n", sc->sc_dev.dv_xname);
1353 sc->sc_arpcom.ac_if.if_timer = 0;
1354 ifq_clr_oactive(&sc->sc_arpcom.ac_if.if_snd);
1359 if (i82596_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0)) {
1361 printf("%s: abort commands timed out\n", sc->sc_dev.dv_xname);
1370 if (hard && sc->hwreset)
1371 (sc->hwreset)(sc, IE_CARD_RESET);
1374 ie_ack(sc, IE_ST_WHENCE);
1376 if ((sc->sc_arpcom.ac_if.if_flags & IFF_UP) != 0) {
1379 if (i82596_init(sc) == 1)
1387 i82596_simple_command(sc, cmd, cmdbuf)
1388 struct ie_softc *sc;
1393 sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0);
1394 sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST);
1395 sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff);
1398 sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf);
1405 ie_run_tdr(sc, cmd)
1406 struct ie_softc *sc;
1411 i82596_simple_command(sc, IE_CMD_TDR, cmd);
1412 (sc->ie_bus_write16)(sc, IE_CMD_TDR_TIME(cmd), 0);
1414 if (i82596_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) ||
1415 !(sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK))
1418 result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd));
1421 ie_ack(sc, IE_ST_WHENCE);
1428 printf("%s: TDR command failed\n", sc->sc_dev.dv_xname);
1431 printf("%s: transceiver problem\n", sc->sc_dev.dv_xname);
1435 sc->sc_dev.dv_xname, clocks, clocks == 1? "":"s");
1438 sc->sc_dev.dv_xname, clocks, clocks == 1? "":"s");
1441 sc->sc_dev.dv_xname, result);
1447 * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz.
1456 i82596_setup_bufs(sc)
1457 struct ie_softc *sc;
1459 int n, r, ptr = sc->buf_area; /* memory pool */
1474 sc->nop_cmds = ptr - 2;
1479 sc->xmit_cmds = ptr - 2;
1484 sc->xbds = ptr - 2;
1488 sc->xbufs = ptr;
1494 n = sc->buf_area_sz - (ptr - sc->buf_area);
1499 sc->nframes = n / r;
1501 if (sc->nframes <= 8)
1504 sc->nrxbuf = sc->nframes * B_PER_F;
1508 sc->rframes = ptr - 2;
1509 ptr += sc->nframes * 64;
1513 sc->rbds = ptr - 2;
1514 ptr += sc->nrxbuf * 32;
1517 sc->rbufs = ptr;
1518 ptr += sc->nrxbuf * IE_RBUF_SIZE;
1521 printf("%s: %d frames %d bufs\n", sc->sc_dev.dv_xname, sc->nframes,
1522 sc->nrxbuf);
1528 for (n = 0; n < sc->nframes; n++) {
1529 int m = (n == sc->nframes - 1) ? 0 : n + 1;
1532 sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes,n), 0);
1535 sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,n),
1539 sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes,n),
1540 IE_RFRAME_ADDR(sc->rframes,m));
1543 sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes,n),
1550 for (n = 0; n < sc->nrxbuf; n++) {
1551 int m = (n == sc->nrxbuf - 1) ? 0 : n + 1;
1554 sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds,n), 0);
1557 sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds,n),
1558 IE_RBD_ADDR(sc->rbds,m));
1561 sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n),
1562 sc->sc_maddr + IE_RBUF_ADDR(sc, n));
1563 sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds,n),
1571 (sc->ie_bus_write16)(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0);
1573 (sc->ie_bus_write16)(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n),
1576 (sc->ie_bus_write16)(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n),
1577 IE_CMD_NOP_ADDR(sc->nop_cmds, n));
1587 sc->xchead = sc->xctail = 0;
1590 sc->xmit_busy = 0;
1596 sc->rfhead = 0;
1597 sc->rftail = sc->nframes - 1;
1603 sc->rbhead = 0;
1604 sc->rbtail = sc->nrxbuf - 1;
1609 sc->sc_dev.dv_xname, ptr - sc->buf_area);
1614 ie_cfg_setup(sc, cmd, promiscuous, manchester)
1615 struct ie_softc *sc;
1621 i82596_simple_command(sc, IE_CMD_CONFIG, cmd);
1622 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_CNT(cmd), 0x0c);
1623 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_FIFO(cmd), 8);
1624 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_SAVEBAD(cmd), 0x40);
1625 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_ADDRLEN(cmd), 0x2e);
1626 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_PRIORITY(cmd), 0);
1627 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_IFS(cmd), 0x60);
1628 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_SLOT_LOW(cmd), 0);
1629 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_SLOT_HIGH(cmd), 0xf2);
1630 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_PROMISC(cmd),
1632 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_CRSCDT(cmd), 0);
1633 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_MINLEN(cmd), 64);
1634 bus_space_write_1(sc->bt, sc->bh, IE_CMD_CFG_JUNK(cmd), 0xff);
1635 bus_space_barrier(sc->bt, sc->bh, cmd, IE_CMD_CFG_SZ,
1638 cmdresult = i82596_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0);
1639 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd));
1642 sc->sc_dev.dv_xname, status, IE_STAT_BITS);
1647 sc->sc_dev.dv_xname, status, IE_STAT_BITS);
1652 ie_ack(sc, IE_ST_WHENCE);
1657 ie_ia_setup(sc, cmdbuf)
1658 struct ie_softc *sc;
1663 i82596_simple_command(sc, IE_CMD_IASETUP, cmdbuf);
1665 (sc->memcopyout)(sc, sc->sc_arpcom.ac_enaddr,
1668 cmdresult = i82596_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
1669 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
1672 sc->sc_dev.dv_xname, status, IE_STAT_BITS);
1677 sc->sc_dev.dv_xname, status, IE_STAT_BITS);
1682 ie_ack(sc, IE_ST_WHENCE);
1691 ie_mc_setup(sc, cmdbuf)
1692 struct ie_softc *sc;
1697 if (sc->mcast_count == 0)
1700 i82596_simple_command(sc, IE_CMD_MCAST, cmdbuf);
1702 (sc->memcopyout)(sc, (caddr_t)sc->mcast_addrs,
1704 sc->mcast_count * ETHER_ADDR_LEN);
1706 sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf),
1707 sc->mcast_count * ETHER_ADDR_LEN);
1710 cmdresult = i82596_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
1711 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
1714 sc->sc_dev.dv_xname, status, IE_STAT_BITS);
1719 sc->sc_dev.dv_xname, status, IE_STAT_BITS);
1724 ie_ack(sc, IE_ST_WHENCE);
1737 i82596_init(sc)
1738 struct ie_softc *sc;
1740 struct ifnet *ifp = &sc->sc_arpcom.ac_if;
1743 sc->async_cmd_inprogress = 0;
1745 cmd = sc->buf_area;
1750 if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0)
1756 if (ie_ia_setup(sc, cmd) == 0)
1762 ie_run_tdr(sc, cmd);
1767 if (ie_mc_setup(sc, cmd) == 0)
1773 ie_ack(sc, IE_ST_WHENCE);
1778 i82596_setup_bufs(sc);
1780 if (sc->hwinit)
1781 (sc->hwinit)(sc);
1787 sc->do_xmitnopchain = 0;
1789 i82596_start_transceiver(sc);
1797 i82596_start_transceiver(sc)
1798 struct ie_softc *sc;
1804 sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes,sc->rfhead),
1805 IE_RBD_ADDR(sc->rbds, sc->rbhead));
1807 sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb),
1808 IE_RFRAME_ADDR(sc->rframes,sc->rfhead));
1810 if (sc->do_xmitnopchain) {
1812 if (i82596_start_cmd(sc, IE_CUC_SUSPEND|IE_RUC_SUSPEND, 0, 0, 0))
1814 sc->sc_dev.dv_xname);
1817 /* sc->scb->ie_command_list =
1818 IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
1819 sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
1821 sc->nop_cmds,
1822 (sc->xctail + NTXBUF - 1) % NTXBUF));
1824 if (i82596_start_cmd(sc, IE_CUC_START|IE_RUC_START, 0, 0, 0))
1826 sc->sc_dev.dv_xname);
1828 if (i82596_start_cmd(sc, IE_RUC_START, 0, 0, 0))
1830 sc->sc_dev.dv_xname);
1835 i82596_stop(sc)
1836 struct ie_softc *sc;
1839 if (i82596_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
1841 sc->sc_dev.dv_xname);
1850 struct ie_softc *sc = ifp->if_softc;
1859 i82596_init(sc);
1863 sc->promisc = ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI);
1870 i82596_stop(sc);
1878 i82596_init(sc);
1884 i82596_stop(sc);
1885 i82596_init(sc);
1889 sc->sc_debug = IED_ALL;
1891 sc->sc_debug = 0;
1897 error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
1901 error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data);
1906 ie_mc_reset(sc);
1915 ie_mc_reset(sc)
1916 struct ie_softc *sc;
1918 struct arpcom *ac = &sc->sc_arpcom;
1933 sc->mcast_count = 0;
1934 ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
1937 sc->mcast_count++;
1941 if (size > sc->mcast_addrs_size) {
1943 if (sc->mcast_addrs_size)
1944 free(sc->mcast_addrs, M_IFMADDR, 0);
1945 sc->mcast_addrs = (char *)
1947 sc->mcast_addrs_size = size;
1953 sc->mcast_count = 0;
1954 ETHER_FIRST_MULTI(step, &sc->sc_arpcom, enm);
1957 &sc->mcast_addrs[sc->mcast_count * ETHER_ADDR_LEN],
1959 sc->mcast_count++;
1962 sc->want_mcsetup = 1;
1972 struct ie_softc *sc = ifp->if_softc;
1974 if (sc->sc_mediachange)
1975 return ((*sc->sc_mediachange)(sc));
1987 struct ie_softc *sc = ifp->if_softc;
1989 if (sc->sc_mediastatus)
1990 (*sc->sc_mediastatus)(sc, ifmr);
1995 print_rbd(sc, n)
1996 struct ie_softc *sc;
2001 "length/EOL %04x\n", IE_RBD_ADDR(sc->rbds,n),
2002 sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds,n)), IE_STAT_BITS,
2003 sc->ie_bus_read16(sc, IE_RBD_NEXT(sc->rbds,n)),
2004 (u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
2005 sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds,n)));