forked from Minki/linux
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);
|
||||
return -ENODEV;
|
||||
}
|
||||
if (karg.hdr.id >= MPT_MAX_FC_DEVICES)
|
||||
return -EINVAL;
|
||||
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_hp_targetinfo called.\n",
|
||||
ioc->name));
|
||||
|
||||
|
@ -185,7 +185,6 @@ ncr53c8xx-flags-$(CONFIG_SCSI_ZALON) \
|
||||
CFLAGS_ncr53c8xx.o := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m)
|
||||
zalon7xx-objs := zalon.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
|
||||
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.
|
||||
*/
|
||||
aac->base_size = AAC_MIN_FOOTPRINT_SIZE;
|
||||
if ((*aac_drivers[index].init)(aac))
|
||||
if ((*aac_drivers[index].init)(aac)) {
|
||||
error = -ENODEV;
|
||||
goto out_unmap;
|
||||
}
|
||||
|
||||
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 */
|
||||
BNX2FC_IO_DBG(io_req, "Timer context finished processing "
|
||||
"this scsi cmd\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* 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 *
|
||||
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;
|
||||
|
||||
/* 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
|
||||
* @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.
|
||||
* That function is responsible for calling @qdata->fn().
|
||||
|
@ -367,7 +367,7 @@ enum ibmvfc_fcp_rsp_info_codes {
|
||||
};
|
||||
|
||||
struct ibmvfc_fcp_rsp_info {
|
||||
__be16 reserved;
|
||||
u8 reserved[3];
|
||||
u8 rsp_code;
|
||||
u8 reserved2[4];
|
||||
}__attribute__((packed, aligned (2)));
|
||||
|
@ -2410,8 +2410,11 @@ _base_assign_reply_queues(struct MPT3SAS_ADAPTER *ioc)
|
||||
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;
|
||||
}
|
||||
}
|
||||
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 nvm_iscsi_initiator *initiator;
|
||||
char *str = buf;
|
||||
int rc = 1;
|
||||
u32 ipv6_en, dhcp_en, ip_len;
|
||||
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) {
|
||||
case ISCSI_BOOT_ETH_IP_ADDR:
|
||||
rc = snprintf(str, ip_len, fmt, ip);
|
||||
rc = snprintf(buf, ip_len, fmt, ip);
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_SUBNET_MASK:
|
||||
rc = snprintf(str, ip_len, fmt, sub);
|
||||
rc = snprintf(buf, ip_len, fmt, sub);
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_GATEWAY:
|
||||
rc = snprintf(str, ip_len, fmt, gw);
|
||||
rc = snprintf(buf, ip_len, fmt, gw);
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_FLAGS:
|
||||
rc = snprintf(str, 3, "%hhd\n",
|
||||
rc = snprintf(buf, 3, "%hhd\n",
|
||||
SYSFS_FLAG_FW_SEL_BOOT);
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_INDEX:
|
||||
rc = snprintf(str, 3, "0\n");
|
||||
rc = snprintf(buf, 3, "0\n");
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_MAC:
|
||||
rc = sysfs_format_mac(str, qedi->mac, ETH_ALEN);
|
||||
rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN);
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_VLAN:
|
||||
rc = snprintf(str, 12, "%d\n",
|
||||
rc = snprintf(buf, 12, "%d\n",
|
||||
GET_FIELD2(initiator->generic_cont0,
|
||||
NVM_ISCSI_CFG_INITIATOR_VLAN));
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_ORIGIN:
|
||||
if (dhcp_en)
|
||||
rc = snprintf(str, 3, "3\n");
|
||||
rc = snprintf(buf, 3, "3\n");
|
||||
break;
|
||||
default:
|
||||
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 nvm_iscsi_initiator *initiator;
|
||||
char *str = buf;
|
||||
int rc;
|
||||
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) {
|
||||
case ISCSI_BOOT_INI_INITIATOR_NAME:
|
||||
rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
|
||||
initiator->initiator_name.byte);
|
||||
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
|
||||
initiator->initiator_name.byte);
|
||||
break;
|
||||
default:
|
||||
rc = 0;
|
||||
@ -1860,7 +1858,6 @@ static ssize_t
|
||||
qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
|
||||
char *buf, enum qedi_nvm_tgts idx)
|
||||
{
|
||||
char *str = buf;
|
||||
int rc = 1;
|
||||
u32 ctrl_flags, ipv6_en, chap_en, mchap_en, ip_len;
|
||||
struct nvm_iscsi_block *block;
|
||||
@ -1899,48 +1896,48 @@ qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
|
||||
|
||||
switch (type) {
|
||||
case ISCSI_BOOT_TGT_NAME:
|
||||
rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
|
||||
block->target[idx].target_name.byte);
|
||||
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
|
||||
block->target[idx].target_name.byte);
|
||||
break;
|
||||
case ISCSI_BOOT_TGT_IP_ADDR:
|
||||
if (ipv6_en)
|
||||
rc = snprintf(str, ip_len, "%pI6\n",
|
||||
rc = snprintf(buf, ip_len, "%pI6\n",
|
||||
block->target[idx].ipv6_addr.byte);
|
||||
else
|
||||
rc = snprintf(str, ip_len, "%pI4\n",
|
||||
rc = snprintf(buf, ip_len, "%pI4\n",
|
||||
block->target[idx].ipv4_addr.byte);
|
||||
break;
|
||||
case ISCSI_BOOT_TGT_PORT:
|
||||
rc = snprintf(str, 12, "%d\n",
|
||||
rc = snprintf(buf, 12, "%d\n",
|
||||
GET_FIELD2(block->target[idx].generic_cont0,
|
||||
NVM_ISCSI_CFG_TARGET_TCP_PORT));
|
||||
break;
|
||||
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[0]);
|
||||
break;
|
||||
case ISCSI_BOOT_TGT_CHAP_NAME:
|
||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
|
||||
chap_name);
|
||||
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||
chap_name);
|
||||
break;
|
||||
case ISCSI_BOOT_TGT_CHAP_SECRET:
|
||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
|
||||
chap_secret);
|
||||
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||
chap_secret);
|
||||
break;
|
||||
case ISCSI_BOOT_TGT_REV_CHAP_NAME:
|
||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
|
||||
mchap_name);
|
||||
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||
mchap_name);
|
||||
break;
|
||||
case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
|
||||
rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
|
||||
mchap_secret);
|
||||
rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
|
||||
mchap_secret);
|
||||
break;
|
||||
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;
|
||||
case ISCSI_BOOT_TGT_NIC_ASSOC:
|
||||
rc = snprintf(str, 3, "0\n");
|
||||
rc = snprintf(buf, 3, "0\n");
|
||||
break;
|
||||
default:
|
||||
rc = 0;
|
||||
|
@ -59,8 +59,6 @@ qla2x00_sp_timeout(struct timer_list *t)
|
||||
req->outstanding_cmds[sp->handle] = NULL;
|
||||
iocb = &sp->u.iocb_cmd;
|
||||
iocb->timeout(sp);
|
||||
if (sp->type != SRB_ELS_DCMD)
|
||||
sp->free(sp);
|
||||
spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
|
||||
}
|
||||
|
||||
@ -102,7 +100,6 @@ qla2x00_async_iocb_timeout(void *data)
|
||||
srb_t *sp = data;
|
||||
fc_port_t *fcport = sp->fcport;
|
||||
struct srb_iocb *lio = &sp->u.iocb_cmd;
|
||||
struct event_arg ea;
|
||||
|
||||
if (fcport) {
|
||||
ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
|
||||
@ -117,25 +114,13 @@ qla2x00_async_iocb_timeout(void *data)
|
||||
|
||||
switch (sp->type) {
|
||||
case SRB_LOGIN_CMD:
|
||||
if (!fcport)
|
||||
break;
|
||||
/* Retry as needed. */
|
||||
lio->u.logio.data[0] = MBS_COMMAND_ERROR;
|
||||
lio->u.logio.data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ?
|
||||
QLA_LOGIO_LOGIN_RETRIED : 0;
|
||||
memset(&ea, 0, sizeof(ea));
|
||||
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);
|
||||
sp->done(sp, QLA_FUNCTION_TIMEOUT);
|
||||
break;
|
||||
case SRB_LOGOUT_CMD:
|
||||
if (!fcport)
|
||||
break;
|
||||
qlt_logo_completion_handler(fcport, QLA_FUNCTION_TIMEOUT);
|
||||
break;
|
||||
case SRB_CT_PTHRU_CMD:
|
||||
case SRB_MB_IOCB:
|
||||
case SRB_NACK_PLOGI:
|
||||
@ -235,12 +220,10 @@ static void
|
||||
qla2x00_async_logout_sp_done(void *ptr, int res)
|
||||
{
|
||||
srb_t *sp = ptr;
|
||||
struct srb_iocb *lio = &sp->u.iocb_cmd;
|
||||
|
||||
sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
|
||||
if (!test_bit(UNLOADING, &sp->vha->dpc_flags))
|
||||
qla2x00_post_async_logout_done_work(sp->vha, sp->fcport,
|
||||
lio->u.logio.data);
|
||||
sp->fcport->login_gen++;
|
||||
qlt_logo_completion_handler(sp->fcport, res);
|
||||
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));
|
||||
abt_iocb->entry_type = ABORT_IOCB_TYPE;
|
||||
abt_iocb->entry_count = 1;
|
||||
abt_iocb->handle =
|
||||
cpu_to_le32(MAKE_HANDLE(aio->u.abt.req_que_no,
|
||||
aio->u.abt.cmd_hndl));
|
||||
abt_iocb->handle = cpu_to_le32(MAKE_HANDLE(req->id, sp->handle));
|
||||
abt_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id);
|
||||
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[1] = sp->fcport->d_id.b.area;
|
||||
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;
|
||||
|
||||
/* 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)
|
||||
ql_dbg(ql_dbg_async, vha, 0x5001, "MBX pointer ERROR.\n");
|
||||
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;
|
||||
|
||||
/* 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)
|
||||
ql_dbg(ql_dbg_async, vha, 0x504e, "MBX pointer ERROR.\n");
|
||||
else
|
||||
|
@ -3625,6 +3625,8 @@ qla2x00_remove_one(struct pci_dev *pdev)
|
||||
}
|
||||
qla2x00_wait_for_hba_ready(base_vha);
|
||||
|
||||
qla2x00_wait_for_sess_deletion(base_vha);
|
||||
|
||||
/*
|
||||
* if UNLOAD flag is already set, then continue unload,
|
||||
* where it was set first.
|
||||
|
@ -4871,8 +4871,6 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
|
||||
sess);
|
||||
qlt_send_term_imm_notif(vha, iocb, 1);
|
||||
res = 0;
|
||||
spin_lock_irqsave(&tgt->ha->tgt.sess_lock,
|
||||
flags);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -168,6 +168,8 @@
|
||||
#define DEV_DB_NON_PERSISTENT 0
|
||||
#define DEV_DB_PERSISTENT 1
|
||||
|
||||
#define QL4_ISP_REG_DISCONNECT 0xffffffffU
|
||||
|
||||
#define COPY_ISID(dst_isid, src_isid) { \
|
||||
int i, j; \
|
||||
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 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,
|
||||
uint32_t iface_type, uint32_t payload_size,
|
||||
uint32_t pid, struct sockaddr *dst_addr)
|
||||
@ -9186,10 +9204,17 @@ static int qla4xxx_eh_abort(struct scsi_cmnd *cmd)
|
||||
struct srb *srb = NULL;
|
||||
int ret = SUCCESS;
|
||||
int wait = 0;
|
||||
int rval;
|
||||
|
||||
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]);
|
||||
|
||||
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);
|
||||
srb = (struct srb *) CMD_SP(cmd);
|
||||
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 ddb_entry *ddb_entry = cmd->device->hostdata;
|
||||
int ret = FAILED, stat;
|
||||
int rval;
|
||||
|
||||
if (!ddb_entry)
|
||||
return ret;
|
||||
@ -9260,6 +9286,12 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
|
||||
cmd, jiffies, cmd->request->timeout / HZ,
|
||||
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 */
|
||||
stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun);
|
||||
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 ddb_entry *ddb_entry = cmd->device->hostdata;
|
||||
int stat, ret;
|
||||
int rval;
|
||||
|
||||
if (!ddb_entry)
|
||||
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->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);
|
||||
if (stat != QLA_SUCCESS) {
|
||||
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;
|
||||
struct scsi_qla_host *ha;
|
||||
int rval;
|
||||
|
||||
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)
|
||||
qla4_83xx_set_idc_dontreset(ha);
|
||||
|
||||
|
@ -1657,7 +1657,7 @@ static struct scsi_host_template scsi_driver = {
|
||||
.eh_timed_out = storvsc_eh_timed_out,
|
||||
.slave_alloc = storvsc_device_alloc,
|
||||
.slave_configure = storvsc_device_configure,
|
||||
.cmd_per_lun = 255,
|
||||
.cmd_per_lun = 2048,
|
||||
.this_id = -1,
|
||||
.use_clustering = ENABLE_CLUSTERING,
|
||||
/* 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
|
||||
* input speed faster than the period.
|
||||
*/
|
||||
while (div-- > 0)
|
||||
while (--div > 0)
|
||||
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 */
|
||||
sdev->no_report_opcodes = 1;
|
||||
|
||||
/* WRITE_SAME command is not supported */
|
||||
sdev->no_write_same = 1;
|
||||
|
||||
ufshcd_set_queue_depth(sdev);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user