Просмотр исходного кода

Updated to work with new ISAPnP bus code.

tags/v0.9.3
Michael Brown 19 лет назад
Родитель
Сommit
a26edc2eec
1 измененных файлов: 142 добавлений и 189 удалений
  1. 142
    189
      src/drivers/net/3c515.c

+ 142
- 189
src/drivers/net/3c515.c Просмотреть файл

@@ -44,33 +44,27 @@
44 44
 * *********************************************************/
45 45
 
46 46
 
47
-#define ISA_PNP
48
-/*#define EDEBUG1*/
49
-
50 47
 /* to get some global routines like printf */
51 48
 #include "etherboot.h"
52 49
 /* to get the interface to the body of the program */
53 50
 #include "nic.h"
54
-#include "isa.h"
51
+#include "isapnp.h"
52
+#include "isa.h" /* for ISA_ROM */
55 53
 #include "timer.h"
56 54
 
57
-#ifdef ISA_PNP
58
-
59 55
 static void t3c515_wait(unsigned int nticks)
60 56
 {
61 57
 	unsigned int to = currticks() + nticks;
62 58
 	while (currticks() < to)
63 59
 		/* wait */ ;
64 60
 }
65
-#endif
61
+
66 62
 /* TJL definations */
67 63
 #define HZ      100
68 64
 #define u16 unsigned short
69 65
 #define u32 unsigned long
70 66
 #define s16 signed short
71 67
 #define s32 signed long
72
-static unsigned short eth_nic_base;
73
-#define BASE 	(eth_nic_base)
74 68
 static int if_port;
75 69
 struct corkscrew_private *vp;
76 70
 /* Brought directly from 3c515.c by Becker */
@@ -103,15 +97,10 @@ static int max_interrupt_work = 20;
103 97
 static int rx_nocopy, rx_copy, queued_packet;
104 98
 */
105 99
 
106
-#ifdef DRIVER_DEBUG
107
-static int corkscrew_debug = DRIVER_DEBUG;
108
-#else
109
-static int corkscrew_debug = 1;
110
-#endif
111
-
112 100
 #define CORKSCREW_ID 10
113 101
 
114
-#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
102
+#define EL3WINDOW(win_num) \
103
+	outw(SelectWindow + (win_num), nic->ioaddr + EL3_CMD)
115 104
 #define EL3_CMD 0x0e
116 105
 #define EL3_STATUS 0x0e
117 106
 #define RX_BYTES_MASK			(unsigned short) (0x07ff)
@@ -296,7 +285,7 @@ static int corkscrew_probe1(int ioaddr, int irq, int product_index,
296 285
 
297 286
 /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
298 287
 /* Note: this is the only limit on the number of cards supported!! */
299
-static int options[8] = { -1, -1, -1, -1, -1, -1, -1, -1, };
288
+static int options = -1;
300 289
 
301 290
 /* End Brought directly from 3c515.c by Becker */
302 291
 
@@ -305,21 +294,19 @@ RESET - Reset adapter
305 294
 ***************************************************************************/
306 295
 static void t515_reset(struct nic *nic)
307 296
 {
308
-	int ioaddr = BASE;
309 297
 	union wn3_config config;
310 298
 	int i;
311 299
 
312 300
 	/* Before initializing select the active media port. */
313 301
 	EL3WINDOW(3);
314 302
 	if (vp->full_duplex)
315
-		outb(0x20, ioaddr + Wn3_MAC_Ctrl);	/* Set the full-duplex bit. */
316
-	config.i = inl(ioaddr + Wn3_Config);
303
+		outb(0x20, nic->ioaddr + Wn3_MAC_Ctrl);	/* Set the full-duplex bit. */
304
+	config.i = inl(nic->ioaddr + Wn3_Config);
317 305
 
318 306
 	if (vp->media_override != 7) {
319
-		if (corkscrew_debug > 1)
320
-			printf("Media override to transceiver %d (%s).\n",
321
-			       vp->media_override,
322
-			       media_tbl[vp->media_override].name);
307
+		DBG ( "Media override to transceiver %d (%s).\n",
308
+		      vp->media_override,
309
+		      media_tbl[vp->media_override].name);
323 310
 		if_port = vp->media_override;
324 311
 	} else if (vp->autoselect) {
325 312
 		/* Find first available media type, starting with 100baseTx. */
@@ -327,66 +314,63 @@ static void t515_reset(struct nic *nic)
327 314
 		while (!(vp->available_media & media_tbl[if_port].mask))
328 315
 			if_port = media_tbl[if_port].next;
329 316
 
330
-		if (corkscrew_debug > 1)
331
-			printf("Initial media type %s.\n",
332
-			       media_tbl[if_port].name);
317
+		DBG ( "Initial media type %s.\n",
318
+		      media_tbl[if_port].name);
333 319
 	} else
334 320
 		if_port = vp->default_media;
335 321
 
336 322
 	config.u.xcvr = if_port;
337
-	outl(config.i, ioaddr + Wn3_Config);
323
+	outl(config.i, nic->ioaddr + Wn3_Config);
338 324
 
339
-	if (corkscrew_debug > 1) {
340
-		printf("corkscrew_open() InternalConfig 0x%hX.\n",
341
-		       config.i);
342
-	}
325
+	DBG ( "corkscrew_open() InternalConfig 0x%hX.\n",
326
+	      config.i);
343 327
 
344
-	outw(TxReset, ioaddr + EL3_CMD);
328
+	outw(TxReset, nic->ioaddr + EL3_CMD);
345 329
 	for (i = 20; i >= 0; i--)
346
-		if (!(inw(ioaddr + EL3_STATUS) & CmdInProgress))
330
+		if (!(inw(nic->ioaddr + EL3_STATUS) & CmdInProgress))
347 331
 			break;
348 332
 
349
-	outw(RxReset, ioaddr + EL3_CMD);
333
+	outw(RxReset, nic->ioaddr + EL3_CMD);
350 334
 	/* Wait a few ticks for the RxReset command to complete. */
351 335
 	for (i = 20; i >= 0; i--)
352
-		if (!(inw(ioaddr + EL3_STATUS) & CmdInProgress))
336
+		if (!(inw(nic->ioaddr + EL3_STATUS) & CmdInProgress))
353 337
 			break;
354 338
 
355
-	outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
339
+	outw(SetStatusEnb | 0x00, nic->ioaddr + EL3_CMD);
356 340
 
357
-	if (corkscrew_debug > 1) {
341
+#ifdef debug_3c515
358 342
 		EL3WINDOW(4);
359
-		printf("FIXME: fix print for irq, not 9");
360
-		printf("corkscrew_open() irq %d media status 0x%hX.\n",
361
-		       9, inw(ioaddr + Wn4_Media));
362
-	}
343
+		DBG ( "FIXME: fix print for irq, not 9" );
344
+		DBG ( "corkscrew_open() irq %d media status 0x%hX.\n",
345
+		      9, inw(nic->ioaddr + Wn4_Media) );
346
+#endif
363 347
 
364 348
 	/* Set the station address and mask in window 2 each time opened. */
365 349
 	EL3WINDOW(2);
366 350
 	for (i = 0; i < 6; i++)
367
-		outb(nic->node_addr[i], ioaddr + i);
351
+		outb(nic->node_addr[i], nic->ioaddr + i);
368 352
 	for (; i < 12; i += 2)
369
-		outw(0, ioaddr + i);
353
+		outw(0, nic->ioaddr + i);
370 354
 
371 355
 	if (if_port == 3)
372 356
 		/* Start the thinnet transceiver. We should really wait 50ms... */
373
-		outw(StartCoax, ioaddr + EL3_CMD);
357
+		outw(StartCoax, nic->ioaddr + EL3_CMD);
374 358
 	EL3WINDOW(4);
375
-	outw((inw(ioaddr + Wn4_Media) & ~(Media_10TP | Media_SQE)) |
376
-	     media_tbl[if_port].media_bits, ioaddr + Wn4_Media);
359
+	outw((inw(nic->ioaddr + Wn4_Media) & ~(Media_10TP | Media_SQE)) |
360
+	     media_tbl[if_port].media_bits, nic->ioaddr + Wn4_Media);
377 361
 
378 362
 	/* Switch to the stats window, and clear all stats by reading. */
379
-/*	outw(StatsDisable, ioaddr + EL3_CMD);*/
363
+/*	outw(StatsDisable, nic->ioaddr + EL3_CMD);*/
380 364
 	EL3WINDOW(6);
381 365
 	for (i = 0; i < 10; i++)
382
-		inb(ioaddr + i);
383
-	inw(ioaddr + 10);
384
-	inw(ioaddr + 12);
366
+		inb(nic->ioaddr + i);
367
+	inw(nic->ioaddr + 10);
368
+	inw(nic->ioaddr + 12);
385 369
 	/* New: On the Vortex we must also clear the BadSSD counter. */
386 370
 	EL3WINDOW(4);
387
-	inb(ioaddr + 12);
371
+	inb(nic->ioaddr + 12);
388 372
 	/* ..and on the Boomerang we enable the extra statistics bits. */
389
-	outw(0x0040, ioaddr + Wn4_NetDiag);
373
+	outw(0x0040, nic->ioaddr + Wn4_NetDiag);
390 374
 
391 375
 	/* Switch to register set 7 for normal use. */
392 376
 	EL3WINDOW(7);
@@ -397,37 +381,36 @@ static void t515_reset(struct nic *nic)
397 381
 	if (vp->full_bus_master_rx) {	/* Boomerang bus master. */
398 382
 		printf("FIXME: Is this if necessary");
399 383
 		vp->cur_rx = vp->dirty_rx = 0;
400
-		if (corkscrew_debug > 2)
401
-			printf("   Filling in the Rx ring.\n");
384
+		DBG ( "   Filling in the Rx ring.\n" );
402 385
 		for (i = 0; i < RX_RING_SIZE; i++) {
403 386
 			printf("FIXME: Is this if necessary");
404 387
 		}
405 388
 	}
406 389
 	if (vp->full_bus_master_tx) {	/* Boomerang bus master Tx. */
407 390
 		vp->cur_tx = vp->dirty_tx = 0;
408
-		outb(PKT_BUF_SZ >> 8, ioaddr + TxFreeThreshold);	/* Room for a packet. */
391
+		outb(PKT_BUF_SZ >> 8, nic->ioaddr + TxFreeThreshold);	/* Room for a packet. */
409 392
 		/* Clear the Tx ring. */
410 393
 		for (i = 0; i < TX_RING_SIZE; i++)
411 394
 			vp->tx_skbuff[i] = 0;
412
-		outl(0, ioaddr + DownListPtr);
395
+		outl(0, nic->ioaddr + DownListPtr);
413 396
 	}
414 397
 	/* Set receiver mode: presumably accept b-case and phys addr only. */
415 398
 	outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
416
-	     ioaddr + EL3_CMD);
399
+	     nic->ioaddr + EL3_CMD);
417 400
 
418
-	outw(RxEnable, ioaddr + EL3_CMD);	/* Enable the receiver. */
419
-	outw(TxEnable, ioaddr + EL3_CMD);	/* Enable transmitter. */
401
+	outw(RxEnable, nic->ioaddr + EL3_CMD);	/* Enable the receiver. */
402
+	outw(TxEnable, nic->ioaddr + EL3_CMD);	/* Enable transmitter. */
420 403
 	/* Allow status bits to be seen. */
421 404
 	outw(SetStatusEnb | AdapterFailure | IntReq | StatsFull |
422 405
 	     (vp->full_bus_master_tx ? DownComplete : TxAvailable) |
423 406
 	     (vp->full_bus_master_rx ? UpComplete : RxComplete) |
424
-	     (vp->bus_master ? DMADone : 0), ioaddr + EL3_CMD);
407
+	     (vp->bus_master ? DMADone : 0), nic->ioaddr + EL3_CMD);
425 408
 	/* Ack all pending events, and set active indicator mask. */
426 409
 	outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
427
-	     ioaddr + EL3_CMD);
410
+	     nic->ioaddr + EL3_CMD);
428 411
 	outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
429 412
 	     | (vp->bus_master ? DMADone : 0) | UpComplete | DownComplete,
430
-	     ioaddr + EL3_CMD);
413
+	     nic->ioaddr + EL3_CMD);
431 414
 
432 415
 }
433 416
 
@@ -439,23 +422,23 @@ static int t515_poll(struct nic *nic, int retrieve)
439 422
 	short status, cst;
440 423
 	register short rx_fifo;
441 424
 
442
-	cst = inw(BASE + EL3_STATUS);
425
+	cst = inw(nic->ioaddr + EL3_STATUS);
443 426
 
444 427
 	if ((cst & RxComplete) == 0) {
445 428
 		/* Ack all pending events, and set active indicator mask. */
446 429
 		outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
447
-		     BASE + EL3_CMD);
430
+		     nic->ioaddr + EL3_CMD);
448 431
 		outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete |
449 432
 		     StatsFull | (vp->
450 433
 				  bus_master ? DMADone : 0) | UpComplete |
451
-		     DownComplete, BASE + EL3_CMD);
434
+		     DownComplete, nic->ioaddr + EL3_CMD);
452 435
 		return 0;
453 436
 	}
454
-	status = inw(BASE + RxStatus);
437
+	status = inw(nic->ioaddr + RxStatus);
455 438
 
456 439
 	if (status & RxDError) {
457 440
 		printf("RxDError\n");
458
-		outw(RxDiscard, BASE + EL3_CMD);
441
+		outw(RxDiscard, nic->ioaddr + EL3_CMD);
459 442
 		return 0;
460 443
 	}
461 444
 
@@ -465,54 +448,46 @@ static int t515_poll(struct nic *nic, int retrieve)
465 448
 
466 449
 	if ( ! retrieve ) return 1;
467 450
 
468
-#ifdef EDEBUG
469
-	printf("[l=%d", rx_fifo);
470
-#endif
471
-	insw(BASE + RX_FIFO, nic->packet, rx_fifo / 2);
451
+	DBG ( "[l=%d", rx_fifo );
452
+	insw(nic->ioaddr + RX_FIFO, nic->packet, rx_fifo / 2);
472 453
 	if (rx_fifo & 1)
473
-		nic->packet[rx_fifo - 1] = inb(BASE + RX_FIFO);
454
+		nic->packet[rx_fifo - 1] = inb(nic->ioaddr + RX_FIFO);
474 455
 	nic->packetlen = rx_fifo;
475 456
 
476 457
 	while (1) {
477
-		status = inw(BASE + RxStatus);
478
-#ifdef EDEBUG
479
-		printf("0x%hX*", status);
480
-#endif
458
+		status = inw(nic->ioaddr + RxStatus);
459
+		DBG ( "0x%hX*", status );
481 460
 		rx_fifo = status & RX_BYTES_MASK;
482 461
 
483 462
 		if (rx_fifo > 0) {
484
-			insw(BASE + RX_FIFO, nic->packet + nic->packetlen,
463
+			insw(nic->ioaddr + RX_FIFO, nic->packet + nic->packetlen,
485 464
 			     rx_fifo / 2);
486 465
 			if (rx_fifo & 1)
487 466
 				nic->packet[nic->packetlen + rx_fifo - 1] =
488
-				    inb(BASE + RX_FIFO);
467
+				    inb(nic->ioaddr + RX_FIFO);
489 468
 			nic->packetlen += rx_fifo;
490
-#ifdef EDEBUG
491
-			printf("+%d", rx_fifo);
492
-#endif
469
+			DBG ( "+%d", rx_fifo );
493 470
 		}
494 471
 		if ((status & RxComplete) == 0) {
495
-#ifdef EDEBUG
496
-			printf("=%d", nic->packetlen);
497
-#endif
472
+			DBG ( "=%d", nic->packetlen );
498 473
 			break;
499 474
 		}
500 475
 		udelay(1000);
501 476
 	}
502 477
 
503 478
 	/* acknowledge reception of packet */
504
-	outw(RxDiscard, BASE + EL3_CMD);
505
-	while (inw(BASE + EL3_STATUS) & CmdInProgress);
506
-#ifdef EDEBUG
479
+	outw(RxDiscard, nic->ioaddr + EL3_CMD);
480
+	while (inw(nic->ioaddr + EL3_STATUS) & CmdInProgress);
481
+#ifdef debug_3c515
507 482
 	{
508 483
 		unsigned short type = 0;
509 484
 		type = (nic->packet[12] << 8) | nic->packet[13];
510 485
 		if (nic->packet[0] + nic->packet[1] + nic->packet[2] +
511 486
 		    nic->packet[3] + nic->packet[4] + nic->packet[5] ==
512 487
 		    0xFF * ETH_ALEN)
513
-			printf(",t=0x%hX,b]", type);
488
+			DBG ( ",t=0x%hX,b]", type );
514 489
 		else
515
-			printf(",t=0x%hX]", type);
490
+			DBG ( ",t=0x%hX]", type );
516 491
 	}
517 492
 #endif
518 493
 
@@ -537,9 +512,7 @@ static void t515_transmit(struct nic *nic, const char *d,	/* Destination */
537 512
 	int pad;
538 513
 	int status;
539 514
 
540
-#ifdef EDEBUG
541
-	printf("{l=%d,t=0x%hX}", s + ETH_HLEN, t);
542
-#endif
515
+	DBG ( "{l=%d,t=0x%hX}", s + ETH_HLEN, t );
543 516
 
544 517
 	/* swap bytes of type */
545 518
 	t = htons(t);
@@ -557,36 +530,36 @@ static void t515_transmit(struct nic *nic, const char *d,	/* Destination */
557 530
 		return;
558 531
 	}
559 532
 	/* drop acknowledgements */
560
-	while ((status = inb(BASE + TxStatus)) & TxComplete) {
533
+	while ((status = inb(nic->ioaddr + TxStatus)) & TxComplete) {
561 534
 		/*if(status & (TXS_UNDERRUN|0x88|TXS_STATUS_OVERFLOW)) { */
562
-		outw(TxReset, BASE + EL3_CMD);
563
-		outw(TxEnable, BASE + EL3_CMD);
535
+		outw(TxReset, nic->ioaddr + EL3_CMD);
536
+		outw(TxEnable, nic->ioaddr + EL3_CMD);
564 537
 /*		}                                                          */
565 538
 
566
-		outb(0x0, BASE + TxStatus);
539
+		outb(0x0, nic->ioaddr + TxStatus);
567 540
 	}
568 541
 
569
-	while (inw(BASE + TxFree) < len + pad + 4) {
542
+	while (inw(nic->ioaddr + TxFree) < len + pad + 4) {
570 543
 		/* no room in FIFO */
571 544
 	}
572 545
 
573
-	outw(len, BASE + TX_FIFO);
574
-	outw(0x0, BASE + TX_FIFO);	/* Second dword meaningless */
546
+	outw(len, nic->ioaddr + TX_FIFO);
547
+	outw(0x0, nic->ioaddr + TX_FIFO);	/* Second dword meaningless */
575 548
 
576 549
 	/* write packet */
577
-	outsw(BASE + TX_FIFO, d, ETH_ALEN / 2);
578
-	outsw(BASE + TX_FIFO, nic->node_addr, ETH_ALEN / 2);
579
-	outw(t, BASE + TX_FIFO);
580
-	outsw(BASE + TX_FIFO, p, s / 2);
550
+	outsw(nic->ioaddr + TX_FIFO, d, ETH_ALEN / 2);
551
+	outsw(nic->ioaddr + TX_FIFO, nic->node_addr, ETH_ALEN / 2);
552
+	outw(t, nic->ioaddr + TX_FIFO);
553
+	outsw(nic->ioaddr + TX_FIFO, p, s / 2);
581 554
 
582 555
 	if (s & 1)
583
-		outb(*(p + s - 1), BASE + TX_FIFO);
556
+		outb(*(p + s - 1), nic->ioaddr + TX_FIFO);
584 557
 
585 558
 	while (pad--)
586
-		outb(0, BASE + TX_FIFO);	/* Padding */
559
+		outb(0, nic->ioaddr + TX_FIFO);	/* Padding */
587 560
 
588 561
 	/* wait for Tx complete */
589
-	while ((inw(BASE + EL3_STATUS) & CmdInProgress) != 0);
562
+	while ((inw(nic->ioaddr + EL3_STATUS) & CmdInProgress) != 0);
590 563
 }
591 564
 
592 565
 /**************************************************************************
@@ -602,15 +575,15 @@ static void t515_disable ( struct nic *nic ) {
602 575
 	   have no way to determine if this works */
603 576
 
604 577
 	/* Disable the receiver and transmitter. */
605
-	outw(RxDisable, BASE + EL3_CMD);
606
-	outw(TxDisable, BASE + EL3_CMD);
578
+	outw(RxDisable, nic->ioaddr + EL3_CMD);
579
+	outw(TxDisable, nic->ioaddr + EL3_CMD);
607 580
 
608 581
 	if (if_port == XCVR_10base2)
609 582
 		/* Turn off thinnet power.  Green! */
610
-		outw(StopCoax, BASE + EL3_CMD);
583
+		outw(StopCoax, nic->ioaddr + EL3_CMD);
611 584
 
612 585
 
613
-	outw(SetIntrEnb | 0x0000, BASE + EL3_CMD);
586
+	outw(SetIntrEnb | 0x0000, nic->ioaddr + EL3_CMD);
614 587
 #ifdef ISA_PNP
615 588
 	/*Deactivate */
616 589
 /*    ACTIVATE;
@@ -632,61 +605,6 @@ static void t515_irq(struct nic *nic __unused, irq_action_t action __unused)
632 605
   }
633 606
 }
634 607
 
635
-/**************************************************************************
636
-PROBE - Look for an adapter, this routine's visible to the outside
637
-You should omit the last argument struct pci_device * for a non-PCI NIC
638
-***************************************************************************/
639
-void config_pnp_device(void);
640
-
641
-static int t515_probe(struct dev *dev,
642
-		      unsigned short *probe_addrs __unused)
643
-{
644
-	struct nic *nic = (struct nic *) dev;
645
-	/* Direct copy from Beckers 3c515.c removing any ISAPNP sections */
646
-	int cards_found = 0;
647
-	static int ioaddr;
648
-#ifdef ISA_PNP
649
-	config_pnp_device();
650
-#endif
651
-	/* Check all locations on the ISA bus -- evil! */
652
-	for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x20) {
653
-		int irq;
654
-
655
-		/* Check the resource configuration for a matching ioaddr. */
656
-		if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0))
657
-			continue;
658
-		/* Verify by reading the device ID from the EEPROM. */
659
-		{
660
-			int timer;
661
-			outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd);
662
-			/* Pause for at least 162 us. for the read to take place. */
663
-			for (timer = 4; timer >= 0; timer--) {
664
-				t3c515_wait(1);
665
-				if ((inw(ioaddr + Wn0EepromCmd) & 0x0200)
666
-				    == 0)
667
-					break;
668
-			}
669
-			if (inw(ioaddr + Wn0EepromData) != 0x6d50)
670
-				continue;
671
-		}
672
-		printf
673
-		    ("3c515 Resource configuration register 0x%hX, DCR 0x%hX.\n",
674
-		     inl(ioaddr + 0x2002), inw(ioaddr + 0x2000));
675
-		irq = inw(ioaddr + 0x2002) & 15;
676
-		BASE = ioaddr;
677
-		corkscrew_found_device(BASE, irq, CORKSCREW_ID,
678
-				       options[cards_found], nic);
679
-		cards_found++;
680
-	}
681
-	if (corkscrew_debug)
682
-		printf("%d 3c515 cards found.\n", cards_found);
683
-
684
-	if (cards_found > 0) {
685
-		t515_reset(nic);
686
-
687
-		nic->irqno    = 0;
688
-		nic->ioaddr   = BASE;
689
-static struct nic_operations t515_operations;
690 608
 static struct nic_operations t515_operations = {
691 609
 	.connect	= dummy_connect,
692 610
 	.poll		= t515_poll,
@@ -694,15 +612,50 @@ static struct nic_operations t515_operations = {
694 612
 	.irq		= t515_irq,
695 613
 	.disable	= t515_disable,
696 614
 };
697
-		nic->nic_op	= &t515_operations;
698 615
 
699
-		/* Based on PnP ISA map */
700
-		dev->devid.vendor_id = htons(ISAPNP_VENDOR('T', 'C', 'M'));
701
-		dev->devid.device_id = htons(0x5051);
702
-		return 1;
703
-	} else
616
+/**************************************************************************
617
+PROBE - Look for an adapter, this routine's visible to the outside
618
+You should omit the last argument struct pci_device * for a non-PCI NIC
619
+***************************************************************************/
620
+static int t515_probe ( struct dev *dev, struct isapnp_device *isapnp ) {
621
+	struct nic *nic = nic_device ( dev );
622
+	/* Direct copy from Beckers 3c515.c removing any ISAPNP sections */
623
+
624
+	nic->ioaddr = isapnp->ioaddr;
625
+	nic->irqno = isapnp->irqno;
626
+	activate_isapnp_device ( isapnp, 1 );
627
+
628
+	/* Check the resource configuration for a matching ioaddr. */
629
+	if ((unsigned)(inw(nic->ioaddr + 0x2002) & 0x1f0)
630
+	    != (nic->ioaddr & 0x1f0)) {
631
+		DBG ( "3c515 ioaddr mismatch\n" );
704 632
 		return 0;
633
+	}
634
+
635
+	/* Verify by reading the device ID from the EEPROM. */
636
+	{
637
+		int timer;
638
+		outw(EEPROM_Read + 7, nic->ioaddr + Wn0EepromCmd);
639
+		/* Pause for at least 162 us. for the read to take place. */
640
+		for (timer = 4; timer >= 0; timer--) {
641
+			t3c515_wait(1);
642
+			if ((inw(nic->ioaddr + Wn0EepromCmd) & 0x0200) == 0)
643
+				break;
644
+		}
645
+		if (inw(nic->ioaddr + Wn0EepromData) != 0x6d50) {
646
+			DBG ( "3c515 read incorrect vendor ID from EEPROM" );
647
+			return 0;
648
+		}
705 649
 
650
+	}
651
+	DBG ( "3c515 Resource configuration register 0x%hX, DCR 0x%hX.\n",
652
+	      inl(nic->ioaddr + 0x2002), inw(nic->ioaddr + 0x2000) );
653
+	corkscrew_found_device(nic->ioaddr, nic->irqno, CORKSCREW_ID,
654
+			       options, nic);
655
+	
656
+	t515_reset(nic);	
657
+	nic->nic_op	= &t515_operations;
658
+	return 1;
706 659
 }
707 660
 
708 661
 static int
@@ -733,7 +686,6 @@ corkscrew_probe1(int ioaddr, int irq, int product_index __unused,
733 686
 {
734 687
 	unsigned int eeprom[0x40], checksum = 0;	/* EEPROM contents */
735 688
 	int i;
736
-	ioaddr = BASE;
737 689
 
738 690
 	printf("3Com %s at 0x%hX, ", vp->product_name, ioaddr);
739 691
 
@@ -750,9 +702,7 @@ corkscrew_probe1(int ioaddr, int irq, int product_index __unused,
750 702
 				break;
751 703
 		}
752 704
 		eeprom[i] = inw(ioaddr + Wn0EepromData);
753
-#ifdef EDEBUG1
754
-		printf("Value %d: %hX        ", i, eeprom[i]);
755
-#endif
705
+		DBG ( "Value %d: %hX        ", i, eeprom[i] );
756 706
 		checksum ^= eeprom[i];
757 707
 		if (i < 3)
758 708
 			phys_addr[i] = htons(eeprom[i]);
@@ -767,9 +717,9 @@ corkscrew_probe1(int ioaddr, int irq, int product_index __unused,
767 717
 	}
768 718
 	printf(", IRQ %d\n", irq);
769 719
 	/* Tell them about an invalid IRQ. */
770
-	if (corkscrew_debug && (irq <= 0 || irq > 15))
771
-		printf
772
-		    (" *** Warning: this IRQ is unlikely to work! ***\n");
720
+	if ( (irq <= 0 || irq > 15) ) {
721
+		DBG (" *** Warning: this IRQ is unlikely to work! ***\n" );
722
+	}
773 723
 
774 724
 	{
775 725
 		char *ram_split[] = { "5:3", "3:1", "1:1", "3:5" };
@@ -777,10 +727,9 @@ corkscrew_probe1(int ioaddr, int irq, int product_index __unused,
777 727
 		EL3WINDOW(3);
778 728
 		vp->available_media = inw(ioaddr + Wn3_Options);
779 729
 		config.i = inl(ioaddr + Wn3_Config);
780
-		if (corkscrew_debug > 1)
781
-			printf
782
-			    ("  Internal config register is %4.4x, transceivers 0x%hX.\n",
783
-			     config.i, inw(ioaddr + Wn3_Options));
730
+		DBG ( "  Internal config register is %4.4x, "
731
+		      "transceivers 0x%hX.\n",
732
+		      config.i, inw(ioaddr + Wn3_Options) );
784 733
 		printf
785 734
 		    ("  %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
786 735
 		     8 << config.u.ram_size,
@@ -808,10 +757,14 @@ corkscrew_probe1(int ioaddr, int irq, int product_index __unused,
808 757
 	return 0;
809 758
 }
810 759
 
811
-static struct isa_driver t515_driver __isa_driver = {
812
-	.type = NIC_DRIVER,
813
-	.name = "3C515",
814
-	.probe = t515_probe,
815
-	.ioaddrs = 0,
760
+static struct isapnp_id t515_adapters[] = {
761
+	{ "3c515 (ISAPnP)", ISAPNP_VENDOR('T','C','M'), 0x5051 },
816 762
 };
817
-ISA_ROM("3c515","3c515, Fast EtherLink ISA");
763
+
764
+static struct isapnp_driver t515_driver =
765
+	ISAPNP_DRIVER ( "3c515", t515_adapters );
766
+
767
+BOOT_DRIVER ( "3c515", find_isapnp_boot_device, t515_driver,
768
+	      t515_probe );
769
+
770
+ISA_ROM ( "3c515", "3c515 Fast EtherLink ISAPnP" );

Загрузка…
Отмена
Сохранить