Commit 5d018ad0 authored by Sumant Patro's avatar Sumant Patro Committed by James Bottomley

[SCSI] megaraid_sas: adds tasklet for cmd completion

This patch adds a tasklet for command completion.
Signed-off-by: default avatarSumant Patro <Sumant.Patro@lsil.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 658dcedb
...@@ -1271,11 +1271,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, ...@@ -1271,11 +1271,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
static int static int
megasas_deplete_reply_queue(struct megasas_instance *instance, u8 alt_status) megasas_deplete_reply_queue(struct megasas_instance *instance, u8 alt_status)
{ {
u32 producer;
u32 consumer;
u32 context;
struct megasas_cmd *cmd;
/* /*
* Check if it is our interrupt * Check if it is our interrupt
* Clear the interrupt * Clear the interrupt
...@@ -1283,23 +1278,10 @@ megasas_deplete_reply_queue(struct megasas_instance *instance, u8 alt_status) ...@@ -1283,23 +1278,10 @@ megasas_deplete_reply_queue(struct megasas_instance *instance, u8 alt_status)
if(instance->instancet->clear_intr(instance->reg_set)) if(instance->instancet->clear_intr(instance->reg_set))
return IRQ_NONE; return IRQ_NONE;
producer = *instance->producer; /*
consumer = *instance->consumer; * Schedule the tasklet for cmd completion
*/
while (consumer != producer) { tasklet_schedule(&instance->isr_tasklet);
context = instance->reply_queue[consumer];
cmd = instance->cmd_list[context];
megasas_complete_cmd(instance, cmd, alt_status);
consumer++;
if (consumer == (instance->max_fw_cmds + 1)) {
consumer = 0;
}
}
*instance->consumer = producer;
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -1741,6 +1723,39 @@ megasas_get_ctrl_info(struct megasas_instance *instance, ...@@ -1741,6 +1723,39 @@ megasas_get_ctrl_info(struct megasas_instance *instance,
return ret; return ret;
} }
/**
* megasas_complete_cmd_dpc - Returns FW's controller structure
* @instance_addr: Address of adapter soft state
*
* Tasklet to complete cmds
*/
void megasas_complete_cmd_dpc(unsigned long instance_addr)
{
u32 producer;
u32 consumer;
u32 context;
struct megasas_cmd *cmd;
struct megasas_instance *instance = (struct megasas_instance *)instance_addr;
producer = *instance->producer;
consumer = *instance->consumer;
while (consumer != producer) {
context = instance->reply_queue[consumer];
cmd = instance->cmd_list[context];
megasas_complete_cmd(instance, cmd, DID_OK);
consumer++;
if (consumer == (instance->max_fw_cmds + 1)) {
consumer = 0;
}
}
*instance->consumer = producer;
}
/** /**
* megasas_init_mfi - Initializes the FW * megasas_init_mfi - Initializes the FW
* @instance: Adapter soft state * @instance: Adapter soft state
...@@ -1911,6 +1926,12 @@ static int megasas_init_mfi(struct megasas_instance *instance) ...@@ -1911,6 +1926,12 @@ static int megasas_init_mfi(struct megasas_instance *instance)
kfree(ctrl_info); kfree(ctrl_info);
/*
* Setup tasklet for cmd completion
*/
tasklet_init(&instance->isr_tasklet, megasas_complete_cmd_dpc,
(unsigned long)instance);
return 0; return 0;
fail_fw_init: fail_fw_init:
...@@ -2470,6 +2491,7 @@ static void megasas_detach_one(struct pci_dev *pdev) ...@@ -2470,6 +2491,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
scsi_remove_host(instance->host); scsi_remove_host(instance->host);
megasas_flush_cache(instance); megasas_flush_cache(instance);
megasas_shutdown_controller(instance); megasas_shutdown_controller(instance);
tasklet_kill(&instance->isr_tasklet);
/* /*
* Take the instance off the instance array. Note that we will not * Take the instance off the instance array. Note that we will not
......
...@@ -1102,6 +1102,7 @@ struct megasas_instance { ...@@ -1102,6 +1102,7 @@ struct megasas_instance {
u32 hw_crit_error; u32 hw_crit_error;
struct megasas_instance_template *instancet; struct megasas_instance_template *instancet;
struct tasklet_struct isr_tasklet;
}; };
#define MEGASAS_IS_LOGICAL(scp) \ #define MEGASAS_IS_LOGICAL(scp) \
......
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