Commit f08b7251 authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley

[SCSI] qla2xxx: Correct FCP2 recovery handling.

The driver did not account for non-tape devices needing to employ
proper FCP2 recovery.  Driver now checks the FCP2-capable flag
only, rather than using a midlayer-determined flag (TYPE_TAPE).
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarGiridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 63c43b0e
...@@ -1586,8 +1586,7 @@ typedef struct fc_port { ...@@ -1586,8 +1586,7 @@ typedef struct fc_port {
*/ */
#define FCF_FABRIC_DEVICE BIT_0 #define FCF_FABRIC_DEVICE BIT_0
#define FCF_LOGIN_NEEDED BIT_1 #define FCF_LOGIN_NEEDED BIT_1
#define FCF_TAPE_PRESENT BIT_2 #define FCF_FCP2_DEVICE BIT_2
#define FCF_FCP2_DEVICE BIT_3
/* No loop ID flag. */ /* No loop ID flag. */
#define FC_NO_LOOP_ID 0x1000 #define FC_NO_LOOP_ID 0x1000
......
...@@ -205,7 +205,7 @@ qla2x00_async_login_done(struct scsi_qla_host *vha, fc_port_t *fcport, ...@@ -205,7 +205,7 @@ qla2x00_async_login_done(struct scsi_qla_host *vha, fc_port_t *fcport,
switch (data[0]) { switch (data[0]) {
case MBS_COMMAND_COMPLETE: case MBS_COMMAND_COMPLETE:
if (fcport->flags & FCF_TAPE_PRESENT) if (fcport->flags & FCF_FCP2_DEVICE)
opts |= BIT_1; opts |= BIT_1;
rval = qla2x00_get_port_database(vha, fcport, opts); rval = qla2x00_get_port_database(vha, fcport, opts);
if (rval != QLA_SUCCESS) if (rval != QLA_SUCCESS)
...@@ -2726,7 +2726,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) ...@@ -2726,7 +2726,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
/* /*
* Logout all previous fabric devices marked lost, except * Logout all previous fabric devices marked lost, except
* tape devices. * FCP2 devices.
*/ */
list_for_each_entry(fcport, &vha->vp_fcports, list) { list_for_each_entry(fcport, &vha->vp_fcports, list) {
if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
...@@ -2739,7 +2739,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha) ...@@ -2739,7 +2739,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
qla2x00_mark_device_lost(vha, fcport, qla2x00_mark_device_lost(vha, fcport,
ql2xplogiabsentdevice, 0); ql2xplogiabsentdevice, 0);
if (fcport->loop_id != FC_NO_LOOP_ID && if (fcport->loop_id != FC_NO_LOOP_ID &&
(fcport->flags & FCF_TAPE_PRESENT) == 0 && (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
fcport->port_type != FCT_INITIATOR && fcport->port_type != FCT_INITIATOR &&
fcport->port_type != FCT_BROADCAST) { fcport->port_type != FCT_BROADCAST) {
ha->isp_ops->fabric_logout(vha, ha->isp_ops->fabric_logout(vha,
...@@ -3018,7 +3018,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha, ...@@ -3018,7 +3018,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
fcport->d_id.b24 = new_fcport->d_id.b24; fcport->d_id.b24 = new_fcport->d_id.b24;
fcport->flags |= FCF_LOGIN_NEEDED; fcport->flags |= FCF_LOGIN_NEEDED;
if (fcport->loop_id != FC_NO_LOOP_ID && if (fcport->loop_id != FC_NO_LOOP_ID &&
(fcport->flags & FCF_TAPE_PRESENT) == 0 && (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
fcport->port_type != FCT_INITIATOR && fcport->port_type != FCT_INITIATOR &&
fcport->port_type != FCT_BROADCAST) { fcport->port_type != FCT_BROADCAST) {
ha->isp_ops->fabric_logout(vha, fcport->loop_id, ha->isp_ops->fabric_logout(vha, fcport->loop_id,
...@@ -3272,9 +3272,9 @@ qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport, ...@@ -3272,9 +3272,9 @@ qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport,
rval = qla2x00_fabric_login(vha, fcport, next_loopid); rval = qla2x00_fabric_login(vha, fcport, next_loopid);
if (rval == QLA_SUCCESS) { if (rval == QLA_SUCCESS) {
/* Send an ADISC to tape devices.*/ /* Send an ADISC to FCP2 devices.*/
opts = 0; opts = 0;
if (fcport->flags & FCF_TAPE_PRESENT) if (fcport->flags & FCF_FCP2_DEVICE)
opts |= BIT_1; opts |= BIT_1;
rval = qla2x00_get_port_database(vha, fcport, opts); rval = qla2x00_get_port_database(vha, fcport, opts);
if (rval != QLA_SUCCESS) { if (rval != QLA_SUCCESS) {
......
...@@ -1188,7 +1188,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev) ...@@ -1188,7 +1188,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev)
scsi_qla_host_t *vha = shost_priv(sdev->host); scsi_qla_host_t *vha = shost_priv(sdev->host);
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
struct fc_rport *rport = starget_to_rport(sdev->sdev_target); struct fc_rport *rport = starget_to_rport(sdev->sdev_target);
fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
struct req_que *req = vha->req; struct req_que *req = vha->req;
if (sdev->tagged_supported) if (sdev->tagged_supported)
...@@ -1197,8 +1196,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev) ...@@ -1197,8 +1196,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev)
scsi_deactivate_tcq(sdev, req->max_q_depth); scsi_deactivate_tcq(sdev, req->max_q_depth);
rport->dev_loss_tmo = ha->port_down_retry_count; rport->dev_loss_tmo = ha->port_down_retry_count;
if (sdev->type == TYPE_TAPE)
fcport->flags |= FCF_TAPE_PRESENT;
return 0; return 0;
} }
...@@ -2805,7 +2802,7 @@ void qla2x00_relogin(struct scsi_qla_host *vha) ...@@ -2805,7 +2802,7 @@ void qla2x00_relogin(struct scsi_qla_host *vha)
fcport->login_retry--; fcport->login_retry--;
if (fcport->flags & FCF_FABRIC_DEVICE) { if (fcport->flags & FCF_FABRIC_DEVICE) {
if (fcport->flags & FCF_TAPE_PRESENT) if (fcport->flags & FCF_FCP2_DEVICE)
ha->isp_ops->fabric_logout(vha, ha->isp_ops->fabric_logout(vha,
fcport->loop_id, fcport->loop_id,
fcport->d_id.b.domain, fcport->d_id.b.domain,
...@@ -3141,7 +3138,10 @@ qla2x00_timer(scsi_qla_host_t *vha) ...@@ -3141,7 +3138,10 @@ qla2x00_timer(scsi_qla_host_t *vha)
if (!IS_QLA2100(ha) && vha->link_down_timeout) if (!IS_QLA2100(ha) && vha->link_down_timeout)
atomic_set(&vha->loop_state, LOOP_DEAD); atomic_set(&vha->loop_state, LOOP_DEAD);
/* Schedule an ISP abort to return any tape commands. */ /*
* Schedule an ISP abort to return any FCP2-device
* commands.
*/
/* NPIV - scan physical port only */ /* NPIV - scan physical port only */
if (!vha->vp_idx) { if (!vha->vp_idx) {
spin_lock_irqsave(&ha->hardware_lock, spin_lock_irqsave(&ha->hardware_lock,
...@@ -3158,7 +3158,7 @@ qla2x00_timer(scsi_qla_host_t *vha) ...@@ -3158,7 +3158,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
if (sp->ctx) if (sp->ctx)
continue; continue;
sfcp = sp->fcport; sfcp = sp->fcport;
if (!(sfcp->flags & FCF_TAPE_PRESENT)) if (!(sfcp->flags & FCF_FCP2_DEVICE))
continue; continue;
set_bit(ISP_ABORT_NEEDED, set_bit(ISP_ABORT_NEEDED,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment