Re: [PATCH V1 16/24] qla4xxx: Fix failure of mbox 0x31

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/17/2014 03:43 AM, vikas.chaudhary@xxxxxxxxxx wrote:
> From: Vikas Chaudhary <vikas.chaudhary@xxxxxxxxxx>
> 
> Issue:
> While unloading driver MBOX 0x31 fail as DDB logout (MBOX 0x56)
> operation is not completed.
> 
> Fix:
> Wait for DDB Logout completion before MBOX 0x31
> 
> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@xxxxxxxxxx>
> ---
>  drivers/scsi/qla4xxx/ql4_os.c | 56 ++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 48 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
> index a27da31..7807a13 100644
> --- a/drivers/scsi/qla4xxx/ql4_os.c
> +++ b/drivers/scsi/qla4xxx/ql4_os.c
> @@ -8886,10 +8886,56 @@ static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha)
>  	}
>  }
>  
> +static void qla4xxx_destroy_ddb(struct scsi_qla_host *ha,
> +		struct ddb_entry *ddb_entry)
> +{
> +	struct dev_db_entry *fw_ddb_entry = NULL;
> +	dma_addr_t fw_ddb_entry_dma;
> +	unsigned long wtime;
> +	uint32_t ddb_state;
> +	int options;
> +	int status;
> +
> +	options = LOGOUT_OPTION_CLOSE_SESSION;
> +	if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR) {
> +		ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__);
> +		goto clear_ddb;
> +	}
> +
> +	fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
> +					  &fw_ddb_entry_dma, GFP_KERNEL);
> +	if (!fw_ddb_entry) {
> +		ql4_printk(KERN_ERR, ha,
> +			   "%s: Unable to allocate dma buffer\n", __func__);
> +		goto clear_ddb;
> +	}
> +
> +	wtime = jiffies + (HZ * LOGOUT_TOV);
> +	do {
> +		status = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index,
> +						 fw_ddb_entry, fw_ddb_entry_dma,
> +						 NULL, NULL, &ddb_state, NULL,
> +						 NULL, NULL);
> +		if (status == QLA_ERROR)
> +			goto free_ddb;
> +
> +		if ((ddb_state == DDB_DS_NO_CONNECTION_ACTIVE) ||
> +		    (ddb_state == DDB_DS_SESSION_FAILED))
> +			goto free_ddb;
> +
> +		schedule_timeout_uninterruptible(HZ);
> +	} while ((time_after(wtime, jiffies)));
> +
> +free_ddb:
> +	dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
> +			  fw_ddb_entry, fw_ddb_entry_dma);
> +clear_ddb:
> +	qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index);
> +}


Looks ok now.

Reviewed-by: Mike Christie <michaelc@xxxxxxxxxxx>

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux