Commit c864cb14 authored by Miquel van Smoorenburg's avatar Miquel van Smoorenburg Committed by James Bottomley

[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: default avatarMiquel van Smoorenburg <miquels@cistron.nl>
Acked-by: default avatarMark Salyzyn <Mark_Salyzyn@adaptec.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 33139b21
...@@ -121,15 +121,6 @@ static const struct file_operations adpt_fops = { ...@@ -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) ...@@ -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 @@ static int adpt_detect(struct scsi_host_template* sht) ...@@ -248,7 +237,7 @@ static int adpt_detect(struct scsi_host_template* sht)
} }
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) ...@@ -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) ...@@ -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 ...@@ -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) ...@@ -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 = { ...@@ -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); ...@@ -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); ...@@ -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); ...@@ -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);
......
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