Lines Matching refs:sc

200 #define PCN_CSR_SETBIT(sc, reg, x)			\
201 pcn_csr_write(sc, reg, pcn_csr_read(sc, reg) | (x))
203 #define PCN_CSR_CLRBIT(sc, reg, x) \
204 pcn_csr_write(sc, reg, pcn_csr_read(sc, reg) & ~(x))
206 #define PCN_BCR_SETBIT(sc, reg, x) \
207 pcn_bcr_write(sc, reg, pcn_bcr_read(sc, reg) | (x))
209 #define PCN_BCR_CLRBIT(sc, reg, x) \
210 pcn_bcr_write(sc, reg, pcn_bcr_read(sc, reg) & ~(x))
213 pcn_csr_read(sc, reg)
214 struct pcn_softc *sc;
217 CSR_WRITE_4(sc, PCN_IO32_RAP, reg);
218 return(CSR_READ_4(sc, PCN_IO32_RDP));
222 pcn_csr_read16(sc, reg)
223 struct pcn_softc *sc;
226 CSR_WRITE_2(sc, PCN_IO16_RAP, reg);
227 return(CSR_READ_2(sc, PCN_IO16_RDP));
231 pcn_csr_write(sc, reg, val)
232 struct pcn_softc *sc;
236 CSR_WRITE_4(sc, PCN_IO32_RAP, reg);
237 CSR_WRITE_4(sc, PCN_IO32_RDP, val);
242 pcn_bcr_read(sc, reg)
243 struct pcn_softc *sc;
246 CSR_WRITE_4(sc, PCN_IO32_RAP, reg);
247 return(CSR_READ_4(sc, PCN_IO32_BDP));
251 pcn_bcr_read16(sc, reg)
252 struct pcn_softc *sc;
255 CSR_WRITE_2(sc, PCN_IO16_RAP, reg);
256 return(CSR_READ_2(sc, PCN_IO16_BDP));
260 pcn_bcr_write(sc, reg, val)
261 struct pcn_softc *sc;
265 CSR_WRITE_4(sc, PCN_IO32_RAP, reg);
266 CSR_WRITE_4(sc, PCN_IO32_BDP, val);
275 struct pcn_softc *sc;
278 sc = device_get_softc(dev);
297 if (((sc->pcn_type == Am79C971 && phy != PCN_PHYAD_10BT) ||
298 sc->pcn_type == Am79C973 || sc->pcn_type == Am79C975 ||
299 sc->pcn_type == Am79C978) && sc->pcn_extphyaddr != -1 &&
300 phy != sc->pcn_extphyaddr)
303 pcn_bcr_write(sc, PCN_BCR_MIIADDR, reg | (phy << 5));
304 val = pcn_bcr_read(sc, PCN_BCR_MIIDATA) & 0xFFFF;
308 if (((sc->pcn_type == Am79C971 && phy != PCN_PHYAD_10BT) ||
309 sc->pcn_type == Am79C973 || sc->pcn_type == Am79C975 ||
310 sc->pcn_type == Am79C978) && sc->pcn_extphyaddr == -1)
311 sc->pcn_extphyaddr = phy;
321 struct pcn_softc *sc;
323 sc = device_get_softc(dev);
325 pcn_bcr_write(sc, PCN_BCR_MIIADDR, reg | (phy << 5));
326 pcn_bcr_write(sc, PCN_BCR_MIIDATA, data);
335 struct pcn_softc *sc;
338 sc = device_get_softc(dev);
339 mii = device_get_softc(sc->pcn_miibus);
342 PCN_BCR_SETBIT(sc, PCN_BCR_DUPLEX, PCN_DUPLEX_FDEN);
344 PCN_BCR_CLRBIT(sc, PCN_BCR_DUPLEX, PCN_DUPLEX_FDEN);
351 pcn_setmulti(sc)
352 struct pcn_softc *sc;
359 ifp = sc->pcn_ifp;
361 PCN_CSR_SETBIT(sc, PCN_CSR_EXTCTL1, PCN_EXTCTL1_SPND);
365 pcn_csr_write(sc, PCN_CSR_MAR0 + i, 0xFFFF);
366 PCN_CSR_CLRBIT(sc, PCN_CSR_EXTCTL1, PCN_EXTCTL1_SPND);
372 pcn_csr_write(sc, PCN_CSR_MAR0 + i, 0);
386 pcn_csr_write(sc, PCN_CSR_MAR0 + i, hashes[i]);
388 PCN_CSR_CLRBIT(sc, PCN_CSR_EXTCTL1, PCN_EXTCTL1_SPND);
394 pcn_reset(sc)
395 struct pcn_softc *sc;
404 CSR_READ_2(sc, PCN_IO16_RESET);
405 CSR_READ_4(sc, PCN_IO32_RESET);
411 CSR_WRITE_4(sc, PCN_IO32_RDP, 0);
414 pcn_bcr_write(sc, PCN_BCR_SSTYLE, PCN_SWSTYLE_PCNETPCI_BURST);
436 struct pcn_softc *sc;
439 sc = device_get_softc(dev);
459 chip_id = pcn_bcr_read16(sc, PCN_BCR_PCISUBSYSID);
461 chip_id |= pcn_bcr_read16(sc, PCN_BCR_PCISUBVENID);
473 chip_id = pcn_csr_read16(sc, PCN_CSR_CHIPID1);
475 chip_id |= pcn_csr_read16(sc, PCN_CSR_CHIPID0);
478 chip_id = pcn_csr_read(sc, PCN_CSR_CHIPID1);
480 chip_id |= pcn_csr_read(sc, PCN_CSR_CHIPID0);
509 struct pcn_softc *sc;
516 sc = device_get_softc(dev);
522 sc->pcn_res = bus_alloc_resource_any(dev, PCN_RES, &rid, RF_ACTIVE);
523 if (sc->pcn_res == NULL) {
527 sc->pcn_btag = rman_get_bustag(sc->pcn_res);
528 sc->pcn_bhandle = rman_get_bushandle(sc->pcn_res);
532 bus_release_resource(dev, PCN_RES, PCN_RID, sc->pcn_res);
558 struct pcn_softc *sc;
564 sc = device_get_softc(dev);
567 mtx_init(&sc->pcn_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
575 sc->pcn_type = (pcn_chip_id(dev) >> 12) & PART_MASK;
577 sc->pcn_type, pcn_chipid_name(sc->pcn_type));
580 sc->pcn_res = bus_alloc_resource_any(dev, PCN_RES, &rid, RF_ACTIVE);
582 if (sc->pcn_res == NULL) {
588 sc->pcn_btag = rman_get_bustag(sc->pcn_res);
589 sc->pcn_bhandle = rman_get_bushandle(sc->pcn_res);
593 sc->pcn_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
596 if (sc->pcn_irq == NULL) {
603 pcn_reset(sc);
608 eaddr[0] = CSR_READ_4(sc, PCN_IO32_APROM00);
609 eaddr[1] = CSR_READ_4(sc, PCN_IO32_APROM01);
611 callout_init_mtx(&sc->pcn_stat_callout, &sc->pcn_mtx, 0);
613 sc->pcn_ldata = contigmalloc(sizeof(struct pcn_list_data), M_DEVBUF,
616 if (sc->pcn_ldata == NULL) {
621 bzero(sc->pcn_ldata, sizeof(struct pcn_list_data));
623 ifp = sc->pcn_ifp = if_alloc(IFT_ETHER);
629 ifp->if_softc = sc;
642 sc->pcn_extphyaddr = -1;
643 error = mii_attach(dev, &sc->pcn_miibus, ifp, pcn_ifmedia_upd,
654 sc->pcn_inst_10bt = -1;
655 mii = device_get_softc(sc->pcn_miibus);
659 sc->pcn_inst_10bt = miisc->mii_inst;
674 error = bus_setup_intr(dev, sc->pcn_irq, INTR_TYPE_NET | INTR_MPSAFE,
675 NULL, pcn_intr, sc, &sc->pcn_intrhand);
701 struct pcn_softc *sc;
704 sc = device_get_softc(dev);
705 ifp = sc->pcn_ifp;
707 KASSERT(mtx_initialized(&sc->pcn_mtx), ("pcn mutex not initialized"));
711 PCN_LOCK(sc);
712 pcn_reset(sc);
713 pcn_stop(sc);
714 PCN_UNLOCK(sc);
715 callout_drain(&sc->pcn_stat_callout);
718 if (sc->pcn_miibus)
719 device_delete_child(dev, sc->pcn_miibus);
722 if (sc->pcn_intrhand)
723 bus_teardown_intr(dev, sc->pcn_irq, sc->pcn_intrhand);
724 if (sc->pcn_irq)
725 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->pcn_irq);
726 if (sc->pcn_res)
727 bus_release_resource(dev, PCN_RES, PCN_RID, sc->pcn_res);
732 if (sc->pcn_ldata) {
733 contigfree(sc->pcn_ldata, sizeof(struct pcn_list_data),
737 mtx_destroy(&sc->pcn_mtx);
746 pcn_list_tx_init(sc)
747 struct pcn_softc *sc;
753 cd = &sc->pcn_cdata;
754 ld = sc->pcn_ldata;
773 pcn_list_rx_init(sc)
774 struct pcn_softc *sc;
779 cd = &sc->pcn_cdata;
782 if (pcn_newbuf(sc, i, NULL) == ENOBUFS)
795 pcn_newbuf(sc, idx, m)
796 struct pcn_softc *sc;
803 c = &sc->pcn_ldata->pcn_rx_list[idx];
823 sc->pcn_cdata.pcn_rx_chain[idx] = m_new;
837 pcn_rxeof(sc)
838 struct pcn_softc *sc;
845 PCN_LOCK_ASSERT(sc);
847 ifp = sc->pcn_ifp;
848 i = sc->pcn_cdata.pcn_rx_prod;
850 while(PCN_OWN_RXDESC(&sc->pcn_ldata->pcn_rx_list[i])) {
851 cur_rx = &sc->pcn_ldata->pcn_rx_list[i];
852 m = sc->pcn_cdata.pcn_rx_chain[i];
853 sc->pcn_cdata.pcn_rx_chain[i] = NULL;
863 pcn_newbuf(sc, i, m);
868 if (pcn_newbuf(sc, i, NULL)) {
870 pcn_newbuf(sc, i, m);
884 PCN_UNLOCK(sc);
886 PCN_LOCK(sc);
889 sc->pcn_cdata.pcn_rx_prod = i;
900 pcn_txeof(sc)
901 struct pcn_softc *sc;
907 ifp = sc->pcn_ifp;
913 idx = sc->pcn_cdata.pcn_tx_cons;
914 while (idx != sc->pcn_cdata.pcn_tx_prod) {
915 cur_tx = &sc->pcn_ldata->pcn_tx_list[idx];
921 sc->pcn_cdata.pcn_tx_cnt--;
938 if (sc->pcn_cdata.pcn_tx_chain[idx] != NULL) {
939 m_freem(sc->pcn_cdata.pcn_tx_chain[idx]);
940 sc->pcn_cdata.pcn_tx_chain[idx] = NULL;
943 sc->pcn_cdata.pcn_tx_cnt--;
947 if (idx != sc->pcn_cdata.pcn_tx_cons) {
949 sc->pcn_cdata.pcn_tx_cons = idx;
952 sc->pcn_timer = (sc->pcn_cdata.pcn_tx_cnt == 0) ? 0 : 5;
961 struct pcn_softc *sc;
965 sc = xsc;
966 ifp = sc->pcn_ifp;
967 PCN_LOCK_ASSERT(sc);
969 mii = device_get_softc(sc->pcn_miibus);
973 if (sc->pcn_link && !(mii->mii_media_status & IFM_ACTIVE))
974 sc->pcn_link = 0;
977 if (!sc->pcn_link && mii->mii_media_status & IFM_ACTIVE &&
979 sc->pcn_link++;
984 if (sc->pcn_timer > 0 && --sc->pcn_timer == 0)
985 pcn_watchdog(sc);
986 callout_reset(&sc->pcn_stat_callout, hz, pcn_tick, sc);
995 struct pcn_softc *sc;
999 sc = arg;
1000 ifp = sc->pcn_ifp;
1002 PCN_LOCK(sc);
1006 pcn_stop(sc);
1007 PCN_UNLOCK(sc);
1011 CSR_WRITE_4(sc, PCN_IO32_RAP, PCN_CSR_CSR);
1013 while ((status = CSR_READ_4(sc, PCN_IO32_RDP)) & PCN_CSR_INTR) {
1014 CSR_WRITE_4(sc, PCN_IO32_RDP, status);
1017 pcn_rxeof(sc);
1020 pcn_txeof(sc);
1023 pcn_init_locked(sc);
1031 PCN_UNLOCK(sc);
1040 pcn_encap(sc, m_head, txidx)
1041 struct pcn_softc *sc;
1061 if ((PCN_TX_LIST_CNT - (sc->pcn_cdata.pcn_tx_cnt + cnt)) < 2)
1063 f = &sc->pcn_ldata->pcn_tx_list[frag];
1079 sc->pcn_cdata.pcn_tx_chain[cur] = m_head;
1080 sc->pcn_ldata->pcn_tx_list[cur].pcn_txctl |=
1082 sc->pcn_ldata->pcn_tx_list[*txidx].pcn_txctl |= PCN_TXCTL_OWN;
1083 sc->pcn_cdata.pcn_tx_cnt += cnt;
1099 struct pcn_softc *sc;
1101 sc = ifp->if_softc;
1102 PCN_LOCK(sc);
1104 PCN_UNLOCK(sc);
1111 struct pcn_softc *sc;
1115 sc = ifp->if_softc;
1117 PCN_LOCK_ASSERT(sc);
1119 if (!sc->pcn_link)
1122 idx = sc->pcn_cdata.pcn_tx_prod;
1127 while(sc->pcn_cdata.pcn_tx_chain[idx] == NULL) {
1132 if (pcn_encap(sc, m_head, &idx)) {
1147 sc->pcn_cdata.pcn_tx_prod = idx;
1148 pcn_csr_write(sc, PCN_CSR_CSR, PCN_CSR_TX|PCN_CSR_INTEN);
1153 sc->pcn_timer = 5;
1162 struct pcn_softc *sc;
1164 sc = ifp->if_softc;
1168 PCN_CSR_SETBIT(sc, PCN_CSR_MODE, PCN_MODE_PROMISC);
1170 PCN_CSR_CLRBIT(sc, PCN_CSR_MODE, PCN_MODE_PROMISC);
1175 PCN_CSR_CLRBIT(sc, PCN_CSR_MODE, PCN_MODE_RXNOBROAD);
1177 PCN_CSR_SETBIT(sc, PCN_CSR_MODE, PCN_MODE_RXNOBROAD);
1187 struct pcn_softc *sc = xsc;
1189 PCN_LOCK(sc);
1190 pcn_init_locked(sc);
1191 PCN_UNLOCK(sc);
1195 pcn_init_locked(sc)
1196 struct pcn_softc *sc;
1198 struct ifnet *ifp = sc->pcn_ifp;
1202 PCN_LOCK_ASSERT(sc);
1207 pcn_stop(sc);
1208 pcn_reset(sc);
1210 mii = device_get_softc(sc->pcn_miibus);
1214 pcn_csr_write(sc, PCN_CSR_PAR0,
1215 ((u_int16_t *)IF_LLADDR(sc->pcn_ifp))[0]);
1216 pcn_csr_write(sc, PCN_CSR_PAR1,
1217 ((u_int16_t *)IF_LLADDR(sc->pcn_ifp))[1]);
1218 pcn_csr_write(sc, PCN_CSR_PAR2,
1219 ((u_int16_t *)IF_LLADDR(sc->pcn_ifp))[2]);
1222 if (pcn_list_rx_init(sc) == ENOBUFS) {
1225 pcn_stop(sc);
1232 pcn_list_tx_init(sc);
1235 PCN_BCR_CLRBIT(sc, PCN_BCR_MISCCFG, PCN_MISC_ASEL);
1242 if (sc->pcn_type != Am79C978 &&
1243 IFM_INST(ife->ifm_media) == sc->pcn_inst_10bt)
1244 pcn_csr_write(sc, PCN_CSR_MODE, PCN_PORT_10BASET);
1246 pcn_csr_write(sc, PCN_CSR_MODE, PCN_PORT_MII);
1254 pcn_setmulti(sc);
1259 pcn_csr_write(sc, PCN_CSR_RXADDR0,
1260 vtophys(&sc->pcn_ldata->pcn_rx_list[0]) & 0xFFFF);
1261 pcn_csr_write(sc, PCN_CSR_RXADDR1,
1262 (vtophys(&sc->pcn_ldata->pcn_rx_list[0]) >> 16) & 0xFFFF);
1263 pcn_csr_write(sc, PCN_CSR_TXADDR0,
1264 vtophys(&sc->pcn_ldata->pcn_tx_list[0]) & 0xFFFF);
1265 pcn_csr_write(sc, PCN_CSR_TXADDR1,
1266 (vtophys(&sc->pcn_ldata->pcn_tx_list[0]) >> 16) & 0xFFFF);
1269 pcn_csr_write(sc, PCN_CSR_RXRINGLEN, (~PCN_RX_LIST_CNT) + 1);
1270 pcn_csr_write(sc, PCN_CSR_TXRINGLEN, (~PCN_TX_LIST_CNT) + 1);
1273 pcn_csr_write(sc, PCN_CSR_IAB1, 0);
1276 PCN_CSR_SETBIT(sc, PCN_CSR_EXTCTL2, PCN_EXTCTL2_FASTSPNDE);
1283 PCN_BCR_SETBIT(sc, PCN_BCR_BUSCTL, PCN_BUSCTL_NOUFLOW|
1287 PCN_CSR_SETBIT(sc, PCN_CSR_IMR, PCN_IMR_DXSUFLO);
1290 PCN_CSR_SETBIT(sc, PCN_CSR_TFEAT, PCN_TFEAT_PAD_TX);
1293 PCN_BCR_SETBIT(sc, PCN_BCR_MIICTL, PCN_MIICTL_DANAS);
1295 if (sc->pcn_type == Am79C978)
1297 pcn_bcr_write(sc, PCN_BCR_PHYSEL,
1301 pcn_csr_write(sc, PCN_CSR_CSR, PCN_CSR_INTEN|PCN_CSR_START);
1308 callout_reset(&sc->pcn_stat_callout, hz, pcn_tick, sc);
1320 struct pcn_softc *sc;
1322 sc = ifp->if_softc;
1324 PCN_LOCK(sc);
1334 sc->pcn_link = 0;
1335 pcn_stop(sc);
1336 pcn_reset(sc);
1337 pcn_init_locked(sc);
1341 PCN_UNLOCK(sc);
1354 struct pcn_softc *sc;
1357 sc = ifp->if_softc;
1359 mii = device_get_softc(sc->pcn_miibus);
1360 PCN_LOCK(sc);
1364 PCN_UNLOCK(sc);
1375 struct pcn_softc *sc = ifp->if_softc;
1382 PCN_LOCK(sc);
1386 !(sc->pcn_if_flags & IFF_PROMISC)) {
1387 PCN_CSR_SETBIT(sc, PCN_CSR_EXTCTL1,
1390 PCN_CSR_CLRBIT(sc, PCN_CSR_EXTCTL1,
1392 pcn_csr_write(sc, PCN_CSR_CSR,
1396 sc->pcn_if_flags & IFF_PROMISC) {
1397 PCN_CSR_SETBIT(sc, PCN_CSR_EXTCTL1,
1400 PCN_CSR_CLRBIT(sc, PCN_CSR_EXTCTL1,
1402 pcn_csr_write(sc, PCN_CSR_CSR,
1405 pcn_init_locked(sc);
1408 pcn_stop(sc);
1410 sc->pcn_if_flags = ifp->if_flags;
1411 PCN_UNLOCK(sc);
1416 PCN_LOCK(sc);
1417 pcn_setmulti(sc);
1418 PCN_UNLOCK(sc);
1423 mii = device_get_softc(sc->pcn_miibus);
1435 pcn_watchdog(struct pcn_softc *sc)
1439 PCN_LOCK_ASSERT(sc);
1440 ifp = sc->pcn_ifp;
1445 pcn_stop(sc);
1446 pcn_reset(sc);
1447 pcn_init_locked(sc);
1458 pcn_stop(struct pcn_softc *sc)
1463 PCN_LOCK_ASSERT(sc);
1464 ifp = sc->pcn_ifp;
1465 sc->pcn_timer = 0;
1467 callout_stop(&sc->pcn_stat_callout);
1470 PCN_CSR_CLRBIT(sc, PCN_CSR_CSR, PCN_CSR_INTEN);
1472 PCN_CSR_SETBIT(sc, PCN_CSR_CSR, PCN_CSR_STOP);
1473 sc->pcn_link = 0;
1479 if (sc->pcn_cdata.pcn_rx_chain[i] != NULL) {
1480 m_freem(sc->pcn_cdata.pcn_rx_chain[i]);
1481 sc->pcn_cdata.pcn_rx_chain[i] = NULL;
1484 bzero((char *)&sc->pcn_ldata->pcn_rx_list,
1485 sizeof(sc->pcn_ldata->pcn_rx_list));
1491 if (sc->pcn_cdata.pcn_tx_chain[i] != NULL) {
1492 m_freem(sc->pcn_cdata.pcn_tx_chain[i]);
1493 sc->pcn_cdata.pcn_tx_chain[i] = NULL;
1497 bzero((char *)&sc->pcn_ldata->pcn_tx_list,
1498 sizeof(sc->pcn_ldata->pcn_tx_list));
1512 struct pcn_softc *sc;
1514 sc = device_get_softc(dev);
1516 PCN_LOCK(sc);
1517 pcn_reset(sc);
1518 pcn_stop(sc);
1519 PCN_UNLOCK(sc);