aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_isr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_isr.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 0e716dcea944..6f67a9d4998b 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -5,6 +5,7 @@
5 * See LICENSE.qla2xxx for copyright and licensing details. 5 * See LICENSE.qla2xxx for copyright and licensing details.
6 */ 6 */
7#include "qla_def.h" 7#include "qla_def.h"
8#include "qla_target.h"
8 9
9#include <linux/delay.h> 10#include <linux/delay.h>
10#include <linux/slab.h> 11#include <linux/slab.h>
@@ -473,8 +474,8 @@ skip_rio:
473 case MBA_WAKEUP_THRES: /* Request Queue Wake-up */ 474 case MBA_WAKEUP_THRES: /* Request Queue Wake-up */
474 ql_dbg(ql_dbg_async, vha, 0x5008, 475 ql_dbg(ql_dbg_async, vha, 0x5008,
475 "Asynchronous WAKEUP_THRES.\n"); 476 "Asynchronous WAKEUP_THRES.\n");
476 break;
477 477
478 break;
478 case MBA_LIP_OCCURRED: /* Loop Initialization Procedure */ 479 case MBA_LIP_OCCURRED: /* Loop Initialization Procedure */
479 ql_dbg(ql_dbg_async, vha, 0x5009, 480 ql_dbg(ql_dbg_async, vha, 0x5009,
480 "LIP occurred (%x).\n", mb[1]); 481 "LIP occurred (%x).\n", mb[1]);
@@ -685,6 +686,8 @@ skip_rio:
685 ql_dbg(ql_dbg_async, vha, 0x5011, 686 ql_dbg(ql_dbg_async, vha, 0x5011,
686 "Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n", 687 "Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n",
687 mb[1], mb[2], mb[3]); 688 mb[1], mb[2], mb[3]);
689
690 qlt_async_event(mb[0], vha, mb);
688 break; 691 break;
689 } 692 }
690 693
@@ -702,8 +705,13 @@ skip_rio:
702 705
703 qla2x00_mark_all_devices_lost(vha, 1); 706 qla2x00_mark_all_devices_lost(vha, 1);
704 707
708 if (vha->vp_idx == 0 && !qla_ini_mode_enabled(vha))
709 set_bit(SCR_PENDING, &vha->dpc_flags);
710
705 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); 711 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
706 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); 712 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
713
714 qlt_async_event(mb[0], vha, mb);
707 break; 715 break;
708 716
709 case MBA_RSCN_UPDATE: /* State Change Registration */ 717 case MBA_RSCN_UPDATE: /* State Change Registration */
@@ -825,6 +833,8 @@ skip_rio:
825 mb[0], mb[1], mb[2], mb[3]); 833 mb[0], mb[1], mb[2], mb[3]);
826 } 834 }
827 835
836 qlt_async_event(mb[0], vha, mb);
837
828 if (!vha->vp_idx && ha->num_vhosts) 838 if (!vha->vp_idx && ha->num_vhosts)
829 qla2x00_alert_all_vps(rsp, mb); 839 qla2x00_alert_all_vps(rsp, mb);
830} 840}
@@ -1190,6 +1200,9 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1190 } else if (iop[0] & BIT_5) 1200 } else if (iop[0] & BIT_5)
1191 fcport->port_type = FCT_INITIATOR; 1201 fcport->port_type = FCT_INITIATOR;
1192 1202
1203 if (iop[0] & BIT_7)
1204 fcport->flags |= FCF_CONF_COMP_SUPPORTED;
1205
1193 if (logio->io_parameter[7] || logio->io_parameter[8]) 1206 if (logio->io_parameter[7] || logio->io_parameter[8])
1194 fcport->supported_classes |= FC_COS_CLASS2; 1207 fcport->supported_classes |= FC_COS_CLASS2;
1195 if (logio->io_parameter[9] || logio->io_parameter[10]) 1208 if (logio->io_parameter[9] || logio->io_parameter[10])
@@ -2004,6 +2017,9 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,
2004 2017
2005 if (pkt->entry_status != 0) { 2018 if (pkt->entry_status != 0) {
2006 qla2x00_error_entry(vha, rsp, (sts_entry_t *) pkt); 2019 qla2x00_error_entry(vha, rsp, (sts_entry_t *) pkt);
2020
2021 (void)qlt_24xx_process_response_error(vha, pkt);
2022
2007 ((response_t *)pkt)->signature = RESPONSE_PROCESSED; 2023 ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
2008 wmb(); 2024 wmb();
2009 continue; 2025 continue;
@@ -2034,6 +2050,14 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,
2034 case ELS_IOCB_TYPE: 2050 case ELS_IOCB_TYPE:
2035 qla24xx_els_ct_entry(vha, rsp->req, pkt, ELS_IOCB_TYPE); 2051 qla24xx_els_ct_entry(vha, rsp->req, pkt, ELS_IOCB_TYPE);
2036 break; 2052 break;
2053 case ABTS_RECV_24XX:
2054 /* ensure that the ATIO queue is empty */
2055 qlt_24xx_process_atio_queue(vha);
2056 case ABTS_RESP_24XX:
2057 case CTIO_TYPE7:
2058 case NOTIFY_ACK_TYPE:
2059 qlt_response_pkt_all_vps(vha, (response_t *)pkt);
2060 break;
2037 case MARKER_TYPE: 2061 case MARKER_TYPE:
2038 /* Do nothing in this case, this check is to prevent it 2062 /* Do nothing in this case, this check is to prevent it
2039 * from falling into default case 2063 * from falling into default case
@@ -2186,6 +2210,13 @@ qla24xx_intr_handler(int irq, void *dev_id)
2186 case 0x14: 2210 case 0x14:
2187 qla24xx_process_response_queue(vha, rsp); 2211 qla24xx_process_response_queue(vha, rsp);
2188 break; 2212 break;
2213 case 0x1C: /* ATIO queue updated */
2214 qlt_24xx_process_atio_queue(vha);
2215 break;
2216 case 0x1D: /* ATIO and response queues updated */
2217 qlt_24xx_process_atio_queue(vha);
2218 qla24xx_process_response_queue(vha, rsp);
2219 break;
2189 default: 2220 default:
2190 ql_dbg(ql_dbg_async, vha, 0x504f, 2221 ql_dbg(ql_dbg_async, vha, 0x504f,
2191 "Unrecognized interrupt type (%d).\n", stat * 0xff); 2222 "Unrecognized interrupt type (%d).\n", stat * 0xff);
@@ -2330,6 +2361,13 @@ qla24xx_msix_default(int irq, void *dev_id)
2330 case 0x14: 2361 case 0x14:
2331 qla24xx_process_response_queue(vha, rsp); 2362 qla24xx_process_response_queue(vha, rsp);
2332 break; 2363 break;
2364 case 0x1C: /* ATIO queue updated */
2365 qlt_24xx_process_atio_queue(vha);
2366 break;
2367 case 0x1D: /* ATIO and response queues updated */
2368 qlt_24xx_process_atio_queue(vha);
2369 qla24xx_process_response_queue(vha, rsp);
2370 break;
2333 default: 2371 default:
2334 ql_dbg(ql_dbg_async, vha, 0x5051, 2372 ql_dbg(ql_dbg_async, vha, 0x5051,
2335 "Unrecognized interrupt type (%d).\n", stat & 0xff); 2373 "Unrecognized interrupt type (%d).\n", stat & 0xff);