Changeset 7dbab720 in rtems
- Timestamp:
- 01/31/99 20:46:52 (25 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- d93b23d
- Parents:
- 07d880f4
- Location:
- c/src/lib/libbsp/powerpc/dmv177/sonic
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.c
r07d880f4 r7dbab720 64 64 #define SONIC_DEBUG_DESCRIPTORS 0x0010 65 65 #define SONIC_DEBUG_ERRORS 0x0020 66 67 #define SONIC_DEBUG (SONIC_DEBUG_ERRORS) 66 #define SONIC_DEBUG_DUMP_TX_MBUFS 0x0040 67 #define SONIC_DEBUG_DUMP_RX_MBUFS 0x0080 68 69 #define SONIC_DEBUG_DUMP_MBUFS \ 70 (SONIC_DEBUG_DUMP_TX_MBUFS|SONIC_DEBUG_DUMP_RX_MBUFS) 71 72 #define SONIC_DEBUG_MEDIUM \ 73 ((SONIC_DEBUG_ALL) & ~(SONIC_DEBUG_PRINT_REGISTERS|SONIC_DEBUG_DUMP_MBUFS)) 74 /* 75 ((SONIC_DEBUG_ALL) & ~(SONIC_DEBUG_DUMP_MBUFS)) 76 */ 77 78 #define SONIC_DEBUG SONIC_DEBUG_ALL 79 80 /* ((SONIC_DEBUG_ALL) & ~SONIC_DEBUG_PRINT_REGISTERS) */ 81 /* (SONIC_DEBUG_ALL) */ 82 83 /* (SONIC_DEBUG_ALL) */ 84 /* (SONIC_DEBUG_ERRORS) */ 68 85 69 86 /* (SONIC_DEBUG_MEMORY|SONIC_DEBUG_DESCRIPTORS) */ 70 87 71 /* SONIC_DEBUG_ALL */ 72 88 #if (SONIC_DEBUG & SONIC_DEBUG_DUMP_MBUFS) 89 #include <rtems/dumpbuf.h> 90 #endif 73 91 74 92 /* … … 140 158 */ 141 159 #define RDA_COUNT 20 142 #define TDA_COUNT 10 0160 #define TDA_COUNT 10 143 161 144 162 /* … … 196 214 */ 197 215 void *sonic; 216 217 /* 218 * Tables to map the mbufs from chip to stack 219 */ 220 221 struct mbuf **rxMbuf; 222 struct mbuf **txMbuf; 198 223 199 224 /* … … 306 331 */ 307 332 p = malloc( nbytes, M_MBUF, M_NOWAIT ); 308 memset (p, '\0', nbytes);309 333 if (p == NULL) 310 334 rtems_panic ("No memory!"); 335 memset (p, '\0', nbytes); 311 336 a1 = (unsigned long)p; 312 337 a2 = a1 + nbytes - 1; … … 373 398 { 374 399 struct sonic_softc *sc = sonic_softc; 400 unsigned32 isr, imr; 375 401 void *rp; 376 402 … … 394 420 sc->Interrupts++; 395 421 422 isr = sonic_read_register( rp, SONIC_REG_ISR ); 423 imr = sonic_read_register( rp, SONIC_REG_IMR ); 424 396 425 /* 397 426 * Packet received or receive buffer area exceeded? 398 427 */ 399 if ((sonic_read_register( rp, SONIC_REG_IMR ) & (IMR_PRXEN | IMR_RBAEEN)) && 400 (sonic_read_register( rp, SONIC_REG_ISR ) & (ISR_PKTRX | ISR_RBAE))) { 401 sonic_write_register( 402 rp, 403 SONIC_REG_IMR, 404 sonic_read_register( rp, SONIC_REG_IMR) & ~(IMR_PRXEN | IMR_RBAEEN) 405 ); 428 if ((imr & (IMR_PRXEN | IMR_RBAEEN)) && 429 (isr & (ISR_PKTRX | ISR_RBAE))) { 430 imr &= ~(IMR_PRXEN | IMR_RBAEEN); 406 431 sc->rxInterrupts++; 407 432 rtems_event_send (sc->rxDaemonTid, INTERRUPT_EVENT); … … 411 436 * Packet started, transmitter done or transmitter error? 412 437 */ 413 if ((sonic_read_register( rp, SONIC_REG_IMR ) & (IMR_PINTEN | IMR_PTXEN | IMR_TXEREN)) 414 && (sonic_read_register( rp, SONIC_REG_ISR ) & (ISR_PINT | ISR_TXDN | ISR_TXER))) { 415 sonic_write_register( 416 rp, 417 SONIC_REG_IMR, 418 sonic_read_register( rp, SONIC_REG_IMR) & 419 ~(IMR_PINTEN | IMR_PTXEN | IMR_TXEREN) 420 ); 438 if ((imr & (IMR_PINTEN | IMR_PTXEN | IMR_TXEREN)) && 439 (isr & (ISR_PINT | ISR_TXDN | ISR_TXER))) { 440 imr &= ~(IMR_PINTEN | IMR_PTXEN | IMR_TXEREN); 421 441 sc->txInterrupts++; 422 442 rtems_event_send (sc->txDaemonTid, INTERRUPT_EVENT); 423 443 } 444 445 sonic_write_register( rp, SONIC_REG_IMR, imr ); 424 446 } 425 447 … … 602 624 fp->frag_size = m->m_len; 603 625 packetSize += m->m_len; 626 #if (SONIC_DEBUG & SONIC_DEBUG_FRAGMENTS) 627 printf( "fp %p 0x%04x%04x %d=%d .. %d\n", 628 fp, fp->frag_msw, fp->frag_lsw, fp->frag_size, m->m_len, packetSize ); 629 #endif 630 #if (SONIC_DEBUG & SONIC_DEBUG_DUMP_TX_MBUFS) 631 Dump_Buffer( 632 p, 633 (fp->frag_size > MAXIMUM_FRAME_SIZE) ? MAXIMUM_FRAME_SIZE : fp->frag_size 634 ); 635 #endif 604 636 l = m; 605 637 m = m->m_next; 606 #if (SONIC_DEBUG & SONIC_DEBUG_FRAGMENTS)607 printf( "fp %p 0x%04x%04x %d\n",608 fp, fp->frag_msw, fp->frag_lsw, fp->frag_size );609 #endif610 638 } 611 639 else { … … 658 686 sc->tdaHead = tdp; 659 687 660 sonic_enable_interrupts( rp, (IMR_PINTEN | IMR_PTXEN | IMR_TXEREN) ); 688 /* XXX */ 689 /* sonic_enable_interrupts( rp, (IMR_PINTEN | IMR_PTXEN | IMR_TXEREN) ); */ 661 690 sonic_write_register( rp, SONIC_REG_CR, CR_TXP ); 662 691 } … … 859 888 ReceiveResourcePointer_t rwp, rea; 860 889 rtems_unsigned16 newMissedTally, oldMissedTally; 890 unsigned32 rxMbufIndex; 861 891 862 892 rwp = sc->rsa; … … 868 898 */ 869 899 oldMissedTally = sonic_read_register( rp, SONIC_REG_MPT ); 870 sonic_write_register( rp, SONIC_REG_CR, CR_RRRA );871 sonic_write_register( rp, SONIC_REG_CR, CR_RXEN );872 900 873 901 /* 874 902 * Input packet handling loop 875 903 */ 904 rxMbufIndex = 0; 876 905 for (;;) { 877 906 /* … … 891 920 status = rdp->status; 892 921 if (status & RDA_STATUS_PRX) { 893 struct mbuf **mp;894 922 struct ether_header *eh; 895 923 void *p; 896 897 /*898 * Get the mbuf pointer899 */900 p = PTR(rdp->pkt_msw, rdp->pkt_lsw);901 mp = (struct mbuf **)p - 1;902 m = *mp;903 924 904 925 /* … … 910 931 * Invalidate cache entries for this memory. 911 932 */ 933 m = rdp->mbufp; 912 934 m->m_len = m->m_pkthdr.len = rdp->byte_count - 913 935 sizeof(rtems_unsigned32) - … … 915 937 eh = mtod (m, struct ether_header *); 916 938 m->m_data += sizeof(struct ether_header); 939 940 #if (SONIC_DEBUG & SONIC_DEBUG_DUMP_RX_MBUFS) 941 Dump_Buffer( (void *) eh, sizeof(struct ether_header) ); 942 Dump_Buffer( (void *) m, 96 /* m->m_len*/ ); 943 #endif 944 917 945 ether_input (ifp, eh, m); 918 946 … … 934 962 * Allocate a new mbuf. 935 963 */ 964 965 m= (void *)0xA0000000; /* hope for a fault :) */ 936 966 MGETHDR (m, M_WAIT, MT_DATA); 937 967 MCLGET (m, M_WAIT); 938 968 m->m_pkthdr.rcvif = ifp; 939 mp = mtod (m, struct mbuf **); 940 m->m_data += sizeof *mp; 941 *mp = m; 969 rdp->mbufp = m; 942 970 p = mtod (m, void *); 943 971 … … 945 973 * Reuse Receive Resource. 946 974 */ 975 947 976 rwp->buff_ptr_lsw = LSW(p); 948 977 rwp->buff_ptr_msw = MSW(p); 978 rwp->buff_wc_lsw = RBUF_WC; 979 rwp->buff_wc_msw = 0; 949 980 rwp++; 981 950 982 if (rwp == rea) { 951 983 #if (SONIC_DEBUG & SONIC_DEBUG_MEMORY) … … 983 1015 * Move to next receive descriptor 984 1016 */ 1017 985 1018 rdp->in_use = RDA_FREE; 986 1019 rdp = rdp->next; 987 1020 rdp->link &= ~RDA_LINK_EOL; 1021 988 1022 } 989 1023 } … … 1026 1060 1027 1061 /* 1062 * Allocate memory so we can figure out from the descriptor which 1063 * mbuf to send to the stack. 1064 */ 1065 1066 sc->txMbuf = malloc (sc->tdaCount * sizeof *sc->txMbuf, M_MBUF, M_NOWAIT); 1067 if (!sc->txMbuf) 1068 rtems_panic ("No memory for TX mbuf pointers"); 1069 1070 sc->rxMbuf = malloc (sc->rdaCount * sizeof *sc->rxMbuf, M_MBUF, M_NOWAIT); 1071 if (!sc->rxMbuf) 1072 rtems_panic ("No memory for RX mbuf pointers"); 1073 1074 /* 1028 1075 * Set up circular linked list in Transmit Descriptor Area. 1029 1076 * Use the PINT bit in the transmit configuration field to … … 1040 1087 tdp = sc->tdaTail; 1041 1088 for (i = 0 ; i < sc->tdaCount ; i++) { 1089 /* 1090 * Start off with the table of outstanding mbuf's 1091 */ 1092 sc->txMbuf[i] = NULL; 1093 1042 1094 /* 1043 1095 * status, pkt_config, pkt_size, and all fragment fields … … 1120 1172 rwp = sc->rsa; 1121 1173 for (i = 0 ; i < (sc->rdaCount + RRA_EXTRA_COUNT) ; i++, rwp++) { 1122 struct mbuf **mp;1123 1174 1124 1175 /* … … 1132 1183 MCLGET (m, M_WAIT); 1133 1184 m->m_pkthdr.rcvif = &sc->arpcom.ac_if; 1134 mp = mtod (m, struct mbuf **); 1135 1136 m->m_data += sizeof *mp; 1137 *mp = m; 1185 sc->rxMbuf[i] = m; 1186 sc->rda[i].mbufp = m; 1187 1138 1188 p = mtod (m, void *); 1139 1189 … … 1168 1218 * Mask all interrupts 1169 1219 */ 1170 sonic_write_register( rp, SONIC_REG_IMR, 0x 3fff );1220 sonic_write_register( rp, SONIC_REG_IMR, 0x0 ); /* XXX was backwards */ 1171 1221 1172 1222 /* … … 1293 1343 } 1294 1344 1295 sonic_write_register(rp, SONIC_REG_CR, CR_TXP |CR_RXEN | CR_STP);1345 sonic_write_register(rp, SONIC_REG_CR, /* CR_TXP | */CR_RXEN | CR_STP); 1296 1346 1297 1347 /* 1298 1348 * Attach SONIC interrupt handler 1299 1349 */ 1350 /* XXX 1300 1351 sonic_write_register( rp, SONIC_REG_IMR, 0 ); 1352 */ 1301 1353 old_handler = set_vector(sonic_interrupt_handler, sc->vector, 0); 1302 1354 … … 1362 1414 * Enable receiver and transmitter 1363 1415 */ 1364 sonic_write_register(rp, SONIC_REG_CR, CR_TXP | CR_RXEN); 1416 /* sonic_write_register( rp, SONIC_REG_IMR, 0 ); */ 1417 sonic_enable_interrupts( rp, (IMR_PRXEN | IMR_RBAEEN) ); 1418 1419 sonic_write_register(rp, SONIC_REG_CR, /* CR_TXP | */ CR_RXEN); 1365 1420 } 1366 1421 … … 1472 1527 sc->tdaCount = TDA_COUNT; 1473 1528 sc->acceptBroadcast = !config->ignore_broadcast; 1529 1530 sc->sonic = (void *) SONIC_BASE_ADDRESS; 1531 sc->vector = SONIC_VECTOR; 1474 1532 1475 1533 /* … … 1573 1631 { 1574 1632 volatile unsigned32 *p = base; 1633 { 1634 volatile unsigned32 *C = (void *)0x34CDF0; 1635 if ( *C ) printf( "W. *C = 0x%x\n", *C ); 1636 } 1575 1637 1576 1638 #if (SONIC_DEBUG & SONIC_DEBUG_PRINT_REGISTERS) … … 1589 1651 volatile unsigned32 *p = base; 1590 1652 unsigned32 value; 1653 1654 { 1655 volatile unsigned32 *C = (void *)0x34CDF0; 1656 if ( *C ) printf( "R. *C = 0x%x\n", *C ); 1657 } 1591 1658 1592 1659 value = p[regno]; -
c/src/lib/libbsp/powerpc/dmv177/sonic/sonic.h
r07d880f4 r7dbab720 330 330 */ 331 331 volatile struct ReceiveDescriptor *next; /* Circularly-linked list */ 332 struct mbuf *mbufp; /* First mbuf in packet */ 332 333 }; 333 334 typedef struct ReceiveDescriptor ReceiveDescriptor_t;
Note: See TracChangeset
for help on using the changeset viewer.