diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_isr.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 40 |
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); |