diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-25 20:22:55 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-25 20:22:55 -0700 |
commit | 71fa0a849b384f066dea6a2351c722c19846f4ac (patch) | |
tree | c6f9ac28003432ba79d0ea5eefd34ad412fb50ef /drivers/scsi/fdomain.c | |
parent | 9d81a782d55bdeec3bfa3106e514bf46ac12e172 (diff) | |
parent | d6b9ccbbeb625674891f797119f06512d27fc905 (diff) | |
download | linux-3.10-71fa0a849b384f066dea6a2351c722c19846f4ac.tar.gz linux-3.10-71fa0a849b384f066dea6a2351c722c19846f4ac.tar.bz2 linux-3.10-71fa0a849b384f066dea6a2351c722c19846f4ac.zip |
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (40 commits)
[SCSI] aic79xx: Print out signalling
[SCSI] aic7xxx: Remove slave_destroy
[SCSI] aic79xx: set precompensation
[SCSI] aic79xx: Fixup external device reset
[SCSI] replace u8 and u32 with __u8 and __u32 in scsi.h for user space
[SCSI] lpfc: fix printk format warning
[SCSI] aic79xx: make ahd_set_tags() static
[SCSI] aic7xxx: cleanups
[SCSI] drivers/scsi: Handcrafted MIN/MAX macro removal
[SCSI] scsi_debug: support REPORT TARGET PORT GROUPS
[SCSI] qla1280 bus reset typo
[SCSI] libiscsi: fix logout pdu processing
[SCSI] libiscsi: fix aen support
[SCSI] libiscsi: fix missed iscsi_task_put in xmit error path
[SCSI] libiscsi: fix oops in connection create failure path
[SCSI] iscsi class: fix slab corruption during restart
[SCSI] Switch fdomain to the pci_get API
[SCSI] add can_queue to host parameters
[SCSI] megaraid_{mm,mbox}: 64-bit DMA capability fix
[SCSI] aic94xx: Supermicro motherboards support
...
Diffstat (limited to 'drivers/scsi/fdomain.c')
-rw-r--r-- | drivers/scsi/fdomain.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index 65e6e7b7ba0..5d4ea6f7795 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c @@ -387,6 +387,7 @@ static void __iomem * bios_mem; static int bios_major; static int bios_minor; static int PCI_bus; +static struct pci_dev *PCI_dev; static int Quantum; /* Quantum board variant */ static int interrupt_level; static volatile int in_command; @@ -812,9 +813,10 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ PCI_DEVICE_ID_FD_36C70 ); #endif - if ((pdev = pci_find_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL) + if ((pdev = pci_get_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL) return 0; - if (pci_enable_device(pdev)) return 0; + if (pci_enable_device(pdev)) + goto fail; #if DEBUG_DETECT printk( "scsi: <fdomain> TMC-3260 detect:" @@ -831,7 +833,7 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ pci_irq = pdev->irq; if (!request_region( pci_base, 0x10, "fdomain" )) - return 0; + goto fail; /* Now we have the I/O base address and interrupt from the PCI configuration registers. */ @@ -848,17 +850,22 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ if (!fdomain_is_valid_port(pci_base)) { printk(KERN_ERR "scsi: <fdomain> PCI card detected, but driver not loaded (invalid port)\n" ); release_region(pci_base, 0x10); - return 0; + goto fail; } /* Fill in a few global variables. Ugh. */ bios_major = bios_minor = -1; PCI_bus = 1; + PCI_dev = pdev; Quantum = 0; bios_base = 0; return 1; +fail: + pci_dev_put(pdev); + return 0; } + #endif struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) @@ -909,8 +916,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) if (setup_called) { printk(KERN_ERR "scsi: <fdomain> Bad LILO/INSMOD parameters?\n"); } - release_region(port_base, 0x10); - return NULL; + goto fail; } if (this_id) { @@ -942,8 +948,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) /* Log IRQ with kernel */ if (!interrupt_level) { printk(KERN_ERR "scsi: <fdomain> Card Detected, but driver not loaded (no IRQ)\n" ); - release_region(port_base, 0x10); - return NULL; + goto fail; } else { /* Register the IRQ with the kernel */ @@ -964,11 +969,14 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) printk(KERN_ERR " Send mail to faith@acm.org\n" ); } printk(KERN_ERR "scsi: <fdomain> Detected, but driver not loaded (IRQ)\n" ); - release_region(port_base, 0x10); - return NULL; + goto fail; } } return shpnt; +fail: + pci_dev_put(pdev); + release_region(port_base, 0x10); + return NULL; } static int fdomain_16x0_detect(struct scsi_host_template *tpnt) @@ -1714,6 +1722,8 @@ static int fdomain_16x0_release(struct Scsi_Host *shpnt) free_irq(shpnt->irq, shpnt); if (shpnt->io_port && shpnt->n_io_port) release_region(shpnt->io_port, shpnt->n_io_port); + if (PCI_bus) + pci_dev_put(PCI_dev); return 0; } |