[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:
Родитель
ad1331a792
Коммит
1079a2d251
|
@ -579,17 +579,17 @@ static void __init BusLogic_InitializeProbeInfoListISA(struct BusLogic_HostAdapt
|
|||
/*
|
||||
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);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe334 : check_region(0x334, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe334)
|
||||
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);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe234 : check_region(0x234, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe234)
|
||||
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);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe134 : check_region(0x134, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe134)
|
||||
BusLogic_AppendProbeAddressISA(0x134);
|
||||
}
|
||||
|
||||
|
@ -795,7 +795,9 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
|
|||
host adapters are probed.
|
||||
*/
|
||||
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->HostAdapterBusType = BusLogic_ISA_Bus;
|
||||
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.
|
||||
*/
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
/*
|
||||
|
@ -2220,22 +2232,35 @@ static int __init BusLogic_init(void)
|
|||
HostAdapter->PCI_Device = ProbeInfo->PCI_Device;
|
||||
HostAdapter->IRQ_Channel = ProbeInfo->IRQ_Channel;
|
||||
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.
|
||||
*/
|
||||
if (!BusLogic_ProbeHostAdapter(HostAdapter))
|
||||
if (!BusLogic_ProbeHostAdapter(HostAdapter)) {
|
||||
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
Hard Reset the Host Adapter. If unsuccessful, abort further
|
||||
initialization.
|
||||
*/
|
||||
if (!BusLogic_HardwareResetHostAdapter(HostAdapter, true))
|
||||
if (!BusLogic_HardwareResetHostAdapter(HostAdapter, true)) {
|
||||
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
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;
|
||||
}
|
||||
/*
|
||||
Initialize the Driver Options field if provided.
|
||||
*/
|
||||
|
@ -2246,16 +2271,6 @@ static int __init BusLogic_init(void)
|
|||
and Electronic Mail Address.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
|
@ -2280,6 +2295,12 @@ static int __init BusLogic_init(void)
|
|||
Acquire the System Resources necessary to use the Host Adapter, then
|
||||
Create the Initial CCBs, Initialize the Host Adapter, and finally
|
||||
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) &&
|
||||
BusLogic_ReportHostAdapterConfiguration(HostAdapter) &&
|
||||
|
@ -3598,6 +3619,7 @@ static void __exit BusLogic_exit(void)
|
|||
|
||||
__setup("BusLogic=", BusLogic_Setup);
|
||||
|
||||
#ifdef MODULE
|
||||
static struct pci_device_id BusLogic_pci_tbl[] __devinitdata = {
|
||||
{ PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
|
||||
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},
|
||||
{ }
|
||||
};
|
||||
#endif
|
||||
MODULE_DEVICE_TABLE(pci, BusLogic_pci_tbl);
|
||||
|
||||
module_init(BusLogic_init);
|
||||
|
|
Загрузка…
Ссылка в новой задаче