📄 linux下8019驱动程序.txt
字号:
326 SA_prom[i] = inb(ioaddr + NE_DATAPORT);
327 SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
328 if (SA_prom[i] != SA_prom[i+1])
329 wordlength = 1;
330 }
331
332 if (wordlength == 2)
333 {
334 for (i = 0; i < 16; i++)
335 SA_prom[i] = SA_prom[i+i];
336 /* We must set the 8390 for word mode. */
337 outb_p(0x49, ioaddr + EN0_DCFG);
338 start_page = NESM_START_PG;
339 stop_page = NESM_STOP_PG;
340 } else {
341 start_page = NE1SM_START_PG;
342 stop_page = NE1SM_STOP_PG;
343 }
344
345 neX000 = (SA_prom[14] == 0x57 && SA_prom[15] == 0x57);
346 ctron = (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
347 copam = (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);
348
349 /* Set up the rest of the parameters. */
350 if (neX000 || bad_card || copam) {
351 name = (wordlength == 2) ? "NE2000" : "NE1000";
352 }
353 else if (ctron)
354 {
355 name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";
356 start_page = 0x01;
357 stop_page = (wordlength == 2) ? 0x40 : 0x20;
358 }
359 else
360 {
361 #ifdef SUPPORT_NE_BAD_CLONES
362 /* Ack! Well, there might be a *bad* NE*000 clone there.
363 Check for total bogus addresses. */
364 for (i = 0; bad_clone_list[i].name8; i++)
365 {
366 if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&
367 SA_prom[1] == bad_clone_list[i].SAprefix[1] &&
368 SA_prom[2] == bad_clone_list[i].SAprefix[2])
369 {
370 if (wordlength == 2)
371 {
372 name = bad_clone_list[i].name16;
373 } else {
374 name = bad_clone_list[i].name8;
375 }
376 break;
377 }
378 }
379 if (bad_clone_list[i].name8 == NULL)
380 {
381 printk(" not found (invalid signature %2.2x %2.2x).\n",
382 SA_prom[14], SA_prom[15]);
383 ret = -ENXIO;
384 goto err_out;
385 }
386 #else
387 printk(" not found.\n");
388 ret = -ENXIO;
389 goto err_out;
390 #endif
391 }
392
393 if (dev->irq < 2)
394 {
395 unsigned long cookie = probe_irq_on();
396 outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */
397 outb_p(0x00, ioaddr + EN0_RCNTLO);
398 outb_p(0x00, ioaddr + EN0_RCNTHI);
399 outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */
400 mdelay(10); /* wait 10ms for interrupt to propagate */
401 outb_p(0x00, ioaddr + EN0_IMR); /* Mask it again. */
402 dev->irq = probe_irq_off(cookie);
403 if (ei_debug > 2)
404 printk(" autoirq is %d\n", dev->irq);
405 } else if (dev->irq == 2)
406 /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
407 or don't know which one to set. */
408 dev->irq = 9;
409
410 if (! dev->irq) {
411 printk(" failed to detect IRQ line.\n");
412 ret = -EAGAIN;
413 goto err_out;
414 }
415
416 /* Allocate dev->priv and fill in 8390 specific dev fields. */
417 if (ethdev_init(dev))
418 {
419 printk (" unable to get memory for dev->priv.\n");
420 ret = -ENOMEM;
421 goto err_out;
422 }
423
424 /* Snarf the interrupt now. There's no point in waiting since we cannot
425 share and the board will usually be enabled. */
426 ret = request_irq(dev->irq, ei_interrupt, 0, name, dev);
427 if (ret) {
428 printk (" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);
429 goto err_out_kfree;
430 }
431
432 dev->base_addr = ioaddr;
433
434 for(i = 0; i < ETHER_ADDR_LEN; i++) {
435 printk(" %2.2x", SA_prom[i]);
436 dev->dev_addr[i] = SA_prom[i];
437 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -