diff options
author | Olof Johansson <olof@lixom.net> | 2007-05-08 01:47:21 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-05-08 01:47:53 -0400 |
commit | 771f7404a9deca902594823d616cd7a84f827982 (patch) | |
tree | 438332343f0737316277e278de663d40ddedb940 | |
parent | 418aea75246d5f83caa3a003fd66fe3b1aa01738 (diff) |
pasemi_mac: Move the IRQ mapping from the PCI layer to the driver
Fixes for ethernet IRQ mapping, to be done in the driver instead of in
the platform setup code.
Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | arch/powerpc/platforms/pasemi/pci.c | 13 | ||||
-rw-r--r-- | arch/powerpc/platforms/pasemi/setup.c | 1 | ||||
-rw-r--r-- | drivers/net/pasemi_mac.c | 30 | ||||
-rw-r--r-- | drivers/net/pasemi_mac.h | 2 |
4 files changed, 23 insertions, 23 deletions
diff --git a/arch/powerpc/platforms/pasemi/pci.c b/arch/powerpc/platforms/pasemi/pci.c index 056243da360b..bbc6dfcfaa91 100644 --- a/arch/powerpc/platforms/pasemi/pci.c +++ b/arch/powerpc/platforms/pasemi/pci.c | |||
@@ -173,19 +173,6 @@ static void __init pas_fixup_phb_resources(void) | |||
173 | } | 173 | } |
174 | 174 | ||
175 | 175 | ||
176 | void __devinit pas_pci_irq_fixup(struct pci_dev *dev) | ||
177 | { | ||
178 | /* DMA is special, 84 interrupts (128 -> 211), all but 128 | ||
179 | * need to be mapped by hand here. | ||
180 | */ | ||
181 | if (dev->vendor == 0x1959 && dev->device == 0xa007) { | ||
182 | int i; | ||
183 | for (i = 129; i < 212; i++) | ||
184 | irq_create_mapping(NULL, i); | ||
185 | } | ||
186 | } | ||
187 | |||
188 | |||
189 | void __init pas_pci_init(void) | 176 | void __init pas_pci_init(void) |
190 | { | 177 | { |
191 | struct device_node *np, *root; | 178 | struct device_node *np, *root; |
diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c index f88f0ec4c8cb..5bdd6abd89c0 100644 --- a/arch/powerpc/platforms/pasemi/setup.c +++ b/arch/powerpc/platforms/pasemi/setup.c | |||
@@ -248,5 +248,4 @@ define_machine(pas) { | |||
248 | .calibrate_decr = generic_calibrate_decr, | 248 | .calibrate_decr = generic_calibrate_decr, |
249 | .progress = pas_progress, | 249 | .progress = pas_progress, |
250 | .machine_check_exception = pas_machine_check_handler, | 250 | .machine_check_exception = pas_machine_check_handler, |
251 | .pci_irq_fixup = pas_pci_irq_fixup, | ||
252 | }; | 251 | }; |
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c index bde833542b6f..c7995d77ccfc 100644 --- a/drivers/net/pasemi_mac.c +++ b/drivers/net/pasemi_mac.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <linux/tcp.h> | 33 | #include <linux/tcp.h> |
34 | #include <net/checksum.h> | 34 | #include <net/checksum.h> |
35 | 35 | ||
36 | #include <asm/irq.h> | ||
37 | |||
36 | #include "pasemi_mac.h" | 38 | #include "pasemi_mac.h" |
37 | 39 | ||
38 | 40 | ||
@@ -531,6 +533,7 @@ static irqreturn_t pasemi_mac_tx_intr(int irq, void *data) | |||
531 | static int pasemi_mac_open(struct net_device *dev) | 533 | static int pasemi_mac_open(struct net_device *dev) |
532 | { | 534 | { |
533 | struct pasemi_mac *mac = netdev_priv(dev); | 535 | struct pasemi_mac *mac = netdev_priv(dev); |
536 | int base_irq; | ||
534 | unsigned int flags; | 537 | unsigned int flags; |
535 | int ret; | 538 | int ret; |
536 | 539 | ||
@@ -594,28 +597,37 @@ static int pasemi_mac_open(struct net_device *dev) | |||
594 | netif_start_queue(dev); | 597 | netif_start_queue(dev); |
595 | netif_poll_enable(dev); | 598 | netif_poll_enable(dev); |
596 | 599 | ||
597 | ret = request_irq(mac->dma_pdev->irq + mac->dma_txch, | 600 | /* Interrupts are a bit different for our DMA controller: While |
598 | &pasemi_mac_tx_intr, IRQF_DISABLED, | 601 | * it's got one a regular PCI device header, the interrupt there |
602 | * is really the base of the range it's using. Each tx and rx | ||
603 | * channel has it's own interrupt source. | ||
604 | */ | ||
605 | |||
606 | base_irq = virq_to_hw(mac->dma_pdev->irq); | ||
607 | |||
608 | mac->tx_irq = irq_create_mapping(NULL, base_irq + mac->dma_txch); | ||
609 | mac->rx_irq = irq_create_mapping(NULL, base_irq + 20 + mac->dma_txch); | ||
610 | |||
611 | ret = request_irq(mac->tx_irq, &pasemi_mac_tx_intr, IRQF_DISABLED, | ||
599 | mac->tx->irq_name, dev); | 612 | mac->tx->irq_name, dev); |
600 | if (ret) { | 613 | if (ret) { |
601 | dev_err(&mac->pdev->dev, "request_irq of irq %d failed: %d\n", | 614 | dev_err(&mac->pdev->dev, "request_irq of irq %d failed: %d\n", |
602 | mac->dma_pdev->irq + mac->dma_txch, ret); | 615 | base_irq + mac->dma_txch, ret); |
603 | goto out_tx_int; | 616 | goto out_tx_int; |
604 | } | 617 | } |
605 | 618 | ||
606 | ret = request_irq(mac->dma_pdev->irq + 20 + mac->dma_rxch, | 619 | ret = request_irq(mac->rx_irq, &pasemi_mac_rx_intr, IRQF_DISABLED, |
607 | &pasemi_mac_rx_intr, IRQF_DISABLED, | ||
608 | mac->rx->irq_name, dev); | 620 | mac->rx->irq_name, dev); |
609 | if (ret) { | 621 | if (ret) { |
610 | dev_err(&mac->pdev->dev, "request_irq of irq %d failed: %d\n", | 622 | dev_err(&mac->pdev->dev, "request_irq of irq %d failed: %d\n", |
611 | mac->dma_pdev->irq + 20 + mac->dma_rxch, ret); | 623 | base_irq + 20 + mac->dma_rxch, ret); |
612 | goto out_rx_int; | 624 | goto out_rx_int; |
613 | } | 625 | } |
614 | 626 | ||
615 | return 0; | 627 | return 0; |
616 | 628 | ||
617 | out_rx_int: | 629 | out_rx_int: |
618 | free_irq(mac->dma_pdev->irq + mac->dma_txch, dev); | 630 | free_irq(mac->tx_irq, dev); |
619 | out_tx_int: | 631 | out_tx_int: |
620 | netif_poll_disable(dev); | 632 | netif_poll_disable(dev); |
621 | netif_stop_queue(dev); | 633 | netif_stop_queue(dev); |
@@ -699,8 +711,8 @@ static int pasemi_mac_close(struct net_device *dev) | |||
699 | pci_write_config_dword(mac->dma_pdev, | 711 | pci_write_config_dword(mac->dma_pdev, |
700 | PAS_DMA_RXINT_RCMDSTA(mac->dma_if), 0); | 712 | PAS_DMA_RXINT_RCMDSTA(mac->dma_if), 0); |
701 | 713 | ||
702 | free_irq(mac->dma_pdev->irq + mac->dma_txch, dev); | 714 | free_irq(mac->tx_irq, dev); |
703 | free_irq(mac->dma_pdev->irq + 20 + mac->dma_rxch, dev); | 715 | free_irq(mac->rx_irq, dev); |
704 | 716 | ||
705 | /* Free resources */ | 717 | /* Free resources */ |
706 | pasemi_mac_free_rx_resources(dev); | 718 | pasemi_mac_free_rx_resources(dev); |
diff --git a/drivers/net/pasemi_mac.h b/drivers/net/pasemi_mac.h index c3e37e46a18a..703f1b0d434f 100644 --- a/drivers/net/pasemi_mac.h +++ b/drivers/net/pasemi_mac.h | |||
@@ -73,6 +73,8 @@ struct pasemi_mac { | |||
73 | 73 | ||
74 | struct pasemi_mac_txring *tx; | 74 | struct pasemi_mac_txring *tx; |
75 | struct pasemi_mac_rxring *rx; | 75 | struct pasemi_mac_rxring *rx; |
76 | unsigned long tx_irq; | ||
77 | unsigned long rx_irq; | ||
76 | }; | 78 | }; |
77 | 79 | ||
78 | /* Software status descriptor (desc_info) */ | 80 | /* Software status descriptor (desc_info) */ |