aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/dm9000.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/dm9000.c')
-rw-r--r--drivers/net/dm9000.c54
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 */
346static 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
770void 785static void
771dm9000_tx_done(struct net_device *dev, board_info_t * db) 786dm9000_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
1189static struct platform_driver dm9000_driver = { 1204static 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
1199static int __init 1215static int __init