[SCSI] dpt_i2o: use standard __init / __exit code
Update dpt_i2o.c to use the standard __init / __exit code instead of the legacy '#include "scsi_module.c"' code. This is needed in preparation of 64-bit support. scsi_module.c calls scsi_add_host() with the device pointer set to NULL, and that crashes code like arch/x64/kernel/pci-gart_64.c::need_iommu(). The reboot_notifier code is deleted because it wasn't compiled in ever anyway, and it would be useless to duplicate it in the new code. Signed-off-by: Miquel van Smoorenburg <miquels@cistron.nl> Acked-by: Mark Salyzyn <Mark_Salyzyn@adaptec.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
33139b2101
commit
c864cb145d
@ -121,15 +121,6 @@ static const struct file_operations adpt_fops = {
|
|||||||
.release = adpt_close
|
.release = adpt_close
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef REBOOT_NOTIFIER
|
|
||||||
static struct notifier_block adpt_reboot_notifier =
|
|
||||||
{
|
|
||||||
adpt_reboot_event,
|
|
||||||
NULL,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Structures and definitions for synchronous message posting.
|
/* Structures and definitions for synchronous message posting.
|
||||||
* See adpt_i2o_post_wait() for description
|
* See adpt_i2o_post_wait() for description
|
||||||
* */
|
* */
|
||||||
@ -178,8 +169,6 @@ static int adpt_detect(struct scsi_host_template* sht)
|
|||||||
struct pci_dev *pDev = NULL;
|
struct pci_dev *pDev = NULL;
|
||||||
adpt_hba* pHba;
|
adpt_hba* pHba;
|
||||||
|
|
||||||
adpt_init();
|
|
||||||
|
|
||||||
PINFO("Detecting Adaptec I2O RAID controllers...\n");
|
PINFO("Detecting Adaptec I2O RAID controllers...\n");
|
||||||
|
|
||||||
/* search for all Adatpec I2O RAID cards */
|
/* search for all Adatpec I2O RAID cards */
|
||||||
@ -248,7 +237,7 @@ rebuild_sys_tab:
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (pHba = hba_chain; pHba; pHba = pHba->next) {
|
for (pHba = hba_chain; pHba; pHba = pHba->next) {
|
||||||
if( adpt_scsi_register(pHba,sht) < 0){
|
if (adpt_scsi_host_alloc(pHba, sht) < 0){
|
||||||
adpt_i2o_delete_hba(pHba);
|
adpt_i2o_delete_hba(pHba);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -861,27 +850,6 @@ static void adpt_i2o_sys_shutdown(void)
|
|||||||
printk(KERN_INFO "Adaptec I2O controllers down.\n");
|
printk(KERN_INFO "Adaptec I2O controllers down.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* reboot/shutdown notification.
|
|
||||||
*
|
|
||||||
* - Quiesce each IOP in the system
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef REBOOT_NOTIFIER
|
|
||||||
static int adpt_reboot_event(struct notifier_block *n, ulong code, void *p)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(code != SYS_RESTART && code != SYS_HALT && code != SYS_POWER_OFF)
|
|
||||||
return NOTIFY_DONE;
|
|
||||||
|
|
||||||
adpt_i2o_sys_shutdown();
|
|
||||||
|
|
||||||
return NOTIFY_DONE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev)
|
static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -1080,18 +1048,6 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int adpt_init(void)
|
|
||||||
{
|
|
||||||
printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
|
|
||||||
#ifdef REBOOT_NOTIFIER
|
|
||||||
register_reboot_notifier(&adpt_reboot_notifier);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static struct adpt_device* adpt_find_device(adpt_hba* pHba, u32 chan, u32 id, u32 lun)
|
static struct adpt_device* adpt_find_device(adpt_hba* pHba, u32 chan, u32 id, u32 lun)
|
||||||
{
|
{
|
||||||
struct adpt_device* d;
|
struct adpt_device* d;
|
||||||
@ -2177,13 +2133,13 @@ static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_d
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static s32 adpt_scsi_register(adpt_hba* pHba,struct scsi_host_template * sht)
|
static s32 adpt_scsi_host_alloc(adpt_hba* pHba, struct scsi_host_template *sht)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *host = NULL;
|
struct Scsi_Host *host;
|
||||||
|
|
||||||
host = scsi_register(sht, sizeof(adpt_hba*));
|
host = scsi_host_alloc(sht, sizeof(adpt_hba*));
|
||||||
if (host == NULL) {
|
if (host == NULL) {
|
||||||
printk ("%s: scsi_register returned NULL\n",pHba->name);
|
printk("%s: scsi_host_alloc returned NULL\n", pHba->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
host->hostdata[0] = (unsigned long)pHba;
|
host->hostdata[0] = (unsigned long)pHba;
|
||||||
@ -3323,11 +3279,10 @@ static static void adpt_delay(int millisec)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct scsi_host_template driver_template = {
|
static struct scsi_host_template driver_template = {
|
||||||
|
.module = THIS_MODULE,
|
||||||
.name = "dpt_i2o",
|
.name = "dpt_i2o",
|
||||||
.proc_name = "dpt_i2o",
|
.proc_name = "dpt_i2o",
|
||||||
.proc_info = adpt_proc_info,
|
.proc_info = adpt_proc_info,
|
||||||
.detect = adpt_detect,
|
|
||||||
.release = adpt_release,
|
|
||||||
.info = adpt_info,
|
.info = adpt_info,
|
||||||
.queuecommand = adpt_queue,
|
.queuecommand = adpt_queue,
|
||||||
.eh_abort_handler = adpt_abort,
|
.eh_abort_handler = adpt_abort,
|
||||||
@ -3341,5 +3296,48 @@ static struct scsi_host_template driver_template = {
|
|||||||
.cmd_per_lun = 1,
|
.cmd_per_lun = 1,
|
||||||
.use_clustering = ENABLE_CLUSTERING,
|
.use_clustering = ENABLE_CLUSTERING,
|
||||||
};
|
};
|
||||||
#include "scsi_module.c"
|
|
||||||
|
static int __init adpt_init(void)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
adpt_hba *pHba, *next;
|
||||||
|
|
||||||
|
printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
|
||||||
|
|
||||||
|
error = adpt_detect(&driver_template);
|
||||||
|
if (error < 0)
|
||||||
|
return error;
|
||||||
|
if (hba_chain == NULL)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
for (pHba = hba_chain; pHba; pHba = pHba->next) {
|
||||||
|
error = scsi_add_host(pHba->host, &pHba->pDev->dev);
|
||||||
|
if (error)
|
||||||
|
goto fail;
|
||||||
|
scsi_scan_host(pHba->host);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
fail:
|
||||||
|
for (pHba = hba_chain; pHba; pHba = next) {
|
||||||
|
next = pHba->next;
|
||||||
|
scsi_remove_host(pHba->host);
|
||||||
|
}
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit adpt_exit(void)
|
||||||
|
{
|
||||||
|
adpt_hba *pHba, *next;
|
||||||
|
|
||||||
|
for (pHba = hba_chain; pHba; pHba = pHba->next)
|
||||||
|
scsi_remove_host(pHba->host);
|
||||||
|
for (pHba = hba_chain; pHba; pHba = next) {
|
||||||
|
next = pHba->next;
|
||||||
|
adpt_release(pHba->host);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(adpt_init);
|
||||||
|
module_exit(adpt_exit);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -84,7 +84,6 @@ static int adpt_device_reset(struct scsi_cmnd* cmd);
|
|||||||
#define PCI_DPT_DEVICE_ID (0xA501) // DPT PCI I2O Device ID
|
#define PCI_DPT_DEVICE_ID (0xA501) // DPT PCI I2O Device ID
|
||||||
#define PCI_DPT_RAPTOR_DEVICE_ID (0xA511)
|
#define PCI_DPT_RAPTOR_DEVICE_ID (0xA511)
|
||||||
|
|
||||||
//#define REBOOT_NOTIFIER 1
|
|
||||||
/* Debugging macro from Linux Device Drivers - Rubini */
|
/* Debugging macro from Linux Device Drivers - Rubini */
|
||||||
#undef PDEBUG
|
#undef PDEBUG
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -264,9 +263,6 @@ static void adpt_i2o_sys_shutdown(void);
|
|||||||
static int adpt_init(void);
|
static int adpt_init(void);
|
||||||
static int adpt_i2o_build_sys_table(void);
|
static int adpt_i2o_build_sys_table(void);
|
||||||
static irqreturn_t adpt_isr(int irq, void *dev_id);
|
static irqreturn_t adpt_isr(int irq, void *dev_id);
|
||||||
#ifdef REBOOT_NOTIFIER
|
|
||||||
static int adpt_reboot_event(struct notifier_block *n, ulong code, void *p);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void adpt_i2o_report_hba_unit(adpt_hba* pHba, struct i2o_device *d);
|
static void adpt_i2o_report_hba_unit(adpt_hba* pHba, struct i2o_device *d);
|
||||||
static int adpt_i2o_query_scalar(adpt_hba* pHba, int tid,
|
static int adpt_i2o_query_scalar(adpt_hba* pHba, int tid,
|
||||||
@ -289,7 +285,7 @@ static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba);
|
|||||||
static s32 adpt_i2o_hrt_get(adpt_hba* pHba);
|
static s32 adpt_i2o_hrt_get(adpt_hba* pHba);
|
||||||
static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_device* dptdevice);
|
static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_device* dptdevice);
|
||||||
static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd);
|
static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd);
|
||||||
static s32 adpt_scsi_register(adpt_hba* pHba,struct scsi_host_template * sht);
|
static s32 adpt_scsi_host_alloc(adpt_hba* pHba,struct scsi_host_template * sht);
|
||||||
static s32 adpt_hba_reset(adpt_hba* pHba);
|
static s32 adpt_hba_reset(adpt_hba* pHba);
|
||||||
static s32 adpt_i2o_reset_hba(adpt_hba* pHba);
|
static s32 adpt_i2o_reset_hba(adpt_hba* pHba);
|
||||||
static s32 adpt_rescan(adpt_hba* pHba);
|
static s32 adpt_rescan(adpt_hba* pHba);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user