[SCSI] megaraid_sas: remove poll_mode_io code
This code has never worked correctly, doesn't disable interrupts when set as a module parameter, doesn't disable interrupts when set after driver load time in sysfs node, etc. Signed-off-by: Adam Radford <aradford@gmail.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
committed by
James Bottomley
parent
882be7c3be
commit
7895f9c957
@@ -773,7 +773,6 @@ struct megasas_ctrl_info {
|
|||||||
|
|
||||||
#define MFI_OB_INTR_STATUS_MASK 0x00000002
|
#define MFI_OB_INTR_STATUS_MASK 0x00000002
|
||||||
#define MFI_POLL_TIMEOUT_SECS 60
|
#define MFI_POLL_TIMEOUT_SECS 60
|
||||||
#define MEGASAS_COMPLETION_TIMER_INTERVAL (HZ/10)
|
|
||||||
|
|
||||||
#define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000
|
#define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000
|
||||||
#define MFI_REPLY_GEN2_MESSAGE_INTERRUPT 0x00000001
|
#define MFI_REPLY_GEN2_MESSAGE_INTERRUPT 0x00000001
|
||||||
@@ -1353,7 +1352,6 @@ struct megasas_instance {
|
|||||||
u32 mfiStatus;
|
u32 mfiStatus;
|
||||||
u32 last_seq_num;
|
u32 last_seq_num;
|
||||||
|
|
||||||
struct timer_list io_completion_timer;
|
|
||||||
struct list_head internal_reset_pending_q;
|
struct list_head internal_reset_pending_q;
|
||||||
|
|
||||||
/* Ptr to hba specific information */
|
/* Ptr to hba specific information */
|
||||||
|
@@ -58,14 +58,6 @@
|
|||||||
#include "megaraid_sas_fusion.h"
|
#include "megaraid_sas_fusion.h"
|
||||||
#include "megaraid_sas.h"
|
#include "megaraid_sas.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* poll_mode_io:1- schedule complete completion from q cmd
|
|
||||||
*/
|
|
||||||
static unsigned int poll_mode_io;
|
|
||||||
module_param_named(poll_mode_io, poll_mode_io, int, 0);
|
|
||||||
MODULE_PARM_DESC(poll_mode_io,
|
|
||||||
"Complete cmds from IO path, (default=0)");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Number of sectors per IO command
|
* Number of sectors per IO command
|
||||||
* Will be set in megasas_init_mfi if user does not provide
|
* Will be set in megasas_init_mfi if user does not provide
|
||||||
@@ -1439,11 +1431,6 @@ megasas_build_and_issue_cmd(struct megasas_instance *instance,
|
|||||||
|
|
||||||
instance->instancet->fire_cmd(instance, cmd->frame_phys_addr,
|
instance->instancet->fire_cmd(instance, cmd->frame_phys_addr,
|
||||||
cmd->frame_count-1, instance->reg_set);
|
cmd->frame_count-1, instance->reg_set);
|
||||||
/*
|
|
||||||
* Check if we have pend cmds to be completed
|
|
||||||
*/
|
|
||||||
if (poll_mode_io && atomic_read(&instance->fw_outstanding))
|
|
||||||
tasklet_schedule(&instance->isr_tasklet);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out_return_cmd:
|
out_return_cmd:
|
||||||
@@ -3370,47 +3357,6 @@ fail_fw_init:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* megasas_start_timer - Initializes a timer object
|
|
||||||
* @instance: Adapter soft state
|
|
||||||
* @timer: timer object to be initialized
|
|
||||||
* @fn: timer function
|
|
||||||
* @interval: time interval between timer function call
|
|
||||||
*/
|
|
||||||
static inline void
|
|
||||||
megasas_start_timer(struct megasas_instance *instance,
|
|
||||||
struct timer_list *timer,
|
|
||||||
void *fn, unsigned long interval)
|
|
||||||
{
|
|
||||||
init_timer(timer);
|
|
||||||
timer->expires = jiffies + interval;
|
|
||||||
timer->data = (unsigned long)instance;
|
|
||||||
timer->function = fn;
|
|
||||||
add_timer(timer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* megasas_io_completion_timer - Timer fn
|
|
||||||
* @instance_addr: Address of adapter soft state
|
|
||||||
*
|
|
||||||
* Schedules tasklet for cmd completion
|
|
||||||
* if poll_mode_io is set
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
megasas_io_completion_timer(unsigned long instance_addr)
|
|
||||||
{
|
|
||||||
struct megasas_instance *instance =
|
|
||||||
(struct megasas_instance *)instance_addr;
|
|
||||||
|
|
||||||
if (atomic_read(&instance->fw_outstanding))
|
|
||||||
tasklet_schedule(&instance->isr_tasklet);
|
|
||||||
|
|
||||||
/* Restart timer */
|
|
||||||
if (poll_mode_io)
|
|
||||||
mod_timer(&instance->io_completion_timer,
|
|
||||||
jiffies + MEGASAS_COMPLETION_TIMER_INTERVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32
|
static u32
|
||||||
megasas_init_adapter_mfi(struct megasas_instance *instance)
|
megasas_init_adapter_mfi(struct megasas_instance *instance)
|
||||||
{
|
{
|
||||||
@@ -3638,11 +3584,6 @@ static int megasas_init_fw(struct megasas_instance *instance)
|
|||||||
tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
|
tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
|
||||||
(unsigned long)instance);
|
(unsigned long)instance);
|
||||||
|
|
||||||
/* Initialize the cmd completion timer */
|
|
||||||
if (poll_mode_io)
|
|
||||||
megasas_start_timer(instance, &instance->io_completion_timer,
|
|
||||||
megasas_io_completion_timer,
|
|
||||||
MEGASAS_COMPLETION_TIMER_INTERVAL);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail_init_adapter:
|
fail_init_adapter:
|
||||||
@@ -4369,9 +4310,6 @@ megasas_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||||||
host = instance->host;
|
host = instance->host;
|
||||||
instance->unload = 1;
|
instance->unload = 1;
|
||||||
|
|
||||||
if (poll_mode_io)
|
|
||||||
del_timer_sync(&instance->io_completion_timer);
|
|
||||||
|
|
||||||
megasas_flush_cache(instance);
|
megasas_flush_cache(instance);
|
||||||
megasas_shutdown_controller(instance, MR_DCMD_HIBERNATE_SHUTDOWN);
|
megasas_shutdown_controller(instance, MR_DCMD_HIBERNATE_SHUTDOWN);
|
||||||
|
|
||||||
@@ -4511,12 +4449,6 @@ megasas_resume(struct pci_dev *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
instance->instancet->enable_intr(instance->reg_set);
|
instance->instancet->enable_intr(instance->reg_set);
|
||||||
|
|
||||||
/* Initialize the cmd completion timer */
|
|
||||||
if (poll_mode_io)
|
|
||||||
megasas_start_timer(instance, &instance->io_completion_timer,
|
|
||||||
megasas_io_completion_timer,
|
|
||||||
MEGASAS_COMPLETION_TIMER_INTERVAL);
|
|
||||||
instance->unload = 0;
|
instance->unload = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -4570,9 +4502,6 @@ static void __devexit megasas_detach_one(struct pci_dev *pdev)
|
|||||||
host = instance->host;
|
host = instance->host;
|
||||||
fusion = instance->ctrl_context;
|
fusion = instance->ctrl_context;
|
||||||
|
|
||||||
if (poll_mode_io)
|
|
||||||
del_timer_sync(&instance->io_completion_timer);
|
|
||||||
|
|
||||||
scsi_remove_host(instance->host);
|
scsi_remove_host(instance->host);
|
||||||
megasas_flush_cache(instance);
|
megasas_flush_cache(instance);
|
||||||
megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN);
|
megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN);
|
||||||
@@ -5221,60 +5150,6 @@ megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t coun
|
|||||||
static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUSR, megasas_sysfs_show_dbg_lvl,
|
static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUSR, megasas_sysfs_show_dbg_lvl,
|
||||||
megasas_sysfs_set_dbg_lvl);
|
megasas_sysfs_set_dbg_lvl);
|
||||||
|
|
||||||
static ssize_t
|
|
||||||
megasas_sysfs_show_poll_mode_io(struct device_driver *dd, char *buf)
|
|
||||||
{
|
|
||||||
return sprintf(buf, "%u\n", poll_mode_io);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
|
||||||
megasas_sysfs_set_poll_mode_io(struct device_driver *dd,
|
|
||||||
const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
int retval = count;
|
|
||||||
int tmp = poll_mode_io;
|
|
||||||
int i;
|
|
||||||
struct megasas_instance *instance;
|
|
||||||
|
|
||||||
if (sscanf(buf, "%u", &poll_mode_io) < 1) {
|
|
||||||
printk(KERN_ERR "megasas: could not set poll_mode_io\n");
|
|
||||||
retval = -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if poll_mode_io is already set or is same as previous value
|
|
||||||
*/
|
|
||||||
if ((tmp && poll_mode_io) || (tmp == poll_mode_io))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (poll_mode_io) {
|
|
||||||
/*
|
|
||||||
* Start timers for all adapters
|
|
||||||
*/
|
|
||||||
for (i = 0; i < megasas_mgmt_info.max_index; i++) {
|
|
||||||
instance = megasas_mgmt_info.instance[i];
|
|
||||||
if (instance) {
|
|
||||||
megasas_start_timer(instance,
|
|
||||||
&instance->io_completion_timer,
|
|
||||||
megasas_io_completion_timer,
|
|
||||||
MEGASAS_COMPLETION_TIMER_INTERVAL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Delete timers for all adapters
|
|
||||||
*/
|
|
||||||
for (i = 0; i < megasas_mgmt_info.max_index; i++) {
|
|
||||||
instance = megasas_mgmt_info.instance[i];
|
|
||||||
if (instance)
|
|
||||||
del_timer_sync(&instance->io_completion_timer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
megasas_aen_polling(struct work_struct *work)
|
megasas_aen_polling(struct work_struct *work)
|
||||||
{
|
{
|
||||||
@@ -5504,11 +5379,6 @@ megasas_aen_polling(struct work_struct *work)
|
|||||||
kfree(ev);
|
kfree(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUSR,
|
|
||||||
megasas_sysfs_show_poll_mode_io,
|
|
||||||
megasas_sysfs_set_poll_mode_io);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* megasas_init - Driver load entry point
|
* megasas_init - Driver load entry point
|
||||||
*/
|
*/
|
||||||
@@ -5567,11 +5437,6 @@ static int __init megasas_init(void)
|
|||||||
&driver_attr_dbg_lvl);
|
&driver_attr_dbg_lvl);
|
||||||
if (rval)
|
if (rval)
|
||||||
goto err_dcf_dbg_lvl;
|
goto err_dcf_dbg_lvl;
|
||||||
rval = driver_create_file(&megasas_pci_driver.driver,
|
|
||||||
&driver_attr_poll_mode_io);
|
|
||||||
if (rval)
|
|
||||||
goto err_dcf_poll_mode_io;
|
|
||||||
|
|
||||||
rval = driver_create_file(&megasas_pci_driver.driver,
|
rval = driver_create_file(&megasas_pci_driver.driver,
|
||||||
&driver_attr_support_device_change);
|
&driver_attr_support_device_change);
|
||||||
if (rval)
|
if (rval)
|
||||||
@@ -5580,10 +5445,6 @@ static int __init megasas_init(void)
|
|||||||
return rval;
|
return rval;
|
||||||
|
|
||||||
err_dcf_support_device_change:
|
err_dcf_support_device_change:
|
||||||
driver_remove_file(&megasas_pci_driver.driver,
|
|
||||||
&driver_attr_poll_mode_io);
|
|
||||||
|
|
||||||
err_dcf_poll_mode_io:
|
|
||||||
driver_remove_file(&megasas_pci_driver.driver,
|
driver_remove_file(&megasas_pci_driver.driver,
|
||||||
&driver_attr_dbg_lvl);
|
&driver_attr_dbg_lvl);
|
||||||
err_dcf_dbg_lvl:
|
err_dcf_dbg_lvl:
|
||||||
@@ -5608,8 +5469,6 @@ err_pcidrv:
|
|||||||
*/
|
*/
|
||||||
static void __exit megasas_exit(void)
|
static void __exit megasas_exit(void)
|
||||||
{
|
{
|
||||||
driver_remove_file(&megasas_pci_driver.driver,
|
|
||||||
&driver_attr_poll_mode_io);
|
|
||||||
driver_remove_file(&megasas_pci_driver.driver,
|
driver_remove_file(&megasas_pci_driver.driver,
|
||||||
&driver_attr_dbg_lvl);
|
&driver_attr_dbg_lvl);
|
||||||
driver_remove_file(&megasas_pci_driver.driver,
|
driver_remove_file(&megasas_pci_driver.driver,
|
||||||
|
Reference in New Issue
Block a user