diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_isr.c')
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 9bc86b9e86b1..0a1dcb43d18b 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
| @@ -2880,6 +2880,7 @@ static int | |||
| 2880 | qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp) | 2880 | qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp) |
| 2881 | { | 2881 | { |
| 2882 | #define MIN_MSIX_COUNT 2 | 2882 | #define MIN_MSIX_COUNT 2 |
| 2883 | #define ATIO_VECTOR 2 | ||
| 2883 | int i, ret; | 2884 | int i, ret; |
| 2884 | struct msix_entry *entries; | 2885 | struct msix_entry *entries; |
| 2885 | struct qla_msix_entry *qentry; | 2886 | struct qla_msix_entry *qentry; |
| @@ -2936,34 +2937,47 @@ msix_failed: | |||
| 2936 | } | 2937 | } |
| 2937 | 2938 | ||
| 2938 | /* Enable MSI-X vectors for the base queue */ | 2939 | /* Enable MSI-X vectors for the base queue */ |
| 2939 | for (i = 0; i < ha->msix_count; i++) { | 2940 | for (i = 0; i < 2; i++) { |
| 2940 | qentry = &ha->msix_entries[i]; | 2941 | qentry = &ha->msix_entries[i]; |
| 2941 | if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) { | 2942 | if (IS_P3P_TYPE(ha)) |
| 2942 | ret = request_irq(qentry->vector, | ||
| 2943 | qla83xx_msix_entries[i].handler, | ||
| 2944 | 0, qla83xx_msix_entries[i].name, rsp); | ||
| 2945 | } else if (IS_P3P_TYPE(ha)) { | ||
| 2946 | ret = request_irq(qentry->vector, | 2943 | ret = request_irq(qentry->vector, |
| 2947 | qla82xx_msix_entries[i].handler, | 2944 | qla82xx_msix_entries[i].handler, |
| 2948 | 0, qla82xx_msix_entries[i].name, rsp); | 2945 | 0, qla82xx_msix_entries[i].name, rsp); |
| 2949 | } else { | 2946 | else |
| 2950 | ret = request_irq(qentry->vector, | 2947 | ret = request_irq(qentry->vector, |
| 2951 | msix_entries[i].handler, | 2948 | msix_entries[i].handler, |
| 2952 | 0, msix_entries[i].name, rsp); | 2949 | 0, msix_entries[i].name, rsp); |
| 2953 | } | 2950 | if (ret) |
| 2954 | if (ret) { | 2951 | goto msix_register_fail; |
| 2955 | ql_log(ql_log_fatal, vha, 0x00cb, | ||
| 2956 | "MSI-X: unable to register handler -- %x/%d.\n", | ||
| 2957 | qentry->vector, ret); | ||
| 2958 | qla24xx_disable_msix(ha); | ||
| 2959 | ha->mqenable = 0; | ||
| 2960 | goto msix_out; | ||
| 2961 | } | ||
| 2962 | qentry->have_irq = 1; | 2952 | qentry->have_irq = 1; |
| 2963 | qentry->rsp = rsp; | 2953 | qentry->rsp = rsp; |
| 2964 | rsp->msix = qentry; | 2954 | rsp->msix = qentry; |
| 2965 | } | 2955 | } |
| 2966 | 2956 | ||
| 2957 | /* | ||
| 2958 | * If target mode is enable, also request the vector for the ATIO | ||
| 2959 | * queue. | ||
| 2960 | */ | ||
| 2961 | if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) { | ||
| 2962 | qentry = &ha->msix_entries[ATIO_VECTOR]; | ||
| 2963 | ret = request_irq(qentry->vector, | ||
| 2964 | qla83xx_msix_entries[ATIO_VECTOR].handler, | ||
| 2965 | 0, qla83xx_msix_entries[ATIO_VECTOR].name, rsp); | ||
| 2966 | qentry->have_irq = 1; | ||
| 2967 | qentry->rsp = rsp; | ||
| 2968 | rsp->msix = qentry; | ||
| 2969 | } | ||
| 2970 | |||
| 2971 | msix_register_fail: | ||
| 2972 | if (ret) { | ||
| 2973 | ql_log(ql_log_fatal, vha, 0x00cb, | ||
| 2974 | "MSI-X: unable to register handler -- %x/%d.\n", | ||
| 2975 | qentry->vector, ret); | ||
| 2976 | qla24xx_disable_msix(ha); | ||
| 2977 | ha->mqenable = 0; | ||
| 2978 | goto msix_out; | ||
| 2979 | } | ||
| 2980 | |||
| 2967 | /* Enable MSI-X vector for response queue update for queue 0 */ | 2981 | /* Enable MSI-X vector for response queue update for queue 0 */ |
| 2968 | if (IS_QLA83XX(ha)) { | 2982 | if (IS_QLA83XX(ha)) { |
| 2969 | if (ha->msixbase && ha->mqiobase && | 2983 | if (ha->msixbase && ha->mqiobase && |
