[SCSI] BusLogic: stop using check_region
I got so sick of seing the check_region warnings from BusLogic.c I actually fixed it properly. Never use check region, reserve it before the probe with request region instead and check the error result; free region if setup fails. Should be functionally identical to the original except for fixing the potential race. Signed-off-by: Zachary Amsden <zach@vmware.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
ad1331a792
commit
1079a2d251
|
@ -579,17 +579,17 @@ static void __init BusLogic_InitializeProbeInfoListISA(struct BusLogic_HostAdapt
|
||||||
/*
|
/*
|
||||||
Append the list of standard BusLogic MultiMaster ISA I/O Addresses.
|
Append the list of standard BusLogic MultiMaster ISA I/O Addresses.
|
||||||
*/
|
*/
|
||||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe330 : check_region(0x330, BusLogic_MultiMasterAddressCount) == 0)
|
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe330)
|
||||||
BusLogic_AppendProbeAddressISA(0x330);
|
BusLogic_AppendProbeAddressISA(0x330);
|
||||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe334 : check_region(0x334, BusLogic_MultiMasterAddressCount) == 0)
|
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe334)
|
||||||
BusLogic_AppendProbeAddressISA(0x334);
|
BusLogic_AppendProbeAddressISA(0x334);
|
||||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe230 : check_region(0x230, BusLogic_MultiMasterAddressCount) == 0)
|
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe230)
|
||||||
BusLogic_AppendProbeAddressISA(0x230);
|
BusLogic_AppendProbeAddressISA(0x230);
|
||||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe234 : check_region(0x234, BusLogic_MultiMasterAddressCount) == 0)
|
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe234)
|
||||||
BusLogic_AppendProbeAddressISA(0x234);
|
BusLogic_AppendProbeAddressISA(0x234);
|
||||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe130 : check_region(0x130, BusLogic_MultiMasterAddressCount) == 0)
|
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe130)
|
||||||
BusLogic_AppendProbeAddressISA(0x130);
|
BusLogic_AppendProbeAddressISA(0x130);
|
||||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe134 : check_region(0x134, BusLogic_MultiMasterAddressCount) == 0)
|
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe134)
|
||||||
BusLogic_AppendProbeAddressISA(0x134);
|
BusLogic_AppendProbeAddressISA(0x134);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -795,7 +795,9 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
|
||||||
host adapters are probed.
|
host adapters are probed.
|
||||||
*/
|
*/
|
||||||
if (!BusLogic_ProbeOptions.NoProbeISA)
|
if (!BusLogic_ProbeOptions.NoProbeISA)
|
||||||
if (PrimaryProbeInfo->IO_Address == 0 && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe330 : check_region(0x330, BusLogic_MultiMasterAddressCount) == 0)) {
|
if (PrimaryProbeInfo->IO_Address == 0 &&
|
||||||
|
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||||
|
BusLogic_ProbeOptions.Probe330)) {
|
||||||
PrimaryProbeInfo->HostAdapterType = BusLogic_MultiMaster;
|
PrimaryProbeInfo->HostAdapterType = BusLogic_MultiMaster;
|
||||||
PrimaryProbeInfo->HostAdapterBusType = BusLogic_ISA_Bus;
|
PrimaryProbeInfo->HostAdapterBusType = BusLogic_ISA_Bus;
|
||||||
PrimaryProbeInfo->IO_Address = 0x330;
|
PrimaryProbeInfo->IO_Address = 0x330;
|
||||||
|
@ -805,15 +807,25 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
|
||||||
omitting the Primary I/O Address which has already been handled.
|
omitting the Primary I/O Address which has already been handled.
|
||||||
*/
|
*/
|
||||||
if (!BusLogic_ProbeOptions.NoProbeISA) {
|
if (!BusLogic_ProbeOptions.NoProbeISA) {
|
||||||
if (!StandardAddressSeen[1] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe334 : check_region(0x334, BusLogic_MultiMasterAddressCount) == 0))
|
if (!StandardAddressSeen[1] &&
|
||||||
|
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||||
|
BusLogic_ProbeOptions.Probe334))
|
||||||
BusLogic_AppendProbeAddressISA(0x334);
|
BusLogic_AppendProbeAddressISA(0x334);
|
||||||
if (!StandardAddressSeen[2] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe230 : check_region(0x230, BusLogic_MultiMasterAddressCount) == 0))
|
if (!StandardAddressSeen[2] &&
|
||||||
|
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||||
|
BusLogic_ProbeOptions.Probe230))
|
||||||
BusLogic_AppendProbeAddressISA(0x230);
|
BusLogic_AppendProbeAddressISA(0x230);
|
||||||
if (!StandardAddressSeen[3] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe234 : check_region(0x234, BusLogic_MultiMasterAddressCount) == 0))
|
if (!StandardAddressSeen[3] &&
|
||||||
|
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||||
|
BusLogic_ProbeOptions.Probe234))
|
||||||
BusLogic_AppendProbeAddressISA(0x234);
|
BusLogic_AppendProbeAddressISA(0x234);
|
||||||
if (!StandardAddressSeen[4] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe130 : check_region(0x130, BusLogic_MultiMasterAddressCount) == 0))
|
if (!StandardAddressSeen[4] &&
|
||||||
|
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||||
|
BusLogic_ProbeOptions.Probe130))
|
||||||
BusLogic_AppendProbeAddressISA(0x130);
|
BusLogic_AppendProbeAddressISA(0x130);
|
||||||
if (!StandardAddressSeen[5] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe134 : check_region(0x134, BusLogic_MultiMasterAddressCount) == 0))
|
if (!StandardAddressSeen[5] &&
|
||||||
|
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||||
|
BusLogic_ProbeOptions.Probe134))
|
||||||
BusLogic_AppendProbeAddressISA(0x134);
|
BusLogic_AppendProbeAddressISA(0x134);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -2220,22 +2232,35 @@ static int __init BusLogic_init(void)
|
||||||
HostAdapter->PCI_Device = ProbeInfo->PCI_Device;
|
HostAdapter->PCI_Device = ProbeInfo->PCI_Device;
|
||||||
HostAdapter->IRQ_Channel = ProbeInfo->IRQ_Channel;
|
HostAdapter->IRQ_Channel = ProbeInfo->IRQ_Channel;
|
||||||
HostAdapter->AddressCount = BusLogic_HostAdapterAddressCount[HostAdapter->HostAdapterType];
|
HostAdapter->AddressCount = BusLogic_HostAdapterAddressCount[HostAdapter->HostAdapterType];
|
||||||
|
|
||||||
|
/*
|
||||||
|
Make sure region is free prior to probing.
|
||||||
|
*/
|
||||||
|
if (!request_region(HostAdapter->IO_Address, HostAdapter->AddressCount,
|
||||||
|
"BusLogic"))
|
||||||
|
continue;
|
||||||
/*
|
/*
|
||||||
Probe the Host Adapter. If unsuccessful, abort further initialization.
|
Probe the Host Adapter. If unsuccessful, abort further initialization.
|
||||||
*/
|
*/
|
||||||
if (!BusLogic_ProbeHostAdapter(HostAdapter))
|
if (!BusLogic_ProbeHostAdapter(HostAdapter)) {
|
||||||
|
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
Hard Reset the Host Adapter. If unsuccessful, abort further
|
Hard Reset the Host Adapter. If unsuccessful, abort further
|
||||||
initialization.
|
initialization.
|
||||||
*/
|
*/
|
||||||
if (!BusLogic_HardwareResetHostAdapter(HostAdapter, true))
|
if (!BusLogic_HardwareResetHostAdapter(HostAdapter, true)) {
|
||||||
|
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
Check the Host Adapter. If unsuccessful, abort further initialization.
|
Check the Host Adapter. If unsuccessful, abort further initialization.
|
||||||
*/
|
*/
|
||||||
if (!BusLogic_CheckHostAdapter(HostAdapter))
|
if (!BusLogic_CheckHostAdapter(HostAdapter)) {
|
||||||
|
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
Initialize the Driver Options field if provided.
|
Initialize the Driver Options field if provided.
|
||||||
*/
|
*/
|
||||||
|
@ -2246,16 +2271,6 @@ static int __init BusLogic_init(void)
|
||||||
and Electronic Mail Address.
|
and Electronic Mail Address.
|
||||||
*/
|
*/
|
||||||
BusLogic_AnnounceDriver(HostAdapter);
|
BusLogic_AnnounceDriver(HostAdapter);
|
||||||
/*
|
|
||||||
Register usage of the I/O Address range. From this point onward, any
|
|
||||||
failure will be assumed to be due to a problem with the Host Adapter,
|
|
||||||
rather than due to having mistakenly identified this port as belonging
|
|
||||||
to a BusLogic Host Adapter. The I/O Address range will not be
|
|
||||||
released, thereby preventing it from being incorrectly identified as
|
|
||||||
any other type of Host Adapter.
|
|
||||||
*/
|
|
||||||
if (!request_region(HostAdapter->IO_Address, HostAdapter->AddressCount, "BusLogic"))
|
|
||||||
continue;
|
|
||||||
/*
|
/*
|
||||||
Register the SCSI Host structure.
|
Register the SCSI Host structure.
|
||||||
*/
|
*/
|
||||||
|
@ -2280,6 +2295,12 @@ static int __init BusLogic_init(void)
|
||||||
Acquire the System Resources necessary to use the Host Adapter, then
|
Acquire the System Resources necessary to use the Host Adapter, then
|
||||||
Create the Initial CCBs, Initialize the Host Adapter, and finally
|
Create the Initial CCBs, Initialize the Host Adapter, and finally
|
||||||
perform Target Device Inquiry.
|
perform Target Device Inquiry.
|
||||||
|
|
||||||
|
From this point onward, any failure will be assumed to be due to a
|
||||||
|
problem with the Host Adapter, rather than due to having mistakenly
|
||||||
|
identified this port as belonging to a BusLogic Host Adapter. The
|
||||||
|
I/O Address range will not be released, thereby preventing it from
|
||||||
|
being incorrectly identified as any other type of Host Adapter.
|
||||||
*/
|
*/
|
||||||
if (BusLogic_ReadHostAdapterConfiguration(HostAdapter) &&
|
if (BusLogic_ReadHostAdapterConfiguration(HostAdapter) &&
|
||||||
BusLogic_ReportHostAdapterConfiguration(HostAdapter) &&
|
BusLogic_ReportHostAdapterConfiguration(HostAdapter) &&
|
||||||
|
@ -3598,6 +3619,7 @@ static void __exit BusLogic_exit(void)
|
||||||
|
|
||||||
__setup("BusLogic=", BusLogic_Setup);
|
__setup("BusLogic=", BusLogic_Setup);
|
||||||
|
|
||||||
|
#ifdef MODULE
|
||||||
static struct pci_device_id BusLogic_pci_tbl[] __devinitdata = {
|
static struct pci_device_id BusLogic_pci_tbl[] __devinitdata = {
|
||||||
{ PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
|
{ PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
|
||||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||||
|
@ -3607,6 +3629,7 @@ static struct pci_device_id BusLogic_pci_tbl[] __devinitdata = {
|
||||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
MODULE_DEVICE_TABLE(pci, BusLogic_pci_tbl);
|
MODULE_DEVICE_TABLE(pci, BusLogic_pci_tbl);
|
||||||
|
|
||||||
module_init(BusLogic_init);
|
module_init(BusLogic_init);
|
||||||
|
|
Loading…
Reference in New Issue