SCSI fixes on 20180222
These are mostly fixes for problems with merge window code. In addition we have one doc update (alua) and two dead code removals (aiclib and octogon) a spurious assignment removal (csiostor) and a performance improvement for storvsc involving better interrupt spreading and increasing the command per lun handling. Signed-off-by: James E.J. Bottomley <jejb@linux.vnet.ibm.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCWo+H2yYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishe2eAQDyWfoK Mfjbrl6cdPop+JIoED0VtBzAQyeXceJt8GYDQwEApXTIZon2HTdJqGawfUhaapBA JnO6iOiC13/nZjl7C28= =K3Pk -----END PGP SIGNATURE----- Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI fixes from James Bottomley: "These are mostly fixes for problems with merge window code. In addition we have one doc update (alua) and two dead code removals (aiclib and octogon) a spurious assignment removal (csiostor) and a performance improvement for storvsc involving better interrupt spreading and increasing the command per lun handling" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: qla4xxx: skip error recovery in case of register disconnect. scsi: aacraid: fix shutdown crash when init fails scsi: qedi: Cleanup local str variable scsi: qedi: Fix truncation of CHAP name and secret scsi: qla2xxx: Fix incorrect handle for abort IOCB scsi: qla2xxx: Fix double free bug after firmware timeout scsi: storvsc: Increase cmd_per_lun for higher speed devices scsi: qla2xxx: Fix a locking imbalance in qlt_24xx_handle_els() scsi: scsi_dh: Document alua_rtpg_queue() arguments scsi: Remove Makefile entry for oktagon files scsi: aic7xxx: remove aiclib.c scsi: qla2xxx: Avoid triggering undefined behavior in qla2x00_mbx_completion() scsi: mptfusion: Add bounds check in mptctl_hp_targetinfo() scsi: sym53c8xx_2: iterator underflow in sym_getsync() scsi: bnx2fc: Fix check in SCSI completion handler for timed out request scsi: csiostor: remove redundant assignment to pointer 'ln' scsi: ufs: Enable quirk to ignore sending WRITE_SAME command scsi: ibmvfc: fix misdefined reserved field in ibmvfc_fcp_rsp_info scsi: qla2xxx: Fix memory corruption during hba reset test scsi: mpt3sas: fix an out of bound write
This commit is contained in:
commit
170e07bf6b
|
@ -2687,6 +2687,8 @@ mptctl_hp_targetinfo(unsigned long arg)
|
||||||
__FILE__, __LINE__, iocnum);
|
__FILE__, __LINE__, iocnum);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
if (karg.hdr.id >= MPT_MAX_FC_DEVICES)
|
||||||
|
return -EINVAL;
|
||||||
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_hp_targetinfo called.\n",
|
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_hp_targetinfo called.\n",
|
||||||
ioc->name));
|
ioc->name));
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,6 @@ ncr53c8xx-flags-$(CONFIG_SCSI_ZALON) \
|
||||||
CFLAGS_ncr53c8xx.o := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m)
|
CFLAGS_ncr53c8xx.o := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m)
|
||||||
zalon7xx-objs := zalon.o ncr53c8xx.o
|
zalon7xx-objs := zalon.o ncr53c8xx.o
|
||||||
NCR_Q720_mod-objs := NCR_Q720.o ncr53c8xx.o
|
NCR_Q720_mod-objs := NCR_Q720.o ncr53c8xx.o
|
||||||
oktagon_esp_mod-objs := oktagon_esp.o oktagon_io.o
|
|
||||||
|
|
||||||
# Files generated that shall be removed upon make clean
|
# Files generated that shall be removed upon make clean
|
||||||
clean-files := 53c700_d.h 53c700_u.h
|
clean-files := 53c700_d.h 53c700_u.h
|
||||||
|
|
|
@ -1693,8 +1693,10 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||||
* Map in the registers from the adapter.
|
* Map in the registers from the adapter.
|
||||||
*/
|
*/
|
||||||
aac->base_size = AAC_MIN_FOOTPRINT_SIZE;
|
aac->base_size = AAC_MIN_FOOTPRINT_SIZE;
|
||||||
if ((*aac_drivers[index].init)(aac))
|
if ((*aac_drivers[index].init)(aac)) {
|
||||||
|
error = -ENODEV;
|
||||||
goto out_unmap;
|
goto out_unmap;
|
||||||
|
}
|
||||||
|
|
||||||
if (aac->sync_mode) {
|
if (aac->sync_mode) {
|
||||||
if (aac_sync_mode)
|
if (aac_sync_mode)
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
/*
|
|
||||||
* Implementation of Utility functions for all SCSI device types.
|
|
||||||
*
|
|
||||||
* Copyright (c) 1997, 1998, 1999 Justin T. Gibbs.
|
|
||||||
* Copyright (c) 1997, 1998 Kenneth D. Merry.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions, and the following disclaimer,
|
|
||||||
* without modification, immediately at the beginning of the file.
|
|
||||||
* 2. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* $FreeBSD: src/sys/cam/scsi/scsi_all.c,v 1.38 2002/09/23 04:56:35 mjacob Exp $
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "aiclib.h"
|
|
||||||
|
|
|
@ -1889,6 +1889,7 @@ void bnx2fc_process_scsi_cmd_compl(struct bnx2fc_cmd *io_req,
|
||||||
/* we will not receive ABTS response for this IO */
|
/* we will not receive ABTS response for this IO */
|
||||||
BNX2FC_IO_DBG(io_req, "Timer context finished processing "
|
BNX2FC_IO_DBG(io_req, "Timer context finished processing "
|
||||||
"this scsi cmd\n");
|
"this scsi cmd\n");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cancel the timeout_work, as we received IO completion */
|
/* Cancel the timeout_work, as we received IO completion */
|
||||||
|
|
|
@ -114,7 +114,7 @@ static enum csio_ln_ev fwevt_to_lnevt[] = {
|
||||||
static struct csio_lnode *
|
static struct csio_lnode *
|
||||||
csio_ln_lookup_by_portid(struct csio_hw *hw, uint8_t portid)
|
csio_ln_lookup_by_portid(struct csio_hw *hw, uint8_t portid)
|
||||||
{
|
{
|
||||||
struct csio_lnode *ln = hw->rln;
|
struct csio_lnode *ln;
|
||||||
struct list_head *tmp;
|
struct list_head *tmp;
|
||||||
|
|
||||||
/* Match siblings lnode with portid */
|
/* Match siblings lnode with portid */
|
||||||
|
|
|
@ -876,6 +876,11 @@ static void alua_rtpg_work(struct work_struct *work)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* alua_rtpg_queue() - cause RTPG to be submitted asynchronously
|
* alua_rtpg_queue() - cause RTPG to be submitted asynchronously
|
||||||
|
* @pg: ALUA port group associated with @sdev.
|
||||||
|
* @sdev: SCSI device for which to submit an RTPG.
|
||||||
|
* @qdata: Information about the callback to invoke after the RTPG.
|
||||||
|
* @force: Whether or not to submit an RTPG if a work item that will submit an
|
||||||
|
* RTPG already has been scheduled.
|
||||||
*
|
*
|
||||||
* Returns true if and only if alua_rtpg_work() will be called asynchronously.
|
* Returns true if and only if alua_rtpg_work() will be called asynchronously.
|
||||||
* That function is responsible for calling @qdata->fn().
|
* That function is responsible for calling @qdata->fn().
|
||||||
|
|
|
@ -367,7 +367,7 @@ enum ibmvfc_fcp_rsp_info_codes {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ibmvfc_fcp_rsp_info {
|
struct ibmvfc_fcp_rsp_info {
|
||||||
__be16 reserved;
|
u8 reserved[3];
|
||||||
u8 rsp_code;
|
u8 rsp_code;
|
||||||
u8 reserved2[4];
|
u8 reserved2[4];
|
||||||
}__attribute__((packed, aligned (2)));
|
}__attribute__((packed, aligned (2)));
|
||||||
|
|
|
@ -2410,8 +2410,11 @@ _base_assign_reply_queues(struct MPT3SAS_ADAPTER *ioc)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_cpu(cpu, mask)
|
for_each_cpu_and(cpu, mask, cpu_online_mask) {
|
||||||
|
if (cpu >= ioc->cpu_msix_table_sz)
|
||||||
|
break;
|
||||||
ioc->cpu_msix_table[cpu] = reply_q->msix_index;
|
ioc->cpu_msix_table[cpu] = reply_q->msix_index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1724,7 +1724,6 @@ static ssize_t qedi_show_boot_eth_info(void *data, int type, char *buf)
|
||||||
{
|
{
|
||||||
struct qedi_ctx *qedi = data;
|
struct qedi_ctx *qedi = data;
|
||||||
struct nvm_iscsi_initiator *initiator;
|
struct nvm_iscsi_initiator *initiator;
|
||||||
char *str = buf;
|
|
||||||
int rc = 1;
|
int rc = 1;
|
||||||
u32 ipv6_en, dhcp_en, ip_len;
|
u32 ipv6_en, dhcp_en, ip_len;
|
||||||
struct nvm_iscsi_block *block;
|
struct nvm_iscsi_block *block;
|
||||||
|
@ -1758,32 +1757,32 @@ static ssize_t qedi_show_boot_eth_info(void *data, int type, char *buf)
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ISCSI_BOOT_ETH_IP_ADDR:
|
case ISCSI_BOOT_ETH_IP_ADDR:
|
||||||
rc = snprintf(str, ip_len, fmt, ip);
|
rc = snprintf(buf, ip_len, fmt, ip);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_ETH_SUBNET_MASK:
|
case ISCSI_BOOT_ETH_SUBNET_MASK:
|
||||||
rc = snprintf(str, ip_len, fmt, sub);
|
rc = snprintf(buf, ip_len, fmt, sub);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_ETH_GATEWAY:
|
case ISCSI_BOOT_ETH_GATEWAY:
|
||||||
rc = snprintf(str, ip_len, fmt, gw);
|
rc = snprintf(buf, ip_len, fmt, gw);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_ETH_FLAGS:
|
case ISCSI_BOOT_ETH_FLAGS:
|
||||||
rc = snprintf(str, 3, "%hhd\n",
|
rc = snprintf(buf, 3, "%hhd\n",
|
||||||
SYSFS_FLAG_FW_SEL_BOOT);
|
SYSFS_FLAG_FW_SEL_BOOT);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_ETH_INDEX:
|
case ISCSI_BOOT_ETH_INDEX:
|
||||||
rc = snprintf(str, 3, "0\n");
|
rc = snprintf(buf, 3, "0\n");
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_ETH_MAC:
|
case ISCSI_BOOT_ETH_MAC:
|
||||||
rc = sysfs_format_mac(str, qedi->mac, ETH_ALEN);
|
rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_ETH_VLAN:
|
case ISCSI_BOOT_ETH_VLAN:
|
||||||
rc = snprintf(str, 12, "%d\n",
|
rc = snprintf(buf, 12, "%d\n",
|
||||||
GET_FIELD2(initiator->generic_cont0,
|
GET_FIELD2(initiator->generic_cont0,
|
||||||
NVM_ISCSI_CFG_INITIATOR_VLAN));
|
NVM_ISCSI_CFG_INITIATOR_VLAN));
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_ETH_ORIGIN:
|
case ISCSI_BOOT_ETH_ORIGIN:
|
||||||
if (dhcp_en)
|
if (dhcp_en)
|
||||||
rc = snprintf(str, 3, "3\n");
|
rc = snprintf(buf, 3, "3\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
@ -1819,7 +1818,6 @@ static ssize_t qedi_show_boot_ini_info(void *data, int type, char *buf)
|
||||||
{
|
{
|
||||||
struct qedi_ctx *qedi = data;
|
struct qedi_ctx *qedi = data;
|
||||||
struct nvm_iscsi_initiator *initiator;
|
struct nvm_iscsi_initiator *initiator;
|
||||||
char *str = buf;
|
|
||||||
int rc;
|
int rc;
|
||||||
struct nvm_iscsi_block *block;
|
struct nvm_iscsi_block *block;
|
||||||
|
|
||||||
|
@ -1831,8 +1829,8 @@ static ssize_t qedi_show_boot_ini_info(void *data, int type, char *buf)
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ISCSI_BOOT_INI_INITIATOR_NAME:
|
case ISCSI_BOOT_INI_INITIATOR_NAME:
|
||||||
rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
|
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
|
||||||
initiator->initiator_name.byte);
|
initiator->initiator_name.byte);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
@ -1860,7 +1858,6 @@ static ssize_t
|
||||||
qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
|
qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
|
||||||
char *buf, enum qedi_nvm_tgts idx)
|
char *buf, enum qedi_nvm_tgts idx)
|
||||||
{
|
{
|
||||||
char *str = buf;
|
|
||||||
int rc = 1;
|
int rc = 1;
|
||||||
u32 ctrl_flags, ipv6_en, chap_en, mchap_en, ip_len;
|
u32 ctrl_flags, ipv6_en, chap_en, mchap_en, ip_len;
|
||||||
struct nvm_iscsi_block *block;
|
struct nvm_iscsi_block *block;
|
||||||
|
@ -1899,48 +1896,48 @@ qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ISCSI_BOOT_TGT_NAME:
|
case ISCSI_BOOT_TGT_NAME:
|
||||||
rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
|
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
|
||||||
block->target[idx].target_name.byte);
|
block->target[idx].target_name.byte);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_IP_ADDR:
|
case ISCSI_BOOT_TGT_IP_ADDR:
|
||||||
if (ipv6_en)
|
if (ipv6_en)
|
||||||
rc = snprintf(str, ip_len, "%pI6\n",
|
rc = snprintf(buf, ip_len, "%pI6\n",
|
||||||
block->target[idx].ipv6_addr.byte);
|
block->target[idx].ipv6_addr.byte);
|
||||||
else
|
else
|
||||||
rc = snprintf(str, ip_len, "%pI4\n",
|
rc = snprintf(buf, ip_len, "%pI4\n",
|
||||||
block->target[idx].ipv4_addr.byte);
|
block->target[idx].ipv4_addr.byte);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_PORT:
|
case ISCSI_BOOT_TGT_PORT:
|
||||||
rc = snprintf(str, 12, "%d\n",
|
rc = snprintf(buf, 12, "%d\n",
|
||||||
GET_FIELD2(block->target[idx].generic_cont0,
|
GET_FIELD2(block->target[idx].generic_cont0,
|
||||||
NVM_ISCSI_CFG_TARGET_TCP_PORT));
|
NVM_ISCSI_CFG_TARGET_TCP_PORT));
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_LUN:
|
case ISCSI_BOOT_TGT_LUN:
|
||||||
rc = snprintf(str, 22, "%.*d\n",
|
rc = snprintf(buf, 22, "%.*d\n",
|
||||||
block->target[idx].lun.value[1],
|
block->target[idx].lun.value[1],
|
||||||
block->target[idx].lun.value[0]);
|
block->target[idx].lun.value[0]);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_CHAP_NAME:
|
case ISCSI_BOOT_TGT_CHAP_NAME:
|
||||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
|
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||||
chap_name);
|
chap_name);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_CHAP_SECRET:
|
case ISCSI_BOOT_TGT_CHAP_SECRET:
|
||||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
|
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||||
chap_secret);
|
chap_secret);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_REV_CHAP_NAME:
|
case ISCSI_BOOT_TGT_REV_CHAP_NAME:
|
||||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
|
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||||
mchap_name);
|
mchap_name);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
|
case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
|
||||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
|
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||||
mchap_secret);
|
mchap_secret);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_FLAGS:
|
case ISCSI_BOOT_TGT_FLAGS:
|
||||||
rc = snprintf(str, 3, "%hhd\n", SYSFS_FLAG_FW_SEL_BOOT);
|
rc = snprintf(buf, 3, "%hhd\n", SYSFS_FLAG_FW_SEL_BOOT);
|
||||||
break;
|
break;
|
||||||
case ISCSI_BOOT_TGT_NIC_ASSOC:
|
case ISCSI_BOOT_TGT_NIC_ASSOC:
|
||||||
rc = snprintf(str, 3, "0\n");
|
rc = snprintf(buf, 3, "0\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
|
@ -59,8 +59,6 @@ qla2x00_sp_timeout(struct timer_list *t)
|
||||||
req->outstanding_cmds[sp->handle] = NULL;
|
req->outstanding_cmds[sp->handle] = NULL;
|
||||||
iocb = &sp->u.iocb_cmd;
|
iocb = &sp->u.iocb_cmd;
|
||||||
iocb->timeout(sp);
|
iocb->timeout(sp);
|
||||||
if (sp->type != SRB_ELS_DCMD)
|
|
||||||
sp->free(sp);
|
|
||||||
spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
|
spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +100,6 @@ qla2x00_async_iocb_timeout(void *data)
|
||||||
srb_t *sp = data;
|
srb_t *sp = data;
|
||||||
fc_port_t *fcport = sp->fcport;
|
fc_port_t *fcport = sp->fcport;
|
||||||
struct srb_iocb *lio = &sp->u.iocb_cmd;
|
struct srb_iocb *lio = &sp->u.iocb_cmd;
|
||||||
struct event_arg ea;
|
|
||||||
|
|
||||||
if (fcport) {
|
if (fcport) {
|
||||||
ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
|
ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
|
||||||
|
@ -117,25 +114,13 @@ qla2x00_async_iocb_timeout(void *data)
|
||||||
|
|
||||||
switch (sp->type) {
|
switch (sp->type) {
|
||||||
case SRB_LOGIN_CMD:
|
case SRB_LOGIN_CMD:
|
||||||
if (!fcport)
|
|
||||||
break;
|
|
||||||
/* Retry as needed. */
|
/* Retry as needed. */
|
||||||
lio->u.logio.data[0] = MBS_COMMAND_ERROR;
|
lio->u.logio.data[0] = MBS_COMMAND_ERROR;
|
||||||
lio->u.logio.data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ?
|
lio->u.logio.data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ?
|
||||||
QLA_LOGIO_LOGIN_RETRIED : 0;
|
QLA_LOGIO_LOGIN_RETRIED : 0;
|
||||||
memset(&ea, 0, sizeof(ea));
|
sp->done(sp, QLA_FUNCTION_TIMEOUT);
|
||||||
ea.event = FCME_PLOGI_DONE;
|
|
||||||
ea.fcport = sp->fcport;
|
|
||||||
ea.data[0] = lio->u.logio.data[0];
|
|
||||||
ea.data[1] = lio->u.logio.data[1];
|
|
||||||
ea.sp = sp;
|
|
||||||
qla24xx_handle_plogi_done_event(fcport->vha, &ea);
|
|
||||||
break;
|
break;
|
||||||
case SRB_LOGOUT_CMD:
|
case SRB_LOGOUT_CMD:
|
||||||
if (!fcport)
|
|
||||||
break;
|
|
||||||
qlt_logo_completion_handler(fcport, QLA_FUNCTION_TIMEOUT);
|
|
||||||
break;
|
|
||||||
case SRB_CT_PTHRU_CMD:
|
case SRB_CT_PTHRU_CMD:
|
||||||
case SRB_MB_IOCB:
|
case SRB_MB_IOCB:
|
||||||
case SRB_NACK_PLOGI:
|
case SRB_NACK_PLOGI:
|
||||||
|
@ -235,12 +220,10 @@ static void
|
||||||
qla2x00_async_logout_sp_done(void *ptr, int res)
|
qla2x00_async_logout_sp_done(void *ptr, int res)
|
||||||
{
|
{
|
||||||
srb_t *sp = ptr;
|
srb_t *sp = ptr;
|
||||||
struct srb_iocb *lio = &sp->u.iocb_cmd;
|
|
||||||
|
|
||||||
sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
|
sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
|
||||||
if (!test_bit(UNLOADING, &sp->vha->dpc_flags))
|
sp->fcport->login_gen++;
|
||||||
qla2x00_post_async_logout_done_work(sp->vha, sp->fcport,
|
qlt_logo_completion_handler(sp->fcport, res);
|
||||||
lio->u.logio.data);
|
|
||||||
sp->free(sp);
|
sp->free(sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3275,12 +3275,11 @@ qla24xx_abort_iocb(srb_t *sp, struct abort_entry_24xx *abt_iocb)
|
||||||
memset(abt_iocb, 0, sizeof(struct abort_entry_24xx));
|
memset(abt_iocb, 0, sizeof(struct abort_entry_24xx));
|
||||||
abt_iocb->entry_type = ABORT_IOCB_TYPE;
|
abt_iocb->entry_type = ABORT_IOCB_TYPE;
|
||||||
abt_iocb->entry_count = 1;
|
abt_iocb->entry_count = 1;
|
||||||
abt_iocb->handle =
|
abt_iocb->handle = cpu_to_le32(MAKE_HANDLE(req->id, sp->handle));
|
||||||
cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no,
|
|
||||||
aio->u.abt.cmd_hndl));
|
|
||||||
abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
|
abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
|
||||||
abt_iocb->handle_to_abort =
|
abt_iocb->handle_to_abort =
|
||||||
cpu_to_le32(MAKE_HANDLE(req->id, aio->u.abt.cmd_hndl));
|
cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no,
|
||||||
|
aio->u.abt.cmd_hndl));
|
||||||
abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
|
abt_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
|
||||||
abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
|
abt_iocb->port_id[1] = sp->fcport->d_id.b.area;
|
||||||
abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
|
abt_iocb->port_id[2] = sp->fcport->d_id.b.domain;
|
||||||
|
|
|
@ -272,7 +272,8 @@ qla2x00_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
|
||||||
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
|
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
|
||||||
|
|
||||||
/* Read all mbox registers? */
|
/* Read all mbox registers? */
|
||||||
mboxes = (1 << ha->mbx_count) - 1;
|
WARN_ON_ONCE(ha->mbx_count > 32);
|
||||||
|
mboxes = (1ULL << ha->mbx_count) - 1;
|
||||||
if (!ha->mcp)
|
if (!ha->mcp)
|
||||||
ql_dbg(ql_dbg_async, vha, 0x5001, "MBX pointer ERROR.\n");
|
ql_dbg(ql_dbg_async, vha, 0x5001, "MBX pointer ERROR.\n");
|
||||||
else
|
else
|
||||||
|
@ -2880,7 +2881,8 @@ qla24xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
|
||||||
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
||||||
|
|
||||||
/* Read all mbox registers? */
|
/* Read all mbox registers? */
|
||||||
mboxes = (1 << ha->mbx_count) - 1;
|
WARN_ON_ONCE(ha->mbx_count > 32);
|
||||||
|
mboxes = (1ULL << ha->mbx_count) - 1;
|
||||||
if (!ha->mcp)
|
if (!ha->mcp)
|
||||||
ql_dbg(ql_dbg_async, vha, 0x504e, "MBX pointer ERROR.\n");
|
ql_dbg(ql_dbg_async, vha, 0x504e, "MBX pointer ERROR.\n");
|
||||||
else
|
else
|
||||||
|
|
|
@ -3625,6 +3625,8 @@ qla2x00_remove_one(struct pci_dev *pdev)
|
||||||
}
|
}
|
||||||
qla2x00_wait_for_hba_ready(base_vha);
|
qla2x00_wait_for_hba_ready(base_vha);
|
||||||
|
|
||||||
|
qla2x00_wait_for_sess_deletion(base_vha);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if UNLOAD flag is already set, then continue unload,
|
* if UNLOAD flag is already set, then continue unload,
|
||||||
* where it was set first.
|
* where it was set first.
|
||||||
|
|
|
@ -4871,8 +4871,6 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
|
||||||
sess);
|
sess);
|
||||||
qlt_send_term_imm_notif(vha, iocb, 1);
|
qlt_send_term_imm_notif(vha, iocb, 1);
|
||||||
res = 0;
|
res = 0;
|
||||||
spin_lock_irqsave(&tgt->ha->tgt.sess_lock,
|
|
||||||
flags);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -168,6 +168,8 @@
|
||||||
#define DEV_DB_NON_PERSISTENT 0
|
#define DEV_DB_NON_PERSISTENT 0
|
||||||
#define DEV_DB_PERSISTENT 1
|
#define DEV_DB_PERSISTENT 1
|
||||||
|
|
||||||
|
#define QL4_ISP_REG_DISCONNECT 0xffffffffU
|
||||||
|
|
||||||
#define COPY_ISID(dst_isid, src_isid) { \
|
#define COPY_ISID(dst_isid, src_isid) { \
|
||||||
int i, j; \
|
int i, j; \
|
||||||
for (i = 0, j = ISID_SIZE - 1; i < ISID_SIZE;) \
|
for (i = 0, j = ISID_SIZE - 1; i < ISID_SIZE;) \
|
||||||
|
|
|
@ -262,6 +262,24 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
|
||||||
|
|
||||||
static struct scsi_transport_template *qla4xxx_scsi_transport;
|
static struct scsi_transport_template *qla4xxx_scsi_transport;
|
||||||
|
|
||||||
|
static int qla4xxx_isp_check_reg(struct scsi_qla_host *ha)
|
||||||
|
{
|
||||||
|
u32 reg_val = 0;
|
||||||
|
int rval = QLA_SUCCESS;
|
||||||
|
|
||||||
|
if (is_qla8022(ha))
|
||||||
|
reg_val = readl(&ha->qla4_82xx_reg->host_status);
|
||||||
|
else if (is_qla8032(ha) || is_qla8042(ha))
|
||||||
|
reg_val = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_ALIVE_COUNTER);
|
||||||
|
else
|
||||||
|
reg_val = readw(&ha->reg->ctrl_status);
|
||||||
|
|
||||||
|
if (reg_val == QL4_ISP_REG_DISCONNECT)
|
||||||
|
rval = QLA_ERROR;
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
|
static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
|
||||||
uint32_t iface_type, uint32_t payload_size,
|
uint32_t iface_type, uint32_t payload_size,
|
||||||
uint32_t pid, struct sockaddr *dst_addr)
|
uint32_t pid, struct sockaddr *dst_addr)
|
||||||
|
@ -9186,10 +9204,17 @@ static int qla4xxx_eh_abort(struct scsi_cmnd *cmd)
|
||||||
struct srb *srb = NULL;
|
struct srb *srb = NULL;
|
||||||
int ret = SUCCESS;
|
int ret = SUCCESS;
|
||||||
int wait = 0;
|
int wait = 0;
|
||||||
|
int rval;
|
||||||
|
|
||||||
ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued cmd=%p, cdb=0x%x\n",
|
ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued cmd=%p, cdb=0x%x\n",
|
||||||
ha->host_no, id, lun, cmd, cmd->cmnd[0]);
|
ha->host_no, id, lun, cmd, cmd->cmnd[0]);
|
||||||
|
|
||||||
|
rval = qla4xxx_isp_check_reg(ha);
|
||||||
|
if (rval != QLA_SUCCESS) {
|
||||||
|
ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n");
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||||
srb = (struct srb *) CMD_SP(cmd);
|
srb = (struct srb *) CMD_SP(cmd);
|
||||||
if (!srb) {
|
if (!srb) {
|
||||||
|
@ -9241,6 +9266,7 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
|
||||||
struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
|
struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
|
||||||
struct ddb_entry *ddb_entry = cmd->device->hostdata;
|
struct ddb_entry *ddb_entry = cmd->device->hostdata;
|
||||||
int ret = FAILED, stat;
|
int ret = FAILED, stat;
|
||||||
|
int rval;
|
||||||
|
|
||||||
if (!ddb_entry)
|
if (!ddb_entry)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -9260,6 +9286,12 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
|
||||||
cmd, jiffies, cmd->request->timeout / HZ,
|
cmd, jiffies, cmd->request->timeout / HZ,
|
||||||
ha->dpc_flags, cmd->result, cmd->allowed));
|
ha->dpc_flags, cmd->result, cmd->allowed));
|
||||||
|
|
||||||
|
rval = qla4xxx_isp_check_reg(ha);
|
||||||
|
if (rval != QLA_SUCCESS) {
|
||||||
|
ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n");
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: wait for hba to go online */
|
/* FIXME: wait for hba to go online */
|
||||||
stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun);
|
stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun);
|
||||||
if (stat != QLA_SUCCESS) {
|
if (stat != QLA_SUCCESS) {
|
||||||
|
@ -9303,6 +9335,7 @@ static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
|
||||||
struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
|
struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
|
||||||
struct ddb_entry *ddb_entry = cmd->device->hostdata;
|
struct ddb_entry *ddb_entry = cmd->device->hostdata;
|
||||||
int stat, ret;
|
int stat, ret;
|
||||||
|
int rval;
|
||||||
|
|
||||||
if (!ddb_entry)
|
if (!ddb_entry)
|
||||||
return FAILED;
|
return FAILED;
|
||||||
|
@ -9320,6 +9353,12 @@ static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
|
||||||
ha->host_no, cmd, jiffies, cmd->request->timeout / HZ,
|
ha->host_no, cmd, jiffies, cmd->request->timeout / HZ,
|
||||||
ha->dpc_flags, cmd->result, cmd->allowed));
|
ha->dpc_flags, cmd->result, cmd->allowed));
|
||||||
|
|
||||||
|
rval = qla4xxx_isp_check_reg(ha);
|
||||||
|
if (rval != QLA_SUCCESS) {
|
||||||
|
ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n");
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
stat = qla4xxx_reset_target(ha, ddb_entry);
|
stat = qla4xxx_reset_target(ha, ddb_entry);
|
||||||
if (stat != QLA_SUCCESS) {
|
if (stat != QLA_SUCCESS) {
|
||||||
starget_printk(KERN_INFO, scsi_target(cmd->device),
|
starget_printk(KERN_INFO, scsi_target(cmd->device),
|
||||||
|
@ -9374,9 +9413,16 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
|
||||||
{
|
{
|
||||||
int return_status = FAILED;
|
int return_status = FAILED;
|
||||||
struct scsi_qla_host *ha;
|
struct scsi_qla_host *ha;
|
||||||
|
int rval;
|
||||||
|
|
||||||
ha = to_qla_host(cmd->device->host);
|
ha = to_qla_host(cmd->device->host);
|
||||||
|
|
||||||
|
rval = qla4xxx_isp_check_reg(ha);
|
||||||
|
if (rval != QLA_SUCCESS) {
|
||||||
|
ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, exiting.\n");
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba)
|
if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba)
|
||||||
qla4_83xx_set_idc_dontreset(ha);
|
qla4_83xx_set_idc_dontreset(ha);
|
||||||
|
|
||||||
|
|
|
@ -1657,7 +1657,7 @@ static struct scsi_host_template scsi_driver = {
|
||||||
.eh_timed_out = storvsc_eh_timed_out,
|
.eh_timed_out = storvsc_eh_timed_out,
|
||||||
.slave_alloc = storvsc_device_alloc,
|
.slave_alloc = storvsc_device_alloc,
|
||||||
.slave_configure = storvsc_device_configure,
|
.slave_configure = storvsc_device_configure,
|
||||||
.cmd_per_lun = 255,
|
.cmd_per_lun = 2048,
|
||||||
.this_id = -1,
|
.this_id = -1,
|
||||||
.use_clustering = ENABLE_CLUSTERING,
|
.use_clustering = ENABLE_CLUSTERING,
|
||||||
/* Make sure we dont get a sg segment crosses a page boundary */
|
/* Make sure we dont get a sg segment crosses a page boundary */
|
||||||
|
|
|
@ -536,7 +536,7 @@ sym_getsync(struct sym_hcb *np, u_char dt, u_char sfac, u_char *divp, u_char *fa
|
||||||
* Look for the greatest clock divisor that allows an
|
* Look for the greatest clock divisor that allows an
|
||||||
* input speed faster than the period.
|
* input speed faster than the period.
|
||||||
*/
|
*/
|
||||||
while (div-- > 0)
|
while (--div > 0)
|
||||||
if (kpc >= (div_10M[div] << 2)) break;
|
if (kpc >= (div_10M[div] << 2)) break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4352,6 +4352,8 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev)
|
||||||
/* REPORT SUPPORTED OPERATION CODES is not supported */
|
/* REPORT SUPPORTED OPERATION CODES is not supported */
|
||||||
sdev->no_report_opcodes = 1;
|
sdev->no_report_opcodes = 1;
|
||||||
|
|
||||||
|
/* WRITE_SAME command is not supported */
|
||||||
|
sdev->no_write_same = 1;
|
||||||
|
|
||||||
ufshcd_set_queue_depth(sdev);
|
ufshcd_set_queue_depth(sdev);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue