diff options
Diffstat (limited to 'drivers/net/dm9000.c')
-rw-r--r-- | drivers/net/dm9000.c | 54 |
1 files changed, 35 insertions, 19 deletions
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 24996da4c1c4..a860ebbbf815 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c | |||
@@ -339,6 +339,17 @@ static void dm9000_timeout(struct net_device *dev) | |||
339 | spin_unlock_irqrestore(&db->lock,flags); | 339 | spin_unlock_irqrestore(&db->lock,flags); |
340 | } | 340 | } |
341 | 341 | ||
342 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
343 | /* | ||
344 | *Used by netconsole | ||
345 | */ | ||
346 | static void dm9000_poll_controller(struct net_device *dev) | ||
347 | { | ||
348 | disable_irq(dev->irq); | ||
349 | dm9000_interrupt(dev->irq,dev,NULL); | ||
350 | enable_irq(dev->irq); | ||
351 | } | ||
352 | #endif | ||
342 | 353 | ||
343 | /* dm9000_release_board | 354 | /* dm9000_release_board |
344 | * | 355 | * |
@@ -366,8 +377,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db) | |||
366 | kfree(db->data_req); | 377 | kfree(db->data_req); |
367 | } | 378 | } |
368 | 379 | ||
369 | if (db->addr_res != NULL) { | 380 | if (db->addr_req != NULL) { |
370 | release_resource(db->addr_res); | 381 | release_resource(db->addr_req); |
371 | kfree(db->addr_req); | 382 | kfree(db->addr_req); |
372 | } | 383 | } |
373 | } | 384 | } |
@@ -410,10 +421,7 @@ dm9000_probe(struct platform_device *pdev) | |||
410 | if (pdev->num_resources < 2) { | 421 | if (pdev->num_resources < 2) { |
411 | ret = -ENODEV; | 422 | ret = -ENODEV; |
412 | goto out; | 423 | goto out; |
413 | } | 424 | } else if (pdev->num_resources == 2) { |
414 | |||
415 | switch (pdev->num_resources) { | ||
416 | case 2: | ||
417 | base = pdev->resource[0].start; | 425 | base = pdev->resource[0].start; |
418 | 426 | ||
419 | if (!request_mem_region(base, 4, ndev->name)) { | 427 | if (!request_mem_region(base, 4, ndev->name)) { |
@@ -423,17 +431,16 @@ dm9000_probe(struct platform_device *pdev) | |||
423 | 431 | ||
424 | ndev->base_addr = base; | 432 | ndev->base_addr = base; |
425 | ndev->irq = pdev->resource[1].start; | 433 | ndev->irq = pdev->resource[1].start; |
426 | db->io_addr = (void *)base; | 434 | db->io_addr = (void __iomem *)base; |
427 | db->io_data = (void *)(base + 4); | 435 | db->io_data = (void __iomem *)(base + 4); |
428 | |||
429 | break; | ||
430 | 436 | ||
431 | case 3: | 437 | } else { |
432 | db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 438 | db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
433 | db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 439 | db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
434 | db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 440 | db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
435 | 441 | ||
436 | if (db->addr_res == NULL || db->data_res == NULL) { | 442 | if (db->addr_res == NULL || db->data_res == NULL || |
443 | db->irq_res == NULL) { | ||
437 | printk(KERN_ERR PFX "insufficient resources\n"); | 444 | printk(KERN_ERR PFX "insufficient resources\n"); |
438 | ret = -ENOENT; | 445 | ret = -ENOENT; |
439 | goto out; | 446 | goto out; |
@@ -482,7 +489,6 @@ dm9000_probe(struct platform_device *pdev) | |||
482 | 489 | ||
483 | /* ensure at least we have a default set of IO routines */ | 490 | /* ensure at least we have a default set of IO routines */ |
484 | dm9000_set_io(db, iosize); | 491 | dm9000_set_io(db, iosize); |
485 | |||
486 | } | 492 | } |
487 | 493 | ||
488 | /* check to see if anything is being over-ridden */ | 494 | /* check to see if anything is being over-ridden */ |
@@ -543,6 +549,9 @@ dm9000_probe(struct platform_device *pdev) | |||
543 | ndev->stop = &dm9000_stop; | 549 | ndev->stop = &dm9000_stop; |
544 | ndev->get_stats = &dm9000_get_stats; | 550 | ndev->get_stats = &dm9000_get_stats; |
545 | ndev->set_multicast_list = &dm9000_hash_table; | 551 | ndev->set_multicast_list = &dm9000_hash_table; |
552 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
553 | ndev->poll_controller = &dm9000_poll_controller; | ||
554 | #endif | ||
546 | 555 | ||
547 | #ifdef DM9000_PROGRAM_EEPROM | 556 | #ifdef DM9000_PROGRAM_EEPROM |
548 | program_eeprom(db); | 557 | program_eeprom(db); |
@@ -564,6 +573,13 @@ dm9000_probe(struct platform_device *pdev) | |||
564 | for (i = 0; i < 6; i++) | 573 | for (i = 0; i < 6; i++) |
565 | ndev->dev_addr[i] = db->srom[i]; | 574 | ndev->dev_addr[i] = db->srom[i]; |
566 | 575 | ||
576 | if (!is_valid_ether_addr(ndev->dev_addr)) { | ||
577 | /* try reading from mac */ | ||
578 | |||
579 | for (i = 0; i < 6; i++) | ||
580 | ndev->dev_addr[i] = ior(db, i+DM9000_PAR); | ||
581 | } | ||
582 | |||
567 | if (!is_valid_ether_addr(ndev->dev_addr)) | 583 | if (!is_valid_ether_addr(ndev->dev_addr)) |
568 | printk("%s: Invalid ethernet MAC address. Please " | 584 | printk("%s: Invalid ethernet MAC address. Please " |
569 | "set using ifconfig\n", ndev->name); | 585 | "set using ifconfig\n", ndev->name); |
@@ -601,7 +617,7 @@ dm9000_open(struct net_device *dev) | |||
601 | 617 | ||
602 | PRINTK2("entering dm9000_open\n"); | 618 | PRINTK2("entering dm9000_open\n"); |
603 | 619 | ||
604 | if (request_irq(dev->irq, &dm9000_interrupt, SA_SHIRQ, dev->name, dev)) | 620 | if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev)) |
605 | return -EAGAIN; | 621 | return -EAGAIN; |
606 | 622 | ||
607 | /* Initialize DM9000 board */ | 623 | /* Initialize DM9000 board */ |
@@ -663,7 +679,6 @@ dm9000_init_dm9000(struct net_device *dev) | |||
663 | db->tx_pkt_cnt = 0; | 679 | db->tx_pkt_cnt = 0; |
664 | db->queue_pkt_len = 0; | 680 | db->queue_pkt_len = 0; |
665 | dev->trans_start = 0; | 681 | dev->trans_start = 0; |
666 | spin_lock_init(&db->lock); | ||
667 | } | 682 | } |
668 | 683 | ||
669 | /* | 684 | /* |
@@ -767,7 +782,7 @@ dm9000_stop(struct net_device *ndev) | |||
767 | * receive the packet to upper layer, free the transmitted packet | 782 | * receive the packet to upper layer, free the transmitted packet |
768 | */ | 783 | */ |
769 | 784 | ||
770 | void | 785 | static void |
771 | dm9000_tx_done(struct net_device *dev, board_info_t * db) | 786 | dm9000_tx_done(struct net_device *dev, board_info_t * db) |
772 | { | 787 | { |
773 | int tx_status = ior(db, DM9000_NSR); /* Got TX status */ | 788 | int tx_status = ior(db, DM9000_NSR); /* Got TX status */ |
@@ -1187,13 +1202,14 @@ dm9000_drv_remove(struct platform_device *pdev) | |||
1187 | } | 1202 | } |
1188 | 1203 | ||
1189 | static struct platform_driver dm9000_driver = { | 1204 | static struct platform_driver dm9000_driver = { |
1205 | .driver = { | ||
1206 | .name = "dm9000", | ||
1207 | .owner = THIS_MODULE, | ||
1208 | }, | ||
1190 | .probe = dm9000_probe, | 1209 | .probe = dm9000_probe, |
1191 | .remove = dm9000_drv_remove, | 1210 | .remove = dm9000_drv_remove, |
1192 | .suspend = dm9000_drv_suspend, | 1211 | .suspend = dm9000_drv_suspend, |
1193 | .resume = dm9000_drv_resume, | 1212 | .resume = dm9000_drv_resume, |
1194 | .driver = { | ||
1195 | .name = "dm9000", | ||
1196 | }, | ||
1197 | }; | 1213 | }; |
1198 | 1214 | ||
1199 | static int __init | 1215 | static int __init |