mirror of https://gitee.com/openkylin/linux.git
[SCSI] mpt2sas: Call init_completion on a per request basis.
Now driver call init_completion on a per request basis. At some point the wait_for_completion_timeout is not waiting for the timeout, instead returning immediately, thus going into diag reset. This fix will address all request using the wait_for_completion_timeout API. The previous implimentation was only calling init_completion at driver load time. Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
77e63ed443
commit
bcfb6e6ea4
|
@ -2614,6 +2614,7 @@ mpt2sas_base_sas_iounit_control(struct MPT2SAS_ADAPTER *ioc,
|
||||||
mpi_request->Operation == MPI2_SAS_OP_PHY_LINK_RESET)
|
mpi_request->Operation == MPI2_SAS_OP_PHY_LINK_RESET)
|
||||||
ioc->ioc_link_reset_in_progress = 1;
|
ioc->ioc_link_reset_in_progress = 1;
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->base_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
||||||
msecs_to_jiffies(10000));
|
msecs_to_jiffies(10000));
|
||||||
if ((mpi_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET ||
|
if ((mpi_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET ||
|
||||||
|
@ -2715,6 +2716,7 @@ mpt2sas_base_scsi_enclosure_processor(struct MPT2SAS_ADAPTER *ioc,
|
||||||
ioc->base_cmds.smid = smid;
|
ioc->base_cmds.smid = smid;
|
||||||
memcpy(request, mpi_request, sizeof(Mpi2SepReply_t));
|
memcpy(request, mpi_request, sizeof(Mpi2SepReply_t));
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->base_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
||||||
msecs_to_jiffies(10000));
|
msecs_to_jiffies(10000));
|
||||||
if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) {
|
if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) {
|
||||||
|
@ -2991,6 +2993,7 @@ _base_send_port_enable(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
|
||||||
mpi_request->VP_ID = 0;
|
mpi_request->VP_ID = 0;
|
||||||
|
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->base_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done,
|
||||||
300*HZ);
|
300*HZ);
|
||||||
if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) {
|
if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) {
|
||||||
|
@ -3090,6 +3093,7 @@ _base_event_notification(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
|
||||||
mpi_request->EventMasks[i] =
|
mpi_request->EventMasks[i] =
|
||||||
le32_to_cpu(ioc->event_masks[i]);
|
le32_to_cpu(ioc->event_masks[i]);
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->base_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done, 30*HZ);
|
timeleft = wait_for_completion_timeout(&ioc->base_cmds.done, 30*HZ);
|
||||||
if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) {
|
if (!(ioc->base_cmds.status & MPT2_CMD_COMPLETE)) {
|
||||||
printk(MPT2SAS_ERR_FMT "%s: timeout\n",
|
printk(MPT2SAS_ERR_FMT "%s: timeout\n",
|
||||||
|
@ -3486,7 +3490,6 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
||||||
|
|
||||||
/* base internal command bits */
|
/* base internal command bits */
|
||||||
mutex_init(&ioc->base_cmds.mutex);
|
mutex_init(&ioc->base_cmds.mutex);
|
||||||
init_completion(&ioc->base_cmds.done);
|
|
||||||
ioc->base_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
ioc->base_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
||||||
ioc->base_cmds.status = MPT2_CMD_NOT_USED;
|
ioc->base_cmds.status = MPT2_CMD_NOT_USED;
|
||||||
|
|
||||||
|
@ -3494,7 +3497,6 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
||||||
ioc->transport_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
ioc->transport_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
||||||
ioc->transport_cmds.status = MPT2_CMD_NOT_USED;
|
ioc->transport_cmds.status = MPT2_CMD_NOT_USED;
|
||||||
mutex_init(&ioc->transport_cmds.mutex);
|
mutex_init(&ioc->transport_cmds.mutex);
|
||||||
init_completion(&ioc->transport_cmds.done);
|
|
||||||
|
|
||||||
/* task management internal command bits */
|
/* task management internal command bits */
|
||||||
ioc->tm_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
ioc->tm_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
||||||
|
@ -3510,7 +3512,6 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
||||||
ioc->ctl_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
ioc->ctl_cmds.reply = kzalloc(ioc->reply_sz, GFP_KERNEL);
|
||||||
ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
|
ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
|
||||||
mutex_init(&ioc->ctl_cmds.mutex);
|
mutex_init(&ioc->ctl_cmds.mutex);
|
||||||
init_completion(&ioc->ctl_cmds.done);
|
|
||||||
|
|
||||||
for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++)
|
for (i = 0; i < MPI2_EVENT_NOTIFY_EVENTMASK_WORDS; i++)
|
||||||
ioc->event_masks[i] = -1;
|
ioc->event_masks[i] = -1;
|
||||||
|
|
|
@ -812,6 +812,7 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc,
|
||||||
timeout = MPT2_IOCTL_DEFAULT_TIMEOUT;
|
timeout = MPT2_IOCTL_DEFAULT_TIMEOUT;
|
||||||
else
|
else
|
||||||
timeout = karg.timeout;
|
timeout = karg.timeout;
|
||||||
|
init_completion(&ioc->ctl_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
||||||
timeout*HZ);
|
timeout*HZ);
|
||||||
if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) {
|
if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) {
|
||||||
|
@ -1388,6 +1389,7 @@ _ctl_diag_register(void __user *arg, enum block_state state)
|
||||||
cpu_to_le32(ioc->product_specific[buffer_type][i]);
|
cpu_to_le32(ioc->product_specific[buffer_type][i]);
|
||||||
|
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->ctl_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
||||||
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
||||||
|
|
||||||
|
@ -1654,6 +1656,7 @@ _ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type, u8 *issue_reset)
|
||||||
mpi_request->VP_ID = 0;
|
mpi_request->VP_ID = 0;
|
||||||
|
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->ctl_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
||||||
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
||||||
|
|
||||||
|
@ -1915,6 +1918,7 @@ _ctl_diag_read_buffer(void __user *arg, enum block_state state)
|
||||||
mpi_request->VP_ID = 0;
|
mpi_request->VP_ID = 0;
|
||||||
|
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->ctl_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
||||||
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
||||||
|
|
||||||
|
|
|
@ -401,6 +401,7 @@ _transport_expander_report_manufacture(struct MPT2SAS_ADAPTER *ioc,
|
||||||
"send to sas_addr(0x%016llx)\n", ioc->name,
|
"send to sas_addr(0x%016llx)\n", ioc->name,
|
||||||
(unsigned long long)sas_address));
|
(unsigned long long)sas_address));
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->transport_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
||||||
10*HZ);
|
10*HZ);
|
||||||
|
|
||||||
|
@ -1154,6 +1155,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||||
"sending smp request\n", ioc->name, __func__));
|
"sending smp request\n", ioc->name, __func__));
|
||||||
|
|
||||||
mpt2sas_base_put_smid_default(ioc, smid);
|
mpt2sas_base_put_smid_default(ioc, smid);
|
||||||
|
init_completion(&ioc->transport_cmds.done);
|
||||||
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
timeleft = wait_for_completion_timeout(&ioc->transport_cmds.done,
|
||||||
10*HZ);
|
10*HZ);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue