mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull late SCSI updates from James Bottomley: "This is mostly stuff which missed the initial pull. There's a new driver: qedi, and some ufs, ibmvscsis and ncr5380 updates plus some assorted driver fixes and also a fix for the bug where if a device goes into a blocked state between configuration and sysfs device add (which can be a long time under async probing) it would become permanently blocked" * tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (30 commits) scsi: avoid a permanent stop of the scsi device's request queue scsi: mpt3sas: Recognize and act on iopriority info scsi: qla2xxx: Fix Target mode handling with Multiqueue changes. scsi: qla2xxx: Add Block Multi Queue functionality. scsi: qla2xxx: Add multiple queue pair functionality. scsi: qla2xxx: Utilize pci_alloc_irq_vectors/pci_free_irq_vectors calls. scsi: qla2xxx: Only allow operational MBX to proceed during RESET. scsi: hpsa: remove memory allocate failure message scsi: Update 3ware driver email addresses scsi: zfcp: fix rport unblock race with LUN recovery scsi: zfcp: do not trace pure benign residual HBA responses at default level scsi: zfcp: fix use-after-"free" in FC ingress path after TMF scsi: libcxgbi: return error if interface is not up scsi: cxgb4i: libcxgbi: add missing module_put() scsi: cxgb4i: libcxgbi: cxgb4: add T6 iSCSI completion feature scsi: cxgb4i: libcxgbi: add active open cmd for T6 adapters scsi: cxgb4i: use cxgb4_tp_smt_idx() to get smt_idx scsi: qedi: Add QLogic FastLinQ offload iSCSI driver framework. scsi: aacraid: remove wildcard for series 9 controllers scsi: ibmvscsi: add write memory barrier to CRQ processing ...
This commit is contained in:
@@ -6,17 +6,15 @@ NCR53c400 extensions (c) 1994,1995,1996 Kevin Lentin
|
||||
This file documents the NCR53c400 extensions by Kevin Lentin and some
|
||||
enhancements to the NCR5380 core.
|
||||
|
||||
This driver supports both NCR5380 and NCR53c400 cards in port or memory
|
||||
mapped modes. Currently this driver can only support one of those mapping
|
||||
modes at a time but it does support both of these chips at the same time.
|
||||
The next release of this driver will support port & memory mapped cards at
|
||||
the same time. It should be able to handle multiple different cards in the
|
||||
same machine.
|
||||
This driver supports NCR5380 and NCR53c400 and compatible cards in port or
|
||||
memory mapped modes.
|
||||
|
||||
The drivers/scsi/Makefile has an override in it for the most common
|
||||
NCR53c400 card, the Trantor T130B in its default configuration:
|
||||
Port: 0x350
|
||||
IRQ : 5
|
||||
Use of an interrupt is recommended, if supported by the board, as this will
|
||||
allow targets to disconnect and thereby improve SCSI bus utilization.
|
||||
|
||||
If the irq parameter is 254 or is omitted entirely, the driver will probe
|
||||
for the correct IRQ line automatically. If the irq parameter is 0 or 255
|
||||
then no IRQ will be used.
|
||||
|
||||
The NCR53c400 does not support DMA but it does have Pseudo-DMA which is
|
||||
supported by the driver.
|
||||
@@ -47,22 +45,24 @@ These old-style parameters can support only one card:
|
||||
dtc_3181e=1 to set up for a Domex Technology Corp 3181E board
|
||||
hp_c2502=1 to set up for a Hewlett Packard C2502 board
|
||||
|
||||
e.g.
|
||||
OLD: modprobe g_NCR5380 ncr_irq=5 ncr_addr=0x350 ncr_5380=1
|
||||
NEW: modprobe g_NCR5380 irq=5 base=0x350 card=0
|
||||
for a port mapped NCR5380 board or
|
||||
E.g. Trantor T130B in its default configuration:
|
||||
modprobe g_NCR5380 irq=5 base=0x350 card=1
|
||||
or alternatively, using the old syntax,
|
||||
modprobe g_NCR5380 ncr_irq=5 ncr_addr=0x350 ncr_53c400=1
|
||||
|
||||
OLD: modprobe g_NCR5380 ncr_irq=255 ncr_addr=0xc8000 ncr_53c400=1
|
||||
NEW: modprobe g_NCR5380 irq=255 base=0xc8000 card=1
|
||||
for a memory mapped NCR53C400 board with interrupts disabled or
|
||||
E.g. a port mapped NCR5380 board, driver to probe for IRQ:
|
||||
modprobe g_NCR5380 base=0x350 card=0
|
||||
or alternatively,
|
||||
modprobe g_NCR5380 ncr_addr=0x350 ncr_5380=1
|
||||
|
||||
NEW: modprobe g_NCR5380 irq=0,7 base=0x240,0x300 card=3,4
|
||||
for two cards: DTC3181 (in non-PnP mode) at 0x240 with no IRQ
|
||||
and HP C2502 at 0x300 with IRQ 7
|
||||
|
||||
(255 should be specified for no or DMA interrupt, 254 to autoprobe for an
|
||||
IRQ line if overridden on the command line.)
|
||||
E.g. a memory mapped NCR53C400 board with no IRQ:
|
||||
modprobe g_NCR5380 irq=255 base=0xc8000 card=1
|
||||
or alternatively,
|
||||
modprobe g_NCR5380 ncr_irq=255 ncr_addr=0xc8000 ncr_53c400=1
|
||||
|
||||
E.g. two cards, DTC3181 (in non-PnP mode) at 0x240 with no IRQ
|
||||
and HP C2502 at 0x300 with IRQ 7:
|
||||
modprobe g_NCR5380 irq=0,7 base=0x240,0x300 card=3,4
|
||||
|
||||
Kevin Lentin
|
||||
K.Lentin@cs.monash.edu.au
|
||||
|
||||
@@ -143,7 +143,7 @@ S: Maintained
|
||||
F: drivers/net/ethernet/3com/typhoon*
|
||||
|
||||
3WARE SAS/SATA-RAID SCSI DRIVERS (3W-XXXX, 3W-9XXX, 3W-SAS)
|
||||
M: Adam Radford <linuxraid@lsi.com>
|
||||
M: Adam Radford <aradford@gmail.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.lsi.com
|
||||
S: Supported
|
||||
@@ -10136,6 +10136,12 @@ F: drivers/net/ethernet/qlogic/qed/
|
||||
F: include/linux/qed/
|
||||
F: drivers/net/ethernet/qlogic/qede/
|
||||
|
||||
QLOGIC QL41xxx ISCSI DRIVER
|
||||
M: QLogic-Storage-Upstream@cavium.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/scsi/qedi/
|
||||
|
||||
QNX4 FILESYSTEM
|
||||
M: Anders Larsen <al@alarsen.net>
|
||||
W: http://www.alarsen.net/linux/qnx4fs/
|
||||
|
||||
@@ -76,6 +76,7 @@ enum {
|
||||
CPL_PASS_ESTABLISH = 0x41,
|
||||
CPL_RX_DATA_DDP = 0x42,
|
||||
CPL_PASS_ACCEPT_REQ = 0x44,
|
||||
CPL_RX_ISCSI_CMP = 0x45,
|
||||
CPL_TRACE_PKT_T5 = 0x48,
|
||||
CPL_RX_ISCSI_DDP = 0x49,
|
||||
|
||||
@@ -934,6 +935,18 @@ struct cpl_iscsi_data {
|
||||
__u8 status;
|
||||
};
|
||||
|
||||
struct cpl_rx_iscsi_cmp {
|
||||
union opcode_tid ot;
|
||||
__be16 pdu_len_ddp;
|
||||
__be16 len;
|
||||
__be32 seq;
|
||||
__be16 urg;
|
||||
__u8 rsvd;
|
||||
__u8 status;
|
||||
__be32 ulp_crc;
|
||||
__be32 ddpvld;
|
||||
};
|
||||
|
||||
struct cpl_tx_data_iso {
|
||||
__be32 op_to_scsi;
|
||||
__u8 reserved1;
|
||||
|
||||
@@ -289,11 +289,12 @@ void zfcp_dbf_rec_trig(char *tag, struct zfcp_adapter *adapter,
|
||||
|
||||
|
||||
/**
|
||||
* zfcp_dbf_rec_run - trace event related to running recovery
|
||||
* zfcp_dbf_rec_run_lvl - trace event related to running recovery
|
||||
* @level: trace level to be used for event
|
||||
* @tag: identifier for event
|
||||
* @erp: erp_action running
|
||||
*/
|
||||
void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp)
|
||||
void zfcp_dbf_rec_run_lvl(int level, char *tag, struct zfcp_erp_action *erp)
|
||||
{
|
||||
struct zfcp_dbf *dbf = erp->adapter->dbf;
|
||||
struct zfcp_dbf_rec *rec = &dbf->rec_buf;
|
||||
@@ -319,10 +320,20 @@ void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp)
|
||||
else
|
||||
rec->u.run.rec_count = atomic_read(&erp->adapter->erp_counter);
|
||||
|
||||
debug_event(dbf->rec, 1, rec, sizeof(*rec));
|
||||
debug_event(dbf->rec, level, rec, sizeof(*rec));
|
||||
spin_unlock_irqrestore(&dbf->rec_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_dbf_rec_run - trace event related to running recovery
|
||||
* @tag: identifier for event
|
||||
* @erp: erp_action running
|
||||
*/
|
||||
void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp)
|
||||
{
|
||||
zfcp_dbf_rec_run_lvl(1, tag, erp);
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_dbf_rec_run_wka - trace wka port event with info like running recovery
|
||||
* @tag: identifier for event
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* zfcp device driver
|
||||
* debug feature declarations
|
||||
*
|
||||
* Copyright IBM Corp. 2008, 2015
|
||||
* Copyright IBM Corp. 2008, 2016
|
||||
*/
|
||||
|
||||
#ifndef ZFCP_DBF_H
|
||||
@@ -283,6 +283,30 @@ struct zfcp_dbf {
|
||||
struct zfcp_dbf_scsi scsi_buf;
|
||||
};
|
||||
|
||||
/**
|
||||
* zfcp_dbf_hba_fsf_resp_suppress - true if we should not trace by default
|
||||
* @req: request that has been completed
|
||||
*
|
||||
* Returns true if FCP response with only benign residual under count.
|
||||
*/
|
||||
static inline
|
||||
bool zfcp_dbf_hba_fsf_resp_suppress(struct zfcp_fsf_req *req)
|
||||
{
|
||||
struct fsf_qtcb *qtcb = req->qtcb;
|
||||
u32 fsf_stat = qtcb->header.fsf_status;
|
||||
struct fcp_resp *fcp_rsp;
|
||||
u8 rsp_flags, fr_status;
|
||||
|
||||
if (qtcb->prefix.qtcb_type != FSF_IO_COMMAND)
|
||||
return false; /* not an FCP response */
|
||||
fcp_rsp = (struct fcp_resp *)&qtcb->bottom.io.fcp_rsp;
|
||||
rsp_flags = fcp_rsp->fr_flags;
|
||||
fr_status = fcp_rsp->fr_status;
|
||||
return (fsf_stat == FSF_FCP_RSP_AVAILABLE) &&
|
||||
(rsp_flags == FCP_RESID_UNDER) &&
|
||||
(fr_status == SAM_STAT_GOOD);
|
||||
}
|
||||
|
||||
static inline
|
||||
void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req)
|
||||
{
|
||||
@@ -304,7 +328,9 @@ void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req)
|
||||
zfcp_dbf_hba_fsf_resp("fs_perr", 1, req);
|
||||
|
||||
} else if (qtcb->header.fsf_status != FSF_GOOD) {
|
||||
zfcp_dbf_hba_fsf_resp("fs_ferr", 1, req);
|
||||
zfcp_dbf_hba_fsf_resp("fs_ferr",
|
||||
zfcp_dbf_hba_fsf_resp_suppress(req)
|
||||
? 5 : 1, req);
|
||||
|
||||
} else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
|
||||
(req->fsf_command == FSF_QTCB_OPEN_LUN)) {
|
||||
@@ -388,4 +414,15 @@ void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag)
|
||||
_zfcp_dbf_scsi(tmp_tag, 1, scmnd, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_dbf_scsi_nullcmnd() - trace NULLify of SCSI command in dev/tgt-reset.
|
||||
* @scmnd: SCSI command that was NULLified.
|
||||
* @fsf_req: request that owned @scmnd.
|
||||
*/
|
||||
static inline void zfcp_dbf_scsi_nullcmnd(struct scsi_cmnd *scmnd,
|
||||
struct zfcp_fsf_req *fsf_req)
|
||||
{
|
||||
_zfcp_dbf_scsi("scfc__1", 3, scmnd, fsf_req);
|
||||
}
|
||||
|
||||
#endif /* ZFCP_DBF_H */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Error Recovery Procedures (ERP).
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
* Copyright IBM Corp. 2002, 2016
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "zfcp"
|
||||
@@ -1204,6 +1204,62 @@ static void zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_erp_try_rport_unblock - unblock rport if no more/new recovery
|
||||
* @port: zfcp_port whose fc_rport we should try to unblock
|
||||
*/
|
||||
static void zfcp_erp_try_rport_unblock(struct zfcp_port *port)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct zfcp_adapter *adapter = port->adapter;
|
||||
int port_status;
|
||||
struct Scsi_Host *shost = adapter->scsi_host;
|
||||
struct scsi_device *sdev;
|
||||
|
||||
write_lock_irqsave(&adapter->erp_lock, flags);
|
||||
port_status = atomic_read(&port->status);
|
||||
if ((port_status & ZFCP_STATUS_COMMON_UNBLOCKED) == 0 ||
|
||||
(port_status & (ZFCP_STATUS_COMMON_ERP_INUSE |
|
||||
ZFCP_STATUS_COMMON_ERP_FAILED)) != 0) {
|
||||
/* new ERP of severity >= port triggered elsewhere meanwhile or
|
||||
* local link down (adapter erp_failed but not clear unblock)
|
||||
*/
|
||||
zfcp_dbf_rec_run_lvl(4, "ertru_p", &port->erp_action);
|
||||
write_unlock_irqrestore(&adapter->erp_lock, flags);
|
||||
return;
|
||||
}
|
||||
spin_lock(shost->host_lock);
|
||||
__shost_for_each_device(sdev, shost) {
|
||||
struct zfcp_scsi_dev *zsdev = sdev_to_zfcp(sdev);
|
||||
int lun_status;
|
||||
|
||||
if (zsdev->port != port)
|
||||
continue;
|
||||
/* LUN under port of interest */
|
||||
lun_status = atomic_read(&zsdev->status);
|
||||
if ((lun_status & ZFCP_STATUS_COMMON_ERP_FAILED) != 0)
|
||||
continue; /* unblock rport despite failed LUNs */
|
||||
/* LUN recovery not given up yet [maybe follow-up pending] */
|
||||
if ((lun_status & ZFCP_STATUS_COMMON_UNBLOCKED) == 0 ||
|
||||
(lun_status & ZFCP_STATUS_COMMON_ERP_INUSE) != 0) {
|
||||
/* LUN blocked:
|
||||
* not yet unblocked [LUN recovery pending]
|
||||
* or meanwhile blocked [new LUN recovery triggered]
|
||||
*/
|
||||
zfcp_dbf_rec_run_lvl(4, "ertru_l", &zsdev->erp_action);
|
||||
spin_unlock(shost->host_lock);
|
||||
write_unlock_irqrestore(&adapter->erp_lock, flags);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* now port has no child or all children have completed recovery,
|
||||
* and no ERP of severity >= port was meanwhile triggered elsewhere
|
||||
*/
|
||||
zfcp_scsi_schedule_rport_register(port);
|
||||
spin_unlock(shost->host_lock);
|
||||
write_unlock_irqrestore(&adapter->erp_lock, flags);
|
||||
}
|
||||
|
||||
static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
|
||||
{
|
||||
struct zfcp_adapter *adapter = act->adapter;
|
||||
@@ -1214,6 +1270,7 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
|
||||
case ZFCP_ERP_ACTION_REOPEN_LUN:
|
||||
if (!(act->status & ZFCP_STATUS_ERP_NO_REF))
|
||||
scsi_device_put(sdev);
|
||||
zfcp_erp_try_rport_unblock(port);
|
||||
break;
|
||||
|
||||
case ZFCP_ERP_ACTION_REOPEN_PORT:
|
||||
@@ -1224,7 +1281,7 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
|
||||
*/
|
||||
if (act->step != ZFCP_ERP_STEP_UNINITIALIZED)
|
||||
if (result == ZFCP_ERP_SUCCEEDED)
|
||||
zfcp_scsi_schedule_rport_register(port);
|
||||
zfcp_erp_try_rport_unblock(port);
|
||||
/* fall through */
|
||||
case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
|
||||
put_device(&port->dev);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* External function declarations.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
* Copyright IBM Corp. 2002, 2016
|
||||
*/
|
||||
|
||||
#ifndef ZFCP_EXT_H
|
||||
@@ -35,6 +35,8 @@ extern void zfcp_dbf_adapter_unregister(struct zfcp_adapter *);
|
||||
extern void zfcp_dbf_rec_trig(char *, struct zfcp_adapter *,
|
||||
struct zfcp_port *, struct scsi_device *, u8, u8);
|
||||
extern void zfcp_dbf_rec_run(char *, struct zfcp_erp_action *);
|
||||
extern void zfcp_dbf_rec_run_lvl(int level, char *tag,
|
||||
struct zfcp_erp_action *erp);
|
||||
extern void zfcp_dbf_rec_run_wka(char *, struct zfcp_fc_wka_port *, u64);
|
||||
extern void zfcp_dbf_hba_fsf_uss(char *, struct zfcp_fsf_req *);
|
||||
extern void zfcp_dbf_hba_fsf_res(char *, int, struct zfcp_fsf_req *);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Interface to the FSF support functions.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
* Copyright IBM Corp. 2002, 2016
|
||||
*/
|
||||
|
||||
#ifndef FSF_H
|
||||
@@ -78,6 +78,7 @@
|
||||
#define FSF_APP_TAG_CHECK_FAILURE 0x00000082
|
||||
#define FSF_REF_TAG_CHECK_FAILURE 0x00000083
|
||||
#define FSF_ADAPTER_STATUS_AVAILABLE 0x000000AD
|
||||
#define FSF_FCP_RSP_AVAILABLE 0x000000AF
|
||||
#define FSF_UNKNOWN_COMMAND 0x000000E2
|
||||
#define FSF_UNKNOWN_OP_SUBTYPE 0x000000E3
|
||||
#define FSF_INVALID_COMMAND_OPTION 0x000000E5
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Data structure and helper functions for tracking pending FSF
|
||||
* requests.
|
||||
*
|
||||
* Copyright IBM Corp. 2009
|
||||
* Copyright IBM Corp. 2009, 2016
|
||||
*/
|
||||
|
||||
#ifndef ZFCP_REQLIST_H
|
||||
@@ -180,4 +180,32 @@ static inline void zfcp_reqlist_move(struct zfcp_reqlist *rl,
|
||||
spin_unlock_irqrestore(&rl->lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_reqlist_apply_for_all() - apply a function to every request.
|
||||
* @rl: the requestlist that contains the target requests.
|
||||
* @f: the function to apply to each request; the first parameter of the
|
||||
* function will be the target-request; the second parameter is the same
|
||||
* pointer as given with the argument @data.
|
||||
* @data: freely chosen argument; passed through to @f as second parameter.
|
||||
*
|
||||
* Uses :c:macro:`list_for_each_entry` to iterate over the lists in the hash-
|
||||
* table (not a 'safe' variant, so don't modify the list).
|
||||
*
|
||||
* Holds @rl->lock over the entire request-iteration.
|
||||
*/
|
||||
static inline void
|
||||
zfcp_reqlist_apply_for_all(struct zfcp_reqlist *rl,
|
||||
void (*f)(struct zfcp_fsf_req *, void *), void *data)
|
||||
{
|
||||
struct zfcp_fsf_req *req;
|
||||
unsigned long flags;
|
||||
unsigned int i;
|
||||
|
||||
spin_lock_irqsave(&rl->lock, flags);
|
||||
for (i = 0; i < ZFCP_REQ_LIST_BUCKETS; i++)
|
||||
list_for_each_entry(req, &rl->buckets[i], list)
|
||||
f(req, data);
|
||||
spin_unlock_irqrestore(&rl->lock, flags);
|
||||
}
|
||||
|
||||
#endif /* ZFCP_REQLIST_H */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Interface to Linux SCSI midlayer.
|
||||
*
|
||||
* Copyright IBM Corp. 2002, 2015
|
||||
* Copyright IBM Corp. 2002, 2016
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "zfcp"
|
||||
@@ -88,9 +88,7 @@ int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt)
|
||||
}
|
||||
|
||||
if (unlikely(!(status & ZFCP_STATUS_COMMON_UNBLOCKED))) {
|
||||
/* This could be either
|
||||
* open LUN pending: this is temporary, will result in
|
||||
* open LUN or ERP_FAILED, so retry command
|
||||
/* This could be
|
||||
* call to rport_delete pending: mimic retry from
|
||||
* fc_remote_port_chkready until rport is BLOCKED
|
||||
*/
|
||||
@@ -209,6 +207,57 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
|
||||
return retval;
|
||||
}
|
||||
|
||||
struct zfcp_scsi_req_filter {
|
||||
u8 tmf_scope;
|
||||
u32 lun_handle;
|
||||
u32 port_handle;
|
||||
};
|
||||
|
||||
static void zfcp_scsi_forget_cmnd(struct zfcp_fsf_req *old_req, void *data)
|
||||
{
|
||||
struct zfcp_scsi_req_filter *filter =
|
||||
(struct zfcp_scsi_req_filter *)data;
|
||||
|
||||
/* already aborted - prevent side-effects - or not a SCSI command */
|
||||
if (old_req->data == NULL || old_req->fsf_command != FSF_QTCB_FCP_CMND)
|
||||
return;
|
||||
|
||||
/* (tmf_scope == FCP_TMF_TGT_RESET || tmf_scope == FCP_TMF_LUN_RESET) */
|
||||
if (old_req->qtcb->header.port_handle != filter->port_handle)
|
||||
return;
|
||||
|
||||
if (filter->tmf_scope == FCP_TMF_LUN_RESET &&
|
||||
old_req->qtcb->header.lun_handle != filter->lun_handle)
|
||||
return;
|
||||
|
||||
zfcp_dbf_scsi_nullcmnd((struct scsi_cmnd *)old_req->data, old_req);
|
||||
old_req->data = NULL;
|
||||
}
|
||||
|
||||
static void zfcp_scsi_forget_cmnds(struct zfcp_scsi_dev *zsdev, u8 tm_flags)
|
||||
{
|
||||
struct zfcp_adapter *adapter = zsdev->port->adapter;
|
||||
struct zfcp_scsi_req_filter filter = {
|
||||
.tmf_scope = FCP_TMF_TGT_RESET,
|
||||
.port_handle = zsdev->port->handle,
|
||||
};
|
||||
unsigned long flags;
|
||||
|
||||
if (tm_flags == FCP_TMF_LUN_RESET) {
|
||||
filter.tmf_scope = FCP_TMF_LUN_RESET;
|
||||
filter.lun_handle = zsdev->lun_handle;
|
||||
}
|
||||
|
||||
/*
|
||||
* abort_lock secures against other processings - in the abort-function
|
||||
* and normal cmnd-handler - of (struct zfcp_fsf_req *)->data
|
||||
*/
|
||||
write_lock_irqsave(&adapter->abort_lock, flags);
|
||||
zfcp_reqlist_apply_for_all(adapter->req_list, zfcp_scsi_forget_cmnd,
|
||||
&filter);
|
||||
write_unlock_irqrestore(&adapter->abort_lock, flags);
|
||||
}
|
||||
|
||||
static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags)
|
||||
{
|
||||
struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device);
|
||||
@@ -241,8 +290,10 @@ static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags)
|
||||
if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) {
|
||||
zfcp_dbf_scsi_devreset("fail", scpnt, tm_flags);
|
||||
retval = FAILED;
|
||||
} else
|
||||
} else {
|
||||
zfcp_dbf_scsi_devreset("okay", scpnt, tm_flags);
|
||||
zfcp_scsi_forget_cmnds(zfcp_sdev, tm_flags);
|
||||
}
|
||||
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
return retval;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux.
|
||||
|
||||
Written By: Adam Radford <linuxraid@lsi.com>
|
||||
Modifications By: Tom Couch <linuxraid@lsi.com>
|
||||
Written By: Adam Radford <aradford@gmail.com>
|
||||
Modifications By: Tom Couch
|
||||
|
||||
Copyright (C) 2004-2009 Applied Micro Circuits Corporation.
|
||||
Copyright (C) 2010 LSI Corporation.
|
||||
@@ -41,10 +41,7 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bugs/Comments/Suggestions should be mailed to:
|
||||
linuxraid@lsi.com
|
||||
|
||||
For more information, goto:
|
||||
http://www.lsi.com
|
||||
aradford@gmail.com
|
||||
|
||||
Note: This version of the driver does not contain a bundled firmware
|
||||
image.
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
3w-9xxx.h -- 3ware 9000 Storage Controller device driver for Linux.
|
||||
|
||||
Written By: Adam Radford <linuxraid@lsi.com>
|
||||
Modifications By: Tom Couch <linuxraid@lsi.com>
|
||||
Written By: Adam Radford <aradford@gmail.com>
|
||||
Modifications By: Tom Couch
|
||||
|
||||
Copyright (C) 2004-2009 Applied Micro Circuits Corporation.
|
||||
Copyright (C) 2010 LSI Corporation.
|
||||
@@ -41,10 +41,7 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bugs/Comments/Suggestions should be mailed to:
|
||||
linuxraid@lsi.com
|
||||
|
||||
For more information, goto:
|
||||
http://www.lsi.com
|
||||
aradford@gmail.com
|
||||
*/
|
||||
|
||||
#ifndef _3W_9XXX_H
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
3w-sas.c -- LSI 3ware SAS/SATA-RAID Controller device driver for Linux.
|
||||
|
||||
Written By: Adam Radford <linuxraid@lsi.com>
|
||||
Written By: Adam Radford <aradford@gmail.com>
|
||||
|
||||
Copyright (C) 2009 LSI Corporation.
|
||||
|
||||
@@ -43,10 +43,7 @@
|
||||
LSI 3ware 9750 6Gb/s SAS/SATA-RAID
|
||||
|
||||
Bugs/Comments/Suggestions should be mailed to:
|
||||
linuxraid@lsi.com
|
||||
|
||||
For more information, goto:
|
||||
http://www.lsi.com
|
||||
aradford@gmail.com
|
||||
|
||||
History
|
||||
-------
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
3w-sas.h -- LSI 3ware SAS/SATA-RAID Controller device driver for Linux.
|
||||
|
||||
Written By: Adam Radford <linuxraid@lsi.com>
|
||||
Written By: Adam Radford <aradford@gmail.com>
|
||||
|
||||
Copyright (C) 2009 LSI Corporation.
|
||||
|
||||
@@ -39,10 +39,7 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bugs/Comments/Suggestions should be mailed to:
|
||||
linuxraid@lsi.com
|
||||
|
||||
For more information, goto:
|
||||
http://www.lsi.com
|
||||
aradford@gmail.com
|
||||
*/
|
||||
|
||||
#ifndef _3W_SAS_H
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
3w-xxxx.c -- 3ware Storage Controller device driver for Linux.
|
||||
|
||||
Written By: Adam Radford <linuxraid@lsi.com>
|
||||
Written By: Adam Radford <aradford@gmail.com>
|
||||
Modifications By: Joel Jacobson <linux@3ware.com>
|
||||
Arnaldo Carvalho de Melo <acme@conectiva.com.br>
|
||||
Brad Strand <linux@3ware.com>
|
||||
@@ -47,10 +47,9 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bugs/Comments/Suggestions should be mailed to:
|
||||
linuxraid@lsi.com
|
||||
|
||||
For more information, goto:
|
||||
http://www.lsi.com
|
||||
aradford@gmail.com
|
||||
|
||||
|
||||
History
|
||||
-------
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
3w-xxxx.h -- 3ware Storage Controller device driver for Linux.
|
||||
|
||||
Written By: Adam Radford <linuxraid@lsi.com>
|
||||
Written By: Adam Radford <aradford@gmail.com>
|
||||
Modifications By: Joel Jacobson <linux@3ware.com>
|
||||
Arnaldo Carvalho de Melo <acme@conectiva.com.br>
|
||||
Brad Strand <linux@3ware.com>
|
||||
@@ -45,7 +45,8 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bugs/Comments/Suggestions should be mailed to:
|
||||
linuxraid@lsi.com
|
||||
|
||||
aradford@gmail.com
|
||||
|
||||
For more information, goto:
|
||||
http://www.lsi.com
|
||||
|
||||
@@ -1233,6 +1233,7 @@ config SCSI_QLOGICPTI
|
||||
|
||||
source "drivers/scsi/qla2xxx/Kconfig"
|
||||
source "drivers/scsi/qla4xxx/Kconfig"
|
||||
source "drivers/scsi/qedi/Kconfig"
|
||||
|
||||
config SCSI_LPFC
|
||||
tristate "Emulex LightPulse Fibre Channel Support"
|
||||
|
||||
@@ -131,6 +131,7 @@ obj-$(CONFIG_PS3_ROM) += ps3rom.o
|
||||
obj-$(CONFIG_SCSI_CXGB3_ISCSI) += libiscsi.o libiscsi_tcp.o cxgbi/
|
||||
obj-$(CONFIG_SCSI_CXGB4_ISCSI) += libiscsi.o libiscsi_tcp.o cxgbi/
|
||||
obj-$(CONFIG_SCSI_BNX2_ISCSI) += libiscsi.o bnx2i/
|
||||
obj-$(CONFIG_QEDI) += libiscsi.o qedi/
|
||||
obj-$(CONFIG_BE2ISCSI) += libiscsi.o be2iscsi/
|
||||
obj-$(CONFIG_SCSI_ESAS2R) += esas2r/
|
||||
obj-$(CONFIG_SCSI_PMCRAID) += pmcraid.o
|
||||
|
||||
@@ -97,9 +97,6 @@
|
||||
* and macros and include this file in your driver.
|
||||
*
|
||||
* These macros control options :
|
||||
* AUTOPROBE_IRQ - if defined, the NCR5380_probe_irq() function will be
|
||||
* defined.
|
||||
*
|
||||
* AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
|
||||
* for commands that return with a CHECK CONDITION status.
|
||||
*
|
||||
@@ -127,9 +124,7 @@
|
||||
* NCR5380_dma_residual - residual byte count
|
||||
*
|
||||
* The generic driver is initialized by calling NCR5380_init(instance),
|
||||
* after setting the appropriate host specific fields and ID. If the
|
||||
* driver wishes to autoprobe for an IRQ line, the NCR5380_probe_irq(instance,
|
||||
* possible) function may be used.
|
||||
* after setting the appropriate host specific fields and ID.
|
||||
*/
|
||||
|
||||
#ifndef NCR5380_io_delay
|
||||
@@ -351,76 +346,6 @@ static void NCR5380_print_phase(struct Scsi_Host *instance)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static int probe_irq;
|
||||
|
||||
/**
|
||||
* probe_intr - helper for IRQ autoprobe
|
||||
* @irq: interrupt number
|
||||
* @dev_id: unused
|
||||
* @regs: unused
|
||||
*
|
||||
* Set a flag to indicate the IRQ in question was received. This is
|
||||
* used by the IRQ probe code.
|
||||
*/
|
||||
|
||||
static irqreturn_t probe_intr(int irq, void *dev_id)
|
||||
{
|
||||
probe_irq = irq;
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/**
|
||||
* NCR5380_probe_irq - find the IRQ of an NCR5380
|
||||
* @instance: NCR5380 controller
|
||||
* @possible: bitmask of ISA IRQ lines
|
||||
*
|
||||
* Autoprobe for the IRQ line used by the NCR5380 by triggering an IRQ
|
||||
* and then looking to see what interrupt actually turned up.
|
||||
*/
|
||||
|
||||
static int __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
|
||||
int possible)
|
||||
{
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
unsigned long timeout;
|
||||
int trying_irqs, i, mask;
|
||||
|
||||
for (trying_irqs = 0, i = 1, mask = 2; i < 16; ++i, mask <<= 1)
|
||||
if ((mask & possible) && (request_irq(i, &probe_intr, 0, "NCR-probe", NULL) == 0))
|
||||
trying_irqs |= mask;
|
||||
|
||||
timeout = jiffies + msecs_to_jiffies(250);
|
||||
probe_irq = NO_IRQ;
|
||||
|
||||
/*
|
||||
* A interrupt is triggered whenever BSY = false, SEL = true
|
||||
* and a bit set in the SELECT_ENABLE_REG is asserted on the
|
||||
* SCSI bus.
|
||||
*
|
||||
* Note that the bus is only driven when the phase control signals
|
||||
* (I/O, C/D, and MSG) match those in the TCR, so we must reset that
|
||||
* to zero.
|
||||
*/
|
||||
|
||||
NCR5380_write(TARGET_COMMAND_REG, 0);
|
||||
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
|
||||
NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask);
|
||||
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_DATA | ICR_ASSERT_SEL);
|
||||
|
||||
while (probe_irq == NO_IRQ && time_before(jiffies, timeout))
|
||||
schedule_timeout_uninterruptible(1);
|
||||
|
||||
NCR5380_write(SELECT_ENABLE_REG, 0);
|
||||
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
|
||||
|
||||
for (i = 1, mask = 2; i < 16; ++i, mask <<= 1)
|
||||
if (trying_irqs & mask)
|
||||
free_irq(i, NULL);
|
||||
|
||||
return probe_irq;
|
||||
}
|
||||
|
||||
/**
|
||||
* NCR58380_info - report driver and host information
|
||||
* @instance: relevant scsi host instance
|
||||
|
||||
@@ -199,16 +199,6 @@
|
||||
|
||||
#define PHASE_SR_TO_TCR(phase) ((phase) >> 2)
|
||||
|
||||
/*
|
||||
* These are "special" values for the irq and dma_channel fields of the
|
||||
* Scsi_Host structure
|
||||
*/
|
||||
|
||||
#define DMA_NONE 255
|
||||
#define IRQ_AUTO 254
|
||||
#define DMA_AUTO 254
|
||||
#define PORT_AUTO 0xffff /* autoprobe io port for 53c400a */
|
||||
|
||||
#ifndef NO_IRQ
|
||||
#define NO_IRQ 0
|
||||
#endif
|
||||
@@ -290,7 +280,6 @@ static void NCR5380_print(struct Scsi_Host *instance);
|
||||
#define NCR5380_dprint_phase(flg, arg) do {} while (0)
|
||||
#endif
|
||||
|
||||
static int NCR5380_probe_irq(struct Scsi_Host *instance, int possible);
|
||||
static int NCR5380_init(struct Scsi_Host *instance, int flags);
|
||||
static int NCR5380_maybe_reset_bus(struct Scsi_Host *);
|
||||
static void NCR5380_exit(struct Scsi_Host *instance);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user