|
@@ -650,9 +650,9 @@ int pm8001_dev_found(struct domain_device *dev)
|
|
|
|
|
|
static void pm8001_task_done(struct sas_task *task)
|
|
static void pm8001_task_done(struct sas_task *task)
|
|
{
|
|
{
|
|
- if (!del_timer(&task->timer))
|
|
|
|
|
|
+ if (!del_timer(&task->slow_task->timer))
|
|
return;
|
|
return;
|
|
- complete(&task->completion);
|
|
|
|
|
|
+ complete(&task->slow_task->completion);
|
|
}
|
|
}
|
|
|
|
|
|
static void pm8001_tmf_timedout(unsigned long data)
|
|
static void pm8001_tmf_timedout(unsigned long data)
|
|
@@ -660,7 +660,7 @@ static void pm8001_tmf_timedout(unsigned long data)
|
|
struct sas_task *task = (struct sas_task *)data;
|
|
struct sas_task *task = (struct sas_task *)data;
|
|
|
|
|
|
task->task_state_flags |= SAS_TASK_STATE_ABORTED;
|
|
task->task_state_flags |= SAS_TASK_STATE_ABORTED;
|
|
- complete(&task->completion);
|
|
|
|
|
|
+ complete(&task->slow_task->completion);
|
|
}
|
|
}
|
|
|
|
|
|
#define PM8001_TASK_TIMEOUT 20
|
|
#define PM8001_TASK_TIMEOUT 20
|
|
@@ -683,7 +683,7 @@ static int pm8001_exec_internal_tmf_task(struct domain_device *dev,
|
|
struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev);
|
|
struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev);
|
|
|
|
|
|
for (retry = 0; retry < 3; retry++) {
|
|
for (retry = 0; retry < 3; retry++) {
|
|
- task = sas_alloc_task(GFP_KERNEL);
|
|
|
|
|
|
+ task = sas_alloc_slow_task(GFP_KERNEL);
|
|
if (!task)
|
|
if (!task)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -691,21 +691,21 @@ static int pm8001_exec_internal_tmf_task(struct domain_device *dev,
|
|
task->task_proto = dev->tproto;
|
|
task->task_proto = dev->tproto;
|
|
memcpy(&task->ssp_task, parameter, para_len);
|
|
memcpy(&task->ssp_task, parameter, para_len);
|
|
task->task_done = pm8001_task_done;
|
|
task->task_done = pm8001_task_done;
|
|
- task->timer.data = (unsigned long)task;
|
|
|
|
- task->timer.function = pm8001_tmf_timedout;
|
|
|
|
- task->timer.expires = jiffies + PM8001_TASK_TIMEOUT*HZ;
|
|
|
|
- add_timer(&task->timer);
|
|
|
|
|
|
+ task->slow_task->timer.data = (unsigned long)task;
|
|
|
|
+ task->slow_task->timer.function = pm8001_tmf_timedout;
|
|
|
|
+ task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT*HZ;
|
|
|
|
+ add_timer(&task->slow_task->timer);
|
|
|
|
|
|
res = pm8001_task_exec(task, 1, GFP_KERNEL, 1, tmf);
|
|
res = pm8001_task_exec(task, 1, GFP_KERNEL, 1, tmf);
|
|
|
|
|
|
if (res) {
|
|
if (res) {
|
|
- del_timer(&task->timer);
|
|
|
|
|
|
+ del_timer(&task->slow_task->timer);
|
|
PM8001_FAIL_DBG(pm8001_ha,
|
|
PM8001_FAIL_DBG(pm8001_ha,
|
|
pm8001_printk("Executing internal task "
|
|
pm8001_printk("Executing internal task "
|
|
"failed\n"));
|
|
"failed\n"));
|
|
goto ex_err;
|
|
goto ex_err;
|
|
}
|
|
}
|
|
- wait_for_completion(&task->completion);
|
|
|
|
|
|
+ wait_for_completion(&task->slow_task->completion);
|
|
res = -TMF_RESP_FUNC_FAILED;
|
|
res = -TMF_RESP_FUNC_FAILED;
|
|
/* Even TMF timed out, return direct. */
|
|
/* Even TMF timed out, return direct. */
|
|
if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
|
|
if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
|
|
@@ -765,17 +765,17 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
|
|
struct sas_task *task = NULL;
|
|
struct sas_task *task = NULL;
|
|
|
|
|
|
for (retry = 0; retry < 3; retry++) {
|
|
for (retry = 0; retry < 3; retry++) {
|
|
- task = sas_alloc_task(GFP_KERNEL);
|
|
|
|
|
|
+ task = sas_alloc_slow_task(GFP_KERNEL);
|
|
if (!task)
|
|
if (!task)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
task->dev = dev;
|
|
task->dev = dev;
|
|
task->task_proto = dev->tproto;
|
|
task->task_proto = dev->tproto;
|
|
task->task_done = pm8001_task_done;
|
|
task->task_done = pm8001_task_done;
|
|
- task->timer.data = (unsigned long)task;
|
|
|
|
- task->timer.function = pm8001_tmf_timedout;
|
|
|
|
- task->timer.expires = jiffies + PM8001_TASK_TIMEOUT * HZ;
|
|
|
|
- add_timer(&task->timer);
|
|
|
|
|
|
+ task->slow_task->timer.data = (unsigned long)task;
|
|
|
|
+ task->slow_task->timer.function = pm8001_tmf_timedout;
|
|
|
|
+ task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT * HZ;
|
|
|
|
+ add_timer(&task->slow_task->timer);
|
|
|
|
|
|
res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
|
|
res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
|
|
if (res)
|
|
if (res)
|
|
@@ -789,13 +789,13 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
|
|
pm8001_dev, flag, task_tag, ccb_tag);
|
|
pm8001_dev, flag, task_tag, ccb_tag);
|
|
|
|
|
|
if (res) {
|
|
if (res) {
|
|
- del_timer(&task->timer);
|
|
|
|
|
|
+ del_timer(&task->slow_task->timer);
|
|
PM8001_FAIL_DBG(pm8001_ha,
|
|
PM8001_FAIL_DBG(pm8001_ha,
|
|
pm8001_printk("Executing internal task "
|
|
pm8001_printk("Executing internal task "
|
|
"failed\n"));
|
|
"failed\n"));
|
|
goto ex_err;
|
|
goto ex_err;
|
|
}
|
|
}
|
|
- wait_for_completion(&task->completion);
|
|
|
|
|
|
+ wait_for_completion(&task->slow_task->completion);
|
|
res = TMF_RESP_FUNC_FAILED;
|
|
res = TMF_RESP_FUNC_FAILED;
|
|
/* Even TMF timed out, return direct. */
|
|
/* Even TMF timed out, return direct. */
|
|
if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
|
|
if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
|