1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * QLogic Fibre Channel HBA Driver 4 * Copyright (c) 2003-2014 QLogic Corporation 5 */ 6 7 #include "qla_target.h" 8 /** 9 * qla24xx_calc_iocbs() - Determine number of Command Type 3 and 10 * Continuation Type 1 IOCBs to allocate. 11 * 12 * @vha: HA context 13 * @dsds: number of data segment descriptors needed 14 * 15 * Returns the number of IOCB entries needed to store @dsds. 16 */ 17 static inline uint16_t 18 qla24xx_calc_iocbs(scsi_qla_host_t *vha, uint16_t dsds) 19 { 20 uint16_t iocbs; 21 22 iocbs = 1; 23 if (dsds > 1) { 24 iocbs += (dsds - 1) / 5; 25 if ((dsds - 1) % 5) 26 iocbs++; 27 } 28 return iocbs; 29 } 30 31 /* 32 * qla2x00_debounce_register 33 * Debounce register. 34 * 35 * Input: 36 * port = register address. 37 * 38 * Returns: 39 * register value. 40 */ 41 static __inline__ uint16_t 42 qla2x00_debounce_register(volatile __le16 __iomem *addr) 43 { 44 volatile uint16_t first; 45 volatile uint16_t second; 46 47 do { 48 first = rd_reg_word(addr); 49 barrier(); 50 cpu_relax(); 51 second = rd_reg_word(addr); 52 } while (first != second); 53 54 return (first); 55 } 56 57 static inline void 58 qla2x00_poll(struct rsp_que *rsp) 59 { 60 struct qla_hw_data *ha = rsp->hw; 61 62 if (IS_P3P_TYPE(ha)) 63 qla82xx_poll(0, rsp); 64 else 65 ha->isp_ops->intr_handler(0, rsp); 66 } 67 68 static inline uint8_t * 69 host_to_fcp_swap(uint8_t *fcp, uint32_t bsize) 70 { 71 uint32_t *ifcp = (uint32_t *) fcp; 72 uint32_t *ofcp = (uint32_t *) fcp; 73 uint32_t iter = bsize >> 2; 74 75 for (; iter ; iter--) 76 *ofcp++ = swab32(*ifcp++); 77 78 return fcp; 79 } 80 81 static inline void 82 host_to_adap(uint8_t *src, uint8_t *dst, uint32_t bsize) 83 { 84 uint32_t *isrc = (uint32_t *) src; 85 __le32 *odest = (__le32 *) dst; 86 uint32_t iter = bsize >> 2; 87 88 for ( ; iter--; isrc++) 89 *odest++ = cpu_to_le32(*isrc); 90 } 91 92 static inline void 93 qla2x00_clean_dsd_pool(struct qla_hw_data *ha, struct crc_context *ctx) 94 { 95 struct dsd_dma *dsd, *tdsd; 96 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, 100 dsd->dsd_list_dma); 101 list_del(&dsd->list); 102 kfree(dsd); 103 } 104 INIT_LIST_HEAD(&ctx->dsd_list); 105 } 106 107 static inline void 108 qla2x00_set_fcport_disc_state(fc_port_t *fcport, int state) 109 { 110 int old_val; 111 uint8_t shiftbits, mask; 112 uint8_t port_dstate_str_sz; 113 114 /* This will have to change when the max no. of states > 16 */ 115 shiftbits = 4; 116 mask = (1 << shiftbits) - 1; 117 118 port_dstate_str_sz = sizeof(port_dstate_str) / sizeof(char *); 119 fcport->disc_state = state; 120 while (1) { 121 old_val = atomic_read(&fcport->shadow_disc_state); 122 if (old_val == atomic_cmpxchg(&fcport->shadow_disc_state, 123 old_val, (old_val << shiftbits) | state)) { 124 ql_dbg(ql_dbg_disc, fcport->vha, 0x2134, 125 "FCPort %8phC disc_state transition: %s to %s - portid=%06x.\n", 126 fcport->port_name, (old_val & mask) < port_dstate_str_sz ? 127 port_dstate_str[old_val & mask] : "Unknown", 128 port_dstate_str[state], fcport->d_id.b24); 129 return; 130 } 131 } 132 } 133 134 static inline int 135 qla2x00_hba_err_chk_enabled(srb_t *sp) 136 { 137 /* 138 * Uncomment when corresponding SCSI changes are done. 139 * 140 if (!sp->cmd->prot_chk) 141 return 0; 142 * 143 */ 144 switch (scsi_get_prot_op(GET_CMD_SP(sp))) { 145 case SCSI_PROT_READ_STRIP: 146 case SCSI_PROT_WRITE_INSERT: 147 if (ql2xenablehba_err_chk >= 1) 148 return 1; 149 break; 150 case SCSI_PROT_READ_PASS: 151 case SCSI_PROT_WRITE_PASS: 152 if (ql2xenablehba_err_chk >= 2) 153 return 1; 154 break; 155 case SCSI_PROT_READ_INSERT: 156 case SCSI_PROT_WRITE_STRIP: 157 return 1; 158 } 159 return 0; 160 } 161 162 static inline int 163 qla2x00_reset_active(scsi_qla_host_t *vha) 164 { 165 scsi_qla_host_t *base_vha = pci_get_drvdata(vha->hw->pdev); 166 167 /* Test appropriate base-vha and vha flags. */ 168 return test_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags) || 169 test_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags) || 170 test_bit(ISP_ABORT_RETRY, &base_vha->dpc_flags) || 171 test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) || 172 test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); 173 } 174 175 static inline int 176 qla2x00_chip_is_down(scsi_qla_host_t *vha) 177 { 178 return (qla2x00_reset_active(vha) || !vha->hw->flags.fw_started); 179 } 180 181 static void qla2xxx_init_sp(srb_t *sp, scsi_qla_host_t *vha, 182 struct qla_qpair *qpair, fc_port_t *fcport) 183 { 184 memset(sp, 0, sizeof(*sp)); 185 sp->fcport = fcport; 186 sp->iocbs = 1; 187 sp->vha = vha; 188 sp->qpair = qpair; 189 sp->cmd_type = TYPE_SRB; 190 /* ref : INIT - normal flow */ 191 kref_init(&sp->cmd_kref); 192 INIT_LIST_HEAD(&sp->elem); 193 } 194 195 static inline srb_t * 196 qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair, 197 fc_port_t *fcport, gfp_t flag) 198 { 199 srb_t *sp = NULL; 200 uint8_t bail; 201 202 QLA_QPAIR_MARK_BUSY(qpair, bail); 203 if (unlikely(bail)) 204 return NULL; 205 206 sp = mempool_alloc(qpair->srb_mempool, flag); 207 if (sp) 208 qla2xxx_init_sp(sp, vha, qpair, fcport); 209 else 210 QLA_QPAIR_MARK_NOT_BUSY(qpair); 211 return sp; 212 } 213 214 void qla2xxx_rel_done_warning(srb_t *sp, int res); 215 void qla2xxx_rel_free_warning(srb_t *sp); 216 217 static inline void 218 qla2xxx_rel_qpair_sp(struct qla_qpair *qpair, srb_t *sp) 219 { 220 sp->qpair = NULL; 221 sp->done = qla2xxx_rel_done_warning; 222 sp->free = qla2xxx_rel_free_warning; 223 mempool_free(sp, qpair->srb_mempool); 224 QLA_QPAIR_MARK_NOT_BUSY(qpair); 225 } 226 227 static inline srb_t * 228 qla2x00_get_sp(scsi_qla_host_t *vha, fc_port_t *fcport, gfp_t flag) 229 { 230 srb_t *sp = NULL; 231 struct qla_qpair *qpair; 232 233 if (unlikely(qla_vha_mark_busy(vha))) 234 return NULL; 235 236 qpair = vha->hw->base_qpair; 237 sp = qla2xxx_get_qpair_sp(vha, qpair, fcport, flag); 238 if (!sp) 239 goto done; 240 241 sp->vha = vha; 242 done: 243 if (!sp) 244 QLA_VHA_MARK_NOT_BUSY(vha); 245 return sp; 246 } 247 248 static inline void 249 qla2x00_rel_sp(srb_t *sp) 250 { 251 QLA_VHA_MARK_NOT_BUSY(sp->vha); 252 qla2xxx_rel_qpair_sp(sp->qpair, sp); 253 } 254 255 static inline int 256 qla2x00_gid_list_size(struct qla_hw_data *ha) 257 { 258 if (IS_QLAFX00(ha)) 259 return sizeof(uint32_t) * 32; 260 else 261 return sizeof(struct gid_list_info) * ha->max_fibre_devices; 262 } 263 264 static inline void 265 qla2x00_handle_mbx_completion(struct qla_hw_data *ha, int status) 266 { 267 if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && 268 (status & MBX_INTERRUPT) && ha->flags.mbox_int) { 269 set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 270 clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); 271 complete(&ha->mbx_intr_comp); 272 } 273 } 274 275 static inline void 276 qla2x00_set_retry_delay_timestamp(fc_port_t *fcport, uint16_t sts_qual) 277 { 278 u8 scope; 279 u16 qual; 280 #define SQ_SCOPE_MASK 0xc000 /* SAM-6 rev5 5.3.2 */ 281 #define SQ_SCOPE_SHIFT 14 282 #define SQ_QUAL_MASK 0x3fff 283 284 #define SQ_MAX_WAIT_SEC 60 /* Max I/O hold off time in seconds. */ 285 #define SQ_MAX_WAIT_TIME (SQ_MAX_WAIT_SEC * 10) /* in 100ms. */ 286 287 if (!sts_qual) /* Common case. */ 288 return; 289 290 scope = (sts_qual & SQ_SCOPE_MASK) >> SQ_SCOPE_SHIFT; 291 /* Handle only scope 1 or 2, which is for I-T nexus. */ 292 if (scope != 1 && scope != 2) 293 return; 294 295 /* Skip processing, if retry delay timer is already in effect. */ 296 if (fcport->retry_delay_timestamp && 297 time_before(jiffies, fcport->retry_delay_timestamp)) 298 return; 299 300 qual = sts_qual & SQ_QUAL_MASK; 301 if (qual < 1 || qual > 0x3fef) 302 return; 303 qual = min(qual, (u16)SQ_MAX_WAIT_TIME); 304 305 /* qual is expressed in 100ms increments. */ 306 fcport->retry_delay_timestamp = jiffies + (qual * HZ / 10); 307 308 ql_log(ql_log_warn, fcport->vha, 0x5101, 309 "%8phC: I/O throttling requested (status qualifier = %04xh), holding off I/Os for %ums.\n", 310 fcport->port_name, sts_qual, qual * 100); 311 } 312 313 static inline bool 314 qla_is_exch_offld_enabled(struct scsi_qla_host *vha) 315 { 316 if (qla_ini_mode_enabled(vha) && 317 (vha->ql2xiniexchg > FW_DEF_EXCHANGES_CNT)) 318 return true; 319 else if (qla_tgt_mode_enabled(vha) && 320 (vha->ql2xexchoffld > FW_DEF_EXCHANGES_CNT)) 321 return true; 322 else if (qla_dual_mode_enabled(vha) && 323 ((vha->ql2xiniexchg + vha->ql2xexchoffld) > FW_DEF_EXCHANGES_CNT)) 324 return true; 325 else 326 return false; 327 } 328 329 static inline void 330 qla_cpu_update(struct qla_qpair *qpair, uint16_t cpuid) 331 { 332 qpair->cpuid = cpuid; 333 334 if (!list_empty(&qpair->hints_list)) { 335 struct qla_qpair_hint *h; 336 337 list_for_each_entry(h, &qpair->hints_list, hint_elem) 338 h->cpuid = qpair->cpuid; 339 } 340 } 341 342 static inline struct qla_qpair_hint * 343 qla_qpair_to_hint(struct qla_tgt *tgt, struct qla_qpair *qpair) 344 { 345 struct qla_qpair_hint *h; 346 u16 i; 347 348 for (i = 0; i < tgt->ha->max_qpairs + 1; i++) { 349 h = &tgt->qphints[i]; 350 if (h->qpair == qpair) 351 return h; 352 } 353 354 return NULL; 355 } 356 357 static inline void 358 qla_83xx_start_iocbs(struct qla_qpair *qpair) 359 { 360 struct req_que *req = qpair->req; 361 362 req->ring_index++; 363 if (req->ring_index == req->length) { 364 req->ring_index = 0; 365 req->ring_ptr = req->ring; 366 } else 367 req->ring_ptr++; 368 369 wrt_reg_dword(req->req_q_in, req->ring_index); 370 } 371 372 static inline int 373 qla2xxx_get_fc4_priority(struct scsi_qla_host *vha) 374 { 375 uint32_t data; 376 377 data = 378 ((uint8_t *)vha->hw->nvram)[NVRAM_DUAL_FCP_NVME_FLAG_OFFSET]; 379 380 381 return (data >> 6) & BIT_0 ? FC4_PRIORITY_FCP : FC4_PRIORITY_NVME; 382 } 383 384 enum { 385 RESOURCE_NONE, 386 RESOURCE_IOCB = BIT_0, 387 RESOURCE_EXCH = BIT_1, /* exchange */ 388 RESOURCE_FORCE = BIT_2, 389 }; 390 391 static inline int 392 qla_get_fw_resources(struct qla_qpair *qp, struct iocb_resource *iores) 393 { 394 u16 iocbs_used, i; 395 u16 exch_used; 396 struct qla_hw_data *ha = qp->vha->hw; 397 398 if (!ql2xenforce_iocb_limit) { 399 iores->res_type = RESOURCE_NONE; 400 return 0; 401 } 402 if (iores->res_type & RESOURCE_FORCE) 403 goto force; 404 405 if ((iores->iocb_cnt + qp->fwres.iocbs_used) >= qp->fwres.iocbs_qp_limit) { 406 /* no need to acquire qpair lock. It's just rough calculation */ 407 iocbs_used = ha->base_qpair->fwres.iocbs_used; 408 for (i = 0; i < ha->max_qpairs; i++) { 409 if (ha->queue_pair_map[i]) 410 iocbs_used += ha->queue_pair_map[i]->fwres.iocbs_used; 411 } 412 413 if ((iores->iocb_cnt + iocbs_used) >= qp->fwres.iocbs_limit) { 414 iores->res_type = RESOURCE_NONE; 415 return -ENOSPC; 416 } 417 } 418 419 if (iores->res_type & RESOURCE_EXCH) { 420 exch_used = ha->base_qpair->fwres.exch_used; 421 for (i = 0; i < ha->max_qpairs; i++) { 422 if (ha->queue_pair_map[i]) 423 exch_used += ha->queue_pair_map[i]->fwres.exch_used; 424 } 425 426 if ((exch_used + iores->exch_cnt) >= qp->fwres.exch_limit) { 427 iores->res_type = RESOURCE_NONE; 428 return -ENOSPC; 429 } 430 } 431 force: 432 qp->fwres.iocbs_used += iores->iocb_cnt; 433 qp->fwres.exch_used += iores->exch_cnt; 434 return 0; 435 } 436 437 static inline void 438 qla_put_fw_resources(struct qla_qpair *qp, struct iocb_resource *iores) 439 { 440 if (iores->res_type & RESOURCE_IOCB) { 441 if (qp->fwres.iocbs_used >= iores->iocb_cnt) { 442 qp->fwres.iocbs_used -= iores->iocb_cnt; 443 } else { 444 /* should not happen */ 445 qp->fwres.iocbs_used = 0; 446 } 447 } 448 449 if (iores->res_type & RESOURCE_EXCH) { 450 if (qp->fwres.exch_used >= iores->exch_cnt) { 451 qp->fwres.exch_used -= iores->exch_cnt; 452 } else { 453 /* should not happen */ 454 qp->fwres.exch_used = 0; 455 } 456 } 457 iores->res_type = RESOURCE_NONE; 458 } 459 460 #define ISP_REG_DISCONNECT 0xffffffffU 461 /************************************************************************** 462 * qla2x00_isp_reg_stat 463 * 464 * Description: 465 * Read the host status register of ISP before aborting the command. 466 * 467 * Input: 468 * ha = pointer to host adapter structure. 469 * 470 * 471 * Returns: 472 * Either true or false. 473 * 474 * Note: Return true if there is register disconnect. 475 **************************************************************************/ 476 static inline 477 uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) 478 { 479 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; 480 struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82; 481 482 if (IS_P3P_TYPE(ha)) 483 return ((rd_reg_dword(®82->host_int)) == ISP_REG_DISCONNECT); 484 else 485 return ((rd_reg_dword(®->host_status)) == 486 ISP_REG_DISCONNECT); 487 } 488 489 static inline 490 bool qla_pci_disconnected(struct scsi_qla_host *vha, 491 struct device_reg_24xx __iomem *reg) 492 { 493 uint32_t stat; 494 bool ret = false; 495 496 stat = rd_reg_dword(®->host_status); 497 if (stat == 0xffffffff) { 498 ql_log(ql_log_info, vha, 0x8041, 499 "detected PCI disconnect.\n"); 500 qla_schedule_eeh_work(vha); 501 ret = true; 502 } 503 return ret; 504 } 505 506 static inline bool 507 fcport_is_smaller(fc_port_t *fcport) 508 { 509 if (wwn_to_u64(fcport->port_name) < 510 wwn_to_u64(fcport->vha->port_name)) 511 return true; 512 else 513 return false; 514 } 515 516 static inline bool 517 fcport_is_bigger(fc_port_t *fcport) 518 { 519 return !fcport_is_smaller(fcport); 520 } 521 522 static inline struct qla_qpair * 523 qla_mapq_nvme_select_qpair(struct qla_hw_data *ha, struct qla_qpair *qpair) 524 { 525 int cpuid = smp_processor_id(); 526 527 if (qpair->cpuid != cpuid && 528 ha->qp_cpu_map[cpuid]) { 529 qpair = ha->qp_cpu_map[cpuid]; 530 } 531 return qpair; 532 } 533 534 static inline void 535 qla_mapq_init_qp_cpu_map(struct qla_hw_data *ha, 536 struct qla_msix_entry *msix, 537 struct qla_qpair *qpair) 538 { 539 const struct cpumask *mask; 540 unsigned int cpu; 541 542 if (!ha->qp_cpu_map) 543 return; 544 mask = pci_irq_get_affinity(ha->pdev, msix->vector_base0); 545 if (!mask) 546 return; 547 qpair->cpuid = cpumask_first(mask); 548 for_each_cpu(cpu, mask) { 549 ha->qp_cpu_map[cpu] = qpair; 550 } 551 msix->cpuid = qpair->cpuid; 552 qpair->cpu_mapped = true; 553 } 554 555 static inline void 556 qla_mapq_free_qp_cpu_map(struct qla_hw_data *ha) 557 { 558 if (ha->qp_cpu_map) { 559 kfree(ha->qp_cpu_map); 560 ha->qp_cpu_map = NULL; 561 } 562 } 563 564 static inline int qla_mapq_alloc_qp_cpu_map(struct qla_hw_data *ha) 565 { 566 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); 567 568 if (!ha->qp_cpu_map) { 569 ha->qp_cpu_map = kcalloc(NR_CPUS, sizeof(struct qla_qpair *), 570 GFP_KERNEL); 571 if (!ha->qp_cpu_map) { 572 ql_log(ql_log_fatal, vha, 0x0180, 573 "Unable to allocate memory for qp_cpu_map ptrs.\n"); 574 return -1; 575 } 576 } 577 return 0; 578 } 579