]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla4xxx: Disable generating pause frames in case of FW hung
authorGiridhar Malavali <giridhar.malavali@qlogic.com>
Wed, 14 Dec 2011 10:45:10 +0000 (16:15 +0530)
committerGuru Anbalagane <guru.anbalagane@oracle.com>
Thu, 12 Jan 2012 22:35:20 +0000 (14:35 -0800)
JIRA Key: IUEKR2ISCSI-14

Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Signed-off-by: Nilesh Javali <nilesh.javali@qlogic.com>
Signed-off-by: Tej Parkash <tej.parkash@qlogic.com>
drivers/scsi/qla4xxx/ql4_mbx.c
drivers/scsi/qla4xxx/ql4_nx.h
drivers/scsi/qla4xxx/ql4_os.c

index c2593782fbbef8c203148b1661c92a3e1dbe35f6..c4002250676040a66ee7148ebca6ca9d62ff7c2a 100644 (file)
@@ -219,6 +219,13 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount,
                ha->mailbox_timeout_count++;
                mbx_sts[0] = (-1);
                set_bit(DPC_RESET_HA, &ha->dpc_flags);
+               if (is_qla8022(ha)) {
+                       ql4_printk(KERN_INFO, ha,
+                               "disabling pause transmit on port 0 & 1.\n");
+                       qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0x98,
+                               CRB_NIU_XG_PAUSE_CTL_P0 |
+                               CRB_NIU_XG_PAUSE_CTL_P1);
+               }
                goto mbox_exit;
        }
 
index 94662afe9ad7c8bfb2dcc85228bbda8a6004d444..be6e052cf1df23345d367038b15b69304193c27a 100644 (file)
@@ -41,6 +41,9 @@ enum {
                                         * shut down. */
 };
 
+#define CRB_NIU_XG_PAUSE_CTL_P0                0x1
+#define CRB_NIU_XG_PAUSE_CTL_P1                0x8
+
 #define QLA82XX_HW_H0_CH_HUB_ADR       0x05
 #define QLA82XX_HW_H1_CH_HUB_ADR       0x0E
 #define QLA82XX_HW_H2_CH_HUB_ADR       0x03
index fc0c18ec18d3b9d1e90267f5b12f1ae7e96e0dad..0e7940384862ef2935e4343ebfe989e292fdf306 100644 (file)
@@ -2079,6 +2079,11 @@ void qla4_8xxx_watchdog(struct scsi_qla_host *ha)
                dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE);
 
                if (qla4_8xxx_check_temp(ha)) {
+                       ql4_printk(KERN_INFO, ha, "disabling pause"
+                                  " transmit on port 0 & 1.\n");
+                       qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0x98,
+                                       CRB_NIU_XG_PAUSE_CTL_P0 |
+                                       CRB_NIU_XG_PAUSE_CTL_P1);
                        set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags);
                        qla4xxx_wake_dpc(ha);
                } else if (dev_state == QLA82XX_DEV_NEED_RESET &&
@@ -2098,6 +2103,11 @@ void qla4_8xxx_watchdog(struct scsi_qla_host *ha)
                } else  {
                        /* Check firmware health */
                        if (qla4_8xxx_check_fw_alive(ha)) {
+                               ql4_printk(KERN_INFO, ha, "disabling pause"
+                                          " transmit on port 0 & 1.\n");
+                               qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0x98,
+                                               CRB_NIU_XG_PAUSE_CTL_P0 |
+                                               CRB_NIU_XG_PAUSE_CTL_P1);
                                halt_status = qla4_8xxx_rd_32(ha,
                                                QLA82XX_PEG_HALT_STATUS1);