1 /* 2 * QLogic Fibre Channel HBA Driver 3 * Copyright (c) 2003-2013 QLogic Corporation 4 * 5 * See LICENSE.qla2xxx for copyright and licensing details. 6 */ 7 #include "qla_def.h" 8 #include "qla_target.h" 9 10 #include <linux/blkdev.h> 11 #include <linux/delay.h> 12 13 #include <scsi/scsi_tcq.h> 14 15 static void qla25xx_set_que(srb_t *, struct rsp_que **); 16 /** 17 * qla2x00_get_cmd_direction() - Determine control_flag data direction. 18 * @cmd: SCSI command 19 * 20 * Returns the proper CF_* direction based on CDB. 21 */ 22 static inline uint16_t 23 qla2x00_get_cmd_direction(srb_t *sp) 24 { 25 uint16_t cflags; 26 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 27 struct scsi_qla_host *vha = sp->fcport->vha; 28 29 cflags = 0; 30 31 /* Set transfer direction */ 32 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 33 cflags = CF_WRITE; 34 vha->qla_stats.output_bytes += scsi_bufflen(cmd); 35 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 36 cflags = CF_READ; 37 vha->qla_stats.input_bytes += scsi_bufflen(cmd); 38 } 39 return (cflags); 40 } 41 42 /** 43 * qla2x00_calc_iocbs_32() - Determine number of Command Type 2 and 44 * Continuation Type 0 IOCBs to allocate. 45 * 46 * @dsds: number of data segment decriptors needed 47 * 48 * Returns the number of IOCB entries needed to store @dsds. 49 */ 50 uint16_t 51 qla2x00_calc_iocbs_32(uint16_t dsds) 52 { 53 uint16_t iocbs; 54 55 iocbs = 1; 56 if (dsds > 3) { 57 iocbs += (dsds - 3) / 7; 58 if ((dsds - 3) % 7) 59 iocbs++; 60 } 61 return (iocbs); 62 } 63 64 /** 65 * qla2x00_calc_iocbs_64() - Determine number of Command Type 3 and 66 * Continuation Type 1 IOCBs to allocate. 67 * 68 * @dsds: number of data segment decriptors needed 69 * 70 * Returns the number of IOCB entries needed to store @dsds. 71 */ 72 uint16_t 73 qla2x00_calc_iocbs_64(uint16_t dsds) 74 { 75 uint16_t iocbs; 76 77 iocbs = 1; 78 if (dsds > 2) { 79 iocbs += (dsds - 2) / 5; 80 if ((dsds - 2) % 5) 81 iocbs++; 82 } 83 return (iocbs); 84 } 85 86 /** 87 * qla2x00_prep_cont_type0_iocb() - Initialize a Continuation Type 0 IOCB. 88 * @ha: HA context 89 * 90 * Returns a pointer to the Continuation Type 0 IOCB packet. 91 */ 92 static inline cont_entry_t * 93 qla2x00_prep_cont_type0_iocb(struct scsi_qla_host *vha) 94 { 95 cont_entry_t *cont_pkt; 96 struct req_que *req = vha->req; 97 /* Adjust ring index. */ 98 req->ring_index++; 99 if (req->ring_index == req->length) { 100 req->ring_index = 0; 101 req->ring_ptr = req->ring; 102 } else { 103 req->ring_ptr++; 104 } 105 106 cont_pkt = (cont_entry_t *)req->ring_ptr; 107 108 /* Load packet defaults. */ 109 *((uint32_t *)(&cont_pkt->entry_type)) = 110 __constant_cpu_to_le32(CONTINUE_TYPE); 111 112 return (cont_pkt); 113 } 114 115 /** 116 * qla2x00_prep_cont_type1_iocb() - Initialize a Continuation Type 1 IOCB. 117 * @ha: HA context 118 * 119 * Returns a pointer to the continuation type 1 IOCB packet. 120 */ 121 static inline cont_a64_entry_t * 122 qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha, struct req_que *req) 123 { 124 cont_a64_entry_t *cont_pkt; 125 126 /* Adjust ring index. */ 127 req->ring_index++; 128 if (req->ring_index == req->length) { 129 req->ring_index = 0; 130 req->ring_ptr = req->ring; 131 } else { 132 req->ring_ptr++; 133 } 134 135 cont_pkt = (cont_a64_entry_t *)req->ring_ptr; 136 137 /* Load packet defaults. */ 138 *((uint32_t *)(&cont_pkt->entry_type)) = IS_QLAFX00(vha->hw) ? 139 __constant_cpu_to_le32(CONTINUE_A64_TYPE_FX00) : 140 __constant_cpu_to_le32(CONTINUE_A64_TYPE); 141 142 return (cont_pkt); 143 } 144 145 static inline int 146 qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) 147 { 148 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 149 uint8_t guard = scsi_host_get_guard(cmd->device->host); 150 151 /* We always use DIFF Bundling for best performance */ 152 *fw_prot_opts = 0; 153 154 /* Translate SCSI opcode to a protection opcode */ 155 switch (scsi_get_prot_op(cmd)) { 156 case SCSI_PROT_READ_STRIP: 157 *fw_prot_opts |= PO_MODE_DIF_REMOVE; 158 break; 159 case SCSI_PROT_WRITE_INSERT: 160 *fw_prot_opts |= PO_MODE_DIF_INSERT; 161 break; 162 case SCSI_PROT_READ_INSERT: 163 *fw_prot_opts |= PO_MODE_DIF_INSERT; 164 break; 165 case SCSI_PROT_WRITE_STRIP: 166 *fw_prot_opts |= PO_MODE_DIF_REMOVE; 167 break; 168 case SCSI_PROT_READ_PASS: 169 case SCSI_PROT_WRITE_PASS: 170 if (guard & SHOST_DIX_GUARD_IP) 171 *fw_prot_opts |= PO_MODE_DIF_TCP_CKSUM; 172 else 173 *fw_prot_opts |= PO_MODE_DIF_PASS; 174 break; 175 default: /* Normal Request */ 176 *fw_prot_opts |= PO_MODE_DIF_PASS; 177 break; 178 } 179 180 return scsi_prot_sg_count(cmd); 181 } 182 183 /* 184 * qla2x00_build_scsi_iocbs_32() - Build IOCB command utilizing 32bit 185 * capable IOCB types. 186 * 187 * @sp: SRB command to process 188 * @cmd_pkt: Command type 2 IOCB 189 * @tot_dsds: Total number of segments to transfer 190 */ 191 void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt, 192 uint16_t tot_dsds) 193 { 194 uint16_t avail_dsds; 195 uint32_t *cur_dsd; 196 scsi_qla_host_t *vha; 197 struct scsi_cmnd *cmd; 198 struct scatterlist *sg; 199 int i; 200 201 cmd = GET_CMD_SP(sp); 202 203 /* Update entry type to indicate Command Type 2 IOCB */ 204 *((uint32_t *)(&cmd_pkt->entry_type)) = 205 __constant_cpu_to_le32(COMMAND_TYPE); 206 207 /* No data transfer */ 208 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 209 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 210 return; 211 } 212 213 vha = sp->fcport->vha; 214 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); 215 216 /* Three DSDs are available in the Command Type 2 IOCB */ 217 avail_dsds = 3; 218 cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; 219 220 /* Load data segments */ 221 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 222 cont_entry_t *cont_pkt; 223 224 /* Allocate additional continuation packets? */ 225 if (avail_dsds == 0) { 226 /* 227 * Seven DSDs are available in the Continuation 228 * Type 0 IOCB. 229 */ 230 cont_pkt = qla2x00_prep_cont_type0_iocb(vha); 231 cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; 232 avail_dsds = 7; 233 } 234 235 *cur_dsd++ = cpu_to_le32(sg_dma_address(sg)); 236 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 237 avail_dsds--; 238 } 239 } 240 241 /** 242 * qla2x00_build_scsi_iocbs_64() - Build IOCB command utilizing 64bit 243 * capable IOCB types. 244 * 245 * @sp: SRB command to process 246 * @cmd_pkt: Command type 3 IOCB 247 * @tot_dsds: Total number of segments to transfer 248 */ 249 void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt, 250 uint16_t tot_dsds) 251 { 252 uint16_t avail_dsds; 253 uint32_t *cur_dsd; 254 scsi_qla_host_t *vha; 255 struct scsi_cmnd *cmd; 256 struct scatterlist *sg; 257 int i; 258 259 cmd = GET_CMD_SP(sp); 260 261 /* Update entry type to indicate Command Type 3 IOCB */ 262 *((uint32_t *)(&cmd_pkt->entry_type)) = 263 __constant_cpu_to_le32(COMMAND_A64_TYPE); 264 265 /* No data transfer */ 266 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 267 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 268 return; 269 } 270 271 vha = sp->fcport->vha; 272 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); 273 274 /* Two DSDs are available in the Command Type 3 IOCB */ 275 avail_dsds = 2; 276 cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; 277 278 /* Load data segments */ 279 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 280 dma_addr_t sle_dma; 281 cont_a64_entry_t *cont_pkt; 282 283 /* Allocate additional continuation packets? */ 284 if (avail_dsds == 0) { 285 /* 286 * Five DSDs are available in the Continuation 287 * Type 1 IOCB. 288 */ 289 cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req); 290 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; 291 avail_dsds = 5; 292 } 293 294 sle_dma = sg_dma_address(sg); 295 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 296 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 297 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 298 avail_dsds--; 299 } 300 } 301 302 /** 303 * qla2x00_start_scsi() - Send a SCSI command to the ISP 304 * @sp: command to send to the ISP 305 * 306 * Returns non-zero if a failure occurred, else zero. 307 */ 308 int 309 qla2x00_start_scsi(srb_t *sp) 310 { 311 int ret, nseg; 312 unsigned long flags; 313 scsi_qla_host_t *vha; 314 struct scsi_cmnd *cmd; 315 uint32_t *clr_ptr; 316 uint32_t index; 317 uint32_t handle; 318 cmd_entry_t *cmd_pkt; 319 uint16_t cnt; 320 uint16_t req_cnt; 321 uint16_t tot_dsds; 322 struct device_reg_2xxx __iomem *reg; 323 struct qla_hw_data *ha; 324 struct req_que *req; 325 struct rsp_que *rsp; 326 char tag[2]; 327 328 /* Setup device pointers. */ 329 ret = 0; 330 vha = sp->fcport->vha; 331 ha = vha->hw; 332 reg = &ha->iobase->isp; 333 cmd = GET_CMD_SP(sp); 334 req = ha->req_q_map[0]; 335 rsp = ha->rsp_q_map[0]; 336 /* So we know we haven't pci_map'ed anything yet */ 337 tot_dsds = 0; 338 339 /* Send marker if required */ 340 if (vha->marker_needed != 0) { 341 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != 342 QLA_SUCCESS) { 343 return (QLA_FUNCTION_FAILED); 344 } 345 vha->marker_needed = 0; 346 } 347 348 /* Acquire ring specific lock */ 349 spin_lock_irqsave(&ha->hardware_lock, flags); 350 351 /* Check for room in outstanding command list. */ 352 handle = req->current_outstanding_cmd; 353 for (index = 1; index < req->num_outstanding_cmds; index++) { 354 handle++; 355 if (handle == req->num_outstanding_cmds) 356 handle = 1; 357 if (!req->outstanding_cmds[handle]) 358 break; 359 } 360 if (index == req->num_outstanding_cmds) 361 goto queuing_error; 362 363 /* Map the sg table so we have an accurate count of sg entries needed */ 364 if (scsi_sg_count(cmd)) { 365 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 366 scsi_sg_count(cmd), cmd->sc_data_direction); 367 if (unlikely(!nseg)) 368 goto queuing_error; 369 } else 370 nseg = 0; 371 372 tot_dsds = nseg; 373 374 /* Calculate the number of request entries needed. */ 375 req_cnt = ha->isp_ops->calc_req_entries(tot_dsds); 376 if (req->cnt < (req_cnt + 2)) { 377 cnt = RD_REG_WORD_RELAXED(ISP_REQ_Q_OUT(ha, reg)); 378 if (req->ring_index < cnt) 379 req->cnt = cnt - req->ring_index; 380 else 381 req->cnt = req->length - 382 (req->ring_index - cnt); 383 /* If still no head room then bail out */ 384 if (req->cnt < (req_cnt + 2)) 385 goto queuing_error; 386 } 387 388 /* Build command packet */ 389 req->current_outstanding_cmd = handle; 390 req->outstanding_cmds[handle] = sp; 391 sp->handle = handle; 392 cmd->host_scribble = (unsigned char *)(unsigned long)handle; 393 req->cnt -= req_cnt; 394 395 cmd_pkt = (cmd_entry_t *)req->ring_ptr; 396 cmd_pkt->handle = handle; 397 /* Zero out remaining portion of packet. */ 398 clr_ptr = (uint32_t *)cmd_pkt + 2; 399 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 400 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 401 402 /* Set target ID and LUN number*/ 403 SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id); 404 cmd_pkt->lun = cpu_to_le16(cmd->device->lun); 405 406 /* Update tagged queuing modifier */ 407 if (scsi_populate_tag_msg(cmd, tag)) { 408 switch (tag[0]) { 409 case HEAD_OF_QUEUE_TAG: 410 cmd_pkt->control_flags = 411 __constant_cpu_to_le16(CF_HEAD_TAG); 412 break; 413 case ORDERED_QUEUE_TAG: 414 cmd_pkt->control_flags = 415 __constant_cpu_to_le16(CF_ORDERED_TAG); 416 break; 417 default: 418 cmd_pkt->control_flags = 419 __constant_cpu_to_le16(CF_SIMPLE_TAG); 420 break; 421 } 422 } 423 424 /* Load SCSI command packet. */ 425 memcpy(cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len); 426 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 427 428 /* Build IOCB segments */ 429 ha->isp_ops->build_iocbs(sp, cmd_pkt, tot_dsds); 430 431 /* Set total data segment count. */ 432 cmd_pkt->entry_count = (uint8_t)req_cnt; 433 wmb(); 434 435 /* Adjust ring index. */ 436 req->ring_index++; 437 if (req->ring_index == req->length) { 438 req->ring_index = 0; 439 req->ring_ptr = req->ring; 440 } else 441 req->ring_ptr++; 442 443 sp->flags |= SRB_DMA_VALID; 444 445 /* Set chip new ring index. */ 446 WRT_REG_WORD(ISP_REQ_Q_IN(ha, reg), req->ring_index); 447 RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, reg)); /* PCI Posting. */ 448 449 /* Manage unprocessed RIO/ZIO commands in response queue. */ 450 if (vha->flags.process_response_queue && 451 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 452 qla2x00_process_response_queue(rsp); 453 454 spin_unlock_irqrestore(&ha->hardware_lock, flags); 455 return (QLA_SUCCESS); 456 457 queuing_error: 458 if (tot_dsds) 459 scsi_dma_unmap(cmd); 460 461 spin_unlock_irqrestore(&ha->hardware_lock, flags); 462 463 return (QLA_FUNCTION_FAILED); 464 } 465 466 /** 467 * qla2x00_start_iocbs() - Execute the IOCB command 468 */ 469 void 470 qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req) 471 { 472 struct qla_hw_data *ha = vha->hw; 473 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); 474 475 if (IS_QLA82XX(ha)) { 476 qla82xx_start_iocbs(vha); 477 } else { 478 /* Adjust ring index. */ 479 req->ring_index++; 480 if (req->ring_index == req->length) { 481 req->ring_index = 0; 482 req->ring_ptr = req->ring; 483 } else 484 req->ring_ptr++; 485 486 /* Set chip new ring index. */ 487 if (ha->mqenable || IS_QLA83XX(ha)) { 488 WRT_REG_DWORD(req->req_q_in, req->ring_index); 489 RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); 490 } else if (IS_QLAFX00(ha)) { 491 WRT_REG_DWORD(®->ispfx00.req_q_in, req->ring_index); 492 RD_REG_DWORD_RELAXED(®->ispfx00.req_q_in); 493 QLAFX00_SET_HST_INTR(ha, ha->rqstq_intr_code); 494 } else if (IS_FWI2_CAPABLE(ha)) { 495 WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index); 496 RD_REG_DWORD_RELAXED(®->isp24.req_q_in); 497 } else { 498 WRT_REG_WORD(ISP_REQ_Q_IN(ha, ®->isp), 499 req->ring_index); 500 RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, ®->isp)); 501 } 502 } 503 } 504 505 /** 506 * qla2x00_marker() - Send a marker IOCB to the firmware. 507 * @ha: HA context 508 * @loop_id: loop ID 509 * @lun: LUN 510 * @type: marker modifier 511 * 512 * Can be called from both normal and interrupt context. 513 * 514 * Returns non-zero if a failure occurred, else zero. 515 */ 516 static int 517 __qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, 518 struct rsp_que *rsp, uint16_t loop_id, 519 uint16_t lun, uint8_t type) 520 { 521 mrk_entry_t *mrk; 522 struct mrk_entry_24xx *mrk24 = NULL; 523 struct mrk_entry_fx00 *mrkfx = NULL; 524 525 struct qla_hw_data *ha = vha->hw; 526 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); 527 528 req = ha->req_q_map[0]; 529 mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, NULL); 530 if (mrk == NULL) { 531 ql_log(ql_log_warn, base_vha, 0x3026, 532 "Failed to allocate Marker IOCB.\n"); 533 534 return (QLA_FUNCTION_FAILED); 535 } 536 537 mrk->entry_type = MARKER_TYPE; 538 mrk->modifier = type; 539 if (type != MK_SYNC_ALL) { 540 if (IS_QLAFX00(ha)) { 541 mrkfx = (struct mrk_entry_fx00 *) mrk; 542 mrkfx->handle = MAKE_HANDLE(req->id, mrkfx->handle); 543 mrkfx->handle_hi = 0; 544 mrkfx->tgt_id = cpu_to_le16(loop_id); 545 mrkfx->lun[1] = LSB(lun); 546 mrkfx->lun[2] = MSB(lun); 547 host_to_fcp_swap(mrkfx->lun, sizeof(mrkfx->lun)); 548 } else if (IS_FWI2_CAPABLE(ha)) { 549 mrk24 = (struct mrk_entry_24xx *) mrk; 550 mrk24->nport_handle = cpu_to_le16(loop_id); 551 mrk24->lun[1] = LSB(lun); 552 mrk24->lun[2] = MSB(lun); 553 host_to_fcp_swap(mrk24->lun, sizeof(mrk24->lun)); 554 mrk24->vp_index = vha->vp_idx; 555 mrk24->handle = MAKE_HANDLE(req->id, mrk24->handle); 556 } else { 557 SET_TARGET_ID(ha, mrk->target, loop_id); 558 mrk->lun = cpu_to_le16(lun); 559 } 560 } 561 wmb(); 562 563 qla2x00_start_iocbs(vha, req); 564 565 return (QLA_SUCCESS); 566 } 567 568 int 569 qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, 570 struct rsp_que *rsp, uint16_t loop_id, uint16_t lun, 571 uint8_t type) 572 { 573 int ret; 574 unsigned long flags = 0; 575 576 spin_lock_irqsave(&vha->hw->hardware_lock, flags); 577 ret = __qla2x00_marker(vha, req, rsp, loop_id, lun, type); 578 spin_unlock_irqrestore(&vha->hw->hardware_lock, flags); 579 580 return (ret); 581 } 582 583 /* 584 * qla2x00_issue_marker 585 * 586 * Issue marker 587 * Caller CAN have hardware lock held as specified by ha_locked parameter. 588 * Might release it, then reaquire. 589 */ 590 int qla2x00_issue_marker(scsi_qla_host_t *vha, int ha_locked) 591 { 592 if (ha_locked) { 593 if (__qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0, 594 MK_SYNC_ALL) != QLA_SUCCESS) 595 return QLA_FUNCTION_FAILED; 596 } else { 597 if (qla2x00_marker(vha, vha->req, vha->req->rsp, 0, 0, 598 MK_SYNC_ALL) != QLA_SUCCESS) 599 return QLA_FUNCTION_FAILED; 600 } 601 vha->marker_needed = 0; 602 603 return QLA_SUCCESS; 604 } 605 606 static inline int 607 qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt, 608 uint16_t tot_dsds) 609 { 610 uint32_t *cur_dsd = NULL; 611 scsi_qla_host_t *vha; 612 struct qla_hw_data *ha; 613 struct scsi_cmnd *cmd; 614 struct scatterlist *cur_seg; 615 uint32_t *dsd_seg; 616 void *next_dsd; 617 uint8_t avail_dsds; 618 uint8_t first_iocb = 1; 619 uint32_t dsd_list_len; 620 struct dsd_dma *dsd_ptr; 621 struct ct6_dsd *ctx; 622 623 cmd = GET_CMD_SP(sp); 624 625 /* Update entry type to indicate Command Type 3 IOCB */ 626 *((uint32_t *)(&cmd_pkt->entry_type)) = 627 __constant_cpu_to_le32(COMMAND_TYPE_6); 628 629 /* No data transfer */ 630 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 631 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 632 return 0; 633 } 634 635 vha = sp->fcport->vha; 636 ha = vha->hw; 637 638 /* Set transfer direction */ 639 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 640 cmd_pkt->control_flags = 641 __constant_cpu_to_le16(CF_WRITE_DATA); 642 vha->qla_stats.output_bytes += scsi_bufflen(cmd); 643 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 644 cmd_pkt->control_flags = 645 __constant_cpu_to_le16(CF_READ_DATA); 646 vha->qla_stats.input_bytes += scsi_bufflen(cmd); 647 } 648 649 cur_seg = scsi_sglist(cmd); 650 ctx = GET_CMD_CTX_SP(sp); 651 652 while (tot_dsds) { 653 avail_dsds = (tot_dsds > QLA_DSDS_PER_IOCB) ? 654 QLA_DSDS_PER_IOCB : tot_dsds; 655 tot_dsds -= avail_dsds; 656 dsd_list_len = (avail_dsds + 1) * QLA_DSD_SIZE; 657 658 dsd_ptr = list_first_entry(&ha->gbl_dsd_list, 659 struct dsd_dma, list); 660 next_dsd = dsd_ptr->dsd_addr; 661 list_del(&dsd_ptr->list); 662 ha->gbl_dsd_avail--; 663 list_add_tail(&dsd_ptr->list, &ctx->dsd_list); 664 ctx->dsd_use_cnt++; 665 ha->gbl_dsd_inuse++; 666 667 if (first_iocb) { 668 first_iocb = 0; 669 dsd_seg = (uint32_t *)&cmd_pkt->fcp_data_dseg_address; 670 *dsd_seg++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); 671 *dsd_seg++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); 672 cmd_pkt->fcp_data_dseg_len = cpu_to_le32(dsd_list_len); 673 } else { 674 *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); 675 *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); 676 *cur_dsd++ = cpu_to_le32(dsd_list_len); 677 } 678 cur_dsd = (uint32_t *)next_dsd; 679 while (avail_dsds) { 680 dma_addr_t sle_dma; 681 682 sle_dma = sg_dma_address(cur_seg); 683 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 684 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 685 *cur_dsd++ = cpu_to_le32(sg_dma_len(cur_seg)); 686 cur_seg = sg_next(cur_seg); 687 avail_dsds--; 688 } 689 } 690 691 /* Null termination */ 692 *cur_dsd++ = 0; 693 *cur_dsd++ = 0; 694 *cur_dsd++ = 0; 695 cmd_pkt->control_flags |= CF_DATA_SEG_DESCR_ENABLE; 696 return 0; 697 } 698 699 /* 700 * qla24xx_calc_dsd_lists() - Determine number of DSD list required 701 * for Command Type 6. 702 * 703 * @dsds: number of data segment decriptors needed 704 * 705 * Returns the number of dsd list needed to store @dsds. 706 */ 707 inline uint16_t 708 qla24xx_calc_dsd_lists(uint16_t dsds) 709 { 710 uint16_t dsd_lists = 0; 711 712 dsd_lists = (dsds/QLA_DSDS_PER_IOCB); 713 if (dsds % QLA_DSDS_PER_IOCB) 714 dsd_lists++; 715 return dsd_lists; 716 } 717 718 719 /** 720 * qla24xx_build_scsi_iocbs() - Build IOCB command utilizing Command Type 7 721 * IOCB types. 722 * 723 * @sp: SRB command to process 724 * @cmd_pkt: Command type 3 IOCB 725 * @tot_dsds: Total number of segments to transfer 726 */ 727 inline void 728 qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt, 729 uint16_t tot_dsds) 730 { 731 uint16_t avail_dsds; 732 uint32_t *cur_dsd; 733 scsi_qla_host_t *vha; 734 struct scsi_cmnd *cmd; 735 struct scatterlist *sg; 736 int i; 737 struct req_que *req; 738 739 cmd = GET_CMD_SP(sp); 740 741 /* Update entry type to indicate Command Type 3 IOCB */ 742 *((uint32_t *)(&cmd_pkt->entry_type)) = 743 __constant_cpu_to_le32(COMMAND_TYPE_7); 744 745 /* No data transfer */ 746 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 747 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 748 return; 749 } 750 751 vha = sp->fcport->vha; 752 req = vha->req; 753 754 /* Set transfer direction */ 755 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 756 cmd_pkt->task_mgmt_flags = 757 __constant_cpu_to_le16(TMF_WRITE_DATA); 758 vha->qla_stats.output_bytes += scsi_bufflen(cmd); 759 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 760 cmd_pkt->task_mgmt_flags = 761 __constant_cpu_to_le16(TMF_READ_DATA); 762 vha->qla_stats.input_bytes += scsi_bufflen(cmd); 763 } 764 765 /* One DSD is available in the Command Type 3 IOCB */ 766 avail_dsds = 1; 767 cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; 768 769 /* Load data segments */ 770 771 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 772 dma_addr_t sle_dma; 773 cont_a64_entry_t *cont_pkt; 774 775 /* Allocate additional continuation packets? */ 776 if (avail_dsds == 0) { 777 /* 778 * Five DSDs are available in the Continuation 779 * Type 1 IOCB. 780 */ 781 cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req); 782 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; 783 avail_dsds = 5; 784 } 785 786 sle_dma = sg_dma_address(sg); 787 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 788 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 789 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 790 avail_dsds--; 791 } 792 } 793 794 struct fw_dif_context { 795 uint32_t ref_tag; 796 uint16_t app_tag; 797 uint8_t ref_tag_mask[4]; /* Validation/Replacement Mask*/ 798 uint8_t app_tag_mask[2]; /* Validation/Replacement Mask*/ 799 }; 800 801 /* 802 * qla24xx_set_t10dif_tags_from_cmd - Extract Ref and App tags from SCSI command 803 * 804 */ 805 static inline void 806 qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt, 807 unsigned int protcnt) 808 { 809 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 810 811 switch (scsi_get_prot_type(cmd)) { 812 case SCSI_PROT_DIF_TYPE0: 813 /* 814 * No check for ql2xenablehba_err_chk, as it would be an 815 * I/O error if hba tag generation is not done. 816 */ 817 pkt->ref_tag = cpu_to_le32((uint32_t) 818 (0xffffffff & scsi_get_lba(cmd))); 819 820 if (!qla2x00_hba_err_chk_enabled(sp)) 821 break; 822 823 pkt->ref_tag_mask[0] = 0xff; 824 pkt->ref_tag_mask[1] = 0xff; 825 pkt->ref_tag_mask[2] = 0xff; 826 pkt->ref_tag_mask[3] = 0xff; 827 break; 828 829 /* 830 * For TYPE 2 protection: 16 bit GUARD + 32 bit REF tag has to 831 * match LBA in CDB + N 832 */ 833 case SCSI_PROT_DIF_TYPE2: 834 pkt->app_tag = __constant_cpu_to_le16(0); 835 pkt->app_tag_mask[0] = 0x0; 836 pkt->app_tag_mask[1] = 0x0; 837 838 pkt->ref_tag = cpu_to_le32((uint32_t) 839 (0xffffffff & scsi_get_lba(cmd))); 840 841 if (!qla2x00_hba_err_chk_enabled(sp)) 842 break; 843 844 /* enable ALL bytes of the ref tag */ 845 pkt->ref_tag_mask[0] = 0xff; 846 pkt->ref_tag_mask[1] = 0xff; 847 pkt->ref_tag_mask[2] = 0xff; 848 pkt->ref_tag_mask[3] = 0xff; 849 break; 850 851 /* For Type 3 protection: 16 bit GUARD only */ 852 case SCSI_PROT_DIF_TYPE3: 853 pkt->ref_tag_mask[0] = pkt->ref_tag_mask[1] = 854 pkt->ref_tag_mask[2] = pkt->ref_tag_mask[3] = 855 0x00; 856 break; 857 858 /* 859 * For TYpe 1 protection: 16 bit GUARD tag, 32 bit REF tag, and 860 * 16 bit app tag. 861 */ 862 case SCSI_PROT_DIF_TYPE1: 863 pkt->ref_tag = cpu_to_le32((uint32_t) 864 (0xffffffff & scsi_get_lba(cmd))); 865 pkt->app_tag = __constant_cpu_to_le16(0); 866 pkt->app_tag_mask[0] = 0x0; 867 pkt->app_tag_mask[1] = 0x0; 868 869 if (!qla2x00_hba_err_chk_enabled(sp)) 870 break; 871 872 /* enable ALL bytes of the ref tag */ 873 pkt->ref_tag_mask[0] = 0xff; 874 pkt->ref_tag_mask[1] = 0xff; 875 pkt->ref_tag_mask[2] = 0xff; 876 pkt->ref_tag_mask[3] = 0xff; 877 break; 878 } 879 } 880 881 struct qla2_sgx { 882 dma_addr_t dma_addr; /* OUT */ 883 uint32_t dma_len; /* OUT */ 884 885 uint32_t tot_bytes; /* IN */ 886 struct scatterlist *cur_sg; /* IN */ 887 888 /* for book keeping, bzero on initial invocation */ 889 uint32_t bytes_consumed; 890 uint32_t num_bytes; 891 uint32_t tot_partial; 892 893 /* for debugging */ 894 uint32_t num_sg; 895 srb_t *sp; 896 }; 897 898 static int 899 qla24xx_get_one_block_sg(uint32_t blk_sz, struct qla2_sgx *sgx, 900 uint32_t *partial) 901 { 902 struct scatterlist *sg; 903 uint32_t cumulative_partial, sg_len; 904 dma_addr_t sg_dma_addr; 905 906 if (sgx->num_bytes == sgx->tot_bytes) 907 return 0; 908 909 sg = sgx->cur_sg; 910 cumulative_partial = sgx->tot_partial; 911 912 sg_dma_addr = sg_dma_address(sg); 913 sg_len = sg_dma_len(sg); 914 915 sgx->dma_addr = sg_dma_addr + sgx->bytes_consumed; 916 917 if ((cumulative_partial + (sg_len - sgx->bytes_consumed)) >= blk_sz) { 918 sgx->dma_len = (blk_sz - cumulative_partial); 919 sgx->tot_partial = 0; 920 sgx->num_bytes += blk_sz; 921 *partial = 0; 922 } else { 923 sgx->dma_len = sg_len - sgx->bytes_consumed; 924 sgx->tot_partial += sgx->dma_len; 925 *partial = 1; 926 } 927 928 sgx->bytes_consumed += sgx->dma_len; 929 930 if (sg_len == sgx->bytes_consumed) { 931 sg = sg_next(sg); 932 sgx->num_sg++; 933 sgx->cur_sg = sg; 934 sgx->bytes_consumed = 0; 935 } 936 937 return 1; 938 } 939 940 static int 941 qla24xx_walk_and_build_sglist_no_difb(struct qla_hw_data *ha, srb_t *sp, 942 uint32_t *dsd, uint16_t tot_dsds) 943 { 944 void *next_dsd; 945 uint8_t avail_dsds = 0; 946 uint32_t dsd_list_len; 947 struct dsd_dma *dsd_ptr; 948 struct scatterlist *sg_prot; 949 uint32_t *cur_dsd = dsd; 950 uint16_t used_dsds = tot_dsds; 951 952 uint32_t prot_int; 953 uint32_t partial; 954 struct qla2_sgx sgx; 955 dma_addr_t sle_dma; 956 uint32_t sle_dma_len, tot_prot_dma_len = 0; 957 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 958 959 prot_int = cmd->device->sector_size; 960 961 memset(&sgx, 0, sizeof(struct qla2_sgx)); 962 sgx.tot_bytes = scsi_bufflen(cmd); 963 sgx.cur_sg = scsi_sglist(cmd); 964 sgx.sp = sp; 965 966 sg_prot = scsi_prot_sglist(cmd); 967 968 while (qla24xx_get_one_block_sg(prot_int, &sgx, &partial)) { 969 970 sle_dma = sgx.dma_addr; 971 sle_dma_len = sgx.dma_len; 972 alloc_and_fill: 973 /* Allocate additional continuation packets? */ 974 if (avail_dsds == 0) { 975 avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? 976 QLA_DSDS_PER_IOCB : used_dsds; 977 dsd_list_len = (avail_dsds + 1) * 12; 978 used_dsds -= avail_dsds; 979 980 /* allocate tracking DS */ 981 dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); 982 if (!dsd_ptr) 983 return 1; 984 985 /* allocate new list */ 986 dsd_ptr->dsd_addr = next_dsd = 987 dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, 988 &dsd_ptr->dsd_list_dma); 989 990 if (!next_dsd) { 991 /* 992 * Need to cleanup only this dsd_ptr, rest 993 * will be done by sp_free_dma() 994 */ 995 kfree(dsd_ptr); 996 return 1; 997 } 998 999 list_add_tail(&dsd_ptr->list, 1000 &((struct crc_context *)sp->u.scmd.ctx)->dsd_list); 1001 1002 sp->flags |= SRB_CRC_CTX_DSD_VALID; 1003 1004 /* add new list to cmd iocb or last list */ 1005 *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); 1006 *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); 1007 *cur_dsd++ = dsd_list_len; 1008 cur_dsd = (uint32_t *)next_dsd; 1009 } 1010 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 1011 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 1012 *cur_dsd++ = cpu_to_le32(sle_dma_len); 1013 avail_dsds--; 1014 1015 if (partial == 0) { 1016 /* Got a full protection interval */ 1017 sle_dma = sg_dma_address(sg_prot) + tot_prot_dma_len; 1018 sle_dma_len = 8; 1019 1020 tot_prot_dma_len += sle_dma_len; 1021 if (tot_prot_dma_len == sg_dma_len(sg_prot)) { 1022 tot_prot_dma_len = 0; 1023 sg_prot = sg_next(sg_prot); 1024 } 1025 1026 partial = 1; /* So as to not re-enter this block */ 1027 goto alloc_and_fill; 1028 } 1029 } 1030 /* Null termination */ 1031 *cur_dsd++ = 0; 1032 *cur_dsd++ = 0; 1033 *cur_dsd++ = 0; 1034 return 0; 1035 } 1036 1037 static int 1038 qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd, 1039 uint16_t tot_dsds) 1040 { 1041 void *next_dsd; 1042 uint8_t avail_dsds = 0; 1043 uint32_t dsd_list_len; 1044 struct dsd_dma *dsd_ptr; 1045 struct scatterlist *sg; 1046 uint32_t *cur_dsd = dsd; 1047 int i; 1048 uint16_t used_dsds = tot_dsds; 1049 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 1050 1051 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 1052 dma_addr_t sle_dma; 1053 1054 /* Allocate additional continuation packets? */ 1055 if (avail_dsds == 0) { 1056 avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? 1057 QLA_DSDS_PER_IOCB : used_dsds; 1058 dsd_list_len = (avail_dsds + 1) * 12; 1059 used_dsds -= avail_dsds; 1060 1061 /* allocate tracking DS */ 1062 dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); 1063 if (!dsd_ptr) 1064 return 1; 1065 1066 /* allocate new list */ 1067 dsd_ptr->dsd_addr = next_dsd = 1068 dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, 1069 &dsd_ptr->dsd_list_dma); 1070 1071 if (!next_dsd) { 1072 /* 1073 * Need to cleanup only this dsd_ptr, rest 1074 * will be done by sp_free_dma() 1075 */ 1076 kfree(dsd_ptr); 1077 return 1; 1078 } 1079 1080 list_add_tail(&dsd_ptr->list, 1081 &((struct crc_context *)sp->u.scmd.ctx)->dsd_list); 1082 1083 sp->flags |= SRB_CRC_CTX_DSD_VALID; 1084 1085 /* add new list to cmd iocb or last list */ 1086 *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); 1087 *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); 1088 *cur_dsd++ = dsd_list_len; 1089 cur_dsd = (uint32_t *)next_dsd; 1090 } 1091 sle_dma = sg_dma_address(sg); 1092 1093 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 1094 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 1095 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 1096 avail_dsds--; 1097 1098 } 1099 /* Null termination */ 1100 *cur_dsd++ = 0; 1101 *cur_dsd++ = 0; 1102 *cur_dsd++ = 0; 1103 return 0; 1104 } 1105 1106 static int 1107 qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, 1108 uint32_t *dsd, 1109 uint16_t tot_dsds) 1110 { 1111 void *next_dsd; 1112 uint8_t avail_dsds = 0; 1113 uint32_t dsd_list_len; 1114 struct dsd_dma *dsd_ptr; 1115 struct scatterlist *sg; 1116 int i; 1117 struct scsi_cmnd *cmd; 1118 uint32_t *cur_dsd = dsd; 1119 uint16_t used_dsds = tot_dsds; 1120 1121 cmd = GET_CMD_SP(sp); 1122 scsi_for_each_prot_sg(cmd, sg, tot_dsds, i) { 1123 dma_addr_t sle_dma; 1124 1125 /* Allocate additional continuation packets? */ 1126 if (avail_dsds == 0) { 1127 avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? 1128 QLA_DSDS_PER_IOCB : used_dsds; 1129 dsd_list_len = (avail_dsds + 1) * 12; 1130 used_dsds -= avail_dsds; 1131 1132 /* allocate tracking DS */ 1133 dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); 1134 if (!dsd_ptr) 1135 return 1; 1136 1137 /* allocate new list */ 1138 dsd_ptr->dsd_addr = next_dsd = 1139 dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, 1140 &dsd_ptr->dsd_list_dma); 1141 1142 if (!next_dsd) { 1143 /* 1144 * Need to cleanup only this dsd_ptr, rest 1145 * will be done by sp_free_dma() 1146 */ 1147 kfree(dsd_ptr); 1148 return 1; 1149 } 1150 1151 list_add_tail(&dsd_ptr->list, 1152 &((struct crc_context *)sp->u.scmd.ctx)->dsd_list); 1153 1154 sp->flags |= SRB_CRC_CTX_DSD_VALID; 1155 1156 /* add new list to cmd iocb or last list */ 1157 *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); 1158 *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); 1159 *cur_dsd++ = dsd_list_len; 1160 cur_dsd = (uint32_t *)next_dsd; 1161 } 1162 sle_dma = sg_dma_address(sg); 1163 1164 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 1165 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 1166 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 1167 1168 avail_dsds--; 1169 } 1170 /* Null termination */ 1171 *cur_dsd++ = 0; 1172 *cur_dsd++ = 0; 1173 *cur_dsd++ = 0; 1174 return 0; 1175 } 1176 1177 /** 1178 * qla24xx_build_scsi_crc_2_iocbs() - Build IOCB command utilizing Command 1179 * Type 6 IOCB types. 1180 * 1181 * @sp: SRB command to process 1182 * @cmd_pkt: Command type 3 IOCB 1183 * @tot_dsds: Total number of segments to transfer 1184 */ 1185 static inline int 1186 qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, 1187 uint16_t tot_dsds, uint16_t tot_prot_dsds, uint16_t fw_prot_opts) 1188 { 1189 uint32_t *cur_dsd, *fcp_dl; 1190 scsi_qla_host_t *vha; 1191 struct scsi_cmnd *cmd; 1192 int sgc; 1193 uint32_t total_bytes = 0; 1194 uint32_t data_bytes; 1195 uint32_t dif_bytes; 1196 uint8_t bundling = 1; 1197 uint16_t blk_size; 1198 uint8_t *clr_ptr; 1199 struct crc_context *crc_ctx_pkt = NULL; 1200 struct qla_hw_data *ha; 1201 uint8_t additional_fcpcdb_len; 1202 uint16_t fcp_cmnd_len; 1203 struct fcp_cmnd *fcp_cmnd; 1204 dma_addr_t crc_ctx_dma; 1205 char tag[2]; 1206 1207 cmd = GET_CMD_SP(sp); 1208 1209 sgc = 0; 1210 /* Update entry type to indicate Command Type CRC_2 IOCB */ 1211 *((uint32_t *)(&cmd_pkt->entry_type)) = 1212 __constant_cpu_to_le32(COMMAND_TYPE_CRC_2); 1213 1214 vha = sp->fcport->vha; 1215 ha = vha->hw; 1216 1217 /* No data transfer */ 1218 data_bytes = scsi_bufflen(cmd); 1219 if (!data_bytes || cmd->sc_data_direction == DMA_NONE) { 1220 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 1221 return QLA_SUCCESS; 1222 } 1223 1224 cmd_pkt->vp_index = sp->fcport->vha->vp_idx; 1225 1226 /* Set transfer direction */ 1227 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 1228 cmd_pkt->control_flags = 1229 __constant_cpu_to_le16(CF_WRITE_DATA); 1230 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 1231 cmd_pkt->control_flags = 1232 __constant_cpu_to_le16(CF_READ_DATA); 1233 } 1234 1235 if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) || 1236 (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP) || 1237 (scsi_get_prot_op(cmd) == SCSI_PROT_READ_STRIP) || 1238 (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_INSERT)) 1239 bundling = 0; 1240 1241 /* Allocate CRC context from global pool */ 1242 crc_ctx_pkt = sp->u.scmd.ctx = 1243 dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, &crc_ctx_dma); 1244 1245 if (!crc_ctx_pkt) 1246 goto crc_queuing_error; 1247 1248 /* Zero out CTX area. */ 1249 clr_ptr = (uint8_t *)crc_ctx_pkt; 1250 memset(clr_ptr, 0, sizeof(*crc_ctx_pkt)); 1251 1252 crc_ctx_pkt->crc_ctx_dma = crc_ctx_dma; 1253 1254 sp->flags |= SRB_CRC_CTX_DMA_VALID; 1255 1256 /* Set handle */ 1257 crc_ctx_pkt->handle = cmd_pkt->handle; 1258 1259 INIT_LIST_HEAD(&crc_ctx_pkt->dsd_list); 1260 1261 qla24xx_set_t10dif_tags(sp, (struct fw_dif_context *) 1262 &crc_ctx_pkt->ref_tag, tot_prot_dsds); 1263 1264 cmd_pkt->crc_context_address[0] = cpu_to_le32(LSD(crc_ctx_dma)); 1265 cmd_pkt->crc_context_address[1] = cpu_to_le32(MSD(crc_ctx_dma)); 1266 cmd_pkt->crc_context_len = CRC_CONTEXT_LEN_FW; 1267 1268 /* Determine SCSI command length -- align to 4 byte boundary */ 1269 if (cmd->cmd_len > 16) { 1270 additional_fcpcdb_len = cmd->cmd_len - 16; 1271 if ((cmd->cmd_len % 4) != 0) { 1272 /* SCSI cmd > 16 bytes must be multiple of 4 */ 1273 goto crc_queuing_error; 1274 } 1275 fcp_cmnd_len = 12 + cmd->cmd_len + 4; 1276 } else { 1277 additional_fcpcdb_len = 0; 1278 fcp_cmnd_len = 12 + 16 + 4; 1279 } 1280 1281 fcp_cmnd = &crc_ctx_pkt->fcp_cmnd; 1282 1283 fcp_cmnd->additional_cdb_len = additional_fcpcdb_len; 1284 if (cmd->sc_data_direction == DMA_TO_DEVICE) 1285 fcp_cmnd->additional_cdb_len |= 1; 1286 else if (cmd->sc_data_direction == DMA_FROM_DEVICE) 1287 fcp_cmnd->additional_cdb_len |= 2; 1288 1289 int_to_scsilun(cmd->device->lun, &fcp_cmnd->lun); 1290 memcpy(fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); 1291 cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(fcp_cmnd_len); 1292 cmd_pkt->fcp_cmnd_dseg_address[0] = cpu_to_le32( 1293 LSD(crc_ctx_dma + CRC_CONTEXT_FCPCMND_OFF)); 1294 cmd_pkt->fcp_cmnd_dseg_address[1] = cpu_to_le32( 1295 MSD(crc_ctx_dma + CRC_CONTEXT_FCPCMND_OFF)); 1296 fcp_cmnd->task_management = 0; 1297 1298 /* 1299 * Update tagged queuing modifier if using command tag queuing 1300 */ 1301 if (scsi_populate_tag_msg(cmd, tag)) { 1302 switch (tag[0]) { 1303 case HEAD_OF_QUEUE_TAG: 1304 fcp_cmnd->task_attribute = TSK_HEAD_OF_QUEUE; 1305 break; 1306 case ORDERED_QUEUE_TAG: 1307 fcp_cmnd->task_attribute = TSK_ORDERED; 1308 break; 1309 default: 1310 fcp_cmnd->task_attribute = 0; 1311 break; 1312 } 1313 } else { 1314 fcp_cmnd->task_attribute = 0; 1315 } 1316 1317 cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */ 1318 1319 /* Compute dif len and adjust data len to incude protection */ 1320 dif_bytes = 0; 1321 blk_size = cmd->device->sector_size; 1322 dif_bytes = (data_bytes / blk_size) * 8; 1323 1324 switch (scsi_get_prot_op(GET_CMD_SP(sp))) { 1325 case SCSI_PROT_READ_INSERT: 1326 case SCSI_PROT_WRITE_STRIP: 1327 total_bytes = data_bytes; 1328 data_bytes += dif_bytes; 1329 break; 1330 1331 case SCSI_PROT_READ_STRIP: 1332 case SCSI_PROT_WRITE_INSERT: 1333 case SCSI_PROT_READ_PASS: 1334 case SCSI_PROT_WRITE_PASS: 1335 total_bytes = data_bytes + dif_bytes; 1336 break; 1337 default: 1338 BUG(); 1339 } 1340 1341 if (!qla2x00_hba_err_chk_enabled(sp)) 1342 fw_prot_opts |= 0x10; /* Disable Guard tag checking */ 1343 /* HBA error checking enabled */ 1344 else if (IS_PI_UNINIT_CAPABLE(ha)) { 1345 if ((scsi_get_prot_type(GET_CMD_SP(sp)) == SCSI_PROT_DIF_TYPE1) 1346 || (scsi_get_prot_type(GET_CMD_SP(sp)) == 1347 SCSI_PROT_DIF_TYPE2)) 1348 fw_prot_opts |= BIT_10; 1349 else if (scsi_get_prot_type(GET_CMD_SP(sp)) == 1350 SCSI_PROT_DIF_TYPE3) 1351 fw_prot_opts |= BIT_11; 1352 } 1353 1354 if (!bundling) { 1355 cur_dsd = (uint32_t *) &crc_ctx_pkt->u.nobundling.data_address; 1356 } else { 1357 /* 1358 * Configure Bundling if we need to fetch interlaving 1359 * protection PCI accesses 1360 */ 1361 fw_prot_opts |= PO_ENABLE_DIF_BUNDLING; 1362 crc_ctx_pkt->u.bundling.dif_byte_count = cpu_to_le32(dif_bytes); 1363 crc_ctx_pkt->u.bundling.dseg_count = cpu_to_le16(tot_dsds - 1364 tot_prot_dsds); 1365 cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.data_address; 1366 } 1367 1368 /* Finish the common fields of CRC pkt */ 1369 crc_ctx_pkt->blk_size = cpu_to_le16(blk_size); 1370 crc_ctx_pkt->prot_opts = cpu_to_le16(fw_prot_opts); 1371 crc_ctx_pkt->byte_count = cpu_to_le32(data_bytes); 1372 crc_ctx_pkt->guard_seed = __constant_cpu_to_le16(0); 1373 /* Fibre channel byte count */ 1374 cmd_pkt->byte_count = cpu_to_le32(total_bytes); 1375 fcp_dl = (uint32_t *)(crc_ctx_pkt->fcp_cmnd.cdb + 16 + 1376 additional_fcpcdb_len); 1377 *fcp_dl = htonl(total_bytes); 1378 1379 if (!data_bytes || cmd->sc_data_direction == DMA_NONE) { 1380 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 1381 return QLA_SUCCESS; 1382 } 1383 /* Walks data segments */ 1384 1385 cmd_pkt->control_flags |= 1386 __constant_cpu_to_le16(CF_DATA_SEG_DESCR_ENABLE); 1387 1388 if (!bundling && tot_prot_dsds) { 1389 if (qla24xx_walk_and_build_sglist_no_difb(ha, sp, 1390 cur_dsd, tot_dsds)) 1391 goto crc_queuing_error; 1392 } else if (qla24xx_walk_and_build_sglist(ha, sp, cur_dsd, 1393 (tot_dsds - tot_prot_dsds))) 1394 goto crc_queuing_error; 1395 1396 if (bundling && tot_prot_dsds) { 1397 /* Walks dif segments */ 1398 cmd_pkt->control_flags |= 1399 __constant_cpu_to_le16(CF_DIF_SEG_DESCR_ENABLE); 1400 cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.dif_address; 1401 if (qla24xx_walk_and_build_prot_sglist(ha, sp, cur_dsd, 1402 tot_prot_dsds)) 1403 goto crc_queuing_error; 1404 } 1405 return QLA_SUCCESS; 1406 1407 crc_queuing_error: 1408 /* Cleanup will be performed by the caller */ 1409 1410 return QLA_FUNCTION_FAILED; 1411 } 1412 1413 /** 1414 * qla24xx_start_scsi() - Send a SCSI command to the ISP 1415 * @sp: command to send to the ISP 1416 * 1417 * Returns non-zero if a failure occurred, else zero. 1418 */ 1419 int 1420 qla24xx_start_scsi(srb_t *sp) 1421 { 1422 int ret, nseg; 1423 unsigned long flags; 1424 uint32_t *clr_ptr; 1425 uint32_t index; 1426 uint32_t handle; 1427 struct cmd_type_7 *cmd_pkt; 1428 uint16_t cnt; 1429 uint16_t req_cnt; 1430 uint16_t tot_dsds; 1431 struct req_que *req = NULL; 1432 struct rsp_que *rsp = NULL; 1433 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 1434 struct scsi_qla_host *vha = sp->fcport->vha; 1435 struct qla_hw_data *ha = vha->hw; 1436 char tag[2]; 1437 1438 /* Setup device pointers. */ 1439 ret = 0; 1440 1441 qla25xx_set_que(sp, &rsp); 1442 req = vha->req; 1443 1444 /* So we know we haven't pci_map'ed anything yet */ 1445 tot_dsds = 0; 1446 1447 /* Send marker if required */ 1448 if (vha->marker_needed != 0) { 1449 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != 1450 QLA_SUCCESS) 1451 return QLA_FUNCTION_FAILED; 1452 vha->marker_needed = 0; 1453 } 1454 1455 /* Acquire ring specific lock */ 1456 spin_lock_irqsave(&ha->hardware_lock, flags); 1457 1458 /* Check for room in outstanding command list. */ 1459 handle = req->current_outstanding_cmd; 1460 for (index = 1; index < req->num_outstanding_cmds; index++) { 1461 handle++; 1462 if (handle == req->num_outstanding_cmds) 1463 handle = 1; 1464 if (!req->outstanding_cmds[handle]) 1465 break; 1466 } 1467 if (index == req->num_outstanding_cmds) 1468 goto queuing_error; 1469 1470 /* Map the sg table so we have an accurate count of sg entries needed */ 1471 if (scsi_sg_count(cmd)) { 1472 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 1473 scsi_sg_count(cmd), cmd->sc_data_direction); 1474 if (unlikely(!nseg)) 1475 goto queuing_error; 1476 } else 1477 nseg = 0; 1478 1479 tot_dsds = nseg; 1480 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); 1481 if (req->cnt < (req_cnt + 2)) { 1482 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 1483 1484 if (req->ring_index < cnt) 1485 req->cnt = cnt - req->ring_index; 1486 else 1487 req->cnt = req->length - 1488 (req->ring_index - cnt); 1489 if (req->cnt < (req_cnt + 2)) 1490 goto queuing_error; 1491 } 1492 1493 /* Build command packet. */ 1494 req->current_outstanding_cmd = handle; 1495 req->outstanding_cmds[handle] = sp; 1496 sp->handle = handle; 1497 cmd->host_scribble = (unsigned char *)(unsigned long)handle; 1498 req->cnt -= req_cnt; 1499 1500 cmd_pkt = (struct cmd_type_7 *)req->ring_ptr; 1501 cmd_pkt->handle = MAKE_HANDLE(req->id, handle); 1502 1503 /* Zero out remaining portion of packet. */ 1504 /* tagged queuing modifier -- default is TSK_SIMPLE (0). */ 1505 clr_ptr = (uint32_t *)cmd_pkt + 2; 1506 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 1507 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 1508 1509 /* Set NPORT-ID and LUN number*/ 1510 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1511 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 1512 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 1513 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 1514 cmd_pkt->vp_index = sp->fcport->vha->vp_idx; 1515 1516 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); 1517 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 1518 1519 /* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */ 1520 if (scsi_populate_tag_msg(cmd, tag)) { 1521 switch (tag[0]) { 1522 case HEAD_OF_QUEUE_TAG: 1523 cmd_pkt->task = TSK_HEAD_OF_QUEUE; 1524 break; 1525 case ORDERED_QUEUE_TAG: 1526 cmd_pkt->task = TSK_ORDERED; 1527 break; 1528 } 1529 } 1530 1531 /* Load SCSI command packet. */ 1532 memcpy(cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len); 1533 host_to_fcp_swap(cmd_pkt->fcp_cdb, sizeof(cmd_pkt->fcp_cdb)); 1534 1535 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 1536 1537 /* Build IOCB segments */ 1538 qla24xx_build_scsi_iocbs(sp, cmd_pkt, tot_dsds); 1539 1540 /* Set total data segment count. */ 1541 cmd_pkt->entry_count = (uint8_t)req_cnt; 1542 /* Specify response queue number where completion should happen */ 1543 cmd_pkt->entry_status = (uint8_t) rsp->id; 1544 wmb(); 1545 /* Adjust ring index. */ 1546 req->ring_index++; 1547 if (req->ring_index == req->length) { 1548 req->ring_index = 0; 1549 req->ring_ptr = req->ring; 1550 } else 1551 req->ring_ptr++; 1552 1553 sp->flags |= SRB_DMA_VALID; 1554 1555 /* Set chip new ring index. */ 1556 WRT_REG_DWORD(req->req_q_in, req->ring_index); 1557 RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); 1558 1559 /* Manage unprocessed RIO/ZIO commands in response queue. */ 1560 if (vha->flags.process_response_queue && 1561 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 1562 qla24xx_process_response_queue(vha, rsp); 1563 1564 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1565 return QLA_SUCCESS; 1566 1567 queuing_error: 1568 if (tot_dsds) 1569 scsi_dma_unmap(cmd); 1570 1571 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1572 1573 return QLA_FUNCTION_FAILED; 1574 } 1575 1576 /** 1577 * qla24xx_dif_start_scsi() - Send a SCSI command to the ISP 1578 * @sp: command to send to the ISP 1579 * 1580 * Returns non-zero if a failure occurred, else zero. 1581 */ 1582 int 1583 qla24xx_dif_start_scsi(srb_t *sp) 1584 { 1585 int nseg; 1586 unsigned long flags; 1587 uint32_t *clr_ptr; 1588 uint32_t index; 1589 uint32_t handle; 1590 uint16_t cnt; 1591 uint16_t req_cnt = 0; 1592 uint16_t tot_dsds; 1593 uint16_t tot_prot_dsds; 1594 uint16_t fw_prot_opts = 0; 1595 struct req_que *req = NULL; 1596 struct rsp_que *rsp = NULL; 1597 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 1598 struct scsi_qla_host *vha = sp->fcport->vha; 1599 struct qla_hw_data *ha = vha->hw; 1600 struct cmd_type_crc_2 *cmd_pkt; 1601 uint32_t status = 0; 1602 1603 #define QDSS_GOT_Q_SPACE BIT_0 1604 1605 /* Only process protection or >16 cdb in this routine */ 1606 if (scsi_get_prot_op(cmd) == SCSI_PROT_NORMAL) { 1607 if (cmd->cmd_len <= 16) 1608 return qla24xx_start_scsi(sp); 1609 } 1610 1611 /* Setup device pointers. */ 1612 1613 qla25xx_set_que(sp, &rsp); 1614 req = vha->req; 1615 1616 /* So we know we haven't pci_map'ed anything yet */ 1617 tot_dsds = 0; 1618 1619 /* Send marker if required */ 1620 if (vha->marker_needed != 0) { 1621 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != 1622 QLA_SUCCESS) 1623 return QLA_FUNCTION_FAILED; 1624 vha->marker_needed = 0; 1625 } 1626 1627 /* Acquire ring specific lock */ 1628 spin_lock_irqsave(&ha->hardware_lock, flags); 1629 1630 /* Check for room in outstanding command list. */ 1631 handle = req->current_outstanding_cmd; 1632 for (index = 1; index < req->num_outstanding_cmds; index++) { 1633 handle++; 1634 if (handle == req->num_outstanding_cmds) 1635 handle = 1; 1636 if (!req->outstanding_cmds[handle]) 1637 break; 1638 } 1639 1640 if (index == req->num_outstanding_cmds) 1641 goto queuing_error; 1642 1643 /* Compute number of required data segments */ 1644 /* Map the sg table so we have an accurate count of sg entries needed */ 1645 if (scsi_sg_count(cmd)) { 1646 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 1647 scsi_sg_count(cmd), cmd->sc_data_direction); 1648 if (unlikely(!nseg)) 1649 goto queuing_error; 1650 else 1651 sp->flags |= SRB_DMA_VALID; 1652 1653 if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) || 1654 (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP)) { 1655 struct qla2_sgx sgx; 1656 uint32_t partial; 1657 1658 memset(&sgx, 0, sizeof(struct qla2_sgx)); 1659 sgx.tot_bytes = scsi_bufflen(cmd); 1660 sgx.cur_sg = scsi_sglist(cmd); 1661 sgx.sp = sp; 1662 1663 nseg = 0; 1664 while (qla24xx_get_one_block_sg( 1665 cmd->device->sector_size, &sgx, &partial)) 1666 nseg++; 1667 } 1668 } else 1669 nseg = 0; 1670 1671 /* number of required data segments */ 1672 tot_dsds = nseg; 1673 1674 /* Compute number of required protection segments */ 1675 if (qla24xx_configure_prot_mode(sp, &fw_prot_opts)) { 1676 nseg = dma_map_sg(&ha->pdev->dev, scsi_prot_sglist(cmd), 1677 scsi_prot_sg_count(cmd), cmd->sc_data_direction); 1678 if (unlikely(!nseg)) 1679 goto queuing_error; 1680 else 1681 sp->flags |= SRB_CRC_PROT_DMA_VALID; 1682 1683 if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) || 1684 (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP)) { 1685 nseg = scsi_bufflen(cmd) / cmd->device->sector_size; 1686 } 1687 } else { 1688 nseg = 0; 1689 } 1690 1691 req_cnt = 1; 1692 /* Total Data and protection sg segment(s) */ 1693 tot_prot_dsds = nseg; 1694 tot_dsds += nseg; 1695 if (req->cnt < (req_cnt + 2)) { 1696 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 1697 1698 if (req->ring_index < cnt) 1699 req->cnt = cnt - req->ring_index; 1700 else 1701 req->cnt = req->length - 1702 (req->ring_index - cnt); 1703 if (req->cnt < (req_cnt + 2)) 1704 goto queuing_error; 1705 } 1706 1707 status |= QDSS_GOT_Q_SPACE; 1708 1709 /* Build header part of command packet (excluding the OPCODE). */ 1710 req->current_outstanding_cmd = handle; 1711 req->outstanding_cmds[handle] = sp; 1712 sp->handle = handle; 1713 cmd->host_scribble = (unsigned char *)(unsigned long)handle; 1714 req->cnt -= req_cnt; 1715 1716 /* Fill-in common area */ 1717 cmd_pkt = (struct cmd_type_crc_2 *)req->ring_ptr; 1718 cmd_pkt->handle = MAKE_HANDLE(req->id, handle); 1719 1720 clr_ptr = (uint32_t *)cmd_pkt + 2; 1721 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 1722 1723 /* Set NPORT-ID and LUN number*/ 1724 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1725 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 1726 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 1727 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 1728 1729 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); 1730 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 1731 1732 /* Total Data and protection segment(s) */ 1733 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 1734 1735 /* Build IOCB segments and adjust for data protection segments */ 1736 if (qla24xx_build_scsi_crc_2_iocbs(sp, (struct cmd_type_crc_2 *) 1737 req->ring_ptr, tot_dsds, tot_prot_dsds, fw_prot_opts) != 1738 QLA_SUCCESS) 1739 goto queuing_error; 1740 1741 cmd_pkt->entry_count = (uint8_t)req_cnt; 1742 /* Specify response queue number where completion should happen */ 1743 cmd_pkt->entry_status = (uint8_t) rsp->id; 1744 cmd_pkt->timeout = __constant_cpu_to_le16(0); 1745 wmb(); 1746 1747 /* Adjust ring index. */ 1748 req->ring_index++; 1749 if (req->ring_index == req->length) { 1750 req->ring_index = 0; 1751 req->ring_ptr = req->ring; 1752 } else 1753 req->ring_ptr++; 1754 1755 /* Set chip new ring index. */ 1756 WRT_REG_DWORD(req->req_q_in, req->ring_index); 1757 RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); 1758 1759 /* Manage unprocessed RIO/ZIO commands in response queue. */ 1760 if (vha->flags.process_response_queue && 1761 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 1762 qla24xx_process_response_queue(vha, rsp); 1763 1764 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1765 1766 return QLA_SUCCESS; 1767 1768 queuing_error: 1769 if (status & QDSS_GOT_Q_SPACE) { 1770 req->outstanding_cmds[handle] = NULL; 1771 req->cnt += req_cnt; 1772 } 1773 /* Cleanup will be performed by the caller (queuecommand) */ 1774 1775 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1776 return QLA_FUNCTION_FAILED; 1777 } 1778 1779 1780 static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp) 1781 { 1782 struct scsi_cmnd *cmd = GET_CMD_SP(sp); 1783 struct qla_hw_data *ha = sp->fcport->vha->hw; 1784 int affinity = cmd->request->cpu; 1785 1786 if (ha->flags.cpu_affinity_enabled && affinity >= 0 && 1787 affinity < ha->max_rsp_queues - 1) 1788 *rsp = ha->rsp_q_map[affinity + 1]; 1789 else 1790 *rsp = ha->rsp_q_map[0]; 1791 } 1792 1793 /* Generic Control-SRB manipulation functions. */ 1794 void * 1795 qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp) 1796 { 1797 struct qla_hw_data *ha = vha->hw; 1798 struct req_que *req = ha->req_q_map[0]; 1799 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); 1800 uint32_t index, handle; 1801 request_t *pkt; 1802 uint16_t cnt, req_cnt; 1803 1804 pkt = NULL; 1805 req_cnt = 1; 1806 handle = 0; 1807 1808 if (!sp) 1809 goto skip_cmd_array; 1810 1811 /* Check for room in outstanding command list. */ 1812 handle = req->current_outstanding_cmd; 1813 for (index = 1; req->num_outstanding_cmds; index++) { 1814 handle++; 1815 if (handle == req->num_outstanding_cmds) 1816 handle = 1; 1817 if (!req->outstanding_cmds[handle]) 1818 break; 1819 } 1820 if (index == req->num_outstanding_cmds) { 1821 ql_log(ql_log_warn, vha, 0x700b, 1822 "No room on outstanding cmd array.\n"); 1823 goto queuing_error; 1824 } 1825 1826 /* Prep command array. */ 1827 req->current_outstanding_cmd = handle; 1828 req->outstanding_cmds[handle] = sp; 1829 sp->handle = handle; 1830 1831 /* Adjust entry-counts as needed. */ 1832 if (sp->type != SRB_SCSI_CMD) 1833 req_cnt = sp->iocbs; 1834 1835 skip_cmd_array: 1836 /* Check for room on request queue. */ 1837 if (req->cnt < req_cnt) { 1838 if (ha->mqenable || IS_QLA83XX(ha)) 1839 cnt = RD_REG_DWORD(®->isp25mq.req_q_out); 1840 else if (IS_QLA82XX(ha)) 1841 cnt = RD_REG_DWORD(®->isp82.req_q_out); 1842 else if (IS_FWI2_CAPABLE(ha)) 1843 cnt = RD_REG_DWORD(®->isp24.req_q_out); 1844 else if (IS_QLAFX00(ha)) 1845 cnt = RD_REG_DWORD(®->ispfx00.req_q_out); 1846 else 1847 cnt = qla2x00_debounce_register( 1848 ISP_REQ_Q_OUT(ha, ®->isp)); 1849 1850 if (req->ring_index < cnt) 1851 req->cnt = cnt - req->ring_index; 1852 else 1853 req->cnt = req->length - 1854 (req->ring_index - cnt); 1855 } 1856 if (req->cnt < req_cnt) 1857 goto queuing_error; 1858 1859 /* Prep packet */ 1860 req->cnt -= req_cnt; 1861 pkt = req->ring_ptr; 1862 memset(pkt, 0, REQUEST_ENTRY_SIZE); 1863 if (IS_QLAFX00(ha)) { 1864 WRT_REG_BYTE((void __iomem *)&pkt->entry_count, req_cnt); 1865 WRT_REG_WORD((void __iomem *)&pkt->handle, handle); 1866 } else { 1867 pkt->entry_count = req_cnt; 1868 pkt->handle = handle; 1869 } 1870 1871 queuing_error: 1872 return pkt; 1873 } 1874 1875 static void 1876 qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1877 { 1878 struct srb_iocb *lio = &sp->u.iocb_cmd; 1879 1880 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1881 logio->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI); 1882 if (lio->u.logio.flags & SRB_LOGIN_COND_PLOGI) 1883 logio->control_flags |= cpu_to_le16(LCF_COND_PLOGI); 1884 if (lio->u.logio.flags & SRB_LOGIN_SKIP_PRLI) 1885 logio->control_flags |= cpu_to_le16(LCF_SKIP_PRLI); 1886 logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1887 logio->port_id[0] = sp->fcport->d_id.b.al_pa; 1888 logio->port_id[1] = sp->fcport->d_id.b.area; 1889 logio->port_id[2] = sp->fcport->d_id.b.domain; 1890 logio->vp_index = sp->fcport->vha->vp_idx; 1891 } 1892 1893 static void 1894 qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) 1895 { 1896 struct qla_hw_data *ha = sp->fcport->vha->hw; 1897 struct srb_iocb *lio = &sp->u.iocb_cmd; 1898 uint16_t opts; 1899 1900 mbx->entry_type = MBX_IOCB_TYPE; 1901 SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id); 1902 mbx->mb0 = cpu_to_le16(MBC_LOGIN_FABRIC_PORT); 1903 opts = lio->u.logio.flags & SRB_LOGIN_COND_PLOGI ? BIT_0 : 0; 1904 opts |= lio->u.logio.flags & SRB_LOGIN_SKIP_PRLI ? BIT_1 : 0; 1905 if (HAS_EXTENDED_IDS(ha)) { 1906 mbx->mb1 = cpu_to_le16(sp->fcport->loop_id); 1907 mbx->mb10 = cpu_to_le16(opts); 1908 } else { 1909 mbx->mb1 = cpu_to_le16((sp->fcport->loop_id << 8) | opts); 1910 } 1911 mbx->mb2 = cpu_to_le16(sp->fcport->d_id.b.domain); 1912 mbx->mb3 = cpu_to_le16(sp->fcport->d_id.b.area << 8 | 1913 sp->fcport->d_id.b.al_pa); 1914 mbx->mb9 = cpu_to_le16(sp->fcport->vha->vp_idx); 1915 } 1916 1917 static void 1918 qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1919 { 1920 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1921 logio->control_flags = 1922 cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO); 1923 logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1924 logio->port_id[0] = sp->fcport->d_id.b.al_pa; 1925 logio->port_id[1] = sp->fcport->d_id.b.area; 1926 logio->port_id[2] = sp->fcport->d_id.b.domain; 1927 logio->vp_index = sp->fcport->vha->vp_idx; 1928 } 1929 1930 static void 1931 qla2x00_logout_iocb(srb_t *sp, struct mbx_entry *mbx) 1932 { 1933 struct qla_hw_data *ha = sp->fcport->vha->hw; 1934 1935 mbx->entry_type = MBX_IOCB_TYPE; 1936 SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id); 1937 mbx->mb0 = cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); 1938 mbx->mb1 = HAS_EXTENDED_IDS(ha) ? 1939 cpu_to_le16(sp->fcport->loop_id): 1940 cpu_to_le16(sp->fcport->loop_id << 8); 1941 mbx->mb2 = cpu_to_le16(sp->fcport->d_id.b.domain); 1942 mbx->mb3 = cpu_to_le16(sp->fcport->d_id.b.area << 8 | 1943 sp->fcport->d_id.b.al_pa); 1944 mbx->mb9 = cpu_to_le16(sp->fcport->vha->vp_idx); 1945 /* Implicit: mbx->mbx10 = 0. */ 1946 } 1947 1948 static void 1949 qla24xx_adisc_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1950 { 1951 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1952 logio->control_flags = cpu_to_le16(LCF_COMMAND_ADISC); 1953 logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1954 logio->vp_index = sp->fcport->vha->vp_idx; 1955 } 1956 1957 static void 1958 qla2x00_adisc_iocb(srb_t *sp, struct mbx_entry *mbx) 1959 { 1960 struct qla_hw_data *ha = sp->fcport->vha->hw; 1961 1962 mbx->entry_type = MBX_IOCB_TYPE; 1963 SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id); 1964 mbx->mb0 = cpu_to_le16(MBC_GET_PORT_DATABASE); 1965 if (HAS_EXTENDED_IDS(ha)) { 1966 mbx->mb1 = cpu_to_le16(sp->fcport->loop_id); 1967 mbx->mb10 = cpu_to_le16(BIT_0); 1968 } else { 1969 mbx->mb1 = cpu_to_le16((sp->fcport->loop_id << 8) | BIT_0); 1970 } 1971 mbx->mb2 = cpu_to_le16(MSW(ha->async_pd_dma)); 1972 mbx->mb3 = cpu_to_le16(LSW(ha->async_pd_dma)); 1973 mbx->mb6 = cpu_to_le16(MSW(MSD(ha->async_pd_dma))); 1974 mbx->mb7 = cpu_to_le16(LSW(MSD(ha->async_pd_dma))); 1975 mbx->mb9 = cpu_to_le16(sp->fcport->vha->vp_idx); 1976 } 1977 1978 static void 1979 qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk) 1980 { 1981 uint32_t flags; 1982 unsigned int lun; 1983 struct fc_port *fcport = sp->fcport; 1984 scsi_qla_host_t *vha = fcport->vha; 1985 struct qla_hw_data *ha = vha->hw; 1986 struct srb_iocb *iocb = &sp->u.iocb_cmd; 1987 struct req_que *req = vha->req; 1988 1989 flags = iocb->u.tmf.flags; 1990 lun = iocb->u.tmf.lun; 1991 1992 tsk->entry_type = TSK_MGMT_IOCB_TYPE; 1993 tsk->entry_count = 1; 1994 tsk->handle = MAKE_HANDLE(req->id, tsk->handle); 1995 tsk->nport_handle = cpu_to_le16(fcport->loop_id); 1996 tsk->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); 1997 tsk->control_flags = cpu_to_le32(flags); 1998 tsk->port_id[0] = fcport->d_id.b.al_pa; 1999 tsk->port_id[1] = fcport->d_id.b.area; 2000 tsk->port_id[2] = fcport->d_id.b.domain; 2001 tsk->vp_index = fcport->vha->vp_idx; 2002 2003 if (flags == TCF_LUN_RESET) { 2004 int_to_scsilun(lun, &tsk->lun); 2005 host_to_fcp_swap((uint8_t *)&tsk->lun, 2006 sizeof(tsk->lun)); 2007 } 2008 } 2009 2010 static void 2011 qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) 2012 { 2013 struct fc_bsg_job *bsg_job = sp->u.bsg_job; 2014 2015 els_iocb->entry_type = ELS_IOCB_TYPE; 2016 els_iocb->entry_count = 1; 2017 els_iocb->sys_define = 0; 2018 els_iocb->entry_status = 0; 2019 els_iocb->handle = sp->handle; 2020 els_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id); 2021 els_iocb->tx_dsd_count = __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt); 2022 els_iocb->vp_index = sp->fcport->vha->vp_idx; 2023 els_iocb->sof_type = EST_SOFI3; 2024 els_iocb->rx_dsd_count = __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt); 2025 2026 els_iocb->opcode = 2027 sp->type == SRB_ELS_CMD_RPT ? 2028 bsg_job->request->rqst_data.r_els.els_code : 2029 bsg_job->request->rqst_data.h_els.command_code; 2030 els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; 2031 els_iocb->port_id[1] = sp->fcport->d_id.b.area; 2032 els_iocb->port_id[2] = sp->fcport->d_id.b.domain; 2033 els_iocb->control_flags = 0; 2034 els_iocb->rx_byte_count = 2035 cpu_to_le32(bsg_job->reply_payload.payload_len); 2036 els_iocb->tx_byte_count = 2037 cpu_to_le32(bsg_job->request_payload.payload_len); 2038 2039 els_iocb->tx_address[0] = cpu_to_le32(LSD(sg_dma_address 2040 (bsg_job->request_payload.sg_list))); 2041 els_iocb->tx_address[1] = cpu_to_le32(MSD(sg_dma_address 2042 (bsg_job->request_payload.sg_list))); 2043 els_iocb->tx_len = cpu_to_le32(sg_dma_len 2044 (bsg_job->request_payload.sg_list)); 2045 2046 els_iocb->rx_address[0] = cpu_to_le32(LSD(sg_dma_address 2047 (bsg_job->reply_payload.sg_list))); 2048 els_iocb->rx_address[1] = cpu_to_le32(MSD(sg_dma_address 2049 (bsg_job->reply_payload.sg_list))); 2050 els_iocb->rx_len = cpu_to_le32(sg_dma_len 2051 (bsg_job->reply_payload.sg_list)); 2052 } 2053 2054 static void 2055 qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb) 2056 { 2057 uint16_t avail_dsds; 2058 uint32_t *cur_dsd; 2059 struct scatterlist *sg; 2060 int index; 2061 uint16_t tot_dsds; 2062 scsi_qla_host_t *vha = sp->fcport->vha; 2063 struct qla_hw_data *ha = vha->hw; 2064 struct fc_bsg_job *bsg_job = sp->u.bsg_job; 2065 int loop_iterartion = 0; 2066 int cont_iocb_prsnt = 0; 2067 int entry_count = 1; 2068 2069 memset(ct_iocb, 0, sizeof(ms_iocb_entry_t)); 2070 ct_iocb->entry_type = CT_IOCB_TYPE; 2071 ct_iocb->entry_status = 0; 2072 ct_iocb->handle1 = sp->handle; 2073 SET_TARGET_ID(ha, ct_iocb->loop_id, sp->fcport->loop_id); 2074 ct_iocb->status = __constant_cpu_to_le16(0); 2075 ct_iocb->control_flags = __constant_cpu_to_le16(0); 2076 ct_iocb->timeout = 0; 2077 ct_iocb->cmd_dsd_count = 2078 __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt); 2079 ct_iocb->total_dsd_count = 2080 __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt + 1); 2081 ct_iocb->req_bytecount = 2082 cpu_to_le32(bsg_job->request_payload.payload_len); 2083 ct_iocb->rsp_bytecount = 2084 cpu_to_le32(bsg_job->reply_payload.payload_len); 2085 2086 ct_iocb->dseg_req_address[0] = cpu_to_le32(LSD(sg_dma_address 2087 (bsg_job->request_payload.sg_list))); 2088 ct_iocb->dseg_req_address[1] = cpu_to_le32(MSD(sg_dma_address 2089 (bsg_job->request_payload.sg_list))); 2090 ct_iocb->dseg_req_length = ct_iocb->req_bytecount; 2091 2092 ct_iocb->dseg_rsp_address[0] = cpu_to_le32(LSD(sg_dma_address 2093 (bsg_job->reply_payload.sg_list))); 2094 ct_iocb->dseg_rsp_address[1] = cpu_to_le32(MSD(sg_dma_address 2095 (bsg_job->reply_payload.sg_list))); 2096 ct_iocb->dseg_rsp_length = ct_iocb->rsp_bytecount; 2097 2098 avail_dsds = 1; 2099 cur_dsd = (uint32_t *)ct_iocb->dseg_rsp_address; 2100 index = 0; 2101 tot_dsds = bsg_job->reply_payload.sg_cnt; 2102 2103 for_each_sg(bsg_job->reply_payload.sg_list, sg, tot_dsds, index) { 2104 dma_addr_t sle_dma; 2105 cont_a64_entry_t *cont_pkt; 2106 2107 /* Allocate additional continuation packets? */ 2108 if (avail_dsds == 0) { 2109 /* 2110 * Five DSDs are available in the Cont. 2111 * Type 1 IOCB. 2112 */ 2113 cont_pkt = qla2x00_prep_cont_type1_iocb(vha, 2114 vha->hw->req_q_map[0]); 2115 cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; 2116 avail_dsds = 5; 2117 cont_iocb_prsnt = 1; 2118 entry_count++; 2119 } 2120 2121 sle_dma = sg_dma_address(sg); 2122 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 2123 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 2124 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 2125 loop_iterartion++; 2126 avail_dsds--; 2127 } 2128 ct_iocb->entry_count = entry_count; 2129 } 2130 2131 static void 2132 qla24xx_ct_iocb(srb_t *sp, struct ct_entry_24xx *ct_iocb) 2133 { 2134 uint16_t avail_dsds; 2135 uint32_t *cur_dsd; 2136 struct scatterlist *sg; 2137 int index; 2138 uint16_t tot_dsds; 2139 scsi_qla_host_t *vha = sp->fcport->vha; 2140 struct qla_hw_data *ha = vha->hw; 2141 struct fc_bsg_job *bsg_job = sp->u.bsg_job; 2142 int loop_iterartion = 0; 2143 int cont_iocb_prsnt = 0; 2144 int entry_count = 1; 2145 2146 ct_iocb->entry_type = CT_IOCB_TYPE; 2147 ct_iocb->entry_status = 0; 2148 ct_iocb->sys_define = 0; 2149 ct_iocb->handle = sp->handle; 2150 2151 ct_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id); 2152 ct_iocb->vp_index = sp->fcport->vha->vp_idx; 2153 ct_iocb->comp_status = __constant_cpu_to_le16(0); 2154 2155 ct_iocb->cmd_dsd_count = 2156 __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt); 2157 ct_iocb->timeout = 0; 2158 ct_iocb->rsp_dsd_count = 2159 __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt); 2160 ct_iocb->rsp_byte_count = 2161 cpu_to_le32(bsg_job->reply_payload.payload_len); 2162 ct_iocb->cmd_byte_count = 2163 cpu_to_le32(bsg_job->request_payload.payload_len); 2164 ct_iocb->dseg_0_address[0] = cpu_to_le32(LSD(sg_dma_address 2165 (bsg_job->request_payload.sg_list))); 2166 ct_iocb->dseg_0_address[1] = cpu_to_le32(MSD(sg_dma_address 2167 (bsg_job->request_payload.sg_list))); 2168 ct_iocb->dseg_0_len = cpu_to_le32(sg_dma_len 2169 (bsg_job->request_payload.sg_list)); 2170 2171 avail_dsds = 1; 2172 cur_dsd = (uint32_t *)ct_iocb->dseg_1_address; 2173 index = 0; 2174 tot_dsds = bsg_job->reply_payload.sg_cnt; 2175 2176 for_each_sg(bsg_job->reply_payload.sg_list, sg, tot_dsds, index) { 2177 dma_addr_t sle_dma; 2178 cont_a64_entry_t *cont_pkt; 2179 2180 /* Allocate additional continuation packets? */ 2181 if (avail_dsds == 0) { 2182 /* 2183 * Five DSDs are available in the Cont. 2184 * Type 1 IOCB. 2185 */ 2186 cont_pkt = qla2x00_prep_cont_type1_iocb(vha, 2187 ha->req_q_map[0]); 2188 cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; 2189 avail_dsds = 5; 2190 cont_iocb_prsnt = 1; 2191 entry_count++; 2192 } 2193 2194 sle_dma = sg_dma_address(sg); 2195 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 2196 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 2197 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 2198 loop_iterartion++; 2199 avail_dsds--; 2200 } 2201 ct_iocb->entry_count = entry_count; 2202 } 2203 2204 /* 2205 * qla82xx_start_scsi() - Send a SCSI command to the ISP 2206 * @sp: command to send to the ISP 2207 * 2208 * Returns non-zero if a failure occurred, else zero. 2209 */ 2210 int 2211 qla82xx_start_scsi(srb_t *sp) 2212 { 2213 int ret, nseg; 2214 unsigned long flags; 2215 struct scsi_cmnd *cmd; 2216 uint32_t *clr_ptr; 2217 uint32_t index; 2218 uint32_t handle; 2219 uint16_t cnt; 2220 uint16_t req_cnt; 2221 uint16_t tot_dsds; 2222 struct device_reg_82xx __iomem *reg; 2223 uint32_t dbval; 2224 uint32_t *fcp_dl; 2225 uint8_t additional_cdb_len; 2226 struct ct6_dsd *ctx; 2227 struct scsi_qla_host *vha = sp->fcport->vha; 2228 struct qla_hw_data *ha = vha->hw; 2229 struct req_que *req = NULL; 2230 struct rsp_que *rsp = NULL; 2231 char tag[2]; 2232 2233 /* Setup device pointers. */ 2234 ret = 0; 2235 reg = &ha->iobase->isp82; 2236 cmd = GET_CMD_SP(sp); 2237 req = vha->req; 2238 rsp = ha->rsp_q_map[0]; 2239 2240 /* So we know we haven't pci_map'ed anything yet */ 2241 tot_dsds = 0; 2242 2243 dbval = 0x04 | (ha->portnum << 5); 2244 2245 /* Send marker if required */ 2246 if (vha->marker_needed != 0) { 2247 if (qla2x00_marker(vha, req, 2248 rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) { 2249 ql_log(ql_log_warn, vha, 0x300c, 2250 "qla2x00_marker failed for cmd=%p.\n", cmd); 2251 return QLA_FUNCTION_FAILED; 2252 } 2253 vha->marker_needed = 0; 2254 } 2255 2256 /* Acquire ring specific lock */ 2257 spin_lock_irqsave(&ha->hardware_lock, flags); 2258 2259 /* Check for room in outstanding command list. */ 2260 handle = req->current_outstanding_cmd; 2261 for (index = 1; index < req->num_outstanding_cmds; index++) { 2262 handle++; 2263 if (handle == req->num_outstanding_cmds) 2264 handle = 1; 2265 if (!req->outstanding_cmds[handle]) 2266 break; 2267 } 2268 if (index == req->num_outstanding_cmds) 2269 goto queuing_error; 2270 2271 /* Map the sg table so we have an accurate count of sg entries needed */ 2272 if (scsi_sg_count(cmd)) { 2273 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 2274 scsi_sg_count(cmd), cmd->sc_data_direction); 2275 if (unlikely(!nseg)) 2276 goto queuing_error; 2277 } else 2278 nseg = 0; 2279 2280 tot_dsds = nseg; 2281 2282 if (tot_dsds > ql2xshiftctondsd) { 2283 struct cmd_type_6 *cmd_pkt; 2284 uint16_t more_dsd_lists = 0; 2285 struct dsd_dma *dsd_ptr; 2286 uint16_t i; 2287 2288 more_dsd_lists = qla24xx_calc_dsd_lists(tot_dsds); 2289 if ((more_dsd_lists + ha->gbl_dsd_inuse) >= NUM_DSD_CHAIN) { 2290 ql_dbg(ql_dbg_io, vha, 0x300d, 2291 "Num of DSD list %d is than %d for cmd=%p.\n", 2292 more_dsd_lists + ha->gbl_dsd_inuse, NUM_DSD_CHAIN, 2293 cmd); 2294 goto queuing_error; 2295 } 2296 2297 if (more_dsd_lists <= ha->gbl_dsd_avail) 2298 goto sufficient_dsds; 2299 else 2300 more_dsd_lists -= ha->gbl_dsd_avail; 2301 2302 for (i = 0; i < more_dsd_lists; i++) { 2303 dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); 2304 if (!dsd_ptr) { 2305 ql_log(ql_log_fatal, vha, 0x300e, 2306 "Failed to allocate memory for dsd_dma " 2307 "for cmd=%p.\n", cmd); 2308 goto queuing_error; 2309 } 2310 2311 dsd_ptr->dsd_addr = dma_pool_alloc(ha->dl_dma_pool, 2312 GFP_ATOMIC, &dsd_ptr->dsd_list_dma); 2313 if (!dsd_ptr->dsd_addr) { 2314 kfree(dsd_ptr); 2315 ql_log(ql_log_fatal, vha, 0x300f, 2316 "Failed to allocate memory for dsd_addr " 2317 "for cmd=%p.\n", cmd); 2318 goto queuing_error; 2319 } 2320 list_add_tail(&dsd_ptr->list, &ha->gbl_dsd_list); 2321 ha->gbl_dsd_avail++; 2322 } 2323 2324 sufficient_dsds: 2325 req_cnt = 1; 2326 2327 if (req->cnt < (req_cnt + 2)) { 2328 cnt = (uint16_t)RD_REG_DWORD_RELAXED( 2329 ®->req_q_out[0]); 2330 if (req->ring_index < cnt) 2331 req->cnt = cnt - req->ring_index; 2332 else 2333 req->cnt = req->length - 2334 (req->ring_index - cnt); 2335 if (req->cnt < (req_cnt + 2)) 2336 goto queuing_error; 2337 } 2338 2339 ctx = sp->u.scmd.ctx = 2340 mempool_alloc(ha->ctx_mempool, GFP_ATOMIC); 2341 if (!ctx) { 2342 ql_log(ql_log_fatal, vha, 0x3010, 2343 "Failed to allocate ctx for cmd=%p.\n", cmd); 2344 goto queuing_error; 2345 } 2346 2347 memset(ctx, 0, sizeof(struct ct6_dsd)); 2348 ctx->fcp_cmnd = dma_pool_alloc(ha->fcp_cmnd_dma_pool, 2349 GFP_ATOMIC, &ctx->fcp_cmnd_dma); 2350 if (!ctx->fcp_cmnd) { 2351 ql_log(ql_log_fatal, vha, 0x3011, 2352 "Failed to allocate fcp_cmnd for cmd=%p.\n", cmd); 2353 goto queuing_error; 2354 } 2355 2356 /* Initialize the DSD list and dma handle */ 2357 INIT_LIST_HEAD(&ctx->dsd_list); 2358 ctx->dsd_use_cnt = 0; 2359 2360 if (cmd->cmd_len > 16) { 2361 additional_cdb_len = cmd->cmd_len - 16; 2362 if ((cmd->cmd_len % 4) != 0) { 2363 /* SCSI command bigger than 16 bytes must be 2364 * multiple of 4 2365 */ 2366 ql_log(ql_log_warn, vha, 0x3012, 2367 "scsi cmd len %d not multiple of 4 " 2368 "for cmd=%p.\n", cmd->cmd_len, cmd); 2369 goto queuing_error_fcp_cmnd; 2370 } 2371 ctx->fcp_cmnd_len = 12 + cmd->cmd_len + 4; 2372 } else { 2373 additional_cdb_len = 0; 2374 ctx->fcp_cmnd_len = 12 + 16 + 4; 2375 } 2376 2377 cmd_pkt = (struct cmd_type_6 *)req->ring_ptr; 2378 cmd_pkt->handle = MAKE_HANDLE(req->id, handle); 2379 2380 /* Zero out remaining portion of packet. */ 2381 /* tagged queuing modifier -- default is TSK_SIMPLE (0). */ 2382 clr_ptr = (uint32_t *)cmd_pkt + 2; 2383 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 2384 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 2385 2386 /* Set NPORT-ID and LUN number*/ 2387 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 2388 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 2389 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 2390 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 2391 cmd_pkt->vp_index = sp->fcport->vha->vp_idx; 2392 2393 /* Build IOCB segments */ 2394 if (qla24xx_build_scsi_type_6_iocbs(sp, cmd_pkt, tot_dsds)) 2395 goto queuing_error_fcp_cmnd; 2396 2397 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); 2398 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 2399 2400 /* build FCP_CMND IU */ 2401 memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd)); 2402 int_to_scsilun(cmd->device->lun, &ctx->fcp_cmnd->lun); 2403 ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; 2404 2405 if (cmd->sc_data_direction == DMA_TO_DEVICE) 2406 ctx->fcp_cmnd->additional_cdb_len |= 1; 2407 else if (cmd->sc_data_direction == DMA_FROM_DEVICE) 2408 ctx->fcp_cmnd->additional_cdb_len |= 2; 2409 2410 /* 2411 * Update tagged queuing modifier -- default is TSK_SIMPLE (0). 2412 */ 2413 if (scsi_populate_tag_msg(cmd, tag)) { 2414 switch (tag[0]) { 2415 case HEAD_OF_QUEUE_TAG: 2416 ctx->fcp_cmnd->task_attribute = 2417 TSK_HEAD_OF_QUEUE; 2418 break; 2419 case ORDERED_QUEUE_TAG: 2420 ctx->fcp_cmnd->task_attribute = 2421 TSK_ORDERED; 2422 break; 2423 } 2424 } 2425 2426 /* Populate the FCP_PRIO. */ 2427 if (ha->flags.fcp_prio_enabled) 2428 ctx->fcp_cmnd->task_attribute |= 2429 sp->fcport->fcp_prio << 3; 2430 2431 memcpy(ctx->fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); 2432 2433 fcp_dl = (uint32_t *)(ctx->fcp_cmnd->cdb + 16 + 2434 additional_cdb_len); 2435 *fcp_dl = htonl((uint32_t)scsi_bufflen(cmd)); 2436 2437 cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(ctx->fcp_cmnd_len); 2438 cmd_pkt->fcp_cmnd_dseg_address[0] = 2439 cpu_to_le32(LSD(ctx->fcp_cmnd_dma)); 2440 cmd_pkt->fcp_cmnd_dseg_address[1] = 2441 cpu_to_le32(MSD(ctx->fcp_cmnd_dma)); 2442 2443 sp->flags |= SRB_FCP_CMND_DMA_VALID; 2444 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 2445 /* Set total data segment count. */ 2446 cmd_pkt->entry_count = (uint8_t)req_cnt; 2447 /* Specify response queue number where 2448 * completion should happen 2449 */ 2450 cmd_pkt->entry_status = (uint8_t) rsp->id; 2451 } else { 2452 struct cmd_type_7 *cmd_pkt; 2453 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); 2454 if (req->cnt < (req_cnt + 2)) { 2455 cnt = (uint16_t)RD_REG_DWORD_RELAXED( 2456 ®->req_q_out[0]); 2457 if (req->ring_index < cnt) 2458 req->cnt = cnt - req->ring_index; 2459 else 2460 req->cnt = req->length - 2461 (req->ring_index - cnt); 2462 } 2463 if (req->cnt < (req_cnt + 2)) 2464 goto queuing_error; 2465 2466 cmd_pkt = (struct cmd_type_7 *)req->ring_ptr; 2467 cmd_pkt->handle = MAKE_HANDLE(req->id, handle); 2468 2469 /* Zero out remaining portion of packet. */ 2470 /* tagged queuing modifier -- default is TSK_SIMPLE (0).*/ 2471 clr_ptr = (uint32_t *)cmd_pkt + 2; 2472 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 2473 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 2474 2475 /* Set NPORT-ID and LUN number*/ 2476 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 2477 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 2478 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 2479 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 2480 cmd_pkt->vp_index = sp->fcport->vha->vp_idx; 2481 2482 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun); 2483 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, 2484 sizeof(cmd_pkt->lun)); 2485 2486 /* 2487 * Update tagged queuing modifier -- default is TSK_SIMPLE (0). 2488 */ 2489 if (scsi_populate_tag_msg(cmd, tag)) { 2490 switch (tag[0]) { 2491 case HEAD_OF_QUEUE_TAG: 2492 cmd_pkt->task = TSK_HEAD_OF_QUEUE; 2493 break; 2494 case ORDERED_QUEUE_TAG: 2495 cmd_pkt->task = TSK_ORDERED; 2496 break; 2497 } 2498 } 2499 2500 /* Populate the FCP_PRIO. */ 2501 if (ha->flags.fcp_prio_enabled) 2502 cmd_pkt->task |= sp->fcport->fcp_prio << 3; 2503 2504 /* Load SCSI command packet. */ 2505 memcpy(cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len); 2506 host_to_fcp_swap(cmd_pkt->fcp_cdb, sizeof(cmd_pkt->fcp_cdb)); 2507 2508 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 2509 2510 /* Build IOCB segments */ 2511 qla24xx_build_scsi_iocbs(sp, cmd_pkt, tot_dsds); 2512 2513 /* Set total data segment count. */ 2514 cmd_pkt->entry_count = (uint8_t)req_cnt; 2515 /* Specify response queue number where 2516 * completion should happen. 2517 */ 2518 cmd_pkt->entry_status = (uint8_t) rsp->id; 2519 2520 } 2521 /* Build command packet. */ 2522 req->current_outstanding_cmd = handle; 2523 req->outstanding_cmds[handle] = sp; 2524 sp->handle = handle; 2525 cmd->host_scribble = (unsigned char *)(unsigned long)handle; 2526 req->cnt -= req_cnt; 2527 wmb(); 2528 2529 /* Adjust ring index. */ 2530 req->ring_index++; 2531 if (req->ring_index == req->length) { 2532 req->ring_index = 0; 2533 req->ring_ptr = req->ring; 2534 } else 2535 req->ring_ptr++; 2536 2537 sp->flags |= SRB_DMA_VALID; 2538 2539 /* Set chip new ring index. */ 2540 /* write, read and verify logic */ 2541 dbval = dbval | (req->id << 8) | (req->ring_index << 16); 2542 if (ql2xdbwr) 2543 qla82xx_wr_32(ha, ha->nxdb_wr_ptr, dbval); 2544 else { 2545 WRT_REG_DWORD( 2546 (unsigned long __iomem *)ha->nxdb_wr_ptr, 2547 dbval); 2548 wmb(); 2549 while (RD_REG_DWORD((void __iomem *)ha->nxdb_rd_ptr) != dbval) { 2550 WRT_REG_DWORD( 2551 (unsigned long __iomem *)ha->nxdb_wr_ptr, 2552 dbval); 2553 wmb(); 2554 } 2555 } 2556 2557 /* Manage unprocessed RIO/ZIO commands in response queue. */ 2558 if (vha->flags.process_response_queue && 2559 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 2560 qla24xx_process_response_queue(vha, rsp); 2561 2562 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2563 return QLA_SUCCESS; 2564 2565 queuing_error_fcp_cmnd: 2566 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx->fcp_cmnd, ctx->fcp_cmnd_dma); 2567 queuing_error: 2568 if (tot_dsds) 2569 scsi_dma_unmap(cmd); 2570 2571 if (sp->u.scmd.ctx) { 2572 mempool_free(sp->u.scmd.ctx, ha->ctx_mempool); 2573 sp->u.scmd.ctx = NULL; 2574 } 2575 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2576 2577 return QLA_FUNCTION_FAILED; 2578 } 2579 2580 int 2581 qla2x00_start_sp(srb_t *sp) 2582 { 2583 int rval; 2584 struct qla_hw_data *ha = sp->fcport->vha->hw; 2585 void *pkt; 2586 unsigned long flags; 2587 2588 rval = QLA_FUNCTION_FAILED; 2589 spin_lock_irqsave(&ha->hardware_lock, flags); 2590 pkt = qla2x00_alloc_iocbs(sp->fcport->vha, sp); 2591 if (!pkt) { 2592 ql_log(ql_log_warn, sp->fcport->vha, 0x700c, 2593 "qla2x00_alloc_iocbs failed.\n"); 2594 goto done; 2595 } 2596 2597 rval = QLA_SUCCESS; 2598 switch (sp->type) { 2599 case SRB_LOGIN_CMD: 2600 IS_FWI2_CAPABLE(ha) ? 2601 qla24xx_login_iocb(sp, pkt) : 2602 qla2x00_login_iocb(sp, pkt); 2603 break; 2604 case SRB_LOGOUT_CMD: 2605 IS_FWI2_CAPABLE(ha) ? 2606 qla24xx_logout_iocb(sp, pkt) : 2607 qla2x00_logout_iocb(sp, pkt); 2608 break; 2609 case SRB_ELS_CMD_RPT: 2610 case SRB_ELS_CMD_HST: 2611 qla24xx_els_iocb(sp, pkt); 2612 break; 2613 case SRB_CT_CMD: 2614 IS_FWI2_CAPABLE(ha) ? 2615 qla24xx_ct_iocb(sp, pkt) : 2616 qla2x00_ct_iocb(sp, pkt); 2617 break; 2618 case SRB_ADISC_CMD: 2619 IS_FWI2_CAPABLE(ha) ? 2620 qla24xx_adisc_iocb(sp, pkt) : 2621 qla2x00_adisc_iocb(sp, pkt); 2622 break; 2623 case SRB_TM_CMD: 2624 IS_QLAFX00(ha) ? 2625 qlafx00_tm_iocb(sp, pkt) : 2626 qla24xx_tm_iocb(sp, pkt); 2627 break; 2628 case SRB_FXIOCB_DCMD: 2629 case SRB_FXIOCB_BCMD: 2630 qlafx00_fxdisc_iocb(sp, pkt); 2631 break; 2632 case SRB_ABT_CMD: 2633 qlafx00_abort_iocb(sp, pkt); 2634 break; 2635 default: 2636 break; 2637 } 2638 2639 wmb(); 2640 qla2x00_start_iocbs(sp->fcport->vha, ha->req_q_map[0]); 2641 done: 2642 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2643 return rval; 2644 } 2645 2646 static void 2647 qla25xx_build_bidir_iocb(srb_t *sp, struct scsi_qla_host *vha, 2648 struct cmd_bidir *cmd_pkt, uint32_t tot_dsds) 2649 { 2650 uint16_t avail_dsds; 2651 uint32_t *cur_dsd; 2652 uint32_t req_data_len = 0; 2653 uint32_t rsp_data_len = 0; 2654 struct scatterlist *sg; 2655 int index; 2656 int entry_count = 1; 2657 struct fc_bsg_job *bsg_job = sp->u.bsg_job; 2658 2659 /*Update entry type to indicate bidir command */ 2660 *((uint32_t *)(&cmd_pkt->entry_type)) = 2661 __constant_cpu_to_le32(COMMAND_BIDIRECTIONAL); 2662 2663 /* Set the transfer direction, in this set both flags 2664 * Also set the BD_WRAP_BACK flag, firmware will take care 2665 * assigning DID=SID for outgoing pkts. 2666 */ 2667 cmd_pkt->wr_dseg_count = cpu_to_le16(bsg_job->request_payload.sg_cnt); 2668 cmd_pkt->rd_dseg_count = cpu_to_le16(bsg_job->reply_payload.sg_cnt); 2669 cmd_pkt->control_flags = 2670 __constant_cpu_to_le16(BD_WRITE_DATA | BD_READ_DATA | 2671 BD_WRAP_BACK); 2672 2673 req_data_len = rsp_data_len = bsg_job->request_payload.payload_len; 2674 cmd_pkt->wr_byte_count = cpu_to_le32(req_data_len); 2675 cmd_pkt->rd_byte_count = cpu_to_le32(rsp_data_len); 2676 cmd_pkt->timeout = cpu_to_le16(qla2x00_get_async_timeout(vha) + 2); 2677 2678 vha->bidi_stats.transfer_bytes += req_data_len; 2679 vha->bidi_stats.io_count++; 2680 2681 /* Only one dsd is available for bidirectional IOCB, remaining dsds 2682 * are bundled in continuation iocb 2683 */ 2684 avail_dsds = 1; 2685 cur_dsd = (uint32_t *)&cmd_pkt->fcp_data_dseg_address; 2686 2687 index = 0; 2688 2689 for_each_sg(bsg_job->request_payload.sg_list, sg, 2690 bsg_job->request_payload.sg_cnt, index) { 2691 dma_addr_t sle_dma; 2692 cont_a64_entry_t *cont_pkt; 2693 2694 /* Allocate additional continuation packets */ 2695 if (avail_dsds == 0) { 2696 /* Continuation type 1 IOCB can accomodate 2697 * 5 DSDS 2698 */ 2699 cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req); 2700 cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; 2701 avail_dsds = 5; 2702 entry_count++; 2703 } 2704 sle_dma = sg_dma_address(sg); 2705 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 2706 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 2707 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 2708 avail_dsds--; 2709 } 2710 /* For read request DSD will always goes to continuation IOCB 2711 * and follow the write DSD. If there is room on the current IOCB 2712 * then it is added to that IOCB else new continuation IOCB is 2713 * allocated. 2714 */ 2715 for_each_sg(bsg_job->reply_payload.sg_list, sg, 2716 bsg_job->reply_payload.sg_cnt, index) { 2717 dma_addr_t sle_dma; 2718 cont_a64_entry_t *cont_pkt; 2719 2720 /* Allocate additional continuation packets */ 2721 if (avail_dsds == 0) { 2722 /* Continuation type 1 IOCB can accomodate 2723 * 5 DSDS 2724 */ 2725 cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req); 2726 cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; 2727 avail_dsds = 5; 2728 entry_count++; 2729 } 2730 sle_dma = sg_dma_address(sg); 2731 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 2732 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 2733 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 2734 avail_dsds--; 2735 } 2736 /* This value should be same as number of IOCB required for this cmd */ 2737 cmd_pkt->entry_count = entry_count; 2738 } 2739 2740 int 2741 qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds) 2742 { 2743 2744 struct qla_hw_data *ha = vha->hw; 2745 unsigned long flags; 2746 uint32_t handle; 2747 uint32_t index; 2748 uint16_t req_cnt; 2749 uint16_t cnt; 2750 uint32_t *clr_ptr; 2751 struct cmd_bidir *cmd_pkt = NULL; 2752 struct rsp_que *rsp; 2753 struct req_que *req; 2754 int rval = EXT_STATUS_OK; 2755 2756 rval = QLA_SUCCESS; 2757 2758 rsp = ha->rsp_q_map[0]; 2759 req = vha->req; 2760 2761 /* Send marker if required */ 2762 if (vha->marker_needed != 0) { 2763 if (qla2x00_marker(vha, req, 2764 rsp, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) 2765 return EXT_STATUS_MAILBOX; 2766 vha->marker_needed = 0; 2767 } 2768 2769 /* Acquire ring specific lock */ 2770 spin_lock_irqsave(&ha->hardware_lock, flags); 2771 2772 /* Check for room in outstanding command list. */ 2773 handle = req->current_outstanding_cmd; 2774 for (index = 1; index < req->num_outstanding_cmds; index++) { 2775 handle++; 2776 if (handle == req->num_outstanding_cmds) 2777 handle = 1; 2778 if (!req->outstanding_cmds[handle]) 2779 break; 2780 } 2781 2782 if (index == req->num_outstanding_cmds) { 2783 rval = EXT_STATUS_BUSY; 2784 goto queuing_error; 2785 } 2786 2787 /* Calculate number of IOCB required */ 2788 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); 2789 2790 /* Check for room on request queue. */ 2791 if (req->cnt < req_cnt + 2) { 2792 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 2793 2794 if (req->ring_index < cnt) 2795 req->cnt = cnt - req->ring_index; 2796 else 2797 req->cnt = req->length - 2798 (req->ring_index - cnt); 2799 } 2800 if (req->cnt < req_cnt + 2) { 2801 rval = EXT_STATUS_BUSY; 2802 goto queuing_error; 2803 } 2804 2805 cmd_pkt = (struct cmd_bidir *)req->ring_ptr; 2806 cmd_pkt->handle = MAKE_HANDLE(req->id, handle); 2807 2808 /* Zero out remaining portion of packet. */ 2809 /* tagged queuing modifier -- default is TSK_SIMPLE (0).*/ 2810 clr_ptr = (uint32_t *)cmd_pkt + 2; 2811 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 2812 2813 /* Set NPORT-ID (of vha)*/ 2814 cmd_pkt->nport_handle = cpu_to_le16(vha->self_login_loop_id); 2815 cmd_pkt->port_id[0] = vha->d_id.b.al_pa; 2816 cmd_pkt->port_id[1] = vha->d_id.b.area; 2817 cmd_pkt->port_id[2] = vha->d_id.b.domain; 2818 2819 qla25xx_build_bidir_iocb(sp, vha, cmd_pkt, tot_dsds); 2820 cmd_pkt->entry_status = (uint8_t) rsp->id; 2821 /* Build command packet. */ 2822 req->current_outstanding_cmd = handle; 2823 req->outstanding_cmds[handle] = sp; 2824 sp->handle = handle; 2825 req->cnt -= req_cnt; 2826 2827 /* Send the command to the firmware */ 2828 wmb(); 2829 qla2x00_start_iocbs(vha, req); 2830 queuing_error: 2831 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2832 return rval; 2833 } 2834