1 /* 2 * QLogic Fibre Channel HBA Driver 3 * Copyright (c) 2003-2010 QLogic Corporation 4 * 5 * See LICENSE.qla2xxx for copyright and licensing details. 6 */ 7 #include "qla_def.h" 8 9 #include <linux/blkdev.h> 10 #include <linux/delay.h> 11 12 #include <scsi/scsi_tcq.h> 13 14 static void qla2x00_isp_cmd(struct scsi_qla_host *, struct req_que *); 15 16 static void qla25xx_set_que(srb_t *, struct rsp_que **); 17 /** 18 * qla2x00_get_cmd_direction() - Determine control_flag data direction. 19 * @cmd: SCSI command 20 * 21 * Returns the proper CF_* direction based on CDB. 22 */ 23 static inline uint16_t 24 qla2x00_get_cmd_direction(srb_t *sp) 25 { 26 uint16_t cflags; 27 28 cflags = 0; 29 30 /* Set transfer direction */ 31 if (sp->cmd->sc_data_direction == DMA_TO_DEVICE) { 32 cflags = CF_WRITE; 33 sp->fcport->vha->hw->qla_stats.output_bytes += 34 scsi_bufflen(sp->cmd); 35 } else if (sp->cmd->sc_data_direction == DMA_FROM_DEVICE) { 36 cflags = CF_READ; 37 sp->fcport->vha->hw->qla_stats.input_bytes += 38 scsi_bufflen(sp->cmd); 39 } 40 return (cflags); 41 } 42 43 /** 44 * qla2x00_calc_iocbs_32() - Determine number of Command Type 2 and 45 * Continuation Type 0 IOCBs to allocate. 46 * 47 * @dsds: number of data segment decriptors needed 48 * 49 * Returns the number of IOCB entries needed to store @dsds. 50 */ 51 uint16_t 52 qla2x00_calc_iocbs_32(uint16_t dsds) 53 { 54 uint16_t iocbs; 55 56 iocbs = 1; 57 if (dsds > 3) { 58 iocbs += (dsds - 3) / 7; 59 if ((dsds - 3) % 7) 60 iocbs++; 61 } 62 return (iocbs); 63 } 64 65 /** 66 * qla2x00_calc_iocbs_64() - Determine number of Command Type 3 and 67 * Continuation Type 1 IOCBs to allocate. 68 * 69 * @dsds: number of data segment decriptors needed 70 * 71 * Returns the number of IOCB entries needed to store @dsds. 72 */ 73 uint16_t 74 qla2x00_calc_iocbs_64(uint16_t dsds) 75 { 76 uint16_t iocbs; 77 78 iocbs = 1; 79 if (dsds > 2) { 80 iocbs += (dsds - 2) / 5; 81 if ((dsds - 2) % 5) 82 iocbs++; 83 } 84 return (iocbs); 85 } 86 87 /** 88 * qla2x00_prep_cont_type0_iocb() - Initialize a Continuation Type 0 IOCB. 89 * @ha: HA context 90 * 91 * Returns a pointer to the Continuation Type 0 IOCB packet. 92 */ 93 static inline cont_entry_t * 94 qla2x00_prep_cont_type0_iocb(struct scsi_qla_host *vha) 95 { 96 cont_entry_t *cont_pkt; 97 struct req_que *req = vha->req; 98 /* Adjust ring index. */ 99 req->ring_index++; 100 if (req->ring_index == req->length) { 101 req->ring_index = 0; 102 req->ring_ptr = req->ring; 103 } else { 104 req->ring_ptr++; 105 } 106 107 cont_pkt = (cont_entry_t *)req->ring_ptr; 108 109 /* Load packet defaults. */ 110 *((uint32_t *)(&cont_pkt->entry_type)) = 111 __constant_cpu_to_le32(CONTINUE_TYPE); 112 113 return (cont_pkt); 114 } 115 116 /** 117 * qla2x00_prep_cont_type1_iocb() - Initialize a Continuation Type 1 IOCB. 118 * @ha: HA context 119 * 120 * Returns a pointer to the continuation type 1 IOCB packet. 121 */ 122 static inline cont_a64_entry_t * 123 qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha) 124 { 125 cont_a64_entry_t *cont_pkt; 126 127 struct req_que *req = vha->req; 128 /* Adjust ring index. */ 129 req->ring_index++; 130 if (req->ring_index == req->length) { 131 req->ring_index = 0; 132 req->ring_ptr = req->ring; 133 } else { 134 req->ring_ptr++; 135 } 136 137 cont_pkt = (cont_a64_entry_t *)req->ring_ptr; 138 139 /* Load packet defaults. */ 140 *((uint32_t *)(&cont_pkt->entry_type)) = 141 __constant_cpu_to_le32(CONTINUE_A64_TYPE); 142 143 return (cont_pkt); 144 } 145 146 static inline int 147 qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) 148 { 149 uint8_t guard = scsi_host_get_guard(sp->cmd->device->host); 150 151 /* We only support T10 DIF right now */ 152 if (guard != SHOST_DIX_GUARD_CRC) { 153 DEBUG2(printk(KERN_ERR "Unsupported guard: %d\n", guard)); 154 return 0; 155 } 156 157 /* We always use DIFF Bundling for best performance */ 158 *fw_prot_opts = 0; 159 160 /* Translate SCSI opcode to a protection opcode */ 161 switch (scsi_get_prot_op(sp->cmd)) { 162 case SCSI_PROT_READ_STRIP: 163 *fw_prot_opts |= PO_MODE_DIF_REMOVE; 164 break; 165 case SCSI_PROT_WRITE_INSERT: 166 *fw_prot_opts |= PO_MODE_DIF_INSERT; 167 break; 168 case SCSI_PROT_READ_INSERT: 169 *fw_prot_opts |= PO_MODE_DIF_INSERT; 170 break; 171 case SCSI_PROT_WRITE_STRIP: 172 *fw_prot_opts |= PO_MODE_DIF_REMOVE; 173 break; 174 case SCSI_PROT_READ_PASS: 175 *fw_prot_opts |= PO_MODE_DIF_PASS; 176 break; 177 case SCSI_PROT_WRITE_PASS: 178 *fw_prot_opts |= PO_MODE_DIF_PASS; 179 break; 180 default: /* Normal Request */ 181 *fw_prot_opts |= PO_MODE_DIF_PASS; 182 break; 183 } 184 185 return scsi_prot_sg_count(sp->cmd); 186 } 187 188 /* 189 * qla2x00_build_scsi_iocbs_32() - Build IOCB command utilizing 32bit 190 * capable IOCB types. 191 * 192 * @sp: SRB command to process 193 * @cmd_pkt: Command type 2 IOCB 194 * @tot_dsds: Total number of segments to transfer 195 */ 196 void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt, 197 uint16_t tot_dsds) 198 { 199 uint16_t avail_dsds; 200 uint32_t *cur_dsd; 201 scsi_qla_host_t *vha; 202 struct scsi_cmnd *cmd; 203 struct scatterlist *sg; 204 int i; 205 206 cmd = sp->cmd; 207 208 /* Update entry type to indicate Command Type 2 IOCB */ 209 *((uint32_t *)(&cmd_pkt->entry_type)) = 210 __constant_cpu_to_le32(COMMAND_TYPE); 211 212 /* No data transfer */ 213 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 214 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 215 return; 216 } 217 218 vha = sp->fcport->vha; 219 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); 220 221 /* Three DSDs are available in the Command Type 2 IOCB */ 222 avail_dsds = 3; 223 cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; 224 225 /* Load data segments */ 226 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 227 cont_entry_t *cont_pkt; 228 229 /* Allocate additional continuation packets? */ 230 if (avail_dsds == 0) { 231 /* 232 * Seven DSDs are available in the Continuation 233 * Type 0 IOCB. 234 */ 235 cont_pkt = qla2x00_prep_cont_type0_iocb(vha); 236 cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; 237 avail_dsds = 7; 238 } 239 240 *cur_dsd++ = cpu_to_le32(sg_dma_address(sg)); 241 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 242 avail_dsds--; 243 } 244 } 245 246 /** 247 * qla2x00_build_scsi_iocbs_64() - Build IOCB command utilizing 64bit 248 * capable IOCB types. 249 * 250 * @sp: SRB command to process 251 * @cmd_pkt: Command type 3 IOCB 252 * @tot_dsds: Total number of segments to transfer 253 */ 254 void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt, 255 uint16_t tot_dsds) 256 { 257 uint16_t avail_dsds; 258 uint32_t *cur_dsd; 259 scsi_qla_host_t *vha; 260 struct scsi_cmnd *cmd; 261 struct scatterlist *sg; 262 int i; 263 264 cmd = sp->cmd; 265 266 /* Update entry type to indicate Command Type 3 IOCB */ 267 *((uint32_t *)(&cmd_pkt->entry_type)) = 268 __constant_cpu_to_le32(COMMAND_A64_TYPE); 269 270 /* No data transfer */ 271 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 272 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 273 return; 274 } 275 276 vha = sp->fcport->vha; 277 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); 278 279 /* Two DSDs are available in the Command Type 3 IOCB */ 280 avail_dsds = 2; 281 cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; 282 283 /* Load data segments */ 284 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 285 dma_addr_t sle_dma; 286 cont_a64_entry_t *cont_pkt; 287 288 /* Allocate additional continuation packets? */ 289 if (avail_dsds == 0) { 290 /* 291 * Five DSDs are available in the Continuation 292 * Type 1 IOCB. 293 */ 294 cont_pkt = qla2x00_prep_cont_type1_iocb(vha); 295 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; 296 avail_dsds = 5; 297 } 298 299 sle_dma = sg_dma_address(sg); 300 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 301 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 302 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 303 avail_dsds--; 304 } 305 } 306 307 /** 308 * qla2x00_start_scsi() - Send a SCSI command to the ISP 309 * @sp: command to send to the ISP 310 * 311 * Returns non-zero if a failure occurred, else zero. 312 */ 313 int 314 qla2x00_start_scsi(srb_t *sp) 315 { 316 int ret, nseg; 317 unsigned long flags; 318 scsi_qla_host_t *vha; 319 struct scsi_cmnd *cmd; 320 uint32_t *clr_ptr; 321 uint32_t index; 322 uint32_t handle; 323 cmd_entry_t *cmd_pkt; 324 uint16_t cnt; 325 uint16_t req_cnt; 326 uint16_t tot_dsds; 327 struct device_reg_2xxx __iomem *reg; 328 struct qla_hw_data *ha; 329 struct req_que *req; 330 struct rsp_que *rsp; 331 332 /* Setup device pointers. */ 333 ret = 0; 334 vha = sp->fcport->vha; 335 ha = vha->hw; 336 reg = &ha->iobase->isp; 337 cmd = sp->cmd; 338 req = ha->req_q_map[0]; 339 rsp = ha->rsp_q_map[0]; 340 /* So we know we haven't pci_map'ed anything yet */ 341 tot_dsds = 0; 342 343 /* Send marker if required */ 344 if (vha->marker_needed != 0) { 345 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) 346 != QLA_SUCCESS) 347 return (QLA_FUNCTION_FAILED); 348 vha->marker_needed = 0; 349 } 350 351 /* Acquire ring specific lock */ 352 spin_lock_irqsave(&ha->hardware_lock, flags); 353 354 /* Check for room in outstanding command list. */ 355 handle = req->current_outstanding_cmd; 356 for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { 357 handle++; 358 if (handle == MAX_OUTSTANDING_COMMANDS) 359 handle = 1; 360 if (!req->outstanding_cmds[handle]) 361 break; 362 } 363 if (index == MAX_OUTSTANDING_COMMANDS) 364 goto queuing_error; 365 366 /* Map the sg table so we have an accurate count of sg entries needed */ 367 if (scsi_sg_count(cmd)) { 368 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 369 scsi_sg_count(cmd), cmd->sc_data_direction); 370 if (unlikely(!nseg)) 371 goto queuing_error; 372 } else 373 nseg = 0; 374 375 tot_dsds = nseg; 376 377 /* Calculate the number of request entries needed. */ 378 req_cnt = ha->isp_ops->calc_req_entries(tot_dsds); 379 if (req->cnt < (req_cnt + 2)) { 380 cnt = RD_REG_WORD_RELAXED(ISP_REQ_Q_OUT(ha, reg)); 381 if (req->ring_index < cnt) 382 req->cnt = cnt - req->ring_index; 383 else 384 req->cnt = req->length - 385 (req->ring_index - cnt); 386 } 387 if (req->cnt < (req_cnt + 2)) 388 goto queuing_error; 389 390 /* Build command packet */ 391 req->current_outstanding_cmd = handle; 392 req->outstanding_cmds[handle] = sp; 393 sp->handle = handle; 394 sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; 395 req->cnt -= req_cnt; 396 397 cmd_pkt = (cmd_entry_t *)req->ring_ptr; 398 cmd_pkt->handle = handle; 399 /* Zero out remaining portion of packet. */ 400 clr_ptr = (uint32_t *)cmd_pkt + 2; 401 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 402 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 403 404 /* Set target ID and LUN number*/ 405 SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id); 406 cmd_pkt->lun = cpu_to_le16(sp->cmd->device->lun); 407 408 /* Update tagged queuing modifier */ 409 cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG); 410 411 /* Load SCSI command packet. */ 412 memcpy(cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len); 413 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 414 415 /* Build IOCB segments */ 416 ha->isp_ops->build_iocbs(sp, cmd_pkt, tot_dsds); 417 418 /* Set total data segment count. */ 419 cmd_pkt->entry_count = (uint8_t)req_cnt; 420 wmb(); 421 422 /* Adjust ring index. */ 423 req->ring_index++; 424 if (req->ring_index == req->length) { 425 req->ring_index = 0; 426 req->ring_ptr = req->ring; 427 } else 428 req->ring_ptr++; 429 430 sp->flags |= SRB_DMA_VALID; 431 432 /* Set chip new ring index. */ 433 WRT_REG_WORD(ISP_REQ_Q_IN(ha, reg), req->ring_index); 434 RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, reg)); /* PCI Posting. */ 435 436 /* Manage unprocessed RIO/ZIO commands in response queue. */ 437 if (vha->flags.process_response_queue && 438 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 439 qla2x00_process_response_queue(rsp); 440 441 spin_unlock_irqrestore(&ha->hardware_lock, flags); 442 return (QLA_SUCCESS); 443 444 queuing_error: 445 if (tot_dsds) 446 scsi_dma_unmap(cmd); 447 448 spin_unlock_irqrestore(&ha->hardware_lock, flags); 449 450 return (QLA_FUNCTION_FAILED); 451 } 452 453 /** 454 * qla2x00_marker() - Send a marker IOCB to the firmware. 455 * @ha: HA context 456 * @loop_id: loop ID 457 * @lun: LUN 458 * @type: marker modifier 459 * 460 * Can be called from both normal and interrupt context. 461 * 462 * Returns non-zero if a failure occurred, else zero. 463 */ 464 static int 465 __qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, 466 struct rsp_que *rsp, uint16_t loop_id, 467 uint16_t lun, uint8_t type) 468 { 469 mrk_entry_t *mrk; 470 struct mrk_entry_24xx *mrk24; 471 struct qla_hw_data *ha = vha->hw; 472 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); 473 474 mrk24 = NULL; 475 mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, 0); 476 if (mrk == NULL) { 477 DEBUG2_3(printk("%s(%ld): failed to allocate Marker IOCB.\n", 478 __func__, base_vha->host_no)); 479 480 return (QLA_FUNCTION_FAILED); 481 } 482 483 mrk->entry_type = MARKER_TYPE; 484 mrk->modifier = type; 485 if (type != MK_SYNC_ALL) { 486 if (IS_FWI2_CAPABLE(ha)) { 487 mrk24 = (struct mrk_entry_24xx *) mrk; 488 mrk24->nport_handle = cpu_to_le16(loop_id); 489 mrk24->lun[1] = LSB(lun); 490 mrk24->lun[2] = MSB(lun); 491 host_to_fcp_swap(mrk24->lun, sizeof(mrk24->lun)); 492 mrk24->vp_index = vha->vp_idx; 493 mrk24->handle = MAKE_HANDLE(req->id, mrk24->handle); 494 } else { 495 SET_TARGET_ID(ha, mrk->target, loop_id); 496 mrk->lun = cpu_to_le16(lun); 497 } 498 } 499 wmb(); 500 501 qla2x00_isp_cmd(vha, req); 502 503 return (QLA_SUCCESS); 504 } 505 506 int 507 qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, 508 struct rsp_que *rsp, uint16_t loop_id, uint16_t lun, 509 uint8_t type) 510 { 511 int ret; 512 unsigned long flags = 0; 513 514 spin_lock_irqsave(&vha->hw->hardware_lock, flags); 515 ret = __qla2x00_marker(vha, req, rsp, loop_id, lun, type); 516 spin_unlock_irqrestore(&vha->hw->hardware_lock, flags); 517 518 return (ret); 519 } 520 521 /** 522 * qla2x00_isp_cmd() - Modify the request ring pointer. 523 * @ha: HA context 524 * 525 * Note: The caller must hold the hardware lock before calling this routine. 526 */ 527 static void 528 qla2x00_isp_cmd(struct scsi_qla_host *vha, struct req_que *req) 529 { 530 struct qla_hw_data *ha = vha->hw; 531 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); 532 struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp; 533 534 DEBUG5(printk("%s(): IOCB data:\n", __func__)); 535 DEBUG5(qla2x00_dump_buffer( 536 (uint8_t *)req->ring_ptr, REQUEST_ENTRY_SIZE)); 537 538 /* Adjust ring index. */ 539 req->ring_index++; 540 if (req->ring_index == req->length) { 541 req->ring_index = 0; 542 req->ring_ptr = req->ring; 543 } else 544 req->ring_ptr++; 545 546 /* Set chip new ring index. */ 547 if (IS_QLA82XX(ha)) { 548 uint32_t dbval = 0x04 | (ha->portnum << 5); 549 550 /* write, read and verify logic */ 551 dbval = dbval | (req->id << 8) | (req->ring_index << 16); 552 if (ql2xdbwr) 553 qla82xx_wr_32(ha, ha->nxdb_wr_ptr, dbval); 554 else { 555 WRT_REG_DWORD( 556 (unsigned long __iomem *)ha->nxdb_wr_ptr, 557 dbval); 558 wmb(); 559 while (RD_REG_DWORD(ha->nxdb_rd_ptr) != dbval) { 560 WRT_REG_DWORD((unsigned long __iomem *) 561 ha->nxdb_wr_ptr, dbval); 562 wmb(); 563 } 564 } 565 } else if (ha->mqenable) { 566 /* Set chip new ring index. */ 567 WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index); 568 RD_REG_DWORD(&ioreg->hccr); 569 } else { 570 if (IS_FWI2_CAPABLE(ha)) { 571 WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index); 572 RD_REG_DWORD_RELAXED(®->isp24.req_q_in); 573 } else { 574 WRT_REG_WORD(ISP_REQ_Q_IN(ha, ®->isp), 575 req->ring_index); 576 RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, ®->isp)); 577 } 578 } 579 580 } 581 582 /** 583 * qla24xx_calc_iocbs() - Determine number of Command Type 3 and 584 * Continuation Type 1 IOCBs to allocate. 585 * 586 * @dsds: number of data segment decriptors needed 587 * 588 * Returns the number of IOCB entries needed to store @dsds. 589 */ 590 inline uint16_t 591 qla24xx_calc_iocbs(uint16_t dsds) 592 { 593 uint16_t iocbs; 594 595 iocbs = 1; 596 if (dsds > 1) { 597 iocbs += (dsds - 1) / 5; 598 if ((dsds - 1) % 5) 599 iocbs++; 600 } 601 DEBUG3(printk(KERN_DEBUG "%s(): Required PKT(s) = %d\n", 602 __func__, iocbs)); 603 return iocbs; 604 } 605 606 /** 607 * qla24xx_build_scsi_iocbs() - Build IOCB command utilizing Command Type 7 608 * IOCB types. 609 * 610 * @sp: SRB command to process 611 * @cmd_pkt: Command type 3 IOCB 612 * @tot_dsds: Total number of segments to transfer 613 */ 614 inline void 615 qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt, 616 uint16_t tot_dsds) 617 { 618 uint16_t avail_dsds; 619 uint32_t *cur_dsd; 620 scsi_qla_host_t *vha; 621 struct scsi_cmnd *cmd; 622 struct scatterlist *sg; 623 int i; 624 struct req_que *req; 625 626 cmd = sp->cmd; 627 628 /* Update entry type to indicate Command Type 3 IOCB */ 629 *((uint32_t *)(&cmd_pkt->entry_type)) = 630 __constant_cpu_to_le32(COMMAND_TYPE_7); 631 632 /* No data transfer */ 633 if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { 634 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 635 return; 636 } 637 638 vha = sp->fcport->vha; 639 req = vha->req; 640 641 /* Set transfer direction */ 642 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 643 cmd_pkt->task_mgmt_flags = 644 __constant_cpu_to_le16(TMF_WRITE_DATA); 645 sp->fcport->vha->hw->qla_stats.output_bytes += 646 scsi_bufflen(sp->cmd); 647 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 648 cmd_pkt->task_mgmt_flags = 649 __constant_cpu_to_le16(TMF_READ_DATA); 650 sp->fcport->vha->hw->qla_stats.input_bytes += 651 scsi_bufflen(sp->cmd); 652 } 653 654 /* One DSD is available in the Command Type 3 IOCB */ 655 avail_dsds = 1; 656 cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; 657 658 /* Load data segments */ 659 660 scsi_for_each_sg(cmd, sg, tot_dsds, i) { 661 dma_addr_t sle_dma; 662 cont_a64_entry_t *cont_pkt; 663 664 /* Allocate additional continuation packets? */ 665 if (avail_dsds == 0) { 666 /* 667 * Five DSDs are available in the Continuation 668 * Type 1 IOCB. 669 */ 670 cont_pkt = qla2x00_prep_cont_type1_iocb(vha); 671 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; 672 avail_dsds = 5; 673 } 674 675 sle_dma = sg_dma_address(sg); 676 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 677 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 678 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 679 avail_dsds--; 680 } 681 } 682 683 struct fw_dif_context { 684 uint32_t ref_tag; 685 uint16_t app_tag; 686 uint8_t ref_tag_mask[4]; /* Validation/Replacement Mask*/ 687 uint8_t app_tag_mask[2]; /* Validation/Replacement Mask*/ 688 }; 689 690 /* 691 * qla24xx_set_t10dif_tags_from_cmd - Extract Ref and App tags from SCSI command 692 * 693 */ 694 static inline void 695 qla24xx_set_t10dif_tags(struct scsi_cmnd *cmd, struct fw_dif_context *pkt, 696 unsigned int protcnt) 697 { 698 struct sd_dif_tuple *spt; 699 unsigned char op = scsi_get_prot_op(cmd); 700 701 switch (scsi_get_prot_type(cmd)) { 702 /* For TYPE 0 protection: no checking */ 703 case SCSI_PROT_DIF_TYPE0: 704 pkt->ref_tag_mask[0] = 0x00; 705 pkt->ref_tag_mask[1] = 0x00; 706 pkt->ref_tag_mask[2] = 0x00; 707 pkt->ref_tag_mask[3] = 0x00; 708 break; 709 710 /* 711 * For TYPE 2 protection: 16 bit GUARD + 32 bit REF tag has to 712 * match LBA in CDB + N 713 */ 714 case SCSI_PROT_DIF_TYPE2: 715 if (!ql2xenablehba_err_chk) 716 break; 717 718 if (scsi_prot_sg_count(cmd)) { 719 spt = page_address(sg_page(scsi_prot_sglist(cmd))) + 720 scsi_prot_sglist(cmd)[0].offset; 721 pkt->app_tag = swab32(spt->app_tag); 722 pkt->app_tag_mask[0] = 0xff; 723 pkt->app_tag_mask[1] = 0xff; 724 } 725 726 pkt->ref_tag = cpu_to_le32((uint32_t) 727 (0xffffffff & scsi_get_lba(cmd))); 728 729 /* enable ALL bytes of the ref tag */ 730 pkt->ref_tag_mask[0] = 0xff; 731 pkt->ref_tag_mask[1] = 0xff; 732 pkt->ref_tag_mask[2] = 0xff; 733 pkt->ref_tag_mask[3] = 0xff; 734 break; 735 736 /* For Type 3 protection: 16 bit GUARD only */ 737 case SCSI_PROT_DIF_TYPE3: 738 pkt->ref_tag_mask[0] = pkt->ref_tag_mask[1] = 739 pkt->ref_tag_mask[2] = pkt->ref_tag_mask[3] = 740 0x00; 741 break; 742 743 /* 744 * For TYpe 1 protection: 16 bit GUARD tag, 32 bit REF tag, and 745 * 16 bit app tag. 746 */ 747 case SCSI_PROT_DIF_TYPE1: 748 if (!ql2xenablehba_err_chk) 749 break; 750 751 if (protcnt && (op == SCSI_PROT_WRITE_STRIP || 752 op == SCSI_PROT_WRITE_PASS)) { 753 spt = page_address(sg_page(scsi_prot_sglist(cmd))) + 754 scsi_prot_sglist(cmd)[0].offset; 755 DEBUG18(printk(KERN_DEBUG 756 "%s(): LBA from user %p, lba = 0x%x\n", 757 __func__, spt, (int)spt->ref_tag)); 758 pkt->ref_tag = swab32(spt->ref_tag); 759 pkt->app_tag_mask[0] = 0x0; 760 pkt->app_tag_mask[1] = 0x0; 761 } else { 762 pkt->ref_tag = cpu_to_le32((uint32_t) 763 (0xffffffff & scsi_get_lba(cmd))); 764 pkt->app_tag = __constant_cpu_to_le16(0); 765 pkt->app_tag_mask[0] = 0x0; 766 pkt->app_tag_mask[1] = 0x0; 767 } 768 /* enable ALL bytes of the ref tag */ 769 pkt->ref_tag_mask[0] = 0xff; 770 pkt->ref_tag_mask[1] = 0xff; 771 pkt->ref_tag_mask[2] = 0xff; 772 pkt->ref_tag_mask[3] = 0xff; 773 break; 774 } 775 776 DEBUG18(printk(KERN_DEBUG 777 "%s(): Setting protection Tags: (BIG) ref tag = 0x%x," 778 " app tag = 0x%x, prot SG count %d , cmd lba 0x%x," 779 " prot_type=%u\n", __func__, pkt->ref_tag, pkt->app_tag, protcnt, 780 (int)scsi_get_lba(cmd), scsi_get_prot_type(cmd))); 781 } 782 783 784 static int 785 qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd, 786 uint16_t tot_dsds) 787 { 788 void *next_dsd; 789 uint8_t avail_dsds = 0; 790 uint32_t dsd_list_len; 791 struct dsd_dma *dsd_ptr; 792 struct scatterlist *sg; 793 uint32_t *cur_dsd = dsd; 794 int i; 795 uint16_t used_dsds = tot_dsds; 796 797 uint8_t *cp; 798 799 scsi_for_each_sg(sp->cmd, sg, tot_dsds, i) { 800 dma_addr_t sle_dma; 801 802 /* Allocate additional continuation packets? */ 803 if (avail_dsds == 0) { 804 avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? 805 QLA_DSDS_PER_IOCB : used_dsds; 806 dsd_list_len = (avail_dsds + 1) * 12; 807 used_dsds -= avail_dsds; 808 809 /* allocate tracking DS */ 810 dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); 811 if (!dsd_ptr) 812 return 1; 813 814 /* allocate new list */ 815 dsd_ptr->dsd_addr = next_dsd = 816 dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, 817 &dsd_ptr->dsd_list_dma); 818 819 if (!next_dsd) { 820 /* 821 * Need to cleanup only this dsd_ptr, rest 822 * will be done by sp_free_dma() 823 */ 824 kfree(dsd_ptr); 825 return 1; 826 } 827 828 list_add_tail(&dsd_ptr->list, 829 &((struct crc_context *)sp->ctx)->dsd_list); 830 831 sp->flags |= SRB_CRC_CTX_DSD_VALID; 832 833 /* add new list to cmd iocb or last list */ 834 *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); 835 *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); 836 *cur_dsd++ = dsd_list_len; 837 cur_dsd = (uint32_t *)next_dsd; 838 } 839 sle_dma = sg_dma_address(sg); 840 DEBUG18(printk("%s(): %p, sg entry %d - addr =0x%x 0x%x," 841 " len =%d\n", __func__ , cur_dsd, i, LSD(sle_dma), 842 MSD(sle_dma), sg_dma_len(sg))); 843 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 844 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 845 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 846 avail_dsds--; 847 848 if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { 849 cp = page_address(sg_page(sg)) + sg->offset; 850 DEBUG18(printk("%s(): User Data buffer= %p:\n", 851 __func__ , cp)); 852 } 853 } 854 /* Null termination */ 855 *cur_dsd++ = 0; 856 *cur_dsd++ = 0; 857 *cur_dsd++ = 0; 858 return 0; 859 } 860 861 static int 862 qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp, 863 uint32_t *dsd, 864 uint16_t tot_dsds) 865 { 866 void *next_dsd; 867 uint8_t avail_dsds = 0; 868 uint32_t dsd_list_len; 869 struct dsd_dma *dsd_ptr; 870 struct scatterlist *sg; 871 int i; 872 struct scsi_cmnd *cmd; 873 uint32_t *cur_dsd = dsd; 874 uint16_t used_dsds = tot_dsds; 875 876 uint8_t *cp; 877 878 879 cmd = sp->cmd; 880 scsi_for_each_prot_sg(cmd, sg, tot_dsds, i) { 881 dma_addr_t sle_dma; 882 883 /* Allocate additional continuation packets? */ 884 if (avail_dsds == 0) { 885 avail_dsds = (used_dsds > QLA_DSDS_PER_IOCB) ? 886 QLA_DSDS_PER_IOCB : used_dsds; 887 dsd_list_len = (avail_dsds + 1) * 12; 888 used_dsds -= avail_dsds; 889 890 /* allocate tracking DS */ 891 dsd_ptr = kzalloc(sizeof(struct dsd_dma), GFP_ATOMIC); 892 if (!dsd_ptr) 893 return 1; 894 895 /* allocate new list */ 896 dsd_ptr->dsd_addr = next_dsd = 897 dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, 898 &dsd_ptr->dsd_list_dma); 899 900 if (!next_dsd) { 901 /* 902 * Need to cleanup only this dsd_ptr, rest 903 * will be done by sp_free_dma() 904 */ 905 kfree(dsd_ptr); 906 return 1; 907 } 908 909 list_add_tail(&dsd_ptr->list, 910 &((struct crc_context *)sp->ctx)->dsd_list); 911 912 sp->flags |= SRB_CRC_CTX_DSD_VALID; 913 914 /* add new list to cmd iocb or last list */ 915 *cur_dsd++ = cpu_to_le32(LSD(dsd_ptr->dsd_list_dma)); 916 *cur_dsd++ = cpu_to_le32(MSD(dsd_ptr->dsd_list_dma)); 917 *cur_dsd++ = dsd_list_len; 918 cur_dsd = (uint32_t *)next_dsd; 919 } 920 sle_dma = sg_dma_address(sg); 921 if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { 922 DEBUG18(printk(KERN_DEBUG 923 "%s(): %p, sg entry %d - addr =0x%x" 924 "0x%x, len =%d\n", __func__ , cur_dsd, i, 925 LSD(sle_dma), MSD(sle_dma), sg_dma_len(sg))); 926 } 927 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 928 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 929 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 930 931 if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { 932 cp = page_address(sg_page(sg)) + sg->offset; 933 DEBUG18(printk("%s(): Protection Data buffer = %p:\n", 934 __func__ , cp)); 935 } 936 avail_dsds--; 937 } 938 /* Null termination */ 939 *cur_dsd++ = 0; 940 *cur_dsd++ = 0; 941 *cur_dsd++ = 0; 942 return 0; 943 } 944 945 /** 946 * qla24xx_build_scsi_crc_2_iocbs() - Build IOCB command utilizing Command 947 * Type 6 IOCB types. 948 * 949 * @sp: SRB command to process 950 * @cmd_pkt: Command type 3 IOCB 951 * @tot_dsds: Total number of segments to transfer 952 */ 953 static inline int 954 qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, 955 uint16_t tot_dsds, uint16_t tot_prot_dsds, uint16_t fw_prot_opts) 956 { 957 uint32_t *cur_dsd, *fcp_dl; 958 scsi_qla_host_t *vha; 959 struct scsi_cmnd *cmd; 960 struct scatterlist *cur_seg; 961 int sgc; 962 uint32_t total_bytes; 963 uint32_t data_bytes; 964 uint32_t dif_bytes; 965 uint8_t bundling = 1; 966 uint16_t blk_size; 967 uint8_t *clr_ptr; 968 struct crc_context *crc_ctx_pkt = NULL; 969 struct qla_hw_data *ha; 970 uint8_t additional_fcpcdb_len; 971 uint16_t fcp_cmnd_len; 972 struct fcp_cmnd *fcp_cmnd; 973 dma_addr_t crc_ctx_dma; 974 975 cmd = sp->cmd; 976 977 sgc = 0; 978 /* Update entry type to indicate Command Type CRC_2 IOCB */ 979 *((uint32_t *)(&cmd_pkt->entry_type)) = 980 __constant_cpu_to_le32(COMMAND_TYPE_CRC_2); 981 982 /* No data transfer */ 983 data_bytes = scsi_bufflen(cmd); 984 if (!data_bytes || cmd->sc_data_direction == DMA_NONE) { 985 DEBUG18(printk(KERN_INFO "%s: Zero data bytes or DMA-NONE %d\n", 986 __func__, data_bytes)); 987 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 988 return QLA_SUCCESS; 989 } 990 991 vha = sp->fcport->vha; 992 ha = vha->hw; 993 994 DEBUG18(printk(KERN_DEBUG 995 "%s(%ld): Executing cmd sp %p, prot_op=%u.\n", __func__, 996 vha->host_no, sp, scsi_get_prot_op(sp->cmd))); 997 998 cmd_pkt->vp_index = sp->fcport->vp_idx; 999 1000 /* Set transfer direction */ 1001 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 1002 cmd_pkt->control_flags = 1003 __constant_cpu_to_le16(CF_WRITE_DATA); 1004 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 1005 cmd_pkt->control_flags = 1006 __constant_cpu_to_le16(CF_READ_DATA); 1007 } 1008 1009 tot_prot_dsds = scsi_prot_sg_count(cmd); 1010 if (!tot_prot_dsds) 1011 bundling = 0; 1012 1013 /* Allocate CRC context from global pool */ 1014 crc_ctx_pkt = sp->ctx = dma_pool_alloc(ha->dl_dma_pool, 1015 GFP_ATOMIC, &crc_ctx_dma); 1016 1017 if (!crc_ctx_pkt) 1018 goto crc_queuing_error; 1019 1020 /* Zero out CTX area. */ 1021 clr_ptr = (uint8_t *)crc_ctx_pkt; 1022 memset(clr_ptr, 0, sizeof(*crc_ctx_pkt)); 1023 1024 crc_ctx_pkt->crc_ctx_dma = crc_ctx_dma; 1025 1026 sp->flags |= SRB_CRC_CTX_DMA_VALID; 1027 1028 /* Set handle */ 1029 crc_ctx_pkt->handle = cmd_pkt->handle; 1030 1031 INIT_LIST_HEAD(&crc_ctx_pkt->dsd_list); 1032 1033 qla24xx_set_t10dif_tags(cmd, (struct fw_dif_context *) 1034 &crc_ctx_pkt->ref_tag, tot_prot_dsds); 1035 1036 cmd_pkt->crc_context_address[0] = cpu_to_le32(LSD(crc_ctx_dma)); 1037 cmd_pkt->crc_context_address[1] = cpu_to_le32(MSD(crc_ctx_dma)); 1038 cmd_pkt->crc_context_len = CRC_CONTEXT_LEN_FW; 1039 1040 /* Determine SCSI command length -- align to 4 byte boundary */ 1041 if (cmd->cmd_len > 16) { 1042 DEBUG18(printk(KERN_INFO "%s(): **** SCSI CMD > 16\n", 1043 __func__)); 1044 additional_fcpcdb_len = cmd->cmd_len - 16; 1045 if ((cmd->cmd_len % 4) != 0) { 1046 /* SCSI cmd > 16 bytes must be multiple of 4 */ 1047 goto crc_queuing_error; 1048 } 1049 fcp_cmnd_len = 12 + cmd->cmd_len + 4; 1050 } else { 1051 additional_fcpcdb_len = 0; 1052 fcp_cmnd_len = 12 + 16 + 4; 1053 } 1054 1055 fcp_cmnd = &crc_ctx_pkt->fcp_cmnd; 1056 1057 fcp_cmnd->additional_cdb_len = additional_fcpcdb_len; 1058 if (cmd->sc_data_direction == DMA_TO_DEVICE) 1059 fcp_cmnd->additional_cdb_len |= 1; 1060 else if (cmd->sc_data_direction == DMA_FROM_DEVICE) 1061 fcp_cmnd->additional_cdb_len |= 2; 1062 1063 int_to_scsilun(sp->cmd->device->lun, &fcp_cmnd->lun); 1064 host_to_fcp_swap((uint8_t *)&fcp_cmnd->lun, sizeof(fcp_cmnd->lun)); 1065 memcpy(fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); 1066 cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(fcp_cmnd_len); 1067 cmd_pkt->fcp_cmnd_dseg_address[0] = cpu_to_le32( 1068 LSD(crc_ctx_dma + CRC_CONTEXT_FCPCMND_OFF)); 1069 cmd_pkt->fcp_cmnd_dseg_address[1] = cpu_to_le32( 1070 MSD(crc_ctx_dma + CRC_CONTEXT_FCPCMND_OFF)); 1071 fcp_cmnd->task_attribute = 0; 1072 fcp_cmnd->task_management = 0; 1073 1074 cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */ 1075 1076 DEBUG18(printk(KERN_INFO "%s(%ld): Total SG(s) Entries %d, Data" 1077 "entries %d, data bytes %d, Protection entries %d\n", 1078 __func__, vha->host_no, tot_dsds, (tot_dsds-tot_prot_dsds), 1079 data_bytes, tot_prot_dsds)); 1080 1081 /* Compute dif len and adjust data len to incude protection */ 1082 total_bytes = data_bytes; 1083 dif_bytes = 0; 1084 blk_size = cmd->device->sector_size; 1085 if (scsi_get_prot_op(cmd) != SCSI_PROT_NORMAL) { 1086 dif_bytes = (data_bytes / blk_size) * 8; 1087 total_bytes += dif_bytes; 1088 } 1089 1090 if (!ql2xenablehba_err_chk) 1091 fw_prot_opts |= 0x10; /* Disable Guard tag checking */ 1092 1093 if (!bundling) { 1094 cur_dsd = (uint32_t *) &crc_ctx_pkt->u.nobundling.data_address; 1095 } else { 1096 /* 1097 * Configure Bundling if we need to fetch interlaving 1098 * protection PCI accesses 1099 */ 1100 fw_prot_opts |= PO_ENABLE_DIF_BUNDLING; 1101 crc_ctx_pkt->u.bundling.dif_byte_count = cpu_to_le32(dif_bytes); 1102 crc_ctx_pkt->u.bundling.dseg_count = cpu_to_le16(tot_dsds - 1103 tot_prot_dsds); 1104 cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.data_address; 1105 } 1106 1107 /* Finish the common fields of CRC pkt */ 1108 crc_ctx_pkt->blk_size = cpu_to_le16(blk_size); 1109 crc_ctx_pkt->prot_opts = cpu_to_le16(fw_prot_opts); 1110 crc_ctx_pkt->byte_count = cpu_to_le32(data_bytes); 1111 crc_ctx_pkt->guard_seed = __constant_cpu_to_le16(0); 1112 /* Fibre channel byte count */ 1113 cmd_pkt->byte_count = cpu_to_le32(total_bytes); 1114 fcp_dl = (uint32_t *)(crc_ctx_pkt->fcp_cmnd.cdb + 16 + 1115 additional_fcpcdb_len); 1116 *fcp_dl = htonl(total_bytes); 1117 1118 DEBUG18(printk(KERN_INFO "%s(%ld): dif bytes = 0x%x (%d), total bytes" 1119 " = 0x%x (%d), dat block size =0x%x (%d)\n", __func__, 1120 vha->host_no, dif_bytes, dif_bytes, total_bytes, total_bytes, 1121 crc_ctx_pkt->blk_size, crc_ctx_pkt->blk_size)); 1122 1123 if (!data_bytes || cmd->sc_data_direction == DMA_NONE) { 1124 DEBUG18(printk(KERN_INFO "%s: Zero data bytes or DMA-NONE %d\n", 1125 __func__, data_bytes)); 1126 cmd_pkt->byte_count = __constant_cpu_to_le32(0); 1127 return QLA_SUCCESS; 1128 } 1129 /* Walks data segments */ 1130 1131 cmd_pkt->control_flags |= 1132 __constant_cpu_to_le16(CF_DATA_SEG_DESCR_ENABLE); 1133 if (qla24xx_walk_and_build_sglist(ha, sp, cur_dsd, 1134 (tot_dsds - tot_prot_dsds))) 1135 goto crc_queuing_error; 1136 1137 if (bundling && tot_prot_dsds) { 1138 /* Walks dif segments */ 1139 cur_seg = scsi_prot_sglist(cmd); 1140 cmd_pkt->control_flags |= 1141 __constant_cpu_to_le16(CF_DIF_SEG_DESCR_ENABLE); 1142 cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.dif_address; 1143 if (qla24xx_walk_and_build_prot_sglist(ha, sp, cur_dsd, 1144 tot_prot_dsds)) 1145 goto crc_queuing_error; 1146 } 1147 return QLA_SUCCESS; 1148 1149 crc_queuing_error: 1150 DEBUG18(qla_printk(KERN_INFO, ha, 1151 "CMD sent FAILED crc_q error:sp = %p\n", sp)); 1152 /* Cleanup will be performed by the caller */ 1153 1154 return QLA_FUNCTION_FAILED; 1155 } 1156 1157 /** 1158 * qla24xx_start_scsi() - Send a SCSI command to the ISP 1159 * @sp: command to send to the ISP 1160 * 1161 * Returns non-zero if a failure occurred, else zero. 1162 */ 1163 int 1164 qla24xx_start_scsi(srb_t *sp) 1165 { 1166 int ret, nseg; 1167 unsigned long flags; 1168 uint32_t *clr_ptr; 1169 uint32_t index; 1170 uint32_t handle; 1171 struct cmd_type_7 *cmd_pkt; 1172 uint16_t cnt; 1173 uint16_t req_cnt; 1174 uint16_t tot_dsds; 1175 struct req_que *req = NULL; 1176 struct rsp_que *rsp = NULL; 1177 struct scsi_cmnd *cmd = sp->cmd; 1178 struct scsi_qla_host *vha = sp->fcport->vha; 1179 struct qla_hw_data *ha = vha->hw; 1180 1181 /* Setup device pointers. */ 1182 ret = 0; 1183 1184 qla25xx_set_que(sp, &rsp); 1185 req = vha->req; 1186 1187 /* So we know we haven't pci_map'ed anything yet */ 1188 tot_dsds = 0; 1189 1190 /* Send marker if required */ 1191 if (vha->marker_needed != 0) { 1192 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) 1193 != QLA_SUCCESS) 1194 return QLA_FUNCTION_FAILED; 1195 vha->marker_needed = 0; 1196 } 1197 1198 /* Acquire ring specific lock */ 1199 spin_lock_irqsave(&ha->hardware_lock, flags); 1200 1201 /* Check for room in outstanding command list. */ 1202 handle = req->current_outstanding_cmd; 1203 for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { 1204 handle++; 1205 if (handle == MAX_OUTSTANDING_COMMANDS) 1206 handle = 1; 1207 if (!req->outstanding_cmds[handle]) 1208 break; 1209 } 1210 if (index == MAX_OUTSTANDING_COMMANDS) 1211 goto queuing_error; 1212 1213 /* Map the sg table so we have an accurate count of sg entries needed */ 1214 if (scsi_sg_count(cmd)) { 1215 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 1216 scsi_sg_count(cmd), cmd->sc_data_direction); 1217 if (unlikely(!nseg)) 1218 goto queuing_error; 1219 } else 1220 nseg = 0; 1221 1222 tot_dsds = nseg; 1223 1224 req_cnt = qla24xx_calc_iocbs(tot_dsds); 1225 if (req->cnt < (req_cnt + 2)) { 1226 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 1227 1228 if (req->ring_index < cnt) 1229 req->cnt = cnt - req->ring_index; 1230 else 1231 req->cnt = req->length - 1232 (req->ring_index - cnt); 1233 } 1234 if (req->cnt < (req_cnt + 2)) 1235 goto queuing_error; 1236 1237 /* Build command packet. */ 1238 req->current_outstanding_cmd = handle; 1239 req->outstanding_cmds[handle] = sp; 1240 sp->handle = handle; 1241 sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; 1242 req->cnt -= req_cnt; 1243 1244 cmd_pkt = (struct cmd_type_7 *)req->ring_ptr; 1245 cmd_pkt->handle = MAKE_HANDLE(req->id, handle); 1246 1247 /* Zero out remaining portion of packet. */ 1248 /* tagged queuing modifier -- default is TSK_SIMPLE (0). */ 1249 clr_ptr = (uint32_t *)cmd_pkt + 2; 1250 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 1251 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 1252 1253 /* Set NPORT-ID and LUN number*/ 1254 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1255 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 1256 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 1257 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 1258 cmd_pkt->vp_index = sp->fcport->vp_idx; 1259 1260 int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); 1261 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 1262 1263 /* Load SCSI command packet. */ 1264 memcpy(cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len); 1265 host_to_fcp_swap(cmd_pkt->fcp_cdb, sizeof(cmd_pkt->fcp_cdb)); 1266 1267 cmd_pkt->byte_count = cpu_to_le32((uint32_t)scsi_bufflen(cmd)); 1268 1269 /* Build IOCB segments */ 1270 qla24xx_build_scsi_iocbs(sp, cmd_pkt, tot_dsds); 1271 1272 /* Set total data segment count. */ 1273 cmd_pkt->entry_count = (uint8_t)req_cnt; 1274 /* Specify response queue number where completion should happen */ 1275 cmd_pkt->entry_status = (uint8_t) rsp->id; 1276 wmb(); 1277 1278 /* Adjust ring index. */ 1279 req->ring_index++; 1280 if (req->ring_index == req->length) { 1281 req->ring_index = 0; 1282 req->ring_ptr = req->ring; 1283 } else 1284 req->ring_ptr++; 1285 1286 sp->flags |= SRB_DMA_VALID; 1287 1288 /* Set chip new ring index. */ 1289 WRT_REG_DWORD(req->req_q_in, req->ring_index); 1290 RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); 1291 1292 /* Manage unprocessed RIO/ZIO commands in response queue. */ 1293 if (vha->flags.process_response_queue && 1294 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 1295 qla24xx_process_response_queue(vha, rsp); 1296 1297 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1298 return QLA_SUCCESS; 1299 1300 queuing_error: 1301 if (tot_dsds) 1302 scsi_dma_unmap(cmd); 1303 1304 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1305 1306 return QLA_FUNCTION_FAILED; 1307 } 1308 1309 1310 /** 1311 * qla24xx_dif_start_scsi() - Send a SCSI command to the ISP 1312 * @sp: command to send to the ISP 1313 * 1314 * Returns non-zero if a failure occurred, else zero. 1315 */ 1316 int 1317 qla24xx_dif_start_scsi(srb_t *sp) 1318 { 1319 int nseg; 1320 unsigned long flags; 1321 uint32_t *clr_ptr; 1322 uint32_t index; 1323 uint32_t handle; 1324 uint16_t cnt; 1325 uint16_t req_cnt = 0; 1326 uint16_t tot_dsds; 1327 uint16_t tot_prot_dsds; 1328 uint16_t fw_prot_opts = 0; 1329 struct req_que *req = NULL; 1330 struct rsp_que *rsp = NULL; 1331 struct scsi_cmnd *cmd = sp->cmd; 1332 struct scsi_qla_host *vha = sp->fcport->vha; 1333 struct qla_hw_data *ha = vha->hw; 1334 struct cmd_type_crc_2 *cmd_pkt; 1335 uint32_t status = 0; 1336 1337 #define QDSS_GOT_Q_SPACE BIT_0 1338 1339 /* Only process protection or >16 cdb in this routine */ 1340 if (scsi_get_prot_op(cmd) == SCSI_PROT_NORMAL) { 1341 if (cmd->cmd_len <= 16) 1342 return qla24xx_start_scsi(sp); 1343 } 1344 1345 /* Setup device pointers. */ 1346 1347 qla25xx_set_que(sp, &rsp); 1348 req = vha->req; 1349 1350 /* So we know we haven't pci_map'ed anything yet */ 1351 tot_dsds = 0; 1352 1353 /* Send marker if required */ 1354 if (vha->marker_needed != 0) { 1355 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL) != 1356 QLA_SUCCESS) 1357 return QLA_FUNCTION_FAILED; 1358 vha->marker_needed = 0; 1359 } 1360 1361 /* Acquire ring specific lock */ 1362 spin_lock_irqsave(&ha->hardware_lock, flags); 1363 1364 /* Check for room in outstanding command list. */ 1365 handle = req->current_outstanding_cmd; 1366 for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { 1367 handle++; 1368 if (handle == MAX_OUTSTANDING_COMMANDS) 1369 handle = 1; 1370 if (!req->outstanding_cmds[handle]) 1371 break; 1372 } 1373 1374 if (index == MAX_OUTSTANDING_COMMANDS) 1375 goto queuing_error; 1376 1377 /* Compute number of required data segments */ 1378 /* Map the sg table so we have an accurate count of sg entries needed */ 1379 if (scsi_sg_count(cmd)) { 1380 nseg = dma_map_sg(&ha->pdev->dev, scsi_sglist(cmd), 1381 scsi_sg_count(cmd), cmd->sc_data_direction); 1382 if (unlikely(!nseg)) 1383 goto queuing_error; 1384 else 1385 sp->flags |= SRB_DMA_VALID; 1386 } else 1387 nseg = 0; 1388 1389 /* number of required data segments */ 1390 tot_dsds = nseg; 1391 1392 /* Compute number of required protection segments */ 1393 if (qla24xx_configure_prot_mode(sp, &fw_prot_opts)) { 1394 nseg = dma_map_sg(&ha->pdev->dev, scsi_prot_sglist(cmd), 1395 scsi_prot_sg_count(cmd), cmd->sc_data_direction); 1396 if (unlikely(!nseg)) 1397 goto queuing_error; 1398 else 1399 sp->flags |= SRB_CRC_PROT_DMA_VALID; 1400 } else { 1401 nseg = 0; 1402 } 1403 1404 req_cnt = 1; 1405 /* Total Data and protection sg segment(s) */ 1406 tot_prot_dsds = nseg; 1407 tot_dsds += nseg; 1408 if (req->cnt < (req_cnt + 2)) { 1409 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 1410 1411 if (req->ring_index < cnt) 1412 req->cnt = cnt - req->ring_index; 1413 else 1414 req->cnt = req->length - 1415 (req->ring_index - cnt); 1416 } 1417 1418 if (req->cnt < (req_cnt + 2)) 1419 goto queuing_error; 1420 1421 status |= QDSS_GOT_Q_SPACE; 1422 1423 /* Build header part of command packet (excluding the OPCODE). */ 1424 req->current_outstanding_cmd = handle; 1425 req->outstanding_cmds[handle] = sp; 1426 sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; 1427 req->cnt -= req_cnt; 1428 1429 /* Fill-in common area */ 1430 cmd_pkt = (struct cmd_type_crc_2 *)req->ring_ptr; 1431 cmd_pkt->handle = MAKE_HANDLE(req->id, handle); 1432 1433 clr_ptr = (uint32_t *)cmd_pkt + 2; 1434 memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8); 1435 1436 /* Set NPORT-ID and LUN number*/ 1437 cmd_pkt->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1438 cmd_pkt->port_id[0] = sp->fcport->d_id.b.al_pa; 1439 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 1440 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 1441 1442 int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); 1443 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 1444 1445 /* Total Data and protection segment(s) */ 1446 cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); 1447 1448 /* Build IOCB segments and adjust for data protection segments */ 1449 if (qla24xx_build_scsi_crc_2_iocbs(sp, (struct cmd_type_crc_2 *) 1450 req->ring_ptr, tot_dsds, tot_prot_dsds, fw_prot_opts) != 1451 QLA_SUCCESS) 1452 goto queuing_error; 1453 1454 cmd_pkt->entry_count = (uint8_t)req_cnt; 1455 /* Specify response queue number where completion should happen */ 1456 cmd_pkt->entry_status = (uint8_t) rsp->id; 1457 cmd_pkt->timeout = __constant_cpu_to_le16(0); 1458 wmb(); 1459 1460 /* Adjust ring index. */ 1461 req->ring_index++; 1462 if (req->ring_index == req->length) { 1463 req->ring_index = 0; 1464 req->ring_ptr = req->ring; 1465 } else 1466 req->ring_ptr++; 1467 1468 /* Set chip new ring index. */ 1469 WRT_REG_DWORD(req->req_q_in, req->ring_index); 1470 RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); 1471 1472 /* Manage unprocessed RIO/ZIO commands in response queue. */ 1473 if (vha->flags.process_response_queue && 1474 rsp->ring_ptr->signature != RESPONSE_PROCESSED) 1475 qla24xx_process_response_queue(vha, rsp); 1476 1477 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1478 1479 return QLA_SUCCESS; 1480 1481 queuing_error: 1482 if (status & QDSS_GOT_Q_SPACE) { 1483 req->outstanding_cmds[handle] = NULL; 1484 req->cnt += req_cnt; 1485 } 1486 /* Cleanup will be performed by the caller (queuecommand) */ 1487 1488 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1489 1490 DEBUG18(qla_printk(KERN_INFO, ha, 1491 "CMD sent FAILED SCSI prot_op:%02x\n", scsi_get_prot_op(cmd))); 1492 return QLA_FUNCTION_FAILED; 1493 } 1494 1495 1496 static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp) 1497 { 1498 struct scsi_cmnd *cmd = sp->cmd; 1499 struct qla_hw_data *ha = sp->fcport->vha->hw; 1500 int affinity = cmd->request->cpu; 1501 1502 if (ha->flags.cpu_affinity_enabled && affinity >= 0 && 1503 affinity < ha->max_rsp_queues - 1) 1504 *rsp = ha->rsp_q_map[affinity + 1]; 1505 else 1506 *rsp = ha->rsp_q_map[0]; 1507 } 1508 1509 /* Generic Control-SRB manipulation functions. */ 1510 void * 1511 qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp) 1512 { 1513 struct qla_hw_data *ha = vha->hw; 1514 struct req_que *req = ha->req_q_map[0]; 1515 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); 1516 uint32_t index, handle; 1517 request_t *pkt; 1518 uint16_t cnt, req_cnt; 1519 1520 pkt = NULL; 1521 req_cnt = 1; 1522 handle = 0; 1523 1524 if (!sp) 1525 goto skip_cmd_array; 1526 1527 /* Check for room in outstanding command list. */ 1528 handle = req->current_outstanding_cmd; 1529 for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { 1530 handle++; 1531 if (handle == MAX_OUTSTANDING_COMMANDS) 1532 handle = 1; 1533 if (!req->outstanding_cmds[handle]) 1534 break; 1535 } 1536 if (index == MAX_OUTSTANDING_COMMANDS) 1537 goto queuing_error; 1538 1539 /* Prep command array. */ 1540 req->current_outstanding_cmd = handle; 1541 req->outstanding_cmds[handle] = sp; 1542 sp->handle = handle; 1543 1544 skip_cmd_array: 1545 /* Check for room on request queue. */ 1546 if (req->cnt < req_cnt) { 1547 if (ha->mqenable) 1548 cnt = RD_REG_DWORD(®->isp25mq.req_q_out); 1549 else if (IS_QLA82XX(ha)) 1550 cnt = RD_REG_DWORD(®->isp82.req_q_out); 1551 else if (IS_FWI2_CAPABLE(ha)) 1552 cnt = RD_REG_DWORD(®->isp24.req_q_out); 1553 else 1554 cnt = qla2x00_debounce_register( 1555 ISP_REQ_Q_OUT(ha, ®->isp)); 1556 1557 if (req->ring_index < cnt) 1558 req->cnt = cnt - req->ring_index; 1559 else 1560 req->cnt = req->length - 1561 (req->ring_index - cnt); 1562 } 1563 if (req->cnt < req_cnt) 1564 goto queuing_error; 1565 1566 /* Prep packet */ 1567 req->cnt -= req_cnt; 1568 pkt = req->ring_ptr; 1569 memset(pkt, 0, REQUEST_ENTRY_SIZE); 1570 pkt->entry_count = req_cnt; 1571 pkt->handle = handle; 1572 1573 queuing_error: 1574 return pkt; 1575 } 1576 1577 static void 1578 qla2x00_start_iocbs(srb_t *sp) 1579 { 1580 struct qla_hw_data *ha = sp->fcport->vha->hw; 1581 struct req_que *req = ha->req_q_map[0]; 1582 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); 1583 struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp; 1584 1585 if (IS_QLA82XX(ha)) { 1586 qla82xx_start_iocbs(sp); 1587 } else { 1588 /* Adjust ring index. */ 1589 req->ring_index++; 1590 if (req->ring_index == req->length) { 1591 req->ring_index = 0; 1592 req->ring_ptr = req->ring; 1593 } else 1594 req->ring_ptr++; 1595 1596 /* Set chip new ring index. */ 1597 if (ha->mqenable) { 1598 WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index); 1599 RD_REG_DWORD(&ioreg->hccr); 1600 } else if (IS_QLA82XX(ha)) { 1601 qla82xx_start_iocbs(sp); 1602 } else if (IS_FWI2_CAPABLE(ha)) { 1603 WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index); 1604 RD_REG_DWORD_RELAXED(®->isp24.req_q_in); 1605 } else { 1606 WRT_REG_WORD(ISP_REQ_Q_IN(ha, ®->isp), 1607 req->ring_index); 1608 RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, ®->isp)); 1609 } 1610 } 1611 } 1612 1613 static void 1614 qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1615 { 1616 struct srb_ctx *ctx = sp->ctx; 1617 struct srb_iocb *lio = ctx->u.iocb_cmd; 1618 1619 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1620 logio->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI); 1621 if (lio->u.logio.flags & SRB_LOGIN_COND_PLOGI) 1622 logio->control_flags |= cpu_to_le16(LCF_COND_PLOGI); 1623 if (lio->u.logio.flags & SRB_LOGIN_SKIP_PRLI) 1624 logio->control_flags |= cpu_to_le16(LCF_SKIP_PRLI); 1625 logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1626 logio->port_id[0] = sp->fcport->d_id.b.al_pa; 1627 logio->port_id[1] = sp->fcport->d_id.b.area; 1628 logio->port_id[2] = sp->fcport->d_id.b.domain; 1629 logio->vp_index = sp->fcport->vp_idx; 1630 } 1631 1632 static void 1633 qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) 1634 { 1635 struct qla_hw_data *ha = sp->fcport->vha->hw; 1636 struct srb_ctx *ctx = sp->ctx; 1637 struct srb_iocb *lio = ctx->u.iocb_cmd; 1638 uint16_t opts; 1639 1640 mbx->entry_type = MBX_IOCB_TYPE; 1641 SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id); 1642 mbx->mb0 = cpu_to_le16(MBC_LOGIN_FABRIC_PORT); 1643 opts = lio->u.logio.flags & SRB_LOGIN_COND_PLOGI ? BIT_0 : 0; 1644 opts |= lio->u.logio.flags & SRB_LOGIN_SKIP_PRLI ? BIT_1 : 0; 1645 if (HAS_EXTENDED_IDS(ha)) { 1646 mbx->mb1 = cpu_to_le16(sp->fcport->loop_id); 1647 mbx->mb10 = cpu_to_le16(opts); 1648 } else { 1649 mbx->mb1 = cpu_to_le16((sp->fcport->loop_id << 8) | opts); 1650 } 1651 mbx->mb2 = cpu_to_le16(sp->fcport->d_id.b.domain); 1652 mbx->mb3 = cpu_to_le16(sp->fcport->d_id.b.area << 8 | 1653 sp->fcport->d_id.b.al_pa); 1654 mbx->mb9 = cpu_to_le16(sp->fcport->vp_idx); 1655 } 1656 1657 static void 1658 qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1659 { 1660 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1661 logio->control_flags = 1662 cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO); 1663 logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1664 logio->port_id[0] = sp->fcport->d_id.b.al_pa; 1665 logio->port_id[1] = sp->fcport->d_id.b.area; 1666 logio->port_id[2] = sp->fcport->d_id.b.domain; 1667 logio->vp_index = sp->fcport->vp_idx; 1668 } 1669 1670 static void 1671 qla2x00_logout_iocb(srb_t *sp, struct mbx_entry *mbx) 1672 { 1673 struct qla_hw_data *ha = sp->fcport->vha->hw; 1674 1675 mbx->entry_type = MBX_IOCB_TYPE; 1676 SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id); 1677 mbx->mb0 = cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); 1678 mbx->mb1 = HAS_EXTENDED_IDS(ha) ? 1679 cpu_to_le16(sp->fcport->loop_id): 1680 cpu_to_le16(sp->fcport->loop_id << 8); 1681 mbx->mb2 = cpu_to_le16(sp->fcport->d_id.b.domain); 1682 mbx->mb3 = cpu_to_le16(sp->fcport->d_id.b.area << 8 | 1683 sp->fcport->d_id.b.al_pa); 1684 mbx->mb9 = cpu_to_le16(sp->fcport->vp_idx); 1685 /* Implicit: mbx->mbx10 = 0. */ 1686 } 1687 1688 static void 1689 qla24xx_adisc_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1690 { 1691 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1692 logio->control_flags = cpu_to_le16(LCF_COMMAND_ADISC); 1693 logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1694 logio->vp_index = sp->fcport->vp_idx; 1695 } 1696 1697 static void 1698 qla2x00_adisc_iocb(srb_t *sp, struct mbx_entry *mbx) 1699 { 1700 struct qla_hw_data *ha = sp->fcport->vha->hw; 1701 1702 mbx->entry_type = MBX_IOCB_TYPE; 1703 SET_TARGET_ID(ha, mbx->loop_id, sp->fcport->loop_id); 1704 mbx->mb0 = cpu_to_le16(MBC_GET_PORT_DATABASE); 1705 if (HAS_EXTENDED_IDS(ha)) { 1706 mbx->mb1 = cpu_to_le16(sp->fcport->loop_id); 1707 mbx->mb10 = cpu_to_le16(BIT_0); 1708 } else { 1709 mbx->mb1 = cpu_to_le16((sp->fcport->loop_id << 8) | BIT_0); 1710 } 1711 mbx->mb2 = cpu_to_le16(MSW(ha->async_pd_dma)); 1712 mbx->mb3 = cpu_to_le16(LSW(ha->async_pd_dma)); 1713 mbx->mb6 = cpu_to_le16(MSW(MSD(ha->async_pd_dma))); 1714 mbx->mb7 = cpu_to_le16(LSW(MSD(ha->async_pd_dma))); 1715 mbx->mb9 = cpu_to_le16(sp->fcport->vp_idx); 1716 } 1717 1718 static void 1719 qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk) 1720 { 1721 uint32_t flags; 1722 unsigned int lun; 1723 struct fc_port *fcport = sp->fcport; 1724 scsi_qla_host_t *vha = fcport->vha; 1725 struct qla_hw_data *ha = vha->hw; 1726 struct srb_ctx *ctx = sp->ctx; 1727 struct srb_iocb *iocb = ctx->u.iocb_cmd; 1728 struct req_que *req = vha->req; 1729 1730 flags = iocb->u.tmf.flags; 1731 lun = iocb->u.tmf.lun; 1732 1733 tsk->entry_type = TSK_MGMT_IOCB_TYPE; 1734 tsk->entry_count = 1; 1735 tsk->handle = MAKE_HANDLE(req->id, tsk->handle); 1736 tsk->nport_handle = cpu_to_le16(fcport->loop_id); 1737 tsk->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); 1738 tsk->control_flags = cpu_to_le32(flags); 1739 tsk->port_id[0] = fcport->d_id.b.al_pa; 1740 tsk->port_id[1] = fcport->d_id.b.area; 1741 tsk->port_id[2] = fcport->d_id.b.domain; 1742 tsk->vp_index = fcport->vp_idx; 1743 1744 if (flags == TCF_LUN_RESET) { 1745 int_to_scsilun(lun, &tsk->lun); 1746 host_to_fcp_swap((uint8_t *)&tsk->lun, 1747 sizeof(tsk->lun)); 1748 } 1749 } 1750 1751 static void 1752 qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) 1753 { 1754 struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; 1755 1756 els_iocb->entry_type = ELS_IOCB_TYPE; 1757 els_iocb->entry_count = 1; 1758 els_iocb->sys_define = 0; 1759 els_iocb->entry_status = 0; 1760 els_iocb->handle = sp->handle; 1761 els_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1762 els_iocb->tx_dsd_count = __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt); 1763 els_iocb->vp_index = sp->fcport->vp_idx; 1764 els_iocb->sof_type = EST_SOFI3; 1765 els_iocb->rx_dsd_count = __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt); 1766 1767 els_iocb->opcode = 1768 (((struct srb_ctx *)sp->ctx)->type == SRB_ELS_CMD_RPT) ? 1769 bsg_job->request->rqst_data.r_els.els_code : 1770 bsg_job->request->rqst_data.h_els.command_code; 1771 els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; 1772 els_iocb->port_id[1] = sp->fcport->d_id.b.area; 1773 els_iocb->port_id[2] = sp->fcport->d_id.b.domain; 1774 els_iocb->control_flags = 0; 1775 els_iocb->rx_byte_count = 1776 cpu_to_le32(bsg_job->reply_payload.payload_len); 1777 els_iocb->tx_byte_count = 1778 cpu_to_le32(bsg_job->request_payload.payload_len); 1779 1780 els_iocb->tx_address[0] = cpu_to_le32(LSD(sg_dma_address 1781 (bsg_job->request_payload.sg_list))); 1782 els_iocb->tx_address[1] = cpu_to_le32(MSD(sg_dma_address 1783 (bsg_job->request_payload.sg_list))); 1784 els_iocb->tx_len = cpu_to_le32(sg_dma_len 1785 (bsg_job->request_payload.sg_list)); 1786 1787 els_iocb->rx_address[0] = cpu_to_le32(LSD(sg_dma_address 1788 (bsg_job->reply_payload.sg_list))); 1789 els_iocb->rx_address[1] = cpu_to_le32(MSD(sg_dma_address 1790 (bsg_job->reply_payload.sg_list))); 1791 els_iocb->rx_len = cpu_to_le32(sg_dma_len 1792 (bsg_job->reply_payload.sg_list)); 1793 } 1794 1795 static void 1796 qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb) 1797 { 1798 uint16_t avail_dsds; 1799 uint32_t *cur_dsd; 1800 struct scatterlist *sg; 1801 int index; 1802 uint16_t tot_dsds; 1803 scsi_qla_host_t *vha = sp->fcport->vha; 1804 struct qla_hw_data *ha = vha->hw; 1805 struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; 1806 int loop_iterartion = 0; 1807 int cont_iocb_prsnt = 0; 1808 int entry_count = 1; 1809 1810 memset(ct_iocb, 0, sizeof(ms_iocb_entry_t)); 1811 ct_iocb->entry_type = CT_IOCB_TYPE; 1812 ct_iocb->entry_status = 0; 1813 ct_iocb->handle1 = sp->handle; 1814 SET_TARGET_ID(ha, ct_iocb->loop_id, sp->fcport->loop_id); 1815 ct_iocb->status = __constant_cpu_to_le16(0); 1816 ct_iocb->control_flags = __constant_cpu_to_le16(0); 1817 ct_iocb->timeout = 0; 1818 ct_iocb->cmd_dsd_count = 1819 __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt); 1820 ct_iocb->total_dsd_count = 1821 __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt + 1); 1822 ct_iocb->req_bytecount = 1823 cpu_to_le32(bsg_job->request_payload.payload_len); 1824 ct_iocb->rsp_bytecount = 1825 cpu_to_le32(bsg_job->reply_payload.payload_len); 1826 1827 ct_iocb->dseg_req_address[0] = cpu_to_le32(LSD(sg_dma_address 1828 (bsg_job->request_payload.sg_list))); 1829 ct_iocb->dseg_req_address[1] = cpu_to_le32(MSD(sg_dma_address 1830 (bsg_job->request_payload.sg_list))); 1831 ct_iocb->dseg_req_length = ct_iocb->req_bytecount; 1832 1833 ct_iocb->dseg_rsp_address[0] = cpu_to_le32(LSD(sg_dma_address 1834 (bsg_job->reply_payload.sg_list))); 1835 ct_iocb->dseg_rsp_address[1] = cpu_to_le32(MSD(sg_dma_address 1836 (bsg_job->reply_payload.sg_list))); 1837 ct_iocb->dseg_rsp_length = ct_iocb->rsp_bytecount; 1838 1839 avail_dsds = 1; 1840 cur_dsd = (uint32_t *)ct_iocb->dseg_rsp_address; 1841 index = 0; 1842 tot_dsds = bsg_job->reply_payload.sg_cnt; 1843 1844 for_each_sg(bsg_job->reply_payload.sg_list, sg, tot_dsds, index) { 1845 dma_addr_t sle_dma; 1846 cont_a64_entry_t *cont_pkt; 1847 1848 /* Allocate additional continuation packets? */ 1849 if (avail_dsds == 0) { 1850 /* 1851 * Five DSDs are available in the Cont. 1852 * Type 1 IOCB. 1853 */ 1854 cont_pkt = qla2x00_prep_cont_type1_iocb(vha); 1855 cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; 1856 avail_dsds = 5; 1857 cont_iocb_prsnt = 1; 1858 entry_count++; 1859 } 1860 1861 sle_dma = sg_dma_address(sg); 1862 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 1863 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 1864 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 1865 loop_iterartion++; 1866 avail_dsds--; 1867 } 1868 ct_iocb->entry_count = entry_count; 1869 } 1870 1871 static void 1872 qla24xx_ct_iocb(srb_t *sp, struct ct_entry_24xx *ct_iocb) 1873 { 1874 uint16_t avail_dsds; 1875 uint32_t *cur_dsd; 1876 struct scatterlist *sg; 1877 int index; 1878 uint16_t tot_dsds; 1879 scsi_qla_host_t *vha = sp->fcport->vha; 1880 struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; 1881 int loop_iterartion = 0; 1882 int cont_iocb_prsnt = 0; 1883 int entry_count = 1; 1884 1885 ct_iocb->entry_type = CT_IOCB_TYPE; 1886 ct_iocb->entry_status = 0; 1887 ct_iocb->sys_define = 0; 1888 ct_iocb->handle = sp->handle; 1889 1890 ct_iocb->nport_handle = cpu_to_le16(sp->fcport->loop_id); 1891 ct_iocb->vp_index = sp->fcport->vp_idx; 1892 ct_iocb->comp_status = __constant_cpu_to_le16(0); 1893 1894 ct_iocb->cmd_dsd_count = 1895 __constant_cpu_to_le16(bsg_job->request_payload.sg_cnt); 1896 ct_iocb->timeout = 0; 1897 ct_iocb->rsp_dsd_count = 1898 __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt); 1899 ct_iocb->rsp_byte_count = 1900 cpu_to_le32(bsg_job->reply_payload.payload_len); 1901 ct_iocb->cmd_byte_count = 1902 cpu_to_le32(bsg_job->request_payload.payload_len); 1903 ct_iocb->dseg_0_address[0] = cpu_to_le32(LSD(sg_dma_address 1904 (bsg_job->request_payload.sg_list))); 1905 ct_iocb->dseg_0_address[1] = cpu_to_le32(MSD(sg_dma_address 1906 (bsg_job->request_payload.sg_list))); 1907 ct_iocb->dseg_0_len = cpu_to_le32(sg_dma_len 1908 (bsg_job->request_payload.sg_list)); 1909 1910 avail_dsds = 1; 1911 cur_dsd = (uint32_t *)ct_iocb->dseg_1_address; 1912 index = 0; 1913 tot_dsds = bsg_job->reply_payload.sg_cnt; 1914 1915 for_each_sg(bsg_job->reply_payload.sg_list, sg, tot_dsds, index) { 1916 dma_addr_t sle_dma; 1917 cont_a64_entry_t *cont_pkt; 1918 1919 /* Allocate additional continuation packets? */ 1920 if (avail_dsds == 0) { 1921 /* 1922 * Five DSDs are available in the Cont. 1923 * Type 1 IOCB. 1924 */ 1925 cont_pkt = qla2x00_prep_cont_type1_iocb(vha); 1926 cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; 1927 avail_dsds = 5; 1928 cont_iocb_prsnt = 1; 1929 entry_count++; 1930 } 1931 1932 sle_dma = sg_dma_address(sg); 1933 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 1934 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 1935 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 1936 loop_iterartion++; 1937 avail_dsds--; 1938 } 1939 ct_iocb->entry_count = entry_count; 1940 } 1941 1942 int 1943 qla2x00_start_sp(srb_t *sp) 1944 { 1945 int rval; 1946 struct qla_hw_data *ha = sp->fcport->vha->hw; 1947 void *pkt; 1948 struct srb_ctx *ctx = sp->ctx; 1949 unsigned long flags; 1950 1951 rval = QLA_FUNCTION_FAILED; 1952 spin_lock_irqsave(&ha->hardware_lock, flags); 1953 pkt = qla2x00_alloc_iocbs(sp->fcport->vha, sp); 1954 if (!pkt) 1955 goto done; 1956 1957 rval = QLA_SUCCESS; 1958 switch (ctx->type) { 1959 case SRB_LOGIN_CMD: 1960 IS_FWI2_CAPABLE(ha) ? 1961 qla24xx_login_iocb(sp, pkt) : 1962 qla2x00_login_iocb(sp, pkt); 1963 break; 1964 case SRB_LOGOUT_CMD: 1965 IS_FWI2_CAPABLE(ha) ? 1966 qla24xx_logout_iocb(sp, pkt) : 1967 qla2x00_logout_iocb(sp, pkt); 1968 break; 1969 case SRB_ELS_CMD_RPT: 1970 case SRB_ELS_CMD_HST: 1971 qla24xx_els_iocb(sp, pkt); 1972 break; 1973 case SRB_CT_CMD: 1974 IS_FWI2_CAPABLE(ha) ? 1975 qla24xx_ct_iocb(sp, pkt) : 1976 qla2x00_ct_iocb(sp, pkt); 1977 break; 1978 case SRB_ADISC_CMD: 1979 IS_FWI2_CAPABLE(ha) ? 1980 qla24xx_adisc_iocb(sp, pkt) : 1981 qla2x00_adisc_iocb(sp, pkt); 1982 break; 1983 case SRB_TM_CMD: 1984 qla24xx_tm_iocb(sp, pkt); 1985 break; 1986 default: 1987 break; 1988 } 1989 1990 wmb(); 1991 qla2x00_start_iocbs(sp); 1992 done: 1993 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1994 return rval; 1995 } 1996