aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/fddi
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@linux-mips.org>2014-11-21 09:10:08 -0500
committerDavid S. Miller <davem@davemloft.net>2014-11-21 16:37:13 -0500
commit4d0438e56a8f9a1a18ba31bd53b9dc67af224980 (patch)
tree2658bdb4bef662c7febf304de65b6bd15a05dd32 /drivers/net/fddi
parent6a931423c918633d4d0cda96df042d7e44ad06b0 (diff)
defxx: Clean up DEFEA resource management
Reserve DEFEA resources according to actual use. There are three regions, for the ESIC ASIC's CSRs, for the discrete Burst Holdoff register, and for the PDQ ASIC's CSRs. The latter is mapped in the memory or port I/O address space depending on configuration. The two formers are hardwired and always mapped in the port I/O address space. Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/fddi')
-rw-r--r--drivers/net/fddi/defxx.c115
-rw-r--r--drivers/net/fddi/defxx.h2
2 files changed, 80 insertions, 37 deletions
diff --git a/drivers/net/fddi/defxx.c b/drivers/net/fddi/defxx.c
index d057d9c2cf5e..7f975a2c8990 100644
--- a/drivers/net/fddi/defxx.c
+++ b/drivers/net/fddi/defxx.c
@@ -414,7 +414,7 @@ static void dfx_port_read_long(DFX_board_t *bp, int offset, u32 *data)
414 * ================ 414 * ================
415 * 415 *
416 * Overview: 416 * Overview:
417 * Retrieves the address range used to access control and status 417 * Retrieves the address ranges used to access control and status
418 * registers. 418 * registers.
419 * 419 *
420 * Returns: 420 * Returns:
@@ -422,8 +422,8 @@ static void dfx_port_read_long(DFX_board_t *bp, int offset, u32 *data)
422 * 422 *
423 * Arguments: 423 * Arguments:
424 * bdev - pointer to device information 424 * bdev - pointer to device information
425 * bar_start - pointer to store the start address 425 * bar_start - pointer to store the start addresses
426 * bar_len - pointer to store the length of the area 426 * bar_len - pointer to store the lengths of the areas
427 * 427 *
428 * Assumptions: 428 * Assumptions:
429 * I am sure there are some. 429 * I am sure there are some.
@@ -442,8 +442,10 @@ static void dfx_get_bars(struct device *bdev,
442 if (dfx_bus_pci) { 442 if (dfx_bus_pci) {
443 int num = dfx_use_mmio ? 0 : 1; 443 int num = dfx_use_mmio ? 0 : 1;
444 444
445 *bar_start = pci_resource_start(to_pci_dev(bdev), num); 445 bar_start[0] = pci_resource_start(to_pci_dev(bdev), num);
446 *bar_len = pci_resource_len(to_pci_dev(bdev), num); 446 bar_len[0] = pci_resource_len(to_pci_dev(bdev), num);
447 bar_start[2] = bar_start[1] = 0;
448 bar_len[2] = bar_len[1] = 0;
447 } 449 }
448 if (dfx_bus_eisa) { 450 if (dfx_bus_eisa) {
449 unsigned long base_addr = to_eisa_device(bdev)->base_addr; 451 unsigned long base_addr = to_eisa_device(bdev)->base_addr;
@@ -457,24 +459,30 @@ static void dfx_get_bars(struct device *bdev,
457 bar_lo <<= 8; 459 bar_lo <<= 8;
458 bar_lo |= inb(base_addr + PI_ESIC_K_MEM_ADD_LO_CMP_0); 460 bar_lo |= inb(base_addr + PI_ESIC_K_MEM_ADD_LO_CMP_0);
459 bar_lo <<= 8; 461 bar_lo <<= 8;
460 *bar_start = bar_lo; 462 bar_start[0] = bar_lo;
461 bar_hi = inb(base_addr + PI_ESIC_K_MEM_ADD_HI_CMP_2); 463 bar_hi = inb(base_addr + PI_ESIC_K_MEM_ADD_HI_CMP_2);
462 bar_hi <<= 8; 464 bar_hi <<= 8;
463 bar_hi |= inb(base_addr + PI_ESIC_K_MEM_ADD_HI_CMP_1); 465 bar_hi |= inb(base_addr + PI_ESIC_K_MEM_ADD_HI_CMP_1);
464 bar_hi <<= 8; 466 bar_hi <<= 8;
465 bar_hi |= inb(base_addr + PI_ESIC_K_MEM_ADD_HI_CMP_0); 467 bar_hi |= inb(base_addr + PI_ESIC_K_MEM_ADD_HI_CMP_0);
466 bar_hi <<= 8; 468 bar_hi <<= 8;
467 *bar_len = ((bar_hi - bar_lo) | PI_MEM_ADD_MASK_M) + 1; 469 bar_len[0] = ((bar_hi - bar_lo) | PI_MEM_ADD_MASK_M) +
470 1;
468 } else { 471 } else {
469 *bar_start = base_addr; 472 bar_start[0] = base_addr;
470 *bar_len = PI_ESIC_K_CSR_IO_LEN + 473 bar_len[0] = PI_ESIC_K_CSR_IO_LEN;
471 PI_ESIC_K_BURST_HOLDOFF_LEN;
472 } 474 }
475 bar_start[1] = base_addr + PI_DEFEA_K_BURST_HOLDOFF;
476 bar_len[1] = PI_ESIC_K_BURST_HOLDOFF_LEN;
477 bar_start[2] = base_addr + PI_ESIC_K_ESIC_CSR;
478 bar_len[2] = PI_ESIC_K_ESIC_CSR_LEN;
473 } 479 }
474 if (dfx_bus_tc) { 480 if (dfx_bus_tc) {
475 *bar_start = to_tc_dev(bdev)->resource.start + 481 bar_start[0] = to_tc_dev(bdev)->resource.start +
476 PI_TC_K_CSR_OFFSET; 482 PI_TC_K_CSR_OFFSET;
477 *bar_len = PI_TC_K_CSR_LEN; 483 bar_len[0] = PI_TC_K_CSR_LEN;
484 bar_start[2] = bar_start[1] = 0;
485 bar_len[2] = bar_len[1] = 0;
478 } 486 }
479} 487}
480 488
@@ -525,8 +533,8 @@ static int dfx_register(struct device *bdev)
525 const char *print_name = dev_name(bdev); 533 const char *print_name = dev_name(bdev);
526 struct net_device *dev; 534 struct net_device *dev;
527 DFX_board_t *bp; /* board pointer */ 535 DFX_board_t *bp; /* board pointer */
528 resource_size_t bar_start = 0; /* pointer to port */ 536 resource_size_t bar_start[3]; /* pointers to ports */
529 resource_size_t bar_len = 0; /* resource length */ 537 resource_size_t bar_len[3]; /* resource length */
530 int alloc_size; /* total buffer size used */ 538 int alloc_size; /* total buffer size used */
531 struct resource *region; 539 struct resource *region;
532 int err = 0; 540 int err = 0;
@@ -559,8 +567,8 @@ static int dfx_register(struct device *bdev)
559 bp->bus_dev = bdev; 567 bp->bus_dev = bdev;
560 dev_set_drvdata(bdev, dev); 568 dev_set_drvdata(bdev, dev);
561 569
562 dfx_get_bars(bdev, &bar_start, &bar_len); 570 dfx_get_bars(bdev, bar_start, bar_len);
563 if (dfx_bus_eisa && dfx_use_mmio && bar_start == 0) { 571 if (dfx_bus_eisa && dfx_use_mmio && bar_start[0] == 0) {
564 pr_err("%s: Cannot use MMIO, no address set, aborting\n", 572 pr_err("%s: Cannot use MMIO, no address set, aborting\n",
565 print_name); 573 print_name);
566 pr_err("%s: Run ECU and set adapter's MMIO location\n", 574 pr_err("%s: Run ECU and set adapter's MMIO location\n",
@@ -572,28 +580,49 @@ static int dfx_register(struct device *bdev)
572 } 580 }
573 581
574 if (dfx_use_mmio) 582 if (dfx_use_mmio)
575 region = request_mem_region(bar_start, bar_len, print_name); 583 region = request_mem_region(bar_start[0], bar_len[0],
584 print_name);
576 else 585 else
577 region = request_region(bar_start, bar_len, print_name); 586 region = request_region(bar_start[0], bar_len[0], print_name);
578 if (!region) { 587 if (!region) {
579 printk(KERN_ERR "%s: Cannot reserve I/O resource " 588 pr_err("%s: Cannot reserve %s resource 0x%lx @ 0x%lx, "
580 "0x%lx @ 0x%lx, aborting\n", 589 "aborting\n", dfx_use_mmio ? "MMIO" : "I/O", print_name,
581 print_name, (long)bar_len, (long)bar_start); 590 (long)bar_len[0], (long)bar_start[0]);
582 err = -EBUSY; 591 err = -EBUSY;
583 goto err_out_disable; 592 goto err_out_disable;
584 } 593 }
594 if (bar_start[1] != 0) {
595 region = request_region(bar_start[1], bar_len[1], print_name);
596 if (!region) {
597 pr_err("%s: Cannot reserve I/O resource "
598 "0x%lx @ 0x%lx, aborting\n", print_name,
599 (long)bar_len[1], (long)bar_start[1]);
600 err = -EBUSY;
601 goto err_out_csr_region;
602 }
603 }
604 if (bar_start[2] != 0) {
605 region = request_region(bar_start[2], bar_len[2], print_name);
606 if (!region) {
607 pr_err("%s: Cannot reserve I/O resource "
608 "0x%lx @ 0x%lx, aborting\n", print_name,
609 (long)bar_len[2], (long)bar_start[2]);
610 err = -EBUSY;
611 goto err_out_bh_region;
612 }
613 }
585 614
586 /* Set up I/O base address. */ 615 /* Set up I/O base address. */
587 if (dfx_use_mmio) { 616 if (dfx_use_mmio) {
588 bp->base.mem = ioremap_nocache(bar_start, bar_len); 617 bp->base.mem = ioremap_nocache(bar_start[0], bar_len[0]);
589 if (!bp->base.mem) { 618 if (!bp->base.mem) {
590 printk(KERN_ERR "%s: Cannot map MMIO\n", print_name); 619 printk(KERN_ERR "%s: Cannot map MMIO\n", print_name);
591 err = -ENOMEM; 620 err = -ENOMEM;
592 goto err_out_region; 621 goto err_out_esic_region;
593 } 622 }
594 } else { 623 } else {
595 bp->base.port = bar_start; 624 bp->base.port = bar_start[0];
596 dev->base_addr = bar_start; 625 dev->base_addr = bar_start[0];
597 } 626 }
598 627
599 /* Initialize new device structure */ 628 /* Initialize new device structure */
@@ -602,7 +631,7 @@ static int dfx_register(struct device *bdev)
602 if (dfx_bus_pci) 631 if (dfx_bus_pci)
603 pci_set_master(to_pci_dev(bdev)); 632 pci_set_master(to_pci_dev(bdev));
604 633
605 if (dfx_driver_init(dev, print_name, bar_start) != DFX_K_SUCCESS) { 634 if (dfx_driver_init(dev, print_name, bar_start[0]) != DFX_K_SUCCESS) {
606 err = -ENODEV; 635 err = -ENODEV;
607 goto err_out_unmap; 636 goto err_out_unmap;
608 } 637 }
@@ -630,11 +659,19 @@ err_out_unmap:
630 if (dfx_use_mmio) 659 if (dfx_use_mmio)
631 iounmap(bp->base.mem); 660 iounmap(bp->base.mem);
632 661
633err_out_region: 662err_out_esic_region:
663 if (bar_start[2] != 0)
664 release_region(bar_start[2], bar_len[2]);
665
666err_out_bh_region:
667 if (bar_start[1] != 0)
668 release_region(bar_start[1], bar_len[1]);
669
670err_out_csr_region:
634 if (dfx_use_mmio) 671 if (dfx_use_mmio)
635 release_mem_region(bar_start, bar_len); 672 release_mem_region(bar_start[0], bar_len[0]);
636 else 673 else
637 release_region(bar_start, bar_len); 674 release_region(bar_start[0], bar_len[0]);
638 675
639err_out_disable: 676err_out_disable:
640 if (dfx_bus_pci) 677 if (dfx_bus_pci)
@@ -1085,8 +1122,8 @@ static int dfx_driver_init(struct net_device *dev, const char *print_name,
1085 board_name = "DEFEA"; 1122 board_name = "DEFEA";
1086 if (dfx_bus_pci) 1123 if (dfx_bus_pci)
1087 board_name = "DEFPA"; 1124 board_name = "DEFPA";
1088 pr_info("%s: %s at %saddr = 0x%llx, IRQ = %d, Hardware addr = %pMF\n", 1125 pr_info("%s: %s at %s addr = 0x%llx, IRQ = %d, Hardware addr = %pMF\n",
1089 print_name, board_name, dfx_use_mmio ? "" : "I/O ", 1126 print_name, board_name, dfx_use_mmio ? "MMIO" : "I/O",
1090 (long long)bar_start, dev->irq, dev->dev_addr); 1127 (long long)bar_start, dev->irq, dev->dev_addr);
1091 1128
1092 /* 1129 /*
@@ -3660,8 +3697,8 @@ static void dfx_unregister(struct device *bdev)
3660 int dfx_bus_pci = dev_is_pci(bdev); 3697 int dfx_bus_pci = dev_is_pci(bdev);
3661 int dfx_bus_tc = DFX_BUS_TC(bdev); 3698 int dfx_bus_tc = DFX_BUS_TC(bdev);
3662 int dfx_use_mmio = DFX_MMIO || dfx_bus_tc; 3699 int dfx_use_mmio = DFX_MMIO || dfx_bus_tc;
3663 resource_size_t bar_start = 0; /* pointer to port */ 3700 resource_size_t bar_start[3]; /* pointers to ports */
3664 resource_size_t bar_len = 0; /* resource length */ 3701 resource_size_t bar_len[3]; /* resource lengths */
3665 int alloc_size; /* total buffer size used */ 3702 int alloc_size; /* total buffer size used */
3666 3703
3667 unregister_netdev(dev); 3704 unregister_netdev(dev);
@@ -3679,12 +3716,16 @@ static void dfx_unregister(struct device *bdev)
3679 3716
3680 dfx_bus_uninit(dev); 3717 dfx_bus_uninit(dev);
3681 3718
3682 dfx_get_bars(bdev, &bar_start, &bar_len); 3719 dfx_get_bars(bdev, bar_start, bar_len);
3720 if (bar_start[2] != 0)
3721 release_region(bar_start[2], bar_len[2]);
3722 if (bar_start[1] != 0)
3723 release_region(bar_start[1], bar_len[1]);
3683 if (dfx_use_mmio) { 3724 if (dfx_use_mmio) {
3684 iounmap(bp->base.mem); 3725 iounmap(bp->base.mem);
3685 release_mem_region(bar_start, bar_len); 3726 release_mem_region(bar_start[0], bar_len[0]);
3686 } else 3727 } else
3687 release_region(bar_start, bar_len); 3728 release_region(bar_start[0], bar_len[0]);
3688 3729
3689 if (dfx_bus_pci) 3730 if (dfx_bus_pci)
3690 pci_disable_device(to_pci_dev(bdev)); 3731 pci_disable_device(to_pci_dev(bdev));
diff --git a/drivers/net/fddi/defxx.h b/drivers/net/fddi/defxx.h
index 16fe8049b238..9d30fde2ef3c 100644
--- a/drivers/net/fddi/defxx.h
+++ b/drivers/net/fddi/defxx.h
@@ -1481,9 +1481,11 @@ typedef union
1481 1481
1482#define PI_ESIC_K_CSR_IO_LEN 0x40 /* 64 bytes */ 1482#define PI_ESIC_K_CSR_IO_LEN 0x40 /* 64 bytes */
1483#define PI_ESIC_K_BURST_HOLDOFF_LEN 0x04 /* 4 bytes */ 1483#define PI_ESIC_K_BURST_HOLDOFF_LEN 0x04 /* 4 bytes */
1484#define PI_ESIC_K_ESIC_CSR_LEN 0x40 /* 64 bytes */
1484 1485
1485#define PI_DEFEA_K_CSR_IO 0x000 1486#define PI_DEFEA_K_CSR_IO 0x000
1486#define PI_DEFEA_K_BURST_HOLDOFF 0x040 1487#define PI_DEFEA_K_BURST_HOLDOFF 0x040
1488#define PI_ESIC_K_ESIC_CSR 0xC80
1487 1489
1488#define PI_ESIC_K_SLOT_ID 0xC80 1490#define PI_ESIC_K_SLOT_ID 0xC80
1489#define PI_ESIC_K_SLOT_CNTRL 0xC84 1491#define PI_ESIC_K_SLOT_CNTRL 0xC84