mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 10:01:25 +00:00
[SCSI] qla4xxx: Quiesce driver activities while loopback
Quiesce all different activities performed by driver upon the link events while loopback diagnostics is in progress. Signed-off-by: Nilesh Javali <nilesh.javali@qlogic.com> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
9cb33f184e
commit
026fbd3aaa
4 changed files with 45 additions and 3 deletions
|
@ -501,6 +501,7 @@ struct scsi_qla_host {
|
||||||
#define AF_INTERRUPTS_ON 6 /* 0x00000040 */
|
#define AF_INTERRUPTS_ON 6 /* 0x00000040 */
|
||||||
#define AF_GET_CRASH_RECORD 7 /* 0x00000080 */
|
#define AF_GET_CRASH_RECORD 7 /* 0x00000080 */
|
||||||
#define AF_LINK_UP 8 /* 0x00000100 */
|
#define AF_LINK_UP 8 /* 0x00000100 */
|
||||||
|
#define AF_LOOPBACK 9 /* 0x00000200 */
|
||||||
#define AF_IRQ_ATTACHED 10 /* 0x00000400 */
|
#define AF_IRQ_ATTACHED 10 /* 0x00000400 */
|
||||||
#define AF_DISABLE_ACB_COMPLETE 11 /* 0x00000800 */
|
#define AF_DISABLE_ACB_COMPLETE 11 /* 0x00000800 */
|
||||||
#define AF_HA_REMOVAL 12 /* 0x00001000 */
|
#define AF_HA_REMOVAL 12 /* 0x00001000 */
|
||||||
|
@ -840,7 +841,8 @@ static inline int is_aer_supported(struct scsi_qla_host *ha)
|
||||||
static inline int adapter_up(struct scsi_qla_host *ha)
|
static inline int adapter_up(struct scsi_qla_host *ha)
|
||||||
{
|
{
|
||||||
return (test_bit(AF_ONLINE, &ha->flags) != 0) &&
|
return (test_bit(AF_ONLINE, &ha->flags) != 0) &&
|
||||||
(test_bit(AF_LINK_UP, &ha->flags) != 0);
|
(test_bit(AF_LINK_UP, &ha->flags) != 0) &&
|
||||||
|
(!test_bit(AF_LOOPBACK, &ha->flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct scsi_qla_host* to_qla_host(struct Scsi_Host *shost)
|
static inline struct scsi_qla_host* to_qla_host(struct Scsi_Host *shost)
|
||||||
|
|
|
@ -522,6 +522,10 @@ struct qla_flt_region {
|
||||||
#define FLASH_OPT_COMMIT 2
|
#define FLASH_OPT_COMMIT 2
|
||||||
#define FLASH_OPT_RMW_COMMIT 3
|
#define FLASH_OPT_RMW_COMMIT 3
|
||||||
|
|
||||||
|
/* Loopback type */
|
||||||
|
#define ENABLE_INTERNAL_LOOPBACK 0x04
|
||||||
|
#define ENABLE_EXTERNAL_LOOPBACK 0x08
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
/* Host Adapter Initialization Control Block (from host) */
|
/* Host Adapter Initialization Control Block (from host) */
|
||||||
|
|
|
@ -581,6 +581,33 @@ exit_prq_error:
|
||||||
set_bit(DPC_RESET_HA, &ha->dpc_flags);
|
set_bit(DPC_RESET_HA, &ha->dpc_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qla4_83xx_loopback_in_progress: Is loopback in progress?
|
||||||
|
* @ha: Pointer to host adapter structure.
|
||||||
|
* @ret: 1 = loopback in progress, 0 = loopback not in progress
|
||||||
|
**/
|
||||||
|
static int qla4_83xx_loopback_in_progress(struct scsi_qla_host *ha)
|
||||||
|
{
|
||||||
|
int rval = 1;
|
||||||
|
|
||||||
|
if (is_qla8032(ha)) {
|
||||||
|
if ((ha->idc_info.info2 & ENABLE_INTERNAL_LOOPBACK) ||
|
||||||
|
(ha->idc_info.info2 & ENABLE_EXTERNAL_LOOPBACK)) {
|
||||||
|
DEBUG2(ql4_printk(KERN_INFO, ha,
|
||||||
|
"%s: Loopback diagnostics in progress\n",
|
||||||
|
__func__));
|
||||||
|
rval = 1;
|
||||||
|
} else {
|
||||||
|
DEBUG2(ql4_printk(KERN_INFO, ha,
|
||||||
|
"%s: Loopback diagnostics not in progress\n",
|
||||||
|
__func__));
|
||||||
|
rval = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qla4xxx_isr_decode_mailbox - decodes mailbox status
|
* qla4xxx_isr_decode_mailbox - decodes mailbox status
|
||||||
* @ha: Pointer to host adapter structure.
|
* @ha: Pointer to host adapter structure.
|
||||||
|
@ -676,8 +703,10 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha,
|
||||||
|
|
||||||
case MBOX_ASTS_LINK_DOWN:
|
case MBOX_ASTS_LINK_DOWN:
|
||||||
clear_bit(AF_LINK_UP, &ha->flags);
|
clear_bit(AF_LINK_UP, &ha->flags);
|
||||||
if (test_bit(AF_INIT_DONE, &ha->flags))
|
if (test_bit(AF_INIT_DONE, &ha->flags)) {
|
||||||
set_bit(DPC_LINK_CHANGED, &ha->dpc_flags);
|
set_bit(DPC_LINK_CHANGED, &ha->dpc_flags);
|
||||||
|
qla4xxx_wake_dpc(ha);
|
||||||
|
}
|
||||||
|
|
||||||
ql4_printk(KERN_INFO, ha, "%s: LINK DOWN\n", __func__);
|
ql4_printk(KERN_INFO, ha, "%s: LINK DOWN\n", __func__);
|
||||||
qla4xxx_post_aen_work(ha, ISCSI_EVENT_LINKDOWN,
|
qla4xxx_post_aen_work(ha, ISCSI_EVENT_LINKDOWN,
|
||||||
|
@ -840,6 +869,11 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha,
|
||||||
DEBUG2(ql4_printk(KERN_INFO, ha,
|
DEBUG2(ql4_printk(KERN_INFO, ha,
|
||||||
"scsi:%ld: AEN %04x IDC Complete notification\n",
|
"scsi:%ld: AEN %04x IDC Complete notification\n",
|
||||||
ha->host_no, mbox_sts[0]));
|
ha->host_no, mbox_sts[0]));
|
||||||
|
|
||||||
|
if (qla4_83xx_loopback_in_progress(ha))
|
||||||
|
set_bit(AF_LOOPBACK, &ha->flags);
|
||||||
|
else
|
||||||
|
clear_bit(AF_LOOPBACK, &ha->flags);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -2242,6 +2242,7 @@ static int qla4xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
||||||
test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) ||
|
test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) ||
|
||||||
!test_bit(AF_ONLINE, &ha->flags) ||
|
!test_bit(AF_ONLINE, &ha->flags) ||
|
||||||
!test_bit(AF_LINK_UP, &ha->flags) ||
|
!test_bit(AF_LINK_UP, &ha->flags) ||
|
||||||
|
test_bit(AF_LOOPBACK, &ha->flags) ||
|
||||||
test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))
|
test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))
|
||||||
goto qc_host_busy;
|
goto qc_host_busy;
|
||||||
|
|
||||||
|
@ -3480,7 +3481,8 @@ dpc_post_reset_ha:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---- link change? --- */
|
/* ---- link change? --- */
|
||||||
if (test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) {
|
if (!test_bit(AF_LOOPBACK, &ha->flags) &&
|
||||||
|
test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) {
|
||||||
if (!test_bit(AF_LINK_UP, &ha->flags)) {
|
if (!test_bit(AF_LINK_UP, &ha->flags)) {
|
||||||
/* ---- link down? --- */
|
/* ---- link down? --- */
|
||||||
qla4xxx_mark_all_devices_missing(ha);
|
qla4xxx_mark_all_devices_missing(ha);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue