Home | History | Annotate | Download | only in ic

Lines Matching refs:sc

214  * (through `sc->scb') as an offset against the shared-memory bus handle.
231 i82586_attach(struct ie_softc *sc, const char *name, uint8_t *etheraddr,
235 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
237 strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
238 ifp->if_softc = sc;
248 sc->sc_ethercom.ec_ifmedia = &sc->sc_media;
249 ifmedia_init(&sc->sc_media, 0, i82586_mediachange, i82586_mediastatus);
252 ifmedia_add(&sc->sc_media, media[i], 0, NULL);
253 ifmedia_set(&sc->sc_media, defmedia);
255 ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_MANUAL, 0, NULL);
256 ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_MANUAL);
281 struct ie_softc *sc = ifp->if_softc;
283 log(LOG_ERR, "%s: device timeout\n", device_xname(sc->sc_dev));
286 i82586_reset(sc, 1);
290 i82586_cmd_wait(struct ie_softc *sc)
298 off = IE_SCB_CMD(sc->scb);
300 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
301 if ((cmd = sc->ie_bus_read16(sc, off)) == 0)
306 off = IE_SCB_STATUS(sc->scb);
308 sc->async_cmd_inprogress?"a":"",
309 sc->ie_bus_read16(sc, off), cmd);
325 i82586_start_cmd(struct ie_softc *sc, int cmd, int iecmdbuf, int mask,
331 if (sc->async_cmd_inprogress != 0) {
336 if (i82586_cmd_wait(sc) != 0)
338 sc->async_cmd_inprogress = 0;
341 off = IE_SCB_CMD(sc->scb);
342 sc->ie_bus_write16(sc, off, cmd);
343 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
344 (sc->chan_attn)(sc, CARD_RESET);
347 sc->async_cmd_inprogress = 1;
362 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
363 status = sc->ie_bus_read16(sc, off);
373 return (i82586_cmd_wait(sc));
384 ie_ack(struct ie_softc *sc, u_int mask)
389 IE_BUS_BARRIER(sc, 0, 0, BUS_SPACE_BARRIER_READ);
390 status = sc->ie_bus_read16(sc, IE_SCB_STATUS(sc->scb));
391 i82586_start_cmd(sc, status & mask, 0, 0, 0);
392 if (sc->intrhook)
393 sc->intrhook(sc, INTR_ACK);
400 i82586_count_errors(struct ie_softc *sc)
402 int scb = sc->scb;
404 if_statadd(&sc->sc_ethercom.ec_if, if_ierrors,
405 sc->ie_bus_read16(sc, IE_SCB_ERRCRC(scb)) +
406 sc->ie_bus_read16(sc, IE_SCB_ERRALN(scb)) +
407 sc->ie_bus_read16(sc, IE_SCB_ERRRES(scb)) +
408 sc->ie_bus_read16(sc, IE_SCB_ERROVR(scb)));
411 sc->ie_bus_write16(sc, IE_SCB_ERRCRC(scb), 0);
412 sc->ie_bus_write16(sc, IE_SCB_ERRALN(scb), 0);
413 sc->ie_bus_write16(sc, IE_SCB_ERRRES(scb), 0);
414 sc->ie_bus_write16(sc, IE_SCB_ERROVR(scb), 0);
418 i82586_rx_errors(struct ie_softc *sc, int fn, int status)
423 device_xname(sc->sc_dev), fn, bits);
432 struct ie_softc *sc = v;
439 if (sc->intrhook)
440 (sc->intrhook)(sc, INTR_ENTER);
442 off = IE_SCB_STATUS(sc->scb);
443 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
444 status = sc->ie_bus_read16(sc, off) & IE_ST_WHENCE;
447 if (sc->intrhook)
448 (sc->intrhook)(sc, INTR_EXIT);
456 ie_ack(sc, status & IE_ST_WHENCE);
458 i82586_start_cmd(sc, status & IE_ST_WHENCE, 0, 0, 1);
461 if (i82586_rint(sc, status) != 0)
465 if (i82586_tint(sc, status) != 0)
469 if ((status & IE_ST_CNA) && (sc->sc_debug & IED_CNA))
470 printf("%s: cna; status=0x%x\n", device_xname(sc->sc_dev),
473 if (sc->intrhook)
474 (sc->intrhook)(sc, INTR_LOOP);
483 if (i82586_cmd_wait(sc) != 0)
486 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
487 status = sc->ie_bus_read16(sc, off);
492 if (sc->intrhook)
493 (sc->intrhook)(sc, INTR_EXIT);
497 i82586_cmd_wait(sc);
498 i82586_reset(sc, 1);
507 i82586_rint(struct ie_softc *sc, int scbstatus)
513 if (sc->sc_debug & IED_RINT)
515 device_xname(sc->sc_dev), scbstatus);
521 i = sc->rfhead;
522 off = IE_RFRAME_STATUS(sc->rframes, i);
523 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
524 status = sc->ie_bus_read16(sc, off);
527 if (sc->sc_debug & IED_RINT)
529 device_xname(sc->sc_dev), i, status);
534 device_xname(sc->sc_dev));
535 i82586_rx_errors(sc, i, status);
540 i82586_count_errors(sc);
550 i82586_rx_errors(sc, i, status);
557 device_xname(sc->sc_dev), i, status);
567 sc->ie_bus_write16(sc, off, 0);
570 off = IE_RFRAME_LAST(sc->rframes, i);
571 sc->ie_bus_write16(sc, off, IE_FD_EOL | IE_FD_SUSP);
574 off = IE_RFRAME_BUFDESC(sc->rframes, i);
575 sc->ie_bus_write16(sc, off, 0xffff);
578 off = IE_RFRAME_LAST(sc->rframes, sc->rftail);
579 sc->ie_bus_write16(sc, off, 0);
581 if (++sc->rftail == sc->nframes)
582 sc->rftail = 0;
583 if (++sc->rfhead == sc->nframes)
584 sc->rfhead = 0;
588 i82586_drop_frames(sc);
590 sc->rnr_expect = 1;
591 if_statinc(&sc->sc_ethercom.ec_if, if_ierrors);
592 } else if (ie_readframe(sc, i) != 0)
613 if (i82586_start_cmd(sc, IE_RUC_RESUME, 0, 0, 0) == 0)
615 aprint_error_dev(sc->sc_dev,
620 if (sc->rnr_expect != 0) {
626 i82586_start_transceiver(sc);
627 sc->rnr_expect = 0;
637 if (i82586_chk_rx_ring(sc) != 0)
640 i82586_start_transceiver(sc);
641 if_statinc(&sc->sc_ethercom.ec_if, if_ierrors);
645 device_xname(sc->sc_dev), scbstatus);
647 if_statinc(&sc->sc_ethercom.ec_if, if_ierrors);
660 i82586_tint(struct ie_softc *sc, int scbstatus)
662 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
668 if (sc->xmit_busy <= 0) {
670 sc->xmit_busy, sc->xctail, sc->xchead);
675 status = sc->ie_bus_read16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds,
676 sc->xctail));
679 if (sc->sc_debug & IED_TINT)
681 device_xname(sc->sc_dev), scbstatus, status);
686 status, sc->xctail);
700 aprint_error_dev(sc->sc_dev, "send aborted\n");
702 aprint_error_dev(sc->sc_dev, "no carrier\n");
704 aprint_error_dev(sc->sc_dev, "lost CTS\n");
706 aprint_error_dev(sc->sc_dev, "DMA underrun\n");
708 aprint_error_dev(sc->sc_dev, "too many collisions\n");
709 if_statadd(&sc->sc_ethercom.ec_if, if_collisions, 16);
718 if (sc->want_mcsetup) {
719 ie_mc_setup(sc, IE_XBUF_ADDR(sc, sc->xctail));
720 sc->want_mcsetup = 0;
724 sc->xmit_busy--;
725 sc->xctail = (sc->xctail + 1) % NTXBUF;
728 if (sc->xmit_busy > 0)
729 iexmit(sc);
739 i82586_get_rbd_list(struct ie_softc *sc, uint16_t *start, uint16_t *end,
742 int off, rbbase = sc->rbds;
747 *start = rbindex = sc->rbhead;
751 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
752 rbdstatus = sc->ie_bus_read16(sc, off);
759 print_rbd(sc, rbindex);
763 device_xname(sc->sc_dev), rbindex);
768 if (++rbindex == sc->nrxbuf)
783 i82586_release_rbd_list(struct ie_softc *sc, uint16_t start, uint16_t end)
785 int off, rbbase = sc->rbds;
791 sc->ie_bus_write16(sc, off, 0);
792 if (++rbindex == sc->nrxbuf)
797 rbindex = ((rbindex == 0) ? sc->nrxbuf : rbindex) - 1;
799 sc->ie_bus_write16(sc, off, IE_RBUF_SIZE | IE_RBD_EOL);
802 off = IE_RBD_BUFLEN(rbbase, sc->rbtail);
803 sc->ie_bus_write16(sc, off, IE_RBUF_SIZE);
807 sc->rbhead = end;
808 sc->rbtail = rbindex;
818 i82586_drop_frames(struct ie_softc *sc)
823 if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0)
825 i82586_release_rbd_list(sc, bstart, bend);
839 i82586_chk_rx_ring(struct ie_softc *sc)
843 for (n = 0; n < sc->nrxbuf; n++) {
844 off = IE_RBD_BUFLEN(sc->rbds, n);
845 val = sc->ie_bus_read16(sc, off);
846 if ((n == sc->rbtail) ^ ((val & IE_RBD_EOL) != 0)) {
850 device_xname(sc->sc_dev), n);
857 for (n = 0; n < sc->nframes; n++) {
858 off = IE_RFRAME_LAST(sc->rframes, n);
859 val = sc->ie_bus_read16(sc, off);
860 if ((n == sc->rftail) ^ ((val & (IE_FD_EOL | IE_FD_SUSP))
865 device_xname(sc->sc_dev), n);
884 ieget(struct ie_softc *sc, int head, int totlen)
894 (sc->memcopyin)(sc, &eh, IE_RBUF_ADDR(sc, head),
902 m_set_rcvif(m0, &sc->sc_ethercom.ec_if);
960 (sc->memcopyin)(sc, mtod(m, char *) + thismboff,
961 IE_RBUF_ADDR(sc, head) + thisrboff,
972 if (++head == sc->nrxbuf)
1002 struct ie_softc *sc,
1009 if (i82586_get_rbd_list(sc, &bstart, &bend, &pktlen) == 0) {
1010 if_statinc(&sc->sc_ethercom.ec_if, if_ierrors);
1014 m = ieget(sc, bstart, pktlen);
1015 i82586_release_rbd_list(sc, bstart, bend);
1018 if_statinc(&sc->sc_ethercom.ec_if, if_ierrors);
1023 if (sc->sc_debug & IED_READFRAME) {
1027 device_xname(sc->sc_dev),
1037 if_percpuq_enqueue((&sc->sc_ethercom.ec_if)->if_percpuq, m);
1047 iexmit(struct ie_softc *sc)
1052 cur = sc->xctail;
1055 if (sc->sc_debug & IED_XMIT)
1056 printf("%s: xmit buffer %d\n", device_xname(sc->sc_dev), cur);
1062 sc->ie_bus_write16(sc, IE_CMD_XMIT_DESC(sc->xmit_cmds, cur),
1063 IE_XBD_ADDR(sc->xbds, cur));
1065 sc->ie_bus_write16(sc, IE_CMD_XMIT_STATUS(sc->xmit_cmds, cur), 0);
1067 if (sc->do_xmitnopchain) {
1071 sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
1072 IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
1073 sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
1079 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, cur), 0);
1080 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, cur),
1081 IE_CMD_NOP_ADDR(sc->nop_cmds, cur));
1087 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, prev),
1089 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, prev),
1090 IE_CMD_XMIT_ADDR(sc->xmit_cmds, cur));
1092 off = IE_SCB_STATUS(sc->scb);
1093 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
1094 if ((sc->ie_bus_read16(sc, off) & IE_CUS_ACTIVE) == 0) {
1096 i82586_start_transceiver(sc);
1099 sc->ie_bus_write16(sc, IE_CMD_XMIT_LINK(sc->xmit_cmds, cur),
1102 sc->ie_bus_write16(sc, IE_CMD_XMIT_CMD(sc->xmit_cmds, cur),
1105 off = IE_SCB_CMDLST(sc->scb);
1106 sc->ie_bus_write16(sc, off, IE_CMD_XMIT_ADDR(sc->xmit_cmds,
1108 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
1110 if (i82586_start_cmd(sc, IE_CUC_START, 0, 0, 1))
1111 aprint_error_dev(sc->sc_dev,
1115 sc->sc_ethercom.ec_if.if_timer = 5;
1125 struct ie_softc *sc = ifp->if_softc;
1134 while (sc->xmit_busy < NTXBUF) {
1135 head = sc->xchead;
1136 xbase = sc->xbds;
1150 if (sc->sc_debug & IED_ENQ)
1151 printf("%s: fill buffer %d\n", device_xname(sc->sc_dev),
1152 sc->xchead);
1156 printf("%s: tbuf overflow\n", device_xname(sc->sc_dev));
1158 buffer = IE_XBUF_ADDR(sc, head);
1160 (sc->memcopyout)(sc, mtod(m,void *), buffer, m->m_len);
1165 (sc->memcopyout)(sc, padbuf, buffer,
1176 sc->ie_bus_write16(sc, IE_XBD_FLAGS(xbase, head),
1178 sc->ie_bus_write16(sc, IE_XBD_NEXT(xbase, head), 0xffff);
1179 sc->ie_bus_write24(sc, IE_XBD_BUF(xbase, head),
1180 IE_XBUF_ADDR(sc, head));
1184 sc->xchead = head;
1188 if (sc->xmit_busy == 0)
1189 iexmit(sc);
1191 sc->xmit_busy++;
1201 i82586_proberam(struct ie_softc *sc)
1206 off = IE_SCP_BUS_USE(sc->scp);
1207 sc->ie_bus_write16(sc, off, IE_SYSBUS_16BIT);
1208 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
1211 off = IE_ISCP_BUSY(sc->iscp);
1212 sc->ie_bus_write16(sc, off, 1);
1213 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_WRITE);
1215 if (sc->hwreset)
1216 (sc->hwreset)(sc, CHIP_PROBE);
1218 (sc->chan_attn) (sc, CHIP_PROBE);
1223 off = IE_ISCP_BUSY(sc->iscp);
1224 IE_BUS_BARRIER(sc, off, 2, BUS_SPACE_BARRIER_READ);
1225 result = sc->ie_bus_read16(sc, off) == 0;
1228 ie_ack(sc, IE_ST_WHENCE);
1234 i82586_reset(struct ie_softc *sc, int hard)
1239 printf("%s: reset\n", device_xname(sc->sc_dev));
1241 sc->sc_ethercom.ec_if.if_timer = 0;
1246 if (i82586_start_cmd(sc, IE_RUC_ABORT | IE_CUC_ABORT, 0, 0, 0))
1247 aprint_error_dev(sc->sc_dev, "abort commands timed out\n");
1254 if (hard && sc->hwreset)
1255 (sc->hwreset)(sc, CARD_RESET);
1258 ie_ack(sc, IE_ST_WHENCE);
1260 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) != 0) {
1263 if (i82586_init(&sc->sc_ethercom.ec_if) == 0)
1272 setup_simple_command(struct ie_softc *sc, int cmd, int cmdbuf)
1275 sc->ie_bus_write16(sc, IE_CMD_COMMON_STATUS(cmdbuf), 0);
1276 sc->ie_bus_write16(sc, IE_CMD_COMMON_CMD(cmdbuf), cmd | IE_CMD_LAST);
1277 sc->ie_bus_write16(sc, IE_CMD_COMMON_LINK(cmdbuf), 0xffff);
1280 sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb), cmdbuf);
1287 ie_run_tdr(struct ie_softc *sc, int cmd)
1291 setup_simple_command(sc, IE_CMD_TDR, cmd);
1292 sc->ie_bus_write16(sc, IE_CMD_TDR_TIME(cmd), 0);
1294 if (i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0) ||
1295 (sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd)) & IE_STAT_OK) == 0)
1298 result = sc->ie_bus_read16(sc, IE_CMD_TDR_TIME(cmd));
1301 ie_ack(sc, IE_ST_WHENCE);
1307 aprint_error_dev(sc->sc_dev, "TDR command failed\n");
1309 aprint_error_dev(sc->sc_dev, "transceiver problem\n");
1311 aprint_error_dev(sc->sc_dev, "TDR detected incorrect "
1314 aprint_error_dev(sc->sc_dev, "TDR detected a short circuit "
1317 aprint_error_dev(sc->sc_dev,
1325 * We have a block of KVA at sc->buf_area which is of size sc->buf_area_sz.
1334 i82586_setup_bufs(struct ie_softc *sc)
1336 int ptr = sc->buf_area; /* memory pool */
1351 sc->nop_cmds = ptr;
1355 sc->xmit_cmds = ptr;
1359 sc->xbds = ptr;
1363 sc->xbufs = ptr;
1369 n = sc->buf_area_sz - (ptr - sc->buf_area);
1374 sc->nframes = n / r;
1376 if (sc->nframes <= 0)
1379 sc->nrxbuf = sc->nframes * B_PER_F;
1382 sc->rframes = ptr;
1383 ptr += sc->nframes * IE_RFRAME_SZ;
1386 sc->rbds = ptr;
1387 ptr += sc->nrxbuf * IE_RBD_SZ;
1390 sc->rbufs = ptr;
1391 ptr += sc->nrxbuf * IE_RBUF_SIZE;
1394 printf("%s: %d frames %d bufs\n", device_xname(sc->sc_dev),
1395 sc->nframes, sc->nrxbuf);
1401 for (n = 0; n < sc->nframes; n++) {
1402 int m = (n == sc->nframes - 1) ? 0 : n + 1;
1405 sc->ie_bus_write16(sc, IE_RFRAME_STATUS(sc->rframes, n), 0);
1408 sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, n),
1412 sc->ie_bus_write16(sc, IE_RFRAME_NEXT(sc->rframes, n),
1413 IE_RFRAME_ADDR(sc->rframes, m));
1416 sc->ie_bus_write16(sc, IE_RFRAME_LAST(sc->rframes, n),
1423 for (n = 0; n < sc->nrxbuf; n++) {
1424 int m = (n == sc->nrxbuf - 1) ? 0 : n + 1;
1427 sc->ie_bus_write16(sc, IE_RBD_STATUS(sc->rbds, n), 0);
1430 sc->ie_bus_write16(sc, IE_RBD_NEXT(sc->rbds, n),
1431 IE_RBD_ADDR(sc->rbds, m));
1434 sc->ie_bus_write24(sc, IE_RBD_BUFADDR(sc->rbds, n),
1435 IE_RBUF_ADDR(sc, n));
1436 sc->ie_bus_write16(sc, IE_RBD_BUFLEN(sc->rbds, n),
1444 sc->ie_bus_write16(sc, IE_CMD_NOP_STATUS(sc->nop_cmds, n), 0);
1446 sc->ie_bus_write16(sc, IE_CMD_NOP_CMD(sc->nop_cmds, n),
1449 sc->ie_bus_write16(sc, IE_CMD_NOP_LINK(sc->nop_cmds, n),
1450 IE_CMD_NOP_ADDR(sc->nop_cmds, n));
1460 sc->xchead = sc->xctail = 0;
1463 sc->xmit_busy = 0;
1469 sc->rfhead = 0;
1470 sc->rftail = sc->nframes - 1;
1476 sc->rbhead = 0;
1477 sc->rbtail = sc->nrxbuf - 1;
1482 device_xname(sc->sc_dev), ptr - sc->buf_area);
1487 ie_cfg_setup(struct ie_softc *sc, int cmd, int promiscuous, int manchester)
1504 sc->memcopyout(sc, buf, cmd, IE_CMD_CFG_SZ);
1505 setup_simple_command(sc, IE_CMD_CONFIG, cmd);
1506 IE_BUS_BARRIER(sc, cmd, IE_CMD_CFG_SZ, BUS_SPACE_BARRIER_WRITE);
1508 cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmd, IE_STAT_COMPL, 0);
1509 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmd));
1511 aprint_error_dev(sc->sc_dev,
1516 aprint_error_dev(sc->sc_dev,
1522 ie_ack(sc, IE_ST_WHENCE);
1527 ie_ia_setup(struct ie_softc *sc, int cmdbuf)
1530 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1532 setup_simple_command(sc, IE_CMD_IASETUP, cmdbuf);
1534 (sc->memcopyout)(sc, CLLADDR(ifp->if_sadl),
1537 cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL, 0);
1538 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
1540 aprint_error_dev(sc->sc_dev,
1546 aprint_error_dev(sc->sc_dev,
1552 ie_ack(sc, IE_ST_WHENCE);
1561 ie_mc_setup(struct ie_softc *sc, int cmdbuf)
1565 if (sc->mcast_count == 0)
1568 setup_simple_command(sc, IE_CMD_MCAST, cmdbuf);
1570 (sc->memcopyout)(sc, (void *)sc->mcast_addrs,
1572 sc->mcast_count * ETHER_ADDR_LEN);
1574 sc->ie_bus_write16(sc, IE_CMD_MCAST_BYTES(cmdbuf),
1575 sc->mcast_count * ETHER_ADDR_LEN);
1578 cmdresult = i82586_start_cmd(sc, IE_CUC_START, cmdbuf, IE_STAT_COMPL,
1580 status = sc->ie_bus_read16(sc, IE_CMD_COMMON_STATUS(cmdbuf));
1582 aprint_error_dev(sc->sc_dev,
1587 aprint_error_dev(sc->sc_dev,
1593 ie_ack(sc, IE_ST_WHENCE);
1608 struct ie_softc *sc = ifp->if_softc;
1611 sc->async_cmd_inprogress = 0;
1613 cmd = sc->buf_area;
1618 if (ie_cfg_setup(sc, cmd, sc->promisc, 0) == 0)
1624 if (ie_ia_setup(sc, cmd) == 0)
1630 ie_run_tdr(sc, cmd);
1635 if (ie_mc_setup(sc, cmd) == 0)
1641 ie_ack(sc, IE_ST_WHENCE);
1646 i82586_setup_bufs(sc);
1648 if (sc->hwinit)
1649 (sc->hwinit)(sc);
1654 sc->do_xmitnopchain = 0;
1656 i82586_start_transceiver(sc);
1664 i82586_start_transceiver(struct ie_softc *sc)
1670 sc->ie_bus_write16(sc, IE_RFRAME_BUFDESC(sc->rframes, sc->rfhead),
1671 IE_RBD_ADDR(sc->rbds, sc->rbhead));
1673 sc->ie_bus_write16(sc, IE_SCB_RCVLST(sc->scb),
1674 IE_RFRAME_ADDR(sc->rframes, sc->rfhead));
1676 if (sc->do_xmitnopchain) {
1678 if (i82586_start_cmd(sc, IE_CUC_SUSPEND | IE_RUC_SUSPEND,
1680 aprint_error_dev(sc->sc_dev,
1684 /* sc->scb->ie_command_list =
1685 IEADDR(sc->nop_cmds[(sc->xctail+NTXBUF-1) % NTXBUF]);*/
1686 sc->ie_bus_write16(sc, IE_SCB_CMDLST(sc->scb),
1688 sc->nop_cmds,
1689 (sc->xctail + NTXBUF - 1) % NTXBUF));
1691 if (i82586_start_cmd(sc, IE_CUC_START | IE_RUC_START, 0, 0, 0))
1692 aprint_error_dev(sc->sc_dev,
1695 if (i82586_start_cmd(sc, IE_RUC_START, 0, 0, 0))
1696 aprint_error_dev(sc->sc_dev, "RU command timed out\n");
1703 struct ie_softc *sc = ifp->if_softc;
1705 if (i82586_start_cmd(sc, IE_RUC_SUSPEND | IE_CUC_SUSPEND, 0, 0, 0))
1706 aprint_error_dev(sc->sc_dev,
1713 struct ie_softc *sc = ifp->if_softc;
1726 ie_mc_reset(sc);
1733 sc->sc_debug = (ifp->if_flags & IFF_DEBUG) ? IED_ALL : 0;
1740 ie_mc_reset(struct ie_softc *sc)
1742 struct ethercom *ec = &sc->sc_ethercom;
1752 sc->mcast_count = 0;
1757 if (sc->mcast_count >= IE_MAXMCAST ||
1768 if (size > sc->mcast_addrs_size) {
1770 if (sc->mcast_addrs_size)
1771 free(sc->mcast_addrs, M_IFMADDR);
1772 sc->mcast_addrs = (char *)
1774 sc->mcast_addrs_size = size;
1783 if (sc->mcast_count >= IE_MAXMCAST) {
1788 memcpy(&sc->mcast_addrs[sc->mcast_count], enm->enm_addrlo, 6);
1789 sc->mcast_count++;
1793 sc->want_mcsetup = 1;
1802 struct ie_softc *sc = ifp->if_softc;
1804 if (sc->sc_mediachange)
1805 return ((*sc->sc_mediachange)(sc));
1815 struct ie_softc *sc = ifp->if_softc;
1817 if (sc->sc_mediastatus)
1818 (*sc->sc_mediastatus)(sc, ifmr);
1823 print_rbd(struct ie_softc *sc, int n)
1827 "length/EOL %04x\n", IE_RBD_ADDR(sc->rbds, n),
1828 sc->ie_bus_read16(sc, IE_RBD_STATUS(sc->rbds, n)),
1829 scsc, IE_RBD_NEXT(sc->rbds, n)),
1830 (u_long)0,/*bus_space_read_4(sc->bt, sc->bh, IE_RBD_BUFADDR(sc->rbds,n)),-* XXX */
1831 sc->ie_bus_read16(sc, IE_RBD_BUFLEN(sc->rbds, n)));