|
Lines 991-1023
Link Here
|
| 991 |
*/ |
991 |
*/ |
| 992 |
if (rxstat & VR_RXSTAT_RXERR) { |
992 |
if (rxstat & VR_RXSTAT_RXERR) { |
| 993 |
ifp->if_ierrors++; |
993 |
ifp->if_ierrors++; |
| 994 |
printf("vr%d: rx error: ", sc->vr_unit); |
994 |
printf("vr%d: rx error (%02x):", |
| 995 |
switch(rxstat & 0x000000FF) { |
995 |
sc->vr_unit, rxstat & 0x000000ff); |
| 996 |
case VR_RXSTAT_CRCERR: |
996 |
if (rxstat & VR_RXSTAT_CRCERR) |
| 997 |
printf("crc error\n"); |
997 |
printf(" crc error"); |
| 998 |
break; |
998 |
if (rxstat & VR_RXSTAT_FRAMEALIGNERR) |
| 999 |
case VR_RXSTAT_FRAMEALIGNERR: |
999 |
printf(" frame alignment error\n"); |
| 1000 |
printf("frame alignment error\n"); |
1000 |
if (rxstat & VR_RXSTAT_FIFOOFLOW) |
| 1001 |
break; |
1001 |
printf(" FIFO overflow"); |
| 1002 |
case VR_RXSTAT_FIFOOFLOW: |
1002 |
if (rxstat & VR_RXSTAT_GIANT) |
| 1003 |
printf("FIFO overflow\n"); |
1003 |
printf(" received giant packet"); |
| 1004 |
break; |
1004 |
if (rxstat & VR_RXSTAT_RUNT) |
| 1005 |
case VR_RXSTAT_GIANT: |
1005 |
printf(" received runt packet"); |
| 1006 |
printf("received giant packet\n"); |
1006 |
if (rxstat & VR_RXSTAT_BUSERR) |
| 1007 |
break; |
1007 |
printf(" system bus error"); |
| 1008 |
case VR_RXSTAT_RUNT: |
1008 |
if (rxstat & VR_RXSTAT_BUFFERR) |
| 1009 |
printf("received runt packet\n"); |
1009 |
printf("rx buffer error"); |
| 1010 |
break; |
1010 |
printf("\n"); |
| 1011 |
case VR_RXSTAT_BUSERR: |
|
|
| 1012 |
printf("system bus error\n"); |
| 1013 |
break; |
| 1014 |
case VR_RXSTAT_BUFFERR: |
| 1015 |
printf("rx buffer error\n"); |
| 1016 |
break; |
| 1017 |
default: |
| 1018 |
printf("unknown rx error\n"); |
| 1019 |
break; |
| 1020 |
} |
| 1021 |
vr_newbuf(sc, cur_rx, m); |
1011 |
vr_newbuf(sc, cur_rx, m); |
| 1022 |
continue; |
1012 |
continue; |
| 1023 |
} |
1013 |
} |
|
Lines 1058-1066
Link Here
|
| 1058 |
void vr_rxeoc(sc) |
1048 |
void vr_rxeoc(sc) |
| 1059 |
struct vr_softc *sc; |
1049 |
struct vr_softc *sc; |
| 1060 |
{ |
1050 |
{ |
|
|
1051 |
struct ifnet *ifp; |
| 1052 |
int i; |
| 1053 |
|
| 1054 |
ifp = &sc->arpcom.ac_if; |
| 1055 |
|
| 1056 |
ifp->if_ierrors++; |
| 1057 |
|
| 1058 |
VR_CLRBIT16(sc, VR_COMMAND, VR_CMD_RX_ON); |
| 1059 |
DELAY(10000); |
| 1060 |
|
| 1061 |
for (i = 0x400; |
| 1062 |
i && (CSR_READ_2(sc, VR_COMMAND) & VR_CMD_RX_ON); |
| 1063 |
i--) |
| 1064 |
; /* Wait for receiver to stop */ |
| 1065 |
|
| 1066 |
if (!i) { |
| 1067 |
printf("vr%d: rx shutdown error!\n", sc->vr_unit); |
| 1068 |
sc->vr_flags |= VR_F_RESTART; |
| 1069 |
return; |
| 1070 |
} |
| 1061 |
|
1071 |
|
| 1062 |
vr_rxeof(sc); |
1072 |
vr_rxeof(sc); |
| 1063 |
VR_CLRBIT16(sc, VR_COMMAND, VR_CMD_RX_ON); |
1073 |
|
| 1064 |
CSR_WRITE_4(sc, VR_RXADDR, vtophys(sc->vr_cdata.vr_rx_head->vr_ptr)); |
1074 |
CSR_WRITE_4(sc, VR_RXADDR, vtophys(sc->vr_cdata.vr_rx_head->vr_ptr)); |
| 1065 |
VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RX_ON); |
1075 |
VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RX_ON); |
| 1066 |
VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RX_GO); |
1076 |
VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RX_GO); |
|
Lines 1094-1107
Link Here
|
| 1094 |
*/ |
1104 |
*/ |
| 1095 |
while(sc->vr_cdata.vr_tx_head->vr_mbuf != NULL) { |
1105 |
while(sc->vr_cdata.vr_tx_head->vr_mbuf != NULL) { |
| 1096 |
u_int32_t txstat; |
1106 |
u_int32_t txstat; |
|
|
1107 |
int i; |
| 1097 |
|
1108 |
|
| 1098 |
cur_tx = sc->vr_cdata.vr_tx_head; |
1109 |
cur_tx = sc->vr_cdata.vr_tx_head; |
| 1099 |
txstat = cur_tx->vr_ptr->vr_status; |
1110 |
txstat = cur_tx->vr_ptr->vr_status; |
| 1100 |
|
1111 |
|
| 1101 |
if ((txstat & VR_TXSTAT_ABRT) || |
1112 |
if ((txstat & VR_TXSTAT_ABRT) || |
| 1102 |
(txstat & VR_TXSTAT_UDF)) { |
1113 |
(txstat & VR_TXSTAT_UDF)) { |
| 1103 |
while (CSR_READ_2(sc, VR_COMMAND) & VR_CMD_TX_ON) |
1114 |
for (i = 0x400; |
|
|
1115 |
i && (CSR_READ_2(sc, VR_COMMAND) & VR_CMD_TX_ON); |
| 1116 |
i--) |
| 1104 |
; /* Wait for chip to shutdown */ |
1117 |
; /* Wait for chip to shutdown */ |
|
|
1118 |
if (!i) { |
| 1119 |
printf("vr%d: tx shutdown timeout\n", sc->vr_unit); |
| 1120 |
sc->vr_flags |= VR_F_RESTART; |
| 1121 |
break; |
| 1122 |
} |
| 1105 |
VR_TXOWN(cur_tx) = VR_TXSTAT_OWN; |
1123 |
VR_TXOWN(cur_tx) = VR_TXSTAT_OWN; |
| 1106 |
CSR_WRITE_4(sc, VR_TXADDR, vtophys(cur_tx->vr_ptr)); |
1124 |
CSR_WRITE_4(sc, VR_TXADDR, vtophys(cur_tx->vr_ptr)); |
| 1107 |
break; |
1125 |
break; |
|
Lines 1167-1172
Link Here
|
| 1167 |
s = splimp(); |
1185 |
s = splimp(); |
| 1168 |
|
1186 |
|
| 1169 |
sc = xsc; |
1187 |
sc = xsc; |
|
|
1188 |
if (sc->vr_flags & VR_F_RESTART) { |
| 1189 |
printf("vr%d: restarting\n", sc->vr_unit); |
| 1190 |
vr_stop(sc); |
| 1191 |
vr_reset(sc); |
| 1192 |
vr_init(sc); |
| 1193 |
sc->vr_flags &= ~VR_F_RESTART; |
| 1194 |
} |
| 1195 |
|
| 1170 |
mii = device_get_softc(sc->vr_miibus); |
1196 |
mii = device_get_softc(sc->vr_miibus); |
| 1171 |
mii_tick(mii); |
1197 |
mii_tick(mii); |
| 1172 |
|
1198 |
|
|
Lines 1208-1217
Link Here
|
| 1208 |
if (status & VR_ISR_RX_OK) |
1234 |
if (status & VR_ISR_RX_OK) |
| 1209 |
vr_rxeof(sc); |
1235 |
vr_rxeof(sc); |
| 1210 |
|
1236 |
|
|
|
1237 |
if (status & VR_ISR_RX_DROPPED) { |
| 1238 |
printf("vr%d: rx packet lost\n", sc->vr_unit); |
| 1239 |
ifp->if_ierrors++; |
| 1240 |
} |
| 1241 |
|
| 1211 |
if ((status & VR_ISR_RX_ERR) || (status & VR_ISR_RX_NOBUF) || |
1242 |
if ((status & VR_ISR_RX_ERR) || (status & VR_ISR_RX_NOBUF) || |
| 1212 |
(status & VR_ISR_RX_NOBUF) || (status & VR_ISR_RX_OFLOW) || |
1243 |
(status & VR_ISR_RX_NOBUF) || (status & VR_ISR_RX_OFLOW)) { |
| 1213 |
(status & VR_ISR_RX_DROPPED)) { |
1244 |
printf("vr%d: receive error (%04x)", |
| 1214 |
vr_rxeof(sc); |
1245 |
sc->vr_unit, status); |
|
|
1246 |
if (status & VR_ISR_RX_NOBUF) |
| 1247 |
printf(" no buffers"); |
| 1248 |
if (status & VR_ISR_RX_OFLOW) |
| 1249 |
printf(" overflow"); |
| 1250 |
if (status & VR_ISR_RX_DROPPED) |
| 1251 |
printf(" packet lost"); |
| 1252 |
printf("\n"); |
| 1215 |
vr_rxeoc(sc); |
1253 |
vr_rxeoc(sc); |
| 1216 |
} |
1254 |
} |
| 1217 |
|
1255 |
|
|
Lines 1430-1442
Link Here
|
| 1430 |
* so we must set both. |
1468 |
* so we must set both. |
| 1431 |
*/ |
1469 |
*/ |
| 1432 |
VR_CLRBIT(sc, VR_BCR0, VR_BCR0_RX_THRESH); |
1470 |
VR_CLRBIT(sc, VR_BCR0, VR_BCR0_RX_THRESH); |
| 1433 |
VR_SETBIT(sc, VR_BCR0, VR_BCR0_RXTHRESHSTORENFWD); |
1471 |
VR_SETBIT(sc, VR_BCR0, VR_BCR0_RXTHRESH128BYTES); |
| 1434 |
|
1472 |
|
| 1435 |
VR_CLRBIT(sc, VR_BCR1, VR_BCR1_TX_THRESH); |
1473 |
VR_CLRBIT(sc, VR_BCR1, VR_BCR1_TX_THRESH); |
| 1436 |
VR_SETBIT(sc, VR_BCR1, VR_BCR1_TXTHRESHSTORENFWD); |
1474 |
VR_SETBIT(sc, VR_BCR1, VR_BCR1_TXTHRESHSTORENFWD); |
| 1437 |
|
1475 |
|
| 1438 |
VR_CLRBIT(sc, VR_RXCFG, VR_RXCFG_RX_THRESH); |
1476 |
VR_CLRBIT(sc, VR_RXCFG, VR_RXCFG_RX_THRESH); |
| 1439 |
VR_SETBIT(sc, VR_RXCFG, VR_RXTHRESH_STORENFWD); |
1477 |
VR_SETBIT(sc, VR_RXCFG, VR_RXTHRESH_128BYTES); |
| 1440 |
|
1478 |
|
| 1441 |
VR_CLRBIT(sc, VR_TXCFG, VR_TXCFG_TX_THRESH); |
1479 |
VR_CLRBIT(sc, VR_TXCFG, VR_TXCFG_TX_THRESH); |
| 1442 |
VR_SETBIT(sc, VR_TXCFG, VR_TXTHRESH_STORENFWD); |
1480 |
VR_SETBIT(sc, VR_TXCFG, VR_TXTHRESH_STORENFWD); |