1 /* 2 * dp8390.c 3 * 4 * This file contains a ethernet device driver for NS dp8390 based ethernet 5 * cards. 6 * 7 * Created: before Dec 28, 1992 by Philip Homburg <philip@f-mnx.phicoh.com> 8 * 9 * Modified Mar 10 1994 by Philip Homburg 10 * Become a generic dp8390 driver. 11 * 12 * Modified Dec 20 1996 by G. Falzoni <falzoni@marina.scn.de> 13 * Added support for 3c503 boards. 14 */ 15 16 #include <minix/drivers.h> 17 #include <minix/netdriver.h> 18 19 #include <net/hton.h> 20 #include <sys/mman.h> 21 #include "assert.h" 22 23 #include "local.h" 24 #include "dp8390.h" 25 26 static dpeth_t de_state; 27 static int de_instance; 28 29 u32_t system_hz; 30 31 /* Configuration */ 32 typedef struct dp_conf 33 { 34 port_t dpc_port; 35 int dpc_irq; 36 phys_bytes dpc_mem; 37 } dp_conf_t; 38 39 #define DP_CONF_NR 4 40 static dp_conf_t dp_conf[DP_CONF_NR]= /* Card addresses */ 41 { 42 /* I/O port, IRQ, Buffer address. */ 43 { 0x280, 3, 0xD0000, }, 44 { 0x300, 5, 0xC8000, }, 45 { 0x380, 10, 0xD8000, }, 46 { 0x000, 0, 0x00000, }, 47 }; 48 49 /* Card inits configured out? */ 50 #if !ENABLE_WDETH 51 #define wdeth_probe(dep) (0) 52 #endif 53 #if !ENABLE_NE2000 54 #define ne_probe(dep) (0) 55 #endif 56 #if !ENABLE_3C503 57 #define el2_probe(dep) (0) 58 #endif 59 60 /* Some clones of the dp8390 and the PC emulator 'Bochs' require the CR_STA 61 * on writes to the CR register. Additional CR_STAs do not appear to hurt 62 * genuine dp8390s 63 */ 64 #define CR_EXTRA CR_STA 65 66 static int do_init(unsigned int instance, ether_addr_t *addr); 67 static void pci_conf(void); 68 static int do_send(struct netdriver_data *data, size_t size); 69 static ssize_t do_recv(struct netdriver_data *data, size_t max); 70 static void do_mode(unsigned int mode); 71 static void do_stat(eth_stat_t *stat); 72 static void do_stop(void); 73 static void dp_init(dpeth_t *dep); 74 static void dp_confaddr(dpeth_t *dep); 75 static void dp_reset(dpeth_t *dep); 76 static void do_intr(unsigned int mask); 77 static void dp_getblock(dpeth_t *dep, int page, size_t offset, size_t 78 size, void *dst); 79 static void dp_pio8_getblock(dpeth_t *dep, int page, size_t offset, 80 size_t size, void *dst); 81 static void dp_pio16_getblock(dpeth_t *dep, int page, size_t offset, 82 size_t size, void *dst); 83 static void dp_pkt2user_s(dpeth_t *dep, struct netdriver_data *data, int page, 84 size_t length); 85 static void dp_user2nic_s(dpeth_t *dep, struct netdriver_data *data, 86 int nic_addr, size_t offset, size_t count); 87 static void dp_pio8_user2nic_s(dpeth_t *dep, struct netdriver_data *data, 88 int nic_addr, size_t offset, size_t count); 89 static void dp_pio16_user2nic_s(dpeth_t *dep, struct netdriver_data *data, 90 int nic_addr, size_t offset, size_t count); 91 static void dp_nic2user_s(dpeth_t *dep, struct netdriver_data *data, 92 int nic_addr, size_t offset, size_t count); 93 static void dp_pio8_nic2user_s(dpeth_t *dep, struct netdriver_data *data, 94 int nic_addr, size_t offset, size_t count); 95 static void dp_pio16_nic2user_s(dpeth_t *dep, struct netdriver_data *data, 96 int nic_addr, size_t offset, size_t count); 97 static void conf_hw(dpeth_t *dep); 98 static void update_conf(dpeth_t *dep, dp_conf_t *dcp); 99 static void map_hw_buffer(dpeth_t *dep); 100 static void insb(port_t port, void *buf, size_t size); 101 static void insw(port_t port, void *buf, size_t size); 102 103 static const struct netdriver dp_table = { 104 .ndr_init = do_init, 105 .ndr_stop = do_stop, 106 .ndr_mode = do_mode, 107 .ndr_recv = do_recv, 108 .ndr_send = do_send, 109 .ndr_stat = do_stat, 110 .ndr_intr = do_intr 111 }; 112 113 /*===========================================================================* 114 * main * 115 *===========================================================================*/ 116 int main(int argc, char *argv[]) 117 { 118 env_setargs(argc, argv); 119 120 netdriver_task(&dp_table); 121 122 return 0; 123 } 124 125 /*===========================================================================* 126 * do_init * 127 *===========================================================================*/ 128 static int do_init(unsigned int instance, ether_addr_t *addr) 129 { 130 /* Initialize the dp8390 driver. */ 131 dpeth_t *dep; 132 133 system_hz = sys_hz(); 134 135 de_instance = instance; 136 137 dep = &de_state; 138 memset(dep, 0, sizeof(*dep)); 139 140 strlcpy(dep->de_name, "dp8390#0", sizeof(dep->de_name)); 141 dep->de_name[7] += de_instance; 142 143 pci_conf(); /* Configure PCI devices. */ 144 145 /* This is the default, try to (re)locate the device. */ 146 conf_hw(dep); 147 148 dp_init(dep); 149 150 memcpy(addr, dep->de_address.ea_addr, sizeof(*addr)); 151 152 return OK; 153 } 154 155 #if 0 156 /*===========================================================================* 157 * dp8390_dump * 158 *===========================================================================*/ 159 void dp8390_dump(void) 160 { 161 dpeth_t *dep; 162 int isr; 163 164 dep = &de_state; 165 166 printf("\n"); 167 printf("dp8390 statistics of instance %d:\n", de_instance); 168 169 printf("recvErr :%8ld\t", dep->de_stat.ets_recvErr); 170 printf("sendErr :%8ld\t", dep->de_stat.ets_sendErr); 171 printf("OVW :%8ld\n", dep->de_stat.ets_OVW); 172 173 printf("CRCerr :%8ld\t", dep->de_stat.ets_CRCerr); 174 printf("frameAll :%8ld\t", dep->de_stat.ets_frameAll); 175 printf("missedP :%8ld\n", dep->de_stat.ets_missedP); 176 177 printf("packetR :%8ld\t", dep->de_stat.ets_packetR); 178 printf("packetT :%8ld\t", dep->de_stat.ets_packetT); 179 printf("transDef :%8ld\n", dep->de_stat.ets_transDef); 180 181 printf("collision :%8ld\t", dep->de_stat.ets_collision); 182 printf("transAb :%8ld\t", dep->de_stat.ets_transAb); 183 printf("carrSense :%8ld\n", dep->de_stat.ets_carrSense); 184 185 printf("fifoUnder :%8ld\t", dep->de_stat.ets_fifoUnder); 186 printf("fifoOver :%8ld\t", dep->de_stat.ets_fifoOver); 187 printf("CDheartbeat:%8ld\n", dep->de_stat.ets_CDheartbeat); 188 189 printf("OWC :%8ld\t", dep->de_stat.ets_OWC); 190 191 isr= inb_reg0(dep, DP_ISR); 192 printf("dp_isr = 0x%x + 0x%x, de_flags = 0x%x\n", isr, 193 inb_reg0(dep, DP_ISR), dep->de_flags); 194 } 195 #endif 196 197 /*===========================================================================* 198 * pci_conf * 199 *===========================================================================*/ 200 static void pci_conf(void) 201 { 202 char envvar[16]; 203 struct dpeth *dep; 204 int i, pci_instance; 205 206 dep= &de_state; 207 208 strlcpy(envvar, "DPETH0", sizeof(envvar)); 209 envvar[5] += de_instance; 210 if (!(dep->de_pci= env_prefix(envvar, "pci"))) 211 return; /* no PCI config */ 212 213 /* Count the number of dp instances before this one that are configured 214 * for PCI, so that we can skip that many when enumerating PCI devices. 215 */ 216 pci_instance= 0; 217 for (i= 0; i < de_instance; i++) { 218 envvar[5]= i; 219 if (env_prefix(envvar, "pci")) 220 pci_instance++; 221 } 222 223 if (!rtl_probe(dep, pci_instance)) 224 panic("no matching PCI device found"); 225 } 226 227 /*===========================================================================* 228 * do_send * 229 *===========================================================================*/ 230 static int do_send(struct netdriver_data *data, size_t size) 231 { 232 int sendq_head; 233 dpeth_t *dep; 234 235 dep= &de_state; 236 237 sendq_head= dep->de_sendq_head; 238 if (dep->de_sendq[sendq_head].sq_filled) 239 return SUSPEND; 240 241 (dep->de_user2nicf_s)(dep, data, 242 dep->de_sendq[sendq_head].sq_sendpage * DP_PAGESIZE, 0, size); 243 244 dep->de_sendq[sendq_head].sq_filled= TRUE; 245 if (dep->de_sendq_tail == sendq_head) 246 { 247 outb_reg0(dep, DP_TPSR, dep->de_sendq[sendq_head].sq_sendpage); 248 outb_reg0(dep, DP_TBCR1, size >> 8); 249 outb_reg0(dep, DP_TBCR0, size & 0xff); 250 outb_reg0(dep, DP_CR, CR_TXP | CR_EXTRA);/* there it goes.. */ 251 } 252 else 253 dep->de_sendq[sendq_head].sq_size= size; 254 255 if (++sendq_head == dep->de_sendq_nr) 256 sendq_head= 0; 257 assert(sendq_head < SENDQ_NR); 258 dep->de_sendq_head= sendq_head; 259 260 return OK; 261 } 262 263 /*===========================================================================* 264 * do_mode * 265 *===========================================================================*/ 266 static void do_mode(unsigned int mode) 267 { 268 dpeth_t *dep; 269 int dp_rcr_reg; 270 271 dep = &de_state; 272 273 outb_reg0(dep, DP_CR, CR_PS_P0 | CR_EXTRA); 274 275 dp_rcr_reg = 0; 276 if (mode & NDEV_PROMISC) 277 dp_rcr_reg |= RCR_AB | RCR_PRO | RCR_AM; 278 if (mode & NDEV_BROAD) 279 dp_rcr_reg |= RCR_AB; 280 if (mode & NDEV_MULTI) 281 dp_rcr_reg |= RCR_AM; 282 outb_reg0(dep, DP_RCR, dp_rcr_reg); 283 } 284 285 /*===========================================================================* 286 * do_stat * 287 *===========================================================================*/ 288 static void do_stat(eth_stat_t *stat) 289 { 290 dpeth_t *dep; 291 292 dep= &de_state; 293 294 dep->de_stat.ets_CRCerr += inb_reg0(dep, DP_CNTR0); 295 dep->de_stat.ets_frameAll += inb_reg0(dep, DP_CNTR1); 296 dep->de_stat.ets_missedP += inb_reg0(dep, DP_CNTR2); 297 298 memcpy(stat, &dep->de_stat, sizeof(*stat)); 299 } 300 301 /*===========================================================================* 302 * do_stop * 303 *===========================================================================*/ 304 static void do_stop(void) 305 { 306 dpeth_t *dep; 307 308 dep = &de_state; 309 310 outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT); 311 (dep->de_stopf)(dep); 312 } 313 314 /*===========================================================================* 315 * dp_init * 316 *===========================================================================*/ 317 static void dp_init(dpeth_t *dep) 318 { 319 int i, r; 320 321 /* General initialization */ 322 dep->de_flags = DEF_EMPTY; 323 (*dep->de_initf)(dep); 324 325 dp_confaddr(dep); 326 327 if (debug) 328 { 329 printf("%s: Ethernet address ", dep->de_name); 330 for (i= 0; i < 6; i++) 331 printf("%x%c", dep->de_address.ea_addr[i], 332 i < 5 ? ':' : '\n'); 333 } 334 335 /* Map buffer */ 336 map_hw_buffer(dep); 337 338 /* Initialization of the dp8390 following the mandatory procedure 339 * in reference manual ("DP8390D/NS32490D NIC Network Interface 340 * Controller", National Semiconductor, July 1995, Page 29). 341 */ 342 /* Step 1: */ 343 outb_reg0(dep, DP_CR, CR_PS_P0 | CR_STP | CR_DM_ABORT); 344 /* Step 2: */ 345 if (dep->de_16bit) 346 outb_reg0(dep, DP_DCR, DCR_WORDWIDE | DCR_8BYTES | DCR_BMS); 347 else 348 outb_reg0(dep, DP_DCR, DCR_BYTEWIDE | DCR_8BYTES | DCR_BMS); 349 /* Step 3: */ 350 outb_reg0(dep, DP_RBCR0, 0); 351 outb_reg0(dep, DP_RBCR1, 0); 352 /* Step 4: */ 353 outb_reg0(dep, DP_RCR, 0); 354 /* Step 5: */ 355 outb_reg0(dep, DP_TCR, TCR_INTERNAL); 356 /* Step 6: */ 357 outb_reg0(dep, DP_BNRY, dep->de_startpage); 358 outb_reg0(dep, DP_PSTART, dep->de_startpage); 359 outb_reg0(dep, DP_PSTOP, dep->de_stoppage); 360 /* Step 7: */ 361 outb_reg0(dep, DP_ISR, 0xFF); 362 /* Step 8: */ 363 outb_reg0(dep, DP_IMR, IMR_PRXE | IMR_PTXE | IMR_RXEE | IMR_TXEE | 364 IMR_OVWE | IMR_CNTE); 365 /* Step 9: */ 366 outb_reg0(dep, DP_CR, CR_PS_P1 | CR_DM_ABORT | CR_STP); 367 368 outb_reg1(dep, DP_PAR0, dep->de_address.ea_addr[0]); 369 outb_reg1(dep, DP_PAR1, dep->de_address.ea_addr[1]); 370 outb_reg1(dep, DP_PAR2, dep->de_address.ea_addr[2]); 371 outb_reg1(dep, DP_PAR3, dep->de_address.ea_addr[3]); 372 outb_reg1(dep, DP_PAR4, dep->de_address.ea_addr[4]); 373 outb_reg1(dep, DP_PAR5, dep->de_address.ea_addr[5]); 374 375 outb_reg1(dep, DP_MAR0, 0xff); 376 outb_reg1(dep, DP_MAR1, 0xff); 377 outb_reg1(dep, DP_MAR2, 0xff); 378 outb_reg1(dep, DP_MAR3, 0xff); 379 outb_reg1(dep, DP_MAR4, 0xff); 380 outb_reg1(dep, DP_MAR5, 0xff); 381 outb_reg1(dep, DP_MAR6, 0xff); 382 outb_reg1(dep, DP_MAR7, 0xff); 383 384 outb_reg1(dep, DP_CURR, dep->de_startpage + 1); 385 /* Step 10: */ 386 outb_reg0(dep, DP_CR, CR_DM_ABORT | CR_STA); 387 /* Step 11: */ 388 outb_reg0(dep, DP_TCR, TCR_NORMAL); 389 390 inb_reg0(dep, DP_CNTR0); /* reset counters by reading */ 391 inb_reg0(dep, DP_CNTR1); 392 inb_reg0(dep, DP_CNTR2); 393 394 /* Finish the initialization. */ 395 for (i= 0; i<dep->de_sendq_nr; i++) 396 dep->de_sendq[i].sq_filled= 0; 397 dep->de_sendq_head= 0; 398 dep->de_sendq_tail= 0; 399 if (!dep->de_prog_IO) 400 { 401 dep->de_user2nicf_s= dp_user2nic_s; 402 dep->de_nic2userf_s= dp_nic2user_s; 403 dep->de_getblockf= dp_getblock; 404 } 405 else if (dep->de_16bit) 406 { 407 dep->de_user2nicf_s= dp_pio16_user2nic_s; 408 dep->de_nic2userf_s= dp_pio16_nic2user_s; 409 dep->de_getblockf= dp_pio16_getblock; 410 } 411 else 412 { 413 dep->de_user2nicf_s= dp_pio8_user2nic_s; 414 dep->de_nic2userf_s= dp_pio8_nic2user_s; 415 dep->de_getblockf= dp_pio8_getblock; 416 } 417 418 /* Set the interrupt handler and policy. Do not automatically 419 * reenable interrupts. Return the IRQ line number on interrupts. 420 */ 421 dep->de_hook = dep->de_irq; 422 r= sys_irqsetpolicy(dep->de_irq, 0, &dep->de_hook); 423 if (r != OK) 424 panic("sys_irqsetpolicy failed: %d", r); 425 426 r= sys_irqenable(&dep->de_hook); 427 if (r != OK) 428 panic("unable to enable interrupts: %d", r); 429 } 430 431 /*===========================================================================* 432 * dp_confaddr * 433 *===========================================================================*/ 434 static void dp_confaddr(dpeth_t *dep) 435 { 436 int i; 437 char eakey[16]; 438 static char eafmt[]= "x:x:x:x:x:x"; 439 long v; 440 441 /* User defined ethernet address? */ 442 strlcpy(eakey, "DPETH0_EA", sizeof(eakey)); 443 eakey[5] += de_instance; 444 445 for (i= 0; i < 6; i++) 446 { 447 v= dep->de_address.ea_addr[i]; 448 if (env_parse(eakey, eafmt, i, &v, 0x00L, 0xFFL) != EP_SET) 449 { 450 break; 451 } 452 dep->de_address.ea_addr[i]= v; 453 } 454 455 if (i != 0 && i != 6) env_panic(eakey); /* It's all or nothing */ 456 } 457 458 /*===========================================================================* 459 * dp_reset * 460 *===========================================================================*/ 461 static void dp_reset(dpeth_t *dep) 462 { 463 int i; 464 465 /* Stop chip */ 466 outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT); 467 outb_reg0(dep, DP_RBCR0, 0); 468 outb_reg0(dep, DP_RBCR1, 0); 469 for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RST) == 0); i++) 470 ; /* Do nothing */ 471 outb_reg0(dep, DP_TCR, TCR_1EXTERNAL|TCR_OFST); 472 outb_reg0(dep, DP_CR, CR_STA|CR_DM_ABORT); 473 outb_reg0(dep, DP_TCR, TCR_NORMAL); 474 475 /* Acknowledge the ISR_RDC (remote dma) interrupt. */ 476 for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RDC) == 0); i++) 477 ; /* Do nothing */ 478 outb_reg0(dep, DP_ISR, inb_reg0(dep, DP_ISR) & ~ISR_RDC); 479 480 /* Reset the transmit ring. If we were transmitting a packet, we 481 * pretend that the packet is processed. Higher layers will 482 * retransmit if the packet wasn't actually sent. 483 */ 484 dep->de_sendq_head= dep->de_sendq_tail= 0; 485 for (i= 0; i<dep->de_sendq_nr; i++) 486 dep->de_sendq[i].sq_filled= 0; 487 netdriver_send(); 488 dep->de_flags &= ~DEF_STOPPED; 489 } 490 491 /*===========================================================================* 492 * do_intr * 493 *===========================================================================*/ 494 static void do_intr(unsigned int __unused mask) 495 { 496 dpeth_t *dep; 497 int isr, tsr; 498 int r, size, sendq_tail; 499 500 dep = &de_state; 501 502 for(;;) 503 { 504 isr = inb_reg0(dep, DP_ISR); 505 if (!isr) 506 break; 507 outb_reg0(dep, DP_ISR, isr); 508 if (isr & (ISR_PTX|ISR_TXE)) 509 { 510 if (isr & ISR_TXE) 511 { 512 #if DEBUG 513 { printf("%s: got send Error\n", dep->de_name); } 514 #endif 515 dep->de_stat.ets_sendErr++; 516 } 517 else 518 { 519 tsr = inb_reg0(dep, DP_TSR); 520 521 if (tsr & TSR_PTX) dep->de_stat.ets_packetT++; 522 #if 0 /* Reserved in later manuals, should be ignored */ 523 if (!(tsr & TSR_DFR)) 524 { 525 /* In most (all?) implementations of 526 * the dp8390, this bit is set 527 * when the packet is not deferred 528 */ 529 dep->de_stat.ets_transDef++; 530 } 531 #endif 532 if (tsr & TSR_COL) dep->de_stat.ets_collision++; 533 if (tsr & TSR_ABT) dep->de_stat.ets_transAb++; 534 if (tsr & TSR_CRS) dep->de_stat.ets_carrSense++; 535 if (tsr & TSR_FU 536 && ++dep->de_stat.ets_fifoUnder <= 10) 537 { 538 printf("%s: fifo underrun\n", 539 dep->de_name); 540 } 541 if (tsr & TSR_CDH 542 && ++dep->de_stat.ets_CDheartbeat <= 10) 543 { 544 printf("%s: CD heart beat failure\n", 545 dep->de_name); 546 } 547 if (tsr & TSR_OWC) dep->de_stat.ets_OWC++; 548 } 549 sendq_tail= dep->de_sendq_tail; 550 551 if (!(dep->de_sendq[sendq_tail].sq_filled)) 552 { 553 /* Software bug? */ 554 assert(!debug); 555 556 /* Or hardware bug? */ 557 printf( 558 "%s: transmit interrupt, but not sending\n", 559 dep->de_name); 560 continue; 561 } 562 dep->de_sendq[sendq_tail].sq_filled= 0; 563 if (++sendq_tail == dep->de_sendq_nr) 564 sendq_tail= 0; 565 dep->de_sendq_tail= sendq_tail; 566 if (dep->de_sendq[sendq_tail].sq_filled) 567 { 568 size= dep->de_sendq[sendq_tail].sq_size; 569 outb_reg0(dep, DP_TPSR, 570 dep->de_sendq[sendq_tail].sq_sendpage); 571 outb_reg0(dep, DP_TBCR1, size >> 8); 572 outb_reg0(dep, DP_TBCR0, size & 0xff); 573 outb_reg0(dep, DP_CR, CR_TXP | CR_EXTRA); 574 } 575 netdriver_send(); 576 } 577 578 if (isr & ISR_PRX) 579 netdriver_recv(); 580 581 if (isr & ISR_RXE) dep->de_stat.ets_recvErr++; 582 if (isr & ISR_CNT) 583 { 584 dep->de_stat.ets_CRCerr += inb_reg0(dep, DP_CNTR0); 585 dep->de_stat.ets_frameAll += inb_reg0(dep, DP_CNTR1); 586 dep->de_stat.ets_missedP += inb_reg0(dep, DP_CNTR2); 587 } 588 if (isr & ISR_OVW) 589 { 590 dep->de_stat.ets_OVW++; 591 #if 0 592 { printW(); printf( 593 "%s: got overwrite warning\n", dep->de_name); } 594 #endif 595 } 596 if (isr & ISR_RDC) 597 { 598 /* Nothing to do */ 599 } 600 if (isr & ISR_RST) 601 { 602 /* this means we got an interrupt but the ethernet 603 * chip is shutdown. We set the flag DEF_STOPPED, 604 * and continue processing arrived packets. When the 605 * receive buffer is empty, we reset the dp8390. 606 */ 607 #if 0 608 { printW(); printf( 609 "%s: NIC stopped\n", dep->de_name); } 610 #endif 611 dep->de_flags |= DEF_STOPPED; 612 netdriver_recv(); /* see if we can reset right now */ 613 break; 614 } 615 } 616 617 if ((r = sys_irqenable(&dep->de_hook)) != OK) 618 panic("unable enable interrupts: %d", r); 619 } 620 621 /*===========================================================================* 622 * do_recv * 623 *===========================================================================*/ 624 static ssize_t do_recv(struct netdriver_data *data, size_t max) 625 { 626 dpeth_t *dep; 627 dp_rcvhdr_t header; 628 unsigned pageno, curr, next; 629 size_t length; 630 int packet_processed; 631 u16_t eth_type; 632 633 dep = &de_state; 634 635 packet_processed = FALSE; 636 pageno = inb_reg0(dep, DP_BNRY) + 1; 637 if (pageno == dep->de_stoppage) pageno = dep->de_startpage; 638 639 do 640 { 641 outb_reg0(dep, DP_CR, CR_PS_P1 | CR_EXTRA); 642 curr = inb_reg1(dep, DP_CURR); 643 outb_reg0(dep, DP_CR, CR_PS_P0 | CR_EXTRA); 644 645 if (curr == pageno) { 646 if (dep->de_flags & DEF_STOPPED) { 647 /* The chip is stopped, and all arrived packets 648 * are delivered. 649 */ 650 dp_reset(dep); 651 } 652 653 return SUSPEND; 654 } 655 656 (dep->de_getblockf)(dep, pageno, (size_t)0, sizeof(header), 657 &header); 658 (dep->de_getblockf)(dep, pageno, sizeof(header) + 659 2*sizeof(ether_addr_t), sizeof(eth_type), ð_type); 660 661 length = (header.dr_rbcl | (header.dr_rbch << 8)) - 662 sizeof(dp_rcvhdr_t); 663 next = header.dr_next; 664 if (length < ETH_MIN_PACK_SIZE || length > max) 665 { 666 printf("%s: packet with strange length arrived: %d\n", 667 dep->de_name, (int) length); 668 next= curr; 669 } 670 else if (next < dep->de_startpage || next >= dep->de_stoppage) 671 { 672 printf("%s: strange next page\n", dep->de_name); 673 next= curr; 674 } 675 else if (header.dr_status & RSR_FO) 676 { 677 /* This is very serious, so we issue a warning and 678 * reset the buffers */ 679 printf("%s: fifo overrun, resetting receive buffer\n", 680 dep->de_name); 681 dep->de_stat.ets_fifoOver++; 682 next = curr; 683 } 684 else if (header.dr_status & RSR_PRX) 685 { 686 dp_pkt2user_s(dep, data, pageno, length); 687 688 packet_processed = TRUE; 689 dep->de_stat.ets_packetR++; 690 } 691 if (next == dep->de_startpage) 692 outb_reg0(dep, DP_BNRY, dep->de_stoppage - 1); 693 else 694 outb_reg0(dep, DP_BNRY, next - 1); 695 696 pageno = next; 697 } while (!packet_processed); 698 699 return length; 700 } 701 702 /*===========================================================================* 703 * dp_getblock * 704 *===========================================================================*/ 705 static void dp_getblock(dpeth_t *dep, int page, size_t offset, size_t size, 706 void *dst) 707 { 708 offset = page * DP_PAGESIZE + offset; 709 710 memcpy(dst, dep->de_locmem + offset, size); 711 } 712 713 /*===========================================================================* 714 * dp_pio8_getblock * 715 *===========================================================================*/ 716 static void dp_pio8_getblock(dpeth_t *dep, int page, size_t offset, 717 size_t size, void *dst) 718 { 719 offset = page * DP_PAGESIZE + offset; 720 outb_reg0(dep, DP_RBCR0, size & 0xFF); 721 outb_reg0(dep, DP_RBCR1, size >> 8); 722 outb_reg0(dep, DP_RSAR0, offset & 0xFF); 723 outb_reg0(dep, DP_RSAR1, offset >> 8); 724 outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); 725 726 insb(dep->de_data_port, dst, size); 727 } 728 729 /*===========================================================================* 730 * dp_pio16_getblock * 731 *===========================================================================*/ 732 static void dp_pio16_getblock(dpeth_t *dep, int page, size_t offset, 733 size_t size, void *dst) 734 { 735 offset = page * DP_PAGESIZE + offset; 736 outb_reg0(dep, DP_RBCR0, size & 0xFF); 737 outb_reg0(dep, DP_RBCR1, size >> 8); 738 outb_reg0(dep, DP_RSAR0, offset & 0xFF); 739 outb_reg0(dep, DP_RSAR1, offset >> 8); 740 outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); 741 742 assert (!(size & 1)); 743 insw(dep->de_data_port, dst, size); 744 } 745 746 /*===========================================================================* 747 * dp_pkt2user_s * 748 *===========================================================================*/ 749 static void dp_pkt2user_s(dpeth_t *dep, struct netdriver_data *data, int page, 750 size_t length) 751 { 752 int last, count; 753 754 last = page + (length - 1) / DP_PAGESIZE; 755 if (last >= dep->de_stoppage) 756 { 757 count = (dep->de_stoppage - page) * DP_PAGESIZE - 758 sizeof(dp_rcvhdr_t); 759 760 (dep->de_nic2userf_s)(dep, data, 761 page * DP_PAGESIZE + sizeof(dp_rcvhdr_t), 0, count); 762 (dep->de_nic2userf_s)(dep, data, 763 dep->de_startpage * DP_PAGESIZE, count, length - count); 764 } 765 else 766 { 767 (dep->de_nic2userf_s)(dep, data, 768 page * DP_PAGESIZE + sizeof(dp_rcvhdr_t), 0, length); 769 } 770 } 771 772 /*===========================================================================* 773 * dp_user2nic_s * 774 *===========================================================================*/ 775 static void dp_user2nic_s(dpeth_t *dep, struct netdriver_data *data, 776 int nic_addr, size_t offset, size_t count) 777 { 778 netdriver_copyin(data, offset, dep->de_locmem + nic_addr, count); 779 } 780 781 /*===========================================================================* 782 * dp_pio8_user2nic_s * 783 *===========================================================================*/ 784 static void dp_pio8_user2nic_s(dpeth_t *dep, struct netdriver_data *data, 785 int nic_addr, size_t offset, size_t count) 786 { 787 int i; 788 789 outb_reg0(dep, DP_ISR, ISR_RDC); 790 791 outb_reg0(dep, DP_RBCR0, count & 0xFF); 792 outb_reg0(dep, DP_RBCR1, count >> 8); 793 outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); 794 outb_reg0(dep, DP_RSAR1, nic_addr >> 8); 795 outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA); 796 797 netdriver_portoutb(data, offset, dep->de_data_port, count); 798 799 for (i= 0; i<100; i++) 800 { 801 if (inb_reg0(dep, DP_ISR) & ISR_RDC) 802 break; 803 } 804 if (i == 100) 805 { 806 panic("dp8390: remote dma failed to complete"); 807 } 808 } 809 810 /*===========================================================================* 811 * dp_pio16_user2nic_s * 812 *===========================================================================*/ 813 static void dp_pio16_user2nic_s(dpeth_t *dep, struct netdriver_data *data, 814 int nic_addr, size_t offset, size_t count) 815 { 816 size_t ecount; 817 int i; 818 819 ecount= (count+1) & ~1; 820 821 outb_reg0(dep, DP_ISR, ISR_RDC); 822 outb_reg0(dep, DP_RBCR0, ecount & 0xFF); 823 outb_reg0(dep, DP_RBCR1, ecount >> 8); 824 outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); 825 outb_reg0(dep, DP_RSAR1, nic_addr >> 8); 826 outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA); 827 828 netdriver_portoutw(data, offset, dep->de_data_port, count); 829 830 for (i= 0; i<100; i++) 831 { 832 if (inb_reg0(dep, DP_ISR) & ISR_RDC) 833 break; 834 } 835 if (i == 100) 836 { 837 panic("dp8390: remote dma failed to complete"); 838 } 839 } 840 841 /*===========================================================================* 842 * dp_nic2user_s * 843 *===========================================================================*/ 844 static void dp_nic2user_s(dpeth_t *dep, struct netdriver_data *data, 845 int nic_addr, size_t offset, size_t count) 846 { 847 netdriver_copyout(data, offset, dep->de_locmem + nic_addr, count); 848 } 849 850 /*===========================================================================* 851 * dp_pio8_nic2user_s * 852 *===========================================================================*/ 853 static void dp_pio8_nic2user_s(dpeth_t *dep, struct netdriver_data *data, 854 int nic_addr, size_t offset, size_t count) 855 { 856 outb_reg0(dep, DP_RBCR0, count & 0xFF); 857 outb_reg0(dep, DP_RBCR1, count >> 8); 858 outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); 859 outb_reg0(dep, DP_RSAR1, nic_addr >> 8); 860 outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); 861 862 netdriver_portinb(data, offset, dep->de_data_port, count); 863 } 864 865 /*===========================================================================* 866 * dp_pio16_nic2user_s * 867 *===========================================================================*/ 868 static void dp_pio16_nic2user_s(dpeth_t *dep, struct netdriver_data *data, 869 int nic_addr, size_t offset, size_t count) 870 { 871 size_t ecount; 872 873 ecount= (count+1) & ~1; 874 875 outb_reg0(dep, DP_RBCR0, ecount & 0xFF); 876 outb_reg0(dep, DP_RBCR1, ecount >> 8); 877 outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); 878 outb_reg0(dep, DP_RSAR1, nic_addr >> 8); 879 outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); 880 881 netdriver_portinw(data, offset, dep->de_data_port, count); 882 } 883 884 /*===========================================================================* 885 * conf_hw * 886 *===========================================================================*/ 887 static void conf_hw(dpeth_t *dep) 888 { 889 int confnr; 890 dp_conf_t *dcp; 891 892 /* Pick a default configuration for this instance. */ 893 confnr= MIN(de_instance, DP_CONF_NR-1); 894 895 dcp= &dp_conf[confnr]; 896 update_conf(dep, dcp); 897 if (!wdeth_probe(dep) && !ne_probe(dep) && !el2_probe(dep)) 898 panic("no ethernet card found at 0x%x\n", dep->de_base_port); 899 900 /* XXX */ if (dep->de_linmem == 0) dep->de_linmem= 0xFFFF0000; 901 } 902 903 /*===========================================================================* 904 * update_conf * 905 *===========================================================================*/ 906 static void update_conf(dpeth_t *dep, dp_conf_t *dcp) 907 { 908 long v; 909 static char dpc_fmt[] = "x:d:x:x"; 910 char eckey[16]; 911 912 if (dep->de_pci) 913 { 914 /* PCI device is present */ 915 return; /* Already configured */ 916 } 917 918 strlcpy(eckey, "DPETH0", sizeof(eckey)); 919 eckey[5] += de_instance; 920 921 /* Get the default settings and modify them from the environment. */ 922 v= dcp->dpc_port; 923 (void) env_parse(eckey, dpc_fmt, 0, &v, 0x0000L, 0xFFFFL); 924 dep->de_base_port= v; 925 926 v= dcp->dpc_irq | DEI_DEFAULT; 927 (void) env_parse(eckey, dpc_fmt, 1, &v, 0L, (long) NR_IRQ_VECTORS - 1); 928 dep->de_irq= v; 929 930 v= dcp->dpc_mem; 931 (void) env_parse(eckey, dpc_fmt, 2, &v, 0L, 0xFFFFFL); 932 dep->de_linmem= v; 933 934 v= 0; 935 (void) env_parse(eckey, dpc_fmt, 3, &v, 0x2000L, 0x8000L); 936 dep->de_ramsize= v; 937 } 938 939 /*===========================================================================* 940 * map_hw_buffer * 941 *===========================================================================*/ 942 static void map_hw_buffer(dpeth_t *dep) 943 { 944 945 if (dep->de_prog_IO) 946 { 947 #if 0 948 printf( 949 "map_hw_buffer: programmed I/O, no need to map buffer\n"); 950 #endif 951 dep->de_locmem = (char *)-dep->de_ramsize; /* trap errors */ 952 return; 953 } 954 955 dep->de_locmem= 956 vm_map_phys(SELF, (void *) dep->de_linmem, dep->de_ramsize); 957 if (dep->de_locmem == MAP_FAILED) 958 panic("map_hw_buffer: vm_map_phys failed"); 959 } 960 961 u8_t inb(port_t port) 962 { 963 int r; 964 u32_t value; 965 966 r= sys_inb(port, &value); 967 if (r != OK) 968 { 969 printf("inb failed for port 0x%x\n", port); 970 panic("sys_inb failed: %d", r); 971 } 972 return value; 973 } 974 975 u16_t inw(port_t port) 976 { 977 int r; 978 u32_t value; 979 980 r= sys_inw(port, &value); 981 if (r != OK) 982 panic("sys_inw failed: %d", r); 983 return (u16_t) value; 984 } 985 986 void outb(port_t port, u8_t value) 987 { 988 int r; 989 990 r= sys_outb(port, value); 991 if (r != OK) 992 panic("sys_outb failed: %d", r); 993 } 994 995 void outw(port_t port, u16_t value) 996 { 997 int r; 998 999 r= sys_outw(port, value); 1000 if (r != OK) 1001 panic("sys_outw failed: %d", r); 1002 } 1003 1004 static void insb(port_t port, void *buf, size_t size) 1005 { 1006 int r; 1007 1008 r= sys_insb(port, SELF, buf, size); 1009 if (r != OK) 1010 panic("sys_sdevio failed: %d", r); 1011 } 1012 1013 static void insw(port_t port, void *buf, size_t size) 1014 { 1015 int r; 1016 1017 r= sys_insw(port, SELF, buf, size); 1018 if (r != OK) 1019 panic("sys_sdevio failed: %d", r); 1020 } 1021 1022 /* 1023 * $PchId: dp8390.c,v 1.25 2005/02/10 17:32:07 philip Exp $ 1024 */ 1025