Commit dfd287f6 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by James Bottomley

[SCSI] aic7xxx: sane pci probing

always probe in bus order, avoid any reordering
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 7f602c53
...@@ -102,8 +102,7 @@ aic7770_probe(struct device *dev) ...@@ -102,8 +102,7 @@ aic7770_probe(struct device *dev)
dev_set_drvdata(dev, ahc); dev_set_drvdata(dev, ahc);
if (aic7xxx_detect_complete) error = ahc_linux_register_host(ahc, &aic7xxx_driver_template);
error = ahc_linux_register_host(ahc, &aic7xxx_driver_template);
return (error); return (error);
} }
......
...@@ -337,13 +337,6 @@ static uint32_t aic7xxx_pci_parity = ~0; ...@@ -337,13 +337,6 @@ static uint32_t aic7xxx_pci_parity = ~0;
*/ */
uint32_t aic7xxx_allow_memio = ~0; uint32_t aic7xxx_allow_memio = ~0;
/*
* aic7xxx_detect() has been run, so register all device arrivals
* immediately with the system rather than deferring to the sorted
* attachment performed by aic7xxx_detect().
*/
int aic7xxx_detect_complete;
/* /*
* So that we can set how long each device is given as a selection timeout. * So that we can set how long each device is given as a selection timeout.
* The table of values goes like this: * The table of values goes like this:
...@@ -475,48 +468,6 @@ ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb, ...@@ -475,48 +468,6 @@ ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
return (consumed); return (consumed);
} }
/*
* Try to detect an Adaptec 7XXX controller.
*/
static int
ahc_linux_detect(struct scsi_host_template *template)
{
struct ahc_softc *ahc;
int found = 0;
/*
* If we've been passed any parameters, process them now.
*/
if (aic7xxx)
aic7xxx_setup(aic7xxx);
template->proc_name = "aic7xxx";
/*
* Initialize our softc list lock prior to
* probing for any adapters.
*/
ahc_list_lockinit();
found = ahc_linux_pci_init();
if (!ahc_linux_eisa_init())
found++;
/*
* Register with the SCSI layer all
* controllers we've found.
*/
TAILQ_FOREACH(ahc, &ahc_tailq, links) {
if (ahc_linux_register_host(ahc, template) == 0)
found++;
}
aic7xxx_detect_complete++;
return (found);
}
/* /*
* Return a string describing the driver. * Return a string describing the driver.
*/ */
...@@ -848,6 +799,7 @@ ahc_linux_bus_reset(struct scsi_cmnd *cmd) ...@@ -848,6 +799,7 @@ ahc_linux_bus_reset(struct scsi_cmnd *cmd)
struct scsi_host_template aic7xxx_driver_template = { struct scsi_host_template aic7xxx_driver_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = "aic7xxx", .name = "aic7xxx",
.proc_name = "aic7xxx",
.proc_info = ahc_linux_proc_info, .proc_info = ahc_linux_proc_info,
.info = ahc_linux_info, .info = ahc_linux_info,
.queuecommand = ahc_linux_queue, .queuecommand = ahc_linux_queue,
...@@ -2717,18 +2669,31 @@ static struct spi_function_template ahc_linux_transport_functions = { ...@@ -2717,18 +2669,31 @@ static struct spi_function_template ahc_linux_transport_functions = {
static int __init static int __init
ahc_linux_init(void) ahc_linux_init(void)
{ {
ahc_linux_transport_template = spi_attach_transport(&ahc_linux_transport_functions); /*
* If we've been passed any parameters, process them now.
*/
if (aic7xxx)
aic7xxx_setup(aic7xxx);
ahc_linux_transport_template =
spi_attach_transport(&ahc_linux_transport_functions);
if (!ahc_linux_transport_template) if (!ahc_linux_transport_template)
return -ENODEV; return -ENODEV;
scsi_transport_reserve_target(ahc_linux_transport_template, scsi_transport_reserve_target(ahc_linux_transport_template,
sizeof(struct ahc_linux_target)); sizeof(struct ahc_linux_target));
scsi_transport_reserve_device(ahc_linux_transport_template, scsi_transport_reserve_device(ahc_linux_transport_template,
sizeof(struct ahc_linux_device)); sizeof(struct ahc_linux_device));
if (ahc_linux_detect(&aic7xxx_driver_template))
return 0; /*
spi_release_transport(ahc_linux_transport_template); * Initialize our softc list lock prior to
ahc_linux_exit(); * probing for any adapters.
return -ENODEV; */
ahc_list_lockinit();
ahc_linux_pci_init();
ahc_linux_eisa_init();
return 0;
} }
static void static void
......
...@@ -132,7 +132,6 @@ typedef struct scsi_cmnd *ahc_io_ctx_t; ...@@ -132,7 +132,6 @@ typedef struct scsi_cmnd *ahc_io_ctx_t;
/************************* Configuration Data *********************************/ /************************* Configuration Data *********************************/
extern u_int aic7xxx_no_probe; extern u_int aic7xxx_no_probe;
extern u_int aic7xxx_allow_memio; extern u_int aic7xxx_allow_memio;
extern int aic7xxx_detect_complete;
extern struct scsi_host_template aic7xxx_driver_template; extern struct scsi_host_template aic7xxx_driver_template;
/***************************** Bus Space/DMA **********************************/ /***************************** Bus Space/DMA **********************************/
......
...@@ -208,8 +208,7 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -208,8 +208,7 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return (-error); return (-error);
} }
pci_set_drvdata(pdev, ahc); pci_set_drvdata(pdev, ahc);
if (aic7xxx_detect_complete) ahc_linux_register_host(ahc, &aic7xxx_driver_template);
ahc_linux_register_host(ahc, &aic7xxx_driver_template);
return (0); return (0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment