1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * QLogic Fibre Channel HBA Driver
4 * Copyright (c) 2003-2014 QLogic Corporation
7 #include "qla_target.h"
9 * qla24xx_calc_iocbs() - Determine number of Command Type 3 and
10 * Continuation Type 1 IOCBs to allocate.
13 * @dsds: number of data segment descriptors needed
15 * Returns the number of IOCB entries needed to store @dsds.
17 static inline uint16_t
18 qla24xx_calc_iocbs(scsi_qla_host_t
*vha
, uint16_t dsds
)
24 iocbs
+= (dsds
- 1) / 5;
32 * qla2x00_debounce_register
36 * port = register address.
41 static __inline__
uint16_t
42 qla2x00_debounce_register(volatile __le16 __iomem
*addr
)
44 volatile uint16_t first
;
45 volatile uint16_t second
;
48 first
= rd_reg_word(addr
);
51 second
= rd_reg_word(addr
);
52 } while (first
!= second
);
58 qla2x00_poll(struct rsp_que
*rsp
)
60 struct qla_hw_data
*ha
= rsp
->hw
;
65 ha
->isp_ops
->intr_handler(0, rsp
);
68 static inline uint8_t *
69 host_to_fcp_swap(uint8_t *fcp
, uint32_t bsize
)
71 uint32_t *ifcp
= (uint32_t *) fcp
;
72 uint32_t *ofcp
= (uint32_t *) fcp
;
73 uint32_t iter
= bsize
>> 2;
76 *ofcp
++ = swab32(*ifcp
++);
82 host_to_adap(uint8_t *src
, uint8_t *dst
, uint32_t bsize
)
84 uint32_t *isrc
= (uint32_t *) src
;
85 __le32
*odest
= (__le32
*) dst
;
86 uint32_t iter
= bsize
>> 2;
88 for ( ; iter
--; isrc
++)
89 *odest
++ = cpu_to_le32(*isrc
);
93 qla2x00_clean_dsd_pool(struct qla_hw_data
*ha
, struct crc_context
*ctx
)
95 struct dsd_dma
*dsd
, *tdsd
;
97 /* clean up allocated prev pool */
98 list_for_each_entry_safe(dsd
, tdsd
, &ctx
->dsd_list
, list
) {
99 dma_pool_free(ha
->dl_dma_pool
, dsd
->dsd_addr
,
101 list_del(&dsd
->list
);
104 INIT_LIST_HEAD(&ctx
->dsd_list
);
108 qla2x00_set_fcport_disc_state(fc_port_t
*fcport
, int state
)
111 uint8_t shiftbits
, mask
;
113 /* This will have to change when the max no. of states > 16 */
115 mask
= (1 << shiftbits
) - 1;
117 fcport
->disc_state
= state
;
119 old_val
= atomic_read(&fcport
->shadow_disc_state
);
120 if (old_val
== atomic_cmpxchg(&fcport
->shadow_disc_state
,
121 old_val
, (old_val
<< shiftbits
) | state
)) {
122 ql_dbg(ql_dbg_disc
, fcport
->vha
, 0x2134,
123 "FCPort %8phC disc_state transition: %s to %s - portid=%06x.\n",
124 fcport
->port_name
, port_dstate_str
[old_val
& mask
],
125 port_dstate_str
[state
], fcport
->d_id
.b24
);
132 qla2x00_hba_err_chk_enabled(srb_t
*sp
)
135 * Uncomment when corresponding SCSI changes are done.
137 if (!sp->cmd->prot_chk)
141 switch (scsi_get_prot_op(GET_CMD_SP(sp
))) {
142 case SCSI_PROT_READ_STRIP
:
143 case SCSI_PROT_WRITE_INSERT
:
144 if (ql2xenablehba_err_chk
>= 1)
147 case SCSI_PROT_READ_PASS
:
148 case SCSI_PROT_WRITE_PASS
:
149 if (ql2xenablehba_err_chk
>= 2)
152 case SCSI_PROT_READ_INSERT
:
153 case SCSI_PROT_WRITE_STRIP
:
160 qla2x00_reset_active(scsi_qla_host_t
*vha
)
162 scsi_qla_host_t
*base_vha
= pci_get_drvdata(vha
->hw
->pdev
);
164 /* Test appropriate base-vha and vha flags. */
165 return test_bit(ISP_ABORT_NEEDED
, &base_vha
->dpc_flags
) ||
166 test_bit(ABORT_ISP_ACTIVE
, &base_vha
->dpc_flags
) ||
167 test_bit(ISP_ABORT_RETRY
, &base_vha
->dpc_flags
) ||
168 test_bit(ISP_ABORT_NEEDED
, &vha
->dpc_flags
) ||
169 test_bit(ABORT_ISP_ACTIVE
, &vha
->dpc_flags
);
173 qla2x00_chip_is_down(scsi_qla_host_t
*vha
)
175 return (qla2x00_reset_active(vha
) || !vha
->hw
->flags
.fw_started
);
178 static void qla2xxx_init_sp(srb_t
*sp
, scsi_qla_host_t
*vha
,
179 struct qla_qpair
*qpair
, fc_port_t
*fcport
)
181 memset(sp
, 0, sizeof(*sp
));
186 sp
->cmd_type
= TYPE_SRB
;
187 INIT_LIST_HEAD(&sp
->elem
);
190 static inline srb_t
*
191 qla2xxx_get_qpair_sp(scsi_qla_host_t
*vha
, struct qla_qpair
*qpair
,
192 fc_port_t
*fcport
, gfp_t flag
)
197 QLA_QPAIR_MARK_BUSY(qpair
, bail
);
201 sp
= mempool_alloc(qpair
->srb_mempool
, flag
);
203 qla2xxx_init_sp(sp
, vha
, qpair
, fcport
);
205 QLA_QPAIR_MARK_NOT_BUSY(qpair
);
209 void qla2xxx_rel_done_warning(srb_t
*sp
, int res
);
210 void qla2xxx_rel_free_warning(srb_t
*sp
);
213 qla2xxx_rel_qpair_sp(struct qla_qpair
*qpair
, srb_t
*sp
)
216 sp
->done
= qla2xxx_rel_done_warning
;
217 sp
->free
= qla2xxx_rel_free_warning
;
218 mempool_free(sp
, qpair
->srb_mempool
);
219 QLA_QPAIR_MARK_NOT_BUSY(qpair
);
222 static inline srb_t
*
223 qla2x00_get_sp(scsi_qla_host_t
*vha
, fc_port_t
*fcport
, gfp_t flag
)
227 struct qla_qpair
*qpair
;
229 QLA_VHA_MARK_BUSY(vha
, bail
);
233 qpair
= vha
->hw
->base_qpair
;
234 sp
= qla2xxx_get_qpair_sp(vha
, qpair
, fcport
, flag
);
241 QLA_VHA_MARK_NOT_BUSY(vha
);
246 qla2x00_rel_sp(srb_t
*sp
)
248 QLA_VHA_MARK_NOT_BUSY(sp
->vha
);
249 qla2xxx_rel_qpair_sp(sp
->qpair
, sp
);
253 qla2x00_gid_list_size(struct qla_hw_data
*ha
)
256 return sizeof(uint32_t) * 32;
258 return sizeof(struct gid_list_info
) * ha
->max_fibre_devices
;
262 qla2x00_handle_mbx_completion(struct qla_hw_data
*ha
, int status
)
264 if (test_bit(MBX_INTR_WAIT
, &ha
->mbx_cmd_flags
) &&
265 (status
& MBX_INTERRUPT
) && ha
->flags
.mbox_int
) {
266 set_bit(MBX_INTERRUPT
, &ha
->mbx_cmd_flags
);
267 clear_bit(MBX_INTR_WAIT
, &ha
->mbx_cmd_flags
);
268 complete(&ha
->mbx_intr_comp
);
273 qla2x00_set_retry_delay_timestamp(fc_port_t
*fcport
, uint16_t sts_qual
)
277 #define SQ_SCOPE_MASK 0xc000 /* SAM-6 rev5 5.3.2 */
278 #define SQ_SCOPE_SHIFT 14
279 #define SQ_QUAL_MASK 0x3fff
281 #define SQ_MAX_WAIT_SEC 60 /* Max I/O hold off time in seconds. */
282 #define SQ_MAX_WAIT_TIME (SQ_MAX_WAIT_SEC * 10) /* in 100ms. */
284 if (!sts_qual
) /* Common case. */
287 scope
= (sts_qual
& SQ_SCOPE_MASK
) >> SQ_SCOPE_SHIFT
;
288 /* Handle only scope 1 or 2, which is for I-T nexus. */
289 if (scope
!= 1 && scope
!= 2)
292 /* Skip processing, if retry delay timer is already in effect. */
293 if (fcport
->retry_delay_timestamp
&&
294 time_before(jiffies
, fcport
->retry_delay_timestamp
))
297 qual
= sts_qual
& SQ_QUAL_MASK
;
298 if (qual
< 1 || qual
> 0x3fef)
300 qual
= min(qual
, (u16
)SQ_MAX_WAIT_TIME
);
302 /* qual is expressed in 100ms increments. */
303 fcport
->retry_delay_timestamp
= jiffies
+ (qual
* HZ
/ 10);
305 ql_log(ql_log_warn
, fcport
->vha
, 0x5101,
306 "%8phC: I/O throttling requested (status qualifier = %04xh), holding off I/Os for %ums.\n",
307 fcport
->port_name
, sts_qual
, qual
* 100);
311 qla_is_exch_offld_enabled(struct scsi_qla_host
*vha
)
313 if (qla_ini_mode_enabled(vha
) &&
314 (vha
->ql2xiniexchg
> FW_DEF_EXCHANGES_CNT
))
316 else if (qla_tgt_mode_enabled(vha
) &&
317 (vha
->ql2xexchoffld
> FW_DEF_EXCHANGES_CNT
))
319 else if (qla_dual_mode_enabled(vha
) &&
320 ((vha
->ql2xiniexchg
+ vha
->ql2xexchoffld
) > FW_DEF_EXCHANGES_CNT
))
327 qla_cpu_update(struct qla_qpair
*qpair
, uint16_t cpuid
)
329 qpair
->cpuid
= cpuid
;
331 if (!list_empty(&qpair
->hints_list
)) {
332 struct qla_qpair_hint
*h
;
334 list_for_each_entry(h
, &qpair
->hints_list
, hint_elem
)
335 h
->cpuid
= qpair
->cpuid
;
339 static inline struct qla_qpair_hint
*
340 qla_qpair_to_hint(struct qla_tgt
*tgt
, struct qla_qpair
*qpair
)
342 struct qla_qpair_hint
*h
;
345 for (i
= 0; i
< tgt
->ha
->max_qpairs
+ 1; i
++) {
346 h
= &tgt
->qphints
[i
];
347 if (h
->qpair
== qpair
)
355 qla_83xx_start_iocbs(struct qla_qpair
*qpair
)
357 struct req_que
*req
= qpair
->req
;
360 if (req
->ring_index
== req
->length
) {
362 req
->ring_ptr
= req
->ring
;
366 wrt_reg_dword(req
->req_q_in
, req
->ring_index
);
370 qla2xxx_get_fc4_priority(struct scsi_qla_host
*vha
)
375 ((uint8_t *)vha
->hw
->nvram
)[NVRAM_DUAL_FCP_NVME_FLAG_OFFSET
];
378 return (data
>> 6) & BIT_0
? FC4_PRIORITY_FCP
: FC4_PRIORITY_NVME
;
387 qla_get_iocbs(struct qla_qpair
*qp
, struct iocb_resource
*iores
)
390 struct qla_hw_data
*ha
= qp
->vha
->hw
;
392 if (!ql2xenforce_iocb_limit
) {
393 iores
->res_type
= RESOURCE_NONE
;
397 if ((iores
->iocb_cnt
+ qp
->fwres
.iocbs_used
) < qp
->fwres
.iocbs_qp_limit
) {
398 qp
->fwres
.iocbs_used
+= iores
->iocb_cnt
;
401 /* no need to acquire qpair lock. It's just rough calculation */
402 iocbs_used
= ha
->base_qpair
->fwres
.iocbs_used
;
403 for (i
= 0; i
< ha
->max_qpairs
; i
++) {
404 if (ha
->queue_pair_map
[i
])
405 iocbs_used
+= ha
->queue_pair_map
[i
]->fwres
.iocbs_used
;
408 if ((iores
->iocb_cnt
+ iocbs_used
) < qp
->fwres
.iocbs_limit
) {
409 qp
->fwres
.iocbs_used
+= iores
->iocb_cnt
;
412 iores
->res_type
= RESOURCE_NONE
;
419 qla_put_iocbs(struct qla_qpair
*qp
, struct iocb_resource
*iores
)
421 switch (iores
->res_type
) {
425 if (qp
->fwres
.iocbs_used
>= iores
->iocb_cnt
) {
426 qp
->fwres
.iocbs_used
-= iores
->iocb_cnt
;
429 qp
->fwres
.iocbs_used
= 0;
433 iores
->res_type
= RESOURCE_NONE
;